diff --git a/.ci b/.ci
new file mode 100644
index 00000000..99df5f06
--- /dev/null
+++ b/.ci
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+
+
+SUBMODULES_PATH=${SUBMODULES_PATH:-$(realpath .)}
+source "${SUBMODULES_PATH}/adore_cli/ci_teststand/ci_core.sh"
+source "${SUBMODULES_PATH}/adore_cli/ci_teststand/ci_utils.sh"
+source ci.env
+source "${SUBMODULES_PATH}/adore_cli/ci_teststand/tests/common_tests.sh"
+source "${SUBMODULES_PATH}/adore_cli/ci_teststand/tests/docker_tests.sh"
+source "${SUBMODULES_PATH}/adore_cli/ci_teststand/tests/file_tests.sh"
+#source "${SUBMODULES_PATH}/ci_teststand/.static_checking_tests"
+source .tests
+
+build(){
+ ci_common_build
+}
+
+test(){
+ ci_common_test
+}
+
+
+ci_run "$@"
diff --git a/.colcon_workspace/colcon.meta b/.colcon_workspace/colcon.meta
deleted file mode 100644
index f3d0af83..00000000
--- a/.colcon_workspace/colcon.meta
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "names": {
- "osqp-eigen": {
- "dependencies": ["osqp"]
- }
- }
-}
diff --git a/.docker/base/Dockerfile b/.docker/base/Dockerfile
deleted file mode 100644
index 1c988caa..00000000
--- a/.docker/base/Dockerfile
+++ /dev/null
@@ -1,13 +0,0 @@
-# .docker/base/Dockerfile
-FROM ros:jazzy-ros-base
-
-# Locale
-ENV LANG=C.UTF-8 \
- LC_ALL=C.UTF-8
-
-# Core APT dependencies (shared by dev & CI)
-COPY .docker/base/apt.base.txt /tmp/apt.base.txt
-
-RUN apt-get update && \
- xargs -r -a /tmp/apt.base.txt apt-get install -y && \
- rm -rf /var/lib/apt/lists/* /tmp/*
diff --git a/.docker/base/apt.base.txt b/.docker/base/apt.base.txt
deleted file mode 100644
index 80cb051e..00000000
--- a/.docker/base/apt.base.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-libeigen3-dev
-libopencv-dev
-libproj-dev
-nlohmann-json3-dev
-
-build-essential
-cmake
-ccache
-
-git
-curl
-wget
-ca-certificates
-just
-
-python3-pip
-python3-pytest
-python3-colcon-common-extensions
-python3-pyproj
-
-
-ros-jazzy-rclcpp-components
-ros-jazzy-cv-bridge
-ros-jazzy-rosbridge-server
-ros-jazzy-foxglove-msgs
-
-libgeographiclib-dev
-geographiclib-tools
-
-sumo
-sumo-tools
-sumo-doc
\ No newline at end of file
diff --git a/.docker/ci/Dockerfile b/.docker/ci/Dockerfile
deleted file mode 100644
index 045d7654..00000000
--- a/.docker/ci/Dockerfile
+++ /dev/null
@@ -1,55 +0,0 @@
-# .docker/ci/Dockerfile
-FROM adore_base:latest
-
-# -------------------------------------------------------------------
-# CI-specific system dependencies (docs, test tooling, etc.)
-# -------------------------------------------------------------------
-COPY .docker/ci/apt.ci.txt /tmp/apt.ci.txt
-RUN if [ -s /tmp/apt.ci.txt ]; then \
- apt-get update && \
- xargs -r -a /tmp/apt.ci.txt apt-get install -y && \
- rm -rf /var/lib/apt/lists/* /tmp/*; \
- else \
- echo "No CI APT dependencies listed in /tmp/apt.ci.txt"; \
- fi
-
-# -------------------------------------------------------------------
-# CI-specific Python dependencies (MkDocs Material, plugins, ...)
-# -------------------------------------------------------------------
-COPY .docker/ci/pip.ci.txt /tmp/pip.ci.txt
-RUN if [ -s /tmp/pip.ci.txt ]; then \
- pip3 install --no-cache-dir --break-system-packages --ignore-installed -r /tmp/pip.ci.txt && \
- rm -f /tmp/pip.ci.txt; \
- else \
- echo "No CI pip dependencies listed in /tmp/pip.ci.txt"; \
- fi
-
-
-# CI user (still UID/GID mapped so volume permissions behave)
-ARG USERNAME=ci
-ARG USER_UID=2001
-ARG USER_GID=2001
-
-RUN set -eux; \
- existing_user="$(getent passwd "${USER_UID}" | cut -d: -f1 || true)"; \
- if [ -n "${existing_user}" ]; then \
- echo "Renaming user ${existing_user} to ${USERNAME}"; \
- usermod -l "${USERNAME}" "${existing_user}"; \
- usermod -d "/home/${USERNAME}" -m "${USERNAME}"; \
- groupmod -n "${USERNAME}" "${existing_user}"; \
- else \
- echo "Creating new user ${USERNAME}"; \
- groupadd -g "${USER_GID}" "${USERNAME}"; \
- useradd -m -s /usr/bin/zsh -u "${USER_UID}" -g "${USER_GID}" "${USERNAME}"; \
- fi
-
-USER ${USERNAME}
-
-ENV WORKSPACE="/home/${USERNAME}/adore"
-WORKDIR ${WORKSPACE}
-
-ENV CCACHE_DIR="${WORKSPACE}/.cache/ccache" \
- CC="/usr/lib/ccache/gcc" \
- CXX="/usr/lib/ccache/g++"
-
-CMD ["/bin/bash"]
diff --git a/.docker/ci/apt.ci.txt b/.docker/ci/apt.ci.txt
deleted file mode 100644
index c07e9efa..00000000
--- a/.docker/ci/apt.ci.txt
+++ /dev/null
@@ -1 +0,0 @@
-mkdocs
\ No newline at end of file
diff --git a/.docker/ci/pip.ci.txt b/.docker/ci/pip.ci.txt
deleted file mode 100644
index 42e3efe0..00000000
--- a/.docker/ci/pip.ci.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-mkdocs-material
-pymdown-extensions
-mkdocs-redirects
-gcovr
\ No newline at end of file
diff --git a/.docker/dev/Dockerfile b/.docker/dev/Dockerfile
deleted file mode 100644
index ff8dd610..00000000
--- a/.docker/dev/Dockerfile
+++ /dev/null
@@ -1,90 +0,0 @@
-# .docker/dev/Dockerfile
-FROM adore_base:latest
-
-# Dev-only APT deps (shell candy, X11, tracing, etc.)
-COPY .docker/dev/apt.dev.txt /tmp/apt.dev.txt
-
-RUN apt-get update && \
- xargs -r -a /tmp/apt.dev.txt apt-get install -y && \
- rm -rf /var/lib/apt/lists/* /tmp/*
-
-# Helix editor
-RUN curl -L https://github.com/helix-editor/helix/releases/download/25.07.1/helix-25.07.1-x86_64-linux.tar.xz \
- | tar -xJ && \
- mv helix-25.07.1-x86_64-linux /opt/helix && \
- ln -s /opt/helix/hx /usr/local/bin/hx && \
- echo "export HELIX_RUNTIME=/opt/helix/runtime" >> /etc/profile
-
-# User setup (UID/GID mapping)
-ARG USERNAME=developer
-ARG USER_UID=2001
-ARG USER_GID=2001
-
-RUN set -eux; \
- existing_user="$(getent passwd "${USER_UID}" | cut -d: -f1 || true)"; \
- if [ -n "${existing_user}" ]; then \
- echo "Renaming user ${existing_user} to ${USERNAME}"; \
- usermod -l "${USERNAME}" "${existing_user}"; \
- usermod -d "/home/${USERNAME}" -m "${USERNAME}"; \
- groupmod -n "${USERNAME}" "${existing_user}"; \
- else \
- echo "Creating new user ${USERNAME}"; \
- groupadd -g "${USER_GID}" "${USERNAME}"; \
- useradd -m -s /usr/bin/zsh -u "${USER_UID}" -g "${USER_GID}" "${USERNAME}"; \
- fi
-
-USER ${USERNAME}
-ENV IN_ADORE_DOCKER=1
-
-# Oh My Zsh (non-interactive)
-ENV RUNZSH=no \
- CHSH=no
-
-RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
-
-# Workspace + ccache
-ENV WORKSPACE="/home/${USERNAME}/adore"
-WORKDIR ${WORKSPACE}
-
-ENV CCACHE_DIR="${WORKSPACE}/.cache/ccache" \
- CC="/usr/lib/ccache/gcc" \
- CXX="/usr/lib/ccache/g++"
-
-# Zsh history & QoL
-RUN echo '\
-export HISTFILE=~/adore/.zsh_history\n\
-export HISTSIZE=100000\n\
-export SAVEHIST=100000\n\
-setopt HIST_IGNORE_DUPS\n\
-setopt HIST_REDUCE_BLANKS\n\
-setopt SHARE_HISTORY\n\
-setopt INC_APPEND_HISTORY\n\
-' >> "/home/${USERNAME}/.zshrc" && \
- mkdir -p "${WORKSPACE}" && \
- touch "${WORKSPACE}/.zsh_history" && \
- chown -R "${USERNAME}:${USERNAME}" "${WORKSPACE}"
-
-# --- ADORe: auto-source ROS + workspace in interactive zsh shells ---
-RUN set -eux; \
- ZSHRC="$HOME/.zshrc"; \
- touch "$ZSHRC"; \
- { \
- echo ''; \
- echo '# --- ADORe ROS environment -----------------------------------------'; \
- echo '# Source the chosen ROS distro (defaults to jazzy if ROS_DISTRO unset)'; \
- echo 'if [ -f "/opt/ros/${ROS_DISTRO:-jazzy}/setup.zsh" ]; then'; \
- echo ' source "/opt/ros/${ROS_DISTRO:-jazzy}/setup.zsh"'; \
- echo 'fi'; \
- echo ''; \
- echo '# Source local colcon workspace overlay if it exists'; \
- echo 'if [ -f "$HOME/adore/.colcon_workspace/install/local_setup.zsh" ]; then'; \
- echo ' source "$HOME/adore/.colcon_workspace/install/local_setup.zsh"'; \
- echo 'elif [ -f "$HOME/adore/.colcon_workspace/install/setup.zsh" ]; then'; \
- echo ' source "$HOME/adore/.colcon_workspace/install/setup.zsh"'; \
- echo 'fi'; \
- echo 'if [[ -n "$IN_ADORE_DOCKER" ]]; then'; \
- echo ' PROMPT="%F{green}[ADORe-DEV]%f ${PROMPT}"'; \
- echo 'fi'; \
- } >> "$ZSHRC"
-
-CMD ["/usr/bin/zsh", "-l"]
diff --git a/.docker/dev/apt.dev.txt b/.docker/dev/apt.dev.txt
deleted file mode 100644
index cf5d0663..00000000
--- a/.docker/dev/apt.dev.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-zsh
-fzf
-zsh-syntax-highlighting
-zsh-autosuggestions
-
-htop
-tree
-bat
-ripgrep
-gdb
-clangd
-clangd++
-libstdc++-12-dev
-
-ros-jazzy-rqt
-ros-jazzy-rqt-common-plugins
-ros-jazzy-foxglove-bridge
-ros-jazzy-ros2trace
-ros-jazzy-tracetools-analysis
-
-babeltrace
-lttng-modules-dkms
-
-x11-apps
-libx11-6
-libxext6
-libxrender1
-libxtst6
-libxi6
-libgl1
-mesa-utils
-
-python3-flask
-python3-flask-cors
-
-jq
-x11-utils
diff --git a/.docker/scripts/build_ci.sh b/.docker/scripts/build_ci.sh
deleted file mode 100755
index 327e6c56..00000000
--- a/.docker/scripts/build_ci.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env bash
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-set -euo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${SCRIPT_DIR}/common.sh"
-
-cd "${WORKSPACE_ROOT}"
-
-# Ensure the base image exists (adore_base:latest)
-if ! docker image inspect "${DOCKER_BASE_IMAGE_LATEST}" >/dev/null 2>&1; then
- echo "--- Building base Docker image ${DOCKER_BASE_IMAGE_LATEST} (${DOCKER_BASE_IMAGE_TAGGED}) ---"
- docker build \
- -f "${DOCKER_BASE_DOCKERFILE}" \
- -t "${DOCKER_BASE_IMAGE_LATEST}" \
- -t "${DOCKER_BASE_IMAGE_TAGGED}" \
- .
-fi
-
-echo "--- Building CI Docker image ${DOCKER_CI_IMAGE_LATEST} (${DOCKER_CI_IMAGE_TAGGED}) ---"
-docker build \
- -f "${DOCKER_CI_DOCKERFILE}" \
- --build-arg USER_UID="${USER_UID}" \
- --build-arg USER_GID="${USER_GID}" \
- --build-arg USERNAME="${USER_NAME}" \
- -t "${DOCKER_CI_IMAGE_LATEST}" \
- -t "${DOCKER_CI_IMAGE_TAGGED}" \
- .
diff --git a/.docker/scripts/build_dev.sh b/.docker/scripts/build_dev.sh
deleted file mode 100755
index e4337aef..00000000
--- a/.docker/scripts/build_dev.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env bash
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-# Build the base and dev Docker images for ADORe.
-
-set -euo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${SCRIPT_DIR}/common.sh"
-
-require_host "Hint: to build *inside* the dev container, run colcon directly instead of this script."
-
-cd "${WORKSPACE_ROOT}"
-
-if ! docker image inspect "${DOCKER_BASE_IMAGE_LATEST}" >/dev/null 2>&1; then
- echo "--- Building base Docker image ${DOCKER_BASE_IMAGE_LATEST} (${DOCKER_BASE_IMAGE_TAGGED}) ---"
- docker build \
- -f "${DOCKER_BASE_DOCKERFILE}" \
- -t "${DOCKER_BASE_IMAGE_LATEST}" \
- -t "${DOCKER_BASE_IMAGE_TAGGED}" \
- .
-fi
-
-echo "--- Building dev Docker image ${DOCKER_DEV_IMAGE_LATEST} (${DOCKER_DEV_IMAGE_TAGGED}) ---"
-docker build \
- -f "${DOCKER_DEV_DOCKERFILE}" \
- --build-arg USER_UID="${USER_UID}" \
- --build-arg USER_GID="${USER_GID}" \
- --build-arg USERNAME="${USER_NAME}" \
- -t "${DOCKER_DEV_IMAGE_LATEST}" \
- -t "${DOCKER_DEV_IMAGE_TAGGED}" \
- .
diff --git a/.docker/scripts/clean_images.sh b/.docker/scripts/clean_images.sh
deleted file mode 100755
index 48371445..00000000
--- a/.docker/scripts/clean_images.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env bash
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-# Remove ADORe Docker images and the dev container.
-
-set -euo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${SCRIPT_DIR}/common.sh"
-
-require_host "You appear to be inside a container; image cleanup should be done on the host."
-
-echo "--- Removing dev container '${DOCKER_CONTAINER_NAME}' if it exists ---"
-docker rm -f "${DOCKER_CONTAINER_NAME}" >/dev/null 2>&1 || true
-
-echo "--- Removing ADORe Docker images (dev, CI, base) ---"
-# Remove dev + CI images before base to avoid dependency issues.
-for repo in "${DOCKER_DEV_IMAGE_BASE}" "${DOCKER_CI_IMAGE_BASE}" "${DOCKER_BASE_IMAGE_BASE}"; do
- ids=$(docker images --format '{{.Repository}} {{.ID}}' | awk -v repo="$repo" '$1 == repo {print $2}')
- if [[ -n "${ids}" ]]; then
- echo " -> Removing images for repository '${repo}'"
- docker rmi -f ${ids} || true
- fi
-done
diff --git a/.docker/scripts/common.sh b/.docker/scripts/common.sh
deleted file mode 100755
index 25f55702..00000000
--- a/.docker/scripts/common.sh
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/usr/bin/env bash
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-# Shared Docker/CI configuration for ADORe scripts.
-
-set -euo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-
-# Load environment helpers (host vs container, etc.)
-# shellcheck source=/dev/null
-if [[ -f "${SCRIPT_DIR}/env.sh" ]]; then
- source "${SCRIPT_DIR}/env.sh"
-fi
-
-# Repository root (where the git repo lives)
-WORKSPACE_ROOT="${WORKSPACE_ROOT:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
-
-# ROS distro
-ROS_DISTRO="${ROS_DISTRO:-jazzy}"
-
-# Host user info (used when building dev image / running containers)
-USER_NAME="${USER_NAME:-$(id -un)}"
-USER_UID="${USER_UID:-$(id -u)}"
-USER_GID="${USER_GID:-$(id -g)}"
-
-# Git / arch info for tagging images
-GIT_HASH="${GIT_HASH:-$(cd "${WORKSPACE_ROOT}" && git rev-parse --short HEAD 2>/dev/null || echo dev)}"
-ARCH="${ARCH:-$(uname -m)}"
-IMAGE_TAG="${IMAGE_TAG:-${GIT_HASH}-${ARCH}}"
-
-# Container name for the dev shell
-DOCKER_CONTAINER_NAME="${DOCKER_CONTAINER_NAME:-adore}"
-
-# Base image (ROS + apt deps, no user/tooling)
-DOCKER_BASE_IMAGE_BASE="${DOCKER_BASE_IMAGE_BASE:-adore_base}"
-DOCKER_BASE_IMAGE_TAGGED="${DOCKER_BASE_IMAGE_BASE}:${IMAGE_TAG}"
-DOCKER_BASE_IMAGE_LATEST="${DOCKER_BASE_IMAGE_BASE}:latest"
-DOCKER_BASE_DOCKERFILE="${DOCKER_BASE_DOCKERFILE:-${WORKSPACE_ROOT}/.docker/base/Dockerfile}"
-
-# Dev image (what developers use locally)
-DOCKER_DEV_IMAGE_BASE="${DOCKER_DEV_IMAGE_BASE:-adore_dev}"
-DOCKER_DEV_IMAGE_TAGGED="${DOCKER_DEV_IMAGE_BASE}:${IMAGE_TAG}"
-DOCKER_DEV_IMAGE_LATEST="${DOCKER_DEV_IMAGE_BASE}:latest"
-DOCKER_DEV_DOCKERFILE="${DOCKER_DEV_DOCKERFILE:-${WORKSPACE_ROOT}/.docker/dev/Dockerfile}"
-
-# CI image (used for tests/docs in GitHub Actions and locally)
-DOCKER_CI_IMAGE_BASE="${DOCKER_CI_IMAGE_BASE:-adore_ci}"
-DOCKER_CI_IMAGE_TAGGED="${DOCKER_CI_IMAGE_BASE}:${IMAGE_TAG}"
-DOCKER_CI_IMAGE_LATEST="${DOCKER_CI_IMAGE_LATEST:-${DOCKER_CI_IMAGE_BASE}:latest}"
-DOCKER_CI_DOCKERFILE="${DOCKER_CI_DOCKERFILE:-${WORKSPACE_ROOT}/.docker/ci/Dockerfile}"
-
-# Location for saved images
-DOCKER_BUILD_DIR="${DOCKER_BUILD_DIR:-${WORKSPACE_ROOT}/build}"
-DOCKER_TAR_NAME="${DOCKER_TAR_NAME:-${DOCKER_DEV_IMAGE_BASE}_${IMAGE_TAG}.tar}"
-
-
-dev_greeting() {
- local mode="${1:-shell}"
-
- # Only use colors if stdout is a TTY
- if [ -t 1 ]; then
- local RESET="\033[0m"
- local BOLD="\033[1m"
- local DIM="\033[2m"
- local FG_CYAN="\033[36m"
- local FG_BLUE="\033[34m"
- local FG_YELLOW="\033[33m"
- local FG_MAGENTA="\033[35m"
- else
- local RESET="" BOLD="" DIM="" FG_CYAN="" FG_BLUE="" FG_YELLOW="" FG_MAGENTA=""
- fi
-
- # Try to get a nice OS description; fall back to uname
-
- local kernel arch user container workspace
- kernel="$(uname -r 2>/dev/null || echo "?")"
- arch="$(uname -m 2>/dev/null || echo "?")"
- user="${USER_NAME:-$(id -un 2>/dev/null || echo "unknown")}"
- container="${DOCKER_CONTAINER_NAME:-adore}"
- workspace="${WORKSPACE_ROOT:-$(pwd)}"
-
- # Clear screen (if possible)
- if command -v clear >/dev/null 2>&1; then
- clear
- else
- printf '\033c'
- fi
-
- printf "%b" "${FG_MAGENTA}${BOLD}"
- printf "Welcome to the ADORe Development Environment!\n"
- printf "%b" "${FG_CYAN}${BOLD}"
-
- printf " ...... .......... . \n"
- printf " .. --****++*+++--***##################*#---++. \n"
- printf " . --#*-+-----+++*##-#####***+++++++++++**+**######-- \n"
- printf " --#******+-----::-+##**+*++++++----------------------*##- \n"
- printf " ::**#*+----+***+----*##+----+-------:::--:::::---::::------*##- \n"
- printf " .:.+**+--------+*++--+###+++++----------..:::::::::----------++*###*: \n"
- printf " .:..:--++++###*+++**---------+*##*--*####*-----++**+****########################* \n"
- printf " ..----*****************################*+::+***#########################**#*#####***++-. \n"
- printf " .:-+******++++****##########################*--*###########*******************#######**+++- \n"
- printf " -++*+++******################################****###*#*+**************++++++++***+---+++++--: \n"
- printf " .---+--++++*#########**#########**++***########******++----++++++-++++++--+++-++-:... ..--+-++. \n"
- printf " :::--...:--+---++----+**#####+-:. .:-++++++++++++----------------------------..----: .-+---. \n"
- printf " ------:::----+-++*++++*#####+-. .::.. .-++-++--------------------------------:.-----+: :---- \n"
- printf " :...::---+*###############*+: .:-:*:-+:. .---------------------------+++++++++- --+++-*- :--.: \n"
- printf " :... .---****###########*+: .:-+:+:--+-. ----------+++++++++**++++++++++--+--: -+**+-*-:-.. \n"
- printf " -. .--++:----+-++**+- .-+--++++--*: :--+*****+++++++++--+++-----------:. .-*#+*+.-. \n"
- printf " ..... .:-. ---*++++:..---++***--*- :--------------------::::... :---.:: \n"
- printf " ..:::..:..:------+-+++-. .-+++*+*--**. .::::::::.... .....::::::::::::.. \n"
- printf " ........::::::::::: .--**+#-*+: ....... ....... \n"
- printf " --++-+- .......... \n"
- printf " ..... . .::.::--:::.. \n"
- printf " \n\n"
-
-printf "%b" "${FG_YELLOW}"
-
-printf " Type %bjust --list%b to see available commands,\n" "${FG_CYAN}" "${FG_YELLOW}"
-
-printf "%b" "${RESET}"
-
-
-}
\ No newline at end of file
diff --git a/.docker/scripts/env.sh b/.docker/scripts/env.sh
deleted file mode 100755
index 527b2c88..00000000
--- a/.docker/scripts/env.sh
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env bash
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-# Environment helpers shared by all ADORe scripts.
-
-# NOTE: Do *not* set -euo pipefail here; the parent script does that.
-
-# Detect whether we're running inside a Docker container.
-is_in_docker() {
- if [[ -f "/.dockerenv" ]]; then
- return 0
- fi
-
- if grep -qiE '(docker|lxc|containerd)' /proc/1/cgroup 2>/dev/null; then
- return 0
- fi
-
- case "${CI:-}" in
- true|1|github_actions)
- # Treat CI as "in Docker" for our purposes.
- return 0
- ;;
- esac
-
- return 1
-}
-
-# Ensure a script is executed on the host (outside Docker).
-require_host() {
- if is_in_docker; then
- echo "ERROR: This script is intended to be run on the HOST (outside Docker)." >&2
- if [[ $# -gt 0 ]]; then
- printf '%s\n' "$*" >&2
- fi
- exit 1
- fi
-}
-
-# Ensure a script is executed *inside* a Docker container.
-require_docker() {
- if ! is_in_docker; then
- echo "ERROR: This script is intended to be run INSIDE a Docker container." >&2
- if [[ $# -gt 0 ]]; then
- printf '%s\n' "$*" >&2
- fi
- exit 1
- fi
-}
diff --git a/.docker/scripts/force_kill_ros2.sh b/.docker/scripts/force_kill_ros2.sh
deleted file mode 100755
index 0f3926b8..00000000
--- a/.docker/scripts/force_kill_ros2.sh
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env bash
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-# Kill lingering ROS 2 / colcon processes.
-
-set -euo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${SCRIPT_DIR}/common.sh"
-source "${SCRIPT_DIR}/env.sh"
-
-# Dev container name can be overridden from env
-DOCKER_CONTAINER_NAME="${DOCKER_CONTAINER_NAME:-adore}"
-
-# Repo root: two levels up from .docker/scripts, unless WORKSPACE_ROOT already set
-if [[ -n "${WORKSPACE_ROOT-}" ]]; then
- REPO_ROOT="${WORKSPACE_ROOT}"
-else
- REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
-fi
-
-echo "=== Forcefully killing lingering ROS 2 / colcon processes ==="
-
-if is_in_docker; then
- # --------------------------------------------------------------
- # Running *inside* a container (dev or CI)
- # --------------------------------------------------------------
- echo "[container] Cleaning ROS 2 / colcon processes inside this container..."
-
- echo "-> Killing ros2/colcon wrapper processes..."
- pkill -9 -f "ros2 launch" || true
- pkill -9 -f "ros2 run" || true
- pkill -9 -f "python3.*launch" || true
- pkill -9 -f "rclpy" || true
- pkill -9 -f "ros2 daemon" || true
- pkill -9 -f "colcon" || true
- pkill -9 -f "rosapi" || true
-
-
- echo "-> Killing workspace binaries from build tree (container)..."
- # Prefer REPO_ROOT if set; fall back to $HOME/adore
- workspace_root_in_container="${REPO_ROOT:-$HOME/adore}"
- workspace_pattern="${workspace_root_in_container}/.colcon_workspace/build"
- pids=$(ps axo pid,command | grep "$workspace_pattern" | grep -v grep | awk '{print $1}')
- if [ -n "$pids" ]; then
- echo " Killing workspace processes: $pids"
- kill -9 $pids || true
- else
- echo " No workspace binary processes found."
- fi
-
-else
- # --------------------------------------------------------------
- # Running on the host
- # --------------------------------------------------------------
- echo "[host] Cleaning host + dev container (if running)"
- echo "Workspace root: ${REPO_ROOT}"
- echo "Dev container : ${DOCKER_CONTAINER_NAME}"
-
- # 1) Inside dev container
- if docker ps --format '{{.Names}}' | grep -qx "${DOCKER_CONTAINER_NAME}"; then
- echo "-> Killing ROS 2 processes inside dev container '${DOCKER_CONTAINER_NAME}'..."
- docker exec "${DOCKER_CONTAINER_NAME}" bash -lc '
- set -e
- echo " (container) Killing ros2/colcon wrappers..."
- pkill -9 -f "ros2 launch" || true
- pkill -9 -f "ros2 run" || true
- pkill -9 -f "python3.*launch" || true
- pkill -9 -f "rclpy" || true
- pkill -9 -f "ros2 daemon" || true
- pkill -9 -f "colcon" || true
- pkill -9 -f "rosapi" || true
-
-
- echo " (container) Killing workspace binaries from build tree..."
- workspace_pattern="$HOME/adore/.colcon_workspace/build"
- pids=$(ps axo pid,command | grep "$workspace_pattern" | grep -v grep | awk "{print \$1}")
- if [ -n "$pids" ]; then
- echo " PIDs: $pids"
- kill -9 $pids || true
- else
- echo " No workspace binary processes found."
- fi
- '
- else
- echo "-> Dev container '${DOCKER_CONTAINER_NAME}' not running; skipping container cleanup."
- fi
-
-fi
-
-echo "=== Done. ==="
diff --git a/.docker/scripts/run_ci.sh b/.docker/scripts/run_ci.sh
deleted file mode 100755
index 3bac2508..00000000
--- a/.docker/scripts/run_ci.sh
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env bash
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-# Convenience wrapper: run tests + docs using the CI Docker image.
-
-set -euo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${SCRIPT_DIR}/common.sh"
-
-# Prepare .colcon_workspace/src (symlinks into src/ etc.)
-"${SCRIPT_DIR}/setup_colcon_src.sh"
-
-# ---------------------------------------------------------------------------
-# On arm64, disable the sumo_bridge package via COLCON_IGNORE
-# ---------------------------------------------------------------------------
-ARCH="$(uname -m)"
-COLCON_WS_ROOT="${WORKSPACE_ROOT}/.colcon_workspace"
-if [[ "${DOCKER_DEFAULT_PLATFORM:-}" == "linux/arm64" || "${ARCH}" == "aarch64" ]]; then
- SUMO_BRIDGE_DIR="${COLCON_WS_ROOT}/src/adore_interfaces/sumo_bridge"
-
- if [[ -d "${SUMO_BRIDGE_DIR}" ]]; then
- echo "Disabling sumo_bridge on arm64 via COLCON_IGNORE"
- touch "${SUMO_BRIDGE_DIR}/COLCON_IGNORE"
- else
- echo "sumo_bridge package directory not found at ${SUMO_BRIDGE_DIR}, skipping COLCON_IGNORE"
- fi
-fi
-
-# --------------------------------------------------------------------
-# Ensure ci image exists; build it if needed
-# --------------------------------------------------------------------
-if ! docker image inspect "${DOCKER_CI_IMAGE_LATEST}" >/dev/null 2>&1; then
- echo "--- ci image ${DOCKER_CI_IMAGE_LATEST} not found; building it ---"
- "${SCRIPT_DIR}/build_ci.sh"
-fi
-
-
-# ---------------------------------------------------------------------------
-# Run build + tests + docs inside the CI image
-# ---------------------------------------------------------------------------
-
-# Default for COLCON_WS_ROOT inside the container (relative to repo root)
-CONTAINER_COLCON_WS_ROOT="${CONTAINER_COLCON_WS_ROOT:-.colcon_workspace}"
-
-echo "--- Running CI in Docker image ${DOCKER_CI_IMAGE_LATEST} ---"
-docker run --rm \
- -v "${WORKSPACE_ROOT}:/home/${USER_NAME}/adore" \
- -w "/home/${USER_NAME}/adore" \
- -e ROS_DISTRO="${ROS_DISTRO}" \
- -e COLCON_WS_ROOT="${CONTAINER_COLCON_WS_ROOT}" \
- -e COLCON_COVERAGE_ARGS="--cmake-args -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS=--coverage -DCMAKE_C_FLAGS=--coverage -DCMAKE_POSITION_INDEPENDENT_CODE=ON" \
- "${DOCKER_CI_IMAGE_LATEST}" \
- bash -lc '
- set -euo pipefail
- echo "--- Inside CI container ---"
- echo "ROS_DISTRO=$ROS_DISTRO"
- echo "COLCON_WS_ROOT=${COLCON_WS_ROOT}"
- echo "PWD=$(pwd)" # should be /home/${USER_NAME}/adore
-
- just clean_build
- just test_ws
-
- if command -v gcovr >/dev/null 2>&1; then
- echo "--- Generating coverage reports with gcovr ---"
- mkdir -p .gcovr_reports
- # XML
- gcovr \
- . \
- -r . \
- --exclude 'vendor/.*' \
- --exclude 'adore_interfaces/.*' \
- --exclude '.*rosidl.*' \
- --exclude '.*CMakeFiles/.*' \
- --exclude '.*.colcon_workspace/.*' \
- --xml-pretty \
- --output .gcovr_reports/coverage.xml
-
- # HTML
- gcovr \
- . \
- -r . \
- --exclude 'vendor/.*' \
- --exclude 'adore_interfaces/.*' \
- --exclude '.*rosidl.*' \
- --exclude '.*CMakeFiles/.*' \
- --exclude '.*.colcon_workspace/.*' \
- --html-details \
- --output .gcovr_reports/coverage.html
- else
- echo "gcovr not found in CI image, skipping coverage generation"
- fi
-
- just docs_build
-
-
- '
-
-echo "--- CI run finished ---"
diff --git a/.docker/scripts/run_dev.sh b/.docker/scripts/run_dev.sh
deleted file mode 100755
index 77239faa..00000000
--- a/.docker/scripts/run_dev.sh
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env bash
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-# Run or attach to the ADORe dev container, with persistent zsh history.
-
-set -euo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${SCRIPT_DIR}/common.sh"
-
-require_host "Use this script from the host, not from inside a container."
-
-cd "${WORKSPACE_ROOT}"
-
-IMAGE="${DOCKER_DEV_IMAGE_LATEST}"
-CONTAINER_NAME="${DOCKER_CONTAINER_NAME}"
-
-# --------------------------------------------------------------------
-# Ensure dev image exists; build it if needed
-# --------------------------------------------------------------------
-if ! docker image inspect "${IMAGE}" >/dev/null 2>&1; then
- echo "--- Dev image ${IMAGE} not found; building it ---"
- "${SCRIPT_DIR}/build_dev.sh"
-fi
-
-# --------------------------------------------------------------------
-# If a container with this name is already running, exec into it
-# --------------------------------------------------------------------
-if docker ps --format '{{.Names}}' | grep -qx "${CONTAINER_NAME}"; then
- echo "--- Attaching to running dev container ${CONTAINER_NAME} ---"
- clear
- dev_greeting
- docker exec -it \
- -w "/home/${USER_NAME}/adore/" \
- -e HISTFILE="/home/${USER_NAME}/.zsh_history" \
- -e HISTSIZE=100000 \
- -e SAVEHIST=100000 \
- "${CONTAINER_NAME}" \
- zsh
- exit 0
-fi
-
-# If a container with this name exists but is stopped, remove it
-if docker ps -a --format '{{.Names}}' | grep -qx "${CONTAINER_NAME}"; then
- echo "--- Removing stopped container ${CONTAINER_NAME} ---"
- docker rm "${CONTAINER_NAME}" >/dev/null
-fi
-
-# --------------------------------------------------------------------
-# Start a fresh dev container with persistent zsh history
-# --------------------------------------------------------------------
-HOST_ZSH_HISTORY="${WORKSPACE_ROOT}/.zsh_history"
-if [ ! -f "${HOST_ZSH_HISTORY}" ]; then
- touch "${HOST_ZSH_HISTORY}"
-fi
-
-echo "--- Starting dev container ${CONTAINER_NAME} (image: ${IMAGE}) ---"
-clear
-dev_greeting
-
-docker run --rm -it \
- --name "${CONTAINER_NAME}" \
- --network host \
- -e DISPLAY \
- -e QT_X11_NO_MITSHM=1 \
- -v /tmp/.X11-unix:/tmp/.X11-unix:rw \
- -v "${WORKSPACE_ROOT}:/home/${USER_NAME}/adore" \
- -v "${HOST_ZSH_HISTORY}:/home/${USER_NAME}/.zsh_history" \
- -w "/home/${USER_NAME}/adore/" \
- -e ROS_DISTRO="${ROS_DISTRO}" \
- -e HISTFILE="/home/${USER_NAME}/.zsh_history" \
- -e HISTSIZE=100000 \
- -e SAVEHIST=100000 \
- "${IMAGE}"
diff --git a/.docker/scripts/run_docs.sh b/.docker/scripts/run_docs.sh
deleted file mode 100755
index c28c6650..00000000
--- a/.docker/scripts/run_docs.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env bash
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-# Convenience wrapper: run tests + docs using the CI Docker image.
-
-set -euo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${SCRIPT_DIR}/common.sh"
-
-# Prepare .colcon_workspace/src (symlinks into src/ etc.)
-"${SCRIPT_DIR}/setup_colcon_src.sh"
-
-# ---------------------------------------------------------------------------
-# On arm64, disable the sumo_bridge package via COLCON_IGNORE
-# ---------------------------------------------------------------------------
-ARCH="$(uname -m)"
-COLCON_WS_ROOT="${WORKSPACE_ROOT}/.colcon_workspace"
-if [[ "${DOCKER_DEFAULT_PLATFORM:-}" == "linux/arm64" || "${ARCH}" == "aarch64" ]]; then
- SUMO_BRIDGE_DIR="${COLCON_WS_ROOT}/src/adore_interfaces/sumo_bridge"
-
- if [[ -d "${SUMO_BRIDGE_DIR}" ]]; then
- echo "Disabling sumo_bridge on arm64 via COLCON_IGNORE"
- touch "${SUMO_BRIDGE_DIR}/COLCON_IGNORE"
- else
- echo "sumo_bridge package directory not found at ${SUMO_BRIDGE_DIR}, skipping COLCON_IGNORE"
- fi
-fi
-
-# --------------------------------------------------------------------
-# Ensure ci image exists; build it if needed
-# --------------------------------------------------------------------
-if ! docker image inspect "${DOCKER_CI_IMAGE_LATEST}" >/dev/null 2>&1; then
- echo "--- ci image ${DOCKER_CI_IMAGE_LATEST} not found; building it ---"
- "${SCRIPT_DIR}/build_ci.sh"
-fi
-
-
-# ---------------------------------------------------------------------------
-# Run build + tests + docs inside the CI image
-# ---------------------------------------------------------------------------
-
-# Default for COLCON_WS_ROOT inside the container (relative to repo root)
-CONTAINER_COLCON_WS_ROOT="${CONTAINER_COLCON_WS_ROOT:-.colcon_workspace}"
-
-echo "--- Running CI in Docker image ${DOCKER_CI_IMAGE_LATEST} ---"
-docker run --rm \
- -v "${WORKSPACE_ROOT}:/home/${USER_NAME}/adore" \
- -w "/home/${USER_NAME}/adore" \
- -e ROS_DISTRO="${ROS_DISTRO}" \
- -e COLCON_WS_ROOT="${CONTAINER_COLCON_WS_ROOT}" \
- -e COLCON_COVERAGE_ARGS="--cmake-args -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS=--coverage -DCMAKE_C_FLAGS=--coverage -DCMAKE_POSITION_INDEPENDENT_CODE=ON" \
- "${DOCKER_CI_IMAGE_LATEST}" \
- bash -lc '
- just docs_all
- '
-
-echo "--- CI run finished ---"
diff --git a/.docker/scripts/setup_colcon_src.sh b/.docker/scripts/setup_colcon_src.sh
deleted file mode 100755
index b67dee1b..00000000
--- a/.docker/scripts/setup_colcon_src.sh
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env bash
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-# Ensure .colcon_workspace/src mirrors the top-level package layout via symlinks.
-
-set -euo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${SCRIPT_DIR}/common.sh"
-
-SRC_DIR="${WORKSPACE_ROOT}/.colcon_workspace/src"
-mkdir -p "${SRC_DIR}"
-
-# Top-level dirs that contain colcon packages
-CATEGORIES=(
- "adore_scenarios"
- "adore_ros2_conversions"
- "adore_interfaces"
- "adore_libraries"
- "adore_test_programs"
- "adore_ros2_nodes"
- "adore_ros2_msgs"
- "vendor"
-)
-
-link_category() {
- local category="$1"
-
- local target_dir="${WORKSPACE_ROOT}/${category}"
- if [[ ! -d "${target_dir}" ]]; then
- echo "WARN: Skipping category '${category}' – directory not found at ${target_dir}" >&2
- return 0
- fi
-
- local link_path="${SRC_DIR}/${category}"
- local target_rel="../../${category}"
-
- if [[ -L "${link_path}" ]]; then
- # Already a symlink – check if it points to the expected location
- local current
- current="$(readlink "${link_path}")"
- if [[ "${current}" == "${target_rel}" ]]; then
- echo "OK: Symlink for '${category}' already correct."
- return 0
- else
- echo "Updating symlink for '${category}': ${current} -> ${target_rel}"
- rm -f "${link_path}"
- fi
- fi
-
- if [[ -e "${link_path}" ]]; then
- echo "ERROR: ${link_path} exists and is not a symlink. Please remove or rename it." >&2
- return 1
- fi
-
- echo "Creating symlink: ${link_path} -> ${target_rel}"
- ln -sfn "${target_rel}" "${link_path}"
-}
-
-for cat in "${CATEGORIES[@]}"; do
- link_category "${cat}"
-done
diff --git a/.docker/scripts/test_quick_start.sh b/.docker/scripts/test_quick_start.sh
deleted file mode 100755
index 3ccf3efc..00000000
--- a/.docker/scripts/test_quick_start.sh
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/usr/bin/env bash
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-set -euo pipefail
-
-# Base image for testing (Ubuntu because the setup script assumes Ubuntu + apt)
-IMAGE="ubuntu:24.04"
-
-# URL to use when no local setup script is provided
-DEFAULT_SETUP_URL="https://raw.githubusercontent.com/eclipse-adore/adore/develop/tools/adore_setup.sh"
-
-LOCAL_SETUP_PATH="${1:-}" # Optional: path to local setup script
-
-echo "Pulling base image ${IMAGE} if necessary..."
-docker pull "${IMAGE}" >/dev/null
-
-# Common docker run args: mount host docker socket so the setup script can build images
-DOCKER_CMD=(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock)
-
-if [[ -n "${LOCAL_SETUP_PATH}" ]]; then
- # --- Local script mode ----------------------------------------------------
- if [[ ! -f "${LOCAL_SETUP_PATH}" ]]; then
- echo "ERROR: Provided setup script '${LOCAL_SETUP_PATH}' not found" >&2
- echo "false"
- exit 1
- fi
-
- # Resolve to absolute path (without relying on realpath)
- SETUP_ABS_PATH="$(
- cd "$(dirname "${LOCAL_SETUP_PATH}")"
- pwd
- )/$(basename "${LOCAL_SETUP_PATH}")"
-
- echo "INFO: Testing local setup script: ${SETUP_ABS_PATH}"
-
- # Mount the local script into the container
- DOCKER_CMD+=(-v "${SETUP_ABS_PATH}:/opt/adore_setup.sh:ro")
-
- # Command executed inside the container
- # - Install tools (including docker.io + sudo)
- # - Ensure group 'docker' exists (needed for newgrp docker in the setup script)
- # - Run the setup script in headless mode
- RUN_CMD='export DEBIAN_FRONTEND=noninteractive; \
- apt-get update && \
- apt-get install -y ca-certificates curl git sudo docker.io && \
- groupadd -f docker && \
- bash /opt/adore_setup.sh --headless'
-
-else
- # --- Remote script mode ---------------------------------------------------
- echo "INFO: No local setup script provided."
- echo "INFO: Will curl '${DEFAULT_SETUP_URL}' inside the container."
-
- # No extra volume for the script; it will be downloaded inside the container
- RUN_CMD="export DEBIAN_FRONTEND=noninteractive; \
- apt-get update && \
- apt-get install -y ca-certificates curl git sudo docker.io && \
- groupadd -f docker && \
- bash <(curl -sSL ${DEFAULT_SETUP_URL}) --headless"
-fi
-
-# Add image + command to docker run invocation
-DOCKER_CMD+=("${IMAGE}" bash -lc "${RUN_CMD}")
-
-echo "Running setup script inside container..."
-if "${DOCKER_CMD[@]}"; then
- echo "true"
- exit 0
-else
- echo "false"
- exit 1
-fi
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 34327e7b..bb63ca8d 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -1,93 +1,197 @@
-name: CI
+name: ADORe CI
+run-name: "ADORe CI #${{ github.run_number }}: ${{ github.event.head_commit.message }} by ${{ github.actor }}"
on:
push:
- branches: [ main, master, develop ]
+ branches: ["**"]
+ tags: ["v*"]
pull_request:
- branches: [ "**" ]
+ branches: ["**"]
+ release:
+ types: [published]
+
+permissions:
+ contents: write
+ packages: write
jobs:
- ci:
- name: Tests + Docs (CI image) — ${{ matrix.name }}
+ build-test-push-publish:
strategy:
fail-fast: false
matrix:
include:
- - name: x86_64
- runner: ubuntu-24.04
- platform: linux/amd64
- - name: arm64
+ - arch: x86_64
+ runner: ubuntu-latest
+ - arch: aarch64
runner: ubuntu-24.04-arm
- platform: linux/arm64
runs-on: ${{ matrix.runner }}
- permissions:
- contents: read
-
env:
- ROS_DISTRO: jazzy
- DOCKER_DEFAULT_PLATFORM: ${{ matrix.platform }}
- COLCON_WS_ROOT: .colcon_workspace
+ ADORE_CLI_REPO: ${{ github.repository }}
+
steps:
- - name: Checkout repository
- uses: actions/checkout@v4
+ - uses: actions/checkout@v4
with:
submodules: recursive
+ fetch-depth: 0
- - name: Show environment
- run: |
- echo "Runner: ${{ matrix.runner }}"
- echo "Platform: ${{ matrix.platform }}"
- uname -a
- docker info
-
- - name: Cache ccache
- uses: actions/cache@v4
+ - name: Log in to GitHub Container Registry
+ uses: docker/login-action@v3
with:
- path: .cache/ccache
- # One cache per OS + arch + branch
- key: ccache-${{ runner.os }}-${{ matrix.name }}-${{ github.ref_name }}
- restore-keys: |
- ccache-${{ runner.os }}-${{ matrix.name }}-
- ccache-${{ runner.os }}-
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ # ── Lichtblick ────────────────────────────────────────────────────────────
+ - name: Build Lichtblick
+ run: cd tools/lichtblick && make build
+
+ - name: Push Lichtblick image
+ if: github.event_name != 'pull_request'
+ run: cd tools/lichtblick && make push_lichtblick
+
+ # ── ADORe CLI + ADORe ─────────────────────────────────────────────────────
+ - name: Build ADORe
+ run: make build
+
+ # ── Package ─────────────────────────────────────────────────────────────────
+ #- name: Package ADORe
+ # run: make package
- - name: Build CI Docker image
- run: .docker/scripts/build_ci.sh
+ # ── Tests ─────────────────────────────────────────────────────────────────
+ - name: Run tests
+ run: make test
- - name: Run tests + docs inside CI image
- run: .docker/scripts/run_ci.sh
+ # ── Push images (only after tests pass) ───────────────────────────────────
+ - name: Push ADORe CLI user image
+ if: github.event_name != 'pull_request'
+ run: make push_user_image
- - name: Upload colcon logs (${{ matrix.name }})
+ # ── ADORe Embedded ────────────────────────────────────────────────────────
+ - name: Build ADORe Embedded
+ run: cd adore_embedded && make build
+
+ - name: Package ADORe Embedded
+ run: cd adore_embedded && make package && make bundle
+
+ - name: Push ADORe Embedded image
+ if: github.event_name != 'pull_request'
+ run: cd adore_embedded && make push
+
+ - name: Upload logs
if: always()
uses: actions/upload-artifact@v4
with:
- name: colcon-logs-${{ matrix.name }}
- path: ${{ env.COLCON_WS_ROOT }}/log
+ name: logs-${{ matrix.arch }}
+ path: |
+ .log
+ ros2_workspace/log
if-no-files-found: ignore
+
- - name: Upload colcon test results
- if: always()
+ - name: Generate ADORe Embedded Release
uses: actions/upload-artifact@v4
with:
- name: test-results-${{ matrix.name }}
- path: ${{ env.COLCON_WS_ROOT }}/build/*/test_results/**/*.xml
- if-no-files-found: ignore
+ name: adore-embedded-packages-${{ matrix.arch }}
+ path: adore_embedded/packages/adore_embedded_*.tar.gz
+ if-no-files-found: error
- - name: Upload coverage reports
- if: always()
- uses: actions/upload-artifact@v4
+ # ── Release ───────────────────────────────────────────────────────────────────
+ release:
+ needs: build-test-push-publish
+ if: >-
+ always() &&
+ needs.build-test-push-publish.result == 'success' &&
+ github.event_name == 'push' &&
+ github.repository == 'eclipse-adore/adore'
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
with:
- name: coverage-${{ matrix.name }}
- path: |
- .gcovr_reports/coverage.xml
- .gcovr_reports/coverage.html
- if-no-files-found: error # or 'ignore' while you're iterating locally
+ submodules: recursive
+ fetch-depth: 0
- - name: Upload built docs (${{ matrix.name }})
- if: always()
- uses: actions/upload-artifact@v4
+ - name: Download ADORe Embedded packages (x86_64)
+ uses: actions/download-artifact@v4
with:
- name: docs-site-${{ matrix.name }}
- path: documentation/docs
- if-no-files-found: ignore
+ name: adore-embedded-packages-x86_64
+ path: dist/
+
+ - name: Download ADORe Embedded packages (aarch64)
+ uses: actions/download-artifact@v4
+ with:
+ name: adore-embedded-packages-aarch64
+ path: dist/
+
+ - name: Create source archive
+ run: |
+ ref="${{ github.ref_name }}"
+ ref_slug="${ref//\//-}"
+ if [[ "$ref" == "develop" ]]; then
+ release_tag="release"
+ release_name="release"
+ else
+ release_tag="dev-${ref_slug}"
+ release_name="development snapshot for ${ref}"
+ fi
+ echo "RELEASE_TAG=${release_tag}" >> "$GITHUB_ENV"
+ echo "RELEASE_NAME=${release_name}" >> "$GITHUB_ENV"
+ echo "REF_SLUG=${ref_slug}" >> "$GITHUB_ENV"
+ mkdir -p dist
+ git archive --format=tar.gz \
+ --prefix=adore_embedded/ \
+ --output="dist/adore_embedded_source_${ref_slug}.tar.gz" \
+ HEAD:adore_embedded
+
+ - name: Stage README
+ run: |
+ release_url="https://github.com/${{ github.repository }}/releases/tag/${{ env.RELEASE_TAG }}"
+ x86_file=$(basename "$(ls dist/adore_embedded_x86_64_*.tar.gz | grep -v bundle | head -1)")
+ aarch64_file=$(basename "$(ls dist/adore_embedded_aarch64_*.tar.gz | grep -v bundle | head -1)")
+ x86_bundle=$(basename "$(ls dist/adore_embedded_x86_64_*_bundle.tar.gz | head -1)")
+ aarch64_bundle=$(basename "$(ls dist/adore_embedded_aarch64_*_bundle.tar.gz | head -1)")
+ awk \
+ -v release_tag="${{ env.RELEASE_TAG }}" \
+ -v release_url="$release_url" \
+ -v x86_file="$x86_file" \
+ -v aarch64_file="$aarch64_file" \
+ -v x86_bundle="$x86_bundle" \
+ -v aarch64_bundle="$aarch64_bundle" \
+ -v x86_dir="${x86_file%.tar.gz}" \
+ -v aarch64_dir="${aarch64_file%.tar.gz}" \
+ '{
+ gsub(//, release_tag)
+ gsub(//, release_url)
+ gsub(//, x86_bundle)
+ gsub(//, aarch64_bundle)
+ gsub(//, x86_file)
+ gsub(//, aarch64_file)
+ gsub(//, x86_dir)
+ gsub(//, aarch64_dir)
+ print
+ }' \
+ adore_embedded/README.release.md > dist/README.md
+
+ - name: Delete existing release assets
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ gh release view "${{ env.RELEASE_TAG }}" --json assets \
+ --jq '.assets[].name' 2>/dev/null \
+ | xargs -r -I{} gh release delete-asset \
+ "${{ env.RELEASE_TAG }}" "{}" --yes 2>/dev/null \
+ || true
+
+ - name: Publish GitHub release assets
+ uses: softprops/action-gh-release@v2
+ with:
+ tag_name: ${{ env.RELEASE_TAG }}
+ name: ${{ env.RELEASE_NAME }}
+ target_commitish: ${{ github.sha }}
+ body_path: dist/README.md
+ prerelease: ${{ github.ref_name != 'develop' }}
+ files: |
+ dist/adore_embedded_*.tar.gz
+ fail_on_unmatched_files: true
diff --git a/.github/workflows/docs_publish.yaml b/.github/workflows/docs_publish.yaml
deleted file mode 100644
index a5735621..00000000
--- a/.github/workflows/docs_publish.yaml
+++ /dev/null
@@ -1,45 +0,0 @@
-name: Publish Docs
-
-on:
- push:
- branches: [ main ]
- paths:
- - 'documentation/**'
- - 'Justfile'
- - '.docker/scripts/**'
- - '.github/workflows/docs-publish.yml'
-
-jobs:
- publish-docs:
- name: Build & publish docs
- runs-on: ubuntu-24.04
-
- permissions:
- contents: write # needed to push gh-pages
- pages: write
- id-token: write
-
- env:
- ROS_DISTRO: jazzy
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
- with:
- submodules: recursive
- # keep default persist-credentials: true so pushes use GITHUB_TOKEN
-
- - name: Show Docker info
- run: docker info
-
- - name: Build CI Docker image
- run: .docker/scripts/build_ci.sh
-
- - name: Build docs in CI image
- run: .docker/scripts/run_docs.sh
-
- - name: Publish docs to gh-pages
- run: |
- set -euo pipefail
- cd documentation
- bash publish_gh-pages.sh
diff --git a/.gitignore b/.gitignore
index ded9487d..6cdcdbbb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,14 +1,23 @@
-.zsh_history
+ros2_workspace/colcon_defaults.yaml
+**.zsh_history
**/build
**/.tmp
build
**.jpg
**.log
+**.zip
deploy.env
libraries/cmake/ignore/ignore.log
.log
plugins/*
!plugins/.gitkeep
+adore_embedded/context/
+adore_embedded/packages/
+adore_embedded/build/
+**.rej
+**.orig
+ros2_workspace/src/vendor/adore_extended
+Function
**.vscode
.colcon_workspace/build
@@ -17,6 +26,11 @@ plugins/*
.colcon_workspace/src/
**__pycache__**
*.pyc
+**.tar.gz
+**.orj
+**.rej
+
+ros2_workspace/colcon_defaults.yaml
### C++ ###
# Prerequisites
diff --git a/.gitmodules b/.gitmodules
index dbafdb06..942a7345 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,82 +1,122 @@
[submodule "ros2_messages/adore_ros2_msgs"]
- path = adore_ros2_msgs
+ path = ros2_workspace/src/adore_ros2_msgs
url = git@github.com:eclipse-adore/adore_ros2_msgs.git
[submodule "nodes/adore_simulated_vehicle"]
- path = adore_ros2_nodes/simulated_vehicle
+ path = ros2_workspace/src/adore_ros2_nodes/simulated_vehicle
url = git@github.com:eclipse-adore/adore_simulated_vehicle.git
[submodule "mission_control"]
- path = adore_ros2_nodes/mission_control
+ path = ros2_workspace/src/adore_ros2_nodes/mission_control
url = git@github.com:eclipse-adore/adore_mission_control.git
[submodule "nodes/adore_visualizer"]
- path = adore_ros2_nodes/visualizer
+ path = ros2_workspace/src/adore_ros2_nodes/visualizer
url = git@github.com:eclipse-adore/adore_visualizer.git
[submodule "nodes/adore_decision_maker"]
- path = adore_ros2_nodes/decision_maker
+ path = ros2_workspace/src/adore_ros2_nodes/decision_maker
url = git@github.com:eclipse-adore/adore_decision_maker.git
[submodule "nodes/adore_trajectory_tracker"]
- path = adore_ros2_nodes/trajectory_tracker
+ path = ros2_workspace/src/adore_ros2_nodes/trajectory_tracker
url = git@github.com:eclipse-adore/adore_trajectory_tracker.git
[submodule "adore_scenarios/adore_simulation_scenarios"]
path = adore_scenarios/simulation_scenarios
url = git@github.com:eclipse-adore/adore_simulation_scenarios.git
-[submodule "vendor/libOpenDRIVE"]
- path = vendor/libOpenDRIVE
- url = git@github.com:markomiz/libOpenDRIVE.git
[submodule "interfaces/sumo_bridge"]
- path = adore_interfaces/sumo_bridge
+ path = ros2_workspace/src/adore_interfaces/sumo_bridge
url = git@github.com:eclipse-adore/sumo_if_ros.git
[submodule "interfaces/carla_bridge"]
- path = adore_interfaces/carla_bridge
+ path = ros2_workspace/src/adore_interfaces/carla_bridge
url = git@github.com:eclipse-adore/adore_if_carla.git
[submodule "ros2_messages/ros-carla-msgs"]
- path = vendor/ros-carla-msgs
+ path = ros2_workspace/src/vendor/ros-carla-msgs
url = git@github.com:carla-simulator/ros-carla-msgs.git
[submodule "tools/ros2_observer"]
path = tools/ros2_observer
url = git@github.com:DLR-TS/ros2_observer.git
[submodule "libraries/adore_planning"]
- path = adore_libraries/adore_planning
+ path = ros2_workspace/src/adore_libraries/adore_planning
url = git@github.com:eclipse-adore/adore_planning.git
[submodule "libraries/adore_controllers"]
- path = adore_libraries/adore_controllers
+ path = ros2_workspace/src/adore_libraries/adore_controllers
url = git@github.com:eclipse-adore/adore_controllers.git
[submodule "libraries/adore_map"]
- path = adore_libraries/adore_map
+ path = ros2_workspace/src/adore_libraries/adore_map
url = git@github.com:eclipse-adore/adore_map.git
[submodule "libraries/adore_math"]
- path = adore_libraries/adore_math
+ path = ros2_workspace/src/adore_libraries/adore_math
url = git@github.com:eclipse-adore/adore_math.git
[submodule "libraries/adore_dynamics"]
- path = adore_libraries/adore_dynamics
+ path = ros2_workspace/src/adore_libraries/adore_dynamics
url = git@github.com:eclipse-adore/adore_dynamics.git
[submodule "conversions/adore_dynamics_conversions"]
- path = adore_ros2_conversions/adore_dynamics_conversions
+ path = ros2_workspace/src/adore_ros2_conversions/adore_dynamics_conversions
url = git@github.com:eclipse-adore/adore_dynamics_conversions.git
[submodule "conversions/adore_map_conversions"]
- path = adore_ros2_conversions/adore_map_conversions
+ path = ros2_workspace/src/adore_ros2_conversions/adore_map_conversions
url = git@github.com:eclipse-adore/adore_map_conversions.git
[submodule "conversions/adore_math_conversions"]
- path = adore_ros2_conversions/adore_math_conversions
+ path = ros2_workspace/src/adore_ros2_conversions/adore_math_conversions
url = git@github.com:eclipse-adore/adore_math_conversions.git
[submodule "nodes/adore_decision_maker_infrastructure"]
- path = adore_ros2_nodes/decision_maker_infrastructure
+ path = ros2_workspace/src/adore_ros2_nodes/decision_maker_infrastructure
url = git@github.com:eclipse-adore/adore_decision_maker_infrastructure.git
[submodule "nodes/adore_simulated_remote_operator"]
- path = adore_ros2_nodes/simulated_remote_operator
+ path = ros2_workspace/src/adore_ros2_nodes/simulated_remote_operator
url = git@github.com:eclipse-adore/adore_simulated_remote_operator.git
[submodule "vendor/osqp_eigen"]
- path = vendor/osqp_eigen
- url = https://github.com/robotology/osqp-eigen.git
-[submodule "vendor/multi_agent_solver"]
- path = vendor/multi_agent_solver
- url = git@github.com:markomiz/multi_agent_solver.git
+ path = vendor/osqp/osqp_eigen
+ url = https://github.com/dlr-ts/osqp-eigen.git
[submodule "vendor/osqp"]
- path = vendor/osqp
+ path = vendor/osqp/osqp
url = https://github.com/osqp/osqp.git
[submodule "tools/adore_model_checker"]
path = tools/adore_model_checker
url = git@github.com:DLR-TS/adore_model_checker.git
[submodule "vendor/caches"]
- path = vendor/caches
+ path = ros2_workspace/src/vendor/caches
url = git@github.com:s0nofab1t/caches.git
branch = feature/wfs-downloader
+[submodule "adore_cli"]
+ path = adore_cli
+ url = git@github.com:eclipse-adore/adore_cli.git
+[submodule "vendor/OptiNLC"]
+ path = vendor/OptiNLC
+ url = git@github.com:dlr-ts/OptiNLC.git
+[submodule "vendor/mathematics_toolbox"]
+ path = vendor/mathematics_toolbox
+ url = git@github.com:dlr-ts/mathematics_toolbox.git
+
+[submodule "vendor/ros2_observer"]
+ path = vendor/ros2_observer
+ url = git@github.com:dlr-ts/ros2_observer.git
+[submodule "tools/lichtblick/lichtblick"]
+ path = tools/lichtblick/lichtblick
+ url = https://github.com/Lichtblick-Suite/lichtblick.git
+[submodule "vendor/libOpenDRIVE/libOpenDRIVE"]
+ path = vendor/libOpenDRIVE/libOpenDRIVE
+ url = git@github.com:pageldev/libOpenDRIVE.git
+[submodule "ros2_workspace/src/vendor/osqp-eigen"]
+ path = ros2_workspace/src/vendor/osqp_eigen
+ url = https://github.com/robotology/osqp-eigen.git
+[submodule "ros2_workspace/src/vendor/multi_agent_solver"]
+ path = ros2_workspace/src/vendor/multi_agent_solver
+ url = git@github.com:DLR-TS/multi_agent_solver.git
+[submodule "ros2_workspace/src/vendor/osqp"]
+ path = ros2_workspace/src/vendor/osqp/osqp
+ url = https://github.com/osqp/osqp.git
+[submodule "ros2_workspace/src/vendor/libOpenDRIVE"]
+ path = ros2_workspace/src/vendor/libOpenDRIVE
+ url = git@github.com:pageldev/libOpenDRIVE.git
+[submodule "ros2_workspace/src/vendor/qdldl"]
+ path = ros2_workspace/src/vendor/osqp/qdldl
+ url = git@github.com:osqp/qdldl.git
+[submodule "ros2_workspace/src/vendor/pugixml"]
+ path = ros2_workspace/src/vendor/osqp/pugixml
+ url = git@github.com:zeux/pugixml.git
+[submodule "ros2_workspace/src/vendor/osqp_build/osqp"]
+ path = ros2_workspace/src/vendor/osqp_build/osqp
+ url = https://github.com/osqp/osqp.git
+[submodule "vendor/adore_model_checker"]
+ path = vendor/adore_model_checker
+ url = git@github.com:DLR-TS/adore_model_checker.git
+[submodule "ros2_workspace/src/adore_ros2_nodes/operational_design_domain"]
+ path = ros2_workspace/src/adore_ros2_nodes/operational_design_domain
+ url = git@github.com:DLR-TS/operational_design_domain.git
diff --git a/.tests b/.tests
new file mode 100644
index 00000000..0e896eb3
--- /dev/null
+++ b/.tests
@@ -0,0 +1,459 @@
+#!/usr/bin/env bash
+
+#Define module specific tests here
+# each test function should be post fixed with "_test" to be automatically
+# invoked.
+
+LOG_DIRECTORY="${LOG_DIRECTORY:-.log}"
+
+
+# Global timeout for API readiness check (in seconds)
+API_READINESS_TIMEOUT=60
+
+SIMULATION_TEST_SCENARIO_RUNTIME=45
+SIMULATION_TEST_SCENARIO_REQUEST_TIMEOUT=120
+
+
+wait_for_api_ready() {
+ local timeout=${1:-$API_READINESS_TIMEOUT}
+ local status_url="http://localhost:8888/api/status"
+ local elapsed=0
+
+ while [ $elapsed -lt $timeout ]; do
+ if curl -s --max-time 5 "$status_url" > /dev/null 2>&1; then
+ local http_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "$status_url")
+ if [ "$http_code" = "200" ]; then
+ return 0
+ fi
+ fi
+ sleep 1
+ elapsed=$((elapsed + 1))
+ done
+
+ return 1
+}
+
+01_api_health_check_test() {
+ local action=health_check
+ local name="API Health Check Test"
+ local description="This test validates that the API is responding correctly to basic requests."
+ local status=""
+ local message=""
+ local api_health_output_json_file="${LOG_DIRECTORY}/api_health_check_results.json"
+ printf "\n"
+ printf " Test: %s\n" "${name}"
+ printf " Description: %s\n" "${description}"
+ printf " This test aims to answer the following questions: \n"
+ printf " Is the API server responding?\n"
+ printf " Are the basic endpoints accessible?\n"
+ printf " Do the endpoints return valid JSON?\n"
+ printf " Starting API health check...\n"
+ make start > /dev/null 2>&1
+
+ printf " Waiting for API to be ready...\n"
+ if ! wait_for_api_ready; then
+ printf " Status: $(bold $(red "FAILED")) - API not ready after ${API_READINESS_TIMEOUT} seconds\n"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ # Test 1: Status endpoint
+ printf " Testing status endpoint...\n"
+ status_http_code=$(curl -s --max-time 10 -o /tmp/status_response -w "%{http_code}" http://localhost:8888/api/status)
+ status_exit_code=$?
+
+ if [ $status_exit_code -ne 0 ]; then
+ printf " Status: $(bold $(red "FAILED")) - Status endpoint failed with exit code $status_exit_code\n"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ if [ "$status_http_code" != "200" ]; then
+ printf " Status: $(bold $(red "FAILED")) - Status endpoint returned HTTP $status_http_code\n"
+ printf " Response: %s\n" "$(cat /tmp/status_response)"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ status_result=$(cat /tmp/status_response)
+ # Validate status response is valid JSON
+ if ! echo "$status_result" | jq . > /dev/null 2>&1; then
+ printf " Status: $(bold $(red "FAILED")) - Status endpoint returned invalid JSON\n"
+ printf " Response: %s\n" "$status_result"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ # Test 2: Scenario endpoint
+ printf " Testing scenario endpoints...\n"
+ scenario_http_code=$(curl -s --max-time 10 -o /tmp/scenario_response -w "%{http_code}" http://localhost:8888/api/scenario/get)
+ scenario_exit_code=$?
+
+ if [ $scenario_exit_code -ne 0 ]; then
+ printf " Status: $(bold $(red "FAILED")) - Scenario endpoint failed with exit code $scenario_exit_code\n"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ if [ "$scenario_http_code" != "200" ]; then
+ printf " Status: $(bold $(red "FAILED")) - Scenario endpoint returned HTTP $scenario_http_code\n"
+ printf " Response: %s\n" "$(cat /tmp/scenario_response)"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ scenario_result=$(cat /tmp/scenario_response)
+ # Validate scenario response is valid JSON
+ if ! echo "$scenario_result" | jq . > /dev/null 2>&1; then
+ printf " Status: $(bold $(red "FAILED")) - Scenario endpoint returned invalid JSON\n"
+ printf " Response: %s\n" "$scenario_result"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ # Test 3: Test invalid endpoint returns proper error
+ printf " Testing error handling...\n"
+ error_http_code=$(curl -s --max-time 10 -o /dev/null -w "%{http_code}" http://localhost:8888/api/nonexistent)
+ error_exit_code=$?
+
+ if [ $error_exit_code -ne 0 ]; then
+ printf " Status: $(bold $(red "FAILED")) - Error test failed with exit code $error_exit_code\n"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ # Check that we get a 404 for non-existent endpoint
+ if [ "$error_http_code" != "404" ]; then
+ printf " Status: $(bold $(red "FAILED")) - Expected 404 for non-existent endpoint, got $error_http_code\n"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ printf "\n"
+ printf " Compiling results...\n"
+
+ # Create summary JSON
+ health_summary=$(jq -n \
+ --arg status_response "$status_result" \
+ --arg scenario_response "$scenario_result" \
+ --arg status_http_code "$status_http_code" \
+ --arg scenario_http_code "$scenario_http_code" \
+ --arg error_http_code "$error_http_code" \
+ '{
+ "test_name": "API Health Check",
+ "timestamp": now | strftime("%Y-%m-%d %H:%M:%S"),
+ "results": {
+ "status_endpoint": {
+ "status": "PASSED",
+ "http_code": $status_http_code,
+ "response": ($status_response | fromjson)
+ },
+ "scenario_endpoint": {
+ "status": "PASSED",
+ "http_code": $scenario_http_code,
+ "response_length": ($scenario_response | length)
+ },
+ "error_handling": {
+ "status": "PASSED",
+ "http_code": $error_http_code
+ }
+ },
+ "overall_status": "PASSED"
+ }')
+
+ echo "$health_summary" > "$api_health_output_json_file"
+
+ # Extract key info for display
+ api_version=$(echo "$status_result" | jq -r '.version // "unknown"' 2> /dev/null)
+
+ message=" API Health Check Summary:
+ Status endpoint: PASSED (HTTP $status_http_code)
+ Scenario endpoint: PASSED (HTTP $scenario_http_code)
+ Error handling: PASSED (proper 404 response)
+ API version: ${api_version}"
+
+ status=$(bold $(green "PASSED"))
+ printf " Message:\n%s\n" "$message"
+ printf " %-77s %s\n" "Status:" "${status}"
+ make stop > /dev/null 2>&1
+ printf " See the health check log for more info: %s\n" "$api_health_output_json_file"
+
+ # Clean up temp files
+ rm -f /tmp/status_response /tmp/scenario_response
+ exit 0
+}
+
+00_ros2_build_check_test() {
+ local name="ROS2 Build Check"
+ local description="Verifies that the ROS2 workspace has been successfully built before running simulation tests."
+ local build_success_file="ros2_workspace/build/build.success"
+
+ printf "\n"
+ printf " Test: %s\n" "${name}"
+ printf " Description: %s\n" "${description}"
+ printf " Checking for ROS2 build artifact...\n"
+
+ if [ ! -f "${build_success_file}" ]; then
+ printf " Status: $(bold $(red "FAILED")) - Build success marker not found: %s\n" "${build_success_file}"
+ printf " Run 'make build' or build the ROS2 workspace before executing simulation tests.\n"
+ exit 1
+ fi
+
+ printf " Build success marker found: %s\n" "${build_success_file}"
+ printf " %-77s %s\n" "Status:" "$(bold $(green "PASSED"))"
+ exit 0
+}
+
+02_simulation_test_scenario_test() {
+ local action=simulate
+ local name="Simulation Test"
+ local description="This test executes the simulation_test.launch.py scenario and verify the model checking results."
+ local status=""
+ local message=""
+ local model_checking_output_json_file="${LOG_DIRECTORY}/simulation_test_model_checking_results.json"
+ printf "\n"
+ printf " Test: %s\n" "${name}"
+ printf " Description: %s\n" "${description}"
+ printf " This test aims to answer the following questions: \n"
+ printf " Did the vehicle move?\n"
+ printf " Did the vehicle reach its goal?\n"
+ printf " Did the scenario generate any exceptions?\n"
+ printf " Running scenario...\n"
+ make start > /dev/null 2>&1
+
+ printf " Waiting for API to be ready...\n"
+ if ! wait_for_api_ready; then
+ printf " Status: $(bold $(red "FAILED")) - API not ready after ${API_READINESS_TIMEOUT} seconds\n"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ {
+ while true; do
+ sleep 1
+ printf "." >&2
+ done
+ } &
+ dot_pid=$!
+
+
+ result=$(curl -s --max-time ${SIMULATION_TEST_SCENARIO_REQUEST_TIMEOUT} \
+ -X POST http://localhost:8888/api/scenario/start/model_checked \
+ -H "Content-Type: application/json" \
+ -d "{\"duration\":${SIMULATION_TEST_SCENARIO_RUNTIME}}")
+ curl_exit_code=$?
+
+ kill $dot_pid 2> /dev/null
+ wait $dot_pid 2> /dev/null
+
+ if [ $curl_exit_code -eq 28 ]; then
+ printf "\n"
+ printf " Status: $(bold $(red "FAILED")) - Request timed out after ${SIMULATION_TEST_SCENARIO_REQUEST_TIMEOUT} seconds\n"
+ make stop > /dev/null 2>&1
+ exit 1
+ elif [ $curl_exit_code -ne 0 ]; then
+ printf "\n"
+ printf " Status: $(bold $(red "FAILED")) - Request failed with exit code $curl_exit_code\n"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ printf "\n"
+ printf " Parsing results...\n"
+ echo "${result}" > "${model_checking_output_json_file}"
+
+ if [ -z "$result" ] || [ "$result" = "null" ]; then
+ printf " Status: $(bold $(red "FAILED")) - API returned no results\n"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ if ! echo "$result" | jq . > /dev/null 2>&1; then
+ printf " Status: $(bold $(red "FAILED")) - API returned invalid JSON\n"
+ printf " Response: %s\n" "$result"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ if ! echo "$result" | jq -e '.model_check_result.results' > /dev/null 2>&1; then
+ printf " Status: $(bold $(red "FAILED")) - API response missing expected model check results\n"
+ printf " Response: %s\n" "$result"
+ make stop > /dev/null 2>&1
+ exit 1
+ fi
+
+ message=$(echo "$result" | jq -r '
+ .model_check_result.results.SUMMARY as $s |
+ (
+ " Model Check Summary: " +
+ (($s.total_propositions // $s.analyzed // 0) | tostring) + " analyzed, " +
+ (($s.passed // 0) | tostring) + " passed, " +
+ (($s.failed // 0) | tostring) + " failed, success rate: " +
+ (((($s.success_rate // 0) * 100) | round) | tostring) + "% - Overall result: " +
+ ($s.overall_result // "UNKNOWN") +
+ "\n"
+ ) +
+ " Propositions:\n" +
+ (
+ (.model_check_result.results // {})
+ | to_entries
+ | map(select(.key != "SUMMARY"))
+ | map(
+ " " + (.value.description.title // .value.title // .key) + ": " + (.value.status // "UNKNOWN") + "\n" +
+ " Description: " + (.value.description.description // .value.description // "N/A") + "\n" +
+ " Safety Goal: " + (.value.description.safety_rationale // .value.safety_rationale // "N/A") + "\n" +
+ " Formula Description: " + (.value.formula_description // "N/A") + "\n" +
+ " Formula Type: " + (.value.formula_type // "N/A")
+ )
+ | join("\n\n")
+ )
+ ')
+
+ model_checking_status=$(echo "$result" | jq -r '
+ if ((.model_check_result.results.SUMMARY.success_rate // 0) == 1 and
+ ([.model_check_result.results | to_entries[] | select(.key != "SUMMARY") | .value.status] |
+ any(. == "NO_DATA" or . == "FAIL")) | not) then 0 else 1 end
+ ')
+
+ if [ "$model_checking_status" -eq 0 ]; then
+ status=$(bold $(green "PASSED"))
+ else
+ status=$(bold $(red "FAILED"))
+ fi
+
+ printf " Message:\n%s\n" "$message"
+ printf " %-77s %s\n" "Status:" "${status}"
+ make stop > /dev/null 2>&1
+ printf " See the model checking log for more info: %s\n" "$model_checking_output_json_file"
+ exit $model_checking_status
+}
+
+03_eclipse_due_diligence_scan() {
+ local action=due_diligence_scan
+ local name="Eclipse Due Diligence Scan Test"
+ local description="This test runs 'make due_diligence_scan' and validates the scan output."
+ local status=""
+ local message=""
+ local scan_log_file="${LOG_DIRECTORY}/due_diligence_scan.log"
+ printf "\n"
+ printf " Test: %s\n" "${name}"
+ printf " Description: %s\n" "${description}"
+ printf " This test runs the eclipse due diligence scanner to verify all source code has the proper license header comment. \n"
+ printf " Starting make due_diligence_scan...\n"
+
+ if ! make due_diligence_scan >"$scan_log_file" 2>&1; then
+ status=$(bold $(red "FAILED"))
+ message=" Make due_diligence_scan command failed. See log: ${scan_log_file}"
+ cat "${scan_log_file}"
+ printf " Message:\n%s\n" "$message"
+ printf " %-77s %s\n" "Status:" "${status}"
+ exit 1
+ fi
+
+ status=$(bold $(green "PASSED"))
+ message=" Make due_diligence_scan succeeded. Tail of log shown below:"
+ printf " Message:\n%s\n" "$message"
+ tail -15 "${scan_log_file}"
+ printf " %-77s %s\n" "Status:" "${status}"
+ printf " See the due_diligence_scan log for full details: %s\n" "$scan_log_file"
+ exit 0
+}
+
+04_x11_integration_test() {
+ local action=x11_integration_test
+ local name="X11 Integration Test"
+ local description="Validates the display stack: DISPLAY var, X11 socket, xhost, xdpyinfo, and xeyes."
+ local status=""
+ local display_val=""
+ local display_num=""
+ local socket=""
+ local container=""
+ local cmd_out=""
+ local cmd_rc=0
+
+ printf "\n"
+ printf " Test: %s\n" "${name}"
+ printf " Description: %s\n" "${description}"
+ printf " This test aims to answer the following questions: \n"
+ printf " Is DISPLAY set inside the container?\n"
+ printf " Does the X11 socket exist for that display?\n"
+ printf " Is the X server accessible via xdpyinfo?\n"
+ printf " Can xeyes connect and render (full display pipeline)?\n"
+ printf " Starting Docker context...\n"
+
+ if ! make start; then
+ status=$(bold $(red "FAILED"))
+ printf " make start failed — cannot proceed with display checks.\n"
+ printf " %-77s %s\n" "Status:" "${status}"
+ exit 1
+ fi
+
+ container=$(make container_name_adore_cli 2>/dev/null)
+
+ printf "\n --- DISPLAY variable ---\n"
+ display_val=$(docker exec "${container}" cat /tmp/.adore_display 2>/dev/null | grep -o 'DISPLAY=.*' | cut -d= -f2- | tail -1)
+ if [ -z "${display_val}" ]; then
+ status=$(bold $(red "FAILED"))
+ printf " DISPLAY is not set inside the container.\n"
+ printf " /tmp/.adore_display contents:\n"
+ docker exec "${container}" cat /tmp/.adore_display 2>&1 || printf " (file not found)\n"
+ printf " Container logs (tail):\n"
+ docker logs "${container}" 2>&1 | tail -20
+ printf " %-77s %s\n" "Status:" "${status}"
+ make stop
+ exit 1
+ fi
+ printf " DISPLAY=%s\n" "${display_val}"
+
+ printf "\n --- X11 socket ---\n"
+ display_num="${display_val##*:}"
+ display_num="${display_num%%.*}"
+ socket="/tmp/.X11-unix/X${display_num}"
+ if ! docker exec "${container}" test -S "${socket}" 2>/dev/null; then
+ status=$(bold $(red "FAILED"))
+ printf " X11 socket %s does not exist inside the container.\n" "${socket}"
+ printf " If using host display: check /tmp/.X11-unix is mounted (-v /tmp/.X11-unix:/tmp/.X11-unix).\n"
+ printf " If using Xvfb: check that entrypoint.sh Xvfb started cleanly (check container logs).\n"
+ docker logs "${container}" 2>&1 | tail -20
+ printf " %-77s %s\n" "Status:" "${status}"
+ make stop
+ exit 1
+ fi
+ printf " X11 socket %s: found\n" "${socket}"
+
+ printf "\n --- xdpyinfo ---\n"
+ cmd_out=$(docker exec -e DISPLAY="${display_val}" "${container}" xdpyinfo 2>&1)
+ cmd_rc=$?
+ if [ "${cmd_rc}" -ne 0 ]; then
+ status=$(bold $(red "FAILED"))
+ printf " xdpyinfo failed (exit %d) on DISPLAY=%s\n" "${cmd_rc}" "${display_val}"
+ printf " xdpyinfo output:\n%s\n" "${cmd_out}"
+ printf " %-77s %s\n" "Status:" "${status}"
+ make stop
+ exit 1
+ fi
+ printf " xdpyinfo: OK\n"
+
+ printf "\n --- xeyes ---\n"
+ cmd_out=$(docker exec -e DISPLAY="${display_val}" "${container}" timeout 1 xeyes 2>&1)
+ cmd_rc=$?
+ if [ "${cmd_rc}" -ne 0 ] && [ "${cmd_rc}" -ne 124 ]; then
+ status=$(bold $(red "FAILED"))
+ printf " xeyes failed (exit %d) on DISPLAY=%s\n" "${cmd_rc}" "${display_val}"
+ printf " xeyes output:\n%s\n" "${cmd_out}"
+ printf " %-77s %s\n" "Status:" "${status}"
+ make stop
+ exit 1
+ fi
+ printf " xeyes: OK\n"
+
+ status=$(bold $(green "PASSED"))
+ printf "\n Display stack fully functional:\n"
+ printf " DISPLAY=%s socket=%s xdpyinfo OK xeyes OK\n" "${display_val}" "${socket}"
+ printf " %-77s %s\n" "Status:" "${status}"
+
+ printf " Stopping Docker context...\n"
+ make stop
+ exit 0
+}
+
diff --git a/Justfile b/Justfile
deleted file mode 100644
index 2f84720d..00000000
--- a/Justfile
+++ /dev/null
@@ -1,277 +0,0 @@
-# Use bash as the shell
-set shell := ["/bin/bash", "-c"]
-
-# -------------------------------------------------------------------
-# Global paths & environment
-# -------------------------------------------------------------------
-
-# Root of the repo (directory containing this Justfile)
-export WORKSPACE_ROOT := justfile_directory()
-
-# Colcon workspace dir (always .colcon_workspace under repo root)
-export COLCON_WS_ROOT := WORKSPACE_ROOT + "/.colcon_workspace"
-
-# Documentation root
-export DOCS_ROOT := WORKSPACE_ROOT + "/documentation"
-
-# Default ROS distro; can be overridden from the environment
-export ROS_DISTRO := env('ROS_DISTRO', 'jazzy')
-
-# Script to set up colcon_workspace/src symlinks
-export SETUP_COLCON_SCRIPT := ".docker/scripts/setup_colcon_src.sh"
-
-# Helpers: use shell variables and command substitution, no {{...}} inside
-source_ros := 'source /opt/ros/$ROS_DISTRO/setup.sh; \
-if [ -d install ] && [ -f install/local_setup.sh ]; then \
- source install/local_setup.sh; \
-fi'
-# Extra colcon build args from environment variable (COLCON_COVERAGE_ARGS)
-colcon_extra_args := env_var_or_default("COLCON_COVERAGE_ARGS", "")
-
-colcon_cmd := 'colcon build ' + colcon_extra_args
-
-
-# Host uid/gid for docker -u in docs_spellcheck/docs_lint
-uid := `id -u`
-gid := `id -g`
-
-# Default target
-default: help
-
-# Show all available recipes
-help:
- @just --list
-
-# -------------------------------------------------------------------
-# Symlink setup for colcon workspace
-# -------------------------------------------------------------------
-
-# Ensure .colcon_workspace/src symlinks are up to date
-setup_colcon_src:
- cd "$WORKSPACE_ROOT" && \
- if [ -x "$SETUP_COLCON_SCRIPT" ]; then \
- echo "--- Ensuring colcon_workspace/src symlinks are set up ---"; \
- "$SETUP_COLCON_SCRIPT"; \
- else \
- echo "ERROR: $SETUP_COLCON_SCRIPT not found or not executable" >&2; \
- exit 1; \
- fi
-
-# -------------------------------------------------------------------
-# Docker-backed targets (dev image)
-# -------------------------------------------------------------------
-
-# Build the dev Docker image (adore_dev)
-build_ci:
- cd "$WORKSPACE_ROOT" && .docker/scripts/build_ci.sh
-# Build the dev Docker image (adore_dev)
-build_dev:
- cd "$WORKSPACE_ROOT" && .docker/scripts/build_dev.sh
-
-# Start or attach to the ADORe dev container
-dev: setup_colcon_src
- cd "$WORKSPACE_ROOT" && .docker/scripts/run_dev.sh
-
-# Remove local ADORe Docker images
-clean_images:
- cd "$WORKSPACE_ROOT" && .docker/scripts/clean_images.sh
-
-# Remove .colcon_workspace build/install/log directories
-clean_ws:
- rm -rf "$COLCON_WS_ROOT/build" "$COLCON_WS_ROOT/install" "$COLCON_WS_ROOT/log"
-
-# Full clean: Docker images + .colcon_workspace artifacts
-clean: clean_images clean_ws
- echo "--- Cleaned docker images and .colcon_workspace build artifacts ---"
-
-# Clean workspace and rebuild (host colcon)
-clean_build: clean_ws build
-
-# Save dev/CI images to tarball(s)
-save:
- cd "$WORKSPACE_ROOT" && .docker/scripts/save_image.sh
-
-# Load dev/CI images from tarball(s)
-load:
- cd "$WORKSPACE_ROOT" && .docker/scripts/load_image.sh
-
-# -------------------------------------------------------------------
-# Local tools (always run from repo root)
-# -------------------------------------------------------------------
-
-# Launch the ADORe GUI (scenario launcher)
-gui:
- cd "$WORKSPACE_ROOT" && python3 tools/adore_gui.py
-
-# Run the road network editor
-edit_roads:
- cd "$WORKSPACE_ROOT" && python3 tools/edit_roads.py
-
-# Run the Lichtblick visualization wrapper
-lichtblick:
- cd "$WORKSPACE_ROOT" && ./tools/lichtblick/run_lichtblick.sh
-
-# -------------------------------------------------------------------
-# CI helpers (use the CI image under the hood)
-# -------------------------------------------------------------------
-
-# Build documentation inside the CI Docker image
-docs: setup_colcon_src
- cd "$WORKSPACE_ROOT" && .docker/scripts/run_docs.sh
-
-# Convenience: run tests and docs (full CI) locally
-ci: setup_colcon_src
- cd "$WORKSPACE_ROOT" && .docker/scripts/run_ci.sh
-
-publish:
- cd "$WORKSPACE_ROOT" && documentation/publish_gh-pages.sh
-
-# -------------------------------------------------------------------
-# ADORe API control (via tools/adore_api/adore_api.sh)
-# -------------------------------------------------------------------
-
-# Start adore api server
-api_start:
- cd "$WORKSPACE_ROOT" && \
- source tools/adore_api/adore_api.sh && \
- start_adore_api
-
-# Stop adore api server
-api_stop:
- cd "$WORKSPACE_ROOT" && \
- source tools/adore_api/adore_api.sh && \
- stop_adore_api
-
-# Restart adore api server
-api_restart:
- cd "$WORKSPACE_ROOT" && \
- source tools/adore_api/adore_api.sh && \
- restart_adore_api
-
-# Check adore api server status
-api_status:
- cd "$WORKSPACE_ROOT" && \
- source tools/adore_api/adore_api.sh && \
- status_adore_api
-
-
-# -------------------------------------------------------------------
-# Host colcon builds in .colcon_workspace (no Docker)
-# -------------------------------------------------------------------
-
-# Build the entire workspace locally (host colcon)
-build:
- cd "$COLCON_WS_ROOT" && {{source_ros}} && \
- {{colcon_cmd}}
-
-# Run colcon tests locally (host), skipping vendor + ros-carla-msgs
-test_ws:
- cd "$COLCON_WS_ROOT" && {{source_ros}} && \
- colcon test \
- --packages-skip `colcon list --base-paths src/vendor --names-only`; \
- colcon test-result --all --verbose || true
-
-# Run system tests
-test_system:
- ./tools/system_tests/run_system_tests.sh
-
-# Kill lingering ROS 2 / colcon processes (host + container aware script)
-force_kill_ros2:
- cd "$WORKSPACE_ROOT" && .docker/scripts/force_kill_ros2.sh
-
-# Build adore_scenarios packages only (host colcon)
-build_scenarios:
- cd "$COLCON_WS_ROOT" && {{source_ros}} && \
- {{colcon_cmd}} --packages-select `colcon list --base-paths src/adore_scenarios --names-only`
-
-# Build conversions packages only (host colcon)
-build_conversions:
- cd "$COLCON_WS_ROOT" && {{source_ros}} && \
- {{colcon_cmd}} --packages-select `colcon list --base-paths src/conversions --names-only`
-
-# Build library packages only (host colcon)
-build_libraries:
- cd "$COLCON_WS_ROOT" && {{source_ros}} && \
- {{colcon_cmd}} --packages-select `colcon list --base-paths src/libraries --names-only`
-
-# Build node packages only (host colcon)
-build_nodes:
- cd "$COLCON_WS_ROOT" && {{source_ros}} && \
- {{colcon_cmd}} --packages-select `colcon list --base-paths src/nodes --names-only`
-
-# Build ros2_messages packages only (host colcon)
-build_messages:
- cd "$COLCON_WS_ROOT" && {{source_ros}} && \
- {{colcon_cmd}} --packages-select `colcon list --base-paths src/ros2_messages --names-only`
-
-# Build vendor packages only (host colcon)
-build_vendor:
- cd "$COLCON_WS_ROOT" && {{source_ros}} && \
- {{colcon_cmd}} --packages-select `colcon list --base-paths src/vendor --names-only`
-
-# -------------------------------------------------------------------
-# Documentation (mkdocs in documentation/)
-# -------------------------------------------------------------------
-
-# Clean and rebuild documentation (mkdocs + docs/)
-docs_all: docs_clean docs_serve
-
-# Build mkdocs site into documentation/mkdocs/site
-docs_build_mkdocs:
- cd "$DOCS_ROOT" && \
- mkdir -p mkdocs/docs && \
- rm -rf mkdocs/docs/generated mkdocs/site && \
- cp -r technical_reference_manual mkdocs/docs/technical_reference_manual && \
- python3 mkdocs/gen_docs.py && \
- cd mkdocs && mkdocs build
-
-# Build docs/ tree from mkdocs output (gh-pages-ready)
-docs_build: docs_build_mkdocs
- cd "$DOCS_ROOT" && \
- rm -rf docs && \
- mkdir -p docs && \
- cp -r mkdocs/site docs/mkdocs &&\
- cp -r mkdocs/img docs/mkdocs &&\
- cp -r mkdocs/stylesheets docs/mkdocs &&\
- cp -r mkdocs/overrides docs/mkdocs
-
-# Build and serve docs at http://localhost:8000
-docs_serve: docs_build
- cd "$DOCS_ROOT/docs" && python3 -m http.server 8000
-
-# Publish docs to gh-pages branch
-docs_publish_gh_pages:
- cd "$DOCS_ROOT" && bash publish_gh-pages.sh
-
-# Publish docs (wrapper with reminder to review publish.env)
-docs_publish: docs_publish_gh_pages
- @echo "Review documentation/publish.env before publishing."
-
-# Watch docs and rebuild automatically on changes (needs inotify-tools)
-docs_watch:
- cd "$DOCS_ROOT" && \
- while inotifywait -e modify -e create -e delete -r .; do \
- just docs_build; \
- done
-
-# Remove generated docs and mkdocs build artifacts
-docs_clean:
- cd "$DOCS_ROOT" && \
- rm -rf docs mkdocs/docs mkdocs/site technical_reference_manual/generated/
-
-# Interactive spellcheck of technical_reference_manual via aspell container
-docs_spellcheck: docs_clean
- cd "$DOCS_ROOT" && \
- docker build -f Dockerfile.aspell -t aspell . && \
- docker run -it --rm -u "{{uid}}:{{gid}}" -v "$PWD:/mnt" aspell \
- bash -lc 'find /mnt/technical_reference_manual -name "*.md" -exec aspell check --encoding=utf-8 --mode=markdown --home-dir=/mnt --personal=/mnt/.aspell.en.pws {} \;'
-
-# Non-interactive spellcheck/lint of docs using aspell container
-docs_lint: docs_clean
- cd "$DOCS_ROOT" && \
- docker build -f Dockerfile.aspell -t aspell . && \
- docker run -u "{{uid}}:{{gid}}" -v "$PWD:/mnt" aspell:latest python3 spellcheck.py
-
-# run scan for eclipse due diligence
-due_diligence_scan:
- cd "$WORKSPACE_ROOT" && python3 ./tools/eclipse_due_diligence_scanner.py --ignore ./tools/.eclipse_due_diligance_ignore
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..706b19ce
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,125 @@
+SHELL:=/bin/bash
+MAKEFLAGS += --no-print-directory
+.NOTPARALLEL:
+ROOT_DIR:=$(shell dirname "$(realpath $(firstword $(MAKEFILE_LIST)))")
+
+# This will automatically check if submodules have been updated when the
+# Makefile is invoked for the first time.
+MAKE_GADGETS_DIR := adore_cli/make_gadgets
+MAKE_GADGETS_HAS_FILES := $(shell [ -d $(MAKE_GADGETS_DIR) ] && [ -n "$$(find $(MAKE_GADGETS_DIR) -mindepth 1 -maxdepth 1 -not -name '.git' 2>/dev/null)" ] && echo "yes")
+ifeq ($(MAKE_GADGETS_HAS_FILES),)
+ $(shell git submodule update --init --recursive >&2 || true)
+endif
+
+$(shell git config core.hooksPath .githooks >&2 || true)
+
+
+include ${MAKE_GADGETS_DIR}/make_gadgets.mk
+
+.EXPORT_ALL_VARIABLES:
+SOURCE_DIRECTORY:=${ROOT_DIR}
+SUBMODULES_PATH:=${ROOT_DIR}
+VENDOR_PATH:=${ROOT_DIR}/vendor
+ROS_NODE_PATH:=${ROOT_DIR}/ros2_workspace/src
+ADORE_LIBRARY_PATH:=${ROOT_DIR}/libraries
+DOCKER_BUILDKIT?=1
+DOCKER_CONFIG?=
+
+
+# Branch information
+BRANCH:=$(shell bash ${MAKE_GADGETS_DIR}/tools/branch_name.sh)
+
+include ${SUBMODULES_PATH}/adore_cli/ci_teststand/ci_teststand.mk
+include utils.mk
+include adore_cli/adore_cli.mk
+include adore_cli/package.mk
+
+.PHONY: clean
+clean: stop docker_host_context_check stop clean_adore_cli clean_tag_history ## Clean ADORe build artifacts
+ cd vendor && make clean
+ cd ros2_workspace && make clean
+ cd adore_embedded && make clean
+ rm -rf build
+
+$(shell [ -d "$(VENDOR_PATH)/build" ] || (cd vendor && $(MAKE) --no-print-directory build >&2))
+
+.PHONY: build
+build: docker_host_context_check stop_adore_cli build_vendor_libraries build_adore_cli build_ros_workspace build_services ## Build and setup adore cli
+ @make clean_tag_history
+
+.PHONY: build_adore_embedded
+build_adore_embedded: docker_host_context_check # Build ADORe Embedded docker image
+ cd adore_embedded && make build
+
+.PHONY: build_all
+build_all: clean build #build_services
+
+.PHONY: build_services
+build_services: ## Build ADORe supporting services such as Foxglove Studio aka Lichtblick Suite
+ cd tools/lichtblick && make build
+
+.PHONY: start_services
+start_services: docker_host_context_check ## Start ADORe supporting services
+ cd tools/lichtblick && make start
+
+.PHONY: stop_services
+stop_services: docker_host_context_check ## Stop ADORe supporting services
+ cd tools/lichtblick && make stop
+
+.PHONY: build_vendor_libraries
+build_vendor_libraries: docker_host_context_check ## Builds vendor libraries located in: ${VENDOR_PATH}
+ cd "${VENDOR_PATH}" && make build
+
+.PHONY: build_documentation
+build_documentation: docker_host_context_check ## Builds ADORe Documentation in: ./documentation
+ echo todo
+ #cd documentation && make build
+
+.PHONY: build_ros_workspace
+build_ros_workspace: ## Builds ROS2 workspace located in: ${ROS_NODE_PATH}
+ if [ -f /.dockerenv ]; then \
+ cd ros2_workspace && make build; \
+ else \
+ make run cmd="cd ros2_workspace && make build"; \
+ fi
+
+.PHONY: check_adore_binaries
+check_adore_binaries: ## Checks for ADORe binaries
+ bash tools/check_adore_binaries.sh
+
+.PHONY: lint_nodes
+lint_nodes:
+ @if [ -f /.dockerenv ]; then \
+ clang-format -Werror -i -output-replacements-xml --checks=* -dry-run $(shell find ros2_workspace/src -type f \( -name "*.cpp" -or -name "*.hpp" -or -name "*.h" \)); \
+ else \
+ make run cmd="clang-format -Werror -i --checks=* -output-replacements-xml -dry-run $(shell find ros2_workspace/src -type f \( -name "*.cpp" -or -name "*.hpp" -or -name "*.h" \))"; \
+ fi
+
+.PHONY: due_diligence_scan
+due_diligence_scan: ## Scan repo for eclipse due diligence, checks if source files have the proper doc header.
+ python3 tools/eclipse_due_diligence_scanner.py --ignore tools/.eclipse_due_diligance_ignore
+
+.PHONY: due_diligence_fix
+due_diligence_fix: ## Fix due diligence issues
+ python3 tools/eclipse_due_diligence_scanner.py --ignore tools/.eclipse_due_diligance_ignore --fix
+
+.PHONY: benchmark
+benchmark: ## Run the ROS Topic benchmark script
+ if [ -f /.dockerenv ]; then \
+ bash tools/ros_topic_benchmark.sh; \
+ else \
+ make run cmd="bash tools/ros_topic_benchmark.sh"; \
+ fi
+
+.PHONY: package_adore_ros2_msgs
+package_adore_ros2_msgs: ## Build & package adore_ros2_msgs
+ if [ -f /.dockerenv ]; then \
+ cd ros2_workspace && make package_adore_ros2_msgs; \
+ else \
+ make run cmd="cd ros2_workspace && make package_adore_ros2_msgs"; \
+ fi
+
+.PHONY: test
+test: ## Run ADORe Unit Tests
+ bash .ci test
+
diff --git a/README.md b/README.md
index 31936b79..47eea6dc 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,8 @@
# Automated Driving Open Research (ADORe)
-
+
## About ADORe
-
Eclipse ADORe is a modular software library and toolkit for decision making, planning, control and simulation of
automated vehicles. It is developed by [The German Aerospace Center (DLR), Institute for Transportation Systems 🔗](https://www.dlr.de/ts/en).
- ADORe is [ROS 2 🔗](https://ros.org) based
@@ -12,89 +11,48 @@ automated vehicles. It is developed by [The German Aerospace Center (DLR), Insti
- ADORe is developed with algorithms and data models applied in real automated driving system for motion planning and control
- ADORe features mechanisms for safe interaction with other CAVs, infrastructure, traffic management, interactions with human-driven vehicles, bicyclists, pedestrians
-ADORe is designed around both single agent automated driving (SAAD) and multi agent automated driving (MAAD), to allow both individual and cooperative driving behaviors.
-
-# Documentation
-Please see full docs at [Github Pages](https://eclipse-adore.github.io/adore/)
-
-## Getting Started
-In order to get started, it is advised to first check system requirements, follow the installation instruction and then
-try out the demo scenarios.
-
-This guide will help you get your system set up and configured to run ADORe.
-
-1. First review the [System Requirements 🔗](documentation/technical_reference_manual/getting_started/system_requirements.md).
+ADORe is designed around both single agent automated driving (SAAD) and multi agent automated driving (MAAD), to allow both individual and cooperative driving behaviors. ADORes features can be seperated into the following categories.
-2. Next review the [Prerequisites 🔗](documentation/technical_reference_manual/getting_started/prerequisites.md)
+
-## Cloning the ADORe repository
-> **ℹ️INFO:**
-> By default this guide assumes you have ssh keys configured for GitHub your GitHub account.
-> For help on configuring your ssh keys visit: https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account
+### SAAD
+While driving automated for a single agent, for example on a vehicle like the DLR NGC, ADORe utilized the SAAD modules, viewing ADORe SAAD as a black box of inputs and outputs, get a representation as seen below.
-```bash
-git clone git@github.com:eclipse-adore/adore.git
-cd adore
-git submodule update --init --recursive
-```
+
-> **⚠️ WARNING:** Failing to update and recursively clone the submodules will result in build failures!
+Diving deeper into the ROS2 node structure of ADORe SAAD leads to be the structure seen below.
-> **ℹ️INFO:** If you would rather clone ADORe anonymously over https please review the [Anonymous Cloning 🔗](documentation/technical_reference_manual/system_and_development/anonymous_cloning.md) guide.
+
-## Building ADORe Developer Environment
-> **⚠️ WARNING:**
-> To use the ADORe developer environment you must have Docker installed.
-To have the easiest entry you can [install just](https://github.com/casey/just)
+### MAAD
-and run:
-```bash
-just dev
-```
+When using ADORe for control of multiple agent in a cooperative environment, ADORe MAAD can calculate trajectories and behaviors for multiple vehicles at once. Viewing ADORe MAAD as a black box of inputs and outputs, it can been show as seen here.
-Alternatively, simple call
+
-```bash
-.docker/scripts/run_dev.sh
-```
-
-This will create and the developer environment where you can build all relevant packages with
-
-```bash
-just build
-```
-
-The full command list is available with
-
-```bash
-just help
-```
-
-> **⚠️ WARNING:**
-> Building ADORe **will** fail until all submodules have been properly initialized.
-> If cloning or repository initialization fails refer to the
-> [troubleshooting](documentation/technical_reference_manual/problems_and_solutions.md) guide before proceeding.
-> Do not proceed with building ADORe until `git submodule update --init --receive`
-> finishes without error.
+## Documentation
+In order to get started, it is advised to first check system requirements, follow the installation instruction and then
+try out the demo scenarios.
-Next proceed to [Running Your First Scenario 🔗](documentation/technical_reference_manual/getting_started/running_your_first_scenario.md)
+- [Github Pages](https://eclipse.github.io/eclipse-adore/adore)
+- [Getting started/Quick Start](documentation/technical_reference_manual/getting_started/getting_started.md)
+- [Technical Reference Manual](https://eclipse-adore.github.io/adore/mkdocs/about_adore/index.html)
-## Using in an existing ROS2 project
-The ADORe packages adore_(libraries/ros2_conversions/ros2_msgs/ros2_nodes/scenarios) can all be used directly in your existing ros2 project by pasting or symlining them into you ros2/colcon workspace.
+## ADORe In Action
+Here you can see one of our automated test vehicles being operated by ADORe:
+[](https://youtu.be/tlhPDtr4yxg)
-# ADORe In Action
+[](https://www.youtube.com/watch?v=bRZc1iFohCU)
-### ADORe Road Driving
-[](https://www.youtube.com/watch?v=bRZc1iFohCU)
+[](https://www.youtube.com/watch?v=MANc_xQ_8sI)
-### ADORe Remote Operations
-[](https://www.youtube.com/watch?v=Aqvd82A40S4)
+[](https://www.youtube.com/watch?v=Aqvd82A40S4)
-### Simulated Multi-Agent Driving / planning
-[](https://www.youtube.com/watch?v=IYbv7Y2nt-k)
+[](https://www.youtube.com/watch?v=IYbv7Y2nt-k)
-### ADORe at intelligent intersection
-[](https://www.youtube.com/watch?v=kDOtkMxxtyM)
+# Example application
+The following video shows an automated vehicle controlled by ADORe in an urban setting in Braunschweig, Germany:
+[](https://youtu.be/tlhPDtr4yxg)
diff --git a/THIRD-PARTY.md b/THIRD-PARTY.md
index dfc0bcd0..43b4ef92 100644
--- a/THIRD-PARTY.md
+++ b/THIRD-PARTY.md
@@ -14,9 +14,8 @@ Paths indicate where the content lives in this repository or how it is consumed
| OSQP | Apache License 2.0 | `vendor/osqp` | https://osqp.org/ |
| OSQP-Eigen | BSD 3-Clause License | `vendor/osqp_eigen` | https://github.com/robotology/osqp-eigen |
| multi_agent_solver | Apache License 2.0 | `vendor/multi_agent_solver` | https://https://github.com/markomiz/multi_agent_solver |
-| websocketpp | BSD 3-Clause License | `tools/websocketpp/LICENSE` | https://github.com/zaphoyd/websocketpp |
-| adore_model_checker| Apache License 2.0 | `tools/adore_model_checker` | https://github.com/DLR-TS/adore_model_checker |
-| ros2_observer | Apache License 2.0 | `tools/ros2_observer` | https://github.com/DLR-TS/ros2_observer |
+| adore_model_checker| Apache License 2.0 | `vendor/adore_model_checker` | https://github.com/DLR-TS/adore_model_checker |
+| ros2_observer | Apache License 2.0 | `vendor/ros2_observer` | https://github.com/DLR-TS/ros2_observer |
| ROS 2 | Apache License 2.0 | System dependency | https://docs.ros.org/ |
| MkDocs & Material | BSD 2-Clause / MIT | `documentation/` (documentation build system) | https://www.mkdocs.org/ ; https://squidfunk.github.io/mkdocs-material/ |
| spline.h | GNU General Public License v2 | `libraries/lib/adore_math/include/spline.h` | https://kluge.in-chemnitz.de/opensource/spline/spline.h |
diff --git a/adore.env b/adore.env
new file mode 100644
index 00000000..ec9de451
--- /dev/null
+++ b/adore.env
@@ -0,0 +1,188 @@
+# ADORe Environment Variables
+
+## This file provides the ability of modifying the behavior of the ADORe CLI.
+## Review the environmental variables and their corresponding documentation
+## for a complete explanation of all behavioral changes to the ADORe CLI.
+
+## All variables set in this file will be part of the ADORe CLI environmenet
+
+
+set -a
+
+# General Configuration
+# =====================
+# MAX_COMMIT_FILE_SIZE_kB:
+# - Maximum allowed file size (in kilobytes) for the pre-commit hook.
+#
+# SUBMODULES_PATH:
+# - Path to project submodules. Defaults to the current working directory.
+#
+# ROS_HOME:
+# - Path to the ROS home directory for logging and runtime files.
+# -----------------------------------------------------------------------------
+MAX_COMMIT_FILE_SIZE_kB=5000
+SUBMODULES_PATH=$(pwd)
+LOG_DIRECTORY=${SOURCE_DIRECTORY}/.log
+ROS_HOME=${SOURCE_DIRECTORY}/.log/.ros
+ROS_DOMAIN_ID=0
+#ROS_AUTOMATIC_DISCOVERY_RANGE=localhost
+
+# The ADORe CLI includes x11 integration to run graphical applications. It will
+# auto-detect if a display is connected otherwise default to a virtual xvfb
+# display.
+# VIRTUAL_DISPLAY: Disable auto-detection and force virtual display creation
+# - Set to "true" to always create virtual display on :99 (bypasses auto-detection)
+# - Set to "false" or leave unset to auto-detect physical displays
+# - Default: false (auto-detect physical displays, create virtual only if none found)
+VIRTUAL_DISPLAY=false
+
+# Zenoh Configuration
+# ===================
+# The ADORe CLI runs a native zenoh router and optionally the zenoh_message_bridge
+# node as host processes. Logs are written to ${LOG_DIRECTORY}/zenoh/.
+#
+# ZENOH_ROUTER_ENABLE: Start a local zenoh router on the host at CLI start.
+# - Set to "true" to start rmw_zenohd alongside the CLI container.
+# - Set to "false" or leave unset to skip the router.
+# - Default: false
+# - Note: Required when RMW_IMPLEMENTATION=rmw_zenoh_cpp or ZENOH_BRIDGE_ENABLE=true.
+ZENOH_ROUTER_ENABLE=true
+
+# ZENOH_ROUTER_CONFIG: Path to the zenoh router config file.
+# - Defaults to the zenoh_bridge_config.json5 in the adore_cli directory.
+# - Default: ${SOURCE_DIRECTORY}/adore_cli/zenoh_bridge_config.json5
+ZENOH_ROUTER_CONFIG=${SOURCE_DIRECTORY}/adore_cli/zenoh_router_config.json5
+
+# ZENOH_BRIDGE_ENABLE: Start the zenoh_message_bridge ROS node on the host.
+# - Bridges specific FastDDS topics to/from zenoh as defined in bridge_config.yaml.
+# - Requires ZENOH_ROUTER_ENABLE=true or an external router to be reachable.
+# - Set to "true" to launch the bridge node alongside the CLI container.
+# - Set to "false" or leave unset to disable.
+# - Default: false
+ZENOH_BRIDGE_ENABLE=true
+
+# ZENOH_BRIDGE_ROUTER: Zenoh router endpoint the bridge node connects to.
+# - Default: tcp/localhost:7447
+# This config parameter overrides the ZENOH_ROUTER_CONFIG
+ZENOH_BRIDGE_ROUTER=tcp/localhost:7447
+
+# RMW_IMPLEMENTATION: ROS2 middleware to use.
+# - rmw_fastrtps_cpp: FastDDS (default, no router needed)
+# - rmw_cyclonedds_cpp: CycloneDDS (no router needed)
+# - rmw_zenoh_cpp: Zenoh (requires ZENOH_ROUTER_ENABLE=true)
+RMW_IMPLEMENTATION=rmw_fastrtps_cpp
+
+# Build Configuration
+# ===================
+# FORCE_SINGLE_CORE_BUILD:
+# adore libraries in `libraries` and ros nodes in `ros2_workspace` are built in
+# parallel using colcon and -j$(nproc - 1). This can crash systems that do not
+# meet the minimum build specs for ADORe. Disable parallel builds with this
+# environmental variable.
+# - Set to "true" to force sequential builds regardless of available RAM.
+# - Set to "false" to use automatic RAM-based parallel build detection.
+# - Default: false
+# -----------------------------------------------------------------------------
+FORCE_SINGLE_CORE_BUILD=false
+
+# ROS Topic Benchmark Configuration
+# ===================
+# RUN the topic benchmark with `make benchmark`
+# Scenario file to launch for benchmarking (located in adore_scenarios/simulation_scenarios/)
+export ROS_BENCHMARK_SCENARIO="simulation_test.launch.py"
+
+# Minimum acceptable message rate in Hz - benchmark fails if average rate is below this value
+export ROS_BENCHMARK_MIN_RATE=10
+
+# Maximum acceptable jitter in seconds (difference between max and min message intervals)
+# Benchmark fails if jitter exceeds this threshold
+export ROS_BENCHMARK_MAX_JITTER=0.04
+
+# Maximum acceptable standard deviation in seconds for message timing consistency
+# Benchmark fails if standard deviation exceeds this threshold
+export ROS_BENCHMARK_MAX_STD=0.014
+
+
+# ADORE API Configuration
+# =====================
+# ENABLE_ADORE_API:
+# - Set to "true" to enable the ADORE API (default if unset or empty).
+# - Set to "false" to disable the ADORE API.
+#
+# ADORE_API_PORT:
+# - The port on which the ADORE API server will listen.
+# -----------------------------------------------------------------------------
+ENABLE_ADORE_API=true
+ADORE_API_PORT=8888
+
+# SUMO Bridge Configuration
+# =========================
+# SUMO_BRIDGE_ENABLE: Start the sumo_bridge ROS 2 node on the host.
+# - Set to "true" to launch the bridge node alongside the CLI container.
+# - Set to "false" or leave unset to disable.
+# - Default: false
+SUMO_BRIDGE_ENABLE=false
+
+# SUMO_BRIDGE_CONFIG_FILE: SUMO scenario config filename.
+# - Filename only, resolved relative to SUMO_CONFIG_DIRECTORY.
+# - Default: demo_sumo_bridge.sumocfg
+SUMO_CONFIG_FILE="${SUMO_BRIDGE_CONFIG_FILE:-demo_sumo_bridge.sumocfg}"
+
+# SUMO_CONFIG_DIRECTORY: Path relative to SOURCE_DIRECTORY containing SUMO config files.
+# - Default: ros2_workspace/src/adore_interfaces/sumo_bridge/sumo_configs
+SUMO_CONFIG_DIRECTORY="ros2_workspace/src/adore_interfaces/sumo_bridge/sumo_configs"
+
+# SUMO_HOME: Path to the SUMO installation directory.
+# - Default: /usr/share/sumo
+SUMO_HOME="/usr/share/sumo"
+
+# Rsyslog Configuration
+# =====================
+# The ADORe CLI includes rsyslog server. The rsyslog output directory for log
+# files is: `.log/rsyslog`. The ADORe CLI rsyslog provides a rsyslog server
+# which can be configured with the 'RSYSLOG_PORT' and 'RSYSLOG_PROTOCOL'
+# environmental variables. Rsyslog can also be configured to forward messages
+# with the 'RSYSLOG_FORWARD_HOST', 'RSYSLOG_FORWARD_PORT', and
+# 'RSYSLOG_FORWARD_PROTOCOL'
+#
+# Rsyslog messages with tags "ros2" and "telemetry" will be stored and forwarded
+# example(from within the ADORe CLI run): logger --tag ros2 "Hello, World!"
+
+# RSYSLOG_BANNER: Show rsyslog configuration banner on start/attach
+# - Set to "false" to suppress the banner
+# - Default: true
+RSYSLOG_BANNER=false
+
+
+# RSYSLOG_PORT: Port for local rsyslog server to listen on
+# - Set to a port number (e.g., 514) to enable syslog reception
+# - Leave empty or unset to disable local syslog server entirely
+# - Default: unset (syslog server disabled)
+RSYSLOG_PORT=514
+
+# RSYSLOG_PROTOCOL: Protocol for local rsyslog server input
+# - Options: "udp" or "tcp"
+# - Determines whether to use UDP or TCP for incoming syslog messages
+# - Only used when RSYSLOG_PORT is set
+# - Default: udp
+RSYSLOG_PROTOCOL=udp
+
+# RSYSLOG_FORWARD_HOST: Remote syslog server to forward logs to
+# - Set to hostname or IP address to enable log forwarding
+# - Leave empty or unset to disable forwarding
+# - Default: unset (no forwarding)
+RSYSLOG_FORWARD_HOST=10.34.192.60
+
+# RSYSLOG_FORWARD_PORT: Port on remote syslog server for forwarding
+# - Port number to use when forwarding to RSYSLOG_FORWARD_HOST
+# - Only used when RSYSLOG_FORWARD_HOST is set
+# - Default: 514
+RSYSLOG_FORWARD_PORT=2514
+
+# RSYSLOG_FORWARD_PROTOCOL: Protocol for log forwarding
+# - Options: "udp" or "tcp"
+# - Only used when RSYSLOG_FORWARD_HOST is set
+# - Default: udp
+RSYSLOG_FORWARD_PROTOCOL=udp
+
+set +a
diff --git a/adore_cli b/adore_cli
new file mode 160000
index 00000000..0eb025a5
--- /dev/null
+++ b/adore_cli
@@ -0,0 +1 @@
+Subproject commit 0eb025a5c0033163be6b7ed5d9c1b3c748de6618
diff --git a/adore_cli.env b/adore_cli.env
new file mode 120000
index 00000000..1f5fe065
--- /dev/null
+++ b/adore_cli.env
@@ -0,0 +1 @@
+adore.env
\ No newline at end of file
diff --git a/adore_embedded/.dockerignore b/adore_embedded/.dockerignore
new file mode 100644
index 00000000..3290e419
--- /dev/null
+++ b/adore_embedded/.dockerignore
@@ -0,0 +1,3 @@
+build/
+context/vendor/*.deb.tmp
+Dockerfile.patched
diff --git a/adore_embedded/.gitignore b/adore_embedded/.gitignore
new file mode 100644
index 00000000..ee5c69d7
--- /dev/null
+++ b/adore_embedded/.gitignore
@@ -0,0 +1 @@
+Dockerfile.patched
diff --git a/adore_embedded/Dockerfile b/adore_embedded/Dockerfile
new file mode 100644
index 00000000..b37657a2
--- /dev/null
+++ b/adore_embedded/Dockerfile
@@ -0,0 +1,80 @@
+# syntax=docker/dockerfile:1
+ARG ROS_DISTRO=jazzy
+ARG OS_CODE_NAME=noble
+
+FROM ros:${ROS_DISTRO}-ros-core-${OS_CODE_NAME} AS base
+
+ARG ROS_DISTRO=jazzy
+ARG ARCH
+ARG SHORT_HASH
+ARG REQUIREMENTS_HASH
+
+ENV ROS_DISTRO=${ROS_DISTRO}
+
+LABEL org.adore.image-type="embedded" \
+ org.adore.arch="${ARCH}" \
+ org.adore.commit="${SHORT_HASH}" \
+ org.adore.requirements-hash="${REQUIREMENTS_HASH}"
+
+RUN rm -f /etc/apt/apt.conf.d/docker-clean && \
+ apt-get update && \
+ apt-get upgrade -y --no-install-recommends
+
+RUN apt-get install -y --no-install-recommends \
+ build-essential \
+ cmake \
+ gettext-base \
+ git \
+ ccache \
+ make \
+ python3-pip \
+ python3-colcon-common-extensions
+
+COPY context /tmp/context
+
+RUN bash /tmp/context/install_requirements.sh && \
+ bash /tmp/context/install_packages.sh && \
+ rm -rf /tmp/context
+
+RUN git clone --recursive https://github.com/osqp/osqp.git /tmp/osqp && \
+ cmake -S /tmp/osqp -B /tmp/osqp/build -G "Unix Makefiles" && \
+ cmake --build /tmp/osqp/build -j$(nproc) && \
+ cmake --install /tmp/osqp/build --prefix /usr/local && \
+ ldconfig && \
+ rm -rf /tmp/osqp
+
+RUN echo "/usr/local/lib" >> /etc/ld.so.conf.d/local.conf && ldconfig
+
+# ── Workspace build stage ──────────────────────────────────────────────────────
+# ros2_workspace is supplied as an external BuildKit build context:
+# docker build --build-context ros2_workspace=../ros2_workspace ...
+FROM base AS workspace-builder
+
+COPY --from=ros2_workspace src /ros2_workspace_dist/src
+COPY --from=ros2_workspace Makefile /ros2_workspace_dist/Makefile
+COPY --from=ros2_workspace colcon_defaults.yaml.template /ros2_workspace_dist/colcon_defaults.yaml
+
+RUN --mount=type=cache,target=/root/.ccache,sharing=locked \
+ . /opt/ros/${ROS_DISTRO}/setup.sh && \
+ cd /ros2_workspace_dist && \
+ make clean build && \
+ rm -rf /ros2_workspace_dist/log
+
+# ── Runtime image ──────────────────────────────────────────────────────────────
+FROM base AS runtime
+
+RUN echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> /etc/bash.bashrc && \
+ echo "source /ros2_workspace_dist/install/setup.bash" >> /etc/bash.bashrc && \
+ echo "source /ros2_workspace/install/setup.bash 2>/dev/null || true" >> /etc/bash.bashrc
+
+RUN mkdir -p /home/user && chmod 1777 /home/user
+ENV HOME=/home/user
+
+# Pre-built workspace baked into the image; volume-mount /ros2_workspace at
+# runtime to override with a live workspace for development.
+COPY --from=workspace-builder /ros2_workspace_dist /ros2_workspace_dist
+# adore_scenarios supplied via: --build-context adore_scenarios=../adore_scenarios
+COPY --from=adore_scenarios . /ros2_workspace_dist/adore_scenarios
+COPY context /ros2_workspace_dist/context
+
+WORKDIR /ros2_workspace_dist
diff --git a/adore_embedded/Makefile b/adore_embedded/Makefile
new file mode 100644
index 00000000..d13ecea2
--- /dev/null
+++ b/adore_embedded/Makefile
@@ -0,0 +1,331 @@
+SHELL := /bin/bash
+MAKEFLAGS += --warn-undefined-variables --no-builtin-rules
+.NOTPARALLEL:
+.DEFAULT_GOAL := build
+
+ROOT_DIR := $(shell dirname "$(realpath $(firstword $(MAKEFILE_LIST)))")
+HOST_UID := $(shell id -u)
+HOST_GID := $(shell id -g)
+
+ifndef _GATHERING
+$(shell $(MAKE) --no-print-directory _gather _GATHERING=1 >/dev/null 2>&1)
+endif
+
+DOCKER_BUILDKIT ?= 1
+ROS_DISTRO ?= jazzy
+OS_CODE_NAME ?= noble
+ARCH ?= $(shell uname -m)
+DOCKER_PLATFORM ?= linux/$(ARCH)
+
+VENDOR_PATH ?= $(ROOT_DIR)/../vendor
+ROS2_WORKSPACE ?= $(ROOT_DIR)/../ros2_workspace
+ROS2_SRC ?= $(ROS2_WORKSPACE)/src
+
+SHORT_HASH := $(shell git -C "$(ROOT_DIR)" rev-parse --short HEAD 2>/dev/null || echo "0000000")
+REQUIREMENTS_HASH := $(shell \
+ { find $(ROOT_DIR) -maxdepth 2 -type f \( -name "*.system" -o -name "*.pip3" -o -name "*.ppa" \) \
+ ! -path "*/context/*" 2>/dev/null; \
+ find $(ROS2_SRC) -type f \( -name "*.system" -o -name "*.pip3" -o -name "*.ppa" \) \
+ 2>/dev/null; } \
+ | LC_ALL=C sort | xargs -r grep -hv '^\s*#' | grep -v '^\s*$$' \
+ | LC_ALL=C sort -u | sha256sum | cut -c1-7 || echo "0000000")
+
+IMAGE_NAME := adore_embedded
+IMAGE_TAG := $(ARCH)_$(SHORT_HASH)_RH$(REQUIREMENTS_HASH)
+IMAGE := $(IMAGE_NAME):$(IMAGE_TAG)
+CONTAINER_NAME := $(IMAGE_NAME)_$(IMAGE_TAG)
+
+REPO := $(shell git -C "$(ROOT_DIR)/.." config --get remote.origin.url 2>/dev/null \
+ | sed -e 's|.*github.com[:/]||' -e 's|\.git$$||' | tr '[:upper:]' '[:lower:]')
+ifeq ($(REPO),)
+ REPO := eclipse-adore/adore
+endif
+REGISTRY := ghcr.io/$(REPO)
+REGISTRY_IMAGE := $(REGISTRY)/$(IMAGE)
+
+PATCHES := $(sort $(wildcard $(ROOT_DIR)/patches/*.patch))
+DOCKERFILE := $(ROOT_DIR)/Dockerfile
+BUILD_DOCKERFILE := $(if $(PATCHES),$(DOCKERFILE).patched,$(DOCKERFILE))
+
+BUILD_DIR := $(ROOT_DIR)/build/$(IMAGE_TAG)
+PACKAGES_DIR := $(ROOT_DIR)/packages
+CONTEXT_DIR := $(ROOT_DIR)/context
+IMAGE_ARCHIVE_NAME := $(IMAGE_NAME)_$(IMAGE_TAG).tar
+IMAGE_ARCHIVE := $(BUILD_DIR)/$(IMAGE_ARCHIVE_NAME)
+
+LICHTBLICK_DIR := $(ROOT_DIR)/../tools/lichtblick
+LICHTBLICK_IMAGE := $(shell cd $(LICHTBLICK_DIR) && $(MAKE) --no-print-directory lichtblick_image 2>/dev/null)
+LICHTBLICK_ARCHIVE_NAME := $(subst :,_,$(LICHTBLICK_IMAGE)).tar.gz
+
+.PHONY: help
+help: ## Show this help
+ @printf "\n\033[1mTargets:\033[0m\n"
+ @grep -E '^[a-zA-Z][a-zA-Z0-9_-]*:.*##' $(MAKEFILE_LIST) \
+ | awk 'BEGIN {FS = ":.*##"}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}'
+ @printf "\n"
+
+.PHONY: patch
+patch:
+ifneq ($(PATCHES),)
+ @cp $(DOCKERFILE) $(DOCKERFILE).patched
+ @for p in $(PATCHES); do \
+ echo "Applying patch: $$(basename $$p)"; \
+ patch -p1 $(DOCKERFILE).patched < "$$p" || exit 1; \
+ done
+endif
+
+.PHONY: _build
+_build: patch _gather ## Build the image, compile the ROS2 workspace via BuildKit, and save to build//
+ @echo "=== Building $(IMAGE) ==="
+ cd ${VENDOR_PATH} && make build
+ cd $(LICHTBLICK_DIR) && make build
+ @echo "=== Saving lichtblick image → $(BUILD_DIR)/lichtblick/$(LICHTBLICK_ARCHIVE_NAME) ==="
+ @mkdir -p $(BUILD_DIR)/lichtblick
+ docker save $(LICHTBLICK_IMAGE) | gzip > $(BUILD_DIR)/lichtblick/$(LICHTBLICK_ARCHIVE_NAME)
+ docker build \
+ --platform $(DOCKER_PLATFORM) \
+ --build-arg ROS_DISTRO=$(ROS_DISTRO) \
+ --build-arg OS_CODE_NAME=$(OS_CODE_NAME) \
+ --build-arg ARCH=$(ARCH) \
+ --build-arg SHORT_HASH=$(SHORT_HASH) \
+ --build-arg REQUIREMENTS_HASH=$(REQUIREMENTS_HASH) \
+ --build-context ros2_workspace=$(ROS2_WORKSPACE) \
+ --build-context adore_scenarios=$(ROOT_DIR)/../adore_scenarios \
+ --target runtime \
+ -t $(IMAGE) \
+ -f $(BUILD_DOCKERFILE) \
+ $(ROOT_DIR)
+ @mkdir -p $(BUILD_DIR)
+ @echo "=== Extracting built workspace from image ==="
+ @cid=$$(docker create --platform $(DOCKER_PLATFORM) $(IMAGE) /bin/true); \
+ docker cp "$$cid":/ros2_workspace_dist/. $(BUILD_DIR)/ros2_workspace_dist/; \
+ docker rm "$$cid"
+ @cp -r "$(CONTEXT_DIR)" $(BUILD_DIR)/ros2_workspace_dist/context
+ @echo "=== Saving $(IMAGE) → $(IMAGE_ARCHIVE).gz ==="
+ docker save $(IMAGE) | gzip > $(IMAGE_ARCHIVE).gz
+ @$(MAKE) --no-print-directory _write_scripts \
+ _BUILD_DIR=$(BUILD_DIR) \
+ _IMAGE=$(IMAGE) \
+ _IMAGE_TAG=$(IMAGE_TAG) \
+ _IMAGE_ARCHIVE_NAME=$(IMAGE_ARCHIVE_NAME) \
+ _CONTAINER_NAME=$(CONTAINER_NAME) \
+ _LICHTBLICK_IMAGE=$(LICHTBLICK_IMAGE) \
+ _LICHTBLICK_ARCHIVE_NAME=$(LICHTBLICK_ARCHIVE_NAME)
+ @echo "=== Done: $(BUILD_DIR) ==="
+
+.PHONY: pull
+pull: ## Pull the image from the registry; tag it locally
+ @echo "=== Pulling $(REGISTRY_IMAGE) ==="
+ docker pull "$(REGISTRY_IMAGE)"
+ docker tag "$(REGISTRY_IMAGE)" "$(IMAGE)"
+ @echo "=== Pulled and tagged as $(IMAGE) ==="
+
+.PHONY: build
+build: _gather ## Pull from registry if available, otherwise build from source
+ @if docker image inspect "$(IMAGE)" >/dev/null 2>&1 && [ -d "$(BUILD_DIR)/ros2_workspace_dist" ]; then \
+ echo "✓ Image already present: $(IMAGE)"; \
+ $(MAKE) --no-print-directory _write_scripts \
+ _BUILD_DIR=$(BUILD_DIR) \
+ _IMAGE=$(IMAGE) \
+ _IMAGE_TAG=$(IMAGE_TAG) \
+ _IMAGE_ARCHIVE_NAME=$(IMAGE_ARCHIVE_NAME) \
+ _CONTAINER_NAME=$(CONTAINER_NAME) \
+ _LICHTBLICK_IMAGE=$(LICHTBLICK_IMAGE) \
+ _LICHTBLICK_ARCHIVE_NAME=$(LICHTBLICK_ARCHIVE_NAME); \
+ elif docker image inspect "$(IMAGE)" >/dev/null 2>&1; then \
+ echo "Image present but build dir missing, repopulating..."; \
+ $(MAKE) --no-print-directory _build; \
+ elif docker pull "$(REGISTRY_IMAGE)" 2>/dev/null; then \
+ echo "✓ Pulled from registry: $(REGISTRY_IMAGE)"; \
+ docker tag "$(REGISTRY_IMAGE)" "$(IMAGE)"; \
+ $(MAKE) --no-print-directory _build; \
+ else \
+ echo "Registry pull failed, building from source..."; \
+ $(MAKE) --no-print-directory _build; \
+ fi
+
+.PHONY: push
+push: ## Push the local image to the registry
+ @if ! docker image inspect "$(IMAGE)" >/dev/null 2>&1; then \
+ echo "ERROR: image $(IMAGE) not found. Run 'make build' first."; exit 1; \
+ fi
+ @echo "=== Pushing $(IMAGE) → $(REGISTRY_IMAGE) ==="
+ docker tag "$(IMAGE)" "$(REGISTRY_IMAGE)"
+ docker push "$(REGISTRY_IMAGE)"
+ @echo "=== Pushed: $(REGISTRY_IMAGE) ==="
+
+.PHONY: start
+start: _ensure_loaded ## Start the container detached with the live workspace mounted
+ @if docker ps --format "{{.Names}}" | grep -q "^$(CONTAINER_NAME)$$"; then \
+ echo "✓ Already running: $(CONTAINER_NAME)"; \
+ else \
+ docker run --detach \
+ --name $(CONTAINER_NAME) \
+ --platform $(DOCKER_PLATFORM) \
+ --network host \
+ --user "$(HOST_UID):$(HOST_GID)" \
+ --env-file "$(ROOT_DIR)/container.env" \
+ -e ROS_DISTRO=$(ROS_DISTRO) \
+ -v "$(ROS2_WORKSPACE):/ros2_workspace" \
+ $(IMAGE) \
+ sleep infinity; \
+ echo "✓ Started: $(CONTAINER_NAME)"; \
+ fi
+
+.PHONY: stop
+stop: ## Stop and remove the container
+ @docker stop $(CONTAINER_NAME) 2>/dev/null || true
+ @docker rm -f $(CONTAINER_NAME) 2>/dev/null || true
+ @echo "✓ Stopped: $(CONTAINER_NAME)"
+
+.PHONY: package
+package: ## Save the current build output as a tar.gz in packages/
+ @if [ ! -d "$(BUILD_DIR)" ]; then \
+ echo "ERROR: No build output at $(BUILD_DIR). Run 'make build' first."; exit 1; \
+ fi
+ @mkdir -p $(PACKAGES_DIR)
+ @PKG=$(PACKAGES_DIR)/$(IMAGE_NAME)_$(IMAGE_TAG).tar.gz; \
+ echo "=== Packaging $(BUILD_DIR) → $$PKG ==="; \
+ tar -czf "$$PKG" --transform "s|^$(IMAGE_TAG)|$(IMAGE_NAME)_$(IMAGE_TAG)|" -C "$(ROOT_DIR)/build" "$(IMAGE_TAG)"; \
+ echo "=== Saved: $$PKG ==="
+
+.PHONY: bundle
+BUNDLE_NAME := $(IMAGE_NAME)_$(IMAGE_TAG)_bundle
+BUNDLE_DIR := $(PACKAGES_DIR)/$(BUNDLE_NAME)
+bundle: ## Create a self-contained Docker-free rootfs bundle in packages/
+ @if ! docker image inspect $(IMAGE) >/dev/null 2>&1; then \
+ echo "ERROR: Image $(IMAGE) not found. Run 'make build' first."; exit 1; \
+ fi
+ @if [ ! -d "$(BUILD_DIR)/ros2_workspace_dist" ]; then \
+ echo "ERROR: No workspace at $(BUILD_DIR)/ros2_workspace_dist. Run 'make build' first."; exit 1; \
+ fi
+ @mkdir -p $(PACKAGES_DIR)
+ @echo "=== Creating bundle → $(BUNDLE_DIR).tar.gz ==="
+ @rm -rf $(BUNDLE_DIR) && mkdir -p $(BUNDLE_DIR)/rootfs
+ @echo " Exporting rootfs (this may take a while)..."
+ @cid=$$(docker create --platform $(DOCKER_PLATFORM) $(IMAGE) /bin/true); \
+ docker export "$$cid" | tar -x -C $(BUNDLE_DIR)/rootfs; \
+ docker rm "$$cid"
+ @cp -r $(BUILD_DIR)/ros2_workspace_dist $(BUNDLE_DIR)/ros2_workspace_dist
+ @cp $(ROOT_DIR)/container.env $(BUNDLE_DIR)/container.env
+ @printf 'ROS_DISTRO=%s\nDOCKER_PLATFORM=%s\n' "$(ROS_DISTRO)" "$(DOCKER_PLATFORM)" \
+ > $(BUNDLE_DIR)/bundle.env
+ @printf 'LICHTBLICK_IMAGE=%s\nLICHTBLICK_ARCHIVE_NAME=%s\n' \
+ "$(LICHTBLICK_IMAGE)" "$(LICHTBLICK_ARCHIVE_NAME)" \
+ > $(BUNDLE_DIR)/lichtblick.env
+ @cp $(ROOT_DIR)/scripts/bundle_run.sh $(BUNDLE_DIR)/start.sh && chmod +x $(BUNDLE_DIR)/start.sh
+ @cp $(ROOT_DIR)/scripts/bundle_stop.sh $(BUNDLE_DIR)/stop.sh && chmod +x $(BUNDLE_DIR)/stop.sh
+ @cp $(ROOT_DIR)/scripts/bundle_shell_dev.sh $(BUNDLE_DIR)/shell_dev.sh && chmod +x $(BUNDLE_DIR)/shell_dev.sh
+ @cp $(ROOT_DIR)/scripts/bundle_shell_dist.sh $(BUNDLE_DIR)/shell_dist.sh && chmod +x $(BUNDLE_DIR)/shell_dist.sh
+ @cp $(ROOT_DIR)/scripts/bundle_start_lichtblick.sh $(BUNDLE_DIR)/start_lichtblick.sh && chmod +x $(BUNDLE_DIR)/start_lichtblick.sh
+ @cp $(ROOT_DIR)/scripts/bundle_stop_lichtblick.sh $(BUNDLE_DIR)/stop_lichtblick.sh && chmod +x $(BUNDLE_DIR)/stop_lichtblick.sh
+ @cp $(ROOT_DIR)/scripts/bundle_inner.sh $(BUNDLE_DIR)/.bundle_inner.sh && chmod +x $(BUNDLE_DIR)/.bundle_inner.sh
+ @echo " Saving Lichtblick image → $(BUNDLE_DIR)/lichtblick/$(LICHTBLICK_ARCHIVE_NAME)"
+ @mkdir -p $(BUNDLE_DIR)/lichtblick
+ @docker save $(LICHTBLICK_IMAGE) | gzip > $(BUNDLE_DIR)/lichtblick/$(LICHTBLICK_ARCHIVE_NAME)
+ @cp $(ROOT_DIR)/README.release.md $(BUNDLE_DIR)/README.md
+ @echo " Compressing..."
+ @tar -czf $(BUNDLE_DIR).tar.gz -C $(PACKAGES_DIR) $(BUNDLE_NAME)
+ @rm -rf $(BUNDLE_DIR)
+ @echo "=== Bundle: $(BUNDLE_DIR).tar.gz ==="
+
+.PHONY: shell_debug
+shell_debug: start ## Attach an interactive shell to the running container (dev workspace) as root
+ docker exec -u root -it --workdir /ros2_workspace $(CONTAINER_NAME) /bin/bash
+
+.PHONY: shell_dev
+shell_dev: start ## Attach an interactive shell to the running container (dev workspace)
+ docker exec -it --workdir /ros2_workspace $(CONTAINER_NAME) /bin/bash
+
+.PHONY: shell_dist
+shell_dist: start ## Attach an interactive shell scoped to the dist scenarios workspace
+ docker exec -it \
+ --workdir /ros2_workspace_dist/adore_scenarios/simulation_scenarios \
+ $(CONTAINER_NAME) \
+ /bin/bash --init-file /ros2_workspace_dist/install/setup.bash
+
+.PHONY: clean
+clean: ## Remove image, build output, and build context
+ docker rmi $(IMAGE) 2>/dev/null || true
+ rm -rf $(ROOT_DIR)/build $(CONTEXT_DIR)
+ @rm -f $(DOCKERFILE).patched
+
+.PHONY: _ensure_loaded
+_ensure_loaded:
+ @if ! docker image inspect $(IMAGE) >/dev/null 2>&1; then \
+ if [ -f "$(IMAGE_ARCHIVE)" ]; then \
+ echo "Loading $(IMAGE_ARCHIVE)..."; \
+ docker load -i "$(IMAGE_ARCHIVE)"; \
+ else \
+ echo "ERROR: image $(IMAGE) not found. Run 'make build' first."; exit 1; \
+ fi \
+ fi
+
+.PHONY: _write_scripts
+_write_scripts:
+ @printf 'IMAGE=%s\nIMAGE_TAG=%s\nIMAGE_ARCHIVE_NAME=%s\nCONTAINER_NAME=%s\nDOCKER_PLATFORM=%s\nROS_DISTRO=%s\n' \
+ "$(_IMAGE)" "$(_IMAGE_TAG)" "$(_IMAGE_ARCHIVE_NAME)" "$(_CONTAINER_NAME)" \
+ "$(DOCKER_PLATFORM)" "$(ROS_DISTRO)" \
+ > $(_BUILD_DIR)/adore.env
+ @cp $(ROOT_DIR)/scripts/load.sh $(_BUILD_DIR)/load.sh && chmod +x $(_BUILD_DIR)/load.sh
+ @cp $(ROOT_DIR)/scripts/start.sh $(_BUILD_DIR)/start.sh && chmod +x $(_BUILD_DIR)/start.sh
+ @cp $(ROOT_DIR)/scripts/shell_dev.sh $(_BUILD_DIR)/shell_dev.sh && chmod +x $(_BUILD_DIR)/shell_dev.sh
+ @cp $(ROOT_DIR)/scripts/shell_dist.sh $(_BUILD_DIR)/shell_dist.sh && chmod +x $(_BUILD_DIR)/shell_dist.sh
+ @cp $(ROOT_DIR)/scripts/stop.sh $(_BUILD_DIR)/stop.sh && chmod +x $(_BUILD_DIR)/stop.sh
+ @cp $(ROOT_DIR)/scripts/build_ros_workspace.sh $(_BUILD_DIR)/build_ros_workspace.sh && chmod +x $(_BUILD_DIR)/build_ros_workspace.sh
+ @cp $(ROOT_DIR)/scripts/bundle_run.sh $(_BUILD_DIR)/bundle_run.sh && chmod +x $(_BUILD_DIR)/bundle_run.sh
+ @cp $(ROOT_DIR)/scripts/bundle_shell_dev.sh $(_BUILD_DIR)/bundle_shell_dev.sh && chmod +x $(_BUILD_DIR)/bundle_shell_dev.sh
+ @cp $(ROOT_DIR)/scripts/bundle_shell_dist.sh $(_BUILD_DIR)/bundle_shell_dist.sh && chmod +x $(_BUILD_DIR)/bundle_shell_dist.sh
+ @cp $(ROOT_DIR)/scripts/bundle_inner.sh $(_BUILD_DIR)/.bundle_inner.sh && chmod +x $(_BUILD_DIR)/.bundle_inner.sh
+ @cp $(ROOT_DIR)/scripts/start_lichtblick.sh $(_BUILD_DIR)/start_lichtblick.sh && chmod +x $(_BUILD_DIR)/start_lichtblick.sh
+ @cp $(ROOT_DIR)/scripts/stop_lichtblick.sh $(_BUILD_DIR)/stop_lichtblick.sh && chmod +x $(_BUILD_DIR)/stop_lichtblick.sh
+ @cp $(ROOT_DIR)/container.env $(_BUILD_DIR)/container.env
+ @printf 'LICHTBLICK_IMAGE=%s\nLICHTBLICK_ARCHIVE_NAME=%s\n' \
+ "$(_LICHTBLICK_IMAGE)" "$(_LICHTBLICK_ARCHIVE_NAME)" \
+ > $(_BUILD_DIR)/lichtblick.env
+ @mkdir -p $(_BUILD_DIR)/lichtblick
+ @cp -r $(LICHTBLICK_DIR)/. $(_BUILD_DIR)/lichtblick/
+ @cp $(ROOT_DIR)/README.release.md $(_BUILD_DIR)/README.md
+
+.PHONY: _gather
+_gather:
+ @echo "=== Gathering requirements ==="
+ @rm -rf $(CONTEXT_DIR)
+ @mkdir -p $(CONTEXT_DIR)/vendor
+ @{ find $(ROOT_DIR) -maxdepth 2 -type f -name "*.system" \
+ ! -path "*/context/*" 2>/dev/null; \
+ find $(ROS2_SRC) -type f -name "*.system" 2>/dev/null; } \
+ | LC_ALL=C sort \
+ | xargs -r grep -hv '^\s*#' \
+ | grep -v '^\s*$$' \
+ | LC_ALL=C sort -u \
+ > $(CONTEXT_DIR)/requirements.system || true
+ @{ find $(ROOT_DIR) -maxdepth 2 -type f -name "*.pip3" \
+ ! -path "*/context/*" 2>/dev/null; \
+ find $(ROS2_SRC) -type f -name "*.pip3" 2>/dev/null; } \
+ | LC_ALL=C sort \
+ | xargs -r grep -hv '^\s*#' \
+ | grep -v '^\s*$$' \
+ | LC_ALL=C sort -u \
+ > $(CONTEXT_DIR)/requirements.pip3 || true
+ @{ find $(ROOT_DIR) -maxdepth 2 -type f -name "*.ppa" \
+ ! -path "*/context/*" 2>/dev/null; \
+ find $(ROS2_SRC) -type f -name "*.ppa" 2>/dev/null; } \
+ | LC_ALL=C sort \
+ | xargs -r grep -hv '^\s*#' \
+ | grep '^ppa:' \
+ | LC_ALL=C sort -u \
+ > $(CONTEXT_DIR)/requirements.ppa || true
+ @find "$(VENDOR_PATH)/build" -name '*.deb' 2>/dev/null \
+ | sort | xargs -r -I{} cp {} $(CONTEXT_DIR)/vendor/ || true
+ @cp $(ROOT_DIR)/scripts/install_packages.sh $(CONTEXT_DIR)/install_packages.sh && chmod +x $(CONTEXT_DIR)/install_packages.sh
+ @cp $(ROOT_DIR)/scripts/install_requirements.sh $(CONTEXT_DIR)/install_requirements.sh && chmod +x $(CONTEXT_DIR)/install_requirements.sh
+ @echo " system : $$(wc -l < $(CONTEXT_DIR)/requirements.system)"
+ @echo " pip3 : $$(wc -l < $(CONTEXT_DIR)/requirements.pip3)"
+ @echo " ppa : $$(wc -l < $(CONTEXT_DIR)/requirements.ppa)"
+ @echo " debs : $$(find $(CONTEXT_DIR)/vendor -name '*.deb' | wc -l)"
+ @echo "=== Gather complete ==="
+
+.PHONY: image
+image: ## Prints the current docker image tag
+ @echo ${IMAGE}
diff --git a/adore_embedded/README.md b/adore_embedded/README.md
new file mode 100644
index 00000000..dd5acebc
--- /dev/null
+++ b/adore_embedded/README.md
@@ -0,0 +1,42 @@
+# adore_embedded
+
+This project builds a complete stand-alone deployment package for ADORe
+with a versioned Docker image for the ADORe ROS2 workspace. The image bundles
+all system, Python, and vendor dependencies needed to compile and run the
+workspace in a reproducible environment.
+
+Each build is tagged with the current git commit and a hash of all dependency
+files, so the image tag changes only when the code or dependencies change.
+
+The output package in `build/` can be copied to a new host and executed
+immediately. The output package only requires docker to execute.
+
+## Requirements
+
+- Docker
+- GNU Make
+
+## Usage
+
+```
+make build Build the image, compile the ROS2 workspace, and save to build//
+make start Start the container with the workspace mounted
+make stop Stop and remove the container
+make shell Open a shell inside the running container
+make clean Remove the image, build output, and context
+make help Show available targets
+```
+
+The first `make build` produces a `build//` directory containing the
+image archive, compiled workspace, and helper
+scripts (`load.sh`, `shell.sh`, `run.sh`, `stop.sh`) for use on machines
+without this repo.
+
+## Configuration
+
+Environment variables passed to the container are read from `container.env`.
+The ROS distro and target architecture can be overridden at build time:
+
+```
+make build ROS_DISTRO=humble ARCH=aarch64
+```
diff --git a/adore_embedded/README.release.md b/adore_embedded/README.release.md
new file mode 100644
index 00000000..b057c954
--- /dev/null
+++ b/adore_embedded/README.release.md
@@ -0,0 +1,253 @@
+# ADORe Embedded — Release
+
+## Requirements
+
+**Docker (recommended)**
+- Docker Engine 24+ — [install guide](https://docs.docker.com/engine/install/)
+- `x86_64` or `aarch64` host matching the image architecture in the filename
+- GNU Make
+
+**Docker-free bundle**
+- `podman` — [install guide](https://podman.io/docs/installation), **or**
+- `util-linux` with `unshare`, `chroot`, and `mount` (standard on most Linux distributions)
+- Lichtblick visualisation in the bundle requires `podman`
+
+## Fetch
+
+https://github.com/eclipse-adore/adore/releases/
+
+Release: []()
+
+**Docker image**
+
+```bash
+# x86_64
+curl -L -o https://github.com/eclipse-adore/adore/releases/download//
+wget https://github.com/eclipse-adore/adore/releases/download//
+
+# aarch64
+curl -L -o https://github.com/eclipse-adore/adore/releases/download//
+wget https://github.com/eclipse-adore/adore/releases/download//
+```
+
+**Docker-free bundle**
+
+```bash
+# x86_64
+curl -L -o https://github.com/eclipse-adore/adore/releases/download//
+wget https://github.com/eclipse-adore/adore/releases/download//
+
+# aarch64
+curl -L -o https://github.com/eclipse-adore/adore/releases/download//
+wget https://github.com/eclipse-adore/adore/releases/download//
+```
+
+## Unpack
+
+```bash
+# x86_64
+tar -xzf
+cd
+
+# aarch64
+tar -xzf
+cd
+```
+
+The image archive (`*.tar.gz`) inside the directory is loaded separately on first run — no manual extraction needed.
+
+## Quick start
+
+```bash
+./load.sh # import Docker image (first run only)
+./start.sh # start container
+./start_lichtblick.sh # start Lichtblick visualiser (optional)
+./shell_dist.sh # attach to pre-built workspace
+./stop_lichtblick.sh # stop visualiser
+./stop.sh # stop container
+```
+
+## Running a scenario
+
+`shell_dist.sh` drops directly into the simulation scenarios directory with the workspace pre-sourced.
+
+```bash
+./shell_dist.sh
+```
+
+Inside the shell, launch any scenario by name:
+
+```bash
+ros2 launch simulation_test.launch.py
+```
+
+Other available scenarios in the same directory:
+
+```bash
+ros2 launch template.launch.py
+ros2 launch dlr_campus.launch.py
+ros2 launch saad_maad.launch.py
+```
+
+## Visualizing with Lichtblick
+
+Lichtblick connects to the running scenario over rosbridge (WebSocket on port 9090) and renders a pre-configured layout shipped with the release.
+
+**1. Start Lichtblick** (in a separate terminal, before or after launching a scenario):
+
+```bash
+./start_lichtblick.sh
+```
+
+**2. Launch a scenario** (in another terminal):
+
+```bash
+./shell_dist.sh
+ros2 launch simulation_test.launch.py
+```
+
+**3. Open Lichtblick** in a Chromium-based browser:
+
+```
+http://localhost:8080/?ds=rosbridge-websocket&ds.url=ws://localhost:9090
+```
+
+The default layout loads automatically. To load the shipped layout explicitly, open it from `ros2_workspace_dist/context/` inside the container, or from the `adore_scenarios/assets/lichtblick_layouts/Default.json` path in the release directory.
+
+> **Note:** Lichtblick requires a Chromium-based browser (Chrome, Chromium, Edge). Firefox is not supported.
+
+**4. Stop when done:**
+
+```bash
+./stop_lichtblick.sh
+./stop.sh
+```
+
+## Dev vs dist workspace
+
+| | Dev (`shell_dev.sh`) | Dist (`shell_dist.sh`) |
+|---|---|---|
+| Mount | Live `ros2_workspace/` from host | Pre-built `ros2_workspace_dist/` baked into the image |
+| ROS2 setup | Not sourced — run `source install/setup.bash` after building | Sourced automatically on shell entry |
+| Use when | Actively modifying and rebuilding source | Running scenarios against a known-good build |
+
+Use `shell_dev.sh` during development. Use `shell_dist.sh` to run scenarios against the shipped build without any host dependencies.
+
+## Docker-free bundle
+
+No Docker required. The bundle ships a complete Linux rootfs extracted from the Docker image alongside the pre-built ROS2 workspace and the Lichtblick image archive.
+
+### How it works
+
+`start.sh` uses `podman` if available, otherwise falls back to `unshare`/`chroot` from `util-linux`. Both paths mount the `ros2_workspace_dist/` directory from the bundle into the rootfs at runtime, so scenarios always run against the shipped build without copying it into the container.
+
+The `unshare` path creates an unprivileged user namespace with a private mount and PID namespace, then calls `chroot` into the rootfs. No root access is required with either backend.
+
+Lichtblick in the bundle requires `podman`. The Lichtblick container image is included in the bundle as `lichtblick/.tar.gz` and is imported into podman on first use.
+
+### Unpack
+
+```bash
+tar -xzf
+cd
+```
+
+### Workflow
+
+```bash
+./shell_dist.sh # enter the dist workspace shell
+./shell_dev.sh # enter the dev workspace shell
+./stop.sh # remove the imported podman image (podman only; no-op for unshare)
+./start_lichtblick.sh # start the Lichtblick visualiser (requires podman)
+./stop_lichtblick.sh # stop the Lichtblick visualiser
+```
+
+### Running a scenario (bundle)
+
+Open two terminals in the bundle directory.
+
+**Terminal 1 — start the environment and launch a scenario:**
+
+```bash
+./shell_dist.sh
+ros2 launch simulation_test.launch.py
+```
+
+**Terminal 2 — start Lichtblick:**
+
+```bash
+./start_lichtblick.sh
+```
+
+Then open in a Chromium-based browser:
+
+```
+http://localhost:8080/?ds=rosbridge-websocket&ds.url=ws://localhost:9090
+```
+
+**When done:**
+
+```bash
+./stop_lichtblick.sh
+./stop.sh
+```
+
+`stop.sh` removes the imported podman image (`adore_bundle_`). Re-running `start.sh` or any shell script will re-import it from the rootfs directory on the next invocation. When using the `unshare` backend, `stop.sh` prints a notice and exits cleanly — there is no persistent state to remove.
+
+### Backend selection
+
+| Backend | Selected when | Persistent state |
+|---|---|---|
+| `podman` | `podman` is on `PATH` | Podman image `adore_bundle_` imported on first run; removed by `stop.sh` |
+| `unshare`/`chroot` | `podman` not found | None — namespace torn down when the shell exits |
+
+### Bundle contents
+
+| Path | Description |
+|---|---|
+| `rootfs/` | Complete Linux rootfs with all ROS2 and ADORe dependencies |
+| `ros2_workspace_dist/` | Pre-built ROS2 workspace mounted into the rootfs at runtime |
+| `lichtblick/.tar.gz` | Lichtblick container image archive, imported into podman on first use |
+| `bundle.env` | `ROS_DISTRO` and `DOCKER_PLATFORM` consumed by the bundle scripts |
+| `lichtblick.env` | `LICHTBLICK_IMAGE` and `LICHTBLICK_ARCHIVE_NAME` consumed by `start_lichtblick.sh` |
+| `container.env` | Runtime environment variables passed into the environment |
+| `start.sh` | Start an interactive session via podman or unshare/chroot |
+| `stop.sh` | Remove the imported podman image; no-op for unshare |
+| `shell_dist.sh` | Shell into the pre-built dist workspace |
+| `shell_dev.sh` | Shell into the dev workspace |
+| `start_lichtblick.sh` | Start Lichtblick via podman (loads archive on first use) |
+| `stop_lichtblick.sh` | Stop the Lichtblick podman container |
+| `.bundle_inner.sh` | Internal helper — mounts filesystems and execs into the chroot (not called directly) |
+| `README.md` | This file |
+
+## Rebuild ROS2 workspace
+
+```bash
+./shell_dev.sh # enter dev shell
+make build # rebuild inside container
+```
+
+Or non-interactively:
+
+```bash
+./build_ros_workspace.sh
+```
+
+## Contents (Docker release)
+
+| Path | Description |
+|---|---|
+| `adore.env` | Image name, tag, and container configuration |
+| `container.env` | Runtime environment variables passed into the container |
+| `load.sh` | Load the image archive into Docker |
+| `start.sh` | Start the container detached |
+| `stop.sh` | Stop and remove the container |
+| `shell_dev.sh` | Interactive shell — live source workspace |
+| `shell_dist.sh` | Interactive shell — pre-built distribution workspace |
+| `build_ros_workspace.sh` | Rebuild the ROS2 workspace inside the container |
+| `start_lichtblick.sh` / `stop_lichtblick.sh` | Lichtblick visualiser |
+| `bundle_run.sh` | Run without Docker via podman or `unshare` |
+| `bundle_shell_dev.sh` / `bundle_shell_dist.sh` | Shells for the Docker-free bundle |
+| `ros2_workspace_dist/` | Pre-built ROS2 workspace |
+| `lichtblick/` | Lichtblick image archive and supporting files |
+| `*.tar.gz` | Docker image archive |
diff --git a/adore_embedded/container.env b/adore_embedded/container.env
new file mode 100644
index 00000000..a6c793ab
--- /dev/null
+++ b/adore_embedded/container.env
@@ -0,0 +1 @@
+FASTDDS_BUILTIN_TRANSPORTS=UDPv4
diff --git a/adore_embedded/patches/001_fastcdr_fastrtps_snapshot_pin.patch b/adore_embedded/patches/001_fastcdr_fastrtps_snapshot_pin.patch
new file mode 100644
index 00000000..ca965f18
--- /dev/null
+++ b/adore_embedded/patches/001_fastcdr_fastrtps_snapshot_pin.patch
@@ -0,0 +1,46 @@
+# PATCH: 001_fastcdr_fastrtps_snapshot_pin.patch
+#
+# PROBLEM:
+# ros-jazzy-fastcdr (2.2.7-1noble.20260225.051855) ships a binary built from a
+# source snapshot where Cdr::serialize(uint8_t const&) was still an inline header
+# function and therefore not exported from libfastcdr.so.2. ros-jazzy-fastrtps
+# (2.14.6-1noble.20260303.233638) was compiled against the real v2.2.7 tag where
+# that method became out-of-line, producing an unresolvable symbol at runtime:
+# libfastrtps.so.2.14: undefined symbol: _ZN8eprosima7fastcdr3Cdr9serializeERKh
+# The base image ros:jazzy-ros-core-noble ships these broken versions, and
+# apt-get upgrade in the base stage promotes all ros-jazzy-* packages to the
+# broken post-20260121 builds.
+#
+# FIX:
+# After all apt operations in the base stage, pin all installed ros-jazzy-*
+# packages to the jazzy/2026-01-28 snapshot using Pin-Priority: 1001 (above
+# apt's downgrade threshold), force-downgrade them, then hold to prevent
+# subsequent layers from re-upgrading.
+#
+# REMOVE WHEN:
+# The ros-jazzy apt repo publishes a consistent set of fastcdr/fastrtps packages
+# where all rosidl_typesupport_fastrtps_* libraries are built against the same
+# fastcdr ABI.
+--- a/Dockerfile
++++ b/Dockerfile
+@@ -45,6 +45,20 @@
+
+ RUN echo "/usr/local/lib" >> /etc/ld.so.conf.d/local.conf && ldconfig
+
++RUN gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys AD19BAB3CBF125EA && \
++ gpg --export AD19BAB3CBF125EA > /usr/share/keyrings/ros-snapshot-keyring.gpg && \
++ echo "deb [ signed-by=/usr/share/keyrings/ros-snapshot-keyring.gpg ] \
++ http://snapshots.ros.org/jazzy/2026-01-28/ubuntu noble main" \
++ > /etc/apt/sources.list.d/ros2-snapshot.list && \
++ printf 'Package: ros-jazzy-*\nPin: origin snapshots.ros.org\nPin-Priority: 1001\n' \
++ > /etc/apt/preferences.d/ros-snapshot-pin && \
++ apt-get update && \
++ apt-get install -y --allow-downgrades \
++ $(dpkg -l "ros-jazzy-*" | awk '/^[hi]i/{print $2}') && \
++ dpkg -l "ros-jazzy-*" | awk '/^[hi]i/{print $2}' | xargs apt-mark hold && \
++ rm /etc/apt/sources.list.d/ros2-snapshot.list \
++ /etc/apt/preferences.d/ros-snapshot-pin
++
+ # ── Workspace build stage ──────────────────────────────────────────────────────
+ # ros2_workspace is supplied as an external BuildKit build context:
+ # docker build --build-context ros2_workspace=../ros2_workspace ...
diff --git a/adore_embedded/requirements.pip3 b/adore_embedded/requirements.pip3
new file mode 100644
index 00000000..4707807c
--- /dev/null
+++ b/adore_embedded/requirements.pip3
@@ -0,0 +1,6 @@
+# Python package requirements for adore_embedded.
+# One pip package name (with optional version specifier) per line.
+# These are installed into the Docker image at build time via install_requirements.sh.
+# Add any Python packages required by the embedded runtime that are not declared
+# in a ROS package's own requirements.pip3 file.
+# Environment variables (e.g. ${ROS_DISTRO}) are expanded at build time via envsubst.
diff --git a/adore_embedded/requirements.ppa b/adore_embedded/requirements.ppa
new file mode 100644
index 00000000..1b66ab97
--- /dev/null
+++ b/adore_embedded/requirements.ppa
@@ -0,0 +1,6 @@
+# PPA requirements for adore_embedded.
+# One PPA per line in the format: ppa:/
+# These are added to apt sources at build time via install_requirements.sh.
+# Add any PPAs required by the embedded runtime that are not declared
+# in a ROS package's own requirements.ppa file.
+# Environment variables (e.g. ${ROS_DISTRO}) are expanded at build time via envsubst.
diff --git a/adore_embedded/requirements.system b/adore_embedded/requirements.system
new file mode 100644
index 00000000..d7799660
--- /dev/null
+++ b/adore_embedded/requirements.system
@@ -0,0 +1,10 @@
+# System package requirements for adore_embedded.
+# One apt package name per line. These are installed into the Docker image at build time
+# via install_requirements.sh. Add any apt packages required by the embedded runtime
+# that are not declared in a ROS package's own requirements.system file.
+# Environment variables (e.g. ${ROS_DISTRO}) are expanded at build time via envsubst.
+ros-${ROS_DISTRO}-rosbridge-suite
+ros-${ROS_DISTRO}-rosbridge-msgs
+ros-${ROS_DISTRO}-rmw-fastrtps-cpp
+ros-${ROS_DISTRO}-rosapi
+ros-${ROS_DISTRO}-rosapi-msgs
diff --git a/adore_scenarios/scenario_helpers/simulation_controller_params.py b/adore_embedded/scripts/build_ros_workspace.sh
old mode 100644
new mode 100755
similarity index 59%
rename from adore_scenarios/scenario_helpers/simulation_controller_params.py
rename to adore_embedded/scripts/build_ros_workspace.sh
index a02d2050..2c54dbdf
--- a/adore_scenarios/scenario_helpers/simulation_controller_params.py
+++ b/adore_embedded/scripts/build_ros_workspace.sh
@@ -1,5 +1,6 @@
+#!/usr/bin/env bash
# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
@@ -11,15 +12,10 @@
# SPDX-License-Identifier: EPL-2.0
# ********************************************************************************
-simulation_pid_params = {
- "k_long": 1.0,
- "k_v": 1.0,
- "k_feed_forward_ax": 1.0,
- "dt": 0.1,
- "acc_smoothing": 0.95,
- "min_lookahead": 0.1,
- "max_lookahead": 1.0,
- "base_lookahead": 0.5,
- "lookahead_gain": 0.1,
- "slow_steer_smoothing": 4.0
-}
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${SCRIPT_DIR}/adore.env"
+
+bash "${SCRIPT_DIR}/run.sh"
+docker exec --workdir /ros2_workspace "${CONTAINER_NAME}" make build
+bash "${SCRIPT_DIR}/stop.sh"
diff --git a/adore_embedded/scripts/bundle_inner.sh b/adore_embedded/scripts/bundle_inner.sh
new file mode 100755
index 00000000..4d4ae6a9
--- /dev/null
+++ b/adore_embedded/scripts/bundle_inner.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+# Runs inside the unshare namespace. Args: [cmd...]
+set -euo pipefail
+ROOTFS="$1"; shift
+ROS_DISTRO="$1"; shift
+WORKSPACE="$1"; shift
+
+mount -t proc proc "${ROOTFS}/proc"
+mount --rbind /sys "${ROOTFS}/sys"
+mount --rbind /dev "${ROOTFS}/dev"
+mount --bind "${WORKSPACE}" "${ROOTFS}/ros2_workspace_dist"
+
+exec chroot "${ROOTFS}" /bin/bash -c '
+ source /opt/ros/'"${ROS_DISTRO}"'/setup.bash
+ source /ros2_workspace_dist/install/setup.bash 2>/dev/null || true
+ exec "$@"
+' -- "$@"
diff --git a/adore_embedded/scripts/bundle_run.sh b/adore_embedded/scripts/bundle_run.sh
new file mode 100755
index 00000000..9c1d5540
--- /dev/null
+++ b/adore_embedded/scripts/bundle_run.sh
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${SCRIPT_DIR}/bundle.env"
+
+_run_podman() {
+ if ! podman image exists adore_bundle_${ROS_DISTRO} 2>/dev/null; then
+ echo "Importing rootfs into podman (first run only)..."
+ tar -c -C "${SCRIPT_DIR}/rootfs" . \
+ | podman import \
+ --change "ENV ROS_DISTRO=${ROS_DISTRO}" \
+ --change "WORKDIR /ros2_workspace_dist" \
+ - "adore_bundle_${ROS_DISTRO}"
+ fi
+ exec podman run --rm -it \
+ --network host \
+ --env-file "${SCRIPT_DIR}/container.env" \
+ -e ROS_DISTRO="${ROS_DISTRO}" \
+ -v "${SCRIPT_DIR}/ros2_workspace_dist:/ros2_workspace_dist:z" \
+ "adore_bundle_${ROS_DISTRO}" \
+ "$@"
+}
+
+_run_unshare() {
+ for tool in unshare chroot mount; do
+ command -v "$tool" &>/dev/null || {
+ echo "ERROR: '${tool}' not found — install util-linux"
+ exit 1
+ }
+ done
+ set -a; source "${SCRIPT_DIR}/container.env"; set +a
+ exec unshare --user --map-root-user --mount --pid --fork \
+ "${SCRIPT_DIR}/.bundle_inner.sh" \
+ "${SCRIPT_DIR}/rootfs" \
+ "${ROS_DISTRO}" \
+ "${SCRIPT_DIR}/ros2_workspace_dist" \
+ "$@"
+}
+
+if command -v podman &>/dev/null; then
+ _run_podman "$@"
+else
+ _run_unshare "$@"
+fi
diff --git a/adore_scenarios/scenario_helpers/ngc_controller_params.py b/adore_embedded/scripts/bundle_shell_dev.sh
old mode 100644
new mode 100755
similarity index 62%
rename from adore_scenarios/scenario_helpers/ngc_controller_params.py
rename to adore_embedded/scripts/bundle_shell_dev.sh
index 2dd17660..864d00b5
--- a/adore_scenarios/scenario_helpers/ngc_controller_params.py
+++ b/adore_embedded/scripts/bundle_shell_dev.sh
@@ -1,5 +1,6 @@
+#!/usr/bin/env bash
# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
@@ -11,15 +12,6 @@
# SPDX-License-Identifier: EPL-2.0
# ********************************************************************************
-ngc_pid_params = {
- "kp_x": 0.05,
- "ki_x": 0.0,
- "velocity_weight": 0.3,
- "kp_y": 0.0,
- "ki_y": 0.0,
- "heading_weight": 0.0,
- "kp_omega": 0.05,
- "dt": 0.05,
- "steering_comfort": 2.5,
- "acceleration_comfort": 15.0,
-}
\ No newline at end of file
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+exec "${SCRIPT_DIR}/start.sh" /bin/bash
diff --git a/adore_scenarios/scenario_helpers/simulation_planner_params.py b/adore_embedded/scripts/bundle_shell_dist.sh
old mode 100644
new mode 100755
similarity index 53%
rename from adore_scenarios/scenario_helpers/simulation_planner_params.py
rename to adore_embedded/scripts/bundle_shell_dist.sh
index c353c51c..32e7f358
--- a/adore_scenarios/scenario_helpers/simulation_planner_params.py
+++ b/adore_embedded/scripts/bundle_shell_dist.sh
@@ -1,5 +1,6 @@
+#!/usr/bin/env bash
# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
@@ -11,19 +12,7 @@
# SPDX-License-Identifier: EPL-2.0
# ********************************************************************************
-planner_params = {
- "dt": 0.1,
- "horizon_steps": 40,
- "lane_error": 1.0,
- "long_error": 0.01,
- "speed_error": 1.0,
- "heading_error": 1.0,
- "steering_angle": 1.0,
- "acceleration": 0.1,
- "max_iterations": 100,
- "max_ms": 80,
- "debug": 0.0,
- "max_lateral_acceleration": 2.0,
- "idm_time_headway": 3.0,
- "ref_traj_length": 200
-}
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+exec "${SCRIPT_DIR}/start.sh" \
+ /bin/bash -c 'source /ros2_workspace_dist/install/setup.bash && cd /ros2_workspace_dist/adore_scenarios/simulation_scenarios && exec /bin/bash'
diff --git a/adore_embedded/scripts/bundle_start_lichtblick.sh b/adore_embedded/scripts/bundle_start_lichtblick.sh
new file mode 100644
index 00000000..da3fc505
--- /dev/null
+++ b/adore_embedded/scripts/bundle_start_lichtblick.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${SCRIPT_DIR}/bundle.env"
+source "${SCRIPT_DIR}/lichtblick.env"
+
+LICHTBLICK_CONTAINER="lichtblick_bundle"
+
+if ! command -v podman &>/dev/null; then
+ echo "ERROR: Lichtblick requires podman. Install podman and re-run."
+ exit 1
+fi
+
+if podman ps --format "{{.Names}}" | grep -q "^${LICHTBLICK_CONTAINER}$"; then
+ echo "Already running: ${LICHTBLICK_CONTAINER}"
+ exit 0
+fi
+
+if ! podman image exists "${LICHTBLICK_IMAGE}" 2>/dev/null; then
+ ARCHIVE="${SCRIPT_DIR}/lichtblick/${LICHTBLICK_ARCHIVE_NAME}"
+ if [ ! -f "${ARCHIVE}" ]; then
+ echo "ERROR: Lichtblick image '${LICHTBLICK_IMAGE}' not found and archive missing: ${ARCHIVE}"
+ exit 1
+ fi
+ echo "Loading Lichtblick image from ${ARCHIVE}..."
+ podman load -i "${ARCHIVE}"
+fi
+
+podman run --detach \
+ --name "${LICHTBLICK_CONTAINER}" \
+ --network host \
+ "${LICHTBLICK_IMAGE}"
+echo "Started: ${LICHTBLICK_CONTAINER}"
+echo ""
+echo "Open Lichtblick in a Chromium-based browser:"
+echo " http://localhost:8080/?ds=rosbridge-websocket&ds.url=ws://localhost:9090"
diff --git a/.docker/scripts/load_image.sh b/adore_embedded/scripts/bundle_stop.sh
old mode 100755
new mode 100644
similarity index 53%
rename from .docker/scripts/load_image.sh
rename to adore_embedded/scripts/bundle_stop.sh
index 57fa071a..a666ddae
--- a/.docker/scripts/load_image.sh
+++ b/adore_embedded/scripts/bundle_stop.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
@@ -12,23 +12,19 @@
# SPDX-License-Identifier: EPL-2.0
# ********************************************************************************
-# Load the dev Docker image from a tarball under ${DOCKER_BUILD_DIR}.
-
set -euo pipefail
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${SCRIPT_DIR}/common.sh"
-
-require_host "Saving/loading images should be done from the host."
+source "${SCRIPT_DIR}/bundle.env"
-IN="${DOCKER_BUILD_DIR}/${DOCKER_TAR_NAME}"
-
-if [[ ! -f "${IN}" ]]; then
- echo "ERROR: Image tarball not found: ${IN}" >&2
- echo " Run save_image.sh first to create it." >&2
- exit 1
+if command -v podman &>/dev/null; then
+ IMAGE_NAME="adore_bundle_${ROS_DISTRO}"
+ if podman image exists "${IMAGE_NAME}" 2>/dev/null; then
+ echo "Removing podman image: ${IMAGE_NAME}"
+ podman rmi "${IMAGE_NAME}"
+ echo "Removed: ${IMAGE_NAME}"
+ else
+ echo "No podman image found: ${IMAGE_NAME}"
+ fi
+else
+ echo "Bundle uses unshare/chroot — no persistent state to clean up."
fi
-
-echo "--- Loading dev Docker image from ${IN} ---"
-docker load -i "${IN}"
diff --git a/adore_embedded/scripts/bundle_stop_lichtblick.sh b/adore_embedded/scripts/bundle_stop_lichtblick.sh
new file mode 100644
index 00000000..9e50799f
--- /dev/null
+++ b/adore_embedded/scripts/bundle_stop_lichtblick.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+set -euo pipefail
+
+LICHTBLICK_CONTAINER="lichtblick_bundle"
+
+if ! command -v podman &>/dev/null; then
+ echo "ERROR: podman not found."
+ exit 1
+fi
+
+podman stop "${LICHTBLICK_CONTAINER}" 2>/dev/null || true
+podman rm -f "${LICHTBLICK_CONTAINER}" 2>/dev/null || true
+echo "Stopped: ${LICHTBLICK_CONTAINER}"
diff --git a/adore_embedded/scripts/container.env b/adore_embedded/scripts/container.env
new file mode 100644
index 00000000..a6c793ab
--- /dev/null
+++ b/adore_embedded/scripts/container.env
@@ -0,0 +1 @@
+FASTDDS_BUILTIN_TRANSPORTS=UDPv4
diff --git a/.docker/scripts/save_image.sh b/adore_embedded/scripts/install_packages.sh
similarity index 54%
rename from .docker/scripts/save_image.sh
rename to adore_embedded/scripts/install_packages.sh
index 6855718b..c03912e7 100755
--- a/.docker/scripts/save_image.sh
+++ b/adore_embedded/scripts/install_packages.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
@@ -12,20 +12,12 @@
# SPDX-License-Identifier: EPL-2.0
# ********************************************************************************
-# Save the dev Docker image to a tarball under ${DOCKER_BUILD_DIR}.
-
set -euo pipefail
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${SCRIPT_DIR}/common.sh"
-
-require_host "Saving/loading images should be done from the host."
-
-mkdir -p "${DOCKER_BUILD_DIR}"
-
-OUT="${DOCKER_BUILD_DIR}/${DOCKER_TAR_NAME}"
-echo "--- Saving dev Docker image ${DOCKER_DEV_IMAGE_LATEST} to ${OUT} ---"
-docker save -o "${OUT}" "${DOCKER_DEV_IMAGE_LATEST}"
-echo "Docker image saved to ${OUT}"
+if find "${SCRIPT_DIR}/vendor" -name '*.deb' | grep -q .; then
+ find "${SCRIPT_DIR}/vendor" -name '*.deb' | sort | xargs dpkg -i || true
+ apt-get install -f -y --no-install-recommends
+else
+ echo "No .deb packages found in ${SCRIPT_DIR}/vendor"
+fi
diff --git a/adore_embedded/scripts/install_requirements.sh b/adore_embedded/scripts/install_requirements.sh
new file mode 100755
index 00000000..f25f14e3
--- /dev/null
+++ b/adore_embedded/scripts/install_requirements.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+
+if [ -s "${SCRIPT_DIR}/requirements.ppa" ]; then
+ apt-get install -y --no-install-recommends software-properties-common
+ while IFS= read -r ppa; do
+ add-apt-repository -y "$ppa"
+ done < "${SCRIPT_DIR}/requirements.ppa"
+ apt-get update
+fi
+
+if [ -s "${SCRIPT_DIR}/requirements.system" ]; then
+ apt-get update
+ envsubst < "${SCRIPT_DIR}/requirements.system" \
+ | xargs -r apt-get install -y --no-install-recommends
+fi
+
+if [ -s "${SCRIPT_DIR}/requirements.pip3" ]; then
+ pip3 install --no-cache-dir --break-system-packages \
+ -r "${SCRIPT_DIR}/requirements.pip3"
+fi
diff --git a/adore_embedded/scripts/load.sh b/adore_embedded/scripts/load.sh
new file mode 100755
index 00000000..af40d122
--- /dev/null
+++ b/adore_embedded/scripts/load.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${SCRIPT_DIR}/adore.env"
+docker load -i "${SCRIPT_DIR}/${IMAGE_ARCHIVE_NAME}.gz"
diff --git a/adore_embedded/scripts/shell_dev.sh b/adore_embedded/scripts/shell_dev.sh
new file mode 100755
index 00000000..361d4a62
--- /dev/null
+++ b/adore_embedded/scripts/shell_dev.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${SCRIPT_DIR}/adore.env"
+bash "${SCRIPT_DIR}/start.sh"
+docker exec -it --user "$(id -u):$(id -g)" --workdir /ros2_workspace "${CONTAINER_NAME}" /bin/bash
diff --git a/adore_embedded/scripts/shell_dist.sh b/adore_embedded/scripts/shell_dist.sh
new file mode 100755
index 00000000..4d502ed9
--- /dev/null
+++ b/adore_embedded/scripts/shell_dist.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${SCRIPT_DIR}/adore.env"
+bash "${SCRIPT_DIR}/start.sh"
+docker exec -it --user "$(id -u):$(id -g)" \
+ --workdir /ros2_workspace_dist/adore_scenarios/simulation_scenarios \
+ "${CONTAINER_NAME}" \
+ /bin/bash --init-file /ros2_workspace_dist/install/setup.bash
diff --git a/adore_embedded/scripts/start.sh b/adore_embedded/scripts/start.sh
new file mode 100755
index 00000000..9bc6520d
--- /dev/null
+++ b/adore_embedded/scripts/start.sh
@@ -0,0 +1,53 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${SCRIPT_DIR}/adore.env"
+
+WORKSPACE="${SCRIPT_DIR}/ros2_workspace"
+if [ ! -d "${WORKSPACE}" ]; then
+ mkdir -p "${WORKSPACE}"
+fi
+if [ ! -d "${WORKSPACE}/src" ] && [ -d "${SCRIPT_DIR}/src" ]; then
+ cp -r "${SCRIPT_DIR}/src" "${WORKSPACE}/src"
+fi
+for f in Makefile colcon_defaults.yaml colcon_defaults.yaml.template; do
+ if [ -f "${SCRIPT_DIR}/${f}" ] && [ ! -f "${WORKSPACE}/${f}" ]; then
+ cp "${SCRIPT_DIR}/${f}" "${WORKSPACE}/${f}"
+ fi
+done
+if [ ! -d "${WORKSPACE}/adore_scenarios" ] && [ -d "${SCRIPT_DIR}/adore_scenarios" ]; then
+ cp -r "${SCRIPT_DIR}/adore_scenarios" "${WORKSPACE}/adore_scenarios"
+fi
+
+if ! docker image inspect "${IMAGE}" >/dev/null 2>&1; then
+ "${SCRIPT_DIR}/load.sh"
+fi
+
+if docker ps --format "{{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then
+ echo "Already running: ${CONTAINER_NAME}"
+else
+ docker run --detach \
+ --name "${CONTAINER_NAME}" \
+ --platform "${DOCKER_PLATFORM}" \
+ --network host \
+ --user "$(id -u):$(id -g)" \
+ --env-file "${SCRIPT_DIR}/container.env" \
+ -e ROS_DISTRO="${ROS_DISTRO}" \
+ -v "${SCRIPT_DIR}/ros2_workspace:/ros2_workspace" \
+ "${IMAGE}" \
+ sleep infinity
+ echo "Started: ${CONTAINER_NAME}"
+fi
diff --git a/adore_embedded/scripts/start_lichtblick.sh b/adore_embedded/scripts/start_lichtblick.sh
new file mode 100755
index 00000000..d59b4a88
--- /dev/null
+++ b/adore_embedded/scripts/start_lichtblick.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${SCRIPT_DIR}/adore.env"
+source "${SCRIPT_DIR}/lichtblick.env"
+
+if ! docker image inspect "${LICHTBLICK_IMAGE}" >/dev/null 2>&1; then
+ ARCHIVE="${SCRIPT_DIR}/lichtblick/${LICHTBLICK_ARCHIVE_NAME}"
+ if [ ! -f "${ARCHIVE}" ]; then
+ echo "ERROR: Lichtblick image '${LICHTBLICK_IMAGE}' not found and archive missing: ${ARCHIVE}"
+ exit 1
+ fi
+ echo "Loading lichtblick image from ${ARCHIVE}..."
+ docker load -i "${ARCHIVE}"
+fi
+
+cd "${SCRIPT_DIR}/lichtblick"
+exec make start
diff --git a/adore_embedded/scripts/stop.sh b/adore_embedded/scripts/stop.sh
new file mode 100755
index 00000000..f2e61c5d
--- /dev/null
+++ b/adore_embedded/scripts/stop.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${SCRIPT_DIR}/adore.env"
+docker stop "${CONTAINER_NAME}" 2>/dev/null || true
+docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true
+echo "Stopped: ${CONTAINER_NAME}"
diff --git a/adore_embedded/scripts/stop_lichtblick.sh b/adore_embedded/scripts/stop_lichtblick.sh
new file mode 100755
index 00000000..80b17d3d
--- /dev/null
+++ b/adore_embedded/scripts/stop_lichtblick.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# ********************************************************************************
+# Copyright (c) 2026 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+
+set -euo pipefail
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${SCRIPT_DIR}/adore.env"
+
+cd "${SCRIPT_DIR}/lichtblick"
+exec make stop
diff --git a/adore_interfaces/carla_bridge b/adore_interfaces/carla_bridge
deleted file mode 160000
index 674af7a0..00000000
--- a/adore_interfaces/carla_bridge
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 674af7a04a1b3d51ea01b0be1e7f4ae5ebea70fa
diff --git a/adore_interfaces/sumo_bridge b/adore_interfaces/sumo_bridge
deleted file mode 160000
index ae0d8f6c..00000000
--- a/adore_interfaces/sumo_bridge
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit ae0d8f6cb61cc4177ea0e84893a28662f692d539
diff --git a/adore_libraries/adore_controllers b/adore_libraries/adore_controllers
deleted file mode 160000
index 1b74aa15..00000000
--- a/adore_libraries/adore_controllers
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 1b74aa159b883c51a27ea0bcbca7e42fe09ddccc
diff --git a/adore_libraries/adore_map b/adore_libraries/adore_map
deleted file mode 160000
index 7e3162ec..00000000
--- a/adore_libraries/adore_map
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7e3162ec7b26b1407cac58f1264a96bbbaeb56ba
diff --git a/adore_libraries/adore_math b/adore_libraries/adore_math
deleted file mode 160000
index f1e4b754..00000000
--- a/adore_libraries/adore_math
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit f1e4b754723671e06d35946acd944913257d72fb
diff --git a/adore_libraries/adore_planning b/adore_libraries/adore_planning
deleted file mode 160000
index ad91f921..00000000
--- a/adore_libraries/adore_planning
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit ad91f92106b477e939e7e9f11815aa4366b90689
diff --git a/adore_ros2_conversions/adore_dynamics_conversions b/adore_ros2_conversions/adore_dynamics_conversions
deleted file mode 160000
index 7733f280..00000000
--- a/adore_ros2_conversions/adore_dynamics_conversions
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7733f28011968d7d968faf16dcc96f28766235e5
diff --git a/adore_ros2_conversions/adore_map_conversions b/adore_ros2_conversions/adore_map_conversions
deleted file mode 160000
index 8aa18a8c..00000000
--- a/adore_ros2_conversions/adore_map_conversions
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 8aa18a8c2cda93bdf9d853cc8e557c80c351def8
diff --git a/adore_ros2_conversions/adore_math_conversions b/adore_ros2_conversions/adore_math_conversions
deleted file mode 160000
index 50a5472a..00000000
--- a/adore_ros2_conversions/adore_math_conversions
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 50a5472aef48945dd7d1fb52b8c9441ece33fb8f
diff --git a/adore_ros2_msgs b/adore_ros2_msgs
deleted file mode 160000
index bb0f118e..00000000
--- a/adore_ros2_msgs
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit bb0f118e0fca7e60a861a3d7d4d7223ced8a62c8
diff --git a/adore_ros2_nodes/decision_maker b/adore_ros2_nodes/decision_maker
deleted file mode 160000
index f522d78f..00000000
--- a/adore_ros2_nodes/decision_maker
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit f522d78f04b85621e18253ecafc6bc2d156c5236
diff --git a/adore_ros2_nodes/decision_maker_infrastructure b/adore_ros2_nodes/decision_maker_infrastructure
deleted file mode 160000
index c244a4ac..00000000
--- a/adore_ros2_nodes/decision_maker_infrastructure
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit c244a4acc8b008ad1d2a18269de250a293957419
diff --git a/adore_ros2_nodes/mission_control b/adore_ros2_nodes/mission_control
deleted file mode 160000
index 63b02754..00000000
--- a/adore_ros2_nodes/mission_control
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 63b02754aefb61260816056bbfdf8aaeca634f67
diff --git a/adore_ros2_nodes/simulated_remote_operator b/adore_ros2_nodes/simulated_remote_operator
deleted file mode 160000
index 7f7a05f8..00000000
--- a/adore_ros2_nodes/simulated_remote_operator
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7f7a05f8cbf4bdadc63e7165c4b62732eab64d88
diff --git a/adore_ros2_nodes/simulated_vehicle b/adore_ros2_nodes/simulated_vehicle
deleted file mode 160000
index 3bb1c835..00000000
--- a/adore_ros2_nodes/simulated_vehicle
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 3bb1c83532cc4876a0d5183767c8112f34f7b047
diff --git a/adore_ros2_nodes/trajectory_tracker b/adore_ros2_nodes/trajectory_tracker
deleted file mode 160000
index b530c69c..00000000
--- a/adore_ros2_nodes/trajectory_tracker
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit b530c69c4e4e55ac72b74e0752eed256d59a4133
diff --git a/adore_ros2_nodes/visualizer b/adore_ros2_nodes/visualizer
deleted file mode 160000
index f47cfabd..00000000
--- a/adore_ros2_nodes/visualizer
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit f47cfabd7a784cb475469322de3d3585ccb71ced
diff --git a/plugins/.gitkeep b/adore_scenarios/COLCON_IGNORE
similarity index 100%
rename from plugins/.gitkeep
rename to adore_scenarios/COLCON_IGNORE
diff --git a/tools/lichtblick/lichblick_layouts/Default.json b/adore_scenarios/assets/lichtblick_layouts/Default.json
similarity index 100%
rename from tools/lichtblick/lichblick_layouts/Default.json
rename to adore_scenarios/assets/lichtblick_layouts/Default.json
diff --git a/adore_scenarios/assets/odd/simulation_odd.json b/adore_scenarios/assets/odd/simulation_odd.json
new file mode 100644
index 00000000..facf82f8
--- /dev/null
+++ b/adore_scenarios/assets/odd/simulation_odd.json
@@ -0,0 +1,6 @@
+{
+ "max_speed": 70,
+ "minimum_road_width": 2.0,
+ "valid_hours_of_the_day": [0, 24],
+ "max_wind_intensity": 4
+}
diff --git a/adore_scenarios/scenario_helpers/ngc.py b/adore_scenarios/scenario_helpers/ngc.py
deleted file mode 100644
index 2a36088a..00000000
--- a/adore_scenarios/scenario_helpers/ngc.py
+++ /dev/null
@@ -1,109 +0,0 @@
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-from launch_ros.actions import Node
-import os
-from scenario_helpers.simulation_planner_params import planner_params
-from scenario_helpers.ngc_controller_params import ngc_pid_params
-
-def create_ngc_nodes(
- namespace: str,
- goal_position: tuple[float, float],
- map_file: str,
- debug: bool = False,
- optinlc_route_following: bool = True,
- controller: int = 1,
- custom_start_pose: tuple[float, float, float] | None = None,
- request_assistance_polygon: list[float] = [0.0,0.0]) -> list[Node]:
-
- launch_file_dir = os.path.dirname(os.path.realpath(__file__))
- vehicle_param = os.path.abspath(os.path.join(launch_file_dir, "../assets/vehicle_params/"))
- model_file = vehicle_param + "/NGC.json"
- x, y, psi = custom_start_pose
- goal_x, goal_y = goal_position
-
- nodes = [
- Node(
- package='adore_bob_interface',
- namespace='ego_vehicle',
- executable='adore_bob_interface',
- name='adore_bob_interface',
- parameters=[
- {"publish_traffic_participants": True},
- {"vehicle_name": "ngc"},
- ],
- #output={'both': 'log'},
- ),
- Node(
- package='adore_v2x_interface',
- namespace='ego_vehicle',
- executable='ego_v2x_interface_node',
- name='adore_v2x_interface',
- parameters=[
- {"ego_v2x_id": 222},
- ],
-
- ),
- Node(
- package='adore_vehicle_interface',
- namespace='ego_vehicle',
- executable='vehicle_udp_gateway_node',
- name='vehicle_udp_gateway_node',
- parameters=[
- {"VehicleID":"NGC"},
- ],
- shell=False,
- output="screen",
- prefix=['xterm -e'],
- ),
- Node(
- package="mission_control",
- namespace=namespace,
- executable="mission_control",
- name="mission_control",
- parameters=[
- {"map file": map_file},
- {"goal_position_x": goal_x},
- {"goal_position_y": goal_y},
- ],
- ),
- Node(
- package="decision_maker",
- namespace=namespace,
- executable="decision_maker",
- name="decision_maker",
- parameters=[
- {"debug_mode_active": debug},
- {"optinlc_route_following": optinlc_route_following},
- {"planner_settings_keys": list(planner_params.keys())},
- {"planner_settings_values": list(planner_params.values())},
- {"request_assistance_polygon": request_assistance_polygon},
- {"vehicle_model_file": model_file}
- ],
- # output={"both": "log"},
- ),
- Node(
- package="trajectory_tracker",
- namespace=namespace,
- executable="trajectory_tracker_node",
- name="trajectory_tracker",
- parameters=[
- {"set_controller": controller},
- {"controller_settings_keys": list(ngc_pid_params.keys())},
- {"controller_settings_values": list(ngc_pid_params.values())},
- {"vehicle_model_file": model_file},
- ],
- ),
- ]
-
- return nodes
diff --git a/adore_scenarios/scenario_helpers/simulated_infrastructure.py b/adore_scenarios/scenario_helpers/simulated_infrastructure.py
deleted file mode 100644
index e417d132..00000000
--- a/adore_scenarios/scenario_helpers/simulated_infrastructure.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-from launch_ros.actions import Node
-
-# example only
-simulated_v2x_topic_parameters = {
- "planned_traffic_out_topic": "v2x_planned_traffic",
- "traffic_participant_in_topic": "v2x_traffic_participant",
-}
-topic_parameters = {
- "planned_traffic_out_topic": "/planned_traffic",
- "traffic_participant_in_topic": "traffic_participant",
-}
-
-
-def with_topic_params(*param_dicts: dict, topic_params) -> list[dict]:
-
- return list(param_dicts) + [topic_params]
-
-
-def create_infrastructure_nodes(position: tuple[float, float],
- polygon: list[float],
- map_file: str,
- simulated_v2x_mode: bool = False,
- debug=True) -> list[Node]:
- x, y = position
- topic_params = topic_parameters
- if simulated_v2x_mode:
- topic_params = simulated_v2x_topic_parameters
-
- return [
- Node(
- package='decision_maker_infrastructure',
- namespace='infrastructure',
- executable='decision_maker_infrastructure',
- name='decision_maker_infrastructure',
- parameters=with_topic_params(
- {"map file": map_file},
- {"infrastructure_position_x": x},
- {"infrastructure_position_y": y},
- {"debug": debug},
- {"validity_polygon": polygon},
- {"multi_agent_PID_settings_keys": ["preview_distance", "k_yaw", "k_distance"]
- },
- {"multi_agent_PID_settings_values": [4.5, 2.0, 1.0]
- }, topic_params=topic_params
- ),
- )
- ]
diff --git a/adore_scenarios/scenario_helpers/simulated_vehicle.py b/adore_scenarios/scenario_helpers/simulated_vehicle.py
deleted file mode 100644
index fd0e530b..00000000
--- a/adore_scenarios/scenario_helpers/simulated_vehicle.py
+++ /dev/null
@@ -1,291 +0,0 @@
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-from __future__ import annotations
-
-from typing import Any, Dict, List, Optional, Tuple
-
-from launch import Action
-from launch_ros.actions import ComposableNodeContainer, Node
-from launch_ros.descriptions import ComposableNode
-
-from scenario_helpers.simulation_planner_params import planner_params
-from scenario_helpers.simulation_controller_params import simulation_pid_params
-
-# Example only
-SIMULATED_V2X_TOPIC_PARAMETERS: Dict[str, str] = {
- "topic_infrastructure_participants": "v2x_planned_traffic",
-}
-STANDARD_TOPIC_PARAMETERS: Dict[str, str] = {
- "topic_infrastructure_participants": "/planned_traffic",
-}
-
-
-def with_topic_params(
- *param_dicts: Dict[str, Any],
- topic_params: Dict[str, Any],
-) -> List[Dict[str, Any]]:
- """Return a list of parameter dictionaries ending with topic parameters.
-
- Enforces topic_params as keyword-only for clarity.
- """
- return list(param_dicts) + [topic_params]
-
-
-def _build_composable_components(
- *,
- namespace: str,
- x: float,
- y: float,
- psi: float,
- controllable: bool,
- vehicle_id: int,
- v2x_id: int,
- map_file: str,
- model_file: str,
- goal_x: float,
- goal_y: float,
- local_map_size: float,
- request_assistance_polygon: List[float],
- topic_params: Dict[str, Any],
- debug: bool,
- controller: int,
-) -> List[ComposableNode]:
- """Create composable components for the simulated vehicle stack."""
- return [
- ComposableNode(
- package="simulated_vehicle",
- plugin="adore::simulated_vehicle::SimulatedVehicleNode",
- name="simulated_vehicle",
- namespace=namespace,
- parameters=with_topic_params(
- {"set_start_position_x": x},
- {"set_start_position_y": y},
- {"set_start_psi": psi},
- {"controllable": controllable},
- {"vehicle_id": vehicle_id},
- {"v2x_id": v2x_id},
- {"vehicle_model_file": model_file},
- topic_params=topic_params,
- ),
- ),
- ComposableNode(
- package="mission_control",
- plugin="adore::MissionControlNode",
- name="mission_control",
- namespace=namespace,
- parameters=with_topic_params(
- {"map file": map_file}, # kept literal key as in original
- {"goal_position_x": goal_x},
- {"goal_position_y": goal_y},
- {"local_map_size": local_map_size},
- {"request_assistance_polygon": request_assistance_polygon},
- topic_params=topic_params,
- ),
- ),
- ComposableNode(
- package="decision_maker",
- plugin="adore::DecisionMaker",
- name="decision_maker",
- namespace=namespace,
- parameters=with_topic_params(
- {"debug_mode_active": debug},
- {"planner_settings_keys": list(planner_params.keys())},
- {"planner_settings_values": list(planner_params.values())},
- {"vehicle_model_file": model_file},
- {"v2x_id": v2x_id},
- topic_params=topic_params,
- ),
- ),
- ComposableNode(
- package="trajectory_tracker",
- plugin="adore::TrajectoryTrackerNode",
- name="trajectory_tracker",
- namespace=namespace,
- parameters=with_topic_params(
- {"set_controller": controller},
- {"controller_settings_keys": list(
- simulation_pid_params.keys())},
- {"controller_settings_values": list(
- simulation_pid_params.values())},
- {"vehicle_model_file": model_file},
- topic_params=topic_params,
- ),
- ),
- ]
-
-
-def _build_standalone_nodes(
- *,
- namespace: str,
- x: float,
- y: float,
- psi: float,
- controllable: bool,
- vehicle_id: int,
- v2x_id: int,
- map_file: str,
- model_file: str,
- goal_x: float,
- goal_y: float,
- local_map_size: float,
- request_assistance_polygon: List[float],
- topic_params: Dict[str, Any],
- debug: bool,
- controller: int,
-) -> List[Action]:
- """Create standalone ROS 2 nodes for the simulated vehicle stack."""
- return [
- Node(
- package="simulated_vehicle",
- executable="simulated_vehicle",
- name="simulated_vehicle",
- namespace=namespace,
- parameters=with_topic_params(
- {"set_start_position_x": x},
- {"set_start_position_y": y},
- {"set_start_psi": psi},
- {"controllable": controllable},
- {"vehicle_id": vehicle_id},
- {"v2x_id": v2x_id},
- {"vehicle_model_file": model_file},
- topic_params=topic_params,
- ),
- ),
- Node(
- package="mission_control",
- executable="mission_control",
- name="mission_control",
- namespace=namespace,
- parameters=with_topic_params(
- {"map file": map_file}, # kept literal key as in original
- {"goal_position_x": goal_x},
- {"goal_position_y": goal_y},
- {"local_map_size": local_map_size},
- {"request_assistance_polygon": request_assistance_polygon},
- topic_params=topic_params,
- ),
- ),
- Node(
- package="decision_maker",
- executable="decision_maker",
- name="decision_maker",
- namespace=namespace,
- parameters=with_topic_params(
- {"debug_mode_active": debug},
- {"planner_settings_keys": list(planner_params.keys())},
- {"planner_settings_values": list(planner_params.values())},
- {"vehicle_model_file": model_file},
- {"v2x_id": v2x_id},
- topic_params=topic_params,
- ),
- ),
- Node(
- package="trajectory_tracker",
- executable="trajectory_tracker",
- name="trajectory_tracker",
- namespace=namespace,
- parameters=with_topic_params(
- {"set_controller": controller},
- {"controller_settings_keys": list(
- simulation_pid_params.keys())},
- {"controller_settings_values": list(
- simulation_pid_params.values())},
- {"vehicle_model_file": model_file},
- topic_params=topic_params,
- ),
- ),
- ]
-
-
-def create_simulated_vehicle_nodes(
- namespace: str,
- start_pose: Tuple[float, float, float],
- goal_position: Tuple[float, float],
- vehicle_id: int,
- map_file: str,
- model_file: str,
- debug: bool = False,
- controller: int = 1,
- controllable: bool = True,
- v2x_id: int = 0,
- simulated_v2x_mode: bool = False,
- request_assistance_polygon: Optional[List[float]] = None,
- composable: bool = False,
- local_map_size: float = 100.0,
-) -> List[Action]:
- """Create simulated vehicle nodes or components for ROS 2 launch.
-
- Returns a list of launch Actions (either a container or individual Nodes).
- """
- x, y, psi = start_pose
- goal_x, goal_y = goal_position
-
- if request_assistance_polygon is None:
- request_assistance_polygon = [0.0, 0.0]
-
- topic_params = (
- SIMULATED_V2X_TOPIC_PARAMETERS if simulated_v2x_mode else STANDARD_TOPIC_PARAMETERS
- )
-
- if composable:
- components = _build_composable_components(
- namespace=namespace,
- x=x,
- y=y,
- psi=psi,
- controllable=controllable,
- vehicle_id=vehicle_id,
- v2x_id=v2x_id,
- map_file=map_file,
- model_file=model_file,
- goal_x=goal_x,
- goal_y=goal_y,
- local_map_size=local_map_size,
- request_assistance_polygon=request_assistance_polygon,
- topic_params=topic_params,
- debug=debug,
- controller=controller,
-
- )
-
- container = ComposableNodeContainer(
- name="sim_container",
- namespace="",
- package="rclcpp_components",
- executable="component_container_mt",
- composable_node_descriptions=components,
- output="screen",
- )
- return [container]
-
- # Standalone nodes
- return _build_standalone_nodes(
- namespace=namespace,
- x=x,
- y=y,
- psi=psi,
- controllable=controllable,
- vehicle_id=vehicle_id,
- v2x_id=v2x_id,
- map_file=map_file,
- model_file=model_file,
- goal_x=goal_x,
- goal_y=goal_y,
- local_map_size=local_map_size,
- request_assistance_polygon=request_assistance_polygon,
- topic_params=topic_params,
- debug=debug,
- controller=controller,
-
- )
diff --git a/adore_scenarios/scenario_helpers/visualizer.py b/adore_scenarios/scenario_helpers/visualizer.py
deleted file mode 100644
index c3004520..00000000
--- a/adore_scenarios/scenario_helpers/visualizer.py
+++ /dev/null
@@ -1,65 +0,0 @@
-# ********************************************************************************
-# Copyright (c) 2025 Contributors to the Eclipse Foundation
-#
-# See the NOTICE file(s) distributed with this work for additional
-# information regarding copyright ownership.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License 2.0 which is available at
-# https://www.eclipse.org/legal/epl-2.0
-#
-# SPDX-License-Identifier: EPL-2.0
-# ********************************************************************************
-
-from launch_ros.actions import Node
-import os
-
-
-def create_visualization_nodes(whitelist, asset_folder, visualization_offset, ns="visualizer", port=9090, send_buffer_limit=500000000):
- """
- Returns a list of nodes for visualization (foxglove bridge and visualizer).
-
- Parameters:
- whitelist (list[str]): List of topic namespace prefixes to visualize.
- asset_folder (str): Path to folder containing map image assets.
- port (int): Port for Foxglove Bridge.
- send_buffer_limit (int): Buffer limit for Foxglove Bridge.
-
- Returns:
- list[Node]: Launchable ROS 2 Node actions.
- """
- return [
- Node(
- package='rosapi',
- executable='rosapi_node',
- name='rosapi',
- output='screen'
- ),
- Node(
- package='rosbridge_server',
- executable='rosbridge_websocket',
- name='rosbridge_websocket',
- output='screen',
- parameters=[
- {'port': port},
- {'address': '0.0.0.0'},
- {'use_compression': False},
- {'fragment_timeout': 600},
- {'delay_between_messages': 0.0},
- {'max_message_size': 10000000},
- {'unregister_timeout': 10.0}
- ]
- ),
- Node(
- package='visualizer',
- namespace=ns,
- executable='visualizer',
- name='visualizer',
- parameters=[
- {"asset folder": asset_folder},
- {"whitelist": whitelist},
- {"visualization_offset_x": visualization_offset[0]},
- {"visualization_offset_y": visualization_offset[1]},
- ]
- )
- ]
diff --git a/adore_scenarios/simulation_scenarios b/adore_scenarios/simulation_scenarios
index 71f63762..66572820 160000
--- a/adore_scenarios/simulation_scenarios
+++ b/adore_scenarios/simulation_scenarios
@@ -1 +1 @@
-Subproject commit 71f637620f8cf4a00d455e3b5e514a55872dcb72
+Subproject commit 665728203c4cc78b3e0215b76ceca4e80ae29467
diff --git a/ci.env b/ci.env
new file mode 100644
index 00000000..bb3d1bf4
--- /dev/null
+++ b/ci.env
@@ -0,0 +1,18 @@
+project=adore_cli
+build_directory="build"
+log_directory=".log"
+docker_image="$(make image_$project)"
+
+docker_images=(
+ $(make images_adore_cli)
+ $(cd tools/lichtblick && make lichtblick_image)
+)
+
+build_artifacts=(
+ #${build_directory}/adore_cli_*.tar.gz
+)
+
+log_files=(
+ "${log_directory}/${project}.ci.log"
+ "${log_directory}/adore_api.log"
+)
diff --git a/configuring_adore.md b/configuring_adore.md
new file mode 100644
index 00000000..91399bd9
--- /dev/null
+++ b/configuring_adore.md
@@ -0,0 +1,22 @@
+# Configuring ADORe
+
+ADORe and the ADORe CLI can be configured through environment variables defined in [`adore.env`](./adore.env).
+
+## Configuration File
+
+The configuration file can be used to configure control ADORe's behavior:
+
+- **Build Configuration**: Control parallel vs sequential builds
+- **API Configuration**: Enable/disable and configure the ADORe API server
+- **Logging Configuration**: Configure rsyslog server and forwarding
+- **General Settings**: File size limits, paths, and other runtime parameters
+- **ROS Settings**: ROS Domain ID, ROS logging directory
+
+## Usage
+
+The environment variables are automatically sourced by ADORe components and
+build scripts. Modify the values in `adore.env` and restart the ADORe CLI with
+`make stop && make start` or `make restart` to apply changes.
+
+See the `adore.env` configuration file for detailed documentation on each
+variable and its available options.
diff --git a/documentation/Makefile b/documentation/Makefile
new file mode 100644
index 00000000..7c32a568
--- /dev/null
+++ b/documentation/Makefile
@@ -0,0 +1,116 @@
+SHELL:=/bin/bash
+
+.DEFAULT_GOAL := help
+
+ROOT_DIR:=$(shell dirname "$(realpath $(firstword $(MAKEFILE_LIST)))")
+
+.EXPORT_ALL_VARIABLES:
+DOCKER_BUILDKIT?=1
+DOCKER_CONFIG?=
+
+USER := $(shell whoami)
+UID := $(shell id -u)
+GID := $(shell id -g)
+
+.PHONY: help
+help:
+ @printf "Usage: make \033[36m\033[0m\n%s\n" "$$(awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-10s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) | sort | uniq)"
+
+.PHONY: all
+all: clean build
+
+.PHONY: build
+build: build_gh-pages ## Build ADORe documentation
+
+.PHONY: update_submodules
+update_submodules:
+ git submodule update --init --recusrive || true
+
+.PHONY: build_doxygen_docs
+build_doxygen_docs: stop ## Build doxygen documentation. Requires doxygen to be installed
+ @command -v doxygen >/dev/null 2>&1 || { echo >&2 "Error: doxygen is not installed. Install with: 'sudo apt-get install -y doxygen'."; exit 1; }
+ cd doxygen && doxygen Doxyfile-project.cfg
+
+.PHONY: build_sphinx_docs
+build_sphinx_docs: ## Build sphinx documentation
+ command -v sphinx-build >/dev/null 2>&1 || { echo >&2 "Error: sphinx-build is not installed. Install with: 'sudo apt-get install -y sphinx'."; exit 1; }
+ python -c "import breathe" 2>/dev/null || { echo >&2 "Error: sphinx extension breathe is not installed. Install with: 'python3 -m pip install breathe'."; exit 1; }
+ python -c "import exhale" 2>/dev/null || { echo >&2 "Error: sphinx extension exhale is not installed. Install with: 'python3 -m pip install exhale'."; exit 1; }
+
+ cd sphinx && make html
+
+.PHONY: build_gh-pages_docnado
+build_gh-pages_docnado: stop clean build_doxygen_docs build_docnado_docs
+ mkdir -p docs
+ cp -r landing_page/* docs/
+ cp -r docnado/html docs/docnado
+ cp -r doxygen/generated_doxygen_documentation/html docs/docnado/w/generated_doxygen_documentation
+
+.PHONY: build_gh-pages
+build_gh-pages: stop build_doxygen_docs build_mkdocs
+ rm -rf docs
+ mkdir -p docs
+ cp -r landing_page/* docs/
+ cp -r mkdocs/site docs/mkdocs
+ cp -r doxygen/generated_doxygen_documentation/html docs/generated_doxygen_documentation
+
+.PHONY: build_mkdocs
+build_mkdocs: stop update_submodules ## Build mkdocs
+ rm mkdocs/docs -rf
+ rm mkdocs/site -rf
+ bash populate_module_readme_docs.sh
+ bash populate_ros_node_summary_docs.sh
+ bash copy_module_documents.sh
+ cp -r technical_reference_manual mkdocs/docs
+ cd mkdocs && docker build -f Dockerfile.mkdocs -t mkdocs:latest .
+ docker run --user ${UID}:${GID} -v ${ROOT_DIR}/mkdocs:/tmp/docs mkdocs:latest
+
+.PHONY: serve_nginx
+serve_nginx: stop build
+ docker rm --force adore-docs
+ docker run -it --rm --name "adore-docs" -d -p 80:80 -v ${ROOT_DIR}/docs:/usr/share/nginx/html nginx:latest
+ sleep 1s
+ firefox http://localhost
+ @echo "Docs can be found at: http://localhost"
+
+.PHONY: publish_gh-pages
+publish_gh-pages:
+ bash publish_gh-pages.sh
+
+.PHONY: publish
+publish: publish_gh-pages ## Publish docs to gh-pages branch review the "publish.env" file before publishing
+
+.PHONY: serve
+serve: stop serve_nginx ## Build and serve docs to http://localhost
+
+.PHONY: stop
+stop: ## Stop the adore_docs docker container which is started by "make serve"
+ docker stop adore-docs || true
+ docker rm --force adore-docs || true
+
+
+.PHONY: watch
+watch:
+ while inotifywait -e modify -e create -e delete -r .; do \
+ make serve; \
+ sleep 1s; \
+ done
+
+.PHONY: clean
+clean: stop
+ rm -rf docs || true
+ rm -rf mkdocs/docs || true
+ rm mkdocs/site -rf
+ rm doxygen/generated_doxygen_documentation/* -rf
+ rm -rf technical_reference_manual/generated/
+
+.PHONY: spellcheck
+spellcheck: clean ## Start an interactive spell checking session with the tool aspell
+ docker build -f Dockerfile.aspell -t aspell .
+ docker run -it --rm -u "${UID}:${GID}" -v "$$(pwd):/mnt" aspell 'find /mnt/technical_reference_manual -name "**.md" -exec bash -c "aspell check --encoding=utf-8 --mode=markdown --home-dir=/mnt --personal=/mnt/.aspell.en.pws {}" \;'
+
+.PHONY: lint
+lint: clean ## Lint aka spell check the markdown files
+ docker build -f Dockerfile.aspell -t aspell .
+ docker run -u "${UID}:${GID}" -v $$(pwd):/mnt aspell:latest "python3 spellcheck.py"
+
diff --git a/documentation/copy_module_documents.sh b/documentation/copy_module_documents.sh
new file mode 100644
index 00000000..a8b67c6f
--- /dev/null
+++ b/documentation/copy_module_documents.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+
+SCRIPT_DIRECTORY="$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)"
+SOURCE_DIRECTORY="$(realpath "${SCRIPT_DIRECTORY}/..")"
+
+GENERATED_DIRECTORY="technical_reference_manual/generated/"
+mkdir -p "${GENERATED_DIRECTORY}"
+
+cp "${SOURCE_DIRECTORY}/CODE_OF_CONDUCT.md" "${GENERATED_DIRECTORY}"
+cp "${SOURCE_DIRECTORY}/CONTRIBUTING.md" "${GENERATED_DIRECTORY}"
+cp "${SOURCE_DIRECTORY}/NOTICE.md" "${GENERATED_DIRECTORY}"
+
+cp -r "${SOURCE_DIRECTORY}/ros2_workspace/src/adore_ros2_msgs" "${GENERATED_DIRECTORY}"
+
+cp -r "${SOURCE_DIRECTORY}/ros2_workspace/src/adore_interfaces/carla_bridge" "${GENERATED_DIRECTORY}"
+cp -r "${SOURCE_DIRECTORY}/ros2_workspace/src/adore_interfaces/sumo_bridge" "${GENERATED_DIRECTORY}"
+
+mkdir -p "${GENERATED_DIRECTORY}/api"
+cp -r "${SOURCE_DIRECTORY}/tools/adore_api" "${GENERATED_DIRECTORY}/api"
+
+mkdir -p "${GENERATED_DIRECTORY}/configuring_adore"
+cp "${SOURCE_DIRECTORY}/adore.env" "${GENERATED_DIRECTORY}/configuring_adore/"
+cp -r "${SOURCE_DIRECTORY}/configuring_adore.md" "${GENERATED_DIRECTORY}/configuring_adore/"
+
+cp -r "${SOURCE_DIRECTORY}/adore_cli" "${GENERATED_DIRECTORY}"
+
+cp -r "${SOURCE_DIRECTORY}/vendor/adore_model_checker" "${GENERATED_DIRECTORY}"
+
+mkdir -p "${GENERATED_DIRECTORY}/visualization"
+cp -r "${SOURCE_DIRECTORY}/tools/lichtblick" "${GENERATED_DIRECTORY}/visualization"
+rm -rf "${GENERATED_DIRECTORY}/visualization/lichtblick/lichtblick"
+
+cp -r "${SOURCE_DIRECTORY}/THIRD-PARTY.md" "${GENERATED_DIRECTORY}"
+cp -r "${SOURCE_DIRECTORY}/NOTICE.md" "${GENERATED_DIRECTORY}"
+
+find "${GENERATED_DIRECTORY}" -type f ! \( -name '*.md' -o -name '*.yaml' -o -name '*.yml' -o -name '*.env' \) -delete
diff --git a/documentation/doxygen/.gitignore b/documentation/doxygen/.gitignore
new file mode 100644
index 00000000..448118db
--- /dev/null
+++ b/documentation/doxygen/.gitignore
@@ -0,0 +1 @@
+.generated**
diff --git a/documentation/doxygen/Doxyfile-project.cfg b/documentation/doxygen/Doxyfile-project.cfg
new file mode 100644
index 00000000..37ad0df2
--- /dev/null
+++ b/documentation/doxygen/Doxyfile-project.cfg
@@ -0,0 +1,74 @@
+#********************************************************************************
+#* Copyright (C) 2017-2020 German Aerospace Center (DLR).
+#* Eclipse ADORe, Automated Driving Open Research https://eclipse.org/adore
+#*
+#* This program and the accompanying materials are made available under the
+#* terms of the Eclipse Public License 2.0 which is available at
+#* http://www.eclipse.org/legal/epl-2.0.
+#*
+#* SPDX-License-Identifier: EPL-2.0
+#*
+#* Contributors:
+#* Thomas Lobig
+#********************************************************************************
+
+@INCLUDE = "./Doxyfile.cfg"
+GENERATE_HTML = YES
+GENERATE_XML = YES
+GENERATE_XML2DOT = YES
+GENERATE_XML = YES
+OUTPUT_DIRECTORY = "./generated_doxygen_documentation"
+
+# Project Stuff
+PROJECT_NAME = "ADORe"
+PROJECT_BRIEF = "ADORe is a modular open source software library and toolkit for decision making, planning, control and simulation of automated vehicles"
+
+# Inputs
+INPUT = "./../../ros2_workspace/src"
+
+EXCLUDE_PATTERNS = */build/*
+EXCLUDE_PATTERNS += */external/*
+EXCLUDE_PATTERNS += */vendor/*
+
+RECURSIVE = YES
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.py
+
+UML_LOOK = YES
+
+
+HAVE_DOT = YES
+DOT_CLEANUP = NO
+
+GRAPHICAL_HIERARCHY = YES
+GENERATE_TREEVIEW = YES
+
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+EXTRACT_ANON_NSPACES = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = YES
+EXTRACT_PACKAGE = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+
+CALL_GRAPH = YES
+CALLER_GRAPH = YES
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+INHERITANCE_GRAPH = YES
+CLASS_DIAGRAMS = YES
+DISABLE_INDEX = YES
+
diff --git a/documentation/doxygen/Doxyfile.cfg b/documentation/doxygen/Doxyfile.cfg
new file mode 100644
index 00000000..4e042b04
--- /dev/null
+++ b/documentation/doxygen/Doxyfile.cfg
@@ -0,0 +1,2579 @@
+# Doxyfile 1.8.17
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "ADORe"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY =
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all generated output in the proper direction.
+# Possible values are: None, LTR, RTL and Context.
+# The default value is: None.
+
+OUTPUT_TEXT_DIRECTION = None
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by doxygen.
+# The default value is: NO.
+
+JAVADOC_BANNER = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines (in the resulting output). You can put ^^ in the value part of an
+# alias to insert a newline as if a physical newline was in the original file.
+# When you need a literal { or } or , in the value part of an alias you have to
+# escape them by means of a backslash (\), this can lead to conflicts with the
+# commands \{ and \} for these it is advised to use the version @{ and @} or use
+# a double escape (\\{ and \\})
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat
+# .inc files as Fortran files (default is PHP), and .f files as C (default is
+# Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 5.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS = 5
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# declarations. If set to NO, these declarations will be included in the
+# documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# (including Cygwin) ands Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if ... \endif and \cond
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation. If
+# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT =
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
+# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen
+# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd,
+# *.vhdl, *.ucf, *.qsf and *.ice.
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.idl \
+ *.ddl \
+ *.odl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.cs \
+ *.d \
+ *.php \
+ *.php4 \
+ *.php5 \
+ *.phtml \
+ *.inc \
+ *.m \
+ *.markdown \
+ *.md \
+ *.mm \
+ *.dox \
+ *.doc \
+ *.txt \
+ *.py \
+ *.pyw \
+ *.f90 \
+ *.f95 \
+ *.f03 \
+ *.f08 \
+ *.f \
+ *.for \
+ *.tcl \
+ *.vhd \
+ *.vhdl \
+ *.ucf \
+ *.qsf \
+ *.ice
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+#
+#
+# where is the value of the INPUT_FILTER tag, and is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# entity all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS =
+
+# If clang assisted parsing is enabled you can provide the clang parser with the
+# path to the compilation database (see:
+# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files
+# were built. This is equivalent to specifying the "-p" option to a clang tool,
+# such as clang-check. These options will then be passed to the parser.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+
+CLANG_DATABASE_PATH =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = NO
+
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via JavaScript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have JavaScript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: https://developer.apple.com/xcode/), introduced with OSX
+# 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
+
+FORMULA_MACROFILE =
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment.
+# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use + S
+# (what the is depends on the OS and browser, but it is typically
+# , /, or both). Inside the search box use the to jump into the search results window, the results can be navigated
+# using the . Press to select an item or to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing +. Also here use the
+# to select a filter and or to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using JavaScript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: https://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME =
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP = NO
+
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EMOJI_DIRECTORY =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/documentation/index.md b/documentation/index.md
deleted file mode 100644
index af1914a2..00000000
--- a/documentation/index.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: Welcome
-description: ADORe is the Automated Driving Open Research platform for autonomous driving simulation, verification, and development.
-hide:
- - navigation
- - toc
- - navigation.title
- - navigation.tabs
- - navigation.sections
- - navigation.expand
- - navigation.path
- - toc.integrate
----
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ADORe (Automated Driving Open Research) is a platform for autonomous driving research, development,
- and verification. It combines reproducible experiments, multi-simulator integration, and a modular ROS 2 / C++ codebase
- to support both users running scenarios and developers extending the system.
-
-
-
-
-
diff --git a/documentation/landing_page/css/adore.css b/documentation/landing_page/css/adore.css
new file mode 100644
index 00000000..79f87dd0
--- /dev/null
+++ b/documentation/landing_page/css/adore.css
@@ -0,0 +1,343 @@
+@import url('https://fonts.googleapis.com/css2?family=DM+Mono:wght@400;500&family=Barlow:wght@500;600;700;900&display=swap');
+
+:root {
+ --teal: #4DB6AC;
+ --teal-dim: #64bab1;
+ --teal-glow: rgba(77, 182, 172, 0.25);
+
+ --bg: #1a1f26; /* Deep charcoal */
+ --surface: #232931;
+ --surface-2: #2e3640;
+
+ /* Borders */
+ --border: rgba(77, 182, 172, 0.2);
+ --border-mid: rgba(77, 182, 172, 0.4);
+
+ /* Text: */
+ --text: #e1e8ed;
+ --text-dim: #90a4ae;
+ --text-bright: #ffffff;
+}
+
+
+*, *::before, *::after { box-sizing: border-box; }
+
+html, body {
+ width: 100%;
+ min-height: 100%;
+ margin: 0;
+ padding: 0;
+ background-color: var(--bg);
+ color: var(--text);
+ overflow-x: hidden;
+}
+
+body {
+ font-family: 'Barlow', 'Helvetica Neue', sans-serif;
+ font-size: 16px;
+ font-weight: 500;
+ line-height: 1.75;
+ background-image:
+ linear-gradient(var(--border) 1px, transparent 1px),
+ linear-gradient(90deg, var(--border) 1px, transparent 1px);
+ background-size: 48px 48px;
+ background-attachment: fixed;
+}
+
+/* ── Navbar ─────────────────────────────────────────── */
+
+header { display: contents; }
+
+.navbar {
+ background-color: rgba(10, 12, 15, 0.9) !important;
+ backdrop-filter: blur(18px);
+ -webkit-backdrop-filter: blur(18px);
+ border-bottom: 1px solid var(--border);
+ padding: 0 clamp(1rem, 4vw, 2.5rem);
+ height: 64px;
+}
+
+.navbar-brand {
+ margin-right: auto;
+ margin-left: 0;
+ opacity: 0.9;
+ transition: opacity 0.2s;
+}
+.navbar-brand:hover { opacity: 1; }
+.navbar-brand img { height: 28px; width: auto; }
+
+.navbar-toggler {
+ border: 1px solid var(--border-mid);
+ border-radius: 4px;
+ padding: 6px 10px;
+}
+.navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%234DB6AC' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+
+.navbar-nav { gap: 0; }
+
+.nav-link {
+ font-family: 'Barlow', sans-serif;
+ font-size: 0.82rem;
+ font-weight: 700;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ color: var(--text-dim) !important;
+ padding: 0.4rem 1rem !important;
+ text-decoration: none;
+ position: relative;
+ transition: color 0.2s;
+}
+.nav-link::after {
+ content: '';
+ position: absolute;
+ bottom: -1px;
+ left: 1rem;
+ right: 1rem;
+ height: 2px;
+ background: var(--teal);
+ transform: scaleX(0);
+ transition: transform 0.25s ease;
+}
+.nav-link:hover { color: var(--teal) !important; }
+.nav-link:hover::after { transform: scaleX(1); }
+
+/* ── Sections ────────────────────────────────────────── */
+
+.container-fluid { padding: 0; }
+
+.section {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding: clamp(80px, 12vh, 140px) clamp(1.5rem, 8vw, 8rem);
+ background-color: transparent;
+ animation: fadeUp 0.45s ease both;
+}
+
+/* About: car viewer + text side by side */
+#about {
+ flex-direction: row;
+ align-items: center;
+ gap: clamp(2rem, 5vw, 5rem);
+ padding-right: clamp(1.5rem, 5vw, 5rem);
+}
+
+#about-content {
+ flex: 0 0 auto;
+ max-width: 480px;
+}
+
+#car-canvas-wrap {
+ flex: 1 1 auto;
+ min-width: 0;
+ height: clamp(280px, 44vw, 520px);
+ position: relative;
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ overflow: hidden;
+ background: var(--surface);
+ cursor: grab;
+}
+#car-canvas-wrap:active { cursor: grabbing; }
+#car-canvas-wrap canvas {
+ display: block;
+ width: 100% !important;
+ height: 100% !important;
+}
+
+#car-loading {
+ position: absolute;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.72rem;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+ color: var(--text-dim);
+ font-family: 'DM Mono', monospace;
+ pointer-events: none;
+}
+
+/* Scenario section: image + text */
+#scenario {
+ flex-direction: row;
+ align-items: center;
+ gap: clamp(2rem, 5vw, 5rem);
+}
+
+#scenario-image-wrap {
+ flex: 0 0 auto;
+ width: clamp(180px, 22vw, 280px);
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ overflow: hidden;
+ box-shadow: 0 0 40px rgba(77,182,172,0.08);
+}
+#scenario-image-wrap img {
+ display: block;
+ width: 100%;
+ height: auto;
+}
+
+#scenario-content { flex: 1 1 auto; max-width: 580px; }
+
+@keyframes fadeUp {
+ from { opacity: 0; transform: translateY(18px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* ── Title ───────────────────────────────────────────── */
+
+.title {
+ font-family: 'Barlow', sans-serif;
+ font-weight: 900;
+ font-size: clamp(2.6rem, 6vw, 5rem);
+ line-height: 1.0;
+ letter-spacing: -0.01em;
+ color: var(--text-bright);
+ margin: 0 0 clamp(1.5rem, 4vw, 2.5rem);
+ text-align: left;
+}
+
+/* ── Text / Body ─────────────────────────────────────── */
+
+.text {
+ display: block;
+ color: var(--text);
+ font-size: 1.05rem;
+ font-weight: 500;
+ line-height: 1.8;
+}
+
+.text p { margin-bottom: 1.2rem; }
+
+.text a {
+ color: var(--teal);
+ text-decoration: none;
+ font-weight: 600;
+ border-bottom: 1px solid transparent;
+ transition: border-color 0.2s, color 0.2s;
+}
+.text a:hover {
+ color: #80cbc4;
+ border-bottom-color: rgba(77,182,172,0.45);
+}
+
+.text .fas.fa-link {
+ font-size: 0.55em;
+ margin-left: 3px;
+ vertical-align: super;
+ color: var(--teal);
+ opacity: 0.75;
+}
+
+/* ── Quick Start inputs ──────────────────────────────── */
+
+.input-group {
+ display: flex;
+ width: 100%;
+ max-width: 100%;
+ border: 1px solid var(--border-mid);
+ border-radius: 6px;
+ overflow: hidden;
+ transition: border-color 0.2s, box-shadow 0.2s;
+ margin-bottom: 1.5rem;
+}
+.input-group:focus-within {
+ border-color: var(--teal);
+ box-shadow: 0 0 0 3px var(--teal-glow);
+}
+
+.one-liner-field input[type="text"] {
+ background-color: var(--surface-2);
+ color: var(--teal);
+ border: none;
+ font-family: 'DM Mono', monospace;
+ font-size: 0.8rem;
+ font-weight: 400;
+ padding: 0.75rem 1rem;
+ flex: 1;
+ min-width: 0;
+ outline: none;
+}
+
+.one-liner-field .input-group-append button {
+ background-color: var(--surface-2);
+ color: var(--text-dim);
+ border: none;
+ border-left: 1px solid var(--border-mid);
+ padding: 0 1.1rem;
+ cursor: pointer;
+ transition: color 0.2s, background-color 0.2s;
+ font-size: 0.9rem;
+}
+.one-liner-field .input-group-append button:hover {
+ background-color: var(--teal-glow);
+ color: var(--teal);
+}
+
+/* ── Footer ──────────────────────────────────────────── */
+
+footer {
+ position: fixed;
+ bottom: 0;
+ width: 100%;
+ height: 48px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: rgba(10, 12, 15, 0.92);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ border-top: 1px solid var(--border);
+ color: var(--text-dim);
+ font-size: 0.78rem;
+ font-weight: 600;
+ letter-spacing: 0.07em;
+ text-transform: uppercase;
+ z-index: 100;
+}
+
+footer a {
+ color: var(--text-dim);
+ text-decoration: none;
+ transition: color 0.2s;
+}
+footer a:hover { color: var(--teal); }
+
+/* ── Scrollbar ───────────────────────────────────────── */
+
+::-webkit-scrollbar { width: 5px; }
+::-webkit-scrollbar-track { background: var(--bg); }
+::-webkit-scrollbar-thumb { background: var(--surface-2); border-radius: 3px; }
+::-webkit-scrollbar-thumb:hover { background: var(--teal-dim); }
+
+/* ── Mobile ──────────────────────────────────────────── */
+
+@media (max-width: 900px) {
+ #about, #scenario {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+ #about-content, #scenario-content { max-width: 100%; }
+ #car-canvas-wrap { width: 100%; }
+ #scenario-image-wrap { width: clamp(140px, 50vw, 240px); }
+
+ .navbar-collapse {
+ background-color: var(--surface);
+ border-top: 1px solid var(--border);
+ padding: 0.75rem 0;
+ }
+ .nav-link::after { display: none; }
+ .section {
+ min-height: auto;
+ padding-top: 100px;
+ padding-bottom: 80px;
+ }
+ .title { font-size: clamp(2.2rem, 9vw, 3rem); }
+ .text { font-size: 1rem; }
+}
diff --git a/documentation/landing_page/favicon.ico b/documentation/landing_page/favicon.ico
new file mode 100644
index 00000000..e08ae683
Binary files /dev/null and b/documentation/landing_page/favicon.ico differ
diff --git a/documentation/landing_page/img/adore_categories_overview.svg b/documentation/landing_page/img/adore_categories_overview.svg
new file mode 100644
index 00000000..1b0f70ac
--- /dev/null
+++ b/documentation/landing_page/img/adore_categories_overview.svg
@@ -0,0 +1,4 @@
+
+
+
+Simulation & visualization interfaces
Hardware & sensor interfaces
Cooperative route planning
Cooperative trajectory planning
\ No newline at end of file
diff --git a/documentation/landing_page/img/adore_logo.png b/documentation/landing_page/img/adore_logo.png
new file mode 100644
index 00000000..14d1c2a2
Binary files /dev/null and b/documentation/landing_page/img/adore_logo.png differ
diff --git a/documentation/landing_page/img/adore_logo.svg b/documentation/landing_page/img/adore_logo.svg
new file mode 100644
index 00000000..5df6e976
--- /dev/null
+++ b/documentation/landing_page/img/adore_logo.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/documentation/landing_page/img/adore_logo_favicon.png b/documentation/landing_page/img/adore_logo_favicon.png
new file mode 100644
index 00000000..b9fce189
Binary files /dev/null and b/documentation/landing_page/img/adore_logo_favicon.png differ
diff --git a/documentation/landing_page/img/adore_logo_square.png b/documentation/landing_page/img/adore_logo_square.png
new file mode 100644
index 00000000..4846ce84
Binary files /dev/null and b/documentation/landing_page/img/adore_logo_square.png differ
diff --git a/documentation/mkdocs/img/adore_logo_white.png b/documentation/landing_page/img/adore_logo_white.png
similarity index 100%
rename from documentation/mkdocs/img/adore_logo_white.png
rename to documentation/landing_page/img/adore_logo_white.png
diff --git a/documentation/landing_page/img/adore_maad.svg b/documentation/landing_page/img/adore_maad.svg
new file mode 100644
index 00000000..121bb4bf
--- /dev/null
+++ b/documentation/landing_page/img/adore_maad.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/documentation/landing_page/img/adore_saad.svg b/documentation/landing_page/img/adore_saad.svg
new file mode 100644
index 00000000..312622f6
--- /dev/null
+++ b/documentation/landing_page/img/adore_saad.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/documentation/landing_page/img/adore_saad_structure.svg b/documentation/landing_page/img/adore_saad_structure.svg
new file mode 100644
index 00000000..caf68617
--- /dev/null
+++ b/documentation/landing_page/img/adore_saad_structure.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/documentation/landing_page/img/background.png b/documentation/landing_page/img/background.png
new file mode 100644
index 00000000..4db192b3
Binary files /dev/null and b/documentation/landing_page/img/background.png differ
diff --git a/documentation/landing_page/img/car_model.dae b/documentation/landing_page/img/car_model.dae
new file mode 100644
index 00000000..75b0e0ee
--- /dev/null
+++ b/documentation/landing_page/img/car_model.dae
@@ -0,0 +1,1634 @@
+
+
+
+
+ Blender User
+ Blender 4.2.0 commit date:2024-07-16, commit time:06:20, hash:a51f293548ad
+
+ 2025-02-21T13:32:47
+ 2025-02-21T13:32:47
+
+ Z_UP
+
+
+
+
+
+
+
+ 0 0 0 1
+
+
+ 0 0 0 1
+
+
+ 1.5
+
+
+
+
+
+
+
+
+
+
+ 0 0 0 1
+
+
+ 0.8 0.8 0.8 1
+
+
+ 1.45
+
+
+
+
+
+
+
+
+
+
+ 0 0 0 1
+
+
+ 0.3591207 0.8000706 0.04065029 1
+
+
+ 1.5
+
+
+
+
+
+
+
+
+
+
+ 0 0 0 1
+
+
+ 0.8 0.8 0.8 1
+
+
+ 1.5
+
+
+
+
+
+
+
+
+
+
+ 0 0 0 1
+
+
+ 0.2014134 0.5813692 0.800149 1
+
+
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 6 18 3 6 19 2 6 20 3 7 21 7 7 22 6 7 23 7 8 24 5 8 25 4 8 26 5 9 27 1 9 28 0 9 29 6 10 30 4 10 31 0 10 32 3 11 33 1 11 34 5 11 35
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 6 18 3 6 19 2 6 20 3 7 21 7 7 22 6 7 23 7 8 24 5 8 25 4 8 26 5 9 27 1 9 28 0 9 29 6 10 30 4 10 31 0 10 32 3 11 33 1 11 34 5 11 35
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 6 18 3 6 19 2 6 20 3 7 21 7 7 22 6 7 23 7 8 24 5 8 25 4 8 26 5 9 27 1 9 28 0 9 29 6 10 30 4 10 31 0 10 32 3 11 33 1 11 34 5 11 35
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 6 18 3 6 19 2 6 20 3 7 21 7 7 22 6 7 23 7 8 24 5 8 25 4 8 26 5 9 27 1 9 28 0 9 29 6 10 30 4 10 31 0 10 32 3 11 33 1 11 34 5 11 35
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 6 18 3 6 19 2 6 20 3 7 21 7 7 22 6 7 23 7 8 24 5 8 25 4 8 26 5 9 27 1 9 28 0 9 29 6 10 30 4 10 31 0 10 32 3 11 33 1 11 34 5 11 35
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 6 18 3 6 19 2 6 20 3 7 21 7 7 22 6 7 23 7 8 24 5 8 25 4 8 26 5 9 27 1 9 28 0 9 29 6 10 30 4 10 31 0 10 32 3 11 33 1 11 34 5 11 35
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 6 18 3 6 19 2 6 20 3 7 21 7 7 22 6 7 23 7 8 24 5 8 25 4 8 26 5 9 27 1 9 28 0 9 29 6 10 30 4 10 31 0 10 32 3 11 33 1 11 34 5 11 35
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 6 18 3 6 19 2 6 20 3 7 21 7 7 22 6 7 23 7 8 24 5 8 25 4 8 26 5 9 27 1 9 28 0 9 29 6 10 30 4 10 31 0 10 32 3 11 33 1 11 34 5 11 35
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -1.029198 -1.021838 0.09228229 -13.07551 -0.9260871 0.05411165 -1.035489 -1.00146 0.2991693 -13.08123 -0.9075493 0.2423195 -1.041538 -0.9411104 0.4981057 -13.08673 -0.8526484 0.4232947 -1.047113 -0.8431079 0.6814466 -13.0918 -0.7634943 0.5900822 -1.052 -0.7112189 0.8421461 -13.09625 -0.6435131 0.7362728 -1.05601 -0.5505115 0.9740288 -13.0999 -0.4973154 0.8562483 -1.05899 -0.3671619 1.072026 -13.10261 -0.3305197 0.9453981 -1.060825 -0.1682159 1.132373 -13.10428 -0.1495358 1.000296 -1.061444 0.03868103 1.15275 -13.10484 0.03868103 1.018833 -1.060825 0.2455779 1.132373 -13.10428 0.2268979 1.000296 -1.05899 0.4445239 1.072026 -13.10261 0.4078818 0.9453981 -1.05601 0.6278736 0.9740288 -13.0999 0.5746775 0.8562483 -1.052 0.788581 0.8421461 -13.09625 0.7208752 0.7362728 -1.047113 0.92047 0.6814466 -13.0918 0.8408564 0.5900822 -1.041538 1.018472 0.4981057 -13.08673 0.9300105 0.4232947 -1.035489 1.078822 0.2991693 -13.08123 0.9849113 0.2423195 -1.029198 1.0992 0.09228229 -13.07551 1.003449 0.05411165 -1.022907 1.078822 -0.1146046 -13.06978 0.9849113 -0.1340961 -1.016858 1.018472 -0.313541 -13.06428 0.9300105 -0.3150712 -1.011282 0.92047 -0.4968819 -13.05921 0.8408564 -0.4818589 -1.006396 0.788581 -0.6575814 -13.05476 0.7208752 -0.6280494 -1.002386 0.6278736 -0.7894641 -13.05111 0.5746775 -0.7480249 -0.9994054 0.4445239 -0.8874619 -13.0484 0.4078818 -0.8371747 -0.9975705 0.2455779 -0.9478086 -13.04673 0.2268979 -0.8920729 -0.9969511 0.03868103 -0.9681852 -13.04617 0.03868103 -0.9106098 -0.9975705 -0.1682159 -0.9478086 -13.04673 -0.1495358 -0.8920729 -0.9994054 -0.3671619 -0.8874619 -13.0484 -0.3305197 -0.8371747 -1.002386 -0.5505115 -0.7894641 -13.05111 -0.4973154 -0.7480249 -1.006396 -0.7112189 -0.6575814 -13.05476 -0.6435131 -0.6280494 -1.011282 -0.8431079 -0.4968819 -13.05921 -0.7634943 -0.4818589 -1.016858 -0.9411104 -0.313541 -13.06428 -0.8526484 -0.3150712 -1.022907 -1.00146 -0.1146046 -13.06978 -0.9075493 -0.1340961 -11.32141 -1.021838 0.05966985 -11.3277 -1.00146 0.2665568 -11.33375 -0.9411104 0.4654932 -11.33932 -0.8431079 0.6488341 -11.34421 -0.7112189 0.8095336 -11.34822 -0.5505115 0.9414163 -11.3512 -0.3671619 1.039414 -11.35303 -0.1682159 1.099761 -11.35365 0.03868103 1.120137 -11.35303 0.2455779 1.099761 -11.3512 0.4445239 1.039414 -11.34822 0.6278736 0.9414163 -11.34421 0.788581 0.8095336 -11.33932 0.92047 0.6488341 -11.33375 1.018472 0.4654932 -11.3277 1.078822 0.2665568 -11.32141 1.0992 0.05966985 -11.31511 1.078822 -0.147217 -11.30907 1.018472 -0.3461534 -11.30349 0.92047 -0.5294944 -11.2986 0.788581 -0.6901939 -11.29459 0.6278736 -0.8220766 -11.29161 0.4445239 -0.9200744 -11.28978 0.2455779 -0.9804211 -11.28916 0.03868103 -1.000798 -11.28978 -0.1682159 -0.9804211 -11.29161 -0.3671619 -0.9200744 -11.29459 -0.5505115 -0.8220766 -11.2986 -0.7112189 -0.6901939 -11.30349 -0.8431079 -0.5294944 -11.30907 -0.9411104 -0.3461534 -11.31511 -1.00146 -0.147217 -13.2208 -1.165141 0.2931191 -13.21352 -1.188725 0.05367594 -11.18339 -1.188725 0.06010878 -13.2278 -1.095295 0.5233605 -13.23426 -0.9818704 0.7355521 -13.23991 -0.8292271 0.9215397 -13.24455 -0.6432306 1.074176 -13.248 -0.4310286 1.187595 -13.25012 -0.2007761 1.257437 -13.25084 0.03867846 1.281021 -13.25012 0.2781331 1.257437 -13.248 0.5083857 1.187595 -13.24455 0.7205875 1.074176 -13.23991 0.906584 0.9215397 -13.23426 1.059227 0.7355521 -13.2278 1.172652 0.5233605 -13.2208 1.242498 0.2931191 -13.21352 1.266082 0.05367594 -13.20624 1.242498 -0.185767 -13.19924 1.172652 -0.4160085 -13.19279 1.059227 -0.6282001 -13.18713 0.906584 -0.8141877 -13.18249 0.7205875 -0.9668237 -13.17904 0.5083857 -1.080242 -13.17692 0.2781331 -1.150085 -13.1762 0.03867846 -1.173668 -13.17692 -0.2007761 -1.150085 -13.17904 -0.4310286 -1.080242 -13.18249 -0.6432306 -0.9668237 -13.18713 -0.8292271 -0.8141877 -13.19279 -0.9818704 -0.6282001 -13.19924 -1.095295 -0.4160085 -13.20624 -1.165141 -0.185767 -11.19067 -1.165141 0.2995519 -11.19768 -1.095295 0.5297933 -11.20413 -0.9818704 0.7419849 -11.20978 -0.8292271 0.9279725 -11.21442 -0.6432306 1.080609 -11.21787 -0.4310286 1.194027 -11.22 -0.2007761 1.26387 -11.22071 0.03867846 1.287454 -11.22 0.2781331 1.26387 -11.21787 0.5083857 1.194027 -11.21442 0.7205875 1.080609 -11.20978 0.906584 0.9279725 -11.20413 1.059227 0.7419849 -11.19768 1.172652 0.5297933 -11.19067 1.242498 0.2995519 -11.18339 1.266082 0.06010878 -11.17611 1.242498 -0.1793342 -11.16911 1.172652 -0.4095757 -11.16266 1.059227 -0.6217674 -11.157 0.906584 -0.8077549 -11.15236 0.7205875 -0.9603909 -11.14891 0.5083857 -1.07381 -11.14679 0.2781331 -1.143653 -11.14607 0.03867846 -1.167236 -11.14679 -0.2007761 -1.143653 -11.14891 -0.4310286 -1.07381 -11.15236 -0.6432306 -0.9603909 -11.157 -0.8292271 -0.8077549 -11.16266 -0.9818704 -0.6217674 -11.16911 -1.095295 -0.4095757 -11.17611 -1.165141 -0.1793342 -12.37012 -0.9075493 0.2423195 -12.36439 -0.9260871 0.05411165 -12.37562 -0.8526484 0.4232947 -12.38069 -0.7634943 0.5900822 -12.38514 -0.6435131 0.7362728 -12.38878 -0.4973154 0.8562483 -12.39149 -0.3305197 0.9453981 -12.39316 -0.1495358 1.000296 -12.39373 0.03868103 1.018833 -12.39316 0.2268979 1.000296 -12.39149 0.4078818 0.9453981 -12.38878 0.5746775 0.8562483 -12.38514 0.7208752 0.7362728 -12.38069 0.8408564 0.5900822 -12.37562 0.9300105 0.4232947 -12.37012 0.9849113 0.2423195 -12.36439 1.003449 0.05411165 -12.35867 0.9849113 -0.1340961 -12.35317 0.9300105 -0.3150712 -12.34809 0.8408564 -0.4818589 -12.34365 0.7208752 -0.6280494 -12.34 0.5746775 -0.7480249 -12.33729 0.4078818 -0.8371747 -12.33562 0.2268979 -0.8920729 -12.33506 0.03868103 -0.9106098 -12.33562 -0.1495358 -0.8920729 -12.33729 -0.3305197 -0.8371747 -12.34 -0.4973154 -0.7480249 -12.34365 -0.6435131 -0.6280494 -12.34809 -0.7634943 -0.4818589 -12.35317 -0.8526484 -0.3150712 -12.35867 -0.9075493 -0.1340961
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0.8941683 -0.2222697 -0.3886633 -0.7594906 -0.4012401 -0.5120357 0.8828371 -0.4640426 0.07254731 -0.7724652 -0.6138536 0.1627306 0.8872783 0.4481748 -0.1089794 -0.7611508 -0.4898042 -0.4251367 0.8727791 0.04525226 0.4860131 -0.77473 -0.5671193 0.2795876 -0.7631157 -0.5600127 -0.3225528 -0.7767819 -0.4981881 0.3852513 0.8950523 -0.1369878 -0.4244005 -0.7653151 -0.6091054 -0.2080466 -0.7785387 -0.4096266 0.4754825 0.8850703 0.4650736 -0.01889383 -0.7676645 -0.6350692 -0.08589661 0.8727794 -0.04525202 0.4860126 -0.7799258 -0.3048331 0.5466191 -0.7808818 -0.1879143 0.5957447 0.8955017 -0.0462808 -0.4426452 -0.7813735 -0.06348055 0.6208267 0.8828312 0.4640527 0.07255399 0.8732033 -0.1340745 0.468551 -0.7813704 0.06348419 0.6208303 -0.7808813 0.1879113 0.5957465 0.8955028 0.04627645 -0.4426436 -0.7799205 0.3048373 0.5466244 0.8806509 0.4452611 0.1618527 0.8740326 -0.2179008 0.4342651 -0.7785317 0.4096328 0.4754884 0.885073 -0.4650686 -0.0188899 0 -0.8819118 0.4714145 -0.7767751 0.4981939 0.3852576 0.8950505 0.1369909 -0.4244032 -0.999538 0 -0.03039497 -3.10569e-4 0.9951851 0.0980128 -9.19771e-4 0.9569439 0.2902716 -0.001493632 0.8819297 0.4713785 -0.002010107 0.7730239 0.6343737 -0.002449333 0.6344096 0.7729933 -0.002794444 0.4714126 0.8819083 -0.003032147 0.2902965 0.956932 -0.003153324 0.0980212 0.9951794 -0.003153324 -0.0980212 0.9951794 -0.003032147 -0.2902965 0.956932 -0.002794444 -0.4714127 0.8819083 -0.002449333 -0.6344096 0.7729933 -0.002010107 -0.7730239 0.6343737 -0.001493632 -0.8819298 0.4713786 -9.1977e-4 -0.9569439 0.2902717 -3.10569e-4 -0.9951851 0.09801274 3.10569e-4 -0.9951851 -0.0980128 9.19771e-4 -0.9569439 -0.2902716 0.001493632 -0.8819298 -0.4713785 0.002010107 -0.7730239 -0.6343737 0.002449333 -0.6344096 -0.7729932 0.002794444 -0.4714125 -0.8819085 0.003032147 -0.2902963 -0.9569321 0.003153324 -0.0980212 -0.9951794 0.003153324 0.0980212 -0.9951794 0.003032147 0.2902963 -0.9569321 0.002794444 0.4714124 -0.8819085 0.002449333 0.6344096 -0.7729933 0.002010107 0.7730239 -0.6343737 0.001493632 0.8819298 -0.4713784 9.19771e-4 0.9569439 -0.2902716 3.10569e-4 0.9951851 -0.0980128 3.10569e-4 0.9951851 -0.09801256 9.19771e-4 0.9569439 -0.2902715 0.001493632 0.8819294 -0.4713791 0.002010107 0.7730241 -0.6343735 0.002449333 0.6344098 -0.772993 0.002794444 0.4714125 -0.8819084 0.003032147 0.2902956 -0.9569323 0.003153324 0.09802216 -0.9951792 0.003153324 -0.09802216 -0.9951792 0.003032147 -0.2902955 -0.9569323 0.002794444 -0.4714127 -0.8819083 0.002449333 -0.6344098 -0.772993 0.002010107 -0.7730239 -0.6343738 0.001493632 -0.8819299 -0.4713783 9.1977e-4 -0.9569439 -0.2902715 3.1057e-4 -0.9951851 -0.09801304 -3.10571e-4 -0.9951851 0.09801304 -9.19774e-4 -0.9569439 0.2902715 -0.001493632 -0.8819299 0.4713782 -0.002010107 -0.7730239 0.6343738 -0.002449333 -0.6344095 0.7729933 -0.002794444 -0.4714127 0.8819083 -0.003032147 -0.290296 0.9569321 -0.003153324 -0.0980212 0.9951793 -0.003153324 0.0980212 0.9951793 -0.003032147 0.290296 0.9569321 -0.002794444 0.4714125 0.8819084 -0.002449333 0.6344095 0.7729933 -0.002010107 0.7730241 0.6343735 -0.001493632 0.8819295 0.471379 -9.19774e-4 0.9569439 0.2902715 -3.10569e-4 0.9951851 0.09801256 -0.7700789 -0.6367371 0.03929841 -0.7581936 -0.297728 -0.5800868 0.8732012 0.1340731 0.4685552 -0.757301 -0.1831607 -0.6268552 0.8893725 0.4138886 -0.1941975 -0.7568462 -0.06181395 -0.6506634 0.8928914 -0.2987453 -0.336892 0.880655 -0.4452542 0.1618498 -0.7568458 0.06181484 -0.6506638 0.874032 0.2179043 0.4342647 -0.7572976 0.183161 -0.6268591 0.8912675 0.3634544 -0.2711885 -0.7581882 0.2977299 -0.5800927 0.8912702 -0.3634505 -0.2711846 0.8786135 -0.4095197 0.2456251 -0.7594863 0.4012453 -0.512038 0.8752397 0.2936017 0.3843871 -0.7611442 0.489811 -0.4251408 0.8928881 0.2987513 -0.3368952 -0.763107 0.5600218 -0.3225575 0.889375 -0.4138855 -0.1941931 -0.7653036 0.6091177 -0.2080531 0.8767886 -0.3582999 0.3207228 0.8767853 0.3583039 0.3207269 -0.767655 0.6350807 -0.08589726 0.8941677 0.2222674 -0.388666 -0.7700694 0.6367484 0.03930032 0.8872823 -0.4481672 -0.108978 0.875243 -0.2935997 0.3843812 -0.7724559 0.6138642 0.1627345 0.8786115 0.4095251 0.2456239 -0.7747213 0.5671287 0.2795924 0.9995381 0 0.03039199 0 0.6343747 0.7730258 0 0.6343749 -0.7730256 0 -0.8819119 -0.4714143 0 -0.0980122 0.9951852 0 0.9951843 -0.09802252 0 -0.2902718 -0.9569442 0 -0.7729956 0.6344113 0 0.7729956 0.6344113 0 0.471379 -0.8819307 0 -0.9569364 -0.2902974 0 0.0980122 0.9951852 0 0.9569364 -0.2902974 0 -0.4713791 -0.8819307 0 -0.6343747 0.7730258 0 0.8819118 0.4714145 0 0.2902718 -0.9569443 0 -0.9951843 0.09802216 0 -0.9951843 -0.09802216 0 0.2902721 0.9569442 0 0.8819119 -0.4714143 0 -0.6343749 -0.7730256 0 -0.4713791 0.8819307 0 0.9569365 0.2902973 0 0.0980125 -0.9951852 0 -0.9569365 0.2902973 0 0.471379 0.8819307 0 0.7729955 -0.6344115 0 -0.7729955 -0.6344115 0 -0.2902721 0.9569442 0 0.9951843 0.09802252 0 -0.0980125 -0.9951852 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0.8941695 -0.2222657 -0.3886629 -0.7594923 -0.4012407 -0.5120325 0.882835 -0.4640455 0.07255315 -0.7724655 -0.6138532 0.1627309 0.8872786 0.4481739 -0.1089801 -0.7611516 -0.4898043 -0.4251353 0.8727791 0.04525208 0.4860132 -0.7747301 -0.5671191 0.2795876 -0.7631152 -0.5600128 -0.3225535 -0.7767824 -0.4981871 0.3852515 0.8950516 -0.1369903 -0.4244012 -0.7653131 -0.6091068 -0.20805 -0.7785379 -0.409628 0.4754825 0.8850692 0.465076 -0.01889091 -0.7676648 -0.635069 -0.08589607 0.8727796 -0.0452522 0.4860125 -0.7799251 -0.3048346 0.5466194 -0.780884 -0.1879104 0.5957431 0.8955031 -0.04627633 -0.4426429 -0.7813713 -0.06348413 0.6208291 0.8828333 0.4640498 0.07254803 0.8732024 -0.1340726 0.4685533 -0.7813725 0.06348067 0.6208279 -0.7808791 0.1879153 0.5957481 0.8955014 0.04628086 -0.4426459 -0.7799214 0.3048357 0.5466241 0.8806513 0.4452608 0.1618518 0.8740338 -0.2179027 0.4342619 -0.7785325 0.4096314 0.4754884 0.8850741 -0.4650665 -0.01889276 0 -0.8819118 0.4714145 -0.7767744 0.4981952 0.3852573 0.8950512 0.1369885 -0.4244025 -0.999538 0 -0.03039342 -0.9995381 0 -0.03039342 -0.999538 0 -0.03039342 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.999538 1.22952e-7 -0.03039449 -0.9995381 0 -0.03039324 -0.9995378 4.06942e-6 -0.0304048 -0.9995383 0 -0.03038418 -0.9995381 0 -0.03039139 -0.9995379 -7.002e-7 -0.03039848 -0.999538 0 -0.03039336 -0.9995381 0 -0.03039437 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.9995381 0 -0.03039342 -0.999538 0 -0.03039342 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.999538 1.22952e-7 -0.03039449 -0.9995381 0 -0.03039324 -0.9995378 4.07804e-6 -0.0304048 -0.9995383 0 -0.03038418 -0.9995381 0 -0.03039133 -0.9995379 -7.01981e-7 -0.03039848 -0.999538 0 -0.03039336 -0.9995381 0 -0.03039437 -0.999538 0 -0.03039473 -0.999538 0 -0.03039497 -3.10569e-4 0.995185 0.09801274 -9.19771e-4 0.9569439 0.2902717 -0.001493632 0.8819298 0.4713785 -0.002010107 0.7730239 0.6343737 -0.002449333 0.6344095 0.7729932 -0.002794444 0.4714126 0.8819083 -0.003032147 0.2902962 0.956932 -0.003153324 0.0980212 0.9951794 -0.003153324 -0.0980212 0.9951794 -0.003032147 -0.2902962 0.956932 -0.002794444 -0.4714126 0.8819083 -0.002449333 -0.6344095 0.7729932 -0.002010107 -0.7730239 0.6343737 -0.001493632 -0.8819298 0.4713785 -9.19771e-4 -0.9569439 0.2902717 -3.10569e-4 -0.995185 0.09801274 3.10569e-4 -0.995185 -0.09801274 9.1977e-4 -0.9569439 -0.2902716 0.001493632 -0.8819296 -0.4713786 0.002010107 -0.7730239 -0.6343737 0.002449333 -0.6344095 -0.7729932 0.002794444 -0.4714126 -0.8819083 0.003032147 -0.2902963 -0.9569321 0.003153324 -0.0980212 -0.9951794 0.003153324 0.0980212 -0.9951794 0.003032147 0.2902963 -0.9569321 0.002794444 0.4714126 -0.8819083 0.002449333 0.6344095 -0.7729932 0.002010107 0.7730239 -0.6343737 0.001493632 0.8819296 -0.4713786 9.1977e-4 0.9569439 -0.2902716 3.10569e-4 0.995185 -0.09801274 3.10568e-4 0.9951851 -0.09801256 9.1977e-4 0.9569439 -0.2902715 0.001493632 0.8819294 -0.4713791 0.002010107 0.7730241 -0.6343735 0.002449333 0.6344098 -0.772993 0.002794444 0.4714125 -0.8819084 0.003032147 0.2902956 -0.9569323 0.003153324 0.09802216 -0.9951792 0.003153324 -0.09802216 -0.9951792 0.003032147 -0.2902955 -0.9569323 0.002794444 -0.4714127 -0.8819083 0.002449333 -0.6344098 -0.772993 0.002010107 -0.7730239 -0.6343738 0.001493632 -0.8819299 -0.4713783 9.1977e-4 -0.9569439 -0.2902715 3.10569e-4 -0.9951851 -0.09801304 -3.1057e-4 -0.9951851 0.09801304 -9.19774e-4 -0.9569439 0.2902715 -0.001493632 -0.8819299 0.4713783 -0.002010107 -0.7730239 0.6343738 -0.002449333 -0.6344095 0.7729933 -0.002794444 -0.4714127 0.8819083 -0.003032147 -0.290296 0.9569321 -0.003153324 -0.09802114 0.9951793 -0.003153324 0.0980212 0.9951793 -0.003032147 0.290296 0.9569321 -0.002794444 0.4714125 0.8819084 -0.002449333 0.6344095 0.7729933 -0.002010107 0.7730241 0.6343735 -0.001493632 0.8819294 0.4713791 -9.19774e-4 0.9569439 0.2902715 -3.10568e-4 0.9951851 0.09801256 -0.7700791 -0.6367368 0.03929859 -0.7581927 -0.2977272 -0.5800882 0.8732022 0.1340751 0.4685529 -0.7573004 -0.1831601 -0.626856 0.8893718 0.4138911 -0.1941962 -0.7568467 -0.06181472 -0.6506627 0.8928905 -0.2987484 -0.3368916 0.8806548 -0.4452545 0.1618508 -0.7568453 0.06181406 -0.6506645 0.8740308 0.2179023 0.434268 -0.7572982 0.1831617 -0.6268582 0.8912673 0.3634549 -0.2711883 -0.758189 0.2977305 -0.5800914 0.8912703 -0.3634502 -0.2711848 0.8786148 -0.4095195 0.2456215 -0.7594844 0.4012446 -0.5120411 0.8752405 0.2936025 0.3843846 -0.7611435 0.489811 -0.425142 0.892889 0.2987483 -0.3368956 -0.7631069 0.5600219 -0.3225574 0.889376 -0.4138827 -0.1941947 -0.7653056 0.6091163 -0.2080496 0.8767883 -0.3582998 0.3207234 0.8767856 0.358304 0.3207261 -0.7676548 0.6350808 -0.08589744 0.8941666 0.2222713 -0.3886663 -0.7700691 0.6367489 0.03929984 0.887282 -0.448168 -0.1089772 0.8752421 -0.2935988 0.3843837 -0.7724557 0.6138646 0.1627342 0.8786101 0.4095254 0.2456281 -0.7747215 0.5671283 0.2795926 0.9995381 0 0.03039175 0.9995381 0 0.03038871 0.9995378 0 0.03039884 0.9995381 0 0.03039175 0.999538 0 0.03039371 0.9995379 0 0.03039848 0.999538 0 0.03039371 0.9995381 0 0.0303905 0.999538 -6.83533e-7 0.03039747 0.9995383 0 0.03038638 0.9995374 -2.77787e-6 0.03041458 0.9995391 8.22688e-6 0.03035926 0.9995379 0 0.03039872 0.9995381 9.20489e-7 0.03038936 0.9995378 0 0.03039848 0.9995381 0 0.03039175 0.9995379 0 0.03039884 0.9995382 0 0.03038877 0.9995381 0 0.03039175 0.9995378 0 0.03039944 0.9995381 0 0.03039199 0.9995379 0 0.03039944 0.9995381 0 0.0303905 0.999538 -6.82176e-7 0.03039747 0.9995383 0 0.03038632 0.9995381 -2.51798e-7 0.03038889 0.9995383 7.46237e-7 0.03038388 0.9995379 0 0.03039872 0.9995381 9.18663e-7 0.03038942 0 0.6343747 0.7730258 0 0.6343749 -0.7730256 0 -0.8819119 -0.4714143 0 -0.0980122 0.9951852 0 0.9951843 -0.09802252 0 -0.2902718 -0.9569442 0 -0.7729956 0.6344113 0 0.7729956 0.6344113 0 0.4713791 -0.8819307 0 -0.9569364 -0.2902974 0 0.0980122 0.9951852 0 0.9569364 -0.2902974 0 -0.4713791 -0.8819307 0 -0.6343747 0.7730258 0 0.8819118 0.4714145 0 0.2902718 -0.9569442 0 -0.9951843 0.09802216 0 -0.9951843 -0.09802216 0 0.2902721 0.9569442 0 0.8819119 -0.4714143 0 -0.6343749 -0.7730256 0 -0.4713791 0.8819307 0 0.9569365 0.2902973 0 0.0980125 -0.9951852 0 -0.9569365 0.2902973 0 0.4713791 0.8819307 0 0.7729955 -0.6344115 0 -0.7729955 -0.6344115 0 -0.2902721 0.9569442 0 0.9951843 0.09802252 0 -0.0980125 -0.9951852
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.05044728 0.3833369 0.02826887 0.341844 0.02826887 0.341844 0.15625 0.8988949 0.125 0.8988949 0.125 0.8988949 0.2968217 0.4853885 0.25 0.49 0.25 0.49 0.96875 0.8988949 0.9375 0.8988949 0.9375 0.8988949 0.2031783 0.01461154 0.1581559 0.02826887 0.2031783 0.01461154 0.125 0.8988949 0.09375 0.8988949 0.09375 0.8988949 0.49 0.25 0.4853885 0.2031783 0.49 0.25 0.9375 0.8988949 0.90625 0.8988949 0.90625 0.8988949 0.09375 0.8988949 0.0625 0.8988949 0.0625 0.8988949 0.90625 0.8988949 0.875 0.8988949 0.875 0.8988949 0.02826887 0.341844 0.01461154 0.2968217 0.01461154 0.2968217 0.0625 0.8988949 0.03125 0.8988949 0.03125 0.8988949 0.875 0.8988949 0.84375 0.8988949 0.84375 0.8988949 0.25 0.00999999 0.2031783 0.01461154 0.25 0.00999999 0.03125 0.8988949 0 0.8988949 0 0.8988949 0.49 0.25 0.4853885 0.2968217 0.4853885 0.2968217 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.78125 0.8988949 0.78125 0.8988949 0.01461154 0.2968217 0.00999999 0.25 0.00999999 0.25 0.78125 0.8988949 0.75 0.8988949 0.75 0.8988949 0.2968217 0.01461154 0.25 0.00999999 0.2968217 0.01461154 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.71875 0.8988949 0.75 0.8988949 0.71875 0.8988949 0.6875 0.8988949 0.71875 0.8988949 0.6875 0.8988949 0.01461154 0.2031783 0.00999999 0.25 0.01461154 0.2031783 0.65625 0.8988949 0.6875 0.8988949 0.65625 0.8988949 0.341844 0.02826887 0.2968217 0.01461154 0.341844 0.02826887 0.4717311 0.341844 0.4495527 0.3833369 0.4495527 0.3833369 0.625 0.8988949 0.65625 0.8988949 0.625 0.8988949 0.25 0.49 0.2031783 0.4853885 0.2031783 0.4853885 0.341844 0.4717311 0.3833369 0.4495527 0.3833369 0.4495527 0.59375 0.8988949 0.625 0.8988949 0.59375 0.8988949 0.02826887 0.1581559 0.01461154 0.2031783 0.02826887 0.1581559 0.5504473 0.1166631 0.5146116 0.2031783 0.5504473 0.3833369 0.03125 0.8988949 0 0.5 0.03125 0.5 0.0625 0.8988949 0.03125 0.5 0.0625 0.5 0.09375 0.8988949 0.0625 0.5 0.09375 0.5 0.125 0.8988949 0.09375 0.5 0.125 0.5 0.15625 0.8988949 0.125 0.5 0.15625 0.5 0.1875 0.8988949 0.15625 0.5 0.1875 0.5 0.21875 0.8988949 0.1875 0.5 0.21875 0.5 0.25 0.8988949 0.21875 0.5 0.25 0.5 0.28125 0.5 0.25 0.8988949 0.25 0.5 0.3125 0.5 0.28125 0.8988949 0.28125 0.5 0.34375 0.5 0.3125 0.8988949 0.3125 0.5 0.375 0.5 0.34375 0.8988949 0.34375 0.5 0.40625 0.5 0.375 0.8988949 0.375 0.5 0.4375 0.5 0.40625 0.8988949 0.40625 0.5 0.46875 0.5 0.4375 0.8988949 0.4375 0.5 0.5 0.5 0.46875 0.8988949 0.46875 0.5 0.53125 0.5 0.5 0.8988949 0.5 0.5 0.5625 0.5 0.53125 0.8988949 0.53125 0.5 0.59375 0.5 0.5625 0.8988949 0.5625 0.5 0.625 0.5 0.59375 0.8988949 0.59375 0.5 0.65625 0.5 0.625 0.8988949 0.625 0.5 0.6875 0.5 0.65625 0.8988949 0.65625 0.5 0.71875 0.5 0.6875 0.8988949 0.6875 0.5 0.75 0.5 0.71875 0.8988949 0.71875 0.5 0.78125 0.8988949 0.75 0.5 0.78125 0.5 0.8125 0.8988949 0.78125 0.5 0.8125 0.5 0.84375 0.8988949 0.8125 0.5 0.84375 0.5 0.875 0.8988949 0.84375 0.5 0.875 0.5 0.90625 0.8988949 0.875 0.5 0.90625 0.5 0.9375 0.8988949 0.90625 0.5 0.9375 0.5 0.96875 0.8988949 0.9375 0.5 0.96875 0.5 1 0.8988949 0.96875 0.5 1 0.5 1 1 0.96875 0.8988949 1 0.8988949 0.96875 1 0.9375 0.8988949 0.96875 0.8988949 0.9375 1 0.90625 0.8988949 0.9375 0.8988949 0.90625 1 0.875 0.8988949 0.90625 0.8988949 0.875 1 0.84375 0.8988949 0.875 0.8988949 0.84375 1 0.8125 0.8988949 0.84375 0.8988949 0.8125 1 0.78125 0.8988949 0.8125 0.8988949 0.78125 1 0.75 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.71875 1 0.71875 0.8988949 0.71875 0.8988949 0.6875 1 0.6875 0.8988949 0.6875 0.8988949 0.65625 1 0.65625 0.8988949 0.65625 0.8988949 0.625 1 0.625 0.8988949 0.625 0.8988949 0.59375 1 0.59375 0.8988949 0.59375 0.8988949 0.5625 1 0.5625 0.8988949 0.5625 0.8988949 0.53125 1 0.53125 0.8988949 0.53125 0.8988949 0.5 1 0.5 0.8988949 0.5 0.8988949 0.46875 1 0.46875 0.8988949 0.46875 0.8988949 0.4375 1 0.4375 0.8988949 0.4375 0.8988949 0.40625 1 0.40625 0.8988949 0.40625 0.8988949 0.375 1 0.375 0.8988949 0.375 0.8988949 0.34375 1 0.34375 0.8988949 0.34375 0.8988949 0.3125 1 0.3125 0.8988949 0.3125 0.8988949 0.28125 1 0.28125 0.8988949 0.28125 0.8988949 0.25 1 0.25 0.8988949 0.25 1 0.21875 0.8988949 0.25 0.8988949 0.21875 1 0.1875 0.8988949 0.21875 0.8988949 0.1875 1 0.15625 0.8988949 0.1875 0.8988949 0.15625 1 0.125 0.8988949 0.15625 0.8988949 0.125 1 0.09375 0.8988949 0.125 0.8988949 0.09375 1 0.0625 0.8988949 0.09375 0.8988949 0.0625 1 0.03125 0.8988949 0.0625 0.8988949 0.03125 1 0 0.8988949 0.03125 0.8988949 1 0.8988949 0.96875 0.8988949 0.96875 0.8988949 0.1875 0.8988949 0.15625 0.8988949 0.15625 0.8988949 0.4853885 0.2031783 0.4717311 0.1581559 0.4853885 0.2031783 0.21875 0.8988949 0.1875 0.8988949 0.1875 0.8988949 0.1581559 0.02826887 0.1166631 0.05044728 0.1581559 0.02826887 0.25 0.8988949 0.21875 0.8988949 0.21875 0.8988949 0.08029437 0.4197056 0.05044728 0.3833369 0.05044728 0.3833369 0.341844 0.4717311 0.2968217 0.4853885 0.2968217 0.4853885 0.25 0.8988949 0.28125 0.8988949 0.25 0.8988949 0.4717311 0.1581559 0.4495527 0.1166631 0.4717311 0.1581559 0.28125 0.8988949 0.3125 0.8988949 0.28125 0.8988949 0.1166631 0.05044728 0.08029437 0.08029437 0.1166631 0.05044728 0.3125 0.8988949 0.34375 0.8988949 0.3125 0.8988949 0.1166631 0.4495527 0.08029437 0.4197056 0.08029437 0.4197056 0.3833369 0.4495527 0.341844 0.4717311 0.341844 0.4717311 0.34375 0.8988949 0.375 0.8988949 0.34375 0.8988949 0.4495527 0.1166631 0.4197056 0.08029437 0.4495527 0.1166631 0.375 0.8988949 0.40625 0.8988949 0.375 0.8988949 0.08029437 0.08029437 0.05044728 0.1166631 0.08029437 0.08029437 0.40625 0.8988949 0.4375 0.8988949 0.40625 0.8988949 0.1581559 0.4717311 0.1166631 0.4495527 0.1166631 0.4495527 0.4375 0.8988949 0.46875 0.8988949 0.4375 0.8988949 0.4197056 0.4197056 0.3833369 0.4495527 0.3833369 0.4495527 0.4197056 0.08029437 0.3833369 0.05044728 0.4197056 0.08029437 0.46875 0.8988949 0.5 0.8988949 0.46875 0.8988949 0.05044728 0.1166631 0.02826887 0.1581559 0.05044728 0.1166631 0.5 0.8988949 0.53125 0.8988949 0.5 0.8988949 0.2031783 0.4853885 0.1581559 0.4717311 0.1581559 0.4717311 0.4495527 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.53125 0.8988949 0.5625 0.8988949 0.53125 0.8988949 0.3833369 0.05044728 0.341844 0.02826887 0.3833369 0.05044728 0.5625 0.8988949 0.59375 0.8988949 0.5625 0.8988949 0.4197056 0.4197056 0.3833369 0.4495527 0.4197056 0.08029437 0.4197056 0.08029437 0.4495527 0.1166631 0.4197056 0.08029437 0.05044728 0.1166631 0.08029437 0.08029437 0.05044728 0.1166631 0.1166631 0.4495527 0.1581559 0.4717311 0.1581559 0.4717311 0.4853885 0.2968217 0.49 0.25 0.49 0.25 0.2031783 0.01461154 0.25 0.00999999 0.2031783 0.01461154 0.01461154 0.2968217 0.02826887 0.341844 0.02826887 0.341844 0.3833369 0.4495527 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.05044728 0.4197056 0.08029437 0.3833369 0.05044728 0.02826887 0.1581559 0.05044728 0.1166631 0.02826887 0.1581559 0.1581559 0.4717311 0.2031783 0.4853885 0.2031783 0.4853885 0.4853885 0.2031783 0.49 0.25 0.4853885 0.2031783 0.1581559 0.02826887 0.2031783 0.01461154 0.1581559 0.02826887 0.02826887 0.341844 0.05044728 0.3833369 0.05044728 0.3833369 0.4197056 0.4197056 0.4495527 0.3833369 0.4495527 0.3833369 0.341844 0.02826887 0.3833369 0.05044728 0.341844 0.02826887 0.01461154 0.2031783 0.02826887 0.1581559 0.01461154 0.2031783 0.25 0.49 0.2968217 0.4853885 0.2968217 0.4853885 0.2031783 0.4853885 0.25 0.49 0.25 0.49 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.1581559 0.1166631 0.05044728 0.1581559 0.02826887 0.1166631 0.05044728 0.05044728 0.3833369 0.08029437 0.4197056 0.08029437 0.4197056 0.4495527 0.3833369 0.4717311 0.341844 0.4717311 0.341844 0.2968217 0.01461154 0.341844 0.02826887 0.2968217 0.01461154 0.00999999 0.25 0.01461154 0.2031783 0.00999999 0.25 0.2968217 0.4853885 0.341844 0.4717311 0.341844 0.4717311 0.4495527 0.1166631 0.4717311 0.1581559 0.4495527 0.1166631 0.08029437 0.08029437 0.1166631 0.05044728 0.08029437 0.08029437 0.08029437 0.4197056 0.1166631 0.4495527 0.1166631 0.4495527 0.4717311 0.341844 0.4853885 0.2968217 0.4853885 0.2968217 0.25 0.00999999 0.2968217 0.01461154 0.25 0.00999999 0.00999999 0.25 0.01461154 0.2968217 0.01461154 0.2968217 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 0.05044728 0.3833369 0.05044728 0.3833369 0.02826887 0.341844 0.15625 0.8988949 0.15625 0.8988949 0.125 0.8988949 0.2968217 0.4853885 0.2968217 0.4853885 0.25 0.49 0.96875 0.8988949 0.96875 0.8988949 0.9375 0.8988949 0.2031783 0.01461154 0.1581559 0.02826887 0.1581559 0.02826887 0.125 0.8988949 0.125 0.8988949 0.09375 0.8988949 0.49 0.25 0.4853885 0.2031783 0.4853885 0.2031783 0.9375 0.8988949 0.9375 0.8988949 0.90625 0.8988949 0.09375 0.8988949 0.09375 0.8988949 0.0625 0.8988949 0.90625 0.8988949 0.90625 0.8988949 0.875 0.8988949 0.02826887 0.341844 0.02826887 0.341844 0.01461154 0.2968217 0.0625 0.8988949 0.0625 0.8988949 0.03125 0.8988949 0.875 0.8988949 0.875 0.8988949 0.84375 0.8988949 0.25 0.00999999 0.2031783 0.01461154 0.2031783 0.01461154 0.03125 0.8988949 0.03125 0.8988949 0 0.8988949 0.49 0.25 0.49 0.25 0.4853885 0.2968217 0.84375 0.8988949 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.78125 0.8988949 0.01461154 0.2968217 0.01461154 0.2968217 0.00999999 0.25 0.78125 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.2968217 0.01461154 0.25 0.00999999 0.25 0.00999999 0.4853885 0.2968217 0.4853885 0.2968217 0.4717311 0.341844 0.71875 0.8988949 0.75 0.8988949 0.75 0.8988949 0.6875 0.8988949 0.71875 0.8988949 0.71875 0.8988949 0.01461154 0.2031783 0.00999999 0.25 0.00999999 0.25 0.65625 0.8988949 0.6875 0.8988949 0.6875 0.8988949 0.341844 0.02826887 0.2968217 0.01461154 0.2968217 0.01461154 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.625 0.8988949 0.65625 0.8988949 0.65625 0.8988949 0.25 0.49 0.25 0.49 0.2031783 0.4853885 0.341844 0.4717311 0.341844 0.4717311 0.3833369 0.4495527 0.59375 0.8988949 0.625 0.8988949 0.625 0.8988949 0.02826887 0.1581559 0.01461154 0.2031783 0.01461154 0.2031783 0.7031784 0.4853885 0.75 0.49 0.75 0.00999999 0.75 0.49 0.7968217 0.4853885 0.7968217 0.01461154 0.7968217 0.4853885 0.841844 0.4717311 0.7968217 0.01461154 0.841844 0.4717311 0.8833369 0.4495527 0.841844 0.02826887 0.7968217 0.01461154 0.841844 0.4717311 0.841844 0.02826887 0.8833369 0.4495527 0.9197056 0.4197056 0.9495527 0.1166631 0.9197056 0.4197056 0.9495527 0.3833369 0.9495527 0.1166631 0.9495527 0.3833369 0.9717311 0.341844 0.9853885 0.2968217 0.9853885 0.2968217 0.99 0.25 0.9853885 0.2031783 0.9853885 0.2031783 0.9717311 0.1581559 0.9853885 0.2968217 0.9717311 0.1581559 0.9495527 0.1166631 0.9853885 0.2968217 0.9495527 0.1166631 0.9197056 0.08029437 0.8833369 0.4495527 0.9197056 0.08029437 0.8833369 0.05044728 0.8833369 0.4495527 0.8833369 0.05044728 0.841844 0.02826887 0.8833369 0.4495527 0.7968217 0.01461154 0.75 0.00999999 0.75 0.49 0.75 0.00999999 0.7031784 0.01461154 0.7031784 0.4853885 0.7031784 0.01461154 0.658156 0.02826887 0.7031784 0.4853885 0.658156 0.02826887 0.6166632 0.05044728 0.658156 0.4717311 0.7031784 0.4853885 0.658156 0.02826887 0.658156 0.4717311 0.6166632 0.05044728 0.5802944 0.08029437 0.5504473 0.3833369 0.5802944 0.08029437 0.5504473 0.1166631 0.5504473 0.3833369 0.5504473 0.1166631 0.5282689 0.1581559 0.5146116 0.2031783 0.5146116 0.2031783 0.51 0.25 0.5146116 0.2968217 0.5146116 0.2968217 0.5282689 0.341844 0.5146116 0.2031783 0.5282689 0.341844 0.5504473 0.3833369 0.5146116 0.2031783 0.5504473 0.3833369 0.5802944 0.4197056 0.6166632 0.05044728 0.5802944 0.4197056 0.6166632 0.4495527 0.6166632 0.05044728 0.6166632 0.4495527 0.658156 0.4717311 0.6166632 0.05044728 0.9495527 0.3833369 0.9853885 0.2968217 0.9495527 0.1166631 0.03125 0.8988949 0 0.8988949 0 0.5 0.0625 0.8988949 0.03125 0.8988949 0.03125 0.5 0.09375 0.8988949 0.0625 0.8988949 0.0625 0.5 0.125 0.8988949 0.09375 0.8988949 0.09375 0.5 0.15625 0.8988949 0.125 0.8988949 0.125 0.5 0.1875 0.8988949 0.15625 0.8988949 0.15625 0.5 0.21875 0.8988949 0.1875 0.8988949 0.1875 0.5 0.25 0.8988949 0.21875 0.8988949 0.21875 0.5 0.28125 0.5 0.28125 0.8988949 0.25 0.8988949 0.3125 0.5 0.3125 0.8988949 0.28125 0.8988949 0.34375 0.5 0.34375 0.8988949 0.3125 0.8988949 0.375 0.5 0.375 0.8988949 0.34375 0.8988949 0.40625 0.5 0.40625 0.8988949 0.375 0.8988949 0.4375 0.5 0.4375 0.8988949 0.40625 0.8988949 0.46875 0.5 0.46875 0.8988949 0.4375 0.8988949 0.5 0.5 0.5 0.8988949 0.46875 0.8988949 0.53125 0.5 0.53125 0.8988949 0.5 0.8988949 0.5625 0.5 0.5625 0.8988949 0.53125 0.8988949 0.59375 0.5 0.59375 0.8988949 0.5625 0.8988949 0.625 0.5 0.625 0.8988949 0.59375 0.8988949 0.65625 0.5 0.65625 0.8988949 0.625 0.8988949 0.6875 0.5 0.6875 0.8988949 0.65625 0.8988949 0.71875 0.5 0.71875 0.8988949 0.6875 0.8988949 0.75 0.5 0.75 0.8988949 0.71875 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.75 0.5 0.8125 0.8988949 0.78125 0.8988949 0.78125 0.5 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.5 0.875 0.8988949 0.84375 0.8988949 0.84375 0.5 0.90625 0.8988949 0.875 0.8988949 0.875 0.5 0.9375 0.8988949 0.90625 0.8988949 0.90625 0.5 0.96875 0.8988949 0.9375 0.8988949 0.9375 0.5 1 0.8988949 0.96875 0.8988949 0.96875 0.5 1 1 0.96875 1 0.96875 0.8988949 0.96875 1 0.9375 1 0.9375 0.8988949 0.9375 1 0.90625 1 0.90625 0.8988949 0.90625 1 0.875 1 0.875 0.8988949 0.875 1 0.84375 1 0.84375 0.8988949 0.84375 1 0.8125 1 0.8125 0.8988949 0.8125 1 0.78125 1 0.78125 0.8988949 0.78125 1 0.75 1 0.75 0.8988949 0.75 0.8988949 0.75 1 0.71875 1 0.71875 0.8988949 0.71875 1 0.6875 1 0.6875 0.8988949 0.6875 1 0.65625 1 0.65625 0.8988949 0.65625 1 0.625 1 0.625 0.8988949 0.625 1 0.59375 1 0.59375 0.8988949 0.59375 1 0.5625 1 0.5625 0.8988949 0.5625 1 0.53125 1 0.53125 0.8988949 0.53125 1 0.5 1 0.5 0.8988949 0.5 1 0.46875 1 0.46875 0.8988949 0.46875 1 0.4375 1 0.4375 0.8988949 0.4375 1 0.40625 1 0.40625 0.8988949 0.40625 1 0.375 1 0.375 0.8988949 0.375 1 0.34375 1 0.34375 0.8988949 0.34375 1 0.3125 1 0.3125 0.8988949 0.3125 1 0.28125 1 0.28125 0.8988949 0.28125 1 0.25 1 0.25 1 0.21875 1 0.21875 0.8988949 0.21875 1 0.1875 1 0.1875 0.8988949 0.1875 1 0.15625 1 0.15625 0.8988949 0.15625 1 0.125 1 0.125 0.8988949 0.125 1 0.09375 1 0.09375 0.8988949 0.09375 1 0.0625 1 0.0625 0.8988949 0.0625 1 0.03125 1 0.03125 0.8988949 0.03125 1 0 1 0 0.8988949 1 0.8988949 1 0.8988949 0.96875 0.8988949 0.1875 0.8988949 0.1875 0.8988949 0.15625 0.8988949 0.4853885 0.2031783 0.4717311 0.1581559 0.4717311 0.1581559 0.21875 0.8988949 0.21875 0.8988949 0.1875 0.8988949 0.1581559 0.02826887 0.1166631 0.05044728 0.1166631 0.05044728 0.25 0.8988949 0.25 0.8988949 0.21875 0.8988949 0.08029437 0.4197056 0.08029437 0.4197056 0.05044728 0.3833369 0.341844 0.4717311 0.341844 0.4717311 0.2968217 0.4853885 0.25 0.8988949 0.28125 0.8988949 0.28125 0.8988949 0.4717311 0.1581559 0.4495527 0.1166631 0.4495527 0.1166631 0.28125 0.8988949 0.3125 0.8988949 0.3125 0.8988949 0.1166631 0.05044728 0.08029437 0.08029437 0.08029437 0.08029437 0.3125 0.8988949 0.34375 0.8988949 0.34375 0.8988949 0.1166631 0.4495527 0.1166631 0.4495527 0.08029437 0.4197056 0.3833369 0.4495527 0.3833369 0.4495527 0.341844 0.4717311 0.34375 0.8988949 0.375 0.8988949 0.375 0.8988949 0.4495527 0.1166631 0.4197056 0.08029437 0.4197056 0.08029437 0.375 0.8988949 0.40625 0.8988949 0.40625 0.8988949 0.08029437 0.08029437 0.05044728 0.1166631 0.05044728 0.1166631 0.40625 0.8988949 0.4375 0.8988949 0.4375 0.8988949 0.1581559 0.4717311 0.1581559 0.4717311 0.1166631 0.4495527 0.4375 0.8988949 0.46875 0.8988949 0.46875 0.8988949 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.4495527 0.4197056 0.08029437 0.3833369 0.05044728 0.3833369 0.05044728 0.46875 0.8988949 0.5 0.8988949 0.5 0.8988949 0.05044728 0.1166631 0.02826887 0.1581559 0.02826887 0.1581559 0.5 0.8988949 0.53125 0.8988949 0.53125 0.8988949 0.2031783 0.4853885 0.2031783 0.4853885 0.1581559 0.4717311 0.4495527 0.3833369 0.4495527 0.3833369 0.4197056 0.4197056 0.53125 0.8988949 0.5625 0.8988949 0.5625 0.8988949 0.3833369 0.05044728 0.341844 0.02826887 0.341844 0.02826887 0.5625 0.8988949 0.59375 0.8988949 0.59375 0.8988949 0.341844 0.4717311 0.2968217 0.4853885 0.2968217 0.01461154 0.2968217 0.4853885 0.25 0.49 0.25 0.00999999 0.25 0.49 0.2031783 0.4853885 0.2031783 0.01461154 0.2031783 0.4853885 0.1581559 0.4717311 0.1581559 0.02826887 0.1581559 0.4717311 0.1166631 0.4495527 0.1581559 0.02826887 0.1166631 0.4495527 0.08029437 0.4197056 0.1166631 0.05044728 0.1581559 0.02826887 0.1166631 0.4495527 0.1166631 0.05044728 0.08029437 0.4197056 0.05044728 0.3833369 0.08029437 0.08029437 0.05044728 0.3833369 0.02826887 0.341844 0.08029437 0.08029437 0.02826887 0.341844 0.01461154 0.2968217 0.02826887 0.1581559 0.01461154 0.2968217 0.00999999 0.25 0.02826887 0.1581559 0.00999999 0.25 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.1581559 0.05044728 0.1166631 0.02826887 0.341844 0.05044728 0.1166631 0.08029437 0.08029437 0.02826887 0.341844 0.08029437 0.08029437 0.1166631 0.05044728 0.08029437 0.4197056 0.1581559 0.02826887 0.2031783 0.01461154 0.2031783 0.4853885 0.2031783 0.01461154 0.25 0.00999999 0.25 0.49 0.25 0.00999999 0.2968217 0.01461154 0.2968217 0.4853885 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.4717311 0.341844 0.02826887 0.3833369 0.05044728 0.341844 0.4717311 0.3833369 0.05044728 0.4197056 0.08029437 0.3833369 0.4495527 0.341844 0.4717311 0.3833369 0.05044728 0.3833369 0.4495527 0.4197056 0.08029437 0.4495527 0.1166631 0.4197056 0.4197056 0.4495527 0.1166631 0.4717311 0.1581559 0.4197056 0.4197056 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.341844 0.4853885 0.2031783 0.49 0.25 0.4717311 0.341844 0.49 0.25 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.4717311 0.1581559 0.4495527 0.3833369 0.4197056 0.4197056 0.4717311 0.1581559 0.4197056 0.08029437 0.4495527 0.1166631 0.4495527 0.1166631 0.05044728 0.1166631 0.08029437 0.08029437 0.08029437 0.08029437 0.1166631 0.4495527 0.1166631 0.4495527 0.1581559 0.4717311 0.4853885 0.2968217 0.4853885 0.2968217 0.49 0.25 0.2031783 0.01461154 0.25 0.00999999 0.25 0.00999999 0.01461154 0.2968217 0.01461154 0.2968217 0.02826887 0.341844 0.3833369 0.4495527 0.3833369 0.4495527 0.4197056 0.4197056 0.3833369 0.05044728 0.4197056 0.08029437 0.4197056 0.08029437 0.02826887 0.1581559 0.05044728 0.1166631 0.05044728 0.1166631 0.1581559 0.4717311 0.1581559 0.4717311 0.2031783 0.4853885 0.4853885 0.2031783 0.49 0.25 0.49 0.25 0.1581559 0.02826887 0.2031783 0.01461154 0.2031783 0.01461154 0.02826887 0.341844 0.02826887 0.341844 0.05044728 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.4495527 0.3833369 0.341844 0.02826887 0.3833369 0.05044728 0.3833369 0.05044728 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.1581559 0.25 0.49 0.25 0.49 0.2968217 0.4853885 0.2031783 0.4853885 0.2031783 0.4853885 0.25 0.49 0.4717311 0.1581559 0.4853885 0.2031783 0.4853885 0.2031783 0.1166631 0.05044728 0.1581559 0.02826887 0.1581559 0.02826887 0.05044728 0.3833369 0.05044728 0.3833369 0.08029437 0.4197056 0.4495527 0.3833369 0.4495527 0.3833369 0.4717311 0.341844 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.02826887 0.00999999 0.25 0.01461154 0.2031783 0.01461154 0.2031783 0.2968217 0.4853885 0.2968217 0.4853885 0.341844 0.4717311 0.4495527 0.1166631 0.4717311 0.1581559 0.4717311 0.1581559 0.08029437 0.08029437 0.1166631 0.05044728 0.1166631 0.05044728 0.08029437 0.4197056 0.08029437 0.4197056 0.1166631 0.4495527 0.4717311 0.341844 0.4717311 0.341844 0.4853885 0.2968217 0.25 0.00999999 0.2968217 0.01461154 0.2968217 0.01461154 0.00999999 0.25 0.00999999 0.25 0.01461154 0.2968217
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 99 7 21 164 7 22 100 7 23 73 9 27 138 9 28 74 9 29 100 11 33 165 11 34 101 11 35 74 13 39 139 13 40 75 13 41 101 14 42 166 14 43 102 14 44 75 15 45 140 15 46 76 15 47 102 17 51 167 17 52 103 17 53 76 18 54 141 18 55 77 18 56 103 20 60 106 20 61 72 20 62 77 22 66 142 22 67 78 22 68 78 23 69 143 23 70 79 23 71 79 25 75 144 25 76 80 25 77 81 28 84 144 28 85 145 28 86 82 29 87 145 29 88 146 29 89 83 31 93 146 31 94 147 31 95 84 34 102 147 34 103 148 34 104 85 37 111 148 37 112 149 37 113 50 39 117 54 39 118 62 39 119 103 40 120 8 40 121 70 40 122 102 41 123 70 41 124 68 41 125 101 42 126 68 42 127 66 42 128 100 43 129 66 43 130 64 43 131 99 44 132 64 44 133 62 44 134 98 45 135 62 45 136 60 45 137 97 46 138 60 46 139 58 46 140 96 47 141 58 47 142 56 47 143 54 48 144 96 48 145 56 48 146 52 49 147 95 49 148 54 49 149 50 50 150 94 50 151 52 50 152 48 51 153 93 51 154 50 51 155 46 52 156 92 52 157 48 52 158 44 53 159 91 53 160 46 53 161 42 54 162 90 54 163 44 54 164 40 55 165 89 55 166 42 55 167 38 56 168 88 56 169 40 56 170 36 57 171 87 57 172 38 57 173 34 58 174 86 58 175 36 58 176 32 59 177 85 59 178 34 59 179 30 60 180 84 60 181 32 60 182 28 61 183 83 61 184 30 61 185 26 62 186 82 62 187 28 62 188 24 63 189 81 63 190 26 63 191 79 64 192 24 64 193 22 64 194 78 65 195 22 65 196 20 65 197 77 66 198 20 66 199 18 66 200 76 67 201 18 67 202 16 67 203 75 68 204 16 68 205 14 68 206 74 69 207 14 69 208 12 69 209 73 70 210 12 70 211 10 70 212 72 71 213 10 71 214 8 71 215 105 72 216 137 72 217 106 72 218 104 73 219 138 73 220 137 73 221 107 74 222 139 74 223 138 74 224 108 75 225 140 75 226 139 75 227 109 76 228 141 76 229 140 76 230 110 77 231 142 77 232 141 77 233 111 78 234 143 78 235 142 78 236 112 79 237 144 79 238 143 79 239 144 80 240 114 80 241 145 80 242 145 81 243 115 81 244 146 81 245 146 82 246 116 82 247 147 82 248 147 83 249 117 83 250 148 83 251 148 84 252 118 84 253 149 84 254 149 85 255 119 85 256 150 85 257 150 86 258 120 86 259 151 86 260 151 87 261 121 87 262 152 87 263 152 88 264 122 88 265 153 88 266 153 89 267 123 89 268 154 89 269 154 90 270 124 90 271 155 90 272 155 91 273 125 91 274 156 91 275 156 92 276 126 92 277 157 92 278 157 93 279 127 93 280 158 93 281 158 94 282 128 94 283 159 94 284 159 95 285 129 95 286 160 95 287 129 96 288 161 96 289 160 96 290 130 97 291 162 97 292 161 97 293 131 98 294 163 98 295 162 98 296 132 99 297 164 99 298 163 99 299 133 100 300 165 100 301 164 100 302 134 101 303 166 101 304 165 101 305 135 102 306 167 102 307 166 102 308 136 103 309 106 103 310 167 103 311 72 104 312 137 104 313 73 104 314 98 105 315 163 105 316 99 105 317 97 107 321 162 107 322 98 107 323 96 109 327 161 109 328 97 109 329 96 112 336 159 112 337 160 112 338 95 114 342 158 114 343 159 114 344 94 116 348 157 116 349 158 116 350 93 119 357 156 119 358 157 119 359 92 121 363 155 121 364 156 121 365 91 123 369 154 123 370 155 123 371 90 125 375 153 125 376 154 125 377 89 128 384 152 128 385 153 128 386 88 130 390 151 130 391 152 130 392 87 133 399 150 133 400 151 133 401 86 135 405 149 135 406 150 135 407 172 136 408 171 136 409 180 136 410 1 168 504 3 168 505 2 168 506 3 169 507 7 169 508 6 169 509 7 170 510 5 170 511 4 170 512 5 171 513 1 171 514 0 171 515 6 172 516 4 172 517 0 172 518 3 173 519 1 173 520 5 173 521 99 175 525 163 175 526 164 175 527 73 177 531 137 177 532 138 177 533 100 179 537 164 179 538 165 179 539 74 181 543 138 181 544 139 181 545 101 182 546 165 182 547 166 182 548 75 183 549 139 183 550 140 183 551 102 185 555 166 185 556 167 185 557 76 186 558 140 186 559 141 186 560 103 188 564 167 188 565 106 188 566 77 190 570 141 190 571 142 190 572 78 191 573 142 191 574 143 191 575 79 193 579 143 193 580 144 193 581 81 196 588 80 196 589 144 196 590 82 197 591 81 197 592 145 197 593 83 199 597 82 199 598 146 199 599 84 202 606 83 202 607 147 202 608 85 205 615 84 205 616 148 205 617 70 207 621 8 207 622 40 207 623 8 208 624 10 208 625 38 208 626 10 209 627 12 209 628 38 209 629 12 210 630 14 210 631 36 210 632 38 211 633 12 211 634 36 211 635 14 212 636 16 212 637 30 212 638 16 213 639 18 213 640 30 213 641 18 214 642 20 214 643 22 214 644 22 215 645 24 215 646 26 215 647 26 216 648 28 216 649 22 216 650 28 217 651 30 217 652 22 217 653 30 218 654 32 218 655 14 218 656 32 219 657 34 219 658 14 219 659 34 220 660 36 220 661 14 220 662 38 221 663 40 221 664 8 221 665 40 222 666 42 222 667 70 222 668 42 223 669 44 223 670 70 223 671 44 224 672 46 224 673 68 224 674 70 225 675 44 225 676 68 225 677 46 226 678 48 226 679 62 226 680 48 227 681 50 227 682 62 227 683 50 228 684 52 228 685 54 228 686 54 229 687 56 229 688 58 229 689 58 230 690 60 230 691 54 230 692 60 231 693 62 231 694 54 231 695 62 232 696 64 232 697 46 232 698 64 233 699 66 233 700 46 233 701 66 234 702 68 234 703 46 234 704 18 235 705 22 235 706 30 235 707 103 236 708 72 236 709 8 236 710 102 237 711 103 237 712 70 237 713 101 238 714 102 238 715 68 238 716 100 239 717 101 239 718 66 239 719 99 240 720 100 240 721 64 240 722 98 241 723 99 241 724 62 241 725 97 242 726 98 242 727 60 242 728 96 243 729 97 243 730 58 243 731 54 244 732 95 244 733 96 244 734 52 245 735 94 245 736 95 245 737 50 246 738 93 246 739 94 246 740 48 247 741 92 247 742 93 247 743 46 248 744 91 248 745 92 248 746 44 249 747 90 249 748 91 249 749 42 250 750 89 250 751 90 250 752 40 251 753 88 251 754 89 251 755 38 252 756 87 252 757 88 252 758 36 253 759 86 253 760 87 253 761 34 254 762 85 254 763 86 254 764 32 255 765 84 255 766 85 255 767 30 256 768 83 256 769 84 256 770 28 257 771 82 257 772 83 257 773 26 258 774 81 258 775 82 258 776 24 259 777 80 259 778 81 259 779 79 260 780 80 260 781 24 260 782 78 261 783 79 261 784 22 261 785 77 262 786 78 262 787 20 262 788 76 263 789 77 263 790 18 263 791 75 264 792 76 264 793 16 264 794 74 265 795 75 265 796 14 265 797 73 266 798 74 266 799 12 266 800 72 267 801 73 267 802 10 267 803 105 268 804 104 268 805 137 268 806 104 269 807 107 269 808 138 269 809 107 270 810 108 270 811 139 270 812 108 271 813 109 271 814 140 271 815 109 272 816 110 272 817 141 272 818 110 273 819 111 273 820 142 273 821 111 274 822 112 274 823 143 274 824 112 275 825 113 275 826 144 275 827 144 276 828 113 276 829 114 276 830 145 277 831 114 277 832 115 277 833 146 278 834 115 278 835 116 278 836 147 279 837 116 279 838 117 279 839 148 280 840 117 280 841 118 280 842 149 281 843 118 281 844 119 281 845 150 282 846 119 282 847 120 282 848 151 283 849 120 283 850 121 283 851 152 284 852 121 284 853 122 284 854 153 285 855 122 285 856 123 285 857 154 286 858 123 286 859 124 286 860 155 287 861 124 287 862 125 287 863 156 288 864 125 288 865 126 288 866 157 289 867 126 289 868 127 289 869 158 290 870 127 290 871 128 290 872 159 291 873 128 291 874 129 291 875 129 292 876 130 292 877 161 292 878 130 293 879 131 293 880 162 293 881 131 294 882 132 294 883 163 294 884 132 295 885 133 295 886 164 295 887 133 296 888 134 296 889 165 296 890 134 297 891 135 297 892 166 297 893 135 298 894 136 298 895 167 298 896 136 299 897 105 299 898 106 299 899 72 300 900 106 300 901 137 300 902 98 301 903 162 301 904 163 301 905 97 303 909 161 303 910 162 303 911 96 305 915 160 305 916 161 305 917 96 308 924 95 308 925 159 308 926 95 310 930 94 310 931 158 310 932 94 312 936 93 312 937 157 312 938 93 315 945 92 315 946 156 315 947 92 317 951 91 317 952 155 317 953 91 319 957 90 319 958 154 319 959 90 321 963 89 321 964 153 321 965 89 324 972 88 324 973 152 324 974 88 326 978 87 326 979 151 326 980 87 329 987 86 329 988 150 329 989 86 331 993 85 331 994 149 331 995 170 332 996 168 332 997 183 332 998 168 333 999 169 333 1000 184 333 1001 169 334 1002 199 334 1003 185 334 1004 199 335 1005 198 335 1006 186 335 1007 198 336 1008 197 336 1009 186 336 1010 197 337 1011 196 337 1012 187 337 1013 186 338 1014 197 338 1015 187 338 1016 196 339 1017 195 339 1018 188 339 1019 195 340 1020 194 340 1021 188 340 1022 194 341 1023 193 341 1024 190 341 1025 193 342 1026 192 342 1027 190 342 1028 192 343 1029 191 343 1030 190 343 1031 190 344 1032 189 344 1033 194 344 1034 189 345 1035 188 345 1036 194 345 1037 188 346 1038 187 346 1039 196 346 1040 186 347 1041 185 347 1042 199 347 1043 185 348 1044 184 348 1045 169 348 1046 184 349 1047 183 349 1048 168 349 1049 183 350 1050 182 350 1051 170 350 1052 182 351 1053 181 351 1054 170 351 1055 181 352 1056 180 352 1057 171 352 1058 170 353 1059 181 353 1060 171 353 1061 180 354 1062 179 354 1063 172 354 1064 179 355 1065 178 355 1066 172 355 1067 178 356 1068 177 356 1069 174 356 1070 177 357 1071 176 357 1072 174 357 1073 176 358 1074 175 358 1075 174 358 1076 174 359 1077 173 359 1078 178 359 1079 173 360 1080 172 360 1081 178 360 1082
+
+
+
+
+
+ 63 6 18 131 6 19 61 6 20 11 8 24 105 8 25 9 8 26 43 10 30 123 10 31 122 10 32 25 12 36 114 12 37 113 12 38 61 16 48 130 16 49 59 16 50 41 19 57 122 19 58 121 19 59 25 21 63 112 21 64 23 21 65 59 24 72 129 24 73 57 24 74 39 26 78 121 26 79 120 26 80 23 27 81 111 27 82 21 27 83 55 30 90 129 30 91 128 30 92 37 32 96 120 32 97 119 32 98 21 33 99 110 33 100 19 33 101 9 35 105 136 35 106 71 35 107 13 36 108 171 36 109 15 36 110 53 38 114 128 38 115 127 38 116 27 106 318 115 106 319 114 106 320 45 108 324 124 108 325 123 108 326 65 110 330 132 110 331 63 110 332 13 111 333 104 111 334 11 111 335 29 113 339 116 113 340 115 113 341 47 115 345 125 115 346 124 115 347 67 117 351 133 117 352 65 117 353 15 118 354 107 118 355 13 118 356 31 120 360 117 120 361 116 120 362 49 122 366 126 122 367 125 122 368 69 124 372 134 124 373 67 124 374 17 126 378 108 126 379 15 126 380 33 127 381 118 127 382 117 127 383 51 129 387 127 129 388 126 129 389 71 131 393 135 131 394 69 131 395 19 132 396 109 132 397 17 132 398 35 134 402 119 134 403 118 134 404 33 137 411 179 137 412 180 137 413 51 138 414 188 138 415 189 138 416 67 139 417 198 139 418 69 139 419 23 140 420 176 140 421 25 140 422 43 141 423 184 141 424 185 141 425 59 142 426 194 142 427 61 142 428 15 143 429 172 143 430 17 143 431 35 144 432 180 144 433 181 144 434 53 145 435 189 145 436 190 145 437 69 146 438 199 146 439 71 146 440 27 147 441 176 147 442 177 147 443 45 148 444 185 148 445 186 148 446 61 149 447 195 149 448 63 149 449 17 150 450 173 150 451 19 150 452 37 151 453 181 151 454 182 151 455 55 152 456 190 152 457 191 152 458 9 153 459 168 153 460 11 153 461 71 154 462 169 154 463 9 154 464 29 155 465 177 155 466 178 155 467 47 156 468 186 156 469 187 156 470 63 157 471 196 157 472 65 157 473 19 158 474 174 158 475 21 158 476 39 159 477 182 159 478 183 159 479 57 160 480 191 160 481 192 160 482 11 161 483 170 161 484 13 161 485 31 162 486 178 162 487 179 162 488 49 163 489 187 163 490 188 163 491 65 164 492 197 164 493 67 164 494 21 165 495 175 165 496 23 165 497 41 166 498 183 166 499 184 166 500 57 167 501 193 167 502 59 167 503 63 174 522 132 174 523 131 174 524 11 176 528 104 176 529 105 176 530 43 178 534 45 178 535 123 178 536 25 180 540 27 180 541 114 180 542 61 184 552 131 184 553 130 184 554 41 187 561 43 187 562 122 187 563 25 189 567 113 189 568 112 189 569 59 192 576 130 192 577 129 192 578 39 194 582 41 194 583 121 194 584 23 195 585 112 195 586 111 195 587 55 198 594 57 198 595 129 198 596 37 200 600 39 200 601 120 200 602 21 201 603 111 201 604 110 201 605 9 203 609 105 203 610 136 203 611 13 204 612 170 204 613 171 204 614 53 206 618 55 206 619 128 206 620 27 302 906 29 302 907 115 302 908 45 304 912 47 304 913 124 304 914 65 306 918 133 306 919 132 306 920 13 307 921 107 307 922 104 307 923 29 309 927 31 309 928 116 309 929 47 311 933 49 311 934 125 311 935 67 313 939 134 313 940 133 313 941 15 314 942 108 314 943 107 314 944 31 316 948 33 316 949 117 316 950 49 318 954 51 318 955 126 318 956 69 320 960 135 320 961 134 320 962 17 322 966 109 322 967 108 322 968 33 323 969 35 323 970 118 323 971 51 325 975 53 325 976 127 325 977 71 327 981 136 327 982 135 327 983 19 328 984 110 328 985 109 328 986 35 330 990 37 330 991 119 330 992 33 361 1083 31 361 1084 179 361 1085 51 362 1086 49 362 1087 188 362 1088 67 363 1089 197 363 1090 198 363 1091 23 364 1092 175 364 1093 176 364 1094 43 365 1095 41 365 1096 184 365 1097 59 366 1098 193 366 1099 194 366 1100 15 367 1101 171 367 1102 172 367 1103 35 368 1104 33 368 1105 180 368 1106 53 369 1107 51 369 1108 189 369 1109 69 370 1110 198 370 1111 199 370 1112 27 371 1113 25 371 1114 176 371 1115 45 372 1116 43 372 1117 185 372 1118 61 373 1119 194 373 1120 195 373 1121 17 374 1122 172 374 1123 173 374 1124 37 375 1125 35 375 1126 181 375 1127 55 376 1128 53 376 1129 190 376 1130 9 377 1131 169 377 1132 168 377 1133 71 378 1134 199 378 1135 169 378 1136 29 379 1137 27 379 1138 177 379 1139 47 380 1140 45 380 1141 186 380 1142 63 381 1143 195 381 1144 196 381 1145 19 382 1146 173 382 1147 174 382 1148 39 383 1149 37 383 1150 182 383 1151 57 384 1152 55 384 1153 191 384 1154 11 385 1155 168 385 1156 170 385 1157 31 386 1158 29 386 1159 178 386 1160 49 387 1161 47 387 1162 187 387 1163 65 388 1164 196 388 1165 197 388 1166 21 389 1167 174 389 1168 175 389 1169 41 390 1170 39 390 1171 183 390 1172 57 391 1173 192 391 1174 193 391 1175
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -1.029198 -1.021838 0.09228229 -13.07551 -0.9260871 0.05411165 -1.035489 -1.00146 0.2991693 -13.08123 -0.9075493 0.2423195 -1.041538 -0.9411104 0.4981057 -13.08673 -0.8526484 0.4232947 -1.047113 -0.8431079 0.6814466 -13.0918 -0.7634943 0.5900822 -1.052 -0.7112189 0.8421461 -13.09625 -0.6435131 0.7362728 -1.05601 -0.5505115 0.9740288 -13.0999 -0.4973154 0.8562483 -1.05899 -0.3671619 1.072026 -13.10261 -0.3305197 0.9453981 -1.060825 -0.1682159 1.132373 -13.10428 -0.1495358 1.000296 -1.061444 0.03868103 1.15275 -13.10484 0.03868103 1.018833 -1.060825 0.2455779 1.132373 -13.10428 0.2268979 1.000296 -1.05899 0.4445239 1.072026 -13.10261 0.4078818 0.9453981 -1.05601 0.6278736 0.9740288 -13.0999 0.5746775 0.8562483 -1.052 0.788581 0.8421461 -13.09625 0.7208752 0.7362728 -1.047113 0.92047 0.6814466 -13.0918 0.8408564 0.5900822 -1.041538 1.018472 0.4981057 -13.08673 0.9300105 0.4232947 -1.035489 1.078822 0.2991693 -13.08123 0.9849113 0.2423195 -1.029198 1.0992 0.09228229 -13.07551 1.003449 0.05411165 -1.022907 1.078822 -0.1146046 -13.06978 0.9849113 -0.1340961 -1.016858 1.018472 -0.313541 -13.06428 0.9300105 -0.3150712 -1.011282 0.92047 -0.4968819 -13.05921 0.8408564 -0.4818589 -1.006396 0.788581 -0.6575814 -13.05476 0.7208752 -0.6280494 -1.002386 0.6278736 -0.7894641 -13.05111 0.5746775 -0.7480249 -0.9994054 0.4445239 -0.8874619 -13.0484 0.4078818 -0.8371747 -0.9975705 0.2455779 -0.9478086 -13.04673 0.2268979 -0.8920729 -0.9969511 0.03868103 -0.9681852 -13.04617 0.03868103 -0.9106098 -0.9975705 -0.1682159 -0.9478086 -13.04673 -0.1495358 -0.8920729 -0.9994054 -0.3671619 -0.8874619 -13.0484 -0.3305197 -0.8371747 -1.002386 -0.5505115 -0.7894641 -13.05111 -0.4973154 -0.7480249 -1.006396 -0.7112189 -0.6575814 -13.05476 -0.6435131 -0.6280494 -1.011282 -0.8431079 -0.4968819 -13.05921 -0.7634943 -0.4818589 -1.016858 -0.9411104 -0.313541 -13.06428 -0.8526484 -0.3150712 -1.022907 -1.00146 -0.1146046 -13.06978 -0.9075493 -0.1340961 -11.32141 -1.021838 0.05966985 -11.3277 -1.00146 0.2665568 -11.33375 -0.9411104 0.4654932 -11.33932 -0.8431079 0.6488341 -11.34421 -0.7112189 0.8095336 -11.34822 -0.5505115 0.9414163 -11.3512 -0.3671619 1.039414 -11.35303 -0.1682159 1.099761 -11.35365 0.03868103 1.120137 -11.35303 0.2455779 1.099761 -11.3512 0.4445239 1.039414 -11.34822 0.6278736 0.9414163 -11.34421 0.788581 0.8095336 -11.33932 0.92047 0.6488341 -11.33375 1.018472 0.4654932 -11.3277 1.078822 0.2665568 -11.32141 1.0992 0.05966985 -11.31511 1.078822 -0.147217 -11.30907 1.018472 -0.3461534 -11.30349 0.92047 -0.5294944 -11.2986 0.788581 -0.6901939 -11.29459 0.6278736 -0.8220766 -11.29161 0.4445239 -0.9200744 -11.28978 0.2455779 -0.9804211 -11.28916 0.03868103 -1.000798 -11.28978 -0.1682159 -0.9804211 -11.29161 -0.3671619 -0.9200744 -11.29459 -0.5505115 -0.8220766 -11.2986 -0.7112189 -0.6901939 -11.30349 -0.8431079 -0.5294944 -11.30907 -0.9411104 -0.3461534 -11.31511 -1.00146 -0.147217 -13.2208 -1.165141 0.2931191 -13.21352 -1.188725 0.05367594 -11.18339 -1.188725 0.06010878 -13.2278 -1.095295 0.5233605 -13.23426 -0.9818704 0.7355521 -13.23991 -0.8292271 0.9215397 -13.24455 -0.6432306 1.074176 -13.248 -0.4310286 1.187595 -13.25012 -0.2007761 1.257437 -13.25084 0.03867846 1.281021 -13.25012 0.2781331 1.257437 -13.248 0.5083857 1.187595 -13.24455 0.7205875 1.074176 -13.23991 0.906584 0.9215397 -13.23426 1.059227 0.7355521 -13.2278 1.172652 0.5233605 -13.2208 1.242498 0.2931191 -13.21352 1.266082 0.05367594 -13.20624 1.242498 -0.185767 -13.19924 1.172652 -0.4160085 -13.19279 1.059227 -0.6282001 -13.18713 0.906584 -0.8141877 -13.18249 0.7205875 -0.9668237 -13.17904 0.5083857 -1.080242 -13.17692 0.2781331 -1.150085 -13.1762 0.03867846 -1.173668 -13.17692 -0.2007761 -1.150085 -13.17904 -0.4310286 -1.080242 -13.18249 -0.6432306 -0.9668237 -13.18713 -0.8292271 -0.8141877 -13.19279 -0.9818704 -0.6282001 -13.19924 -1.095295 -0.4160085 -13.20624 -1.165141 -0.185767 -11.19067 -1.165141 0.2995519 -11.19768 -1.095295 0.5297933 -11.20413 -0.9818704 0.7419849 -11.20978 -0.8292271 0.9279725 -11.21442 -0.6432306 1.080609 -11.21787 -0.4310286 1.194027 -11.22 -0.2007761 1.26387 -11.22071 0.03867846 1.287454 -11.22 0.2781331 1.26387 -11.21787 0.5083857 1.194027 -11.21442 0.7205875 1.080609 -11.20978 0.906584 0.9279725 -11.20413 1.059227 0.7419849 -11.19768 1.172652 0.5297933 -11.19067 1.242498 0.2995519 -11.18339 1.266082 0.06010878 -11.17611 1.242498 -0.1793342 -11.16911 1.172652 -0.4095757 -11.16266 1.059227 -0.6217674 -11.157 0.906584 -0.8077549 -11.15236 0.7205875 -0.9603909 -11.14891 0.5083857 -1.07381 -11.14679 0.2781331 -1.143653 -11.14607 0.03867846 -1.167236 -11.14679 -0.2007761 -1.143653 -11.14891 -0.4310286 -1.07381 -11.15236 -0.6432306 -0.9603909 -11.157 -0.8292271 -0.8077549 -11.16266 -0.9818704 -0.6217674 -11.16911 -1.095295 -0.4095757 -11.17611 -1.165141 -0.1793342 -12.37012 -0.9075493 0.2423195 -12.36439 -0.9260871 0.05411165 -12.37562 -0.8526484 0.4232947 -12.38069 -0.7634943 0.5900822 -12.38514 -0.6435131 0.7362728 -12.38878 -0.4973154 0.8562483 -12.39149 -0.3305197 0.9453981 -12.39316 -0.1495358 1.000296 -12.39373 0.03868103 1.018833 -12.39316 0.2268979 1.000296 -12.39149 0.4078818 0.9453981 -12.38878 0.5746775 0.8562483 -12.38514 0.7208752 0.7362728 -12.38069 0.8408564 0.5900822 -12.37562 0.9300105 0.4232947 -12.37012 0.9849113 0.2423195 -12.36439 1.003449 0.05411165 -12.35867 0.9849113 -0.1340961 -12.35317 0.9300105 -0.3150712 -12.34809 0.8408564 -0.4818589 -12.34365 0.7208752 -0.6280494 -12.34 0.5746775 -0.7480249 -12.33729 0.4078818 -0.8371747 -12.33562 0.2268979 -0.8920729 -12.33506 0.03868103 -0.9106098 -12.33562 -0.1495358 -0.8920729 -12.33729 -0.3305197 -0.8371747 -12.34 -0.4973154 -0.7480249 -12.34365 -0.6435131 -0.6280494 -12.34809 -0.7634943 -0.4818589 -12.35317 -0.8526484 -0.3150712 -12.35867 -0.9075493 -0.1340961
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0.8941683 -0.2222697 -0.3886633 -0.7594906 -0.4012401 -0.5120357 0.8828371 -0.4640426 0.07254731 -0.7724652 -0.6138536 0.1627306 0.8872783 0.4481748 -0.1089794 -0.7611508 -0.4898042 -0.4251367 0.8727791 0.04525226 0.4860131 -0.77473 -0.5671193 0.2795876 -0.7631157 -0.5600127 -0.3225528 -0.7767819 -0.4981881 0.3852513 0.8950523 -0.1369878 -0.4244005 -0.7653151 -0.6091054 -0.2080466 -0.7785387 -0.4096266 0.4754825 0.8850703 0.4650736 -0.01889383 -0.7676645 -0.6350692 -0.08589661 0.8727794 -0.04525202 0.4860126 -0.7799258 -0.3048331 0.5466191 -0.7808818 -0.1879143 0.5957447 0.8955017 -0.0462808 -0.4426452 -0.7813735 -0.06348055 0.6208267 0.8828312 0.4640527 0.07255399 0.8732033 -0.1340745 0.468551 -0.7813704 0.06348419 0.6208303 -0.7808813 0.1879113 0.5957465 0.8955028 0.04627645 -0.4426436 -0.7799205 0.3048373 0.5466244 0.8806509 0.4452611 0.1618527 0.8740326 -0.2179008 0.4342651 -0.7785317 0.4096328 0.4754884 0.885073 -0.4650686 -0.0188899 0 -0.8819118 0.4714145 -0.7767751 0.4981939 0.3852576 0.8950505 0.1369909 -0.4244032 -0.999538 0 -0.03039497 -3.10569e-4 0.9951851 0.0980128 -9.19771e-4 0.9569439 0.2902716 -0.001493632 0.8819297 0.4713785 -0.002010107 0.7730239 0.6343737 -0.002449333 0.6344096 0.7729933 -0.002794444 0.4714126 0.8819083 -0.003032147 0.2902965 0.956932 -0.003153324 0.0980212 0.9951794 -0.003153324 -0.0980212 0.9951794 -0.003032147 -0.2902965 0.956932 -0.002794444 -0.4714127 0.8819083 -0.002449333 -0.6344096 0.7729933 -0.002010107 -0.7730239 0.6343737 -0.001493632 -0.8819298 0.4713786 -9.1977e-4 -0.9569439 0.2902717 -3.10569e-4 -0.9951851 0.09801274 3.10569e-4 -0.9951851 -0.0980128 9.19771e-4 -0.9569439 -0.2902716 0.001493632 -0.8819298 -0.4713785 0.002010107 -0.7730239 -0.6343737 0.002449333 -0.6344096 -0.7729932 0.002794444 -0.4714125 -0.8819085 0.003032147 -0.2902963 -0.9569321 0.003153324 -0.0980212 -0.9951794 0.003153324 0.0980212 -0.9951794 0.003032147 0.2902963 -0.9569321 0.002794444 0.4714124 -0.8819085 0.002449333 0.6344096 -0.7729933 0.002010107 0.7730239 -0.6343737 0.001493632 0.8819298 -0.4713784 9.19771e-4 0.9569439 -0.2902716 3.10569e-4 0.9951851 -0.0980128 3.10569e-4 0.9951851 -0.09801256 9.19771e-4 0.9569439 -0.2902715 0.001493632 0.8819294 -0.4713791 0.002010107 0.7730241 -0.6343735 0.002449333 0.6344098 -0.772993 0.002794444 0.4714125 -0.8819084 0.003032147 0.2902956 -0.9569323 0.003153324 0.09802216 -0.9951792 0.003153324 -0.09802216 -0.9951792 0.003032147 -0.2902955 -0.9569323 0.002794444 -0.4714127 -0.8819083 0.002449333 -0.6344098 -0.772993 0.002010107 -0.7730239 -0.6343738 0.001493632 -0.8819299 -0.4713783 9.1977e-4 -0.9569439 -0.2902715 3.1057e-4 -0.9951851 -0.09801304 -3.10571e-4 -0.9951851 0.09801304 -9.19774e-4 -0.9569439 0.2902715 -0.001493632 -0.8819299 0.4713782 -0.002010107 -0.7730239 0.6343738 -0.002449333 -0.6344095 0.7729933 -0.002794444 -0.4714127 0.8819083 -0.003032147 -0.290296 0.9569321 -0.003153324 -0.0980212 0.9951793 -0.003153324 0.0980212 0.9951793 -0.003032147 0.290296 0.9569321 -0.002794444 0.4714125 0.8819084 -0.002449333 0.6344095 0.7729933 -0.002010107 0.7730241 0.6343735 -0.001493632 0.8819295 0.471379 -9.19774e-4 0.9569439 0.2902715 -3.10569e-4 0.9951851 0.09801256 -0.7700789 -0.6367371 0.03929841 -0.7581936 -0.297728 -0.5800868 0.8732012 0.1340731 0.4685552 -0.757301 -0.1831607 -0.6268552 0.8893725 0.4138886 -0.1941975 -0.7568462 -0.06181395 -0.6506634 0.8928914 -0.2987453 -0.336892 0.880655 -0.4452542 0.1618498 -0.7568458 0.06181484 -0.6506638 0.874032 0.2179043 0.4342647 -0.7572976 0.183161 -0.6268591 0.8912675 0.3634544 -0.2711885 -0.7581882 0.2977299 -0.5800927 0.8912702 -0.3634505 -0.2711846 0.8786135 -0.4095197 0.2456251 -0.7594863 0.4012453 -0.512038 0.8752397 0.2936017 0.3843871 -0.7611442 0.489811 -0.4251408 0.8928881 0.2987513 -0.3368952 -0.763107 0.5600218 -0.3225575 0.889375 -0.4138855 -0.1941931 -0.7653036 0.6091177 -0.2080531 0.8767886 -0.3582999 0.3207228 0.8767853 0.3583039 0.3207269 -0.767655 0.6350807 -0.08589726 0.8941677 0.2222674 -0.388666 -0.7700694 0.6367484 0.03930032 0.8872823 -0.4481672 -0.108978 0.875243 -0.2935997 0.3843812 -0.7724559 0.6138642 0.1627345 0.8786115 0.4095251 0.2456239 -0.7747213 0.5671287 0.2795924 0.9995381 0 0.03039199 0 0.6343747 0.7730258 0 0.6343749 -0.7730256 0 -0.8819119 -0.4714143 0 -0.0980122 0.9951852 0 0.9951843 -0.09802252 0 -0.2902718 -0.9569442 0 -0.7729956 0.6344113 0 0.7729956 0.6344113 0 0.471379 -0.8819307 0 -0.9569364 -0.2902974 0 0.0980122 0.9951852 0 0.9569364 -0.2902974 0 -0.4713791 -0.8819307 0 -0.6343747 0.7730258 0 0.8819118 0.4714145 0 0.2902718 -0.9569443 0 -0.9951843 0.09802216 0 -0.9951843 -0.09802216 0 0.2902721 0.9569442 0 0.8819119 -0.4714143 0 -0.6343749 -0.7730256 0 -0.4713791 0.8819307 0 0.9569365 0.2902973 0 0.0980125 -0.9951852 0 -0.9569365 0.2902973 0 0.471379 0.8819307 0 0.7729955 -0.6344115 0 -0.7729955 -0.6344115 0 -0.2902721 0.9569442 0 0.9951843 0.09802252 0 -0.0980125 -0.9951852 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0.8941695 -0.2222657 -0.3886629 -0.7594923 -0.4012407 -0.5120325 0.882835 -0.4640455 0.07255315 -0.7724655 -0.6138532 0.1627309 0.8872786 0.4481739 -0.1089801 -0.7611516 -0.4898043 -0.4251353 0.8727791 0.04525208 0.4860132 -0.7747301 -0.5671191 0.2795876 -0.7631152 -0.5600128 -0.3225535 -0.7767824 -0.4981871 0.3852515 0.8950516 -0.1369903 -0.4244012 -0.7653131 -0.6091068 -0.20805 -0.7785379 -0.409628 0.4754825 0.8850692 0.465076 -0.01889091 -0.7676648 -0.635069 -0.08589607 0.8727796 -0.0452522 0.4860125 -0.7799251 -0.3048346 0.5466194 -0.780884 -0.1879104 0.5957431 0.8955031 -0.04627633 -0.4426429 -0.7813713 -0.06348413 0.6208291 0.8828333 0.4640498 0.07254803 0.8732024 -0.1340726 0.4685533 -0.7813725 0.06348067 0.6208279 -0.7808791 0.1879153 0.5957481 0.8955014 0.04628086 -0.4426459 -0.7799214 0.3048357 0.5466241 0.8806513 0.4452608 0.1618518 0.8740338 -0.2179027 0.4342619 -0.7785325 0.4096314 0.4754884 0.8850741 -0.4650665 -0.01889276 0 -0.8819118 0.4714145 -0.7767744 0.4981952 0.3852573 0.8950512 0.1369885 -0.4244025 -0.999538 0 -0.03039342 -0.9995381 0 -0.03039342 -0.999538 0 -0.03039342 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.999538 1.22952e-7 -0.03039449 -0.9995381 0 -0.03039324 -0.9995378 4.06942e-6 -0.0304048 -0.9995383 0 -0.03038418 -0.9995381 0 -0.03039139 -0.9995379 -7.002e-7 -0.03039848 -0.999538 0 -0.03039336 -0.9995381 0 -0.03039437 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.9995381 0 -0.03039342 -0.999538 0 -0.03039342 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.999538 1.22952e-7 -0.03039449 -0.9995381 0 -0.03039324 -0.9995378 4.07804e-6 -0.0304048 -0.9995383 0 -0.03038418 -0.9995381 0 -0.03039133 -0.9995379 -7.01981e-7 -0.03039848 -0.999538 0 -0.03039336 -0.9995381 0 -0.03039437 -0.999538 0 -0.03039473 -0.999538 0 -0.03039497 -3.10569e-4 0.995185 0.09801274 -9.19771e-4 0.9569439 0.2902717 -0.001493632 0.8819298 0.4713785 -0.002010107 0.7730239 0.6343737 -0.002449333 0.6344095 0.7729932 -0.002794444 0.4714126 0.8819083 -0.003032147 0.2902962 0.956932 -0.003153324 0.0980212 0.9951794 -0.003153324 -0.0980212 0.9951794 -0.003032147 -0.2902962 0.956932 -0.002794444 -0.4714126 0.8819083 -0.002449333 -0.6344095 0.7729932 -0.002010107 -0.7730239 0.6343737 -0.001493632 -0.8819298 0.4713785 -9.19771e-4 -0.9569439 0.2902717 -3.10569e-4 -0.995185 0.09801274 3.10569e-4 -0.995185 -0.09801274 9.1977e-4 -0.9569439 -0.2902716 0.001493632 -0.8819296 -0.4713786 0.002010107 -0.7730239 -0.6343737 0.002449333 -0.6344095 -0.7729932 0.002794444 -0.4714126 -0.8819083 0.003032147 -0.2902963 -0.9569321 0.003153324 -0.0980212 -0.9951794 0.003153324 0.0980212 -0.9951794 0.003032147 0.2902963 -0.9569321 0.002794444 0.4714126 -0.8819083 0.002449333 0.6344095 -0.7729932 0.002010107 0.7730239 -0.6343737 0.001493632 0.8819296 -0.4713786 9.1977e-4 0.9569439 -0.2902716 3.10569e-4 0.995185 -0.09801274 3.10568e-4 0.9951851 -0.09801256 9.1977e-4 0.9569439 -0.2902715 0.001493632 0.8819294 -0.4713791 0.002010107 0.7730241 -0.6343735 0.002449333 0.6344098 -0.772993 0.002794444 0.4714125 -0.8819084 0.003032147 0.2902956 -0.9569323 0.003153324 0.09802216 -0.9951792 0.003153324 -0.09802216 -0.9951792 0.003032147 -0.2902955 -0.9569323 0.002794444 -0.4714127 -0.8819083 0.002449333 -0.6344098 -0.772993 0.002010107 -0.7730239 -0.6343738 0.001493632 -0.8819299 -0.4713783 9.1977e-4 -0.9569439 -0.2902715 3.10569e-4 -0.9951851 -0.09801304 -3.1057e-4 -0.9951851 0.09801304 -9.19774e-4 -0.9569439 0.2902715 -0.001493632 -0.8819299 0.4713783 -0.002010107 -0.7730239 0.6343738 -0.002449333 -0.6344095 0.7729933 -0.002794444 -0.4714127 0.8819083 -0.003032147 -0.290296 0.9569321 -0.003153324 -0.09802114 0.9951793 -0.003153324 0.0980212 0.9951793 -0.003032147 0.290296 0.9569321 -0.002794444 0.4714125 0.8819084 -0.002449333 0.6344095 0.7729933 -0.002010107 0.7730241 0.6343735 -0.001493632 0.8819294 0.4713791 -9.19774e-4 0.9569439 0.2902715 -3.10568e-4 0.9951851 0.09801256 -0.7700791 -0.6367368 0.03929859 -0.7581927 -0.2977272 -0.5800882 0.8732022 0.1340751 0.4685529 -0.7573004 -0.1831601 -0.626856 0.8893718 0.4138911 -0.1941962 -0.7568467 -0.06181472 -0.6506627 0.8928905 -0.2987484 -0.3368916 0.8806548 -0.4452545 0.1618508 -0.7568453 0.06181406 -0.6506645 0.8740308 0.2179023 0.434268 -0.7572982 0.1831617 -0.6268582 0.8912673 0.3634549 -0.2711883 -0.758189 0.2977305 -0.5800914 0.8912703 -0.3634502 -0.2711848 0.8786148 -0.4095195 0.2456215 -0.7594844 0.4012446 -0.5120411 0.8752405 0.2936025 0.3843846 -0.7611435 0.489811 -0.425142 0.892889 0.2987483 -0.3368956 -0.7631069 0.5600219 -0.3225574 0.889376 -0.4138827 -0.1941947 -0.7653056 0.6091163 -0.2080496 0.8767883 -0.3582998 0.3207234 0.8767856 0.358304 0.3207261 -0.7676548 0.6350808 -0.08589744 0.8941666 0.2222713 -0.3886663 -0.7700691 0.6367489 0.03929984 0.887282 -0.448168 -0.1089772 0.8752421 -0.2935988 0.3843837 -0.7724557 0.6138646 0.1627342 0.8786101 0.4095254 0.2456281 -0.7747215 0.5671283 0.2795926 0.9995381 0 0.03039175 0.9995381 0 0.03038871 0.9995378 0 0.03039884 0.9995381 0 0.03039175 0.999538 0 0.03039371 0.9995379 0 0.03039848 0.999538 0 0.03039371 0.9995381 0 0.0303905 0.999538 -6.83533e-7 0.03039747 0.9995383 0 0.03038638 0.9995374 -2.77787e-6 0.03041458 0.9995391 8.22688e-6 0.03035926 0.9995379 0 0.03039872 0.9995381 9.20489e-7 0.03038936 0.9995378 0 0.03039848 0.9995381 0 0.03039175 0.9995379 0 0.03039884 0.9995382 0 0.03038877 0.9995381 0 0.03039175 0.9995378 0 0.03039944 0.9995381 0 0.03039199 0.9995379 0 0.03039944 0.9995381 0 0.0303905 0.999538 -6.82176e-7 0.03039747 0.9995383 0 0.03038632 0.9995381 -2.51798e-7 0.03038889 0.9995383 7.46237e-7 0.03038388 0.9995379 0 0.03039872 0.9995381 9.18663e-7 0.03038942 0 0.6343747 0.7730258 0 0.6343749 -0.7730256 0 -0.8819119 -0.4714143 0 -0.0980122 0.9951852 0 0.9951843 -0.09802252 0 -0.2902718 -0.9569442 0 -0.7729956 0.6344113 0 0.7729956 0.6344113 0 0.4713791 -0.8819307 0 -0.9569364 -0.2902974 0 0.0980122 0.9951852 0 0.9569364 -0.2902974 0 -0.4713791 -0.8819307 0 -0.6343747 0.7730258 0 0.8819118 0.4714145 0 0.2902718 -0.9569442 0 -0.9951843 0.09802216 0 -0.9951843 -0.09802216 0 0.2902721 0.9569442 0 0.8819119 -0.4714143 0 -0.6343749 -0.7730256 0 -0.4713791 0.8819307 0 0.9569365 0.2902973 0 0.0980125 -0.9951852 0 -0.9569365 0.2902973 0 0.4713791 0.8819307 0 0.7729955 -0.6344115 0 -0.7729955 -0.6344115 0 -0.2902721 0.9569442 0 0.9951843 0.09802252 0 -0.0980125 -0.9951852
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.05044728 0.3833369 0.02826887 0.341844 0.02826887 0.341844 0.15625 0.8988949 0.125 0.8988949 0.125 0.8988949 0.2968217 0.4853885 0.25 0.49 0.25 0.49 0.96875 0.8988949 0.9375 0.8988949 0.9375 0.8988949 0.2031783 0.01461154 0.1581559 0.02826887 0.2031783 0.01461154 0.125 0.8988949 0.09375 0.8988949 0.09375 0.8988949 0.49 0.25 0.4853885 0.2031783 0.49 0.25 0.9375 0.8988949 0.90625 0.8988949 0.90625 0.8988949 0.09375 0.8988949 0.0625 0.8988949 0.0625 0.8988949 0.90625 0.8988949 0.875 0.8988949 0.875 0.8988949 0.02826887 0.341844 0.01461154 0.2968217 0.01461154 0.2968217 0.0625 0.8988949 0.03125 0.8988949 0.03125 0.8988949 0.875 0.8988949 0.84375 0.8988949 0.84375 0.8988949 0.25 0.00999999 0.2031783 0.01461154 0.25 0.00999999 0.03125 0.8988949 0 0.8988949 0 0.8988949 0.49 0.25 0.4853885 0.2968217 0.4853885 0.2968217 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.78125 0.8988949 0.78125 0.8988949 0.01461154 0.2968217 0.00999999 0.25 0.00999999 0.25 0.78125 0.8988949 0.75 0.8988949 0.75 0.8988949 0.2968217 0.01461154 0.25 0.00999999 0.2968217 0.01461154 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.71875 0.8988949 0.75 0.8988949 0.71875 0.8988949 0.6875 0.8988949 0.71875 0.8988949 0.6875 0.8988949 0.01461154 0.2031783 0.00999999 0.25 0.01461154 0.2031783 0.65625 0.8988949 0.6875 0.8988949 0.65625 0.8988949 0.341844 0.02826887 0.2968217 0.01461154 0.341844 0.02826887 0.4717311 0.341844 0.4495527 0.3833369 0.4495527 0.3833369 0.625 0.8988949 0.65625 0.8988949 0.625 0.8988949 0.25 0.49 0.2031783 0.4853885 0.2031783 0.4853885 0.341844 0.4717311 0.3833369 0.4495527 0.3833369 0.4495527 0.59375 0.8988949 0.625 0.8988949 0.59375 0.8988949 0.02826887 0.1581559 0.01461154 0.2031783 0.02826887 0.1581559 0.5504473 0.1166631 0.5146116 0.2031783 0.5504473 0.3833369 0.03125 0.8988949 0 0.5 0.03125 0.5 0.0625 0.8988949 0.03125 0.5 0.0625 0.5 0.09375 0.8988949 0.0625 0.5 0.09375 0.5 0.125 0.8988949 0.09375 0.5 0.125 0.5 0.15625 0.8988949 0.125 0.5 0.15625 0.5 0.1875 0.8988949 0.15625 0.5 0.1875 0.5 0.21875 0.8988949 0.1875 0.5 0.21875 0.5 0.25 0.8988949 0.21875 0.5 0.25 0.5 0.28125 0.5 0.25 0.8988949 0.25 0.5 0.3125 0.5 0.28125 0.8988949 0.28125 0.5 0.34375 0.5 0.3125 0.8988949 0.3125 0.5 0.375 0.5 0.34375 0.8988949 0.34375 0.5 0.40625 0.5 0.375 0.8988949 0.375 0.5 0.4375 0.5 0.40625 0.8988949 0.40625 0.5 0.46875 0.5 0.4375 0.8988949 0.4375 0.5 0.5 0.5 0.46875 0.8988949 0.46875 0.5 0.53125 0.5 0.5 0.8988949 0.5 0.5 0.5625 0.5 0.53125 0.8988949 0.53125 0.5 0.59375 0.5 0.5625 0.8988949 0.5625 0.5 0.625 0.5 0.59375 0.8988949 0.59375 0.5 0.65625 0.5 0.625 0.8988949 0.625 0.5 0.6875 0.5 0.65625 0.8988949 0.65625 0.5 0.71875 0.5 0.6875 0.8988949 0.6875 0.5 0.75 0.5 0.71875 0.8988949 0.71875 0.5 0.78125 0.8988949 0.75 0.5 0.78125 0.5 0.8125 0.8988949 0.78125 0.5 0.8125 0.5 0.84375 0.8988949 0.8125 0.5 0.84375 0.5 0.875 0.8988949 0.84375 0.5 0.875 0.5 0.90625 0.8988949 0.875 0.5 0.90625 0.5 0.9375 0.8988949 0.90625 0.5 0.9375 0.5 0.96875 0.8988949 0.9375 0.5 0.96875 0.5 1 0.8988949 0.96875 0.5 1 0.5 1 1 0.96875 0.8988949 1 0.8988949 0.96875 1 0.9375 0.8988949 0.96875 0.8988949 0.9375 1 0.90625 0.8988949 0.9375 0.8988949 0.90625 1 0.875 0.8988949 0.90625 0.8988949 0.875 1 0.84375 0.8988949 0.875 0.8988949 0.84375 1 0.8125 0.8988949 0.84375 0.8988949 0.8125 1 0.78125 0.8988949 0.8125 0.8988949 0.78125 1 0.75 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.71875 1 0.71875 0.8988949 0.71875 0.8988949 0.6875 1 0.6875 0.8988949 0.6875 0.8988949 0.65625 1 0.65625 0.8988949 0.65625 0.8988949 0.625 1 0.625 0.8988949 0.625 0.8988949 0.59375 1 0.59375 0.8988949 0.59375 0.8988949 0.5625 1 0.5625 0.8988949 0.5625 0.8988949 0.53125 1 0.53125 0.8988949 0.53125 0.8988949 0.5 1 0.5 0.8988949 0.5 0.8988949 0.46875 1 0.46875 0.8988949 0.46875 0.8988949 0.4375 1 0.4375 0.8988949 0.4375 0.8988949 0.40625 1 0.40625 0.8988949 0.40625 0.8988949 0.375 1 0.375 0.8988949 0.375 0.8988949 0.34375 1 0.34375 0.8988949 0.34375 0.8988949 0.3125 1 0.3125 0.8988949 0.3125 0.8988949 0.28125 1 0.28125 0.8988949 0.28125 0.8988949 0.25 1 0.25 0.8988949 0.25 1 0.21875 0.8988949 0.25 0.8988949 0.21875 1 0.1875 0.8988949 0.21875 0.8988949 0.1875 1 0.15625 0.8988949 0.1875 0.8988949 0.15625 1 0.125 0.8988949 0.15625 0.8988949 0.125 1 0.09375 0.8988949 0.125 0.8988949 0.09375 1 0.0625 0.8988949 0.09375 0.8988949 0.0625 1 0.03125 0.8988949 0.0625 0.8988949 0.03125 1 0 0.8988949 0.03125 0.8988949 1 0.8988949 0.96875 0.8988949 0.96875 0.8988949 0.1875 0.8988949 0.15625 0.8988949 0.15625 0.8988949 0.4853885 0.2031783 0.4717311 0.1581559 0.4853885 0.2031783 0.21875 0.8988949 0.1875 0.8988949 0.1875 0.8988949 0.1581559 0.02826887 0.1166631 0.05044728 0.1581559 0.02826887 0.25 0.8988949 0.21875 0.8988949 0.21875 0.8988949 0.08029437 0.4197056 0.05044728 0.3833369 0.05044728 0.3833369 0.341844 0.4717311 0.2968217 0.4853885 0.2968217 0.4853885 0.25 0.8988949 0.28125 0.8988949 0.25 0.8988949 0.4717311 0.1581559 0.4495527 0.1166631 0.4717311 0.1581559 0.28125 0.8988949 0.3125 0.8988949 0.28125 0.8988949 0.1166631 0.05044728 0.08029437 0.08029437 0.1166631 0.05044728 0.3125 0.8988949 0.34375 0.8988949 0.3125 0.8988949 0.1166631 0.4495527 0.08029437 0.4197056 0.08029437 0.4197056 0.3833369 0.4495527 0.341844 0.4717311 0.341844 0.4717311 0.34375 0.8988949 0.375 0.8988949 0.34375 0.8988949 0.4495527 0.1166631 0.4197056 0.08029437 0.4495527 0.1166631 0.375 0.8988949 0.40625 0.8988949 0.375 0.8988949 0.08029437 0.08029437 0.05044728 0.1166631 0.08029437 0.08029437 0.40625 0.8988949 0.4375 0.8988949 0.40625 0.8988949 0.1581559 0.4717311 0.1166631 0.4495527 0.1166631 0.4495527 0.4375 0.8988949 0.46875 0.8988949 0.4375 0.8988949 0.4197056 0.4197056 0.3833369 0.4495527 0.3833369 0.4495527 0.4197056 0.08029437 0.3833369 0.05044728 0.4197056 0.08029437 0.46875 0.8988949 0.5 0.8988949 0.46875 0.8988949 0.05044728 0.1166631 0.02826887 0.1581559 0.05044728 0.1166631 0.5 0.8988949 0.53125 0.8988949 0.5 0.8988949 0.2031783 0.4853885 0.1581559 0.4717311 0.1581559 0.4717311 0.4495527 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.53125 0.8988949 0.5625 0.8988949 0.53125 0.8988949 0.3833369 0.05044728 0.341844 0.02826887 0.3833369 0.05044728 0.5625 0.8988949 0.59375 0.8988949 0.5625 0.8988949 0.4197056 0.4197056 0.3833369 0.4495527 0.4197056 0.08029437 0.4197056 0.08029437 0.4495527 0.1166631 0.4197056 0.08029437 0.05044728 0.1166631 0.08029437 0.08029437 0.05044728 0.1166631 0.1166631 0.4495527 0.1581559 0.4717311 0.1581559 0.4717311 0.4853885 0.2968217 0.49 0.25 0.49 0.25 0.2031783 0.01461154 0.25 0.00999999 0.2031783 0.01461154 0.01461154 0.2968217 0.02826887 0.341844 0.02826887 0.341844 0.3833369 0.4495527 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.05044728 0.4197056 0.08029437 0.3833369 0.05044728 0.02826887 0.1581559 0.05044728 0.1166631 0.02826887 0.1581559 0.1581559 0.4717311 0.2031783 0.4853885 0.2031783 0.4853885 0.4853885 0.2031783 0.49 0.25 0.4853885 0.2031783 0.1581559 0.02826887 0.2031783 0.01461154 0.1581559 0.02826887 0.02826887 0.341844 0.05044728 0.3833369 0.05044728 0.3833369 0.4197056 0.4197056 0.4495527 0.3833369 0.4495527 0.3833369 0.341844 0.02826887 0.3833369 0.05044728 0.341844 0.02826887 0.01461154 0.2031783 0.02826887 0.1581559 0.01461154 0.2031783 0.25 0.49 0.2968217 0.4853885 0.2968217 0.4853885 0.2031783 0.4853885 0.25 0.49 0.25 0.49 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.1581559 0.1166631 0.05044728 0.1581559 0.02826887 0.1166631 0.05044728 0.05044728 0.3833369 0.08029437 0.4197056 0.08029437 0.4197056 0.4495527 0.3833369 0.4717311 0.341844 0.4717311 0.341844 0.2968217 0.01461154 0.341844 0.02826887 0.2968217 0.01461154 0.00999999 0.25 0.01461154 0.2031783 0.00999999 0.25 0.2968217 0.4853885 0.341844 0.4717311 0.341844 0.4717311 0.4495527 0.1166631 0.4717311 0.1581559 0.4495527 0.1166631 0.08029437 0.08029437 0.1166631 0.05044728 0.08029437 0.08029437 0.08029437 0.4197056 0.1166631 0.4495527 0.1166631 0.4495527 0.4717311 0.341844 0.4853885 0.2968217 0.4853885 0.2968217 0.25 0.00999999 0.2968217 0.01461154 0.25 0.00999999 0.00999999 0.25 0.01461154 0.2968217 0.01461154 0.2968217 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 0.05044728 0.3833369 0.05044728 0.3833369 0.02826887 0.341844 0.15625 0.8988949 0.15625 0.8988949 0.125 0.8988949 0.2968217 0.4853885 0.2968217 0.4853885 0.25 0.49 0.96875 0.8988949 0.96875 0.8988949 0.9375 0.8988949 0.2031783 0.01461154 0.1581559 0.02826887 0.1581559 0.02826887 0.125 0.8988949 0.125 0.8988949 0.09375 0.8988949 0.49 0.25 0.4853885 0.2031783 0.4853885 0.2031783 0.9375 0.8988949 0.9375 0.8988949 0.90625 0.8988949 0.09375 0.8988949 0.09375 0.8988949 0.0625 0.8988949 0.90625 0.8988949 0.90625 0.8988949 0.875 0.8988949 0.02826887 0.341844 0.02826887 0.341844 0.01461154 0.2968217 0.0625 0.8988949 0.0625 0.8988949 0.03125 0.8988949 0.875 0.8988949 0.875 0.8988949 0.84375 0.8988949 0.25 0.00999999 0.2031783 0.01461154 0.2031783 0.01461154 0.03125 0.8988949 0.03125 0.8988949 0 0.8988949 0.49 0.25 0.49 0.25 0.4853885 0.2968217 0.84375 0.8988949 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.78125 0.8988949 0.01461154 0.2968217 0.01461154 0.2968217 0.00999999 0.25 0.78125 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.2968217 0.01461154 0.25 0.00999999 0.25 0.00999999 0.4853885 0.2968217 0.4853885 0.2968217 0.4717311 0.341844 0.71875 0.8988949 0.75 0.8988949 0.75 0.8988949 0.6875 0.8988949 0.71875 0.8988949 0.71875 0.8988949 0.01461154 0.2031783 0.00999999 0.25 0.00999999 0.25 0.65625 0.8988949 0.6875 0.8988949 0.6875 0.8988949 0.341844 0.02826887 0.2968217 0.01461154 0.2968217 0.01461154 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.625 0.8988949 0.65625 0.8988949 0.65625 0.8988949 0.25 0.49 0.25 0.49 0.2031783 0.4853885 0.341844 0.4717311 0.341844 0.4717311 0.3833369 0.4495527 0.59375 0.8988949 0.625 0.8988949 0.625 0.8988949 0.02826887 0.1581559 0.01461154 0.2031783 0.01461154 0.2031783 0.7031784 0.4853885 0.75 0.49 0.75 0.00999999 0.75 0.49 0.7968217 0.4853885 0.7968217 0.01461154 0.7968217 0.4853885 0.841844 0.4717311 0.7968217 0.01461154 0.841844 0.4717311 0.8833369 0.4495527 0.841844 0.02826887 0.7968217 0.01461154 0.841844 0.4717311 0.841844 0.02826887 0.8833369 0.4495527 0.9197056 0.4197056 0.9495527 0.1166631 0.9197056 0.4197056 0.9495527 0.3833369 0.9495527 0.1166631 0.9495527 0.3833369 0.9717311 0.341844 0.9853885 0.2968217 0.9853885 0.2968217 0.99 0.25 0.9853885 0.2031783 0.9853885 0.2031783 0.9717311 0.1581559 0.9853885 0.2968217 0.9717311 0.1581559 0.9495527 0.1166631 0.9853885 0.2968217 0.9495527 0.1166631 0.9197056 0.08029437 0.8833369 0.4495527 0.9197056 0.08029437 0.8833369 0.05044728 0.8833369 0.4495527 0.8833369 0.05044728 0.841844 0.02826887 0.8833369 0.4495527 0.7968217 0.01461154 0.75 0.00999999 0.75 0.49 0.75 0.00999999 0.7031784 0.01461154 0.7031784 0.4853885 0.7031784 0.01461154 0.658156 0.02826887 0.7031784 0.4853885 0.658156 0.02826887 0.6166632 0.05044728 0.658156 0.4717311 0.7031784 0.4853885 0.658156 0.02826887 0.658156 0.4717311 0.6166632 0.05044728 0.5802944 0.08029437 0.5504473 0.3833369 0.5802944 0.08029437 0.5504473 0.1166631 0.5504473 0.3833369 0.5504473 0.1166631 0.5282689 0.1581559 0.5146116 0.2031783 0.5146116 0.2031783 0.51 0.25 0.5146116 0.2968217 0.5146116 0.2968217 0.5282689 0.341844 0.5146116 0.2031783 0.5282689 0.341844 0.5504473 0.3833369 0.5146116 0.2031783 0.5504473 0.3833369 0.5802944 0.4197056 0.6166632 0.05044728 0.5802944 0.4197056 0.6166632 0.4495527 0.6166632 0.05044728 0.6166632 0.4495527 0.658156 0.4717311 0.6166632 0.05044728 0.9495527 0.3833369 0.9853885 0.2968217 0.9495527 0.1166631 0.03125 0.8988949 0 0.8988949 0 0.5 0.0625 0.8988949 0.03125 0.8988949 0.03125 0.5 0.09375 0.8988949 0.0625 0.8988949 0.0625 0.5 0.125 0.8988949 0.09375 0.8988949 0.09375 0.5 0.15625 0.8988949 0.125 0.8988949 0.125 0.5 0.1875 0.8988949 0.15625 0.8988949 0.15625 0.5 0.21875 0.8988949 0.1875 0.8988949 0.1875 0.5 0.25 0.8988949 0.21875 0.8988949 0.21875 0.5 0.28125 0.5 0.28125 0.8988949 0.25 0.8988949 0.3125 0.5 0.3125 0.8988949 0.28125 0.8988949 0.34375 0.5 0.34375 0.8988949 0.3125 0.8988949 0.375 0.5 0.375 0.8988949 0.34375 0.8988949 0.40625 0.5 0.40625 0.8988949 0.375 0.8988949 0.4375 0.5 0.4375 0.8988949 0.40625 0.8988949 0.46875 0.5 0.46875 0.8988949 0.4375 0.8988949 0.5 0.5 0.5 0.8988949 0.46875 0.8988949 0.53125 0.5 0.53125 0.8988949 0.5 0.8988949 0.5625 0.5 0.5625 0.8988949 0.53125 0.8988949 0.59375 0.5 0.59375 0.8988949 0.5625 0.8988949 0.625 0.5 0.625 0.8988949 0.59375 0.8988949 0.65625 0.5 0.65625 0.8988949 0.625 0.8988949 0.6875 0.5 0.6875 0.8988949 0.65625 0.8988949 0.71875 0.5 0.71875 0.8988949 0.6875 0.8988949 0.75 0.5 0.75 0.8988949 0.71875 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.75 0.5 0.8125 0.8988949 0.78125 0.8988949 0.78125 0.5 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.5 0.875 0.8988949 0.84375 0.8988949 0.84375 0.5 0.90625 0.8988949 0.875 0.8988949 0.875 0.5 0.9375 0.8988949 0.90625 0.8988949 0.90625 0.5 0.96875 0.8988949 0.9375 0.8988949 0.9375 0.5 1 0.8988949 0.96875 0.8988949 0.96875 0.5 1 1 0.96875 1 0.96875 0.8988949 0.96875 1 0.9375 1 0.9375 0.8988949 0.9375 1 0.90625 1 0.90625 0.8988949 0.90625 1 0.875 1 0.875 0.8988949 0.875 1 0.84375 1 0.84375 0.8988949 0.84375 1 0.8125 1 0.8125 0.8988949 0.8125 1 0.78125 1 0.78125 0.8988949 0.78125 1 0.75 1 0.75 0.8988949 0.75 0.8988949 0.75 1 0.71875 1 0.71875 0.8988949 0.71875 1 0.6875 1 0.6875 0.8988949 0.6875 1 0.65625 1 0.65625 0.8988949 0.65625 1 0.625 1 0.625 0.8988949 0.625 1 0.59375 1 0.59375 0.8988949 0.59375 1 0.5625 1 0.5625 0.8988949 0.5625 1 0.53125 1 0.53125 0.8988949 0.53125 1 0.5 1 0.5 0.8988949 0.5 1 0.46875 1 0.46875 0.8988949 0.46875 1 0.4375 1 0.4375 0.8988949 0.4375 1 0.40625 1 0.40625 0.8988949 0.40625 1 0.375 1 0.375 0.8988949 0.375 1 0.34375 1 0.34375 0.8988949 0.34375 1 0.3125 1 0.3125 0.8988949 0.3125 1 0.28125 1 0.28125 0.8988949 0.28125 1 0.25 1 0.25 1 0.21875 1 0.21875 0.8988949 0.21875 1 0.1875 1 0.1875 0.8988949 0.1875 1 0.15625 1 0.15625 0.8988949 0.15625 1 0.125 1 0.125 0.8988949 0.125 1 0.09375 1 0.09375 0.8988949 0.09375 1 0.0625 1 0.0625 0.8988949 0.0625 1 0.03125 1 0.03125 0.8988949 0.03125 1 0 1 0 0.8988949 1 0.8988949 1 0.8988949 0.96875 0.8988949 0.1875 0.8988949 0.1875 0.8988949 0.15625 0.8988949 0.4853885 0.2031783 0.4717311 0.1581559 0.4717311 0.1581559 0.21875 0.8988949 0.21875 0.8988949 0.1875 0.8988949 0.1581559 0.02826887 0.1166631 0.05044728 0.1166631 0.05044728 0.25 0.8988949 0.25 0.8988949 0.21875 0.8988949 0.08029437 0.4197056 0.08029437 0.4197056 0.05044728 0.3833369 0.341844 0.4717311 0.341844 0.4717311 0.2968217 0.4853885 0.25 0.8988949 0.28125 0.8988949 0.28125 0.8988949 0.4717311 0.1581559 0.4495527 0.1166631 0.4495527 0.1166631 0.28125 0.8988949 0.3125 0.8988949 0.3125 0.8988949 0.1166631 0.05044728 0.08029437 0.08029437 0.08029437 0.08029437 0.3125 0.8988949 0.34375 0.8988949 0.34375 0.8988949 0.1166631 0.4495527 0.1166631 0.4495527 0.08029437 0.4197056 0.3833369 0.4495527 0.3833369 0.4495527 0.341844 0.4717311 0.34375 0.8988949 0.375 0.8988949 0.375 0.8988949 0.4495527 0.1166631 0.4197056 0.08029437 0.4197056 0.08029437 0.375 0.8988949 0.40625 0.8988949 0.40625 0.8988949 0.08029437 0.08029437 0.05044728 0.1166631 0.05044728 0.1166631 0.40625 0.8988949 0.4375 0.8988949 0.4375 0.8988949 0.1581559 0.4717311 0.1581559 0.4717311 0.1166631 0.4495527 0.4375 0.8988949 0.46875 0.8988949 0.46875 0.8988949 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.4495527 0.4197056 0.08029437 0.3833369 0.05044728 0.3833369 0.05044728 0.46875 0.8988949 0.5 0.8988949 0.5 0.8988949 0.05044728 0.1166631 0.02826887 0.1581559 0.02826887 0.1581559 0.5 0.8988949 0.53125 0.8988949 0.53125 0.8988949 0.2031783 0.4853885 0.2031783 0.4853885 0.1581559 0.4717311 0.4495527 0.3833369 0.4495527 0.3833369 0.4197056 0.4197056 0.53125 0.8988949 0.5625 0.8988949 0.5625 0.8988949 0.3833369 0.05044728 0.341844 0.02826887 0.341844 0.02826887 0.5625 0.8988949 0.59375 0.8988949 0.59375 0.8988949 0.341844 0.4717311 0.2968217 0.4853885 0.2968217 0.01461154 0.2968217 0.4853885 0.25 0.49 0.25 0.00999999 0.25 0.49 0.2031783 0.4853885 0.2031783 0.01461154 0.2031783 0.4853885 0.1581559 0.4717311 0.1581559 0.02826887 0.1581559 0.4717311 0.1166631 0.4495527 0.1581559 0.02826887 0.1166631 0.4495527 0.08029437 0.4197056 0.1166631 0.05044728 0.1581559 0.02826887 0.1166631 0.4495527 0.1166631 0.05044728 0.08029437 0.4197056 0.05044728 0.3833369 0.08029437 0.08029437 0.05044728 0.3833369 0.02826887 0.341844 0.08029437 0.08029437 0.02826887 0.341844 0.01461154 0.2968217 0.02826887 0.1581559 0.01461154 0.2968217 0.00999999 0.25 0.02826887 0.1581559 0.00999999 0.25 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.1581559 0.05044728 0.1166631 0.02826887 0.341844 0.05044728 0.1166631 0.08029437 0.08029437 0.02826887 0.341844 0.08029437 0.08029437 0.1166631 0.05044728 0.08029437 0.4197056 0.1581559 0.02826887 0.2031783 0.01461154 0.2031783 0.4853885 0.2031783 0.01461154 0.25 0.00999999 0.25 0.49 0.25 0.00999999 0.2968217 0.01461154 0.2968217 0.4853885 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.4717311 0.341844 0.02826887 0.3833369 0.05044728 0.341844 0.4717311 0.3833369 0.05044728 0.4197056 0.08029437 0.3833369 0.4495527 0.341844 0.4717311 0.3833369 0.05044728 0.3833369 0.4495527 0.4197056 0.08029437 0.4495527 0.1166631 0.4197056 0.4197056 0.4495527 0.1166631 0.4717311 0.1581559 0.4197056 0.4197056 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.341844 0.4853885 0.2031783 0.49 0.25 0.4717311 0.341844 0.49 0.25 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.4717311 0.1581559 0.4495527 0.3833369 0.4197056 0.4197056 0.4717311 0.1581559 0.4197056 0.08029437 0.4495527 0.1166631 0.4495527 0.1166631 0.05044728 0.1166631 0.08029437 0.08029437 0.08029437 0.08029437 0.1166631 0.4495527 0.1166631 0.4495527 0.1581559 0.4717311 0.4853885 0.2968217 0.4853885 0.2968217 0.49 0.25 0.2031783 0.01461154 0.25 0.00999999 0.25 0.00999999 0.01461154 0.2968217 0.01461154 0.2968217 0.02826887 0.341844 0.3833369 0.4495527 0.3833369 0.4495527 0.4197056 0.4197056 0.3833369 0.05044728 0.4197056 0.08029437 0.4197056 0.08029437 0.02826887 0.1581559 0.05044728 0.1166631 0.05044728 0.1166631 0.1581559 0.4717311 0.1581559 0.4717311 0.2031783 0.4853885 0.4853885 0.2031783 0.49 0.25 0.49 0.25 0.1581559 0.02826887 0.2031783 0.01461154 0.2031783 0.01461154 0.02826887 0.341844 0.02826887 0.341844 0.05044728 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.4495527 0.3833369 0.341844 0.02826887 0.3833369 0.05044728 0.3833369 0.05044728 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.1581559 0.25 0.49 0.25 0.49 0.2968217 0.4853885 0.2031783 0.4853885 0.2031783 0.4853885 0.25 0.49 0.4717311 0.1581559 0.4853885 0.2031783 0.4853885 0.2031783 0.1166631 0.05044728 0.1581559 0.02826887 0.1581559 0.02826887 0.05044728 0.3833369 0.05044728 0.3833369 0.08029437 0.4197056 0.4495527 0.3833369 0.4495527 0.3833369 0.4717311 0.341844 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.02826887 0.00999999 0.25 0.01461154 0.2031783 0.01461154 0.2031783 0.2968217 0.4853885 0.2968217 0.4853885 0.341844 0.4717311 0.4495527 0.1166631 0.4717311 0.1581559 0.4717311 0.1581559 0.08029437 0.08029437 0.1166631 0.05044728 0.1166631 0.05044728 0.08029437 0.4197056 0.08029437 0.4197056 0.1166631 0.4495527 0.4717311 0.341844 0.4717311 0.341844 0.4853885 0.2968217 0.25 0.00999999 0.2968217 0.01461154 0.2968217 0.01461154 0.00999999 0.25 0.00999999 0.25 0.01461154 0.2968217
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 99 7 21 164 7 22 100 7 23 73 9 27 138 9 28 74 9 29 100 11 33 165 11 34 101 11 35 74 13 39 139 13 40 75 13 41 101 14 42 166 14 43 102 14 44 75 15 45 140 15 46 76 15 47 102 17 51 167 17 52 103 17 53 76 18 54 141 18 55 77 18 56 103 20 60 106 20 61 72 20 62 77 22 66 142 22 67 78 22 68 78 23 69 143 23 70 79 23 71 79 25 75 144 25 76 80 25 77 81 28 84 144 28 85 145 28 86 82 29 87 145 29 88 146 29 89 83 31 93 146 31 94 147 31 95 84 34 102 147 34 103 148 34 104 85 37 111 148 37 112 149 37 113 50 39 117 54 39 118 62 39 119 103 40 120 8 40 121 70 40 122 102 41 123 70 41 124 68 41 125 101 42 126 68 42 127 66 42 128 100 43 129 66 43 130 64 43 131 99 44 132 64 44 133 62 44 134 98 45 135 62 45 136 60 45 137 97 46 138 60 46 139 58 46 140 96 47 141 58 47 142 56 47 143 54 48 144 96 48 145 56 48 146 52 49 147 95 49 148 54 49 149 50 50 150 94 50 151 52 50 152 48 51 153 93 51 154 50 51 155 46 52 156 92 52 157 48 52 158 44 53 159 91 53 160 46 53 161 42 54 162 90 54 163 44 54 164 40 55 165 89 55 166 42 55 167 38 56 168 88 56 169 40 56 170 36 57 171 87 57 172 38 57 173 34 58 174 86 58 175 36 58 176 32 59 177 85 59 178 34 59 179 30 60 180 84 60 181 32 60 182 28 61 183 83 61 184 30 61 185 26 62 186 82 62 187 28 62 188 24 63 189 81 63 190 26 63 191 79 64 192 24 64 193 22 64 194 78 65 195 22 65 196 20 65 197 77 66 198 20 66 199 18 66 200 76 67 201 18 67 202 16 67 203 75 68 204 16 68 205 14 68 206 74 69 207 14 69 208 12 69 209 73 70 210 12 70 211 10 70 212 72 71 213 10 71 214 8 71 215 105 72 216 137 72 217 106 72 218 104 73 219 138 73 220 137 73 221 107 74 222 139 74 223 138 74 224 108 75 225 140 75 226 139 75 227 109 76 228 141 76 229 140 76 230 110 77 231 142 77 232 141 77 233 111 78 234 143 78 235 142 78 236 112 79 237 144 79 238 143 79 239 144 80 240 114 80 241 145 80 242 145 81 243 115 81 244 146 81 245 146 82 246 116 82 247 147 82 248 147 83 249 117 83 250 148 83 251 148 84 252 118 84 253 149 84 254 149 85 255 119 85 256 150 85 257 150 86 258 120 86 259 151 86 260 151 87 261 121 87 262 152 87 263 152 88 264 122 88 265 153 88 266 153 89 267 123 89 268 154 89 269 154 90 270 124 90 271 155 90 272 155 91 273 125 91 274 156 91 275 156 92 276 126 92 277 157 92 278 157 93 279 127 93 280 158 93 281 158 94 282 128 94 283 159 94 284 159 95 285 129 95 286 160 95 287 129 96 288 161 96 289 160 96 290 130 97 291 162 97 292 161 97 293 131 98 294 163 98 295 162 98 296 132 99 297 164 99 298 163 99 299 133 100 300 165 100 301 164 100 302 134 101 303 166 101 304 165 101 305 135 102 306 167 102 307 166 102 308 136 103 309 106 103 310 167 103 311 72 104 312 137 104 313 73 104 314 98 105 315 163 105 316 99 105 317 97 107 321 162 107 322 98 107 323 96 109 327 161 109 328 97 109 329 96 112 336 159 112 337 160 112 338 95 114 342 158 114 343 159 114 344 94 116 348 157 116 349 158 116 350 93 119 357 156 119 358 157 119 359 92 121 363 155 121 364 156 121 365 91 123 369 154 123 370 155 123 371 90 125 375 153 125 376 154 125 377 89 128 384 152 128 385 153 128 386 88 130 390 151 130 391 152 130 392 87 133 399 150 133 400 151 133 401 86 135 405 149 135 406 150 135 407 172 136 408 171 136 409 180 136 410 1 168 504 3 168 505 2 168 506 3 169 507 7 169 508 6 169 509 7 170 510 5 170 511 4 170 512 5 171 513 1 171 514 0 171 515 6 172 516 4 172 517 0 172 518 3 173 519 1 173 520 5 173 521 99 175 525 163 175 526 164 175 527 73 177 531 137 177 532 138 177 533 100 179 537 164 179 538 165 179 539 74 181 543 138 181 544 139 181 545 101 182 546 165 182 547 166 182 548 75 183 549 139 183 550 140 183 551 102 185 555 166 185 556 167 185 557 76 186 558 140 186 559 141 186 560 103 188 564 167 188 565 106 188 566 77 190 570 141 190 571 142 190 572 78 191 573 142 191 574 143 191 575 79 193 579 143 193 580 144 193 581 81 196 588 80 196 589 144 196 590 82 197 591 81 197 592 145 197 593 83 199 597 82 199 598 146 199 599 84 202 606 83 202 607 147 202 608 85 205 615 84 205 616 148 205 617 70 207 621 8 207 622 40 207 623 8 208 624 10 208 625 38 208 626 10 209 627 12 209 628 38 209 629 12 210 630 14 210 631 36 210 632 38 211 633 12 211 634 36 211 635 14 212 636 16 212 637 30 212 638 16 213 639 18 213 640 30 213 641 18 214 642 20 214 643 22 214 644 22 215 645 24 215 646 26 215 647 26 216 648 28 216 649 22 216 650 28 217 651 30 217 652 22 217 653 30 218 654 32 218 655 14 218 656 32 219 657 34 219 658 14 219 659 34 220 660 36 220 661 14 220 662 38 221 663 40 221 664 8 221 665 40 222 666 42 222 667 70 222 668 42 223 669 44 223 670 70 223 671 44 224 672 46 224 673 68 224 674 70 225 675 44 225 676 68 225 677 46 226 678 48 226 679 62 226 680 48 227 681 50 227 682 62 227 683 50 228 684 52 228 685 54 228 686 54 229 687 56 229 688 58 229 689 58 230 690 60 230 691 54 230 692 60 231 693 62 231 694 54 231 695 62 232 696 64 232 697 46 232 698 64 233 699 66 233 700 46 233 701 66 234 702 68 234 703 46 234 704 18 235 705 22 235 706 30 235 707 103 236 708 72 236 709 8 236 710 102 237 711 103 237 712 70 237 713 101 238 714 102 238 715 68 238 716 100 239 717 101 239 718 66 239 719 99 240 720 100 240 721 64 240 722 98 241 723 99 241 724 62 241 725 97 242 726 98 242 727 60 242 728 96 243 729 97 243 730 58 243 731 54 244 732 95 244 733 96 244 734 52 245 735 94 245 736 95 245 737 50 246 738 93 246 739 94 246 740 48 247 741 92 247 742 93 247 743 46 248 744 91 248 745 92 248 746 44 249 747 90 249 748 91 249 749 42 250 750 89 250 751 90 250 752 40 251 753 88 251 754 89 251 755 38 252 756 87 252 757 88 252 758 36 253 759 86 253 760 87 253 761 34 254 762 85 254 763 86 254 764 32 255 765 84 255 766 85 255 767 30 256 768 83 256 769 84 256 770 28 257 771 82 257 772 83 257 773 26 258 774 81 258 775 82 258 776 24 259 777 80 259 778 81 259 779 79 260 780 80 260 781 24 260 782 78 261 783 79 261 784 22 261 785 77 262 786 78 262 787 20 262 788 76 263 789 77 263 790 18 263 791 75 264 792 76 264 793 16 264 794 74 265 795 75 265 796 14 265 797 73 266 798 74 266 799 12 266 800 72 267 801 73 267 802 10 267 803 105 268 804 104 268 805 137 268 806 104 269 807 107 269 808 138 269 809 107 270 810 108 270 811 139 270 812 108 271 813 109 271 814 140 271 815 109 272 816 110 272 817 141 272 818 110 273 819 111 273 820 142 273 821 111 274 822 112 274 823 143 274 824 112 275 825 113 275 826 144 275 827 144 276 828 113 276 829 114 276 830 145 277 831 114 277 832 115 277 833 146 278 834 115 278 835 116 278 836 147 279 837 116 279 838 117 279 839 148 280 840 117 280 841 118 280 842 149 281 843 118 281 844 119 281 845 150 282 846 119 282 847 120 282 848 151 283 849 120 283 850 121 283 851 152 284 852 121 284 853 122 284 854 153 285 855 122 285 856 123 285 857 154 286 858 123 286 859 124 286 860 155 287 861 124 287 862 125 287 863 156 288 864 125 288 865 126 288 866 157 289 867 126 289 868 127 289 869 158 290 870 127 290 871 128 290 872 159 291 873 128 291 874 129 291 875 129 292 876 130 292 877 161 292 878 130 293 879 131 293 880 162 293 881 131 294 882 132 294 883 163 294 884 132 295 885 133 295 886 164 295 887 133 296 888 134 296 889 165 296 890 134 297 891 135 297 892 166 297 893 135 298 894 136 298 895 167 298 896 136 299 897 105 299 898 106 299 899 72 300 900 106 300 901 137 300 902 98 301 903 162 301 904 163 301 905 97 303 909 161 303 910 162 303 911 96 305 915 160 305 916 161 305 917 96 308 924 95 308 925 159 308 926 95 310 930 94 310 931 158 310 932 94 312 936 93 312 937 157 312 938 93 315 945 92 315 946 156 315 947 92 317 951 91 317 952 155 317 953 91 319 957 90 319 958 154 319 959 90 321 963 89 321 964 153 321 965 89 324 972 88 324 973 152 324 974 88 326 978 87 326 979 151 326 980 87 329 987 86 329 988 150 329 989 86 331 993 85 331 994 149 331 995 170 332 996 168 332 997 183 332 998 168 333 999 169 333 1000 184 333 1001 169 334 1002 199 334 1003 185 334 1004 199 335 1005 198 335 1006 186 335 1007 198 336 1008 197 336 1009 186 336 1010 197 337 1011 196 337 1012 187 337 1013 186 338 1014 197 338 1015 187 338 1016 196 339 1017 195 339 1018 188 339 1019 195 340 1020 194 340 1021 188 340 1022 194 341 1023 193 341 1024 190 341 1025 193 342 1026 192 342 1027 190 342 1028 192 343 1029 191 343 1030 190 343 1031 190 344 1032 189 344 1033 194 344 1034 189 345 1035 188 345 1036 194 345 1037 188 346 1038 187 346 1039 196 346 1040 186 347 1041 185 347 1042 199 347 1043 185 348 1044 184 348 1045 169 348 1046 184 349 1047 183 349 1048 168 349 1049 183 350 1050 182 350 1051 170 350 1052 182 351 1053 181 351 1054 170 351 1055 181 352 1056 180 352 1057 171 352 1058 170 353 1059 181 353 1060 171 353 1061 180 354 1062 179 354 1063 172 354 1064 179 355 1065 178 355 1066 172 355 1067 178 356 1068 177 356 1069 174 356 1070 177 357 1071 176 357 1072 174 357 1073 176 358 1074 175 358 1075 174 358 1076 174 359 1077 173 359 1078 178 359 1079 173 360 1080 172 360 1081 178 360 1082
+
+
+
+
+
+ 63 6 18 131 6 19 61 6 20 11 8 24 105 8 25 9 8 26 43 10 30 123 10 31 122 10 32 25 12 36 114 12 37 113 12 38 61 16 48 130 16 49 59 16 50 41 19 57 122 19 58 121 19 59 25 21 63 112 21 64 23 21 65 59 24 72 129 24 73 57 24 74 39 26 78 121 26 79 120 26 80 23 27 81 111 27 82 21 27 83 55 30 90 129 30 91 128 30 92 37 32 96 120 32 97 119 32 98 21 33 99 110 33 100 19 33 101 9 35 105 136 35 106 71 35 107 13 36 108 171 36 109 15 36 110 53 38 114 128 38 115 127 38 116 27 106 318 115 106 319 114 106 320 45 108 324 124 108 325 123 108 326 65 110 330 132 110 331 63 110 332 13 111 333 104 111 334 11 111 335 29 113 339 116 113 340 115 113 341 47 115 345 125 115 346 124 115 347 67 117 351 133 117 352 65 117 353 15 118 354 107 118 355 13 118 356 31 120 360 117 120 361 116 120 362 49 122 366 126 122 367 125 122 368 69 124 372 134 124 373 67 124 374 17 126 378 108 126 379 15 126 380 33 127 381 118 127 382 117 127 383 51 129 387 127 129 388 126 129 389 71 131 393 135 131 394 69 131 395 19 132 396 109 132 397 17 132 398 35 134 402 119 134 403 118 134 404 33 137 411 179 137 412 180 137 413 51 138 414 188 138 415 189 138 416 67 139 417 198 139 418 69 139 419 23 140 420 176 140 421 25 140 422 43 141 423 184 141 424 185 141 425 59 142 426 194 142 427 61 142 428 15 143 429 172 143 430 17 143 431 35 144 432 180 144 433 181 144 434 53 145 435 189 145 436 190 145 437 69 146 438 199 146 439 71 146 440 27 147 441 176 147 442 177 147 443 45 148 444 185 148 445 186 148 446 61 149 447 195 149 448 63 149 449 17 150 450 173 150 451 19 150 452 37 151 453 181 151 454 182 151 455 55 152 456 190 152 457 191 152 458 9 153 459 168 153 460 11 153 461 71 154 462 169 154 463 9 154 464 29 155 465 177 155 466 178 155 467 47 156 468 186 156 469 187 156 470 63 157 471 196 157 472 65 157 473 19 158 474 174 158 475 21 158 476 39 159 477 182 159 478 183 159 479 57 160 480 191 160 481 192 160 482 11 161 483 170 161 484 13 161 485 31 162 486 178 162 487 179 162 488 49 163 489 187 163 490 188 163 491 65 164 492 197 164 493 67 164 494 21 165 495 175 165 496 23 165 497 41 166 498 183 166 499 184 166 500 57 167 501 193 167 502 59 167 503 63 174 522 132 174 523 131 174 524 11 176 528 104 176 529 105 176 530 43 178 534 45 178 535 123 178 536 25 180 540 27 180 541 114 180 542 61 184 552 131 184 553 130 184 554 41 187 561 43 187 562 122 187 563 25 189 567 113 189 568 112 189 569 59 192 576 130 192 577 129 192 578 39 194 582 41 194 583 121 194 584 23 195 585 112 195 586 111 195 587 55 198 594 57 198 595 129 198 596 37 200 600 39 200 601 120 200 602 21 201 603 111 201 604 110 201 605 9 203 609 105 203 610 136 203 611 13 204 612 170 204 613 171 204 614 53 206 618 55 206 619 128 206 620 27 302 906 29 302 907 115 302 908 45 304 912 47 304 913 124 304 914 65 306 918 133 306 919 132 306 920 13 307 921 107 307 922 104 307 923 29 309 927 31 309 928 116 309 929 47 311 933 49 311 934 125 311 935 67 313 939 134 313 940 133 313 941 15 314 942 108 314 943 107 314 944 31 316 948 33 316 949 117 316 950 49 318 954 51 318 955 126 318 956 69 320 960 135 320 961 134 320 962 17 322 966 109 322 967 108 322 968 33 323 969 35 323 970 118 323 971 51 325 975 53 325 976 127 325 977 71 327 981 136 327 982 135 327 983 19 328 984 110 328 985 109 328 986 35 330 990 37 330 991 119 330 992 33 361 1083 31 361 1084 179 361 1085 51 362 1086 49 362 1087 188 362 1088 67 363 1089 197 363 1090 198 363 1091 23 364 1092 175 364 1093 176 364 1094 43 365 1095 41 365 1096 184 365 1097 59 366 1098 193 366 1099 194 366 1100 15 367 1101 171 367 1102 172 367 1103 35 368 1104 33 368 1105 180 368 1106 53 369 1107 51 369 1108 189 369 1109 69 370 1110 198 370 1111 199 370 1112 27 371 1113 25 371 1114 176 371 1115 45 372 1116 43 372 1117 185 372 1118 61 373 1119 194 373 1120 195 373 1121 17 374 1122 172 374 1123 173 374 1124 37 375 1125 35 375 1126 181 375 1127 55 376 1128 53 376 1129 190 376 1130 9 377 1131 169 377 1132 168 377 1133 71 378 1134 199 378 1135 169 378 1136 29 379 1137 27 379 1138 177 379 1139 47 380 1140 45 380 1141 186 380 1142 63 381 1143 195 381 1144 196 381 1145 19 382 1146 173 382 1147 174 382 1148 39 383 1149 37 383 1150 182 383 1151 57 384 1152 55 384 1153 191 384 1154 11 385 1155 168 385 1156 170 385 1157 31 386 1158 29 386 1159 178 386 1160 49 387 1161 47 387 1162 187 387 1163 65 388 1164 196 388 1165 197 388 1166 21 389 1167 174 389 1168 175 389 1169 41 390 1170 39 390 1171 183 390 1172 57 391 1173 192 391 1174 193 391 1175
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -1.029198 -1.021838 0.09228229 -13.07551 -0.9260871 0.05411165 -1.035489 -1.00146 0.2991693 -13.08123 -0.9075493 0.2423195 -1.041538 -0.9411104 0.4981057 -13.08673 -0.8526484 0.4232947 -1.047113 -0.8431079 0.6814466 -13.0918 -0.7634943 0.5900822 -1.052 -0.7112189 0.8421461 -13.09625 -0.6435131 0.7362728 -1.05601 -0.5505115 0.9740288 -13.0999 -0.4973154 0.8562483 -1.05899 -0.3671619 1.072026 -13.10261 -0.3305197 0.9453981 -1.060825 -0.1682159 1.132373 -13.10428 -0.1495358 1.000296 -1.061444 0.03868103 1.15275 -13.10484 0.03868103 1.018833 -1.060825 0.2455779 1.132373 -13.10428 0.2268979 1.000296 -1.05899 0.4445239 1.072026 -13.10261 0.4078818 0.9453981 -1.05601 0.6278736 0.9740288 -13.0999 0.5746775 0.8562483 -1.052 0.788581 0.8421461 -13.09625 0.7208752 0.7362728 -1.047113 0.92047 0.6814466 -13.0918 0.8408564 0.5900822 -1.041538 1.018472 0.4981057 -13.08673 0.9300105 0.4232947 -1.035489 1.078822 0.2991693 -13.08123 0.9849113 0.2423195 -1.029198 1.0992 0.09228229 -13.07551 1.003449 0.05411165 -1.022907 1.078822 -0.1146046 -13.06978 0.9849113 -0.1340961 -1.016858 1.018472 -0.313541 -13.06428 0.9300105 -0.3150712 -1.011282 0.92047 -0.4968819 -13.05921 0.8408564 -0.4818589 -1.006396 0.788581 -0.6575814 -13.05476 0.7208752 -0.6280494 -1.002386 0.6278736 -0.7894641 -13.05111 0.5746775 -0.7480249 -0.9994054 0.4445239 -0.8874619 -13.0484 0.4078818 -0.8371747 -0.9975705 0.2455779 -0.9478086 -13.04673 0.2268979 -0.8920729 -0.9969511 0.03868103 -0.9681852 -13.04617 0.03868103 -0.9106098 -0.9975705 -0.1682159 -0.9478086 -13.04673 -0.1495358 -0.8920729 -0.9994054 -0.3671619 -0.8874619 -13.0484 -0.3305197 -0.8371747 -1.002386 -0.5505115 -0.7894641 -13.05111 -0.4973154 -0.7480249 -1.006396 -0.7112189 -0.6575814 -13.05476 -0.6435131 -0.6280494 -1.011282 -0.8431079 -0.4968819 -13.05921 -0.7634943 -0.4818589 -1.016858 -0.9411104 -0.313541 -13.06428 -0.8526484 -0.3150712 -1.022907 -1.00146 -0.1146046 -13.06978 -0.9075493 -0.1340961 -11.32141 -1.021838 0.05966985 -11.3277 -1.00146 0.2665568 -11.33375 -0.9411104 0.4654932 -11.33932 -0.8431079 0.6488341 -11.34421 -0.7112189 0.8095336 -11.34822 -0.5505115 0.9414163 -11.3512 -0.3671619 1.039414 -11.35303 -0.1682159 1.099761 -11.35365 0.03868103 1.120137 -11.35303 0.2455779 1.099761 -11.3512 0.4445239 1.039414 -11.34822 0.6278736 0.9414163 -11.34421 0.788581 0.8095336 -11.33932 0.92047 0.6488341 -11.33375 1.018472 0.4654932 -11.3277 1.078822 0.2665568 -11.32141 1.0992 0.05966985 -11.31511 1.078822 -0.147217 -11.30907 1.018472 -0.3461534 -11.30349 0.92047 -0.5294944 -11.2986 0.788581 -0.6901939 -11.29459 0.6278736 -0.8220766 -11.29161 0.4445239 -0.9200744 -11.28978 0.2455779 -0.9804211 -11.28916 0.03868103 -1.000798 -11.28978 -0.1682159 -0.9804211 -11.29161 -0.3671619 -0.9200744 -11.29459 -0.5505115 -0.8220766 -11.2986 -0.7112189 -0.6901939 -11.30349 -0.8431079 -0.5294944 -11.30907 -0.9411104 -0.3461534 -11.31511 -1.00146 -0.147217 -13.2208 -1.165141 0.2931191 -13.21352 -1.188725 0.05367594 -11.18339 -1.188725 0.06010878 -13.2278 -1.095295 0.5233605 -13.23426 -0.9818704 0.7355521 -13.23991 -0.8292271 0.9215397 -13.24455 -0.6432306 1.074176 -13.248 -0.4310286 1.187595 -13.25012 -0.2007761 1.257437 -13.25084 0.03867846 1.281021 -13.25012 0.2781331 1.257437 -13.248 0.5083857 1.187595 -13.24455 0.7205875 1.074176 -13.23991 0.906584 0.9215397 -13.23426 1.059227 0.7355521 -13.2278 1.172652 0.5233605 -13.2208 1.242498 0.2931191 -13.21352 1.266082 0.05367594 -13.20624 1.242498 -0.185767 -13.19924 1.172652 -0.4160085 -13.19279 1.059227 -0.6282001 -13.18713 0.906584 -0.8141877 -13.18249 0.7205875 -0.9668237 -13.17904 0.5083857 -1.080242 -13.17692 0.2781331 -1.150085 -13.1762 0.03867846 -1.173668 -13.17692 -0.2007761 -1.150085 -13.17904 -0.4310286 -1.080242 -13.18249 -0.6432306 -0.9668237 -13.18713 -0.8292271 -0.8141877 -13.19279 -0.9818704 -0.6282001 -13.19924 -1.095295 -0.4160085 -13.20624 -1.165141 -0.185767 -11.19067 -1.165141 0.2995519 -11.19768 -1.095295 0.5297933 -11.20413 -0.9818704 0.7419849 -11.20978 -0.8292271 0.9279725 -11.21442 -0.6432306 1.080609 -11.21787 -0.4310286 1.194027 -11.22 -0.2007761 1.26387 -11.22071 0.03867846 1.287454 -11.22 0.2781331 1.26387 -11.21787 0.5083857 1.194027 -11.21442 0.7205875 1.080609 -11.20978 0.906584 0.9279725 -11.20413 1.059227 0.7419849 -11.19768 1.172652 0.5297933 -11.19067 1.242498 0.2995519 -11.18339 1.266082 0.06010878 -11.17611 1.242498 -0.1793342 -11.16911 1.172652 -0.4095757 -11.16266 1.059227 -0.6217674 -11.157 0.906584 -0.8077549 -11.15236 0.7205875 -0.9603909 -11.14891 0.5083857 -1.07381 -11.14679 0.2781331 -1.143653 -11.14607 0.03867846 -1.167236 -11.14679 -0.2007761 -1.143653 -11.14891 -0.4310286 -1.07381 -11.15236 -0.6432306 -0.9603909 -11.157 -0.8292271 -0.8077549 -11.16266 -0.9818704 -0.6217674 -11.16911 -1.095295 -0.4095757 -11.17611 -1.165141 -0.1793342 -12.37012 -0.9075493 0.2423195 -12.36439 -0.9260871 0.05411165 -12.37562 -0.8526484 0.4232947 -12.38069 -0.7634943 0.5900822 -12.38514 -0.6435131 0.7362728 -12.38878 -0.4973154 0.8562483 -12.39149 -0.3305197 0.9453981 -12.39316 -0.1495358 1.000296 -12.39373 0.03868103 1.018833 -12.39316 0.2268979 1.000296 -12.39149 0.4078818 0.9453981 -12.38878 0.5746775 0.8562483 -12.38514 0.7208752 0.7362728 -12.38069 0.8408564 0.5900822 -12.37562 0.9300105 0.4232947 -12.37012 0.9849113 0.2423195 -12.36439 1.003449 0.05411165 -12.35867 0.9849113 -0.1340961 -12.35317 0.9300105 -0.3150712 -12.34809 0.8408564 -0.4818589 -12.34365 0.7208752 -0.6280494 -12.34 0.5746775 -0.7480249 -12.33729 0.4078818 -0.8371747 -12.33562 0.2268979 -0.8920729 -12.33506 0.03868103 -0.9106098 -12.33562 -0.1495358 -0.8920729 -12.33729 -0.3305197 -0.8371747 -12.34 -0.4973154 -0.7480249 -12.34365 -0.6435131 -0.6280494 -12.34809 -0.7634943 -0.4818589 -12.35317 -0.8526484 -0.3150712 -12.35867 -0.9075493 -0.1340961
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0.8941683 -0.2222697 -0.3886633 -0.7594906 -0.4012401 -0.5120357 0.8828371 -0.4640426 0.07254731 -0.7724652 -0.6138536 0.1627306 0.8872783 0.4481748 -0.1089794 -0.7611508 -0.4898042 -0.4251367 0.8727791 0.04525226 0.4860131 -0.77473 -0.5671193 0.2795876 -0.7631157 -0.5600127 -0.3225528 -0.7767819 -0.4981881 0.3852513 0.8950523 -0.1369878 -0.4244005 -0.7653151 -0.6091054 -0.2080466 -0.7785387 -0.4096266 0.4754825 0.8850703 0.4650736 -0.01889383 -0.7676645 -0.6350692 -0.08589661 0.8727794 -0.04525202 0.4860126 -0.7799258 -0.3048331 0.5466191 -0.7808818 -0.1879143 0.5957447 0.8955017 -0.0462808 -0.4426452 -0.7813735 -0.06348055 0.6208267 0.8828312 0.4640527 0.07255399 0.8732033 -0.1340745 0.468551 -0.7813704 0.06348419 0.6208303 -0.7808813 0.1879113 0.5957465 0.8955028 0.04627645 -0.4426436 -0.7799205 0.3048373 0.5466244 0.8806509 0.4452611 0.1618527 0.8740326 -0.2179008 0.4342651 -0.7785317 0.4096328 0.4754884 0.885073 -0.4650686 -0.0188899 0 -0.8819118 0.4714145 -0.7767751 0.4981939 0.3852576 0.8950505 0.1369909 -0.4244032 -0.999538 0 -0.03039497 -3.10569e-4 0.9951851 0.0980128 -9.19771e-4 0.9569439 0.2902716 -0.001493632 0.8819297 0.4713785 -0.002010107 0.7730239 0.6343737 -0.002449333 0.6344096 0.7729933 -0.002794444 0.4714126 0.8819083 -0.003032147 0.2902965 0.956932 -0.003153324 0.0980212 0.9951794 -0.003153324 -0.0980212 0.9951794 -0.003032147 -0.2902965 0.956932 -0.002794444 -0.4714127 0.8819083 -0.002449333 -0.6344096 0.7729933 -0.002010107 -0.7730239 0.6343737 -0.001493632 -0.8819298 0.4713786 -9.1977e-4 -0.9569439 0.2902717 -3.10569e-4 -0.9951851 0.09801274 3.10569e-4 -0.9951851 -0.0980128 9.19771e-4 -0.9569439 -0.2902716 0.001493632 -0.8819298 -0.4713785 0.002010107 -0.7730239 -0.6343737 0.002449333 -0.6344096 -0.7729932 0.002794444 -0.4714125 -0.8819085 0.003032147 -0.2902963 -0.9569321 0.003153324 -0.0980212 -0.9951794 0.003153324 0.0980212 -0.9951794 0.003032147 0.2902963 -0.9569321 0.002794444 0.4714124 -0.8819085 0.002449333 0.6344096 -0.7729933 0.002010107 0.7730239 -0.6343737 0.001493632 0.8819298 -0.4713784 9.19771e-4 0.9569439 -0.2902716 3.10569e-4 0.9951851 -0.0980128 3.10569e-4 0.9951851 -0.09801256 9.19771e-4 0.9569439 -0.2902715 0.001493632 0.8819294 -0.4713791 0.002010107 0.7730241 -0.6343735 0.002449333 0.6344098 -0.772993 0.002794444 0.4714125 -0.8819084 0.003032147 0.2902956 -0.9569323 0.003153324 0.09802216 -0.9951792 0.003153324 -0.09802216 -0.9951792 0.003032147 -0.2902955 -0.9569323 0.002794444 -0.4714127 -0.8819083 0.002449333 -0.6344098 -0.772993 0.002010107 -0.7730239 -0.6343738 0.001493632 -0.8819299 -0.4713783 9.1977e-4 -0.9569439 -0.2902715 3.1057e-4 -0.9951851 -0.09801304 -3.10571e-4 -0.9951851 0.09801304 -9.19774e-4 -0.9569439 0.2902715 -0.001493632 -0.8819299 0.4713782 -0.002010107 -0.7730239 0.6343738 -0.002449333 -0.6344095 0.7729933 -0.002794444 -0.4714127 0.8819083 -0.003032147 -0.290296 0.9569321 -0.003153324 -0.0980212 0.9951793 -0.003153324 0.0980212 0.9951793 -0.003032147 0.290296 0.9569321 -0.002794444 0.4714125 0.8819084 -0.002449333 0.6344095 0.7729933 -0.002010107 0.7730241 0.6343735 -0.001493632 0.8819295 0.471379 -9.19774e-4 0.9569439 0.2902715 -3.10569e-4 0.9951851 0.09801256 -0.7700789 -0.6367371 0.03929841 -0.7581936 -0.297728 -0.5800868 0.8732012 0.1340731 0.4685552 -0.757301 -0.1831607 -0.6268552 0.8893725 0.4138886 -0.1941975 -0.7568462 -0.06181395 -0.6506634 0.8928914 -0.2987453 -0.336892 0.880655 -0.4452542 0.1618498 -0.7568458 0.06181484 -0.6506638 0.874032 0.2179043 0.4342647 -0.7572976 0.183161 -0.6268591 0.8912675 0.3634544 -0.2711885 -0.7581882 0.2977299 -0.5800927 0.8912702 -0.3634505 -0.2711846 0.8786135 -0.4095197 0.2456251 -0.7594863 0.4012453 -0.512038 0.8752397 0.2936017 0.3843871 -0.7611442 0.489811 -0.4251408 0.8928881 0.2987513 -0.3368952 -0.763107 0.5600218 -0.3225575 0.889375 -0.4138855 -0.1941931 -0.7653036 0.6091177 -0.2080531 0.8767886 -0.3582999 0.3207228 0.8767853 0.3583039 0.3207269 -0.767655 0.6350807 -0.08589726 0.8941677 0.2222674 -0.388666 -0.7700694 0.6367484 0.03930032 0.8872823 -0.4481672 -0.108978 0.875243 -0.2935997 0.3843812 -0.7724559 0.6138642 0.1627345 0.8786115 0.4095251 0.2456239 -0.7747213 0.5671287 0.2795924 0.9995381 0 0.03039199 0 0.6343747 0.7730258 0 0.6343749 -0.7730256 0 -0.8819119 -0.4714143 0 -0.0980122 0.9951852 0 0.9951843 -0.09802252 0 -0.2902718 -0.9569442 0 -0.7729956 0.6344113 0 0.7729956 0.6344113 0 0.471379 -0.8819307 0 -0.9569364 -0.2902974 0 0.0980122 0.9951852 0 0.9569364 -0.2902974 0 -0.4713791 -0.8819307 0 -0.6343747 0.7730258 0 0.8819118 0.4714145 0 0.2902718 -0.9569443 0 -0.9951843 0.09802216 0 -0.9951843 -0.09802216 0 0.2902721 0.9569442 0 0.8819119 -0.4714143 0 -0.6343749 -0.7730256 0 -0.4713791 0.8819307 0 0.9569365 0.2902973 0 0.0980125 -0.9951852 0 -0.9569365 0.2902973 0 0.471379 0.8819307 0 0.7729955 -0.6344115 0 -0.7729955 -0.6344115 0 -0.2902721 0.9569442 0 0.9951843 0.09802252 0 -0.0980125 -0.9951852 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0.8941695 -0.2222657 -0.3886629 -0.7594923 -0.4012407 -0.5120325 0.882835 -0.4640455 0.07255315 -0.7724655 -0.6138532 0.1627309 0.8872786 0.4481739 -0.1089801 -0.7611516 -0.4898043 -0.4251353 0.8727791 0.04525208 0.4860132 -0.7747301 -0.5671191 0.2795876 -0.7631152 -0.5600128 -0.3225535 -0.7767824 -0.4981871 0.3852515 0.8950516 -0.1369903 -0.4244012 -0.7653131 -0.6091068 -0.20805 -0.7785379 -0.409628 0.4754825 0.8850692 0.465076 -0.01889091 -0.7676648 -0.635069 -0.08589607 0.8727796 -0.0452522 0.4860125 -0.7799251 -0.3048346 0.5466194 -0.780884 -0.1879104 0.5957431 0.8955031 -0.04627633 -0.4426429 -0.7813713 -0.06348413 0.6208291 0.8828333 0.4640498 0.07254803 0.8732024 -0.1340726 0.4685533 -0.7813725 0.06348067 0.6208279 -0.7808791 0.1879153 0.5957481 0.8955014 0.04628086 -0.4426459 -0.7799214 0.3048357 0.5466241 0.8806513 0.4452608 0.1618518 0.8740338 -0.2179027 0.4342619 -0.7785325 0.4096314 0.4754884 0.8850741 -0.4650665 -0.01889276 0 -0.8819118 0.4714145 -0.7767744 0.4981952 0.3852573 0.8950512 0.1369885 -0.4244025 -0.999538 0 -0.03039342 -0.9995381 0 -0.03039342 -0.999538 0 -0.03039342 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.999538 1.22952e-7 -0.03039449 -0.9995381 0 -0.03039324 -0.9995378 4.06942e-6 -0.0304048 -0.9995383 0 -0.03038418 -0.9995381 0 -0.03039139 -0.9995379 -7.002e-7 -0.03039848 -0.999538 0 -0.03039336 -0.9995381 0 -0.03039437 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.9995381 0 -0.03039342 -0.999538 0 -0.03039342 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.999538 1.22952e-7 -0.03039449 -0.9995381 0 -0.03039324 -0.9995378 4.07804e-6 -0.0304048 -0.9995383 0 -0.03038418 -0.9995381 0 -0.03039133 -0.9995379 -7.01981e-7 -0.03039848 -0.999538 0 -0.03039336 -0.9995381 0 -0.03039437 -0.999538 0 -0.03039473 -0.999538 0 -0.03039497 -3.10569e-4 0.995185 0.09801274 -9.19771e-4 0.9569439 0.2902717 -0.001493632 0.8819298 0.4713785 -0.002010107 0.7730239 0.6343737 -0.002449333 0.6344095 0.7729932 -0.002794444 0.4714126 0.8819083 -0.003032147 0.2902962 0.956932 -0.003153324 0.0980212 0.9951794 -0.003153324 -0.0980212 0.9951794 -0.003032147 -0.2902962 0.956932 -0.002794444 -0.4714126 0.8819083 -0.002449333 -0.6344095 0.7729932 -0.002010107 -0.7730239 0.6343737 -0.001493632 -0.8819298 0.4713785 -9.19771e-4 -0.9569439 0.2902717 -3.10569e-4 -0.995185 0.09801274 3.10569e-4 -0.995185 -0.09801274 9.1977e-4 -0.9569439 -0.2902716 0.001493632 -0.8819296 -0.4713786 0.002010107 -0.7730239 -0.6343737 0.002449333 -0.6344095 -0.7729932 0.002794444 -0.4714126 -0.8819083 0.003032147 -0.2902963 -0.9569321 0.003153324 -0.0980212 -0.9951794 0.003153324 0.0980212 -0.9951794 0.003032147 0.2902963 -0.9569321 0.002794444 0.4714126 -0.8819083 0.002449333 0.6344095 -0.7729932 0.002010107 0.7730239 -0.6343737 0.001493632 0.8819296 -0.4713786 9.1977e-4 0.9569439 -0.2902716 3.10569e-4 0.995185 -0.09801274 3.10568e-4 0.9951851 -0.09801256 9.1977e-4 0.9569439 -0.2902715 0.001493632 0.8819294 -0.4713791 0.002010107 0.7730241 -0.6343735 0.002449333 0.6344098 -0.772993 0.002794444 0.4714125 -0.8819084 0.003032147 0.2902956 -0.9569323 0.003153324 0.09802216 -0.9951792 0.003153324 -0.09802216 -0.9951792 0.003032147 -0.2902955 -0.9569323 0.002794444 -0.4714127 -0.8819083 0.002449333 -0.6344098 -0.772993 0.002010107 -0.7730239 -0.6343738 0.001493632 -0.8819299 -0.4713783 9.1977e-4 -0.9569439 -0.2902715 3.10569e-4 -0.9951851 -0.09801304 -3.1057e-4 -0.9951851 0.09801304 -9.19774e-4 -0.9569439 0.2902715 -0.001493632 -0.8819299 0.4713783 -0.002010107 -0.7730239 0.6343738 -0.002449333 -0.6344095 0.7729933 -0.002794444 -0.4714127 0.8819083 -0.003032147 -0.290296 0.9569321 -0.003153324 -0.09802114 0.9951793 -0.003153324 0.0980212 0.9951793 -0.003032147 0.290296 0.9569321 -0.002794444 0.4714125 0.8819084 -0.002449333 0.6344095 0.7729933 -0.002010107 0.7730241 0.6343735 -0.001493632 0.8819294 0.4713791 -9.19774e-4 0.9569439 0.2902715 -3.10568e-4 0.9951851 0.09801256 -0.7700791 -0.6367368 0.03929859 -0.7581927 -0.2977272 -0.5800882 0.8732022 0.1340751 0.4685529 -0.7573004 -0.1831601 -0.626856 0.8893718 0.4138911 -0.1941962 -0.7568467 -0.06181472 -0.6506627 0.8928905 -0.2987484 -0.3368916 0.8806548 -0.4452545 0.1618508 -0.7568453 0.06181406 -0.6506645 0.8740308 0.2179023 0.434268 -0.7572982 0.1831617 -0.6268582 0.8912673 0.3634549 -0.2711883 -0.758189 0.2977305 -0.5800914 0.8912703 -0.3634502 -0.2711848 0.8786148 -0.4095195 0.2456215 -0.7594844 0.4012446 -0.5120411 0.8752405 0.2936025 0.3843846 -0.7611435 0.489811 -0.425142 0.892889 0.2987483 -0.3368956 -0.7631069 0.5600219 -0.3225574 0.889376 -0.4138827 -0.1941947 -0.7653056 0.6091163 -0.2080496 0.8767883 -0.3582998 0.3207234 0.8767856 0.358304 0.3207261 -0.7676548 0.6350808 -0.08589744 0.8941666 0.2222713 -0.3886663 -0.7700691 0.6367489 0.03929984 0.887282 -0.448168 -0.1089772 0.8752421 -0.2935988 0.3843837 -0.7724557 0.6138646 0.1627342 0.8786101 0.4095254 0.2456281 -0.7747215 0.5671283 0.2795926 0.9995381 0 0.03039175 0.9995381 0 0.03038871 0.9995378 0 0.03039884 0.9995381 0 0.03039175 0.999538 0 0.03039371 0.9995379 0 0.03039848 0.999538 0 0.03039371 0.9995381 0 0.0303905 0.999538 -6.83533e-7 0.03039747 0.9995383 0 0.03038638 0.9995374 -2.77787e-6 0.03041458 0.9995391 8.22688e-6 0.03035926 0.9995379 0 0.03039872 0.9995381 9.20489e-7 0.03038936 0.9995378 0 0.03039848 0.9995381 0 0.03039175 0.9995379 0 0.03039884 0.9995382 0 0.03038877 0.9995381 0 0.03039175 0.9995378 0 0.03039944 0.9995381 0 0.03039199 0.9995379 0 0.03039944 0.9995381 0 0.0303905 0.999538 -6.82176e-7 0.03039747 0.9995383 0 0.03038632 0.9995381 -2.51798e-7 0.03038889 0.9995383 7.46237e-7 0.03038388 0.9995379 0 0.03039872 0.9995381 9.18663e-7 0.03038942 0 0.6343747 0.7730258 0 0.6343749 -0.7730256 0 -0.8819119 -0.4714143 0 -0.0980122 0.9951852 0 0.9951843 -0.09802252 0 -0.2902718 -0.9569442 0 -0.7729956 0.6344113 0 0.7729956 0.6344113 0 0.4713791 -0.8819307 0 -0.9569364 -0.2902974 0 0.0980122 0.9951852 0 0.9569364 -0.2902974 0 -0.4713791 -0.8819307 0 -0.6343747 0.7730258 0 0.8819118 0.4714145 0 0.2902718 -0.9569442 0 -0.9951843 0.09802216 0 -0.9951843 -0.09802216 0 0.2902721 0.9569442 0 0.8819119 -0.4714143 0 -0.6343749 -0.7730256 0 -0.4713791 0.8819307 0 0.9569365 0.2902973 0 0.0980125 -0.9951852 0 -0.9569365 0.2902973 0 0.4713791 0.8819307 0 0.7729955 -0.6344115 0 -0.7729955 -0.6344115 0 -0.2902721 0.9569442 0 0.9951843 0.09802252 0 -0.0980125 -0.9951852
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.05044728 0.3833369 0.02826887 0.341844 0.02826887 0.341844 0.15625 0.8988949 0.125 0.8988949 0.125 0.8988949 0.2968217 0.4853885 0.25 0.49 0.25 0.49 0.96875 0.8988949 0.9375 0.8988949 0.9375 0.8988949 0.2031783 0.01461154 0.1581559 0.02826887 0.2031783 0.01461154 0.125 0.8988949 0.09375 0.8988949 0.09375 0.8988949 0.49 0.25 0.4853885 0.2031783 0.49 0.25 0.9375 0.8988949 0.90625 0.8988949 0.90625 0.8988949 0.09375 0.8988949 0.0625 0.8988949 0.0625 0.8988949 0.90625 0.8988949 0.875 0.8988949 0.875 0.8988949 0.02826887 0.341844 0.01461154 0.2968217 0.01461154 0.2968217 0.0625 0.8988949 0.03125 0.8988949 0.03125 0.8988949 0.875 0.8988949 0.84375 0.8988949 0.84375 0.8988949 0.25 0.00999999 0.2031783 0.01461154 0.25 0.00999999 0.03125 0.8988949 0 0.8988949 0 0.8988949 0.49 0.25 0.4853885 0.2968217 0.4853885 0.2968217 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.78125 0.8988949 0.78125 0.8988949 0.01461154 0.2968217 0.00999999 0.25 0.00999999 0.25 0.78125 0.8988949 0.75 0.8988949 0.75 0.8988949 0.2968217 0.01461154 0.25 0.00999999 0.2968217 0.01461154 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.71875 0.8988949 0.75 0.8988949 0.71875 0.8988949 0.6875 0.8988949 0.71875 0.8988949 0.6875 0.8988949 0.01461154 0.2031783 0.00999999 0.25 0.01461154 0.2031783 0.65625 0.8988949 0.6875 0.8988949 0.65625 0.8988949 0.341844 0.02826887 0.2968217 0.01461154 0.341844 0.02826887 0.4717311 0.341844 0.4495527 0.3833369 0.4495527 0.3833369 0.625 0.8988949 0.65625 0.8988949 0.625 0.8988949 0.25 0.49 0.2031783 0.4853885 0.2031783 0.4853885 0.341844 0.4717311 0.3833369 0.4495527 0.3833369 0.4495527 0.59375 0.8988949 0.625 0.8988949 0.59375 0.8988949 0.02826887 0.1581559 0.01461154 0.2031783 0.02826887 0.1581559 0.5504473 0.1166631 0.5146116 0.2031783 0.5504473 0.3833369 0.03125 0.8988949 0 0.5 0.03125 0.5 0.0625 0.8988949 0.03125 0.5 0.0625 0.5 0.09375 0.8988949 0.0625 0.5 0.09375 0.5 0.125 0.8988949 0.09375 0.5 0.125 0.5 0.15625 0.8988949 0.125 0.5 0.15625 0.5 0.1875 0.8988949 0.15625 0.5 0.1875 0.5 0.21875 0.8988949 0.1875 0.5 0.21875 0.5 0.25 0.8988949 0.21875 0.5 0.25 0.5 0.28125 0.5 0.25 0.8988949 0.25 0.5 0.3125 0.5 0.28125 0.8988949 0.28125 0.5 0.34375 0.5 0.3125 0.8988949 0.3125 0.5 0.375 0.5 0.34375 0.8988949 0.34375 0.5 0.40625 0.5 0.375 0.8988949 0.375 0.5 0.4375 0.5 0.40625 0.8988949 0.40625 0.5 0.46875 0.5 0.4375 0.8988949 0.4375 0.5 0.5 0.5 0.46875 0.8988949 0.46875 0.5 0.53125 0.5 0.5 0.8988949 0.5 0.5 0.5625 0.5 0.53125 0.8988949 0.53125 0.5 0.59375 0.5 0.5625 0.8988949 0.5625 0.5 0.625 0.5 0.59375 0.8988949 0.59375 0.5 0.65625 0.5 0.625 0.8988949 0.625 0.5 0.6875 0.5 0.65625 0.8988949 0.65625 0.5 0.71875 0.5 0.6875 0.8988949 0.6875 0.5 0.75 0.5 0.71875 0.8988949 0.71875 0.5 0.78125 0.8988949 0.75 0.5 0.78125 0.5 0.8125 0.8988949 0.78125 0.5 0.8125 0.5 0.84375 0.8988949 0.8125 0.5 0.84375 0.5 0.875 0.8988949 0.84375 0.5 0.875 0.5 0.90625 0.8988949 0.875 0.5 0.90625 0.5 0.9375 0.8988949 0.90625 0.5 0.9375 0.5 0.96875 0.8988949 0.9375 0.5 0.96875 0.5 1 0.8988949 0.96875 0.5 1 0.5 1 1 0.96875 0.8988949 1 0.8988949 0.96875 1 0.9375 0.8988949 0.96875 0.8988949 0.9375 1 0.90625 0.8988949 0.9375 0.8988949 0.90625 1 0.875 0.8988949 0.90625 0.8988949 0.875 1 0.84375 0.8988949 0.875 0.8988949 0.84375 1 0.8125 0.8988949 0.84375 0.8988949 0.8125 1 0.78125 0.8988949 0.8125 0.8988949 0.78125 1 0.75 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.71875 1 0.71875 0.8988949 0.71875 0.8988949 0.6875 1 0.6875 0.8988949 0.6875 0.8988949 0.65625 1 0.65625 0.8988949 0.65625 0.8988949 0.625 1 0.625 0.8988949 0.625 0.8988949 0.59375 1 0.59375 0.8988949 0.59375 0.8988949 0.5625 1 0.5625 0.8988949 0.5625 0.8988949 0.53125 1 0.53125 0.8988949 0.53125 0.8988949 0.5 1 0.5 0.8988949 0.5 0.8988949 0.46875 1 0.46875 0.8988949 0.46875 0.8988949 0.4375 1 0.4375 0.8988949 0.4375 0.8988949 0.40625 1 0.40625 0.8988949 0.40625 0.8988949 0.375 1 0.375 0.8988949 0.375 0.8988949 0.34375 1 0.34375 0.8988949 0.34375 0.8988949 0.3125 1 0.3125 0.8988949 0.3125 0.8988949 0.28125 1 0.28125 0.8988949 0.28125 0.8988949 0.25 1 0.25 0.8988949 0.25 1 0.21875 0.8988949 0.25 0.8988949 0.21875 1 0.1875 0.8988949 0.21875 0.8988949 0.1875 1 0.15625 0.8988949 0.1875 0.8988949 0.15625 1 0.125 0.8988949 0.15625 0.8988949 0.125 1 0.09375 0.8988949 0.125 0.8988949 0.09375 1 0.0625 0.8988949 0.09375 0.8988949 0.0625 1 0.03125 0.8988949 0.0625 0.8988949 0.03125 1 0 0.8988949 0.03125 0.8988949 1 0.8988949 0.96875 0.8988949 0.96875 0.8988949 0.1875 0.8988949 0.15625 0.8988949 0.15625 0.8988949 0.4853885 0.2031783 0.4717311 0.1581559 0.4853885 0.2031783 0.21875 0.8988949 0.1875 0.8988949 0.1875 0.8988949 0.1581559 0.02826887 0.1166631 0.05044728 0.1581559 0.02826887 0.25 0.8988949 0.21875 0.8988949 0.21875 0.8988949 0.08029437 0.4197056 0.05044728 0.3833369 0.05044728 0.3833369 0.341844 0.4717311 0.2968217 0.4853885 0.2968217 0.4853885 0.25 0.8988949 0.28125 0.8988949 0.25 0.8988949 0.4717311 0.1581559 0.4495527 0.1166631 0.4717311 0.1581559 0.28125 0.8988949 0.3125 0.8988949 0.28125 0.8988949 0.1166631 0.05044728 0.08029437 0.08029437 0.1166631 0.05044728 0.3125 0.8988949 0.34375 0.8988949 0.3125 0.8988949 0.1166631 0.4495527 0.08029437 0.4197056 0.08029437 0.4197056 0.3833369 0.4495527 0.341844 0.4717311 0.341844 0.4717311 0.34375 0.8988949 0.375 0.8988949 0.34375 0.8988949 0.4495527 0.1166631 0.4197056 0.08029437 0.4495527 0.1166631 0.375 0.8988949 0.40625 0.8988949 0.375 0.8988949 0.08029437 0.08029437 0.05044728 0.1166631 0.08029437 0.08029437 0.40625 0.8988949 0.4375 0.8988949 0.40625 0.8988949 0.1581559 0.4717311 0.1166631 0.4495527 0.1166631 0.4495527 0.4375 0.8988949 0.46875 0.8988949 0.4375 0.8988949 0.4197056 0.4197056 0.3833369 0.4495527 0.3833369 0.4495527 0.4197056 0.08029437 0.3833369 0.05044728 0.4197056 0.08029437 0.46875 0.8988949 0.5 0.8988949 0.46875 0.8988949 0.05044728 0.1166631 0.02826887 0.1581559 0.05044728 0.1166631 0.5 0.8988949 0.53125 0.8988949 0.5 0.8988949 0.2031783 0.4853885 0.1581559 0.4717311 0.1581559 0.4717311 0.4495527 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.53125 0.8988949 0.5625 0.8988949 0.53125 0.8988949 0.3833369 0.05044728 0.341844 0.02826887 0.3833369 0.05044728 0.5625 0.8988949 0.59375 0.8988949 0.5625 0.8988949 0.4197056 0.4197056 0.3833369 0.4495527 0.4197056 0.08029437 0.4197056 0.08029437 0.4495527 0.1166631 0.4197056 0.08029437 0.05044728 0.1166631 0.08029437 0.08029437 0.05044728 0.1166631 0.1166631 0.4495527 0.1581559 0.4717311 0.1581559 0.4717311 0.4853885 0.2968217 0.49 0.25 0.49 0.25 0.2031783 0.01461154 0.25 0.00999999 0.2031783 0.01461154 0.01461154 0.2968217 0.02826887 0.341844 0.02826887 0.341844 0.3833369 0.4495527 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.05044728 0.4197056 0.08029437 0.3833369 0.05044728 0.02826887 0.1581559 0.05044728 0.1166631 0.02826887 0.1581559 0.1581559 0.4717311 0.2031783 0.4853885 0.2031783 0.4853885 0.4853885 0.2031783 0.49 0.25 0.4853885 0.2031783 0.1581559 0.02826887 0.2031783 0.01461154 0.1581559 0.02826887 0.02826887 0.341844 0.05044728 0.3833369 0.05044728 0.3833369 0.4197056 0.4197056 0.4495527 0.3833369 0.4495527 0.3833369 0.341844 0.02826887 0.3833369 0.05044728 0.341844 0.02826887 0.01461154 0.2031783 0.02826887 0.1581559 0.01461154 0.2031783 0.25 0.49 0.2968217 0.4853885 0.2968217 0.4853885 0.2031783 0.4853885 0.25 0.49 0.25 0.49 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.1581559 0.1166631 0.05044728 0.1581559 0.02826887 0.1166631 0.05044728 0.05044728 0.3833369 0.08029437 0.4197056 0.08029437 0.4197056 0.4495527 0.3833369 0.4717311 0.341844 0.4717311 0.341844 0.2968217 0.01461154 0.341844 0.02826887 0.2968217 0.01461154 0.00999999 0.25 0.01461154 0.2031783 0.00999999 0.25 0.2968217 0.4853885 0.341844 0.4717311 0.341844 0.4717311 0.4495527 0.1166631 0.4717311 0.1581559 0.4495527 0.1166631 0.08029437 0.08029437 0.1166631 0.05044728 0.08029437 0.08029437 0.08029437 0.4197056 0.1166631 0.4495527 0.1166631 0.4495527 0.4717311 0.341844 0.4853885 0.2968217 0.4853885 0.2968217 0.25 0.00999999 0.2968217 0.01461154 0.25 0.00999999 0.00999999 0.25 0.01461154 0.2968217 0.01461154 0.2968217 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 0.05044728 0.3833369 0.05044728 0.3833369 0.02826887 0.341844 0.15625 0.8988949 0.15625 0.8988949 0.125 0.8988949 0.2968217 0.4853885 0.2968217 0.4853885 0.25 0.49 0.96875 0.8988949 0.96875 0.8988949 0.9375 0.8988949 0.2031783 0.01461154 0.1581559 0.02826887 0.1581559 0.02826887 0.125 0.8988949 0.125 0.8988949 0.09375 0.8988949 0.49 0.25 0.4853885 0.2031783 0.4853885 0.2031783 0.9375 0.8988949 0.9375 0.8988949 0.90625 0.8988949 0.09375 0.8988949 0.09375 0.8988949 0.0625 0.8988949 0.90625 0.8988949 0.90625 0.8988949 0.875 0.8988949 0.02826887 0.341844 0.02826887 0.341844 0.01461154 0.2968217 0.0625 0.8988949 0.0625 0.8988949 0.03125 0.8988949 0.875 0.8988949 0.875 0.8988949 0.84375 0.8988949 0.25 0.00999999 0.2031783 0.01461154 0.2031783 0.01461154 0.03125 0.8988949 0.03125 0.8988949 0 0.8988949 0.49 0.25 0.49 0.25 0.4853885 0.2968217 0.84375 0.8988949 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.78125 0.8988949 0.01461154 0.2968217 0.01461154 0.2968217 0.00999999 0.25 0.78125 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.2968217 0.01461154 0.25 0.00999999 0.25 0.00999999 0.4853885 0.2968217 0.4853885 0.2968217 0.4717311 0.341844 0.71875 0.8988949 0.75 0.8988949 0.75 0.8988949 0.6875 0.8988949 0.71875 0.8988949 0.71875 0.8988949 0.01461154 0.2031783 0.00999999 0.25 0.00999999 0.25 0.65625 0.8988949 0.6875 0.8988949 0.6875 0.8988949 0.341844 0.02826887 0.2968217 0.01461154 0.2968217 0.01461154 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.625 0.8988949 0.65625 0.8988949 0.65625 0.8988949 0.25 0.49 0.25 0.49 0.2031783 0.4853885 0.341844 0.4717311 0.341844 0.4717311 0.3833369 0.4495527 0.59375 0.8988949 0.625 0.8988949 0.625 0.8988949 0.02826887 0.1581559 0.01461154 0.2031783 0.01461154 0.2031783 0.7031784 0.4853885 0.75 0.49 0.75 0.00999999 0.75 0.49 0.7968217 0.4853885 0.7968217 0.01461154 0.7968217 0.4853885 0.841844 0.4717311 0.7968217 0.01461154 0.841844 0.4717311 0.8833369 0.4495527 0.841844 0.02826887 0.7968217 0.01461154 0.841844 0.4717311 0.841844 0.02826887 0.8833369 0.4495527 0.9197056 0.4197056 0.9495527 0.1166631 0.9197056 0.4197056 0.9495527 0.3833369 0.9495527 0.1166631 0.9495527 0.3833369 0.9717311 0.341844 0.9853885 0.2968217 0.9853885 0.2968217 0.99 0.25 0.9853885 0.2031783 0.9853885 0.2031783 0.9717311 0.1581559 0.9853885 0.2968217 0.9717311 0.1581559 0.9495527 0.1166631 0.9853885 0.2968217 0.9495527 0.1166631 0.9197056 0.08029437 0.8833369 0.4495527 0.9197056 0.08029437 0.8833369 0.05044728 0.8833369 0.4495527 0.8833369 0.05044728 0.841844 0.02826887 0.8833369 0.4495527 0.7968217 0.01461154 0.75 0.00999999 0.75 0.49 0.75 0.00999999 0.7031784 0.01461154 0.7031784 0.4853885 0.7031784 0.01461154 0.658156 0.02826887 0.7031784 0.4853885 0.658156 0.02826887 0.6166632 0.05044728 0.658156 0.4717311 0.7031784 0.4853885 0.658156 0.02826887 0.658156 0.4717311 0.6166632 0.05044728 0.5802944 0.08029437 0.5504473 0.3833369 0.5802944 0.08029437 0.5504473 0.1166631 0.5504473 0.3833369 0.5504473 0.1166631 0.5282689 0.1581559 0.5146116 0.2031783 0.5146116 0.2031783 0.51 0.25 0.5146116 0.2968217 0.5146116 0.2968217 0.5282689 0.341844 0.5146116 0.2031783 0.5282689 0.341844 0.5504473 0.3833369 0.5146116 0.2031783 0.5504473 0.3833369 0.5802944 0.4197056 0.6166632 0.05044728 0.5802944 0.4197056 0.6166632 0.4495527 0.6166632 0.05044728 0.6166632 0.4495527 0.658156 0.4717311 0.6166632 0.05044728 0.9495527 0.3833369 0.9853885 0.2968217 0.9495527 0.1166631 0.03125 0.8988949 0 0.8988949 0 0.5 0.0625 0.8988949 0.03125 0.8988949 0.03125 0.5 0.09375 0.8988949 0.0625 0.8988949 0.0625 0.5 0.125 0.8988949 0.09375 0.8988949 0.09375 0.5 0.15625 0.8988949 0.125 0.8988949 0.125 0.5 0.1875 0.8988949 0.15625 0.8988949 0.15625 0.5 0.21875 0.8988949 0.1875 0.8988949 0.1875 0.5 0.25 0.8988949 0.21875 0.8988949 0.21875 0.5 0.28125 0.5 0.28125 0.8988949 0.25 0.8988949 0.3125 0.5 0.3125 0.8988949 0.28125 0.8988949 0.34375 0.5 0.34375 0.8988949 0.3125 0.8988949 0.375 0.5 0.375 0.8988949 0.34375 0.8988949 0.40625 0.5 0.40625 0.8988949 0.375 0.8988949 0.4375 0.5 0.4375 0.8988949 0.40625 0.8988949 0.46875 0.5 0.46875 0.8988949 0.4375 0.8988949 0.5 0.5 0.5 0.8988949 0.46875 0.8988949 0.53125 0.5 0.53125 0.8988949 0.5 0.8988949 0.5625 0.5 0.5625 0.8988949 0.53125 0.8988949 0.59375 0.5 0.59375 0.8988949 0.5625 0.8988949 0.625 0.5 0.625 0.8988949 0.59375 0.8988949 0.65625 0.5 0.65625 0.8988949 0.625 0.8988949 0.6875 0.5 0.6875 0.8988949 0.65625 0.8988949 0.71875 0.5 0.71875 0.8988949 0.6875 0.8988949 0.75 0.5 0.75 0.8988949 0.71875 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.75 0.5 0.8125 0.8988949 0.78125 0.8988949 0.78125 0.5 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.5 0.875 0.8988949 0.84375 0.8988949 0.84375 0.5 0.90625 0.8988949 0.875 0.8988949 0.875 0.5 0.9375 0.8988949 0.90625 0.8988949 0.90625 0.5 0.96875 0.8988949 0.9375 0.8988949 0.9375 0.5 1 0.8988949 0.96875 0.8988949 0.96875 0.5 1 1 0.96875 1 0.96875 0.8988949 0.96875 1 0.9375 1 0.9375 0.8988949 0.9375 1 0.90625 1 0.90625 0.8988949 0.90625 1 0.875 1 0.875 0.8988949 0.875 1 0.84375 1 0.84375 0.8988949 0.84375 1 0.8125 1 0.8125 0.8988949 0.8125 1 0.78125 1 0.78125 0.8988949 0.78125 1 0.75 1 0.75 0.8988949 0.75 0.8988949 0.75 1 0.71875 1 0.71875 0.8988949 0.71875 1 0.6875 1 0.6875 0.8988949 0.6875 1 0.65625 1 0.65625 0.8988949 0.65625 1 0.625 1 0.625 0.8988949 0.625 1 0.59375 1 0.59375 0.8988949 0.59375 1 0.5625 1 0.5625 0.8988949 0.5625 1 0.53125 1 0.53125 0.8988949 0.53125 1 0.5 1 0.5 0.8988949 0.5 1 0.46875 1 0.46875 0.8988949 0.46875 1 0.4375 1 0.4375 0.8988949 0.4375 1 0.40625 1 0.40625 0.8988949 0.40625 1 0.375 1 0.375 0.8988949 0.375 1 0.34375 1 0.34375 0.8988949 0.34375 1 0.3125 1 0.3125 0.8988949 0.3125 1 0.28125 1 0.28125 0.8988949 0.28125 1 0.25 1 0.25 1 0.21875 1 0.21875 0.8988949 0.21875 1 0.1875 1 0.1875 0.8988949 0.1875 1 0.15625 1 0.15625 0.8988949 0.15625 1 0.125 1 0.125 0.8988949 0.125 1 0.09375 1 0.09375 0.8988949 0.09375 1 0.0625 1 0.0625 0.8988949 0.0625 1 0.03125 1 0.03125 0.8988949 0.03125 1 0 1 0 0.8988949 1 0.8988949 1 0.8988949 0.96875 0.8988949 0.1875 0.8988949 0.1875 0.8988949 0.15625 0.8988949 0.4853885 0.2031783 0.4717311 0.1581559 0.4717311 0.1581559 0.21875 0.8988949 0.21875 0.8988949 0.1875 0.8988949 0.1581559 0.02826887 0.1166631 0.05044728 0.1166631 0.05044728 0.25 0.8988949 0.25 0.8988949 0.21875 0.8988949 0.08029437 0.4197056 0.08029437 0.4197056 0.05044728 0.3833369 0.341844 0.4717311 0.341844 0.4717311 0.2968217 0.4853885 0.25 0.8988949 0.28125 0.8988949 0.28125 0.8988949 0.4717311 0.1581559 0.4495527 0.1166631 0.4495527 0.1166631 0.28125 0.8988949 0.3125 0.8988949 0.3125 0.8988949 0.1166631 0.05044728 0.08029437 0.08029437 0.08029437 0.08029437 0.3125 0.8988949 0.34375 0.8988949 0.34375 0.8988949 0.1166631 0.4495527 0.1166631 0.4495527 0.08029437 0.4197056 0.3833369 0.4495527 0.3833369 0.4495527 0.341844 0.4717311 0.34375 0.8988949 0.375 0.8988949 0.375 0.8988949 0.4495527 0.1166631 0.4197056 0.08029437 0.4197056 0.08029437 0.375 0.8988949 0.40625 0.8988949 0.40625 0.8988949 0.08029437 0.08029437 0.05044728 0.1166631 0.05044728 0.1166631 0.40625 0.8988949 0.4375 0.8988949 0.4375 0.8988949 0.1581559 0.4717311 0.1581559 0.4717311 0.1166631 0.4495527 0.4375 0.8988949 0.46875 0.8988949 0.46875 0.8988949 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.4495527 0.4197056 0.08029437 0.3833369 0.05044728 0.3833369 0.05044728 0.46875 0.8988949 0.5 0.8988949 0.5 0.8988949 0.05044728 0.1166631 0.02826887 0.1581559 0.02826887 0.1581559 0.5 0.8988949 0.53125 0.8988949 0.53125 0.8988949 0.2031783 0.4853885 0.2031783 0.4853885 0.1581559 0.4717311 0.4495527 0.3833369 0.4495527 0.3833369 0.4197056 0.4197056 0.53125 0.8988949 0.5625 0.8988949 0.5625 0.8988949 0.3833369 0.05044728 0.341844 0.02826887 0.341844 0.02826887 0.5625 0.8988949 0.59375 0.8988949 0.59375 0.8988949 0.341844 0.4717311 0.2968217 0.4853885 0.2968217 0.01461154 0.2968217 0.4853885 0.25 0.49 0.25 0.00999999 0.25 0.49 0.2031783 0.4853885 0.2031783 0.01461154 0.2031783 0.4853885 0.1581559 0.4717311 0.1581559 0.02826887 0.1581559 0.4717311 0.1166631 0.4495527 0.1581559 0.02826887 0.1166631 0.4495527 0.08029437 0.4197056 0.1166631 0.05044728 0.1581559 0.02826887 0.1166631 0.4495527 0.1166631 0.05044728 0.08029437 0.4197056 0.05044728 0.3833369 0.08029437 0.08029437 0.05044728 0.3833369 0.02826887 0.341844 0.08029437 0.08029437 0.02826887 0.341844 0.01461154 0.2968217 0.02826887 0.1581559 0.01461154 0.2968217 0.00999999 0.25 0.02826887 0.1581559 0.00999999 0.25 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.1581559 0.05044728 0.1166631 0.02826887 0.341844 0.05044728 0.1166631 0.08029437 0.08029437 0.02826887 0.341844 0.08029437 0.08029437 0.1166631 0.05044728 0.08029437 0.4197056 0.1581559 0.02826887 0.2031783 0.01461154 0.2031783 0.4853885 0.2031783 0.01461154 0.25 0.00999999 0.25 0.49 0.25 0.00999999 0.2968217 0.01461154 0.2968217 0.4853885 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.4717311 0.341844 0.02826887 0.3833369 0.05044728 0.341844 0.4717311 0.3833369 0.05044728 0.4197056 0.08029437 0.3833369 0.4495527 0.341844 0.4717311 0.3833369 0.05044728 0.3833369 0.4495527 0.4197056 0.08029437 0.4495527 0.1166631 0.4197056 0.4197056 0.4495527 0.1166631 0.4717311 0.1581559 0.4197056 0.4197056 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.341844 0.4853885 0.2031783 0.49 0.25 0.4717311 0.341844 0.49 0.25 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.4717311 0.1581559 0.4495527 0.3833369 0.4197056 0.4197056 0.4717311 0.1581559 0.4197056 0.08029437 0.4495527 0.1166631 0.4495527 0.1166631 0.05044728 0.1166631 0.08029437 0.08029437 0.08029437 0.08029437 0.1166631 0.4495527 0.1166631 0.4495527 0.1581559 0.4717311 0.4853885 0.2968217 0.4853885 0.2968217 0.49 0.25 0.2031783 0.01461154 0.25 0.00999999 0.25 0.00999999 0.01461154 0.2968217 0.01461154 0.2968217 0.02826887 0.341844 0.3833369 0.4495527 0.3833369 0.4495527 0.4197056 0.4197056 0.3833369 0.05044728 0.4197056 0.08029437 0.4197056 0.08029437 0.02826887 0.1581559 0.05044728 0.1166631 0.05044728 0.1166631 0.1581559 0.4717311 0.1581559 0.4717311 0.2031783 0.4853885 0.4853885 0.2031783 0.49 0.25 0.49 0.25 0.1581559 0.02826887 0.2031783 0.01461154 0.2031783 0.01461154 0.02826887 0.341844 0.02826887 0.341844 0.05044728 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.4495527 0.3833369 0.341844 0.02826887 0.3833369 0.05044728 0.3833369 0.05044728 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.1581559 0.25 0.49 0.25 0.49 0.2968217 0.4853885 0.2031783 0.4853885 0.2031783 0.4853885 0.25 0.49 0.4717311 0.1581559 0.4853885 0.2031783 0.4853885 0.2031783 0.1166631 0.05044728 0.1581559 0.02826887 0.1581559 0.02826887 0.05044728 0.3833369 0.05044728 0.3833369 0.08029437 0.4197056 0.4495527 0.3833369 0.4495527 0.3833369 0.4717311 0.341844 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.02826887 0.00999999 0.25 0.01461154 0.2031783 0.01461154 0.2031783 0.2968217 0.4853885 0.2968217 0.4853885 0.341844 0.4717311 0.4495527 0.1166631 0.4717311 0.1581559 0.4717311 0.1581559 0.08029437 0.08029437 0.1166631 0.05044728 0.1166631 0.05044728 0.08029437 0.4197056 0.08029437 0.4197056 0.1166631 0.4495527 0.4717311 0.341844 0.4717311 0.341844 0.4853885 0.2968217 0.25 0.00999999 0.2968217 0.01461154 0.2968217 0.01461154 0.00999999 0.25 0.00999999 0.25 0.01461154 0.2968217
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 99 7 21 164 7 22 100 7 23 73 9 27 138 9 28 74 9 29 100 11 33 165 11 34 101 11 35 74 13 39 139 13 40 75 13 41 101 14 42 166 14 43 102 14 44 75 15 45 140 15 46 76 15 47 102 17 51 167 17 52 103 17 53 76 18 54 141 18 55 77 18 56 103 20 60 106 20 61 72 20 62 77 22 66 142 22 67 78 22 68 78 23 69 143 23 70 79 23 71 79 25 75 144 25 76 80 25 77 81 28 84 144 28 85 145 28 86 82 29 87 145 29 88 146 29 89 83 31 93 146 31 94 147 31 95 84 34 102 147 34 103 148 34 104 85 37 111 148 37 112 149 37 113 50 39 117 54 39 118 62 39 119 103 40 120 8 40 121 70 40 122 102 41 123 70 41 124 68 41 125 101 42 126 68 42 127 66 42 128 100 43 129 66 43 130 64 43 131 99 44 132 64 44 133 62 44 134 98 45 135 62 45 136 60 45 137 97 46 138 60 46 139 58 46 140 96 47 141 58 47 142 56 47 143 54 48 144 96 48 145 56 48 146 52 49 147 95 49 148 54 49 149 50 50 150 94 50 151 52 50 152 48 51 153 93 51 154 50 51 155 46 52 156 92 52 157 48 52 158 44 53 159 91 53 160 46 53 161 42 54 162 90 54 163 44 54 164 40 55 165 89 55 166 42 55 167 38 56 168 88 56 169 40 56 170 36 57 171 87 57 172 38 57 173 34 58 174 86 58 175 36 58 176 32 59 177 85 59 178 34 59 179 30 60 180 84 60 181 32 60 182 28 61 183 83 61 184 30 61 185 26 62 186 82 62 187 28 62 188 24 63 189 81 63 190 26 63 191 79 64 192 24 64 193 22 64 194 78 65 195 22 65 196 20 65 197 77 66 198 20 66 199 18 66 200 76 67 201 18 67 202 16 67 203 75 68 204 16 68 205 14 68 206 74 69 207 14 69 208 12 69 209 73 70 210 12 70 211 10 70 212 72 71 213 10 71 214 8 71 215 105 72 216 137 72 217 106 72 218 104 73 219 138 73 220 137 73 221 107 74 222 139 74 223 138 74 224 108 75 225 140 75 226 139 75 227 109 76 228 141 76 229 140 76 230 110 77 231 142 77 232 141 77 233 111 78 234 143 78 235 142 78 236 112 79 237 144 79 238 143 79 239 144 80 240 114 80 241 145 80 242 145 81 243 115 81 244 146 81 245 146 82 246 116 82 247 147 82 248 147 83 249 117 83 250 148 83 251 148 84 252 118 84 253 149 84 254 149 85 255 119 85 256 150 85 257 150 86 258 120 86 259 151 86 260 151 87 261 121 87 262 152 87 263 152 88 264 122 88 265 153 88 266 153 89 267 123 89 268 154 89 269 154 90 270 124 90 271 155 90 272 155 91 273 125 91 274 156 91 275 156 92 276 126 92 277 157 92 278 157 93 279 127 93 280 158 93 281 158 94 282 128 94 283 159 94 284 159 95 285 129 95 286 160 95 287 129 96 288 161 96 289 160 96 290 130 97 291 162 97 292 161 97 293 131 98 294 163 98 295 162 98 296 132 99 297 164 99 298 163 99 299 133 100 300 165 100 301 164 100 302 134 101 303 166 101 304 165 101 305 135 102 306 167 102 307 166 102 308 136 103 309 106 103 310 167 103 311 72 104 312 137 104 313 73 104 314 98 105 315 163 105 316 99 105 317 97 107 321 162 107 322 98 107 323 96 109 327 161 109 328 97 109 329 96 112 336 159 112 337 160 112 338 95 114 342 158 114 343 159 114 344 94 116 348 157 116 349 158 116 350 93 119 357 156 119 358 157 119 359 92 121 363 155 121 364 156 121 365 91 123 369 154 123 370 155 123 371 90 125 375 153 125 376 154 125 377 89 128 384 152 128 385 153 128 386 88 130 390 151 130 391 152 130 392 87 133 399 150 133 400 151 133 401 86 135 405 149 135 406 150 135 407 172 136 408 171 136 409 180 136 410 1 168 504 3 168 505 2 168 506 3 169 507 7 169 508 6 169 509 7 170 510 5 170 511 4 170 512 5 171 513 1 171 514 0 171 515 6 172 516 4 172 517 0 172 518 3 173 519 1 173 520 5 173 521 99 175 525 163 175 526 164 175 527 73 177 531 137 177 532 138 177 533 100 179 537 164 179 538 165 179 539 74 181 543 138 181 544 139 181 545 101 182 546 165 182 547 166 182 548 75 183 549 139 183 550 140 183 551 102 185 555 166 185 556 167 185 557 76 186 558 140 186 559 141 186 560 103 188 564 167 188 565 106 188 566 77 190 570 141 190 571 142 190 572 78 191 573 142 191 574 143 191 575 79 193 579 143 193 580 144 193 581 81 196 588 80 196 589 144 196 590 82 197 591 81 197 592 145 197 593 83 199 597 82 199 598 146 199 599 84 202 606 83 202 607 147 202 608 85 205 615 84 205 616 148 205 617 70 207 621 8 207 622 40 207 623 8 208 624 10 208 625 38 208 626 10 209 627 12 209 628 38 209 629 12 210 630 14 210 631 36 210 632 38 211 633 12 211 634 36 211 635 14 212 636 16 212 637 30 212 638 16 213 639 18 213 640 30 213 641 18 214 642 20 214 643 22 214 644 22 215 645 24 215 646 26 215 647 26 216 648 28 216 649 22 216 650 28 217 651 30 217 652 22 217 653 30 218 654 32 218 655 14 218 656 32 219 657 34 219 658 14 219 659 34 220 660 36 220 661 14 220 662 38 221 663 40 221 664 8 221 665 40 222 666 42 222 667 70 222 668 42 223 669 44 223 670 70 223 671 44 224 672 46 224 673 68 224 674 70 225 675 44 225 676 68 225 677 46 226 678 48 226 679 62 226 680 48 227 681 50 227 682 62 227 683 50 228 684 52 228 685 54 228 686 54 229 687 56 229 688 58 229 689 58 230 690 60 230 691 54 230 692 60 231 693 62 231 694 54 231 695 62 232 696 64 232 697 46 232 698 64 233 699 66 233 700 46 233 701 66 234 702 68 234 703 46 234 704 18 235 705 22 235 706 30 235 707 103 236 708 72 236 709 8 236 710 102 237 711 103 237 712 70 237 713 101 238 714 102 238 715 68 238 716 100 239 717 101 239 718 66 239 719 99 240 720 100 240 721 64 240 722 98 241 723 99 241 724 62 241 725 97 242 726 98 242 727 60 242 728 96 243 729 97 243 730 58 243 731 54 244 732 95 244 733 96 244 734 52 245 735 94 245 736 95 245 737 50 246 738 93 246 739 94 246 740 48 247 741 92 247 742 93 247 743 46 248 744 91 248 745 92 248 746 44 249 747 90 249 748 91 249 749 42 250 750 89 250 751 90 250 752 40 251 753 88 251 754 89 251 755 38 252 756 87 252 757 88 252 758 36 253 759 86 253 760 87 253 761 34 254 762 85 254 763 86 254 764 32 255 765 84 255 766 85 255 767 30 256 768 83 256 769 84 256 770 28 257 771 82 257 772 83 257 773 26 258 774 81 258 775 82 258 776 24 259 777 80 259 778 81 259 779 79 260 780 80 260 781 24 260 782 78 261 783 79 261 784 22 261 785 77 262 786 78 262 787 20 262 788 76 263 789 77 263 790 18 263 791 75 264 792 76 264 793 16 264 794 74 265 795 75 265 796 14 265 797 73 266 798 74 266 799 12 266 800 72 267 801 73 267 802 10 267 803 105 268 804 104 268 805 137 268 806 104 269 807 107 269 808 138 269 809 107 270 810 108 270 811 139 270 812 108 271 813 109 271 814 140 271 815 109 272 816 110 272 817 141 272 818 110 273 819 111 273 820 142 273 821 111 274 822 112 274 823 143 274 824 112 275 825 113 275 826 144 275 827 144 276 828 113 276 829 114 276 830 145 277 831 114 277 832 115 277 833 146 278 834 115 278 835 116 278 836 147 279 837 116 279 838 117 279 839 148 280 840 117 280 841 118 280 842 149 281 843 118 281 844 119 281 845 150 282 846 119 282 847 120 282 848 151 283 849 120 283 850 121 283 851 152 284 852 121 284 853 122 284 854 153 285 855 122 285 856 123 285 857 154 286 858 123 286 859 124 286 860 155 287 861 124 287 862 125 287 863 156 288 864 125 288 865 126 288 866 157 289 867 126 289 868 127 289 869 158 290 870 127 290 871 128 290 872 159 291 873 128 291 874 129 291 875 129 292 876 130 292 877 161 292 878 130 293 879 131 293 880 162 293 881 131 294 882 132 294 883 163 294 884 132 295 885 133 295 886 164 295 887 133 296 888 134 296 889 165 296 890 134 297 891 135 297 892 166 297 893 135 298 894 136 298 895 167 298 896 136 299 897 105 299 898 106 299 899 72 300 900 106 300 901 137 300 902 98 301 903 162 301 904 163 301 905 97 303 909 161 303 910 162 303 911 96 305 915 160 305 916 161 305 917 96 308 924 95 308 925 159 308 926 95 310 930 94 310 931 158 310 932 94 312 936 93 312 937 157 312 938 93 315 945 92 315 946 156 315 947 92 317 951 91 317 952 155 317 953 91 319 957 90 319 958 154 319 959 90 321 963 89 321 964 153 321 965 89 324 972 88 324 973 152 324 974 88 326 978 87 326 979 151 326 980 87 329 987 86 329 988 150 329 989 86 331 993 85 331 994 149 331 995 170 332 996 168 332 997 183 332 998 168 333 999 169 333 1000 184 333 1001 169 334 1002 199 334 1003 185 334 1004 199 335 1005 198 335 1006 186 335 1007 198 336 1008 197 336 1009 186 336 1010 197 337 1011 196 337 1012 187 337 1013 186 338 1014 197 338 1015 187 338 1016 196 339 1017 195 339 1018 188 339 1019 195 340 1020 194 340 1021 188 340 1022 194 341 1023 193 341 1024 190 341 1025 193 342 1026 192 342 1027 190 342 1028 192 343 1029 191 343 1030 190 343 1031 190 344 1032 189 344 1033 194 344 1034 189 345 1035 188 345 1036 194 345 1037 188 346 1038 187 346 1039 196 346 1040 186 347 1041 185 347 1042 199 347 1043 185 348 1044 184 348 1045 169 348 1046 184 349 1047 183 349 1048 168 349 1049 183 350 1050 182 350 1051 170 350 1052 182 351 1053 181 351 1054 170 351 1055 181 352 1056 180 352 1057 171 352 1058 170 353 1059 181 353 1060 171 353 1061 180 354 1062 179 354 1063 172 354 1064 179 355 1065 178 355 1066 172 355 1067 178 356 1068 177 356 1069 174 356 1070 177 357 1071 176 357 1072 174 357 1073 176 358 1074 175 358 1075 174 358 1076 174 359 1077 173 359 1078 178 359 1079 173 360 1080 172 360 1081 178 360 1082
+
+
+
+
+
+ 63 6 18 131 6 19 61 6 20 11 8 24 105 8 25 9 8 26 43 10 30 123 10 31 122 10 32 25 12 36 114 12 37 113 12 38 61 16 48 130 16 49 59 16 50 41 19 57 122 19 58 121 19 59 25 21 63 112 21 64 23 21 65 59 24 72 129 24 73 57 24 74 39 26 78 121 26 79 120 26 80 23 27 81 111 27 82 21 27 83 55 30 90 129 30 91 128 30 92 37 32 96 120 32 97 119 32 98 21 33 99 110 33 100 19 33 101 9 35 105 136 35 106 71 35 107 13 36 108 171 36 109 15 36 110 53 38 114 128 38 115 127 38 116 27 106 318 115 106 319 114 106 320 45 108 324 124 108 325 123 108 326 65 110 330 132 110 331 63 110 332 13 111 333 104 111 334 11 111 335 29 113 339 116 113 340 115 113 341 47 115 345 125 115 346 124 115 347 67 117 351 133 117 352 65 117 353 15 118 354 107 118 355 13 118 356 31 120 360 117 120 361 116 120 362 49 122 366 126 122 367 125 122 368 69 124 372 134 124 373 67 124 374 17 126 378 108 126 379 15 126 380 33 127 381 118 127 382 117 127 383 51 129 387 127 129 388 126 129 389 71 131 393 135 131 394 69 131 395 19 132 396 109 132 397 17 132 398 35 134 402 119 134 403 118 134 404 33 137 411 179 137 412 180 137 413 51 138 414 188 138 415 189 138 416 67 139 417 198 139 418 69 139 419 23 140 420 176 140 421 25 140 422 43 141 423 184 141 424 185 141 425 59 142 426 194 142 427 61 142 428 15 143 429 172 143 430 17 143 431 35 144 432 180 144 433 181 144 434 53 145 435 189 145 436 190 145 437 69 146 438 199 146 439 71 146 440 27 147 441 176 147 442 177 147 443 45 148 444 185 148 445 186 148 446 61 149 447 195 149 448 63 149 449 17 150 450 173 150 451 19 150 452 37 151 453 181 151 454 182 151 455 55 152 456 190 152 457 191 152 458 9 153 459 168 153 460 11 153 461 71 154 462 169 154 463 9 154 464 29 155 465 177 155 466 178 155 467 47 156 468 186 156 469 187 156 470 63 157 471 196 157 472 65 157 473 19 158 474 174 158 475 21 158 476 39 159 477 182 159 478 183 159 479 57 160 480 191 160 481 192 160 482 11 161 483 170 161 484 13 161 485 31 162 486 178 162 487 179 162 488 49 163 489 187 163 490 188 163 491 65 164 492 197 164 493 67 164 494 21 165 495 175 165 496 23 165 497 41 166 498 183 166 499 184 166 500 57 167 501 193 167 502 59 167 503 63 174 522 132 174 523 131 174 524 11 176 528 104 176 529 105 176 530 43 178 534 45 178 535 123 178 536 25 180 540 27 180 541 114 180 542 61 184 552 131 184 553 130 184 554 41 187 561 43 187 562 122 187 563 25 189 567 113 189 568 112 189 569 59 192 576 130 192 577 129 192 578 39 194 582 41 194 583 121 194 584 23 195 585 112 195 586 111 195 587 55 198 594 57 198 595 129 198 596 37 200 600 39 200 601 120 200 602 21 201 603 111 201 604 110 201 605 9 203 609 105 203 610 136 203 611 13 204 612 170 204 613 171 204 614 53 206 618 55 206 619 128 206 620 27 302 906 29 302 907 115 302 908 45 304 912 47 304 913 124 304 914 65 306 918 133 306 919 132 306 920 13 307 921 107 307 922 104 307 923 29 309 927 31 309 928 116 309 929 47 311 933 49 311 934 125 311 935 67 313 939 134 313 940 133 313 941 15 314 942 108 314 943 107 314 944 31 316 948 33 316 949 117 316 950 49 318 954 51 318 955 126 318 956 69 320 960 135 320 961 134 320 962 17 322 966 109 322 967 108 322 968 33 323 969 35 323 970 118 323 971 51 325 975 53 325 976 127 325 977 71 327 981 136 327 982 135 327 983 19 328 984 110 328 985 109 328 986 35 330 990 37 330 991 119 330 992 33 361 1083 31 361 1084 179 361 1085 51 362 1086 49 362 1087 188 362 1088 67 363 1089 197 363 1090 198 363 1091 23 364 1092 175 364 1093 176 364 1094 43 365 1095 41 365 1096 184 365 1097 59 366 1098 193 366 1099 194 366 1100 15 367 1101 171 367 1102 172 367 1103 35 368 1104 33 368 1105 180 368 1106 53 369 1107 51 369 1108 189 369 1109 69 370 1110 198 370 1111 199 370 1112 27 371 1113 25 371 1114 176 371 1115 45 372 1116 43 372 1117 185 372 1118 61 373 1119 194 373 1120 195 373 1121 17 374 1122 172 374 1123 173 374 1124 37 375 1125 35 375 1126 181 375 1127 55 376 1128 53 376 1129 190 376 1130 9 377 1131 169 377 1132 168 377 1133 71 378 1134 199 378 1135 169 378 1136 29 379 1137 27 379 1138 177 379 1139 47 380 1140 45 380 1141 186 380 1142 63 381 1143 195 381 1144 196 381 1145 19 382 1146 173 382 1147 174 382 1148 39 383 1149 37 383 1150 182 383 1151 57 384 1152 55 384 1153 191 384 1154 11 385 1155 168 385 1156 170 385 1157 31 386 1158 29 386 1159 178 386 1160 49 387 1161 47 387 1162 187 387 1163 65 388 1164 196 388 1165 197 388 1166 21 389 1167 174 389 1168 175 389 1169 41 390 1170 39 390 1171 183 390 1172 57 391 1173 192 391 1174 193 391 1175
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -1.029198 -1.021838 0.09228229 -13.07551 -0.9260871 0.05411165 -1.035489 -1.00146 0.2991693 -13.08123 -0.9075493 0.2423195 -1.041538 -0.9411104 0.4981057 -13.08673 -0.8526484 0.4232947 -1.047113 -0.8431079 0.6814466 -13.0918 -0.7634943 0.5900822 -1.052 -0.7112189 0.8421461 -13.09625 -0.6435131 0.7362728 -1.05601 -0.5505115 0.9740288 -13.0999 -0.4973154 0.8562483 -1.05899 -0.3671619 1.072026 -13.10261 -0.3305197 0.9453981 -1.060825 -0.1682159 1.132373 -13.10428 -0.1495358 1.000296 -1.061444 0.03868103 1.15275 -13.10484 0.03868103 1.018833 -1.060825 0.2455779 1.132373 -13.10428 0.2268979 1.000296 -1.05899 0.4445239 1.072026 -13.10261 0.4078818 0.9453981 -1.05601 0.6278736 0.9740288 -13.0999 0.5746775 0.8562483 -1.052 0.788581 0.8421461 -13.09625 0.7208752 0.7362728 -1.047113 0.92047 0.6814466 -13.0918 0.8408564 0.5900822 -1.041538 1.018472 0.4981057 -13.08673 0.9300105 0.4232947 -1.035489 1.078822 0.2991693 -13.08123 0.9849113 0.2423195 -1.029198 1.0992 0.09228229 -13.07551 1.003449 0.05411165 -1.022907 1.078822 -0.1146046 -13.06978 0.9849113 -0.1340961 -1.016858 1.018472 -0.313541 -13.06428 0.9300105 -0.3150712 -1.011282 0.92047 -0.4968819 -13.05921 0.8408564 -0.4818589 -1.006396 0.788581 -0.6575814 -13.05476 0.7208752 -0.6280494 -1.002386 0.6278736 -0.7894641 -13.05111 0.5746775 -0.7480249 -0.9994054 0.4445239 -0.8874619 -13.0484 0.4078818 -0.8371747 -0.9975705 0.2455779 -0.9478086 -13.04673 0.2268979 -0.8920729 -0.9969511 0.03868103 -0.9681852 -13.04617 0.03868103 -0.9106098 -0.9975705 -0.1682159 -0.9478086 -13.04673 -0.1495358 -0.8920729 -0.9994054 -0.3671619 -0.8874619 -13.0484 -0.3305197 -0.8371747 -1.002386 -0.5505115 -0.7894641 -13.05111 -0.4973154 -0.7480249 -1.006396 -0.7112189 -0.6575814 -13.05476 -0.6435131 -0.6280494 -1.011282 -0.8431079 -0.4968819 -13.05921 -0.7634943 -0.4818589 -1.016858 -0.9411104 -0.313541 -13.06428 -0.8526484 -0.3150712 -1.022907 -1.00146 -0.1146046 -13.06978 -0.9075493 -0.1340961 -11.32141 -1.021838 0.05966985 -11.3277 -1.00146 0.2665568 -11.33375 -0.9411104 0.4654932 -11.33932 -0.8431079 0.6488341 -11.34421 -0.7112189 0.8095336 -11.34822 -0.5505115 0.9414163 -11.3512 -0.3671619 1.039414 -11.35303 -0.1682159 1.099761 -11.35365 0.03868103 1.120137 -11.35303 0.2455779 1.099761 -11.3512 0.4445239 1.039414 -11.34822 0.6278736 0.9414163 -11.34421 0.788581 0.8095336 -11.33932 0.92047 0.6488341 -11.33375 1.018472 0.4654932 -11.3277 1.078822 0.2665568 -11.32141 1.0992 0.05966985 -11.31511 1.078822 -0.147217 -11.30907 1.018472 -0.3461534 -11.30349 0.92047 -0.5294944 -11.2986 0.788581 -0.6901939 -11.29459 0.6278736 -0.8220766 -11.29161 0.4445239 -0.9200744 -11.28978 0.2455779 -0.9804211 -11.28916 0.03868103 -1.000798 -11.28978 -0.1682159 -0.9804211 -11.29161 -0.3671619 -0.9200744 -11.29459 -0.5505115 -0.8220766 -11.2986 -0.7112189 -0.6901939 -11.30349 -0.8431079 -0.5294944 -11.30907 -0.9411104 -0.3461534 -11.31511 -1.00146 -0.147217 -13.2208 -1.165141 0.2931191 -13.21352 -1.188725 0.05367594 -11.18339 -1.188725 0.06010878 -13.2278 -1.095295 0.5233605 -13.23426 -0.9818704 0.7355521 -13.23991 -0.8292271 0.9215397 -13.24455 -0.6432306 1.074176 -13.248 -0.4310286 1.187595 -13.25012 -0.2007761 1.257437 -13.25084 0.03867846 1.281021 -13.25012 0.2781331 1.257437 -13.248 0.5083857 1.187595 -13.24455 0.7205875 1.074176 -13.23991 0.906584 0.9215397 -13.23426 1.059227 0.7355521 -13.2278 1.172652 0.5233605 -13.2208 1.242498 0.2931191 -13.21352 1.266082 0.05367594 -13.20624 1.242498 -0.185767 -13.19924 1.172652 -0.4160085 -13.19279 1.059227 -0.6282001 -13.18713 0.906584 -0.8141877 -13.18249 0.7205875 -0.9668237 -13.17904 0.5083857 -1.080242 -13.17692 0.2781331 -1.150085 -13.1762 0.03867846 -1.173668 -13.17692 -0.2007761 -1.150085 -13.17904 -0.4310286 -1.080242 -13.18249 -0.6432306 -0.9668237 -13.18713 -0.8292271 -0.8141877 -13.19279 -0.9818704 -0.6282001 -13.19924 -1.095295 -0.4160085 -13.20624 -1.165141 -0.185767 -11.19067 -1.165141 0.2995519 -11.19768 -1.095295 0.5297933 -11.20413 -0.9818704 0.7419849 -11.20978 -0.8292271 0.9279725 -11.21442 -0.6432306 1.080609 -11.21787 -0.4310286 1.194027 -11.22 -0.2007761 1.26387 -11.22071 0.03867846 1.287454 -11.22 0.2781331 1.26387 -11.21787 0.5083857 1.194027 -11.21442 0.7205875 1.080609 -11.20978 0.906584 0.9279725 -11.20413 1.059227 0.7419849 -11.19768 1.172652 0.5297933 -11.19067 1.242498 0.2995519 -11.18339 1.266082 0.06010878 -11.17611 1.242498 -0.1793342 -11.16911 1.172652 -0.4095757 -11.16266 1.059227 -0.6217674 -11.157 0.906584 -0.8077549 -11.15236 0.7205875 -0.9603909 -11.14891 0.5083857 -1.07381 -11.14679 0.2781331 -1.143653 -11.14607 0.03867846 -1.167236 -11.14679 -0.2007761 -1.143653 -11.14891 -0.4310286 -1.07381 -11.15236 -0.6432306 -0.9603909 -11.157 -0.8292271 -0.8077549 -11.16266 -0.9818704 -0.6217674 -11.16911 -1.095295 -0.4095757 -11.17611 -1.165141 -0.1793342 -12.37012 -0.9075493 0.2423195 -12.36439 -0.9260871 0.05411165 -12.37562 -0.8526484 0.4232947 -12.38069 -0.7634943 0.5900822 -12.38514 -0.6435131 0.7362728 -12.38878 -0.4973154 0.8562483 -12.39149 -0.3305197 0.9453981 -12.39316 -0.1495358 1.000296 -12.39373 0.03868103 1.018833 -12.39316 0.2268979 1.000296 -12.39149 0.4078818 0.9453981 -12.38878 0.5746775 0.8562483 -12.38514 0.7208752 0.7362728 -12.38069 0.8408564 0.5900822 -12.37562 0.9300105 0.4232947 -12.37012 0.9849113 0.2423195 -12.36439 1.003449 0.05411165 -12.35867 0.9849113 -0.1340961 -12.35317 0.9300105 -0.3150712 -12.34809 0.8408564 -0.4818589 -12.34365 0.7208752 -0.6280494 -12.34 0.5746775 -0.7480249 -12.33729 0.4078818 -0.8371747 -12.33562 0.2268979 -0.8920729 -12.33506 0.03868103 -0.9106098 -12.33562 -0.1495358 -0.8920729 -12.33729 -0.3305197 -0.8371747 -12.34 -0.4973154 -0.7480249 -12.34365 -0.6435131 -0.6280494 -12.34809 -0.7634943 -0.4818589 -12.35317 -0.8526484 -0.3150712 -12.35867 -0.9075493 -0.1340961
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0.8941683 -0.2222697 -0.3886633 -0.7594906 -0.4012401 -0.5120357 0.8828371 -0.4640426 0.07254731 -0.7724652 -0.6138536 0.1627306 0.8872783 0.4481748 -0.1089794 -0.7611508 -0.4898042 -0.4251367 0.8727791 0.04525226 0.4860131 -0.77473 -0.5671193 0.2795876 -0.7631157 -0.5600127 -0.3225528 -0.7767819 -0.4981881 0.3852513 0.8950523 -0.1369878 -0.4244005 -0.7653151 -0.6091054 -0.2080466 -0.7785387 -0.4096266 0.4754825 0.8850703 0.4650736 -0.01889383 -0.7676645 -0.6350692 -0.08589661 0.8727794 -0.04525202 0.4860126 -0.7799258 -0.3048331 0.5466191 -0.7808818 -0.1879143 0.5957447 0.8955017 -0.0462808 -0.4426452 -0.7813735 -0.06348055 0.6208267 0.8828312 0.4640527 0.07255399 0.8732033 -0.1340745 0.468551 -0.7813704 0.06348419 0.6208303 -0.7808813 0.1879113 0.5957465 0.8955028 0.04627645 -0.4426436 -0.7799205 0.3048373 0.5466244 0.8806509 0.4452611 0.1618527 0.8740326 -0.2179008 0.4342651 -0.7785317 0.4096328 0.4754884 0.885073 -0.4650686 -0.0188899 0 -0.8819118 0.4714145 -0.7767751 0.4981939 0.3852576 0.8950505 0.1369909 -0.4244032 -0.999538 0 -0.03039497 -3.10569e-4 0.9951851 0.0980128 -9.19771e-4 0.9569439 0.2902716 -0.001493632 0.8819297 0.4713785 -0.002010107 0.7730239 0.6343737 -0.002449333 0.6344096 0.7729933 -0.002794444 0.4714126 0.8819083 -0.003032147 0.2902965 0.956932 -0.003153324 0.0980212 0.9951794 -0.003153324 -0.0980212 0.9951794 -0.003032147 -0.2902965 0.956932 -0.002794444 -0.4714127 0.8819083 -0.002449333 -0.6344096 0.7729933 -0.002010107 -0.7730239 0.6343737 -0.001493632 -0.8819298 0.4713786 -9.1977e-4 -0.9569439 0.2902717 -3.10569e-4 -0.9951851 0.09801274 3.10569e-4 -0.9951851 -0.0980128 9.19771e-4 -0.9569439 -0.2902716 0.001493632 -0.8819298 -0.4713785 0.002010107 -0.7730239 -0.6343737 0.002449333 -0.6344096 -0.7729932 0.002794444 -0.4714125 -0.8819085 0.003032147 -0.2902963 -0.9569321 0.003153324 -0.0980212 -0.9951794 0.003153324 0.0980212 -0.9951794 0.003032147 0.2902963 -0.9569321 0.002794444 0.4714124 -0.8819085 0.002449333 0.6344096 -0.7729933 0.002010107 0.7730239 -0.6343737 0.001493632 0.8819298 -0.4713784 9.19771e-4 0.9569439 -0.2902716 3.10569e-4 0.9951851 -0.0980128 3.10569e-4 0.9951851 -0.09801256 9.19771e-4 0.9569439 -0.2902715 0.001493632 0.8819294 -0.4713791 0.002010107 0.7730241 -0.6343735 0.002449333 0.6344098 -0.772993 0.002794444 0.4714125 -0.8819084 0.003032147 0.2902956 -0.9569323 0.003153324 0.09802216 -0.9951792 0.003153324 -0.09802216 -0.9951792 0.003032147 -0.2902955 -0.9569323 0.002794444 -0.4714127 -0.8819083 0.002449333 -0.6344098 -0.772993 0.002010107 -0.7730239 -0.6343738 0.001493632 -0.8819299 -0.4713783 9.1977e-4 -0.9569439 -0.2902715 3.1057e-4 -0.9951851 -0.09801304 -3.10571e-4 -0.9951851 0.09801304 -9.19774e-4 -0.9569439 0.2902715 -0.001493632 -0.8819299 0.4713782 -0.002010107 -0.7730239 0.6343738 -0.002449333 -0.6344095 0.7729933 -0.002794444 -0.4714127 0.8819083 -0.003032147 -0.290296 0.9569321 -0.003153324 -0.0980212 0.9951793 -0.003153324 0.0980212 0.9951793 -0.003032147 0.290296 0.9569321 -0.002794444 0.4714125 0.8819084 -0.002449333 0.6344095 0.7729933 -0.002010107 0.7730241 0.6343735 -0.001493632 0.8819295 0.471379 -9.19774e-4 0.9569439 0.2902715 -3.10569e-4 0.9951851 0.09801256 -0.7700789 -0.6367371 0.03929841 -0.7581936 -0.297728 -0.5800868 0.8732012 0.1340731 0.4685552 -0.757301 -0.1831607 -0.6268552 0.8893725 0.4138886 -0.1941975 -0.7568462 -0.06181395 -0.6506634 0.8928914 -0.2987453 -0.336892 0.880655 -0.4452542 0.1618498 -0.7568458 0.06181484 -0.6506638 0.874032 0.2179043 0.4342647 -0.7572976 0.183161 -0.6268591 0.8912675 0.3634544 -0.2711885 -0.7581882 0.2977299 -0.5800927 0.8912702 -0.3634505 -0.2711846 0.8786135 -0.4095197 0.2456251 -0.7594863 0.4012453 -0.512038 0.8752397 0.2936017 0.3843871 -0.7611442 0.489811 -0.4251408 0.8928881 0.2987513 -0.3368952 -0.763107 0.5600218 -0.3225575 0.889375 -0.4138855 -0.1941931 -0.7653036 0.6091177 -0.2080531 0.8767886 -0.3582999 0.3207228 0.8767853 0.3583039 0.3207269 -0.767655 0.6350807 -0.08589726 0.8941677 0.2222674 -0.388666 -0.7700694 0.6367484 0.03930032 0.8872823 -0.4481672 -0.108978 0.875243 -0.2935997 0.3843812 -0.7724559 0.6138642 0.1627345 0.8786115 0.4095251 0.2456239 -0.7747213 0.5671287 0.2795924 0.9995381 0 0.03039199 0 0.6343747 0.7730258 0 0.6343749 -0.7730256 0 -0.8819119 -0.4714143 0 -0.0980122 0.9951852 0 0.9951843 -0.09802252 0 -0.2902718 -0.9569442 0 -0.7729956 0.6344113 0 0.7729956 0.6344113 0 0.471379 -0.8819307 0 -0.9569364 -0.2902974 0 0.0980122 0.9951852 0 0.9569364 -0.2902974 0 -0.4713791 -0.8819307 0 -0.6343747 0.7730258 0 0.8819118 0.4714145 0 0.2902718 -0.9569443 0 -0.9951843 0.09802216 0 -0.9951843 -0.09802216 0 0.2902721 0.9569442 0 0.8819119 -0.4714143 0 -0.6343749 -0.7730256 0 -0.4713791 0.8819307 0 0.9569365 0.2902973 0 0.0980125 -0.9951852 0 -0.9569365 0.2902973 0 0.471379 0.8819307 0 0.7729955 -0.6344115 0 -0.7729955 -0.6344115 0 -0.2902721 0.9569442 0 0.9951843 0.09802252 0 -0.0980125 -0.9951852 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0.8941695 -0.2222657 -0.3886629 -0.7594923 -0.4012407 -0.5120325 0.882835 -0.4640455 0.07255315 -0.7724655 -0.6138532 0.1627309 0.8872786 0.4481739 -0.1089801 -0.7611516 -0.4898043 -0.4251353 0.8727791 0.04525208 0.4860132 -0.7747301 -0.5671191 0.2795876 -0.7631152 -0.5600128 -0.3225535 -0.7767824 -0.4981871 0.3852515 0.8950516 -0.1369903 -0.4244012 -0.7653131 -0.6091068 -0.20805 -0.7785379 -0.409628 0.4754825 0.8850692 0.465076 -0.01889091 -0.7676648 -0.635069 -0.08589607 0.8727796 -0.0452522 0.4860125 -0.7799251 -0.3048346 0.5466194 -0.780884 -0.1879104 0.5957431 0.8955031 -0.04627633 -0.4426429 -0.7813713 -0.06348413 0.6208291 0.8828333 0.4640498 0.07254803 0.8732024 -0.1340726 0.4685533 -0.7813725 0.06348067 0.6208279 -0.7808791 0.1879153 0.5957481 0.8955014 0.04628086 -0.4426459 -0.7799214 0.3048357 0.5466241 0.8806513 0.4452608 0.1618518 0.8740338 -0.2179027 0.4342619 -0.7785325 0.4096314 0.4754884 0.8850741 -0.4650665 -0.01889276 0 -0.8819118 0.4714145 -0.7767744 0.4981952 0.3852573 0.8950512 0.1369885 -0.4244025 -0.999538 0 -0.03039342 -0.9995381 0 -0.03039342 -0.999538 0 -0.03039342 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.999538 1.22952e-7 -0.03039449 -0.9995381 0 -0.03039324 -0.9995378 4.06942e-6 -0.0304048 -0.9995383 0 -0.03038418 -0.9995381 0 -0.03039139 -0.9995379 -7.002e-7 -0.03039848 -0.999538 0 -0.03039336 -0.9995381 0 -0.03039437 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.9995381 0 -0.03039342 -0.999538 0 -0.03039342 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.999538 1.22952e-7 -0.03039449 -0.9995381 0 -0.03039324 -0.9995378 4.07804e-6 -0.0304048 -0.9995383 0 -0.03038418 -0.9995381 0 -0.03039133 -0.9995379 -7.01981e-7 -0.03039848 -0.999538 0 -0.03039336 -0.9995381 0 -0.03039437 -0.999538 0 -0.03039473 -0.999538 0 -0.03039497 -3.10569e-4 0.995185 0.09801274 -9.19771e-4 0.9569439 0.2902717 -0.001493632 0.8819298 0.4713785 -0.002010107 0.7730239 0.6343737 -0.002449333 0.6344095 0.7729932 -0.002794444 0.4714126 0.8819083 -0.003032147 0.2902962 0.956932 -0.003153324 0.0980212 0.9951794 -0.003153324 -0.0980212 0.9951794 -0.003032147 -0.2902962 0.956932 -0.002794444 -0.4714126 0.8819083 -0.002449333 -0.6344095 0.7729932 -0.002010107 -0.7730239 0.6343737 -0.001493632 -0.8819298 0.4713785 -9.19771e-4 -0.9569439 0.2902717 -3.10569e-4 -0.995185 0.09801274 3.10569e-4 -0.995185 -0.09801274 9.1977e-4 -0.9569439 -0.2902716 0.001493632 -0.8819296 -0.4713786 0.002010107 -0.7730239 -0.6343737 0.002449333 -0.6344095 -0.7729932 0.002794444 -0.4714126 -0.8819083 0.003032147 -0.2902963 -0.9569321 0.003153324 -0.0980212 -0.9951794 0.003153324 0.0980212 -0.9951794 0.003032147 0.2902963 -0.9569321 0.002794444 0.4714126 -0.8819083 0.002449333 0.6344095 -0.7729932 0.002010107 0.7730239 -0.6343737 0.001493632 0.8819296 -0.4713786 9.1977e-4 0.9569439 -0.2902716 3.10569e-4 0.995185 -0.09801274 3.10568e-4 0.9951851 -0.09801256 9.1977e-4 0.9569439 -0.2902715 0.001493632 0.8819294 -0.4713791 0.002010107 0.7730241 -0.6343735 0.002449333 0.6344098 -0.772993 0.002794444 0.4714125 -0.8819084 0.003032147 0.2902956 -0.9569323 0.003153324 0.09802216 -0.9951792 0.003153324 -0.09802216 -0.9951792 0.003032147 -0.2902955 -0.9569323 0.002794444 -0.4714127 -0.8819083 0.002449333 -0.6344098 -0.772993 0.002010107 -0.7730239 -0.6343738 0.001493632 -0.8819299 -0.4713783 9.1977e-4 -0.9569439 -0.2902715 3.10569e-4 -0.9951851 -0.09801304 -3.1057e-4 -0.9951851 0.09801304 -9.19774e-4 -0.9569439 0.2902715 -0.001493632 -0.8819299 0.4713783 -0.002010107 -0.7730239 0.6343738 -0.002449333 -0.6344095 0.7729933 -0.002794444 -0.4714127 0.8819083 -0.003032147 -0.290296 0.9569321 -0.003153324 -0.09802114 0.9951793 -0.003153324 0.0980212 0.9951793 -0.003032147 0.290296 0.9569321 -0.002794444 0.4714125 0.8819084 -0.002449333 0.6344095 0.7729933 -0.002010107 0.7730241 0.6343735 -0.001493632 0.8819294 0.4713791 -9.19774e-4 0.9569439 0.2902715 -3.10568e-4 0.9951851 0.09801256 -0.7700791 -0.6367368 0.03929859 -0.7581927 -0.2977272 -0.5800882 0.8732022 0.1340751 0.4685529 -0.7573004 -0.1831601 -0.626856 0.8893718 0.4138911 -0.1941962 -0.7568467 -0.06181472 -0.6506627 0.8928905 -0.2987484 -0.3368916 0.8806548 -0.4452545 0.1618508 -0.7568453 0.06181406 -0.6506645 0.8740308 0.2179023 0.434268 -0.7572982 0.1831617 -0.6268582 0.8912673 0.3634549 -0.2711883 -0.758189 0.2977305 -0.5800914 0.8912703 -0.3634502 -0.2711848 0.8786148 -0.4095195 0.2456215 -0.7594844 0.4012446 -0.5120411 0.8752405 0.2936025 0.3843846 -0.7611435 0.489811 -0.425142 0.892889 0.2987483 -0.3368956 -0.7631069 0.5600219 -0.3225574 0.889376 -0.4138827 -0.1941947 -0.7653056 0.6091163 -0.2080496 0.8767883 -0.3582998 0.3207234 0.8767856 0.358304 0.3207261 -0.7676548 0.6350808 -0.08589744 0.8941666 0.2222713 -0.3886663 -0.7700691 0.6367489 0.03929984 0.887282 -0.448168 -0.1089772 0.8752421 -0.2935988 0.3843837 -0.7724557 0.6138646 0.1627342 0.8786101 0.4095254 0.2456281 -0.7747215 0.5671283 0.2795926 0.9995381 0 0.03039175 0.9995381 0 0.03038871 0.9995378 0 0.03039884 0.9995381 0 0.03039175 0.999538 0 0.03039371 0.9995379 0 0.03039848 0.999538 0 0.03039371 0.9995381 0 0.0303905 0.999538 -6.83533e-7 0.03039747 0.9995383 0 0.03038638 0.9995374 -2.77787e-6 0.03041458 0.9995391 8.22688e-6 0.03035926 0.9995379 0 0.03039872 0.9995381 9.20489e-7 0.03038936 0.9995378 0 0.03039848 0.9995381 0 0.03039175 0.9995379 0 0.03039884 0.9995382 0 0.03038877 0.9995381 0 0.03039175 0.9995378 0 0.03039944 0.9995381 0 0.03039199 0.9995379 0 0.03039944 0.9995381 0 0.0303905 0.999538 -6.82176e-7 0.03039747 0.9995383 0 0.03038632 0.9995381 -2.51798e-7 0.03038889 0.9995383 7.46237e-7 0.03038388 0.9995379 0 0.03039872 0.9995381 9.18663e-7 0.03038942 0 0.6343747 0.7730258 0 0.6343749 -0.7730256 0 -0.8819119 -0.4714143 0 -0.0980122 0.9951852 0 0.9951843 -0.09802252 0 -0.2902718 -0.9569442 0 -0.7729956 0.6344113 0 0.7729956 0.6344113 0 0.4713791 -0.8819307 0 -0.9569364 -0.2902974 0 0.0980122 0.9951852 0 0.9569364 -0.2902974 0 -0.4713791 -0.8819307 0 -0.6343747 0.7730258 0 0.8819118 0.4714145 0 0.2902718 -0.9569442 0 -0.9951843 0.09802216 0 -0.9951843 -0.09802216 0 0.2902721 0.9569442 0 0.8819119 -0.4714143 0 -0.6343749 -0.7730256 0 -0.4713791 0.8819307 0 0.9569365 0.2902973 0 0.0980125 -0.9951852 0 -0.9569365 0.2902973 0 0.4713791 0.8819307 0 0.7729955 -0.6344115 0 -0.7729955 -0.6344115 0 -0.2902721 0.9569442 0 0.9951843 0.09802252 0 -0.0980125 -0.9951852
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.05044728 0.3833369 0.02826887 0.341844 0.02826887 0.341844 0.15625 0.8988949 0.125 0.8988949 0.125 0.8988949 0.2968217 0.4853885 0.25 0.49 0.25 0.49 0.96875 0.8988949 0.9375 0.8988949 0.9375 0.8988949 0.2031783 0.01461154 0.1581559 0.02826887 0.2031783 0.01461154 0.125 0.8988949 0.09375 0.8988949 0.09375 0.8988949 0.49 0.25 0.4853885 0.2031783 0.49 0.25 0.9375 0.8988949 0.90625 0.8988949 0.90625 0.8988949 0.09375 0.8988949 0.0625 0.8988949 0.0625 0.8988949 0.90625 0.8988949 0.875 0.8988949 0.875 0.8988949 0.02826887 0.341844 0.01461154 0.2968217 0.01461154 0.2968217 0.0625 0.8988949 0.03125 0.8988949 0.03125 0.8988949 0.875 0.8988949 0.84375 0.8988949 0.84375 0.8988949 0.25 0.00999999 0.2031783 0.01461154 0.25 0.00999999 0.03125 0.8988949 0 0.8988949 0 0.8988949 0.49 0.25 0.4853885 0.2968217 0.4853885 0.2968217 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.78125 0.8988949 0.78125 0.8988949 0.01461154 0.2968217 0.00999999 0.25 0.00999999 0.25 0.78125 0.8988949 0.75 0.8988949 0.75 0.8988949 0.2968217 0.01461154 0.25 0.00999999 0.2968217 0.01461154 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.71875 0.8988949 0.75 0.8988949 0.71875 0.8988949 0.6875 0.8988949 0.71875 0.8988949 0.6875 0.8988949 0.01461154 0.2031783 0.00999999 0.25 0.01461154 0.2031783 0.65625 0.8988949 0.6875 0.8988949 0.65625 0.8988949 0.341844 0.02826887 0.2968217 0.01461154 0.341844 0.02826887 0.4717311 0.341844 0.4495527 0.3833369 0.4495527 0.3833369 0.625 0.8988949 0.65625 0.8988949 0.625 0.8988949 0.25 0.49 0.2031783 0.4853885 0.2031783 0.4853885 0.341844 0.4717311 0.3833369 0.4495527 0.3833369 0.4495527 0.59375 0.8988949 0.625 0.8988949 0.59375 0.8988949 0.02826887 0.1581559 0.01461154 0.2031783 0.02826887 0.1581559 0.5504473 0.1166631 0.5146116 0.2031783 0.5504473 0.3833369 0.03125 0.8988949 0 0.5 0.03125 0.5 0.0625 0.8988949 0.03125 0.5 0.0625 0.5 0.09375 0.8988949 0.0625 0.5 0.09375 0.5 0.125 0.8988949 0.09375 0.5 0.125 0.5 0.15625 0.8988949 0.125 0.5 0.15625 0.5 0.1875 0.8988949 0.15625 0.5 0.1875 0.5 0.21875 0.8988949 0.1875 0.5 0.21875 0.5 0.25 0.8988949 0.21875 0.5 0.25 0.5 0.28125 0.5 0.25 0.8988949 0.25 0.5 0.3125 0.5 0.28125 0.8988949 0.28125 0.5 0.34375 0.5 0.3125 0.8988949 0.3125 0.5 0.375 0.5 0.34375 0.8988949 0.34375 0.5 0.40625 0.5 0.375 0.8988949 0.375 0.5 0.4375 0.5 0.40625 0.8988949 0.40625 0.5 0.46875 0.5 0.4375 0.8988949 0.4375 0.5 0.5 0.5 0.46875 0.8988949 0.46875 0.5 0.53125 0.5 0.5 0.8988949 0.5 0.5 0.5625 0.5 0.53125 0.8988949 0.53125 0.5 0.59375 0.5 0.5625 0.8988949 0.5625 0.5 0.625 0.5 0.59375 0.8988949 0.59375 0.5 0.65625 0.5 0.625 0.8988949 0.625 0.5 0.6875 0.5 0.65625 0.8988949 0.65625 0.5 0.71875 0.5 0.6875 0.8988949 0.6875 0.5 0.75 0.5 0.71875 0.8988949 0.71875 0.5 0.78125 0.8988949 0.75 0.5 0.78125 0.5 0.8125 0.8988949 0.78125 0.5 0.8125 0.5 0.84375 0.8988949 0.8125 0.5 0.84375 0.5 0.875 0.8988949 0.84375 0.5 0.875 0.5 0.90625 0.8988949 0.875 0.5 0.90625 0.5 0.9375 0.8988949 0.90625 0.5 0.9375 0.5 0.96875 0.8988949 0.9375 0.5 0.96875 0.5 1 0.8988949 0.96875 0.5 1 0.5 1 1 0.96875 0.8988949 1 0.8988949 0.96875 1 0.9375 0.8988949 0.96875 0.8988949 0.9375 1 0.90625 0.8988949 0.9375 0.8988949 0.90625 1 0.875 0.8988949 0.90625 0.8988949 0.875 1 0.84375 0.8988949 0.875 0.8988949 0.84375 1 0.8125 0.8988949 0.84375 0.8988949 0.8125 1 0.78125 0.8988949 0.8125 0.8988949 0.78125 1 0.75 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.71875 1 0.71875 0.8988949 0.71875 0.8988949 0.6875 1 0.6875 0.8988949 0.6875 0.8988949 0.65625 1 0.65625 0.8988949 0.65625 0.8988949 0.625 1 0.625 0.8988949 0.625 0.8988949 0.59375 1 0.59375 0.8988949 0.59375 0.8988949 0.5625 1 0.5625 0.8988949 0.5625 0.8988949 0.53125 1 0.53125 0.8988949 0.53125 0.8988949 0.5 1 0.5 0.8988949 0.5 0.8988949 0.46875 1 0.46875 0.8988949 0.46875 0.8988949 0.4375 1 0.4375 0.8988949 0.4375 0.8988949 0.40625 1 0.40625 0.8988949 0.40625 0.8988949 0.375 1 0.375 0.8988949 0.375 0.8988949 0.34375 1 0.34375 0.8988949 0.34375 0.8988949 0.3125 1 0.3125 0.8988949 0.3125 0.8988949 0.28125 1 0.28125 0.8988949 0.28125 0.8988949 0.25 1 0.25 0.8988949 0.25 1 0.21875 0.8988949 0.25 0.8988949 0.21875 1 0.1875 0.8988949 0.21875 0.8988949 0.1875 1 0.15625 0.8988949 0.1875 0.8988949 0.15625 1 0.125 0.8988949 0.15625 0.8988949 0.125 1 0.09375 0.8988949 0.125 0.8988949 0.09375 1 0.0625 0.8988949 0.09375 0.8988949 0.0625 1 0.03125 0.8988949 0.0625 0.8988949 0.03125 1 0 0.8988949 0.03125 0.8988949 1 0.8988949 0.96875 0.8988949 0.96875 0.8988949 0.1875 0.8988949 0.15625 0.8988949 0.15625 0.8988949 0.4853885 0.2031783 0.4717311 0.1581559 0.4853885 0.2031783 0.21875 0.8988949 0.1875 0.8988949 0.1875 0.8988949 0.1581559 0.02826887 0.1166631 0.05044728 0.1581559 0.02826887 0.25 0.8988949 0.21875 0.8988949 0.21875 0.8988949 0.08029437 0.4197056 0.05044728 0.3833369 0.05044728 0.3833369 0.341844 0.4717311 0.2968217 0.4853885 0.2968217 0.4853885 0.25 0.8988949 0.28125 0.8988949 0.25 0.8988949 0.4717311 0.1581559 0.4495527 0.1166631 0.4717311 0.1581559 0.28125 0.8988949 0.3125 0.8988949 0.28125 0.8988949 0.1166631 0.05044728 0.08029437 0.08029437 0.1166631 0.05044728 0.3125 0.8988949 0.34375 0.8988949 0.3125 0.8988949 0.1166631 0.4495527 0.08029437 0.4197056 0.08029437 0.4197056 0.3833369 0.4495527 0.341844 0.4717311 0.341844 0.4717311 0.34375 0.8988949 0.375 0.8988949 0.34375 0.8988949 0.4495527 0.1166631 0.4197056 0.08029437 0.4495527 0.1166631 0.375 0.8988949 0.40625 0.8988949 0.375 0.8988949 0.08029437 0.08029437 0.05044728 0.1166631 0.08029437 0.08029437 0.40625 0.8988949 0.4375 0.8988949 0.40625 0.8988949 0.1581559 0.4717311 0.1166631 0.4495527 0.1166631 0.4495527 0.4375 0.8988949 0.46875 0.8988949 0.4375 0.8988949 0.4197056 0.4197056 0.3833369 0.4495527 0.3833369 0.4495527 0.4197056 0.08029437 0.3833369 0.05044728 0.4197056 0.08029437 0.46875 0.8988949 0.5 0.8988949 0.46875 0.8988949 0.05044728 0.1166631 0.02826887 0.1581559 0.05044728 0.1166631 0.5 0.8988949 0.53125 0.8988949 0.5 0.8988949 0.2031783 0.4853885 0.1581559 0.4717311 0.1581559 0.4717311 0.4495527 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.53125 0.8988949 0.5625 0.8988949 0.53125 0.8988949 0.3833369 0.05044728 0.341844 0.02826887 0.3833369 0.05044728 0.5625 0.8988949 0.59375 0.8988949 0.5625 0.8988949 0.4197056 0.4197056 0.3833369 0.4495527 0.4197056 0.08029437 0.4197056 0.08029437 0.4495527 0.1166631 0.4197056 0.08029437 0.05044728 0.1166631 0.08029437 0.08029437 0.05044728 0.1166631 0.1166631 0.4495527 0.1581559 0.4717311 0.1581559 0.4717311 0.4853885 0.2968217 0.49 0.25 0.49 0.25 0.2031783 0.01461154 0.25 0.00999999 0.2031783 0.01461154 0.01461154 0.2968217 0.02826887 0.341844 0.02826887 0.341844 0.3833369 0.4495527 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.05044728 0.4197056 0.08029437 0.3833369 0.05044728 0.02826887 0.1581559 0.05044728 0.1166631 0.02826887 0.1581559 0.1581559 0.4717311 0.2031783 0.4853885 0.2031783 0.4853885 0.4853885 0.2031783 0.49 0.25 0.4853885 0.2031783 0.1581559 0.02826887 0.2031783 0.01461154 0.1581559 0.02826887 0.02826887 0.341844 0.05044728 0.3833369 0.05044728 0.3833369 0.4197056 0.4197056 0.4495527 0.3833369 0.4495527 0.3833369 0.341844 0.02826887 0.3833369 0.05044728 0.341844 0.02826887 0.01461154 0.2031783 0.02826887 0.1581559 0.01461154 0.2031783 0.25 0.49 0.2968217 0.4853885 0.2968217 0.4853885 0.2031783 0.4853885 0.25 0.49 0.25 0.49 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.1581559 0.1166631 0.05044728 0.1581559 0.02826887 0.1166631 0.05044728 0.05044728 0.3833369 0.08029437 0.4197056 0.08029437 0.4197056 0.4495527 0.3833369 0.4717311 0.341844 0.4717311 0.341844 0.2968217 0.01461154 0.341844 0.02826887 0.2968217 0.01461154 0.00999999 0.25 0.01461154 0.2031783 0.00999999 0.25 0.2968217 0.4853885 0.341844 0.4717311 0.341844 0.4717311 0.4495527 0.1166631 0.4717311 0.1581559 0.4495527 0.1166631 0.08029437 0.08029437 0.1166631 0.05044728 0.08029437 0.08029437 0.08029437 0.4197056 0.1166631 0.4495527 0.1166631 0.4495527 0.4717311 0.341844 0.4853885 0.2968217 0.4853885 0.2968217 0.25 0.00999999 0.2968217 0.01461154 0.25 0.00999999 0.00999999 0.25 0.01461154 0.2968217 0.01461154 0.2968217 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 0.05044728 0.3833369 0.05044728 0.3833369 0.02826887 0.341844 0.15625 0.8988949 0.15625 0.8988949 0.125 0.8988949 0.2968217 0.4853885 0.2968217 0.4853885 0.25 0.49 0.96875 0.8988949 0.96875 0.8988949 0.9375 0.8988949 0.2031783 0.01461154 0.1581559 0.02826887 0.1581559 0.02826887 0.125 0.8988949 0.125 0.8988949 0.09375 0.8988949 0.49 0.25 0.4853885 0.2031783 0.4853885 0.2031783 0.9375 0.8988949 0.9375 0.8988949 0.90625 0.8988949 0.09375 0.8988949 0.09375 0.8988949 0.0625 0.8988949 0.90625 0.8988949 0.90625 0.8988949 0.875 0.8988949 0.02826887 0.341844 0.02826887 0.341844 0.01461154 0.2968217 0.0625 0.8988949 0.0625 0.8988949 0.03125 0.8988949 0.875 0.8988949 0.875 0.8988949 0.84375 0.8988949 0.25 0.00999999 0.2031783 0.01461154 0.2031783 0.01461154 0.03125 0.8988949 0.03125 0.8988949 0 0.8988949 0.49 0.25 0.49 0.25 0.4853885 0.2968217 0.84375 0.8988949 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.78125 0.8988949 0.01461154 0.2968217 0.01461154 0.2968217 0.00999999 0.25 0.78125 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.2968217 0.01461154 0.25 0.00999999 0.25 0.00999999 0.4853885 0.2968217 0.4853885 0.2968217 0.4717311 0.341844 0.71875 0.8988949 0.75 0.8988949 0.75 0.8988949 0.6875 0.8988949 0.71875 0.8988949 0.71875 0.8988949 0.01461154 0.2031783 0.00999999 0.25 0.00999999 0.25 0.65625 0.8988949 0.6875 0.8988949 0.6875 0.8988949 0.341844 0.02826887 0.2968217 0.01461154 0.2968217 0.01461154 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.625 0.8988949 0.65625 0.8988949 0.65625 0.8988949 0.25 0.49 0.25 0.49 0.2031783 0.4853885 0.341844 0.4717311 0.341844 0.4717311 0.3833369 0.4495527 0.59375 0.8988949 0.625 0.8988949 0.625 0.8988949 0.02826887 0.1581559 0.01461154 0.2031783 0.01461154 0.2031783 0.7031784 0.4853885 0.75 0.49 0.75 0.00999999 0.75 0.49 0.7968217 0.4853885 0.7968217 0.01461154 0.7968217 0.4853885 0.841844 0.4717311 0.7968217 0.01461154 0.841844 0.4717311 0.8833369 0.4495527 0.841844 0.02826887 0.7968217 0.01461154 0.841844 0.4717311 0.841844 0.02826887 0.8833369 0.4495527 0.9197056 0.4197056 0.9495527 0.1166631 0.9197056 0.4197056 0.9495527 0.3833369 0.9495527 0.1166631 0.9495527 0.3833369 0.9717311 0.341844 0.9853885 0.2968217 0.9853885 0.2968217 0.99 0.25 0.9853885 0.2031783 0.9853885 0.2031783 0.9717311 0.1581559 0.9853885 0.2968217 0.9717311 0.1581559 0.9495527 0.1166631 0.9853885 0.2968217 0.9495527 0.1166631 0.9197056 0.08029437 0.8833369 0.4495527 0.9197056 0.08029437 0.8833369 0.05044728 0.8833369 0.4495527 0.8833369 0.05044728 0.841844 0.02826887 0.8833369 0.4495527 0.7968217 0.01461154 0.75 0.00999999 0.75 0.49 0.75 0.00999999 0.7031784 0.01461154 0.7031784 0.4853885 0.7031784 0.01461154 0.658156 0.02826887 0.7031784 0.4853885 0.658156 0.02826887 0.6166632 0.05044728 0.658156 0.4717311 0.7031784 0.4853885 0.658156 0.02826887 0.658156 0.4717311 0.6166632 0.05044728 0.5802944 0.08029437 0.5504473 0.3833369 0.5802944 0.08029437 0.5504473 0.1166631 0.5504473 0.3833369 0.5504473 0.1166631 0.5282689 0.1581559 0.5146116 0.2031783 0.5146116 0.2031783 0.51 0.25 0.5146116 0.2968217 0.5146116 0.2968217 0.5282689 0.341844 0.5146116 0.2031783 0.5282689 0.341844 0.5504473 0.3833369 0.5146116 0.2031783 0.5504473 0.3833369 0.5802944 0.4197056 0.6166632 0.05044728 0.5802944 0.4197056 0.6166632 0.4495527 0.6166632 0.05044728 0.6166632 0.4495527 0.658156 0.4717311 0.6166632 0.05044728 0.9495527 0.3833369 0.9853885 0.2968217 0.9495527 0.1166631 0.03125 0.8988949 0 0.8988949 0 0.5 0.0625 0.8988949 0.03125 0.8988949 0.03125 0.5 0.09375 0.8988949 0.0625 0.8988949 0.0625 0.5 0.125 0.8988949 0.09375 0.8988949 0.09375 0.5 0.15625 0.8988949 0.125 0.8988949 0.125 0.5 0.1875 0.8988949 0.15625 0.8988949 0.15625 0.5 0.21875 0.8988949 0.1875 0.8988949 0.1875 0.5 0.25 0.8988949 0.21875 0.8988949 0.21875 0.5 0.28125 0.5 0.28125 0.8988949 0.25 0.8988949 0.3125 0.5 0.3125 0.8988949 0.28125 0.8988949 0.34375 0.5 0.34375 0.8988949 0.3125 0.8988949 0.375 0.5 0.375 0.8988949 0.34375 0.8988949 0.40625 0.5 0.40625 0.8988949 0.375 0.8988949 0.4375 0.5 0.4375 0.8988949 0.40625 0.8988949 0.46875 0.5 0.46875 0.8988949 0.4375 0.8988949 0.5 0.5 0.5 0.8988949 0.46875 0.8988949 0.53125 0.5 0.53125 0.8988949 0.5 0.8988949 0.5625 0.5 0.5625 0.8988949 0.53125 0.8988949 0.59375 0.5 0.59375 0.8988949 0.5625 0.8988949 0.625 0.5 0.625 0.8988949 0.59375 0.8988949 0.65625 0.5 0.65625 0.8988949 0.625 0.8988949 0.6875 0.5 0.6875 0.8988949 0.65625 0.8988949 0.71875 0.5 0.71875 0.8988949 0.6875 0.8988949 0.75 0.5 0.75 0.8988949 0.71875 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.75 0.5 0.8125 0.8988949 0.78125 0.8988949 0.78125 0.5 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.5 0.875 0.8988949 0.84375 0.8988949 0.84375 0.5 0.90625 0.8988949 0.875 0.8988949 0.875 0.5 0.9375 0.8988949 0.90625 0.8988949 0.90625 0.5 0.96875 0.8988949 0.9375 0.8988949 0.9375 0.5 1 0.8988949 0.96875 0.8988949 0.96875 0.5 1 1 0.96875 1 0.96875 0.8988949 0.96875 1 0.9375 1 0.9375 0.8988949 0.9375 1 0.90625 1 0.90625 0.8988949 0.90625 1 0.875 1 0.875 0.8988949 0.875 1 0.84375 1 0.84375 0.8988949 0.84375 1 0.8125 1 0.8125 0.8988949 0.8125 1 0.78125 1 0.78125 0.8988949 0.78125 1 0.75 1 0.75 0.8988949 0.75 0.8988949 0.75 1 0.71875 1 0.71875 0.8988949 0.71875 1 0.6875 1 0.6875 0.8988949 0.6875 1 0.65625 1 0.65625 0.8988949 0.65625 1 0.625 1 0.625 0.8988949 0.625 1 0.59375 1 0.59375 0.8988949 0.59375 1 0.5625 1 0.5625 0.8988949 0.5625 1 0.53125 1 0.53125 0.8988949 0.53125 1 0.5 1 0.5 0.8988949 0.5 1 0.46875 1 0.46875 0.8988949 0.46875 1 0.4375 1 0.4375 0.8988949 0.4375 1 0.40625 1 0.40625 0.8988949 0.40625 1 0.375 1 0.375 0.8988949 0.375 1 0.34375 1 0.34375 0.8988949 0.34375 1 0.3125 1 0.3125 0.8988949 0.3125 1 0.28125 1 0.28125 0.8988949 0.28125 1 0.25 1 0.25 1 0.21875 1 0.21875 0.8988949 0.21875 1 0.1875 1 0.1875 0.8988949 0.1875 1 0.15625 1 0.15625 0.8988949 0.15625 1 0.125 1 0.125 0.8988949 0.125 1 0.09375 1 0.09375 0.8988949 0.09375 1 0.0625 1 0.0625 0.8988949 0.0625 1 0.03125 1 0.03125 0.8988949 0.03125 1 0 1 0 0.8988949 1 0.8988949 1 0.8988949 0.96875 0.8988949 0.1875 0.8988949 0.1875 0.8988949 0.15625 0.8988949 0.4853885 0.2031783 0.4717311 0.1581559 0.4717311 0.1581559 0.21875 0.8988949 0.21875 0.8988949 0.1875 0.8988949 0.1581559 0.02826887 0.1166631 0.05044728 0.1166631 0.05044728 0.25 0.8988949 0.25 0.8988949 0.21875 0.8988949 0.08029437 0.4197056 0.08029437 0.4197056 0.05044728 0.3833369 0.341844 0.4717311 0.341844 0.4717311 0.2968217 0.4853885 0.25 0.8988949 0.28125 0.8988949 0.28125 0.8988949 0.4717311 0.1581559 0.4495527 0.1166631 0.4495527 0.1166631 0.28125 0.8988949 0.3125 0.8988949 0.3125 0.8988949 0.1166631 0.05044728 0.08029437 0.08029437 0.08029437 0.08029437 0.3125 0.8988949 0.34375 0.8988949 0.34375 0.8988949 0.1166631 0.4495527 0.1166631 0.4495527 0.08029437 0.4197056 0.3833369 0.4495527 0.3833369 0.4495527 0.341844 0.4717311 0.34375 0.8988949 0.375 0.8988949 0.375 0.8988949 0.4495527 0.1166631 0.4197056 0.08029437 0.4197056 0.08029437 0.375 0.8988949 0.40625 0.8988949 0.40625 0.8988949 0.08029437 0.08029437 0.05044728 0.1166631 0.05044728 0.1166631 0.40625 0.8988949 0.4375 0.8988949 0.4375 0.8988949 0.1581559 0.4717311 0.1581559 0.4717311 0.1166631 0.4495527 0.4375 0.8988949 0.46875 0.8988949 0.46875 0.8988949 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.4495527 0.4197056 0.08029437 0.3833369 0.05044728 0.3833369 0.05044728 0.46875 0.8988949 0.5 0.8988949 0.5 0.8988949 0.05044728 0.1166631 0.02826887 0.1581559 0.02826887 0.1581559 0.5 0.8988949 0.53125 0.8988949 0.53125 0.8988949 0.2031783 0.4853885 0.2031783 0.4853885 0.1581559 0.4717311 0.4495527 0.3833369 0.4495527 0.3833369 0.4197056 0.4197056 0.53125 0.8988949 0.5625 0.8988949 0.5625 0.8988949 0.3833369 0.05044728 0.341844 0.02826887 0.341844 0.02826887 0.5625 0.8988949 0.59375 0.8988949 0.59375 0.8988949 0.341844 0.4717311 0.2968217 0.4853885 0.2968217 0.01461154 0.2968217 0.4853885 0.25 0.49 0.25 0.00999999 0.25 0.49 0.2031783 0.4853885 0.2031783 0.01461154 0.2031783 0.4853885 0.1581559 0.4717311 0.1581559 0.02826887 0.1581559 0.4717311 0.1166631 0.4495527 0.1581559 0.02826887 0.1166631 0.4495527 0.08029437 0.4197056 0.1166631 0.05044728 0.1581559 0.02826887 0.1166631 0.4495527 0.1166631 0.05044728 0.08029437 0.4197056 0.05044728 0.3833369 0.08029437 0.08029437 0.05044728 0.3833369 0.02826887 0.341844 0.08029437 0.08029437 0.02826887 0.341844 0.01461154 0.2968217 0.02826887 0.1581559 0.01461154 0.2968217 0.00999999 0.25 0.02826887 0.1581559 0.00999999 0.25 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.1581559 0.05044728 0.1166631 0.02826887 0.341844 0.05044728 0.1166631 0.08029437 0.08029437 0.02826887 0.341844 0.08029437 0.08029437 0.1166631 0.05044728 0.08029437 0.4197056 0.1581559 0.02826887 0.2031783 0.01461154 0.2031783 0.4853885 0.2031783 0.01461154 0.25 0.00999999 0.25 0.49 0.25 0.00999999 0.2968217 0.01461154 0.2968217 0.4853885 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.4717311 0.341844 0.02826887 0.3833369 0.05044728 0.341844 0.4717311 0.3833369 0.05044728 0.4197056 0.08029437 0.3833369 0.4495527 0.341844 0.4717311 0.3833369 0.05044728 0.3833369 0.4495527 0.4197056 0.08029437 0.4495527 0.1166631 0.4197056 0.4197056 0.4495527 0.1166631 0.4717311 0.1581559 0.4197056 0.4197056 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.341844 0.4853885 0.2031783 0.49 0.25 0.4717311 0.341844 0.49 0.25 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.4717311 0.1581559 0.4495527 0.3833369 0.4197056 0.4197056 0.4717311 0.1581559 0.4197056 0.08029437 0.4495527 0.1166631 0.4495527 0.1166631 0.05044728 0.1166631 0.08029437 0.08029437 0.08029437 0.08029437 0.1166631 0.4495527 0.1166631 0.4495527 0.1581559 0.4717311 0.4853885 0.2968217 0.4853885 0.2968217 0.49 0.25 0.2031783 0.01461154 0.25 0.00999999 0.25 0.00999999 0.01461154 0.2968217 0.01461154 0.2968217 0.02826887 0.341844 0.3833369 0.4495527 0.3833369 0.4495527 0.4197056 0.4197056 0.3833369 0.05044728 0.4197056 0.08029437 0.4197056 0.08029437 0.02826887 0.1581559 0.05044728 0.1166631 0.05044728 0.1166631 0.1581559 0.4717311 0.1581559 0.4717311 0.2031783 0.4853885 0.4853885 0.2031783 0.49 0.25 0.49 0.25 0.1581559 0.02826887 0.2031783 0.01461154 0.2031783 0.01461154 0.02826887 0.341844 0.02826887 0.341844 0.05044728 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.4495527 0.3833369 0.341844 0.02826887 0.3833369 0.05044728 0.3833369 0.05044728 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.1581559 0.25 0.49 0.25 0.49 0.2968217 0.4853885 0.2031783 0.4853885 0.2031783 0.4853885 0.25 0.49 0.4717311 0.1581559 0.4853885 0.2031783 0.4853885 0.2031783 0.1166631 0.05044728 0.1581559 0.02826887 0.1581559 0.02826887 0.05044728 0.3833369 0.05044728 0.3833369 0.08029437 0.4197056 0.4495527 0.3833369 0.4495527 0.3833369 0.4717311 0.341844 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.02826887 0.00999999 0.25 0.01461154 0.2031783 0.01461154 0.2031783 0.2968217 0.4853885 0.2968217 0.4853885 0.341844 0.4717311 0.4495527 0.1166631 0.4717311 0.1581559 0.4717311 0.1581559 0.08029437 0.08029437 0.1166631 0.05044728 0.1166631 0.05044728 0.08029437 0.4197056 0.08029437 0.4197056 0.1166631 0.4495527 0.4717311 0.341844 0.4717311 0.341844 0.4853885 0.2968217 0.25 0.00999999 0.2968217 0.01461154 0.2968217 0.01461154 0.00999999 0.25 0.00999999 0.25 0.01461154 0.2968217
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 99 7 21 164 7 22 100 7 23 73 9 27 138 9 28 74 9 29 100 11 33 165 11 34 101 11 35 74 13 39 139 13 40 75 13 41 101 14 42 166 14 43 102 14 44 75 15 45 140 15 46 76 15 47 102 17 51 167 17 52 103 17 53 76 18 54 141 18 55 77 18 56 103 20 60 106 20 61 72 20 62 77 22 66 142 22 67 78 22 68 78 23 69 143 23 70 79 23 71 79 25 75 144 25 76 80 25 77 81 28 84 144 28 85 145 28 86 82 29 87 145 29 88 146 29 89 83 31 93 146 31 94 147 31 95 84 34 102 147 34 103 148 34 104 85 37 111 148 37 112 149 37 113 50 39 117 54 39 118 62 39 119 103 40 120 8 40 121 70 40 122 102 41 123 70 41 124 68 41 125 101 42 126 68 42 127 66 42 128 100 43 129 66 43 130 64 43 131 99 44 132 64 44 133 62 44 134 98 45 135 62 45 136 60 45 137 97 46 138 60 46 139 58 46 140 96 47 141 58 47 142 56 47 143 54 48 144 96 48 145 56 48 146 52 49 147 95 49 148 54 49 149 50 50 150 94 50 151 52 50 152 48 51 153 93 51 154 50 51 155 46 52 156 92 52 157 48 52 158 44 53 159 91 53 160 46 53 161 42 54 162 90 54 163 44 54 164 40 55 165 89 55 166 42 55 167 38 56 168 88 56 169 40 56 170 36 57 171 87 57 172 38 57 173 34 58 174 86 58 175 36 58 176 32 59 177 85 59 178 34 59 179 30 60 180 84 60 181 32 60 182 28 61 183 83 61 184 30 61 185 26 62 186 82 62 187 28 62 188 24 63 189 81 63 190 26 63 191 79 64 192 24 64 193 22 64 194 78 65 195 22 65 196 20 65 197 77 66 198 20 66 199 18 66 200 76 67 201 18 67 202 16 67 203 75 68 204 16 68 205 14 68 206 74 69 207 14 69 208 12 69 209 73 70 210 12 70 211 10 70 212 72 71 213 10 71 214 8 71 215 105 72 216 137 72 217 106 72 218 104 73 219 138 73 220 137 73 221 107 74 222 139 74 223 138 74 224 108 75 225 140 75 226 139 75 227 109 76 228 141 76 229 140 76 230 110 77 231 142 77 232 141 77 233 111 78 234 143 78 235 142 78 236 112 79 237 144 79 238 143 79 239 144 80 240 114 80 241 145 80 242 145 81 243 115 81 244 146 81 245 146 82 246 116 82 247 147 82 248 147 83 249 117 83 250 148 83 251 148 84 252 118 84 253 149 84 254 149 85 255 119 85 256 150 85 257 150 86 258 120 86 259 151 86 260 151 87 261 121 87 262 152 87 263 152 88 264 122 88 265 153 88 266 153 89 267 123 89 268 154 89 269 154 90 270 124 90 271 155 90 272 155 91 273 125 91 274 156 91 275 156 92 276 126 92 277 157 92 278 157 93 279 127 93 280 158 93 281 158 94 282 128 94 283 159 94 284 159 95 285 129 95 286 160 95 287 129 96 288 161 96 289 160 96 290 130 97 291 162 97 292 161 97 293 131 98 294 163 98 295 162 98 296 132 99 297 164 99 298 163 99 299 133 100 300 165 100 301 164 100 302 134 101 303 166 101 304 165 101 305 135 102 306 167 102 307 166 102 308 136 103 309 106 103 310 167 103 311 72 104 312 137 104 313 73 104 314 98 105 315 163 105 316 99 105 317 97 107 321 162 107 322 98 107 323 96 109 327 161 109 328 97 109 329 96 112 336 159 112 337 160 112 338 95 114 342 158 114 343 159 114 344 94 116 348 157 116 349 158 116 350 93 119 357 156 119 358 157 119 359 92 121 363 155 121 364 156 121 365 91 123 369 154 123 370 155 123 371 90 125 375 153 125 376 154 125 377 89 128 384 152 128 385 153 128 386 88 130 390 151 130 391 152 130 392 87 133 399 150 133 400 151 133 401 86 135 405 149 135 406 150 135 407 172 136 408 171 136 409 180 136 410 1 168 504 3 168 505 2 168 506 3 169 507 7 169 508 6 169 509 7 170 510 5 170 511 4 170 512 5 171 513 1 171 514 0 171 515 6 172 516 4 172 517 0 172 518 3 173 519 1 173 520 5 173 521 99 175 525 163 175 526 164 175 527 73 177 531 137 177 532 138 177 533 100 179 537 164 179 538 165 179 539 74 181 543 138 181 544 139 181 545 101 182 546 165 182 547 166 182 548 75 183 549 139 183 550 140 183 551 102 185 555 166 185 556 167 185 557 76 186 558 140 186 559 141 186 560 103 188 564 167 188 565 106 188 566 77 190 570 141 190 571 142 190 572 78 191 573 142 191 574 143 191 575 79 193 579 143 193 580 144 193 581 81 196 588 80 196 589 144 196 590 82 197 591 81 197 592 145 197 593 83 199 597 82 199 598 146 199 599 84 202 606 83 202 607 147 202 608 85 205 615 84 205 616 148 205 617 70 207 621 8 207 622 40 207 623 8 208 624 10 208 625 38 208 626 10 209 627 12 209 628 38 209 629 12 210 630 14 210 631 36 210 632 38 211 633 12 211 634 36 211 635 14 212 636 16 212 637 30 212 638 16 213 639 18 213 640 30 213 641 18 214 642 20 214 643 22 214 644 22 215 645 24 215 646 26 215 647 26 216 648 28 216 649 22 216 650 28 217 651 30 217 652 22 217 653 30 218 654 32 218 655 14 218 656 32 219 657 34 219 658 14 219 659 34 220 660 36 220 661 14 220 662 38 221 663 40 221 664 8 221 665 40 222 666 42 222 667 70 222 668 42 223 669 44 223 670 70 223 671 44 224 672 46 224 673 68 224 674 70 225 675 44 225 676 68 225 677 46 226 678 48 226 679 62 226 680 48 227 681 50 227 682 62 227 683 50 228 684 52 228 685 54 228 686 54 229 687 56 229 688 58 229 689 58 230 690 60 230 691 54 230 692 60 231 693 62 231 694 54 231 695 62 232 696 64 232 697 46 232 698 64 233 699 66 233 700 46 233 701 66 234 702 68 234 703 46 234 704 18 235 705 22 235 706 30 235 707 103 236 708 72 236 709 8 236 710 102 237 711 103 237 712 70 237 713 101 238 714 102 238 715 68 238 716 100 239 717 101 239 718 66 239 719 99 240 720 100 240 721 64 240 722 98 241 723 99 241 724 62 241 725 97 242 726 98 242 727 60 242 728 96 243 729 97 243 730 58 243 731 54 244 732 95 244 733 96 244 734 52 245 735 94 245 736 95 245 737 50 246 738 93 246 739 94 246 740 48 247 741 92 247 742 93 247 743 46 248 744 91 248 745 92 248 746 44 249 747 90 249 748 91 249 749 42 250 750 89 250 751 90 250 752 40 251 753 88 251 754 89 251 755 38 252 756 87 252 757 88 252 758 36 253 759 86 253 760 87 253 761 34 254 762 85 254 763 86 254 764 32 255 765 84 255 766 85 255 767 30 256 768 83 256 769 84 256 770 28 257 771 82 257 772 83 257 773 26 258 774 81 258 775 82 258 776 24 259 777 80 259 778 81 259 779 79 260 780 80 260 781 24 260 782 78 261 783 79 261 784 22 261 785 77 262 786 78 262 787 20 262 788 76 263 789 77 263 790 18 263 791 75 264 792 76 264 793 16 264 794 74 265 795 75 265 796 14 265 797 73 266 798 74 266 799 12 266 800 72 267 801 73 267 802 10 267 803 105 268 804 104 268 805 137 268 806 104 269 807 107 269 808 138 269 809 107 270 810 108 270 811 139 270 812 108 271 813 109 271 814 140 271 815 109 272 816 110 272 817 141 272 818 110 273 819 111 273 820 142 273 821 111 274 822 112 274 823 143 274 824 112 275 825 113 275 826 144 275 827 144 276 828 113 276 829 114 276 830 145 277 831 114 277 832 115 277 833 146 278 834 115 278 835 116 278 836 147 279 837 116 279 838 117 279 839 148 280 840 117 280 841 118 280 842 149 281 843 118 281 844 119 281 845 150 282 846 119 282 847 120 282 848 151 283 849 120 283 850 121 283 851 152 284 852 121 284 853 122 284 854 153 285 855 122 285 856 123 285 857 154 286 858 123 286 859 124 286 860 155 287 861 124 287 862 125 287 863 156 288 864 125 288 865 126 288 866 157 289 867 126 289 868 127 289 869 158 290 870 127 290 871 128 290 872 159 291 873 128 291 874 129 291 875 129 292 876 130 292 877 161 292 878 130 293 879 131 293 880 162 293 881 131 294 882 132 294 883 163 294 884 132 295 885 133 295 886 164 295 887 133 296 888 134 296 889 165 296 890 134 297 891 135 297 892 166 297 893 135 298 894 136 298 895 167 298 896 136 299 897 105 299 898 106 299 899 72 300 900 106 300 901 137 300 902 98 301 903 162 301 904 163 301 905 97 303 909 161 303 910 162 303 911 96 305 915 160 305 916 161 305 917 96 308 924 95 308 925 159 308 926 95 310 930 94 310 931 158 310 932 94 312 936 93 312 937 157 312 938 93 315 945 92 315 946 156 315 947 92 317 951 91 317 952 155 317 953 91 319 957 90 319 958 154 319 959 90 321 963 89 321 964 153 321 965 89 324 972 88 324 973 152 324 974 88 326 978 87 326 979 151 326 980 87 329 987 86 329 988 150 329 989 86 331 993 85 331 994 149 331 995 170 332 996 168 332 997 183 332 998 168 333 999 169 333 1000 184 333 1001 169 334 1002 199 334 1003 185 334 1004 199 335 1005 198 335 1006 186 335 1007 198 336 1008 197 336 1009 186 336 1010 197 337 1011 196 337 1012 187 337 1013 186 338 1014 197 338 1015 187 338 1016 196 339 1017 195 339 1018 188 339 1019 195 340 1020 194 340 1021 188 340 1022 194 341 1023 193 341 1024 190 341 1025 193 342 1026 192 342 1027 190 342 1028 192 343 1029 191 343 1030 190 343 1031 190 344 1032 189 344 1033 194 344 1034 189 345 1035 188 345 1036 194 345 1037 188 346 1038 187 346 1039 196 346 1040 186 347 1041 185 347 1042 199 347 1043 185 348 1044 184 348 1045 169 348 1046 184 349 1047 183 349 1048 168 349 1049 183 350 1050 182 350 1051 170 350 1052 182 351 1053 181 351 1054 170 351 1055 181 352 1056 180 352 1057 171 352 1058 170 353 1059 181 353 1060 171 353 1061 180 354 1062 179 354 1063 172 354 1064 179 355 1065 178 355 1066 172 355 1067 178 356 1068 177 356 1069 174 356 1070 177 357 1071 176 357 1072 174 357 1073 176 358 1074 175 358 1075 174 358 1076 174 359 1077 173 359 1078 178 359 1079 173 360 1080 172 360 1081 178 360 1082
+
+
+
+
+
+ 63 6 18 131 6 19 61 6 20 11 8 24 105 8 25 9 8 26 43 10 30 123 10 31 122 10 32 25 12 36 114 12 37 113 12 38 61 16 48 130 16 49 59 16 50 41 19 57 122 19 58 121 19 59 25 21 63 112 21 64 23 21 65 59 24 72 129 24 73 57 24 74 39 26 78 121 26 79 120 26 80 23 27 81 111 27 82 21 27 83 55 30 90 129 30 91 128 30 92 37 32 96 120 32 97 119 32 98 21 33 99 110 33 100 19 33 101 9 35 105 136 35 106 71 35 107 13 36 108 171 36 109 15 36 110 53 38 114 128 38 115 127 38 116 27 106 318 115 106 319 114 106 320 45 108 324 124 108 325 123 108 326 65 110 330 132 110 331 63 110 332 13 111 333 104 111 334 11 111 335 29 113 339 116 113 340 115 113 341 47 115 345 125 115 346 124 115 347 67 117 351 133 117 352 65 117 353 15 118 354 107 118 355 13 118 356 31 120 360 117 120 361 116 120 362 49 122 366 126 122 367 125 122 368 69 124 372 134 124 373 67 124 374 17 126 378 108 126 379 15 126 380 33 127 381 118 127 382 117 127 383 51 129 387 127 129 388 126 129 389 71 131 393 135 131 394 69 131 395 19 132 396 109 132 397 17 132 398 35 134 402 119 134 403 118 134 404 33 137 411 179 137 412 180 137 413 51 138 414 188 138 415 189 138 416 67 139 417 198 139 418 69 139 419 23 140 420 176 140 421 25 140 422 43 141 423 184 141 424 185 141 425 59 142 426 194 142 427 61 142 428 15 143 429 172 143 430 17 143 431 35 144 432 180 144 433 181 144 434 53 145 435 189 145 436 190 145 437 69 146 438 199 146 439 71 146 440 27 147 441 176 147 442 177 147 443 45 148 444 185 148 445 186 148 446 61 149 447 195 149 448 63 149 449 17 150 450 173 150 451 19 150 452 37 151 453 181 151 454 182 151 455 55 152 456 190 152 457 191 152 458 9 153 459 168 153 460 11 153 461 71 154 462 169 154 463 9 154 464 29 155 465 177 155 466 178 155 467 47 156 468 186 156 469 187 156 470 63 157 471 196 157 472 65 157 473 19 158 474 174 158 475 21 158 476 39 159 477 182 159 478 183 159 479 57 160 480 191 160 481 192 160 482 11 161 483 170 161 484 13 161 485 31 162 486 178 162 487 179 162 488 49 163 489 187 163 490 188 163 491 65 164 492 197 164 493 67 164 494 21 165 495 175 165 496 23 165 497 41 166 498 183 166 499 184 166 500 57 167 501 193 167 502 59 167 503 63 174 522 132 174 523 131 174 524 11 176 528 104 176 529 105 176 530 43 178 534 45 178 535 123 178 536 25 180 540 27 180 541 114 180 542 61 184 552 131 184 553 130 184 554 41 187 561 43 187 562 122 187 563 25 189 567 113 189 568 112 189 569 59 192 576 130 192 577 129 192 578 39 194 582 41 194 583 121 194 584 23 195 585 112 195 586 111 195 587 55 198 594 57 198 595 129 198 596 37 200 600 39 200 601 120 200 602 21 201 603 111 201 604 110 201 605 9 203 609 105 203 610 136 203 611 13 204 612 170 204 613 171 204 614 53 206 618 55 206 619 128 206 620 27 302 906 29 302 907 115 302 908 45 304 912 47 304 913 124 304 914 65 306 918 133 306 919 132 306 920 13 307 921 107 307 922 104 307 923 29 309 927 31 309 928 116 309 929 47 311 933 49 311 934 125 311 935 67 313 939 134 313 940 133 313 941 15 314 942 108 314 943 107 314 944 31 316 948 33 316 949 117 316 950 49 318 954 51 318 955 126 318 956 69 320 960 135 320 961 134 320 962 17 322 966 109 322 967 108 322 968 33 323 969 35 323 970 118 323 971 51 325 975 53 325 976 127 325 977 71 327 981 136 327 982 135 327 983 19 328 984 110 328 985 109 328 986 35 330 990 37 330 991 119 330 992 33 361 1083 31 361 1084 179 361 1085 51 362 1086 49 362 1087 188 362 1088 67 363 1089 197 363 1090 198 363 1091 23 364 1092 175 364 1093 176 364 1094 43 365 1095 41 365 1096 184 365 1097 59 366 1098 193 366 1099 194 366 1100 15 367 1101 171 367 1102 172 367 1103 35 368 1104 33 368 1105 180 368 1106 53 369 1107 51 369 1108 189 369 1109 69 370 1110 198 370 1111 199 370 1112 27 371 1113 25 371 1114 176 371 1115 45 372 1116 43 372 1117 185 372 1118 61 373 1119 194 373 1120 195 373 1121 17 374 1122 172 374 1123 173 374 1124 37 375 1125 35 375 1126 181 375 1127 55 376 1128 53 376 1129 190 376 1130 9 377 1131 169 377 1132 168 377 1133 71 378 1134 199 378 1135 169 378 1136 29 379 1137 27 379 1138 177 379 1139 47 380 1140 45 380 1141 186 380 1142 63 381 1143 195 381 1144 196 381 1145 19 382 1146 173 382 1147 174 382 1148 39 383 1149 37 383 1150 182 383 1151 57 384 1152 55 384 1153 191 384 1154 11 385 1155 168 385 1156 170 385 1157 31 386 1158 29 386 1159 178 386 1160 49 387 1161 47 387 1162 187 387 1163 65 388 1164 196 388 1165 197 388 1166 21 389 1167 174 389 1168 175 389 1169 41 390 1170 39 390 1171 183 390 1172 57 391 1173 192 391 1174 193 391 1175
+
+
+
+
+
+
+ -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -1.029198 -1.021838 0.09228229 -13.07551 -0.9260871 0.05411165 -1.035489 -1.00146 0.2991693 -13.08123 -0.9075493 0.2423195 -1.041538 -0.9411104 0.4981057 -13.08673 -0.8526484 0.4232947 -1.047113 -0.8431079 0.6814466 -13.0918 -0.7634943 0.5900822 -1.052 -0.7112189 0.8421461 -13.09625 -0.6435131 0.7362728 -1.05601 -0.5505115 0.9740288 -13.0999 -0.4973154 0.8562483 -1.05899 -0.3671619 1.072026 -13.10261 -0.3305197 0.9453981 -1.060825 -0.1682159 1.132373 -13.10428 -0.1495358 1.000296 -1.061444 0.03868103 1.15275 -13.10484 0.03868103 1.018833 -1.060825 0.2455779 1.132373 -13.10428 0.2268979 1.000296 -1.05899 0.4445239 1.072026 -13.10261 0.4078818 0.9453981 -1.05601 0.6278736 0.9740288 -13.0999 0.5746775 0.8562483 -1.052 0.788581 0.8421461 -13.09625 0.7208752 0.7362728 -1.047113 0.92047 0.6814466 -13.0918 0.8408564 0.5900822 -1.041538 1.018472 0.4981057 -13.08673 0.9300105 0.4232947 -1.035489 1.078822 0.2991693 -13.08123 0.9849113 0.2423195 -1.029198 1.0992 0.09228229 -13.07551 1.003449 0.05411165 -1.022907 1.078822 -0.1146046 -13.06978 0.9849113 -0.1340961 -1.016858 1.018472 -0.313541 -13.06428 0.9300105 -0.3150712 -1.011282 0.92047 -0.4968819 -13.05921 0.8408564 -0.4818589 -1.006396 0.788581 -0.6575814 -13.05476 0.7208752 -0.6280494 -1.002386 0.6278736 -0.7894641 -13.05111 0.5746775 -0.7480249 -0.9994054 0.4445239 -0.8874619 -13.0484 0.4078818 -0.8371747 -0.9975705 0.2455779 -0.9478086 -13.04673 0.2268979 -0.8920729 -0.9969511 0.03868103 -0.9681852 -13.04617 0.03868103 -0.9106098 -0.9975705 -0.1682159 -0.9478086 -13.04673 -0.1495358 -0.8920729 -0.9994054 -0.3671619 -0.8874619 -13.0484 -0.3305197 -0.8371747 -1.002386 -0.5505115 -0.7894641 -13.05111 -0.4973154 -0.7480249 -1.006396 -0.7112189 -0.6575814 -13.05476 -0.6435131 -0.6280494 -1.011282 -0.8431079 -0.4968819 -13.05921 -0.7634943 -0.4818589 -1.016858 -0.9411104 -0.313541 -13.06428 -0.8526484 -0.3150712 -1.022907 -1.00146 -0.1146046 -13.06978 -0.9075493 -0.1340961 -11.32141 -1.021838 0.05966985 -11.3277 -1.00146 0.2665568 -11.33375 -0.9411104 0.4654932 -11.33932 -0.8431079 0.6488341 -11.34421 -0.7112189 0.8095336 -11.34822 -0.5505115 0.9414163 -11.3512 -0.3671619 1.039414 -11.35303 -0.1682159 1.099761 -11.35365 0.03868103 1.120137 -11.35303 0.2455779 1.099761 -11.3512 0.4445239 1.039414 -11.34822 0.6278736 0.9414163 -11.34421 0.788581 0.8095336 -11.33932 0.92047 0.6488341 -11.33375 1.018472 0.4654932 -11.3277 1.078822 0.2665568 -11.32141 1.0992 0.05966985 -11.31511 1.078822 -0.147217 -11.30907 1.018472 -0.3461534 -11.30349 0.92047 -0.5294944 -11.2986 0.788581 -0.6901939 -11.29459 0.6278736 -0.8220766 -11.29161 0.4445239 -0.9200744 -11.28978 0.2455779 -0.9804211 -11.28916 0.03868103 -1.000798 -11.28978 -0.1682159 -0.9804211 -11.29161 -0.3671619 -0.9200744 -11.29459 -0.5505115 -0.8220766 -11.2986 -0.7112189 -0.6901939 -11.30349 -0.8431079 -0.5294944 -11.30907 -0.9411104 -0.3461534 -11.31511 -1.00146 -0.147217 -13.2208 -1.165141 0.2931191 -13.21352 -1.188725 0.05367594 -11.18339 -1.188725 0.06010878 -13.2278 -1.095295 0.5233605 -13.23426 -0.9818704 0.7355521 -13.23991 -0.8292271 0.9215397 -13.24455 -0.6432306 1.074176 -13.248 -0.4310286 1.187595 -13.25012 -0.2007761 1.257437 -13.25084 0.03867846 1.281021 -13.25012 0.2781331 1.257437 -13.248 0.5083857 1.187595 -13.24455 0.7205875 1.074176 -13.23991 0.906584 0.9215397 -13.23426 1.059227 0.7355521 -13.2278 1.172652 0.5233605 -13.2208 1.242498 0.2931191 -13.21352 1.266082 0.05367594 -13.20624 1.242498 -0.185767 -13.19924 1.172652 -0.4160085 -13.19279 1.059227 -0.6282001 -13.18713 0.906584 -0.8141877 -13.18249 0.7205875 -0.9668237 -13.17904 0.5083857 -1.080242 -13.17692 0.2781331 -1.150085 -13.1762 0.03867846 -1.173668 -13.17692 -0.2007761 -1.150085 -13.17904 -0.4310286 -1.080242 -13.18249 -0.6432306 -0.9668237 -13.18713 -0.8292271 -0.8141877 -13.19279 -0.9818704 -0.6282001 -13.19924 -1.095295 -0.4160085 -13.20624 -1.165141 -0.185767 -11.19067 -1.165141 0.2995519 -11.19768 -1.095295 0.5297933 -11.20413 -0.9818704 0.7419849 -11.20978 -0.8292271 0.9279725 -11.21442 -0.6432306 1.080609 -11.21787 -0.4310286 1.194027 -11.22 -0.2007761 1.26387 -11.22071 0.03867846 1.287454 -11.22 0.2781331 1.26387 -11.21787 0.5083857 1.194027 -11.21442 0.7205875 1.080609 -11.20978 0.906584 0.9279725 -11.20413 1.059227 0.7419849 -11.19768 1.172652 0.5297933 -11.19067 1.242498 0.2995519 -11.18339 1.266082 0.06010878 -11.17611 1.242498 -0.1793342 -11.16911 1.172652 -0.4095757 -11.16266 1.059227 -0.6217674 -11.157 0.906584 -0.8077549 -11.15236 0.7205875 -0.9603909 -11.14891 0.5083857 -1.07381 -11.14679 0.2781331 -1.143653 -11.14607 0.03867846 -1.167236 -11.14679 -0.2007761 -1.143653 -11.14891 -0.4310286 -1.07381 -11.15236 -0.6432306 -0.9603909 -11.157 -0.8292271 -0.8077549 -11.16266 -0.9818704 -0.6217674 -11.16911 -1.095295 -0.4095757 -11.17611 -1.165141 -0.1793342 -12.37012 -0.9075493 0.2423195 -12.36439 -0.9260871 0.05411165 -12.37562 -0.8526484 0.4232947 -12.38069 -0.7634943 0.5900822 -12.38514 -0.6435131 0.7362728 -12.38878 -0.4973154 0.8562483 -12.39149 -0.3305197 0.9453981 -12.39316 -0.1495358 1.000296 -12.39373 0.03868103 1.018833 -12.39316 0.2268979 1.000296 -12.39149 0.4078818 0.9453981 -12.38878 0.5746775 0.8562483 -12.38514 0.7208752 0.7362728 -12.38069 0.8408564 0.5900822 -12.37562 0.9300105 0.4232947 -12.37012 0.9849113 0.2423195 -12.36439 1.003449 0.05411165 -12.35867 0.9849113 -0.1340961 -12.35317 0.9300105 -0.3150712 -12.34809 0.8408564 -0.4818589 -12.34365 0.7208752 -0.6280494 -12.34 0.5746775 -0.7480249 -12.33729 0.4078818 -0.8371747 -12.33562 0.2268979 -0.8920729 -12.33506 0.03868103 -0.9106098 -12.33562 -0.1495358 -0.8920729 -12.33729 -0.3305197 -0.8371747 -12.34 -0.4973154 -0.7480249 -12.34365 -0.6435131 -0.6280494 -12.34809 -0.7634943 -0.4818589 -12.35317 -0.8526484 -0.3150712 -12.35867 -0.9075493 -0.1340961
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0.8941683 -0.2222697 -0.3886633 -0.7594906 -0.4012401 -0.5120357 0.8828371 -0.4640426 0.07254731 -0.7724652 -0.6138536 0.1627306 0.8872783 0.4481748 -0.1089794 -0.7611508 -0.4898042 -0.4251367 0.8727791 0.04525226 0.4860131 -0.77473 -0.5671193 0.2795876 -0.7631157 -0.5600127 -0.3225528 -0.7767819 -0.4981881 0.3852513 0.8950523 -0.1369878 -0.4244005 -0.7653151 -0.6091054 -0.2080466 -0.7785387 -0.4096266 0.4754825 0.8850703 0.4650736 -0.01889383 -0.7676645 -0.6350692 -0.08589661 0.8727794 -0.04525202 0.4860126 -0.7799258 -0.3048331 0.5466191 -0.7808818 -0.1879143 0.5957447 0.8955017 -0.0462808 -0.4426452 -0.7813735 -0.06348055 0.6208267 0.8828312 0.4640527 0.07255399 0.8732033 -0.1340745 0.468551 -0.7813704 0.06348419 0.6208303 -0.7808813 0.1879113 0.5957465 0.8955028 0.04627645 -0.4426436 -0.7799205 0.3048373 0.5466244 0.8806509 0.4452611 0.1618527 0.8740326 -0.2179008 0.4342651 -0.7785317 0.4096328 0.4754884 0.885073 -0.4650686 -0.0188899 0 -0.8819118 0.4714145 -0.7767751 0.4981939 0.3852576 0.8950505 0.1369909 -0.4244032 -0.999538 0 -0.03039497 -3.10569e-4 0.9951851 0.0980128 -9.19771e-4 0.9569439 0.2902716 -0.001493632 0.8819297 0.4713785 -0.002010107 0.7730239 0.6343737 -0.002449333 0.6344096 0.7729933 -0.002794444 0.4714126 0.8819083 -0.003032147 0.2902965 0.956932 -0.003153324 0.0980212 0.9951794 -0.003153324 -0.0980212 0.9951794 -0.003032147 -0.2902965 0.956932 -0.002794444 -0.4714127 0.8819083 -0.002449333 -0.6344096 0.7729933 -0.002010107 -0.7730239 0.6343737 -0.001493632 -0.8819298 0.4713786 -9.1977e-4 -0.9569439 0.2902717 -3.10569e-4 -0.9951851 0.09801274 3.10569e-4 -0.9951851 -0.0980128 9.19771e-4 -0.9569439 -0.2902716 0.001493632 -0.8819298 -0.4713785 0.002010107 -0.7730239 -0.6343737 0.002449333 -0.6344096 -0.7729932 0.002794444 -0.4714125 -0.8819085 0.003032147 -0.2902963 -0.9569321 0.003153324 -0.0980212 -0.9951794 0.003153324 0.0980212 -0.9951794 0.003032147 0.2902963 -0.9569321 0.002794444 0.4714124 -0.8819085 0.002449333 0.6344096 -0.7729933 0.002010107 0.7730239 -0.6343737 0.001493632 0.8819298 -0.4713784 9.19771e-4 0.9569439 -0.2902716 3.10569e-4 0.9951851 -0.0980128 3.10569e-4 0.9951851 -0.09801256 9.19771e-4 0.9569439 -0.2902715 0.001493632 0.8819294 -0.4713791 0.002010107 0.7730241 -0.6343735 0.002449333 0.6344098 -0.772993 0.002794444 0.4714125 -0.8819084 0.003032147 0.2902956 -0.9569323 0.003153324 0.09802216 -0.9951792 0.003153324 -0.09802216 -0.9951792 0.003032147 -0.2902955 -0.9569323 0.002794444 -0.4714127 -0.8819083 0.002449333 -0.6344098 -0.772993 0.002010107 -0.7730239 -0.6343738 0.001493632 -0.8819299 -0.4713783 9.1977e-4 -0.9569439 -0.2902715 3.1057e-4 -0.9951851 -0.09801304 -3.10571e-4 -0.9951851 0.09801304 -9.19774e-4 -0.9569439 0.2902715 -0.001493632 -0.8819299 0.4713782 -0.002010107 -0.7730239 0.6343738 -0.002449333 -0.6344095 0.7729933 -0.002794444 -0.4714127 0.8819083 -0.003032147 -0.290296 0.9569321 -0.003153324 -0.0980212 0.9951793 -0.003153324 0.0980212 0.9951793 -0.003032147 0.290296 0.9569321 -0.002794444 0.4714125 0.8819084 -0.002449333 0.6344095 0.7729933 -0.002010107 0.7730241 0.6343735 -0.001493632 0.8819295 0.471379 -9.19774e-4 0.9569439 0.2902715 -3.10569e-4 0.9951851 0.09801256 -0.7700789 -0.6367371 0.03929841 -0.7581936 -0.297728 -0.5800868 0.8732012 0.1340731 0.4685552 -0.757301 -0.1831607 -0.6268552 0.8893725 0.4138886 -0.1941975 -0.7568462 -0.06181395 -0.6506634 0.8928914 -0.2987453 -0.336892 0.880655 -0.4452542 0.1618498 -0.7568458 0.06181484 -0.6506638 0.874032 0.2179043 0.4342647 -0.7572976 0.183161 -0.6268591 0.8912675 0.3634544 -0.2711885 -0.7581882 0.2977299 -0.5800927 0.8912702 -0.3634505 -0.2711846 0.8786135 -0.4095197 0.2456251 -0.7594863 0.4012453 -0.512038 0.8752397 0.2936017 0.3843871 -0.7611442 0.489811 -0.4251408 0.8928881 0.2987513 -0.3368952 -0.763107 0.5600218 -0.3225575 0.889375 -0.4138855 -0.1941931 -0.7653036 0.6091177 -0.2080531 0.8767886 -0.3582999 0.3207228 0.8767853 0.3583039 0.3207269 -0.767655 0.6350807 -0.08589726 0.8941677 0.2222674 -0.388666 -0.7700694 0.6367484 0.03930032 0.8872823 -0.4481672 -0.108978 0.875243 -0.2935997 0.3843812 -0.7724559 0.6138642 0.1627345 0.8786115 0.4095251 0.2456239 -0.7747213 0.5671287 0.2795924 0.9995381 0 0.03039199 0 0.6343747 0.7730258 0 0.6343749 -0.7730256 0 -0.8819119 -0.4714143 0 -0.0980122 0.9951852 0 0.9951843 -0.09802252 0 -0.2902718 -0.9569442 0 -0.7729956 0.6344113 0 0.7729956 0.6344113 0 0.471379 -0.8819307 0 -0.9569364 -0.2902974 0 0.0980122 0.9951852 0 0.9569364 -0.2902974 0 -0.4713791 -0.8819307 0 -0.6343747 0.7730258 0 0.8819118 0.4714145 0 0.2902718 -0.9569443 0 -0.9951843 0.09802216 0 -0.9951843 -0.09802216 0 0.2902721 0.9569442 0 0.8819119 -0.4714143 0 -0.6343749 -0.7730256 0 -0.4713791 0.8819307 0 0.9569365 0.2902973 0 0.0980125 -0.9951852 0 -0.9569365 0.2902973 0 0.471379 0.8819307 0 0.7729955 -0.6344115 0 -0.7729955 -0.6344115 0 -0.2902721 0.9569442 0 0.9951843 0.09802252 0 -0.0980125 -0.9951852 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0.8941695 -0.2222657 -0.3886629 -0.7594923 -0.4012407 -0.5120325 0.882835 -0.4640455 0.07255315 -0.7724655 -0.6138532 0.1627309 0.8872786 0.4481739 -0.1089801 -0.7611516 -0.4898043 -0.4251353 0.8727791 0.04525208 0.4860132 -0.7747301 -0.5671191 0.2795876 -0.7631152 -0.5600128 -0.3225535 -0.7767824 -0.4981871 0.3852515 0.8950516 -0.1369903 -0.4244012 -0.7653131 -0.6091068 -0.20805 -0.7785379 -0.409628 0.4754825 0.8850692 0.465076 -0.01889091 -0.7676648 -0.635069 -0.08589607 0.8727796 -0.0452522 0.4860125 -0.7799251 -0.3048346 0.5466194 -0.780884 -0.1879104 0.5957431 0.8955031 -0.04627633 -0.4426429 -0.7813713 -0.06348413 0.6208291 0.8828333 0.4640498 0.07254803 0.8732024 -0.1340726 0.4685533 -0.7813725 0.06348067 0.6208279 -0.7808791 0.1879153 0.5957481 0.8955014 0.04628086 -0.4426459 -0.7799214 0.3048357 0.5466241 0.8806513 0.4452608 0.1618518 0.8740338 -0.2179027 0.4342619 -0.7785325 0.4096314 0.4754884 0.8850741 -0.4650665 -0.01889276 0 -0.8819118 0.4714145 -0.7767744 0.4981952 0.3852573 0.8950512 0.1369885 -0.4244025 -0.999538 0 -0.03039342 -0.9995381 0 -0.03039342 -0.999538 0 -0.03039342 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.999538 1.22952e-7 -0.03039449 -0.9995381 0 -0.03039324 -0.9995378 4.06942e-6 -0.0304048 -0.9995383 0 -0.03038418 -0.9995381 0 -0.03039139 -0.9995379 -7.002e-7 -0.03039848 -0.999538 0 -0.03039336 -0.9995381 0 -0.03039437 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.9995381 0 -0.03039342 -0.999538 0 -0.03039342 -0.999538 0 -0.03039473 -0.999538 0 -0.03039342 -0.999538 1.22952e-7 -0.03039449 -0.9995381 0 -0.03039324 -0.9995378 4.07804e-6 -0.0304048 -0.9995383 0 -0.03038418 -0.9995381 0 -0.03039133 -0.9995379 -7.01981e-7 -0.03039848 -0.999538 0 -0.03039336 -0.9995381 0 -0.03039437 -0.999538 0 -0.03039473 -0.999538 0 -0.03039497 -3.10569e-4 0.995185 0.09801274 -9.19771e-4 0.9569439 0.2902717 -0.001493632 0.8819298 0.4713785 -0.002010107 0.7730239 0.6343737 -0.002449333 0.6344095 0.7729932 -0.002794444 0.4714126 0.8819083 -0.003032147 0.2902962 0.956932 -0.003153324 0.0980212 0.9951794 -0.003153324 -0.0980212 0.9951794 -0.003032147 -0.2902962 0.956932 -0.002794444 -0.4714126 0.8819083 -0.002449333 -0.6344095 0.7729932 -0.002010107 -0.7730239 0.6343737 -0.001493632 -0.8819298 0.4713785 -9.19771e-4 -0.9569439 0.2902717 -3.10569e-4 -0.995185 0.09801274 3.10569e-4 -0.995185 -0.09801274 9.1977e-4 -0.9569439 -0.2902716 0.001493632 -0.8819296 -0.4713786 0.002010107 -0.7730239 -0.6343737 0.002449333 -0.6344095 -0.7729932 0.002794444 -0.4714126 -0.8819083 0.003032147 -0.2902963 -0.9569321 0.003153324 -0.0980212 -0.9951794 0.003153324 0.0980212 -0.9951794 0.003032147 0.2902963 -0.9569321 0.002794444 0.4714126 -0.8819083 0.002449333 0.6344095 -0.7729932 0.002010107 0.7730239 -0.6343737 0.001493632 0.8819296 -0.4713786 9.1977e-4 0.9569439 -0.2902716 3.10569e-4 0.995185 -0.09801274 3.10568e-4 0.9951851 -0.09801256 9.1977e-4 0.9569439 -0.2902715 0.001493632 0.8819294 -0.4713791 0.002010107 0.7730241 -0.6343735 0.002449333 0.6344098 -0.772993 0.002794444 0.4714125 -0.8819084 0.003032147 0.2902956 -0.9569323 0.003153324 0.09802216 -0.9951792 0.003153324 -0.09802216 -0.9951792 0.003032147 -0.2902955 -0.9569323 0.002794444 -0.4714127 -0.8819083 0.002449333 -0.6344098 -0.772993 0.002010107 -0.7730239 -0.6343738 0.001493632 -0.8819299 -0.4713783 9.1977e-4 -0.9569439 -0.2902715 3.10569e-4 -0.9951851 -0.09801304 -3.1057e-4 -0.9951851 0.09801304 -9.19774e-4 -0.9569439 0.2902715 -0.001493632 -0.8819299 0.4713783 -0.002010107 -0.7730239 0.6343738 -0.002449333 -0.6344095 0.7729933 -0.002794444 -0.4714127 0.8819083 -0.003032147 -0.290296 0.9569321 -0.003153324 -0.09802114 0.9951793 -0.003153324 0.0980212 0.9951793 -0.003032147 0.290296 0.9569321 -0.002794444 0.4714125 0.8819084 -0.002449333 0.6344095 0.7729933 -0.002010107 0.7730241 0.6343735 -0.001493632 0.8819294 0.4713791 -9.19774e-4 0.9569439 0.2902715 -3.10568e-4 0.9951851 0.09801256 -0.7700791 -0.6367368 0.03929859 -0.7581927 -0.2977272 -0.5800882 0.8732022 0.1340751 0.4685529 -0.7573004 -0.1831601 -0.626856 0.8893718 0.4138911 -0.1941962 -0.7568467 -0.06181472 -0.6506627 0.8928905 -0.2987484 -0.3368916 0.8806548 -0.4452545 0.1618508 -0.7568453 0.06181406 -0.6506645 0.8740308 0.2179023 0.434268 -0.7572982 0.1831617 -0.6268582 0.8912673 0.3634549 -0.2711883 -0.758189 0.2977305 -0.5800914 0.8912703 -0.3634502 -0.2711848 0.8786148 -0.4095195 0.2456215 -0.7594844 0.4012446 -0.5120411 0.8752405 0.2936025 0.3843846 -0.7611435 0.489811 -0.425142 0.892889 0.2987483 -0.3368956 -0.7631069 0.5600219 -0.3225574 0.889376 -0.4138827 -0.1941947 -0.7653056 0.6091163 -0.2080496 0.8767883 -0.3582998 0.3207234 0.8767856 0.358304 0.3207261 -0.7676548 0.6350808 -0.08589744 0.8941666 0.2222713 -0.3886663 -0.7700691 0.6367489 0.03929984 0.887282 -0.448168 -0.1089772 0.8752421 -0.2935988 0.3843837 -0.7724557 0.6138646 0.1627342 0.8786101 0.4095254 0.2456281 -0.7747215 0.5671283 0.2795926 0.9995381 0 0.03039175 0.9995381 0 0.03038871 0.9995378 0 0.03039884 0.9995381 0 0.03039175 0.999538 0 0.03039371 0.9995379 0 0.03039848 0.999538 0 0.03039371 0.9995381 0 0.0303905 0.999538 -6.83533e-7 0.03039747 0.9995383 0 0.03038638 0.9995374 -2.77787e-6 0.03041458 0.9995391 8.22688e-6 0.03035926 0.9995379 0 0.03039872 0.9995381 9.20489e-7 0.03038936 0.9995378 0 0.03039848 0.9995381 0 0.03039175 0.9995379 0 0.03039884 0.9995382 0 0.03038877 0.9995381 0 0.03039175 0.9995378 0 0.03039944 0.9995381 0 0.03039199 0.9995379 0 0.03039944 0.9995381 0 0.0303905 0.999538 -6.82176e-7 0.03039747 0.9995383 0 0.03038632 0.9995381 -2.51798e-7 0.03038889 0.9995383 7.46237e-7 0.03038388 0.9995379 0 0.03039872 0.9995381 9.18663e-7 0.03038942 0 0.6343747 0.7730258 0 0.6343749 -0.7730256 0 -0.8819119 -0.4714143 0 -0.0980122 0.9951852 0 0.9951843 -0.09802252 0 -0.2902718 -0.9569442 0 -0.7729956 0.6344113 0 0.7729956 0.6344113 0 0.4713791 -0.8819307 0 -0.9569364 -0.2902974 0 0.0980122 0.9951852 0 0.9569364 -0.2902974 0 -0.4713791 -0.8819307 0 -0.6343747 0.7730258 0 0.8819118 0.4714145 0 0.2902718 -0.9569442 0 -0.9951843 0.09802216 0 -0.9951843 -0.09802216 0 0.2902721 0.9569442 0 0.8819119 -0.4714143 0 -0.6343749 -0.7730256 0 -0.4713791 0.8819307 0 0.9569365 0.2902973 0 0.0980125 -0.9951852 0 -0.9569365 0.2902973 0 0.4713791 0.8819307 0 0.7729955 -0.6344115 0 -0.7729955 -0.6344115 0 -0.2902721 0.9569442 0 0.9951843 0.09802252 0 -0.0980125 -0.9951852
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.05044728 0.3833369 0.02826887 0.341844 0.02826887 0.341844 0.15625 0.8988949 0.125 0.8988949 0.125 0.8988949 0.2968217 0.4853885 0.25 0.49 0.25 0.49 0.96875 0.8988949 0.9375 0.8988949 0.9375 0.8988949 0.2031783 0.01461154 0.1581559 0.02826887 0.2031783 0.01461154 0.125 0.8988949 0.09375 0.8988949 0.09375 0.8988949 0.49 0.25 0.4853885 0.2031783 0.49 0.25 0.9375 0.8988949 0.90625 0.8988949 0.90625 0.8988949 0.09375 0.8988949 0.0625 0.8988949 0.0625 0.8988949 0.90625 0.8988949 0.875 0.8988949 0.875 0.8988949 0.02826887 0.341844 0.01461154 0.2968217 0.01461154 0.2968217 0.0625 0.8988949 0.03125 0.8988949 0.03125 0.8988949 0.875 0.8988949 0.84375 0.8988949 0.84375 0.8988949 0.25 0.00999999 0.2031783 0.01461154 0.25 0.00999999 0.03125 0.8988949 0 0.8988949 0 0.8988949 0.49 0.25 0.4853885 0.2968217 0.4853885 0.2968217 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.78125 0.8988949 0.78125 0.8988949 0.01461154 0.2968217 0.00999999 0.25 0.00999999 0.25 0.78125 0.8988949 0.75 0.8988949 0.75 0.8988949 0.2968217 0.01461154 0.25 0.00999999 0.2968217 0.01461154 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.71875 0.8988949 0.75 0.8988949 0.71875 0.8988949 0.6875 0.8988949 0.71875 0.8988949 0.6875 0.8988949 0.01461154 0.2031783 0.00999999 0.25 0.01461154 0.2031783 0.65625 0.8988949 0.6875 0.8988949 0.65625 0.8988949 0.341844 0.02826887 0.2968217 0.01461154 0.341844 0.02826887 0.4717311 0.341844 0.4495527 0.3833369 0.4495527 0.3833369 0.625 0.8988949 0.65625 0.8988949 0.625 0.8988949 0.25 0.49 0.2031783 0.4853885 0.2031783 0.4853885 0.341844 0.4717311 0.3833369 0.4495527 0.3833369 0.4495527 0.59375 0.8988949 0.625 0.8988949 0.59375 0.8988949 0.02826887 0.1581559 0.01461154 0.2031783 0.02826887 0.1581559 0.5504473 0.1166631 0.5146116 0.2031783 0.5504473 0.3833369 0.03125 0.8988949 0 0.5 0.03125 0.5 0.0625 0.8988949 0.03125 0.5 0.0625 0.5 0.09375 0.8988949 0.0625 0.5 0.09375 0.5 0.125 0.8988949 0.09375 0.5 0.125 0.5 0.15625 0.8988949 0.125 0.5 0.15625 0.5 0.1875 0.8988949 0.15625 0.5 0.1875 0.5 0.21875 0.8988949 0.1875 0.5 0.21875 0.5 0.25 0.8988949 0.21875 0.5 0.25 0.5 0.28125 0.5 0.25 0.8988949 0.25 0.5 0.3125 0.5 0.28125 0.8988949 0.28125 0.5 0.34375 0.5 0.3125 0.8988949 0.3125 0.5 0.375 0.5 0.34375 0.8988949 0.34375 0.5 0.40625 0.5 0.375 0.8988949 0.375 0.5 0.4375 0.5 0.40625 0.8988949 0.40625 0.5 0.46875 0.5 0.4375 0.8988949 0.4375 0.5 0.5 0.5 0.46875 0.8988949 0.46875 0.5 0.53125 0.5 0.5 0.8988949 0.5 0.5 0.5625 0.5 0.53125 0.8988949 0.53125 0.5 0.59375 0.5 0.5625 0.8988949 0.5625 0.5 0.625 0.5 0.59375 0.8988949 0.59375 0.5 0.65625 0.5 0.625 0.8988949 0.625 0.5 0.6875 0.5 0.65625 0.8988949 0.65625 0.5 0.71875 0.5 0.6875 0.8988949 0.6875 0.5 0.75 0.5 0.71875 0.8988949 0.71875 0.5 0.78125 0.8988949 0.75 0.5 0.78125 0.5 0.8125 0.8988949 0.78125 0.5 0.8125 0.5 0.84375 0.8988949 0.8125 0.5 0.84375 0.5 0.875 0.8988949 0.84375 0.5 0.875 0.5 0.90625 0.8988949 0.875 0.5 0.90625 0.5 0.9375 0.8988949 0.90625 0.5 0.9375 0.5 0.96875 0.8988949 0.9375 0.5 0.96875 0.5 1 0.8988949 0.96875 0.5 1 0.5 1 1 0.96875 0.8988949 1 0.8988949 0.96875 1 0.9375 0.8988949 0.96875 0.8988949 0.9375 1 0.90625 0.8988949 0.9375 0.8988949 0.90625 1 0.875 0.8988949 0.90625 0.8988949 0.875 1 0.84375 0.8988949 0.875 0.8988949 0.84375 1 0.8125 0.8988949 0.84375 0.8988949 0.8125 1 0.78125 0.8988949 0.8125 0.8988949 0.78125 1 0.75 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.71875 1 0.71875 0.8988949 0.71875 0.8988949 0.6875 1 0.6875 0.8988949 0.6875 0.8988949 0.65625 1 0.65625 0.8988949 0.65625 0.8988949 0.625 1 0.625 0.8988949 0.625 0.8988949 0.59375 1 0.59375 0.8988949 0.59375 0.8988949 0.5625 1 0.5625 0.8988949 0.5625 0.8988949 0.53125 1 0.53125 0.8988949 0.53125 0.8988949 0.5 1 0.5 0.8988949 0.5 0.8988949 0.46875 1 0.46875 0.8988949 0.46875 0.8988949 0.4375 1 0.4375 0.8988949 0.4375 0.8988949 0.40625 1 0.40625 0.8988949 0.40625 0.8988949 0.375 1 0.375 0.8988949 0.375 0.8988949 0.34375 1 0.34375 0.8988949 0.34375 0.8988949 0.3125 1 0.3125 0.8988949 0.3125 0.8988949 0.28125 1 0.28125 0.8988949 0.28125 0.8988949 0.25 1 0.25 0.8988949 0.25 1 0.21875 0.8988949 0.25 0.8988949 0.21875 1 0.1875 0.8988949 0.21875 0.8988949 0.1875 1 0.15625 0.8988949 0.1875 0.8988949 0.15625 1 0.125 0.8988949 0.15625 0.8988949 0.125 1 0.09375 0.8988949 0.125 0.8988949 0.09375 1 0.0625 0.8988949 0.09375 0.8988949 0.0625 1 0.03125 0.8988949 0.0625 0.8988949 0.03125 1 0 0.8988949 0.03125 0.8988949 1 0.8988949 0.96875 0.8988949 0.96875 0.8988949 0.1875 0.8988949 0.15625 0.8988949 0.15625 0.8988949 0.4853885 0.2031783 0.4717311 0.1581559 0.4853885 0.2031783 0.21875 0.8988949 0.1875 0.8988949 0.1875 0.8988949 0.1581559 0.02826887 0.1166631 0.05044728 0.1581559 0.02826887 0.25 0.8988949 0.21875 0.8988949 0.21875 0.8988949 0.08029437 0.4197056 0.05044728 0.3833369 0.05044728 0.3833369 0.341844 0.4717311 0.2968217 0.4853885 0.2968217 0.4853885 0.25 0.8988949 0.28125 0.8988949 0.25 0.8988949 0.4717311 0.1581559 0.4495527 0.1166631 0.4717311 0.1581559 0.28125 0.8988949 0.3125 0.8988949 0.28125 0.8988949 0.1166631 0.05044728 0.08029437 0.08029437 0.1166631 0.05044728 0.3125 0.8988949 0.34375 0.8988949 0.3125 0.8988949 0.1166631 0.4495527 0.08029437 0.4197056 0.08029437 0.4197056 0.3833369 0.4495527 0.341844 0.4717311 0.341844 0.4717311 0.34375 0.8988949 0.375 0.8988949 0.34375 0.8988949 0.4495527 0.1166631 0.4197056 0.08029437 0.4495527 0.1166631 0.375 0.8988949 0.40625 0.8988949 0.375 0.8988949 0.08029437 0.08029437 0.05044728 0.1166631 0.08029437 0.08029437 0.40625 0.8988949 0.4375 0.8988949 0.40625 0.8988949 0.1581559 0.4717311 0.1166631 0.4495527 0.1166631 0.4495527 0.4375 0.8988949 0.46875 0.8988949 0.4375 0.8988949 0.4197056 0.4197056 0.3833369 0.4495527 0.3833369 0.4495527 0.4197056 0.08029437 0.3833369 0.05044728 0.4197056 0.08029437 0.46875 0.8988949 0.5 0.8988949 0.46875 0.8988949 0.05044728 0.1166631 0.02826887 0.1581559 0.05044728 0.1166631 0.5 0.8988949 0.53125 0.8988949 0.5 0.8988949 0.2031783 0.4853885 0.1581559 0.4717311 0.1581559 0.4717311 0.4495527 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.53125 0.8988949 0.5625 0.8988949 0.53125 0.8988949 0.3833369 0.05044728 0.341844 0.02826887 0.3833369 0.05044728 0.5625 0.8988949 0.59375 0.8988949 0.5625 0.8988949 0.4197056 0.4197056 0.3833369 0.4495527 0.4197056 0.08029437 0.4197056 0.08029437 0.4495527 0.1166631 0.4197056 0.08029437 0.05044728 0.1166631 0.08029437 0.08029437 0.05044728 0.1166631 0.1166631 0.4495527 0.1581559 0.4717311 0.1581559 0.4717311 0.4853885 0.2968217 0.49 0.25 0.49 0.25 0.2031783 0.01461154 0.25 0.00999999 0.2031783 0.01461154 0.01461154 0.2968217 0.02826887 0.341844 0.02826887 0.341844 0.3833369 0.4495527 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.05044728 0.4197056 0.08029437 0.3833369 0.05044728 0.02826887 0.1581559 0.05044728 0.1166631 0.02826887 0.1581559 0.1581559 0.4717311 0.2031783 0.4853885 0.2031783 0.4853885 0.4853885 0.2031783 0.49 0.25 0.4853885 0.2031783 0.1581559 0.02826887 0.2031783 0.01461154 0.1581559 0.02826887 0.02826887 0.341844 0.05044728 0.3833369 0.05044728 0.3833369 0.4197056 0.4197056 0.4495527 0.3833369 0.4495527 0.3833369 0.341844 0.02826887 0.3833369 0.05044728 0.341844 0.02826887 0.01461154 0.2031783 0.02826887 0.1581559 0.01461154 0.2031783 0.25 0.49 0.2968217 0.4853885 0.2968217 0.4853885 0.2031783 0.4853885 0.25 0.49 0.25 0.49 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.1581559 0.1166631 0.05044728 0.1581559 0.02826887 0.1166631 0.05044728 0.05044728 0.3833369 0.08029437 0.4197056 0.08029437 0.4197056 0.4495527 0.3833369 0.4717311 0.341844 0.4717311 0.341844 0.2968217 0.01461154 0.341844 0.02826887 0.2968217 0.01461154 0.00999999 0.25 0.01461154 0.2031783 0.00999999 0.25 0.2968217 0.4853885 0.341844 0.4717311 0.341844 0.4717311 0.4495527 0.1166631 0.4717311 0.1581559 0.4495527 0.1166631 0.08029437 0.08029437 0.1166631 0.05044728 0.08029437 0.08029437 0.08029437 0.4197056 0.1166631 0.4495527 0.1166631 0.4495527 0.4717311 0.341844 0.4853885 0.2968217 0.4853885 0.2968217 0.25 0.00999999 0.2968217 0.01461154 0.25 0.00999999 0.00999999 0.25 0.01461154 0.2968217 0.01461154 0.2968217 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 0.05044728 0.3833369 0.05044728 0.3833369 0.02826887 0.341844 0.15625 0.8988949 0.15625 0.8988949 0.125 0.8988949 0.2968217 0.4853885 0.2968217 0.4853885 0.25 0.49 0.96875 0.8988949 0.96875 0.8988949 0.9375 0.8988949 0.2031783 0.01461154 0.1581559 0.02826887 0.1581559 0.02826887 0.125 0.8988949 0.125 0.8988949 0.09375 0.8988949 0.49 0.25 0.4853885 0.2031783 0.4853885 0.2031783 0.9375 0.8988949 0.9375 0.8988949 0.90625 0.8988949 0.09375 0.8988949 0.09375 0.8988949 0.0625 0.8988949 0.90625 0.8988949 0.90625 0.8988949 0.875 0.8988949 0.02826887 0.341844 0.02826887 0.341844 0.01461154 0.2968217 0.0625 0.8988949 0.0625 0.8988949 0.03125 0.8988949 0.875 0.8988949 0.875 0.8988949 0.84375 0.8988949 0.25 0.00999999 0.2031783 0.01461154 0.2031783 0.01461154 0.03125 0.8988949 0.03125 0.8988949 0 0.8988949 0.49 0.25 0.49 0.25 0.4853885 0.2968217 0.84375 0.8988949 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.8125 0.8988949 0.78125 0.8988949 0.01461154 0.2968217 0.01461154 0.2968217 0.00999999 0.25 0.78125 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.2968217 0.01461154 0.25 0.00999999 0.25 0.00999999 0.4853885 0.2968217 0.4853885 0.2968217 0.4717311 0.341844 0.71875 0.8988949 0.75 0.8988949 0.75 0.8988949 0.6875 0.8988949 0.71875 0.8988949 0.71875 0.8988949 0.01461154 0.2031783 0.00999999 0.25 0.00999999 0.25 0.65625 0.8988949 0.6875 0.8988949 0.6875 0.8988949 0.341844 0.02826887 0.2968217 0.01461154 0.2968217 0.01461154 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.625 0.8988949 0.65625 0.8988949 0.65625 0.8988949 0.25 0.49 0.25 0.49 0.2031783 0.4853885 0.341844 0.4717311 0.341844 0.4717311 0.3833369 0.4495527 0.59375 0.8988949 0.625 0.8988949 0.625 0.8988949 0.02826887 0.1581559 0.01461154 0.2031783 0.01461154 0.2031783 0.7031784 0.4853885 0.75 0.49 0.75 0.00999999 0.75 0.49 0.7968217 0.4853885 0.7968217 0.01461154 0.7968217 0.4853885 0.841844 0.4717311 0.7968217 0.01461154 0.841844 0.4717311 0.8833369 0.4495527 0.841844 0.02826887 0.7968217 0.01461154 0.841844 0.4717311 0.841844 0.02826887 0.8833369 0.4495527 0.9197056 0.4197056 0.9495527 0.1166631 0.9197056 0.4197056 0.9495527 0.3833369 0.9495527 0.1166631 0.9495527 0.3833369 0.9717311 0.341844 0.9853885 0.2968217 0.9853885 0.2968217 0.99 0.25 0.9853885 0.2031783 0.9853885 0.2031783 0.9717311 0.1581559 0.9853885 0.2968217 0.9717311 0.1581559 0.9495527 0.1166631 0.9853885 0.2968217 0.9495527 0.1166631 0.9197056 0.08029437 0.8833369 0.4495527 0.9197056 0.08029437 0.8833369 0.05044728 0.8833369 0.4495527 0.8833369 0.05044728 0.841844 0.02826887 0.8833369 0.4495527 0.7968217 0.01461154 0.75 0.00999999 0.75 0.49 0.75 0.00999999 0.7031784 0.01461154 0.7031784 0.4853885 0.7031784 0.01461154 0.658156 0.02826887 0.7031784 0.4853885 0.658156 0.02826887 0.6166632 0.05044728 0.658156 0.4717311 0.7031784 0.4853885 0.658156 0.02826887 0.658156 0.4717311 0.6166632 0.05044728 0.5802944 0.08029437 0.5504473 0.3833369 0.5802944 0.08029437 0.5504473 0.1166631 0.5504473 0.3833369 0.5504473 0.1166631 0.5282689 0.1581559 0.5146116 0.2031783 0.5146116 0.2031783 0.51 0.25 0.5146116 0.2968217 0.5146116 0.2968217 0.5282689 0.341844 0.5146116 0.2031783 0.5282689 0.341844 0.5504473 0.3833369 0.5146116 0.2031783 0.5504473 0.3833369 0.5802944 0.4197056 0.6166632 0.05044728 0.5802944 0.4197056 0.6166632 0.4495527 0.6166632 0.05044728 0.6166632 0.4495527 0.658156 0.4717311 0.6166632 0.05044728 0.9495527 0.3833369 0.9853885 0.2968217 0.9495527 0.1166631 0.03125 0.8988949 0 0.8988949 0 0.5 0.0625 0.8988949 0.03125 0.8988949 0.03125 0.5 0.09375 0.8988949 0.0625 0.8988949 0.0625 0.5 0.125 0.8988949 0.09375 0.8988949 0.09375 0.5 0.15625 0.8988949 0.125 0.8988949 0.125 0.5 0.1875 0.8988949 0.15625 0.8988949 0.15625 0.5 0.21875 0.8988949 0.1875 0.8988949 0.1875 0.5 0.25 0.8988949 0.21875 0.8988949 0.21875 0.5 0.28125 0.5 0.28125 0.8988949 0.25 0.8988949 0.3125 0.5 0.3125 0.8988949 0.28125 0.8988949 0.34375 0.5 0.34375 0.8988949 0.3125 0.8988949 0.375 0.5 0.375 0.8988949 0.34375 0.8988949 0.40625 0.5 0.40625 0.8988949 0.375 0.8988949 0.4375 0.5 0.4375 0.8988949 0.40625 0.8988949 0.46875 0.5 0.46875 0.8988949 0.4375 0.8988949 0.5 0.5 0.5 0.8988949 0.46875 0.8988949 0.53125 0.5 0.53125 0.8988949 0.5 0.8988949 0.5625 0.5 0.5625 0.8988949 0.53125 0.8988949 0.59375 0.5 0.59375 0.8988949 0.5625 0.8988949 0.625 0.5 0.625 0.8988949 0.59375 0.8988949 0.65625 0.5 0.65625 0.8988949 0.625 0.8988949 0.6875 0.5 0.6875 0.8988949 0.65625 0.8988949 0.71875 0.5 0.71875 0.8988949 0.6875 0.8988949 0.75 0.5 0.75 0.8988949 0.71875 0.8988949 0.78125 0.8988949 0.75 0.8988949 0.75 0.5 0.8125 0.8988949 0.78125 0.8988949 0.78125 0.5 0.84375 0.8988949 0.8125 0.8988949 0.8125 0.5 0.875 0.8988949 0.84375 0.8988949 0.84375 0.5 0.90625 0.8988949 0.875 0.8988949 0.875 0.5 0.9375 0.8988949 0.90625 0.8988949 0.90625 0.5 0.96875 0.8988949 0.9375 0.8988949 0.9375 0.5 1 0.8988949 0.96875 0.8988949 0.96875 0.5 1 1 0.96875 1 0.96875 0.8988949 0.96875 1 0.9375 1 0.9375 0.8988949 0.9375 1 0.90625 1 0.90625 0.8988949 0.90625 1 0.875 1 0.875 0.8988949 0.875 1 0.84375 1 0.84375 0.8988949 0.84375 1 0.8125 1 0.8125 0.8988949 0.8125 1 0.78125 1 0.78125 0.8988949 0.78125 1 0.75 1 0.75 0.8988949 0.75 0.8988949 0.75 1 0.71875 1 0.71875 0.8988949 0.71875 1 0.6875 1 0.6875 0.8988949 0.6875 1 0.65625 1 0.65625 0.8988949 0.65625 1 0.625 1 0.625 0.8988949 0.625 1 0.59375 1 0.59375 0.8988949 0.59375 1 0.5625 1 0.5625 0.8988949 0.5625 1 0.53125 1 0.53125 0.8988949 0.53125 1 0.5 1 0.5 0.8988949 0.5 1 0.46875 1 0.46875 0.8988949 0.46875 1 0.4375 1 0.4375 0.8988949 0.4375 1 0.40625 1 0.40625 0.8988949 0.40625 1 0.375 1 0.375 0.8988949 0.375 1 0.34375 1 0.34375 0.8988949 0.34375 1 0.3125 1 0.3125 0.8988949 0.3125 1 0.28125 1 0.28125 0.8988949 0.28125 1 0.25 1 0.25 1 0.21875 1 0.21875 0.8988949 0.21875 1 0.1875 1 0.1875 0.8988949 0.1875 1 0.15625 1 0.15625 0.8988949 0.15625 1 0.125 1 0.125 0.8988949 0.125 1 0.09375 1 0.09375 0.8988949 0.09375 1 0.0625 1 0.0625 0.8988949 0.0625 1 0.03125 1 0.03125 0.8988949 0.03125 1 0 1 0 0.8988949 1 0.8988949 1 0.8988949 0.96875 0.8988949 0.1875 0.8988949 0.1875 0.8988949 0.15625 0.8988949 0.4853885 0.2031783 0.4717311 0.1581559 0.4717311 0.1581559 0.21875 0.8988949 0.21875 0.8988949 0.1875 0.8988949 0.1581559 0.02826887 0.1166631 0.05044728 0.1166631 0.05044728 0.25 0.8988949 0.25 0.8988949 0.21875 0.8988949 0.08029437 0.4197056 0.08029437 0.4197056 0.05044728 0.3833369 0.341844 0.4717311 0.341844 0.4717311 0.2968217 0.4853885 0.25 0.8988949 0.28125 0.8988949 0.28125 0.8988949 0.4717311 0.1581559 0.4495527 0.1166631 0.4495527 0.1166631 0.28125 0.8988949 0.3125 0.8988949 0.3125 0.8988949 0.1166631 0.05044728 0.08029437 0.08029437 0.08029437 0.08029437 0.3125 0.8988949 0.34375 0.8988949 0.34375 0.8988949 0.1166631 0.4495527 0.1166631 0.4495527 0.08029437 0.4197056 0.3833369 0.4495527 0.3833369 0.4495527 0.341844 0.4717311 0.34375 0.8988949 0.375 0.8988949 0.375 0.8988949 0.4495527 0.1166631 0.4197056 0.08029437 0.4197056 0.08029437 0.375 0.8988949 0.40625 0.8988949 0.40625 0.8988949 0.08029437 0.08029437 0.05044728 0.1166631 0.05044728 0.1166631 0.40625 0.8988949 0.4375 0.8988949 0.4375 0.8988949 0.1581559 0.4717311 0.1581559 0.4717311 0.1166631 0.4495527 0.4375 0.8988949 0.46875 0.8988949 0.46875 0.8988949 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.4495527 0.4197056 0.08029437 0.3833369 0.05044728 0.3833369 0.05044728 0.46875 0.8988949 0.5 0.8988949 0.5 0.8988949 0.05044728 0.1166631 0.02826887 0.1581559 0.02826887 0.1581559 0.5 0.8988949 0.53125 0.8988949 0.53125 0.8988949 0.2031783 0.4853885 0.2031783 0.4853885 0.1581559 0.4717311 0.4495527 0.3833369 0.4495527 0.3833369 0.4197056 0.4197056 0.53125 0.8988949 0.5625 0.8988949 0.5625 0.8988949 0.3833369 0.05044728 0.341844 0.02826887 0.341844 0.02826887 0.5625 0.8988949 0.59375 0.8988949 0.59375 0.8988949 0.341844 0.4717311 0.2968217 0.4853885 0.2968217 0.01461154 0.2968217 0.4853885 0.25 0.49 0.25 0.00999999 0.25 0.49 0.2031783 0.4853885 0.2031783 0.01461154 0.2031783 0.4853885 0.1581559 0.4717311 0.1581559 0.02826887 0.1581559 0.4717311 0.1166631 0.4495527 0.1581559 0.02826887 0.1166631 0.4495527 0.08029437 0.4197056 0.1166631 0.05044728 0.1581559 0.02826887 0.1166631 0.4495527 0.1166631 0.05044728 0.08029437 0.4197056 0.05044728 0.3833369 0.08029437 0.08029437 0.05044728 0.3833369 0.02826887 0.341844 0.08029437 0.08029437 0.02826887 0.341844 0.01461154 0.2968217 0.02826887 0.1581559 0.01461154 0.2968217 0.00999999 0.25 0.02826887 0.1581559 0.00999999 0.25 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.1581559 0.05044728 0.1166631 0.02826887 0.341844 0.05044728 0.1166631 0.08029437 0.08029437 0.02826887 0.341844 0.08029437 0.08029437 0.1166631 0.05044728 0.08029437 0.4197056 0.1581559 0.02826887 0.2031783 0.01461154 0.2031783 0.4853885 0.2031783 0.01461154 0.25 0.00999999 0.25 0.49 0.25 0.00999999 0.2968217 0.01461154 0.2968217 0.4853885 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.4717311 0.341844 0.02826887 0.3833369 0.05044728 0.341844 0.4717311 0.3833369 0.05044728 0.4197056 0.08029437 0.3833369 0.4495527 0.341844 0.4717311 0.3833369 0.05044728 0.3833369 0.4495527 0.4197056 0.08029437 0.4495527 0.1166631 0.4197056 0.4197056 0.4495527 0.1166631 0.4717311 0.1581559 0.4197056 0.4197056 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.341844 0.4853885 0.2031783 0.49 0.25 0.4717311 0.341844 0.49 0.25 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.4717311 0.1581559 0.4495527 0.3833369 0.4197056 0.4197056 0.4717311 0.1581559 0.4197056 0.08029437 0.4495527 0.1166631 0.4495527 0.1166631 0.05044728 0.1166631 0.08029437 0.08029437 0.08029437 0.08029437 0.1166631 0.4495527 0.1166631 0.4495527 0.1581559 0.4717311 0.4853885 0.2968217 0.4853885 0.2968217 0.49 0.25 0.2031783 0.01461154 0.25 0.00999999 0.25 0.00999999 0.01461154 0.2968217 0.01461154 0.2968217 0.02826887 0.341844 0.3833369 0.4495527 0.3833369 0.4495527 0.4197056 0.4197056 0.3833369 0.05044728 0.4197056 0.08029437 0.4197056 0.08029437 0.02826887 0.1581559 0.05044728 0.1166631 0.05044728 0.1166631 0.1581559 0.4717311 0.1581559 0.4717311 0.2031783 0.4853885 0.4853885 0.2031783 0.49 0.25 0.49 0.25 0.1581559 0.02826887 0.2031783 0.01461154 0.2031783 0.01461154 0.02826887 0.341844 0.02826887 0.341844 0.05044728 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.4495527 0.3833369 0.341844 0.02826887 0.3833369 0.05044728 0.3833369 0.05044728 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.1581559 0.25 0.49 0.25 0.49 0.2968217 0.4853885 0.2031783 0.4853885 0.2031783 0.4853885 0.25 0.49 0.4717311 0.1581559 0.4853885 0.2031783 0.4853885 0.2031783 0.1166631 0.05044728 0.1581559 0.02826887 0.1581559 0.02826887 0.05044728 0.3833369 0.05044728 0.3833369 0.08029437 0.4197056 0.4495527 0.3833369 0.4495527 0.3833369 0.4717311 0.341844 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.02826887 0.00999999 0.25 0.01461154 0.2031783 0.01461154 0.2031783 0.2968217 0.4853885 0.2968217 0.4853885 0.341844 0.4717311 0.4495527 0.1166631 0.4717311 0.1581559 0.4717311 0.1581559 0.08029437 0.08029437 0.1166631 0.05044728 0.1166631 0.05044728 0.08029437 0.4197056 0.08029437 0.4197056 0.1166631 0.4495527 0.4717311 0.341844 0.4717311 0.341844 0.4853885 0.2968217 0.25 0.00999999 0.2968217 0.01461154 0.2968217 0.01461154 0.00999999 0.25 0.00999999 0.25 0.01461154 0.2968217
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 99 7 21 164 7 22 100 7 23 73 9 27 138 9 28 74 9 29 100 11 33 165 11 34 101 11 35 74 13 39 139 13 40 75 13 41 101 14 42 166 14 43 102 14 44 75 15 45 140 15 46 76 15 47 102 17 51 167 17 52 103 17 53 76 18 54 141 18 55 77 18 56 103 20 60 106 20 61 72 20 62 77 22 66 142 22 67 78 22 68 78 23 69 143 23 70 79 23 71 79 25 75 144 25 76 80 25 77 81 28 84 144 28 85 145 28 86 82 29 87 145 29 88 146 29 89 83 31 93 146 31 94 147 31 95 84 34 102 147 34 103 148 34 104 85 37 111 148 37 112 149 37 113 50 39 117 54 39 118 62 39 119 103 40 120 8 40 121 70 40 122 102 41 123 70 41 124 68 41 125 101 42 126 68 42 127 66 42 128 100 43 129 66 43 130 64 43 131 99 44 132 64 44 133 62 44 134 98 45 135 62 45 136 60 45 137 97 46 138 60 46 139 58 46 140 96 47 141 58 47 142 56 47 143 54 48 144 96 48 145 56 48 146 52 49 147 95 49 148 54 49 149 50 50 150 94 50 151 52 50 152 48 51 153 93 51 154 50 51 155 46 52 156 92 52 157 48 52 158 44 53 159 91 53 160 46 53 161 42 54 162 90 54 163 44 54 164 40 55 165 89 55 166 42 55 167 38 56 168 88 56 169 40 56 170 36 57 171 87 57 172 38 57 173 34 58 174 86 58 175 36 58 176 32 59 177 85 59 178 34 59 179 30 60 180 84 60 181 32 60 182 28 61 183 83 61 184 30 61 185 26 62 186 82 62 187 28 62 188 24 63 189 81 63 190 26 63 191 79 64 192 24 64 193 22 64 194 78 65 195 22 65 196 20 65 197 77 66 198 20 66 199 18 66 200 76 67 201 18 67 202 16 67 203 75 68 204 16 68 205 14 68 206 74 69 207 14 69 208 12 69 209 73 70 210 12 70 211 10 70 212 72 71 213 10 71 214 8 71 215 105 72 216 137 72 217 106 72 218 104 73 219 138 73 220 137 73 221 107 74 222 139 74 223 138 74 224 108 75 225 140 75 226 139 75 227 109 76 228 141 76 229 140 76 230 110 77 231 142 77 232 141 77 233 111 78 234 143 78 235 142 78 236 112 79 237 144 79 238 143 79 239 144 80 240 114 80 241 145 80 242 145 81 243 115 81 244 146 81 245 146 82 246 116 82 247 147 82 248 147 83 249 117 83 250 148 83 251 148 84 252 118 84 253 149 84 254 149 85 255 119 85 256 150 85 257 150 86 258 120 86 259 151 86 260 151 87 261 121 87 262 152 87 263 152 88 264 122 88 265 153 88 266 153 89 267 123 89 268 154 89 269 154 90 270 124 90 271 155 90 272 155 91 273 125 91 274 156 91 275 156 92 276 126 92 277 157 92 278 157 93 279 127 93 280 158 93 281 158 94 282 128 94 283 159 94 284 159 95 285 129 95 286 160 95 287 129 96 288 161 96 289 160 96 290 130 97 291 162 97 292 161 97 293 131 98 294 163 98 295 162 98 296 132 99 297 164 99 298 163 99 299 133 100 300 165 100 301 164 100 302 134 101 303 166 101 304 165 101 305 135 102 306 167 102 307 166 102 308 136 103 309 106 103 310 167 103 311 72 104 312 137 104 313 73 104 314 98 105 315 163 105 316 99 105 317 97 107 321 162 107 322 98 107 323 96 109 327 161 109 328 97 109 329 96 112 336 159 112 337 160 112 338 95 114 342 158 114 343 159 114 344 94 116 348 157 116 349 158 116 350 93 119 357 156 119 358 157 119 359 92 121 363 155 121 364 156 121 365 91 123 369 154 123 370 155 123 371 90 125 375 153 125 376 154 125 377 89 128 384 152 128 385 153 128 386 88 130 390 151 130 391 152 130 392 87 133 399 150 133 400 151 133 401 86 135 405 149 135 406 150 135 407 172 136 408 171 136 409 180 136 410 1 168 504 3 168 505 2 168 506 3 169 507 7 169 508 6 169 509 7 170 510 5 170 511 4 170 512 5 171 513 1 171 514 0 171 515 6 172 516 4 172 517 0 172 518 3 173 519 1 173 520 5 173 521 99 175 525 163 175 526 164 175 527 73 177 531 137 177 532 138 177 533 100 179 537 164 179 538 165 179 539 74 181 543 138 181 544 139 181 545 101 182 546 165 182 547 166 182 548 75 183 549 139 183 550 140 183 551 102 185 555 166 185 556 167 185 557 76 186 558 140 186 559 141 186 560 103 188 564 167 188 565 106 188 566 77 190 570 141 190 571 142 190 572 78 191 573 142 191 574 143 191 575 79 193 579 143 193 580 144 193 581 81 196 588 80 196 589 144 196 590 82 197 591 81 197 592 145 197 593 83 199 597 82 199 598 146 199 599 84 202 606 83 202 607 147 202 608 85 205 615 84 205 616 148 205 617 70 207 621 8 207 622 40 207 623 8 208 624 10 208 625 38 208 626 10 209 627 12 209 628 38 209 629 12 210 630 14 210 631 36 210 632 38 211 633 12 211 634 36 211 635 14 212 636 16 212 637 30 212 638 16 213 639 18 213 640 30 213 641 18 214 642 20 214 643 22 214 644 22 215 645 24 215 646 26 215 647 26 216 648 28 216 649 22 216 650 28 217 651 30 217 652 22 217 653 30 218 654 32 218 655 14 218 656 32 219 657 34 219 658 14 219 659 34 220 660 36 220 661 14 220 662 38 221 663 40 221 664 8 221 665 40 222 666 42 222 667 70 222 668 42 223 669 44 223 670 70 223 671 44 224 672 46 224 673 68 224 674 70 225 675 44 225 676 68 225 677 46 226 678 48 226 679 62 226 680 48 227 681 50 227 682 62 227 683 50 228 684 52 228 685 54 228 686 54 229 687 56 229 688 58 229 689 58 230 690 60 230 691 54 230 692 60 231 693 62 231 694 54 231 695 62 232 696 64 232 697 46 232 698 64 233 699 66 233 700 46 233 701 66 234 702 68 234 703 46 234 704 18 235 705 22 235 706 30 235 707 103 236 708 72 236 709 8 236 710 102 237 711 103 237 712 70 237 713 101 238 714 102 238 715 68 238 716 100 239 717 101 239 718 66 239 719 99 240 720 100 240 721 64 240 722 98 241 723 99 241 724 62 241 725 97 242 726 98 242 727 60 242 728 96 243 729 97 243 730 58 243 731 54 244 732 95 244 733 96 244 734 52 245 735 94 245 736 95 245 737 50 246 738 93 246 739 94 246 740 48 247 741 92 247 742 93 247 743 46 248 744 91 248 745 92 248 746 44 249 747 90 249 748 91 249 749 42 250 750 89 250 751 90 250 752 40 251 753 88 251 754 89 251 755 38 252 756 87 252 757 88 252 758 36 253 759 86 253 760 87 253 761 34 254 762 85 254 763 86 254 764 32 255 765 84 255 766 85 255 767 30 256 768 83 256 769 84 256 770 28 257 771 82 257 772 83 257 773 26 258 774 81 258 775 82 258 776 24 259 777 80 259 778 81 259 779 79 260 780 80 260 781 24 260 782 78 261 783 79 261 784 22 261 785 77 262 786 78 262 787 20 262 788 76 263 789 77 263 790 18 263 791 75 264 792 76 264 793 16 264 794 74 265 795 75 265 796 14 265 797 73 266 798 74 266 799 12 266 800 72 267 801 73 267 802 10 267 803 105 268 804 104 268 805 137 268 806 104 269 807 107 269 808 138 269 809 107 270 810 108 270 811 139 270 812 108 271 813 109 271 814 140 271 815 109 272 816 110 272 817 141 272 818 110 273 819 111 273 820 142 273 821 111 274 822 112 274 823 143 274 824 112 275 825 113 275 826 144 275 827 144 276 828 113 276 829 114 276 830 145 277 831 114 277 832 115 277 833 146 278 834 115 278 835 116 278 836 147 279 837 116 279 838 117 279 839 148 280 840 117 280 841 118 280 842 149 281 843 118 281 844 119 281 845 150 282 846 119 282 847 120 282 848 151 283 849 120 283 850 121 283 851 152 284 852 121 284 853 122 284 854 153 285 855 122 285 856 123 285 857 154 286 858 123 286 859 124 286 860 155 287 861 124 287 862 125 287 863 156 288 864 125 288 865 126 288 866 157 289 867 126 289 868 127 289 869 158 290 870 127 290 871 128 290 872 159 291 873 128 291 874 129 291 875 129 292 876 130 292 877 161 292 878 130 293 879 131 293 880 162 293 881 131 294 882 132 294 883 163 294 884 132 295 885 133 295 886 164 295 887 133 296 888 134 296 889 165 296 890 134 297 891 135 297 892 166 297 893 135 298 894 136 298 895 167 298 896 136 299 897 105 299 898 106 299 899 72 300 900 106 300 901 137 300 902 98 301 903 162 301 904 163 301 905 97 303 909 161 303 910 162 303 911 96 305 915 160 305 916 161 305 917 96 308 924 95 308 925 159 308 926 95 310 930 94 310 931 158 310 932 94 312 936 93 312 937 157 312 938 93 315 945 92 315 946 156 315 947 92 317 951 91 317 952 155 317 953 91 319 957 90 319 958 154 319 959 90 321 963 89 321 964 153 321 965 89 324 972 88 324 973 152 324 974 88 326 978 87 326 979 151 326 980 87 329 987 86 329 988 150 329 989 86 331 993 85 331 994 149 331 995 170 332 996 168 332 997 183 332 998 168 333 999 169 333 1000 184 333 1001 169 334 1002 199 334 1003 185 334 1004 199 335 1005 198 335 1006 186 335 1007 198 336 1008 197 336 1009 186 336 1010 197 337 1011 196 337 1012 187 337 1013 186 338 1014 197 338 1015 187 338 1016 196 339 1017 195 339 1018 188 339 1019 195 340 1020 194 340 1021 188 340 1022 194 341 1023 193 341 1024 190 341 1025 193 342 1026 192 342 1027 190 342 1028 192 343 1029 191 343 1030 190 343 1031 190 344 1032 189 344 1033 194 344 1034 189 345 1035 188 345 1036 194 345 1037 188 346 1038 187 346 1039 196 346 1040 186 347 1041 185 347 1042 199 347 1043 185 348 1044 184 348 1045 169 348 1046 184 349 1047 183 349 1048 168 349 1049 183 350 1050 182 350 1051 170 350 1052 182 351 1053 181 351 1054 170 351 1055 181 352 1056 180 352 1057 171 352 1058 170 353 1059 181 353 1060 171 353 1061 180 354 1062 179 354 1063 172 354 1064 179 355 1065 178 355 1066 172 355 1067 178 356 1068 177 356 1069 174 356 1070 177 357 1071 176 357 1072 174 357 1073 176 358 1074 175 358 1075 174 358 1076 174 359 1077 173 359 1078 178 359 1079 173 360 1080 172 360 1081 178 360 1082
+
+
+
+
+
+ 63 6 18 131 6 19 61 6 20 11 8 24 105 8 25 9 8 26 43 10 30 123 10 31 122 10 32 25 12 36 114 12 37 113 12 38 61 16 48 130 16 49 59 16 50 41 19 57 122 19 58 121 19 59 25 21 63 112 21 64 23 21 65 59 24 72 129 24 73 57 24 74 39 26 78 121 26 79 120 26 80 23 27 81 111 27 82 21 27 83 55 30 90 129 30 91 128 30 92 37 32 96 120 32 97 119 32 98 21 33 99 110 33 100 19 33 101 9 35 105 136 35 106 71 35 107 13 36 108 171 36 109 15 36 110 53 38 114 128 38 115 127 38 116 27 106 318 115 106 319 114 106 320 45 108 324 124 108 325 123 108 326 65 110 330 132 110 331 63 110 332 13 111 333 104 111 334 11 111 335 29 113 339 116 113 340 115 113 341 47 115 345 125 115 346 124 115 347 67 117 351 133 117 352 65 117 353 15 118 354 107 118 355 13 118 356 31 120 360 117 120 361 116 120 362 49 122 366 126 122 367 125 122 368 69 124 372 134 124 373 67 124 374 17 126 378 108 126 379 15 126 380 33 127 381 118 127 382 117 127 383 51 129 387 127 129 388 126 129 389 71 131 393 135 131 394 69 131 395 19 132 396 109 132 397 17 132 398 35 134 402 119 134 403 118 134 404 33 137 411 179 137 412 180 137 413 51 138 414 188 138 415 189 138 416 67 139 417 198 139 418 69 139 419 23 140 420 176 140 421 25 140 422 43 141 423 184 141 424 185 141 425 59 142 426 194 142 427 61 142 428 15 143 429 172 143 430 17 143 431 35 144 432 180 144 433 181 144 434 53 145 435 189 145 436 190 145 437 69 146 438 199 146 439 71 146 440 27 147 441 176 147 442 177 147 443 45 148 444 185 148 445 186 148 446 61 149 447 195 149 448 63 149 449 17 150 450 173 150 451 19 150 452 37 151 453 181 151 454 182 151 455 55 152 456 190 152 457 191 152 458 9 153 459 168 153 460 11 153 461 71 154 462 169 154 463 9 154 464 29 155 465 177 155 466 178 155 467 47 156 468 186 156 469 187 156 470 63 157 471 196 157 472 65 157 473 19 158 474 174 158 475 21 158 476 39 159 477 182 159 478 183 159 479 57 160 480 191 160 481 192 160 482 11 161 483 170 161 484 13 161 485 31 162 486 178 162 487 179 162 488 49 163 489 187 163 490 188 163 491 65 164 492 197 164 493 67 164 494 21 165 495 175 165 496 23 165 497 41 166 498 183 166 499 184 166 500 57 167 501 193 167 502 59 167 503 63 174 522 132 174 523 131 174 524 11 176 528 104 176 529 105 176 530 43 178 534 45 178 535 123 178 536 25 180 540 27 180 541 114 180 542 61 184 552 131 184 553 130 184 554 41 187 561 43 187 562 122 187 563 25 189 567 113 189 568 112 189 569 59 192 576 130 192 577 129 192 578 39 194 582 41 194 583 121 194 584 23 195 585 112 195 586 111 195 587 55 198 594 57 198 595 129 198 596 37 200 600 39 200 601 120 200 602 21 201 603 111 201 604 110 201 605 9 203 609 105 203 610 136 203 611 13 204 612 170 204 613 171 204 614 53 206 618 55 206 619 128 206 620 27 302 906 29 302 907 115 302 908 45 304 912 47 304 913 124 304 914 65 306 918 133 306 919 132 306 920 13 307 921 107 307 922 104 307 923 29 309 927 31 309 928 116 309 929 47 311 933 49 311 934 125 311 935 67 313 939 134 313 940 133 313 941 15 314 942 108 314 943 107 314 944 31 316 948 33 316 949 117 316 950 49 318 954 51 318 955 126 318 956 69 320 960 135 320 961 134 320 962 17 322 966 109 322 967 108 322 968 33 323 969 35 323 970 118 323 971 51 325 975 53 325 976 127 325 977 71 327 981 136 327 982 135 327 983 19 328 984 110 328 985 109 328 986 35 330 990 37 330 991 119 330 992 33 361 1083 31 361 1084 179 361 1085 51 362 1086 49 362 1087 188 362 1088 67 363 1089 197 363 1090 198 363 1091 23 364 1092 175 364 1093 176 364 1094 43 365 1095 41 365 1096 184 365 1097 59 366 1098 193 366 1099 194 366 1100 15 367 1101 171 367 1102 172 367 1103 35 368 1104 33 368 1105 180 368 1106 53 369 1107 51 369 1108 189 369 1109 69 370 1110 198 370 1111 199 370 1112 27 371 1113 25 371 1114 176 371 1115 45 372 1116 43 372 1117 185 372 1118 61 373 1119 194 373 1120 195 373 1121 17 374 1122 172 374 1123 173 374 1124 37 375 1125 35 375 1126 181 375 1127 55 376 1128 53 376 1129 190 376 1130 9 377 1131 169 377 1132 168 377 1133 71 378 1134 199 378 1135 169 378 1136 29 379 1137 27 379 1138 177 379 1139 47 380 1140 45 380 1141 186 380 1142 63 381 1143 195 381 1144 196 381 1145 19 382 1146 173 382 1147 174 382 1148 39 383 1149 37 383 1150 182 383 1151 57 384 1152 55 384 1153 191 384 1154 11 385 1155 168 385 1156 170 385 1157 31 386 1158 29 386 1159 178 386 1160 49 387 1161 47 387 1162 187 387 1163 65 388 1164 196 388 1165 197 388 1166 21 389 1167 174 389 1168 175 389 1169 41 390 1170 39 390 1171 183 390 1172 57 391 1173 192 391 1174 193 391 1175
+
+
+
+
+
+
+ 4.62388e-7 1.242424 -0.9999986 0 1 1 0.2423855 1.218552 -0.9999986 0.1950903 0.9807853 1 0.4754558 1.14785 -0.9999986 0.3826835 0.9238795 1 0.6902546 1.033038 -0.9999986 0.5555703 0.8314696 1 0.8785272 0.8785268 -0.9999986 0.7071068 0.7071068 1 1.033039 0.6902541 -0.9999986 0.8314696 0.5555703 1 1.147851 0.4754553 -0.9999986 0.9238795 0.3826835 1 1.218552 0.242385 -0.9999986 0.9807853 0.1950903 1 1.242425 0 -0.9999986 1 0 1 1.218552 -0.242385 -0.9999986 0.9807853 -0.1950903 1 1.147851 -0.4754553 -0.9999986 0.9238795 -0.3826835 1 1.033039 -0.6902541 -0.9999986 0.8314696 -0.5555703 1 0.8785272 -0.8785268 -0.9999986 0.7071068 -0.7071068 1 0.6902546 -1.033038 -0.9999986 0.5555703 -0.8314696 1 0.4754558 -1.14785 -0.9999986 0.3826835 -0.9238795 1 0.2423855 -1.218552 -0.9999986 0.1950903 -0.9807853 1 4.62388e-7 -1.242424 -0.9999986 0 -1 1 -0.2423845 -1.218552 -0.9999986 -0.1950903 -0.9807853 1 -0.4754548 -1.14785 -0.9999986 -0.3826835 -0.9238795 1 -0.6902536 -1.033038 -0.9999986 -0.5555703 -0.8314696 1 -0.8785263 -0.8785268 -0.9999986 -0.7071068 -0.7071068 1 -1.033038 -0.6902541 -0.9999986 -0.8314696 -0.5555703 1 -1.14785 -0.4754553 -0.9999986 -0.9238795 -0.3826835 1 -1.218551 -0.242385 -0.9999986 -0.9807853 -0.1950903 1 -1.242424 0 -0.9999986 -1 0 1 -1.218551 0.242385 -0.9999986 -0.9807853 0.1950903 1 -1.14785 0.4754553 -0.9999986 -0.9238795 0.3826835 1 -1.033038 0.6902541 -0.9999986 -0.8314696 0.5555703 1 -0.8785263 0.8785268 -0.9999986 -0.7071068 0.7071068 1 -0.6902536 1.033038 -0.9999986 -0.5555703 0.8314696 1 -0.4754548 1.14785 -0.9999986 -0.3826835 0.9238795 1 -0.2423845 1.218552 -0.9999986 -0.1950903 0.9807853 1 0 1 0.5106036 0.1950903 0.9807853 0.5106036 0.3826835 0.9238795 0.5106036 0.5555703 0.8314696 0.5106036 0.7071068 0.7071068 0.5106036 0.8314696 0.5555703 0.5106036 0.9238795 0.3826835 0.5106036 0.9807853 0.1950903 0.5106036 1 0 0.5106036 0.9807853 -0.1950903 0.5106036 0.9238795 -0.3826835 0.5106036 0.8314696 -0.5555703 0.5106036 0.7071068 -0.7071068 0.5106036 0.5555703 -0.8314696 0.5106036 0.3826835 -0.9238795 0.5106036 0.1950903 -0.9807853 0.5106036 0 -1 0.5106036 -0.1950903 -0.9807853 0.5106036 -0.3826835 -0.9238795 0.5106036 -0.5555703 -0.8314696 0.5106036 -0.7071068 -0.7071068 0.5106036 -0.8314696 -0.5555703 0.5106036 -0.9238795 -0.3826835 0.5106036 -0.9807853 -0.1950903 0.5106036 -1 0 0.5106036 -0.9807853 0.1950903 0.5106036 -0.9238795 0.3826835 0.5106036 -0.8314696 0.5555703 0.5106036 -0.7071068 0.7071068 0.5106036 -0.5555703 0.8314696 0.5106036 -0.3826835 0.9238795 0.5106036 -0.1950903 0.9807853 0.5106036 0.1950903 0.9807853 -0.308205 0.3826835 0.9238795 -0.308205 0.5555703 0.8314696 -0.308205 0.7071068 0.7071068 -0.308205 0.8314696 0.5555703 -0.308205 0.9238795 0.3826835 -0.308205 0.9807853 0.1950903 -0.308205 1 0 -0.308205 0.9807853 -0.1950903 -0.308205 0.9238795 -0.3826835 -0.308205 0.8314696 -0.5555703 -0.308205 0.7071068 -0.7071068 -0.308205 0.5555703 -0.8314696 -0.308205 0.3826835 -0.9238795 -0.308205 0.1950903 -0.9807853 -0.308205 0 -1 -0.308205 -0.1950903 -0.9807853 -0.308205 -0.3826835 -0.9238795 -0.308205 -0.5555703 -0.8314696 -0.308205 -0.7071068 -0.7071068 -0.308205 -0.8314696 -0.5555703 -0.308205 -0.9238795 -0.3826835 -0.308205 -0.9807853 -0.1950903 -0.308205 -1 0 -0.308205 -0.9807853 0.1950903 -0.308205 -0.9238795 0.3826835 -0.308205 -0.8314696 0.5555703 -0.308205 -0.7071068 0.7071068 -0.308205 -0.5555703 0.8314696 -0.308205 -0.3826835 0.9238795 -0.308205 -0.1950903 0.9807853 -0.308205 0 1 -0.3082049 2.29839e-7 0.8795036 -0.2588687 2.29839e-7 0.8795036 0.4612718 -0.1715813 0.8626043 0.4612718 -0.3365691 0.8125557 0.4612718 -0.4886227 0.7312814 0.4612718 -0.6218988 0.6219046 0.4612718 -0.7312757 0.4886285 0.4612718 -0.81255 0.3365749 0.4612718 -0.8625985 0.1715871 0.4612718 -0.8794978 5.51614e-6 0.4612718 -0.8625985 -0.171576 0.4612718 -0.81255 -0.3365638 0.4612718 -0.7312757 -0.4886174 0.4612718 -0.6218988 -0.6218935 0.4612718 -0.4886227 -0.7312704 0.4612718 -0.3365691 -0.8125447 0.4612718 -0.1715813 -0.8625932 0.4612718 2.29839e-7 -0.8794925 0.4612718 0.1715818 -0.8625932 0.4612718 0.3365696 -0.8125447 0.4612718 0.4886232 -0.7312704 0.4612718 0.6218993 -0.6218935 0.4612718 0.7312762 -0.4886174 0.4612718 0.8125505 -0.3365638 0.4612718 0.862599 -0.171576 0.4612718 0.8794983 5.51614e-6 0.4612718 0.862599 0.1715871 0.4612718 0.8125505 0.3365749 0.4612718 0.7312762 0.4886285 0.4612718 0.6218993 0.6219046 0.4612718 0.4886232 0.7312814 0.4612718 0.3365696 0.8125557 0.4612718 0.1715818 0.8626043 0.4612718 0.1715818 0.8626043 -0.2588688 0.3365696 0.8125557 -0.2588688 0.4886232 0.7312814 -0.2588688 0.6218993 0.6219046 -0.2588688 0.7312762 0.4886285 -0.2588688 0.8125505 0.3365749 -0.2588688 0.862599 0.1715871 -0.2588688 0.8794983 5.51614e-6 -0.2588688 0.862599 -0.171576 -0.2588688 0.8125505 -0.3365638 -0.2588688 0.7312762 -0.4886174 -0.2588688 0.6218993 -0.6218935 -0.2588688 0.4886232 -0.7312704 -0.2588688 0.3365696 -0.8125447 -0.2588688 0.1715818 -0.8625932 -0.2588688 2.29839e-7 -0.8794925 -0.2588688 -0.1715813 -0.8625932 -0.2588688 -0.3365691 -0.8125447 -0.2588688 -0.4886227 -0.7312704 -0.2588688 -0.6218988 -0.6218935 -0.2588688 -0.7312757 -0.4886174 -0.2588688 -0.81255 -0.3365638 -0.2588688 -0.8625985 -0.171576 -0.2588688 -0.8794978 5.51614e-6 -0.2588688 -0.8625985 0.1715871 -0.2588688 -0.81255 0.3365749 -0.2588688 -0.7312757 0.4886285 -0.2588688 -0.6218988 0.6219046 -0.2588688 -0.4886227 0.7312814 -0.2588688 -0.3365691 0.8125557 -0.2588688 -0.1715813 0.8626043 -0.2588688
+
+
+
+
+
+
+
+
+
+ 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713968 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713968 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713968 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713968 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713968 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713968 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713968 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713968 0.8819213 0 0 0 1 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 0 0 -1 -0.03728777 -0.3785886 -0.9248137 0.2413713 0.2941118 0.9247909 -0.1793555 0.3355506 0.9247905 -0.1104304 -0.3640402 -0.9248135 0.1793558 0.335551 0.9247902 -0.2413708 0.2941113 0.9247912 -0.1793296 -0.3355022 -0.924813 0.110447 0.3640951 0.9247898 -0.2941096 0.2413695 0.924792 -0.2413381 -0.2940713 -0.9248124 0.03729379 0.3786468 0.9247896 -0.335545 0.1793525 0.9247931 -0.2940729 -0.2413393 -0.9248116 -0.3640849 0.1104438 0.9247942 -0.3355074 -0.1793324 -0.9248105 -0.3786327 0.03729212 0.9247955 -0.3640493 -0.1104331 -0.9248095 -0.3786298 -0.03729182 0.9247966 -0.3786014 -0.03728902 -0.9248084 -0.3640766 -0.1104413 0.9247978 -0.3786043 0.03728932 -0.9248071 -0.3355326 -0.1793459 0.9247989 -0.3640576 0.1104356 -0.924806 -0.2940949 -0.2413575 0.9247998 -0.3355199 0.1793391 -0.9248048 0.03729075 0.3786185 -0.9248014 -0.2413561 -0.2940934 0.9248007 -0.2940875 0.2413514 -0.9248037 0.1104388 0.364068 -0.9248015 -0.1793431 -0.3355273 0.9248014 -0.2413528 0.2940892 -0.9248029 0.1793423 0.335526 -0.924802 0.09255057 0.9396815 0.3292916 0.2740951 0.9035701 0.3292917 0.4451062 0.8327349 0.3292918 0.5990121 0.7298982 0.3292919 0.7298982 0.5990121 0.3292919 0.8327348 0.4451061 0.3292921 0.9035699 0.2740951 0.3292921 0.9396814 0.09255057 0.3292921 0.9396814 -0.09255057 0.3292921 0.9035699 -0.274095 0.3292921 0.8327348 -0.4451061 0.329292 0.7298982 -0.5990121 0.3292919 0.5990121 -0.7298982 0.3292919 0.4451062 -0.8327349 0.3292918 0.2740951 -0.9035701 0.3292917 0.09255057 -0.9396815 0.3292917 -0.09255057 -0.9396816 0.3292915 -0.2740951 -0.9035702 0.3292915 -0.4451063 -0.8327351 0.3292913 -0.5990121 -0.7298985 0.3292912 -0.7298983 -0.5990123 0.3292911 -0.8327353 -0.4451059 0.3292911 -0.9035702 -0.2740951 0.329291 -0.9396818 -0.09255063 0.329291 -0.9396818 0.09255063 0.329291 -0.9035702 0.2740951 0.329291 -0.8327353 0.4451059 0.3292911 -0.7298983 0.5990123 0.3292911 -0.5990121 0.7298985 0.3292912 -0.4451063 0.8327351 0.3292913 -0.2740951 0.9035702 0.3292914 -0.09255063 0.9396816 0.3292915 -0.09801733 0.9951847 0 -0.2902848 0.9569403 0 -0.4713967 0.8819213 0 -0.6343932 0.7730106 0 -0.7730104 0.6343933 0 -0.8819213 0.4713967 0 -0.9569404 0.2902845 0 -0.9951847 0.09801733 0 -0.9951847 -0.09801733 0 -0.9569404 -0.2902845 0 -0.8819213 -0.4713967 0 -0.7730104 -0.6343933 0 -0.6343932 -0.7730106 0 -0.4713967 -0.8819213 0 -0.2902848 -0.9569403 0 -0.09801703 -0.9951848 0 0.09801697 -0.9951848 0 0.2902848 -0.9569403 0 0.4713967 -0.8819213 0 0.6343933 -0.7730104 0 0.7730103 -0.6343935 0 0.8819213 -0.4713967 0 0.9569404 -0.2902845 0 0.9951847 -0.09801733 0 0.9951847 0.09801733 0 0.9569404 0.2902845 0 0.8819213 0.4713967 0 0.7730103 0.6343935 0 0.6343933 0.7730104 0 0.4713967 0.8819213 0 0.2902848 0.9569403 0 0.09801733 0.9951847 0 -0.110447 0.3640948 0.9247899 0.2941103 0.2413702 0.9247917 0.03728765 -0.3785889 -0.9248136 -0.03729385 0.3786467 0.9247896 0.335546 0.1793531 0.9247926 0.1104305 -0.3640404 -0.9248133 0.364086 0.1104443 0.9247937 0.1793299 -0.3355027 -0.9248129 0.378634 0.03729224 0.9247949 0.2413386 -0.2940719 -0.9248121 0.3786311 -0.03729194 0.9247961 0.2940736 -0.2413401 -0.9248112 0.3640778 -0.1104418 0.9247972 0.3355084 -0.1793329 -0.9248101 0.3355336 -0.1793464 0.9247984 0.3640505 -0.1104334 -0.924809 0.2940956 -0.241358 0.9247995 0.3786027 -0.0372892 -0.9248078 0.2413566 -0.2940939 0.9248004 0.3786056 0.03728944 -0.9248067 0.1793433 -0.3355278 0.9248011 0.3640588 0.110436 -0.9248054 0.1104387 -0.3640678 0.9248015 0.3355209 0.1793396 -0.9248043 -0.03729069 0.3786183 -0.9248014 0.03729057 -0.3786171 0.9248019 0.2940882 0.241352 -0.9248034 -0.1104386 0.3640675 -0.9248017 -0.03729045 -0.3786171 0.9248019 0.2413532 0.2940897 -0.9248026 -0.179342 0.3355255 -0.9248022 -0.1104387 -0.3640673 0.9248018 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713968 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713968 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713968 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713968 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713968 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713968 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713968 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713968 0.8819213 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.03728765 -0.3785887 -0.9248136 0.2413713 0.2941118 0.9247908 -0.1793555 0.3355506 0.9247905 -0.1104304 -0.36404 -0.9248135 0.1793558 0.3355511 0.9247903 -0.2413709 0.2941113 0.9247912 -0.1793296 -0.3355022 -0.924813 0.1104471 0.3640952 0.9247897 -0.2941096 0.2413695 0.9247921 -0.2413381 -0.2940714 -0.9248123 0.03729385 0.3786469 0.9247896 -0.335545 0.1793525 0.9247931 -0.2940729 -0.2413393 -0.9248116 -0.3640848 0.1104439 0.9247942 -0.3355074 -0.1793324 -0.9248106 -0.3786327 0.03729212 0.9247954 -0.3640492 -0.1104331 -0.9248095 -0.3786298 -0.03729182 0.9247967 -0.3786014 -0.03728902 -0.9248084 -0.3640766 -0.1104414 0.9247978 -0.3786043 0.03728932 -0.9248072 -0.3355326 -0.1793459 0.9247989 -0.3640576 0.1104356 -0.9248059 -0.2940949 -0.2413575 0.9247999 -0.3355199 0.1793391 -0.9248049 0.03729069 0.3786185 -0.9248014 -0.2413561 -0.2940933 0.9248007 -0.2940876 0.2413514 -0.9248037 0.1104387 0.3640679 -0.9248016 -0.1793431 -0.3355273 0.9248014 -0.2413527 0.2940892 -0.9248028 0.1793423 0.3355259 -0.924802 0.09255081 0.9396816 0.3292916 0.2740949 0.9035701 0.3292918 0.4451061 0.832735 0.3292918 0.599012 0.7298982 0.3292919 0.7298982 0.599012 0.329292 0.8327349 0.445106 0.329292 0.9035699 0.2740949 0.3292921 0.9396814 0.09255069 0.3292922 0.9396814 -0.09255069 0.3292922 0.9035699 -0.2740949 0.3292921 0.8327349 -0.445106 0.329292 0.7298982 -0.599012 0.329292 0.599012 -0.7298982 0.3292919 0.4451061 -0.832735 0.3292918 0.2740949 -0.9035701 0.3292918 0.09255069 -0.9396816 0.3292917 -0.09255069 -0.9396816 0.3292915 -0.2740949 -0.9035702 0.3292914 -0.4451062 -0.8327351 0.3292912 -0.5990122 -0.7298984 0.3292912 -0.7298984 -0.5990122 0.3292912 -0.8327351 -0.4451062 0.329291 -0.9035703 -0.274095 0.329291 -0.9396818 -0.09255069 0.329291 -0.9396818 0.09255069 0.329291 -0.9035703 0.274095 0.329291 -0.8327351 0.4451062 0.329291 -0.7298984 0.5990122 0.3292912 -0.5990122 0.7298984 0.3292912 -0.4451062 0.8327351 0.3292912 -0.2740949 0.9035702 0.3292914 -0.09255075 0.9396816 0.3292915 -0.09801733 0.9951847 0 -0.2902848 0.9569403 0 -0.4713967 0.8819213 0 -0.6343932 0.7730106 0 -0.7730104 0.6343933 0 -0.8819213 0.4713967 0 -0.9569404 0.2902845 0 -0.9951847 0.09801733 0 -0.9951847 -0.09801733 0 -0.9569404 -0.2902845 0 -0.8819213 -0.4713967 0 -0.7730104 -0.6343933 0 -0.6343932 -0.7730106 0 -0.4713967 -0.8819213 0 -0.2902848 -0.9569403 0 -0.09801703 -0.9951848 0 0.09801697 -0.9951848 0 0.2902848 -0.9569403 0 0.4713967 -0.8819213 0 0.6343933 -0.7730104 0 0.7730103 -0.6343935 0 0.8819213 -0.4713967 0 0.9569404 -0.2902845 0 0.9951847 -0.09801733 0 0.9951847 0.09801733 0 0.9569404 0.2902845 0 0.8819213 0.4713967 0 0.7730103 0.6343935 0 0.6343933 0.7730104 0 0.4713967 0.8819213 0 0.2902848 0.9569403 0 0.09801733 0.9951847 0 -0.1104469 0.3640947 0.92479 0.2941102 0.2413701 0.9247916 0.03728777 -0.3785887 -0.9248136 -0.03729373 0.3786466 0.9247897 0.335546 0.179353 0.9247927 0.1104304 -0.3640406 -0.9248133 0.3640861 0.1104443 0.9247937 0.1793299 -0.3355026 -0.9248128 0.3786339 0.03729224 0.9247949 0.2413386 -0.2940719 -0.9248121 0.3786311 -0.03729194 0.9247961 0.2940735 -0.2413399 -0.9248112 0.3640778 -0.1104417 0.9247974 0.3355084 -0.179333 -0.9248101 0.3355336 -0.1793464 0.9247984 0.3640505 -0.1104335 -0.924809 0.2940956 -0.2413582 0.9247995 0.3786027 -0.03728914 -0.9248079 0.2413567 -0.294094 0.9248004 0.3786056 0.03728944 -0.9248066 0.1793433 -0.3355278 0.9248011 0.3640587 0.110436 -0.9248055 0.1104388 -0.3640677 0.9248016 0.3355208 0.1793396 -0.9248043 -0.03729069 0.3786184 -0.9248014 0.03729045 -0.3786172 0.9248019 0.2940883 0.241352 -0.9248033 -0.1104387 0.3640675 -0.9248016 -0.03729057 -0.3786169 0.924802 0.2413532 0.2940898 -0.9248026 -0.179342 0.3355255 -0.9248022 -0.1104386 -0.3640674 0.9248017
+
+
+
+
+
+
+
+
+
+ 1 1 0.96875 0.8776509 1 0.8776509 0.96875 1 0.9375 0.8776509 0.96875 0.8776509 0.9375 1 0.90625 0.8776509 0.9375 0.8776509 0.90625 1 0.875 0.8776509 0.90625 0.8776509 0.875 1 0.84375 0.8776509 0.875 0.8776509 0.84375 1 0.8125 0.8776509 0.84375 0.8776509 0.8125 1 0.78125 0.8776509 0.8125 0.8776509 0.78125 1 0.75 0.8776509 0.78125 0.8776509 0.75 1 0.71875 0.8776509 0.75 0.8776509 0.71875 1 0.6875 0.8776509 0.71875 0.8776509 0.6875 1 0.65625 0.8776509 0.6875 0.8776509 0.65625 1 0.625 0.8776509 0.65625 0.8776509 0.625 1 0.59375 0.8776509 0.625 0.8776509 0.59375 1 0.5625 0.8776509 0.59375 0.8776509 0.5625 1 0.53125 0.8776509 0.5625 0.8776509 0.53125 1 0.5 0.8776509 0.53125 0.8776509 0.5 1 0.46875 0.8776509 0.5 0.8776509 0.46875 1 0.4375 0.8776509 0.46875 0.8776509 0.4375 1 0.40625 0.8776509 0.4375 0.8776509 0.40625 1 0.375 0.8776509 0.40625 0.8776509 0.375 1 0.34375 0.8776509 0.375 0.8776509 0.34375 1 0.3125 0.8776509 0.34375 0.8776509 0.3125 1 0.28125 0.8776509 0.3125 0.8776509 0.28125 1 0.25 0.8776509 0.28125 0.8776509 0.25 1 0.21875 0.8776509 0.25 0.8776509 0.21875 1 0.1875 0.8776509 0.21875 0.8776509 0.1875 1 0.15625 0.8776509 0.1875 0.8776509 0.15625 1 0.125 0.8776509 0.15625 0.8776509 0.125 1 0.09375 0.8776509 0.125 0.8776509 0.09375 1 0.0625 0.8776509 0.09375 0.8776509 0.1581559 0.02826887 0.4717311 0.1581559 0.341844 0.4717311 0.0625 1 0.03125 0.8776509 0.0625 0.8776509 0.03125 1 0 0.8776509 0.03125 0.8776509 0.7968217 0.01461154 0.5146116 0.2031783 0.7031784 0.4853885 0.46875 0.8776509 0.5 0.8776509 0.5 0.8776509 0.90625 0.6729488 0.875 0.6729488 0.875 0.6729488 0.0625 0.6729487 0.09375 0.6729487 0.0625 0.6729487 0.4375 0.8776509 0.46875 0.8776509 0.46875 0.8776509 0.9375 0.6729487 0.90625 0.6729488 0.90625 0.6729488 0.09375 0.6729487 0.125 0.6729488 0.09375 0.6729487 0.40625 0.8776509 0.4375 0.8776509 0.4375 0.8776509 0.96875 0.6729487 0.9375 0.6729487 0.9375 0.6729487 0.125 0.6729488 0.15625 0.6729488 0.125 0.6729488 0.375 0.8776509 0.40625 0.8776509 0.40625 0.8776509 1 0.6729488 0.96875 0.6729487 0.96875 0.6729487 0.15625 0.6729488 0.1875 0.6729487 0.15625 0.6729488 0.34375 0.8776509 0.375 0.8776509 0.375 0.8776509 0.1875 0.6729487 0.21875 0.6729487 0.1875 0.6729487 0.3125 0.8776509 0.34375 0.8776509 0.34375 0.8776509 0.21875 0.6729487 0.25 0.6729488 0.21875 0.6729487 0.28125 0.8776509 0.3125 0.8776509 0.3125 0.8776509 0.25 0.6729488 0.28125 0.6729487 0.25 0.6729488 0.25 0.8776509 0.28125 0.8776509 0.28125 0.8776509 0.28125 0.6729487 0.3125 0.6729487 0.28125 0.6729487 0.21875 0.8776509 0.25 0.8776509 0.25 0.8776509 0.3125 0.6729487 0.34375 0.6729487 0.3125 0.6729487 0.1875 0.8776509 0.21875 0.8776509 0.21875 0.8776509 0.34375 0.6729487 0.375 0.6729488 0.34375 0.6729487 0.15625 0.8776509 0.1875 0.8776509 0.1875 0.8776509 1 0.8776509 0.96875 0.8776509 1 0.8776509 0.375 0.6729488 0.40625 0.6729488 0.375 0.6729488 0.125 0.8776509 0.15625 0.8776509 0.15625 0.8776509 0.96875 0.8776509 0.9375 0.8776509 0.96875 0.8776509 0.40625 0.6729488 0.4375 0.6729487 0.40625 0.6729488 0.09375 0.8776509 0.125 0.8776509 0.125 0.8776509 0.9375 0.8776509 0.90625 0.8776509 0.9375 0.8776509 1 0.5 0.96875 0.6729487 0.96875 0.5 0.96875 0.5 0.9375 0.6729487 0.9375 0.5 0.9375 0.5 0.90625 0.6729488 0.90625 0.5 0.90625 0.5 0.875 0.6729488 0.875 0.5 0.875 0.5 0.84375 0.6729487 0.84375 0.5 0.84375 0.5 0.8125 0.6729487 0.8125 0.5 0.8125 0.5 0.78125 0.6729487 0.78125 0.5 0.78125 0.5 0.75 0.6729488 0.75 0.5 0.75 0.6729488 0.71875 0.5 0.75 0.5 0.71875 0.6729487 0.6875 0.5 0.71875 0.5 0.6875 0.6729487 0.65625 0.5 0.6875 0.5 0.65625 0.6729488 0.625 0.5 0.65625 0.5 0.625 0.6729488 0.59375 0.5 0.625 0.5 0.59375 0.6729487 0.5625 0.5 0.59375 0.5 0.5625 0.6729487 0.53125 0.5 0.5625 0.5 0.53125 0.6729487 0.5 0.5 0.53125 0.5 0.5 0.6729488 0.46875 0.5 0.5 0.5 0.46875 0.6729487 0.4375 0.5 0.46875 0.5 0.4375 0.6729487 0.40625 0.5 0.4375 0.5 0.40625 0.6729488 0.375 0.5 0.40625 0.5 0.375 0.6729488 0.34375 0.5 0.375 0.5 0.34375 0.6729487 0.3125 0.5 0.34375 0.5 0.3125 0.6729487 0.28125 0.5 0.3125 0.5 0.28125 0.6729487 0.25 0.5 0.28125 0.5 0.25 0.5 0.21875 0.6729487 0.21875 0.5 0.21875 0.5 0.1875 0.6729487 0.1875 0.5 0.1875 0.5 0.15625 0.6729488 0.15625 0.5 0.15625 0.5 0.125 0.6729488 0.125 0.5 0.125 0.5 0.09375 0.6729487 0.09375 0.5 0.09375 0.5 0.0625 0.6729487 0.0625 0.5 0.0625 0.5 0.03125 0.6729487 0.03125 0.5 0.03125 0.5 0 0.6729488 0 0.5 0.03125 0.8776509 0 0.6729488 0.03125 0.6729487 0.0625 0.8776509 0.03125 0.6729487 0.0625 0.6729487 0.09375 0.8776509 0.0625 0.6729487 0.09375 0.6729487 0.125 0.8776509 0.09375 0.6729487 0.125 0.6729488 0.15625 0.8776509 0.125 0.6729488 0.15625 0.6729488 0.1875 0.8776509 0.15625 0.6729488 0.1875 0.6729487 0.21875 0.8776509 0.1875 0.6729487 0.21875 0.6729487 0.25 0.8776509 0.21875 0.6729487 0.25 0.6729488 0.28125 0.8776509 0.25 0.6729488 0.28125 0.6729487 0.3125 0.8776509 0.28125 0.6729487 0.3125 0.6729487 0.34375 0.8776509 0.3125 0.6729487 0.34375 0.6729487 0.375 0.8776509 0.34375 0.6729487 0.375 0.6729488 0.40625 0.8776509 0.375 0.6729488 0.40625 0.6729488 0.4375 0.8776509 0.40625 0.6729488 0.4375 0.6729487 0.46875 0.8776509 0.4375 0.6729487 0.46875 0.6729487 0.5 0.8776509 0.46875 0.6729487 0.5 0.6729488 0.53125 0.8776509 0.5 0.6729488 0.53125 0.6729487 0.5625 0.8776509 0.53125 0.6729487 0.5625 0.6729487 0.59375 0.8776509 0.5625 0.6729487 0.59375 0.6729487 0.625 0.8776509 0.59375 0.6729487 0.625 0.6729488 0.65625 0.8776509 0.625 0.6729488 0.65625 0.6729488 0.6875 0.8776509 0.65625 0.6729488 0.6875 0.6729487 0.71875 0.8776509 0.6875 0.6729487 0.71875 0.6729487 0.75 0.8776509 0.71875 0.6729487 0.75 0.6729488 0.78125 0.8776509 0.75 0.6729488 0.78125 0.6729487 0.8125 0.8776509 0.78125 0.6729487 0.8125 0.6729487 0.84375 0.8776509 0.8125 0.6729487 0.84375 0.6729487 0.875 0.8776509 0.84375 0.6729487 0.875 0.6729488 0.90625 0.8776509 0.875 0.6729488 0.90625 0.6729488 0.9375 0.8776509 0.90625 0.6729488 0.9375 0.6729487 0.96875 0.8776509 0.9375 0.6729487 0.96875 0.6729487 1 0.6729488 0.96875 0.8776509 0.96875 0.6729487 0.03125 0.6729487 0.0625 0.6729487 0.03125 0.6729487 0.875 0.6729488 0.84375 0.6729487 0.84375 0.6729487 0.53125 0.8776509 0.5 0.8776509 0.53125 0.8776509 0 0.6729488 0.03125 0.6729487 0 0.6729488 0.84375 0.6729487 0.8125 0.6729487 0.8125 0.6729487 0.5625 0.8776509 0.53125 0.8776509 0.5625 0.8776509 0.8125 0.6729487 0.78125 0.6729487 0.78125 0.6729487 0.59375 0.8776509 0.5625 0.8776509 0.59375 0.8776509 0.78125 0.6729487 0.75 0.6729488 0.75 0.6729488 0.625 0.8776509 0.59375 0.8776509 0.625 0.8776509 0.75 0.6729488 0.71875 0.6729487 0.71875 0.6729487 0.65625 0.8776509 0.625 0.8776509 0.65625 0.8776509 0.71875 0.6729487 0.6875 0.6729487 0.6875 0.6729487 0.6875 0.8776509 0.65625 0.8776509 0.6875 0.8776509 0.6875 0.6729487 0.65625 0.6729488 0.65625 0.6729488 0.71875 0.8776509 0.6875 0.8776509 0.71875 0.8776509 0.65625 0.6729488 0.625 0.6729488 0.625 0.6729488 0.75 0.8776509 0.71875 0.8776509 0.75 0.8776509 0.625 0.6729488 0.59375 0.6729487 0.59375 0.6729487 0.78125 0.8776509 0.75 0.8776509 0.78125 0.8776509 0.59375 0.6729487 0.5625 0.6729487 0.5625 0.6729487 0.8125 0.8776509 0.78125 0.8776509 0.8125 0.8776509 0.5625 0.6729487 0.53125 0.6729487 0.53125 0.6729487 0.84375 0.8776509 0.8125 0.8776509 0.84375 0.8776509 0 0.8776509 0.03125 0.8776509 0.03125 0.8776509 0.53125 0.6729487 0.5 0.6729488 0.5 0.6729488 0.875 0.8776509 0.84375 0.8776509 0.875 0.8776509 0.03125 0.8776509 0.0625 0.8776509 0.0625 0.8776509 0.46875 0.6729487 0.5 0.6729488 0.46875 0.6729487 0.90625 0.8776509 0.875 0.8776509 0.90625 0.8776509 0.0625 0.8776509 0.09375 0.8776509 0.09375 0.8776509 0.4375 0.6729487 0.46875 0.6729487 0.4375 0.6729487 1 1 0.96875 1 0.96875 0.8776509 0.96875 1 0.9375 1 0.9375 0.8776509 0.9375 1 0.90625 1 0.90625 0.8776509 0.90625 1 0.875 1 0.875 0.8776509 0.875 1 0.84375 1 0.84375 0.8776509 0.84375 1 0.8125 1 0.8125 0.8776509 0.8125 1 0.78125 1 0.78125 0.8776509 0.78125 1 0.75 1 0.75 0.8776509 0.75 1 0.71875 1 0.71875 0.8776509 0.71875 1 0.6875 1 0.6875 0.8776509 0.6875 1 0.65625 1 0.65625 0.8776509 0.65625 1 0.625 1 0.625 0.8776509 0.625 1 0.59375 1 0.59375 0.8776509 0.59375 1 0.5625 1 0.5625 0.8776509 0.5625 1 0.53125 1 0.53125 0.8776509 0.53125 1 0.5 1 0.5 0.8776509 0.5 1 0.46875 1 0.46875 0.8776509 0.46875 1 0.4375 1 0.4375 0.8776509 0.4375 1 0.40625 1 0.40625 0.8776509 0.40625 1 0.375 1 0.375 0.8776509 0.375 1 0.34375 1 0.34375 0.8776509 0.34375 1 0.3125 1 0.3125 0.8776509 0.3125 1 0.28125 1 0.28125 0.8776509 0.28125 1 0.25 1 0.25 0.8776509 0.25 1 0.21875 1 0.21875 0.8776509 0.21875 1 0.1875 1 0.1875 0.8776509 0.1875 1 0.15625 1 0.15625 0.8776509 0.15625 1 0.125 1 0.125 0.8776509 0.125 1 0.09375 1 0.09375 0.8776509 0.09375 1 0.0625 1 0.0625 0.8776509 0.341844 0.4717311 0.2968217 0.4853885 0.25 0.49 0.25 0.49 0.2031783 0.4853885 0.341844 0.4717311 0.2031783 0.4853885 0.1581559 0.4717311 0.341844 0.4717311 0.1581559 0.4717311 0.1166631 0.4495527 0.08029437 0.4197056 0.08029437 0.4197056 0.05044728 0.3833369 0.02826887 0.341844 0.02826887 0.341844 0.01461154 0.2968217 0.00999999 0.25 0.00999999 0.25 0.01461154 0.2031783 0.02826887 0.341844 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.341844 0.02826887 0.1581559 0.05044728 0.1166631 0.08029437 0.08029437 0.08029437 0.08029437 0.1166631 0.05044728 0.1581559 0.02826887 0.1581559 0.02826887 0.2031783 0.01461154 0.341844 0.02826887 0.2031783 0.01461154 0.25 0.00999999 0.341844 0.02826887 0.25 0.00999999 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.02826887 0.3833369 0.05044728 0.4197056 0.08029437 0.4197056 0.08029437 0.4495527 0.1166631 0.4717311 0.1581559 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.341844 0.4853885 0.2031783 0.49 0.25 0.4717311 0.341844 0.49 0.25 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.4495527 0.341844 0.4717311 0.1581559 0.4717311 0.08029437 0.4197056 0.341844 0.4717311 0.08029437 0.4197056 0.02826887 0.341844 0.341844 0.4717311 0.02826887 0.1581559 0.08029437 0.08029437 0.02826887 0.341844 0.08029437 0.08029437 0.1581559 0.02826887 0.02826887 0.341844 0.341844 0.02826887 0.4197056 0.08029437 0.1581559 0.02826887 0.4197056 0.08029437 0.4717311 0.1581559 0.1581559 0.02826887 0.4717311 0.341844 0.4197056 0.4197056 0.4717311 0.1581559 0.4197056 0.4197056 0.341844 0.4717311 0.4717311 0.1581559 0.341844 0.4717311 0.02826887 0.341844 0.1581559 0.02826887 0.0625 1 0.03125 1 0.03125 0.8776509 0.03125 1 0 1 0 0.8776509 0.7031784 0.4853885 0.75 0.49 0.7968217 0.4853885 0.7968217 0.4853885 0.841844 0.4717311 0.7031784 0.4853885 0.841844 0.4717311 0.8833369 0.4495527 0.7031784 0.4853885 0.8833369 0.4495527 0.9197056 0.4197056 0.9495527 0.3833369 0.9495527 0.3833369 0.9717311 0.341844 0.9853885 0.2968217 0.9853885 0.2968217 0.99 0.25 0.9853885 0.2031783 0.9853885 0.2031783 0.9717311 0.1581559 0.9853885 0.2968217 0.9717311 0.1581559 0.9495527 0.1166631 0.9853885 0.2968217 0.9495527 0.1166631 0.9197056 0.08029437 0.8833369 0.05044728 0.8833369 0.05044728 0.841844 0.02826887 0.7968217 0.01461154 0.7968217 0.01461154 0.75 0.00999999 0.7031784 0.01461154 0.7031784 0.01461154 0.658156 0.02826887 0.7968217 0.01461154 0.658156 0.02826887 0.6166632 0.05044728 0.7968217 0.01461154 0.6166632 0.05044728 0.5802944 0.08029437 0.5504473 0.1166631 0.5504473 0.1166631 0.5282689 0.1581559 0.6166632 0.05044728 0.5282689 0.1581559 0.5146116 0.2031783 0.6166632 0.05044728 0.5146116 0.2031783 0.51 0.25 0.5146116 0.2968217 0.5146116 0.2968217 0.5282689 0.341844 0.5146116 0.2031783 0.5282689 0.341844 0.5504473 0.3833369 0.5146116 0.2031783 0.5504473 0.3833369 0.5802944 0.4197056 0.6166632 0.4495527 0.6166632 0.4495527 0.658156 0.4717311 0.7031784 0.4853885 0.8833369 0.4495527 0.9495527 0.3833369 0.9853885 0.2968217 0.9495527 0.1166631 0.8833369 0.05044728 0.9853885 0.2968217 0.8833369 0.05044728 0.7968217 0.01461154 0.9853885 0.2968217 0.5504473 0.3833369 0.6166632 0.4495527 0.5146116 0.2031783 0.6166632 0.4495527 0.7031784 0.4853885 0.5146116 0.2031783 0.7031784 0.4853885 0.8833369 0.4495527 0.9853885 0.2968217 0.7968217 0.01461154 0.6166632 0.05044728 0.5146116 0.2031783 0.7031784 0.4853885 0.9853885 0.2968217 0.7968217 0.01461154 0.46875 0.8776509 0.46875 0.8776509 0.5 0.8776509 0.90625 0.6729488 0.90625 0.6729488 0.875 0.6729488 0.0625 0.6729487 0.09375 0.6729487 0.09375 0.6729487 0.4375 0.8776509 0.4375 0.8776509 0.46875 0.8776509 0.9375 0.6729487 0.9375 0.6729487 0.90625 0.6729488 0.09375 0.6729487 0.125 0.6729488 0.125 0.6729488 0.40625 0.8776509 0.40625 0.8776509 0.4375 0.8776509 0.96875 0.6729487 0.96875 0.6729487 0.9375 0.6729487 0.125 0.6729488 0.15625 0.6729488 0.15625 0.6729488 0.375 0.8776509 0.375 0.8776509 0.40625 0.8776509 1 0.6729488 1 0.6729488 0.96875 0.6729487 0.15625 0.6729488 0.1875 0.6729487 0.1875 0.6729487 0.34375 0.8776509 0.34375 0.8776509 0.375 0.8776509 0.1875 0.6729487 0.21875 0.6729487 0.21875 0.6729487 0.3125 0.8776509 0.3125 0.8776509 0.34375 0.8776509 0.21875 0.6729487 0.25 0.6729488 0.25 0.6729488 0.28125 0.8776509 0.28125 0.8776509 0.3125 0.8776509 0.25 0.6729488 0.28125 0.6729487 0.28125 0.6729487 0.25 0.8776509 0.25 0.8776509 0.28125 0.8776509 0.28125 0.6729487 0.3125 0.6729487 0.3125 0.6729487 0.21875 0.8776509 0.21875 0.8776509 0.25 0.8776509 0.3125 0.6729487 0.34375 0.6729487 0.34375 0.6729487 0.1875 0.8776509 0.1875 0.8776509 0.21875 0.8776509 0.34375 0.6729487 0.375 0.6729488 0.375 0.6729488 0.15625 0.8776509 0.15625 0.8776509 0.1875 0.8776509 1 0.8776509 0.96875 0.8776509 0.96875 0.8776509 0.375 0.6729488 0.40625 0.6729488 0.40625 0.6729488 0.125 0.8776509 0.125 0.8776509 0.15625 0.8776509 0.96875 0.8776509 0.9375 0.8776509 0.9375 0.8776509 0.40625 0.6729488 0.4375 0.6729487 0.4375 0.6729487 0.09375 0.8776509 0.09375 0.8776509 0.125 0.8776509 0.9375 0.8776509 0.90625 0.8776509 0.90625 0.8776509 1 0.5 1 0.6729488 0.96875 0.6729487 0.96875 0.5 0.96875 0.6729487 0.9375 0.6729487 0.9375 0.5 0.9375 0.6729487 0.90625 0.6729488 0.90625 0.5 0.90625 0.6729488 0.875 0.6729488 0.875 0.5 0.875 0.6729488 0.84375 0.6729487 0.84375 0.5 0.84375 0.6729487 0.8125 0.6729487 0.8125 0.5 0.8125 0.6729487 0.78125 0.6729487 0.78125 0.5 0.78125 0.6729487 0.75 0.6729488 0.75 0.6729488 0.71875 0.6729487 0.71875 0.5 0.71875 0.6729487 0.6875 0.6729487 0.6875 0.5 0.6875 0.6729487 0.65625 0.6729488 0.65625 0.5 0.65625 0.6729488 0.625 0.6729488 0.625 0.5 0.625 0.6729488 0.59375 0.6729487 0.59375 0.5 0.59375 0.6729487 0.5625 0.6729487 0.5625 0.5 0.5625 0.6729487 0.53125 0.6729487 0.53125 0.5 0.53125 0.6729487 0.5 0.6729488 0.5 0.5 0.5 0.6729488 0.46875 0.6729487 0.46875 0.5 0.46875 0.6729487 0.4375 0.6729487 0.4375 0.5 0.4375 0.6729487 0.40625 0.6729488 0.40625 0.5 0.40625 0.6729488 0.375 0.6729488 0.375 0.5 0.375 0.6729488 0.34375 0.6729487 0.34375 0.5 0.34375 0.6729487 0.3125 0.6729487 0.3125 0.5 0.3125 0.6729487 0.28125 0.6729487 0.28125 0.5 0.28125 0.6729487 0.25 0.6729488 0.25 0.5 0.25 0.5 0.25 0.6729488 0.21875 0.6729487 0.21875 0.5 0.21875 0.6729487 0.1875 0.6729487 0.1875 0.5 0.1875 0.6729487 0.15625 0.6729488 0.15625 0.5 0.15625 0.6729488 0.125 0.6729488 0.125 0.5 0.125 0.6729488 0.09375 0.6729487 0.09375 0.5 0.09375 0.6729487 0.0625 0.6729487 0.0625 0.5 0.0625 0.6729487 0.03125 0.6729487 0.03125 0.5 0.03125 0.6729487 0 0.6729488 0.03125 0.8776509 0 0.8776509 0 0.6729488 0.0625 0.8776509 0.03125 0.8776509 0.03125 0.6729487 0.09375 0.8776509 0.0625 0.8776509 0.0625 0.6729487 0.125 0.8776509 0.09375 0.8776509 0.09375 0.6729487 0.15625 0.8776509 0.125 0.8776509 0.125 0.6729488 0.1875 0.8776509 0.15625 0.8776509 0.15625 0.6729488 0.21875 0.8776509 0.1875 0.8776509 0.1875 0.6729487 0.25 0.8776509 0.21875 0.8776509 0.21875 0.6729487 0.28125 0.8776509 0.25 0.8776509 0.25 0.6729488 0.3125 0.8776509 0.28125 0.8776509 0.28125 0.6729487 0.34375 0.8776509 0.3125 0.8776509 0.3125 0.6729487 0.375 0.8776509 0.34375 0.8776509 0.34375 0.6729487 0.40625 0.8776509 0.375 0.8776509 0.375 0.6729488 0.4375 0.8776509 0.40625 0.8776509 0.40625 0.6729488 0.46875 0.8776509 0.4375 0.8776509 0.4375 0.6729487 0.5 0.8776509 0.46875 0.8776509 0.46875 0.6729487 0.53125 0.8776509 0.5 0.8776509 0.5 0.6729488 0.5625 0.8776509 0.53125 0.8776509 0.53125 0.6729487 0.59375 0.8776509 0.5625 0.8776509 0.5625 0.6729487 0.625 0.8776509 0.59375 0.8776509 0.59375 0.6729487 0.65625 0.8776509 0.625 0.8776509 0.625 0.6729488 0.6875 0.8776509 0.65625 0.8776509 0.65625 0.6729488 0.71875 0.8776509 0.6875 0.8776509 0.6875 0.6729487 0.75 0.8776509 0.71875 0.8776509 0.71875 0.6729487 0.78125 0.8776509 0.75 0.8776509 0.75 0.6729488 0.8125 0.8776509 0.78125 0.8776509 0.78125 0.6729487 0.84375 0.8776509 0.8125 0.8776509 0.8125 0.6729487 0.875 0.8776509 0.84375 0.8776509 0.84375 0.6729487 0.90625 0.8776509 0.875 0.8776509 0.875 0.6729488 0.9375 0.8776509 0.90625 0.8776509 0.90625 0.6729488 0.96875 0.8776509 0.9375 0.8776509 0.9375 0.6729487 1 0.6729488 1 0.8776509 0.96875 0.8776509 0.03125 0.6729487 0.0625 0.6729487 0.0625 0.6729487 0.875 0.6729488 0.875 0.6729488 0.84375 0.6729487 0.53125 0.8776509 0.5 0.8776509 0.5 0.8776509 0 0.6729488 0.03125 0.6729487 0.03125 0.6729487 0.84375 0.6729487 0.84375 0.6729487 0.8125 0.6729487 0.5625 0.8776509 0.53125 0.8776509 0.53125 0.8776509 0.8125 0.6729487 0.8125 0.6729487 0.78125 0.6729487 0.59375 0.8776509 0.5625 0.8776509 0.5625 0.8776509 0.78125 0.6729487 0.78125 0.6729487 0.75 0.6729488 0.625 0.8776509 0.59375 0.8776509 0.59375 0.8776509 0.75 0.6729488 0.75 0.6729488 0.71875 0.6729487 0.65625 0.8776509 0.625 0.8776509 0.625 0.8776509 0.71875 0.6729487 0.71875 0.6729487 0.6875 0.6729487 0.6875 0.8776509 0.65625 0.8776509 0.65625 0.8776509 0.6875 0.6729487 0.6875 0.6729487 0.65625 0.6729488 0.71875 0.8776509 0.6875 0.8776509 0.6875 0.8776509 0.65625 0.6729488 0.65625 0.6729488 0.625 0.6729488 0.75 0.8776509 0.71875 0.8776509 0.71875 0.8776509 0.625 0.6729488 0.625 0.6729488 0.59375 0.6729487 0.78125 0.8776509 0.75 0.8776509 0.75 0.8776509 0.59375 0.6729487 0.59375 0.6729487 0.5625 0.6729487 0.8125 0.8776509 0.78125 0.8776509 0.78125 0.8776509 0.5625 0.6729487 0.5625 0.6729487 0.53125 0.6729487 0.84375 0.8776509 0.8125 0.8776509 0.8125 0.8776509 0 0.8776509 0 0.8776509 0.03125 0.8776509 0.53125 0.6729487 0.53125 0.6729487 0.5 0.6729488 0.875 0.8776509 0.84375 0.8776509 0.84375 0.8776509 0.03125 0.8776509 0.03125 0.8776509 0.0625 0.8776509 0.46875 0.6729487 0.5 0.6729488 0.5 0.6729488 0.90625 0.8776509 0.875 0.8776509 0.875 0.8776509 0.0625 0.8776509 0.0625 0.8776509 0.09375 0.8776509 0.4375 0.6729487 0.46875 0.6729487 0.46875 0.6729487
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 65 0 1 64 0 2 3 1 3 66 1 4 65 1 5 5 2 6 67 2 7 66 2 8 7 3 9 68 3 10 67 3 11 9 4 12 69 4 13 68 4 14 11 5 15 70 5 16 69 5 17 13 6 18 71 6 19 70 6 20 15 7 21 72 7 22 71 7 23 17 8 24 73 8 25 72 8 26 19 9 27 74 9 28 73 9 29 21 10 30 75 10 31 74 10 32 23 11 33 76 11 34 75 11 35 25 12 36 77 12 37 76 12 38 27 13 39 78 13 40 77 13 41 29 14 42 79 14 43 78 14 44 31 15 45 80 15 46 79 15 47 33 16 48 81 16 49 80 16 50 35 17 51 82 17 52 81 17 53 37 18 54 83 18 55 82 18 56 39 19 57 84 19 58 83 19 59 41 20 60 85 20 61 84 20 62 43 21 63 86 21 64 85 21 65 45 22 66 87 22 67 86 22 68 47 23 69 88 23 70 87 23 71 49 24 72 89 24 73 88 24 74 51 25 75 90 25 76 89 25 77 53 26 78 91 26 79 90 26 80 55 27 81 92 27 82 91 27 83 57 28 84 93 28 85 92 28 86 59 29 87 94 29 88 93 29 89 37 30 90 21 30 91 5 30 92 61 31 93 95 31 94 94 31 95 63 32 96 64 32 97 95 32 98 30 33 99 46 33 100 62 33 101 81 34 102 145 34 103 80 34 104 98 35 105 164 35 106 99 35 107 125 36 108 189 36 109 190 36 110 82 37 111 144 37 112 81 37 113 97 38 114 163 38 115 98 38 116 124 39 117 188 39 118 189 39 119 83 40 120 143 40 121 82 40 122 96 41 123 162 41 124 97 41 125 123 42 126 187 42 127 188 42 128 84 43 129 142 43 130 83 43 131 127 44 132 161 44 133 96 44 134 122 45 135 186 45 136 187 45 137 85 46 138 141 46 139 84 46 140 121 47 141 185 47 142 186 47 143 86 48 144 140 48 145 85 48 146 120 49 147 184 49 148 185 49 149 87 50 150 139 50 151 86 50 152 119 51 153 183 51 154 184 51 155 88 52 156 138 52 157 87 52 158 118 53 159 182 53 160 183 53 161 89 54 162 137 54 163 88 54 164 117 55 165 181 55 166 182 55 167 90 56 168 136 56 169 89 56 170 116 57 171 180 57 172 181 57 173 91 58 174 135 58 175 90 58 176 64 59 177 160 59 178 129 59 179 115 60 180 179 60 181 180 60 182 92 61 183 134 61 184 91 61 185 65 62 186 159 62 187 160 62 188 114 63 189 178 63 190 179 63 191 93 64 192 133 64 193 92 64 194 66 65 195 158 65 196 159 65 197 0 66 198 96 66 199 2 66 200 2 67 201 97 67 202 4 67 203 4 68 204 98 68 205 6 68 206 6 69 207 99 69 208 8 69 209 8 70 210 100 70 211 10 70 212 10 71 213 101 71 214 12 71 215 12 72 216 102 72 217 14 72 218 14 73 219 103 73 220 16 73 221 103 74 222 18 74 223 16 74 224 104 75 225 20 75 226 18 75 227 105 76 228 22 76 229 20 76 230 106 77 231 24 77 232 22 77 233 107 78 234 26 78 235 24 78 236 108 79 237 28 79 238 26 79 239 109 80 240 30 80 241 28 80 242 110 81 243 32 81 244 30 81 245 111 82 246 34 82 247 32 82 248 112 83 249 36 83 250 34 83 251 113 84 252 38 84 253 36 84 254 114 85 255 40 85 256 38 85 257 115 86 258 42 86 259 40 86 260 116 87 261 44 87 262 42 87 263 117 88 264 46 88 265 44 88 266 118 89 267 48 89 268 46 89 269 48 90 270 120 90 271 50 90 272 50 91 273 121 91 274 52 91 275 52 92 276 122 92 277 54 92 278 54 93 279 123 93 280 56 93 281 56 94 282 124 94 283 58 94 284 58 95 285 125 95 286 60 95 287 60 96 288 126 96 289 62 96 290 62 97 291 127 97 292 0 97 293 126 130 390 190 130 391 191 130 392 99 131 393 165 131 394 100 131 395 79 132 396 145 132 397 146 132 398 127 133 399 191 133 400 128 133 401 100 134 402 166 134 403 101 134 404 78 135 405 146 135 406 147 135 407 101 136 408 167 136 409 102 136 410 77 137 411 147 137 412 148 137 413 102 138 414 168 138 415 103 138 416 76 139 417 148 139 418 149 139 419 103 140 420 169 140 421 104 140 422 75 141 423 149 141 424 150 141 425 104 142 426 170 142 427 105 142 428 74 143 429 150 143 430 151 143 431 105 144 432 171 144 433 106 144 434 73 145 435 151 145 436 152 145 437 106 146 438 172 146 439 107 146 440 72 147 441 152 147 442 153 147 443 107 148 444 173 148 445 108 148 446 71 149 447 153 149 448 154 149 449 108 150 450 174 150 451 109 150 452 70 151 453 154 151 454 155 151 455 109 152 456 175 152 457 110 152 458 69 153 459 155 153 460 156 153 461 64 154 462 130 154 463 95 154 464 110 155 465 176 155 466 111 155 467 68 156 468 156 156 469 157 156 470 95 157 471 131 157 472 94 157 473 112 158 474 176 158 475 177 158 476 67 159 477 157 159 478 158 159 479 94 160 480 132 160 481 93 160 482 113 161 483 177 161 484 178 161 485 1 162 486 3 162 487 65 162 488 3 163 489 5 163 490 66 163 491 5 164 492 7 164 493 67 164 494 7 165 495 9 165 496 68 165 497 9 166 498 11 166 499 69 166 500 11 167 501 13 167 502 70 167 503 13 168 504 15 168 505 71 168 506 15 169 507 17 169 508 72 169 509 17 170 510 19 170 511 73 170 512 19 171 513 21 171 514 74 171 515 21 172 516 23 172 517 75 172 518 23 173 519 25 173 520 76 173 521 25 174 522 27 174 523 77 174 524 27 175 525 29 175 526 78 175 527 29 176 528 31 176 529 79 176 530 31 177 531 33 177 532 80 177 533 33 178 534 35 178 535 81 178 536 35 179 537 37 179 538 82 179 539 37 180 540 39 180 541 83 180 542 39 181 543 41 181 544 84 181 545 41 182 546 43 182 547 85 182 548 43 183 549 45 183 550 86 183 551 45 184 552 47 184 553 87 184 554 47 185 555 49 185 556 88 185 557 49 186 558 51 186 559 89 186 560 51 187 561 53 187 562 90 187 563 53 188 564 55 188 565 91 188 566 55 189 567 57 189 568 92 189 569 57 190 570 59 190 571 93 190 572 59 191 573 61 191 574 94 191 575 5 192 576 3 192 577 1 192 578 1 193 579 63 193 580 5 193 581 63 194 582 61 194 583 5 194 584 61 195 585 59 195 586 57 195 587 57 196 588 55 196 589 53 196 590 53 197 591 51 197 592 49 197 593 49 198 594 47 198 595 53 198 596 47 199 597 45 199 598 53 199 599 45 200 600 43 200 601 41 200 602 41 201 603 39 201 604 37 201 605 37 202 606 35 202 607 29 202 608 35 203 609 33 203 610 29 203 611 33 204 612 31 204 613 29 204 614 29 205 615 27 205 616 25 205 617 25 206 618 23 206 619 21 206 620 21 207 621 19 207 622 13 207 623 19 208 624 17 208 625 13 208 626 17 209 627 15 209 628 13 209 629 13 210 630 11 210 631 9 210 632 9 211 633 7 211 634 5 211 635 61 212 636 57 212 637 5 212 638 57 213 639 53 213 640 5 213 641 45 214 642 41 214 643 53 214 644 41 215 645 37 215 646 53 215 647 29 216 648 25 216 649 37 216 650 25 217 651 21 217 652 37 217 653 13 218 654 9 218 655 21 218 656 9 219 657 5 219 658 21 219 659 5 220 660 53 220 661 37 220 662 61 221 663 63 221 664 95 221 665 63 222 666 1 222 667 64 222 668 62 223 669 0 223 670 2 223 671 2 224 672 4 224 673 62 224 674 4 225 675 6 225 676 62 225 677 6 226 678 8 226 679 10 226 680 10 227 681 12 227 682 14 227 683 14 228 684 16 228 685 18 228 686 18 229 687 20 229 688 14 229 689 20 230 690 22 230 691 14 230 692 22 231 693 24 231 694 26 231 695 26 232 696 28 232 697 30 232 698 30 233 699 32 233 700 34 233 701 34 234 702 36 234 703 30 234 704 36 235 705 38 235 706 30 235 707 38 236 708 40 236 709 42 236 710 42 237 711 44 237 712 38 237 713 44 238 714 46 238 715 38 238 716 46 239 717 48 239 718 50 239 719 50 240 720 52 240 721 46 240 722 52 241 723 54 241 724 46 241 725 54 242 726 56 242 727 58 242 728 58 243 729 60 243 730 62 243 731 6 244 732 10 244 733 14 244 734 22 245 735 26 245 736 14 245 737 26 246 738 30 246 739 14 246 740 54 247 741 58 247 742 46 247 743 58 248 744 62 248 745 46 248 746 62 249 747 6 249 748 14 249 749 30 250 750 38 250 751 46 250 752 62 251 753 14 251 754 30 251 755 81 252 756 144 252 757 145 252 758 98 253 759 163 253 760 164 253 761 125 254 762 124 254 763 189 254 764 82 255 765 143 255 766 144 255 767 97 256 768 162 256 769 163 256 770 124 257 771 123 257 772 188 257 773 83 258 774 142 258 775 143 258 776 96 259 777 161 259 778 162 259 779 123 260 780 122 260 781 187 260 782 84 261 783 141 261 784 142 261 785 127 262 786 128 262 787 161 262 788 122 263 789 121 263 790 186 263 791 85 264 792 140 264 793 141 264 794 121 265 795 120 265 796 185 265 797 86 266 798 139 266 799 140 266 800 120 267 801 119 267 802 184 267 803 87 268 804 138 268 805 139 268 806 119 269 807 118 269 808 183 269 809 88 270 810 137 270 811 138 270 812 118 271 813 117 271 814 182 271 815 89 272 816 136 272 817 137 272 818 117 273 819 116 273 820 181 273 821 90 274 822 135 274 823 136 274 824 116 275 825 115 275 826 180 275 827 91 276 828 134 276 829 135 276 830 64 277 831 65 277 832 160 277 833 115 278 834 114 278 835 179 278 836 92 279 837 133 279 838 134 279 839 65 280 840 66 280 841 159 280 842 114 281 843 113 281 844 178 281 845 93 282 846 132 282 847 133 282 848 66 283 849 67 283 850 158 283 851 0 284 852 127 284 853 96 284 854 2 285 855 96 285 856 97 285 857 4 286 858 97 286 859 98 286 860 6 287 861 98 287 862 99 287 863 8 288 864 99 288 865 100 288 866 10 289 867 100 289 868 101 289 869 12 290 870 101 290 871 102 290 872 14 291 873 102 291 874 103 291 875 103 292 876 104 292 877 18 292 878 104 293 879 105 293 880 20 293 881 105 294 882 106 294 883 22 294 884 106 295 885 107 295 886 24 295 887 107 296 888 108 296 889 26 296 890 108 297 891 109 297 892 28 297 893 109 298 894 110 298 895 30 298 896 110 299 897 111 299 898 32 299 899 111 300 900 112 300 901 34 300 902 112 301 903 113 301 904 36 301 905 113 302 906 114 302 907 38 302 908 114 303 909 115 303 910 40 303 911 115 304 912 116 304 913 42 304 914 116 305 915 117 305 916 44 305 917 117 306 918 118 306 919 46 306 920 118 307 921 119 307 922 48 307 923 48 308 924 119 308 925 120 308 926 50 309 927 120 309 928 121 309 929 52 310 930 121 310 931 122 310 932 54 311 933 122 311 934 123 311 935 56 312 936 123 312 937 124 312 938 58 313 939 124 313 940 125 313 941 60 314 942 125 314 943 126 314 944 62 315 945 126 315 946 127 315 947 126 348 1044 125 348 1045 190 348 1046 99 349 1047 164 349 1048 165 349 1049 79 350 1050 80 350 1051 145 350 1052 127 351 1053 126 351 1054 191 351 1055 100 352 1056 165 352 1057 166 352 1058 78 353 1059 79 353 1060 146 353 1061 101 354 1062 166 354 1063 167 354 1064 77 355 1065 78 355 1066 147 355 1067 102 356 1068 167 356 1069 168 356 1070 76 357 1071 77 357 1072 148 357 1073 103 358 1074 168 358 1075 169 358 1076 75 359 1077 76 359 1078 149 359 1079 104 360 1080 169 360 1081 170 360 1082 74 361 1083 75 361 1084 150 361 1085 105 362 1086 170 362 1087 171 362 1088 73 363 1089 74 363 1090 151 363 1091 106 364 1092 171 364 1093 172 364 1094 72 365 1095 73 365 1096 152 365 1097 107 366 1098 172 366 1099 173 366 1100 71 367 1101 72 367 1102 153 367 1103 108 368 1104 173 368 1105 174 368 1106 70 369 1107 71 369 1108 154 369 1109 109 370 1110 174 370 1111 175 370 1112 69 371 1113 70 371 1114 155 371 1115 64 372 1116 129 372 1117 130 372 1118 110 373 1119 175 373 1120 176 373 1121 68 374 1122 69 374 1123 156 374 1124 95 375 1125 130 375 1126 131 375 1127 112 376 1128 111 376 1129 176 376 1130 67 377 1131 68 377 1132 157 377 1133 94 378 1134 131 378 1135 132 378 1136 113 379 1137 112 379 1138 177 379 1139
+
+
+
+
+
+ 130 98 294 128 98 295 191 98 296 131 99 297 191 99 298 190 99 299 132 100 300 190 100 301 189 100 302 133 101 303 189 101 304 188 101 305 134 102 306 188 102 307 187 102 308 135 103 309 187 103 310 186 103 311 136 104 312 186 104 313 185 104 314 137 105 315 185 105 316 184 105 317 138 106 318 184 106 319 183 106 320 139 107 321 183 107 322 182 107 323 140 108 324 182 108 325 181 108 326 141 109 327 181 109 328 180 109 329 142 110 330 180 110 331 179 110 332 143 111 333 179 111 334 178 111 335 144 112 336 178 112 337 177 112 338 145 113 339 177 113 340 176 113 341 146 114 342 176 114 343 175 114 344 147 115 345 175 115 346 174 115 347 148 116 348 174 116 349 173 116 350 149 117 351 173 117 352 172 117 353 150 118 354 172 118 355 171 118 356 151 119 357 171 119 358 170 119 359 152 120 360 170 120 361 169 120 362 153 121 363 169 121 364 168 121 365 154 122 366 168 122 367 167 122 368 155 123 369 167 123 370 166 123 371 156 124 372 166 124 373 165 124 374 157 125 375 165 125 376 164 125 377 158 126 378 164 126 379 163 126 380 159 127 381 163 127 382 162 127 383 160 128 384 162 128 385 161 128 386 128 129 387 160 129 388 161 129 389 130 316 948 129 316 949 128 316 950 131 317 951 130 317 952 191 317 953 132 318 954 131 318 955 190 318 956 133 319 957 132 319 958 189 319 959 134 320 960 133 320 961 188 320 962 135 321 963 134 321 964 187 321 965 136 322 966 135 322 967 186 322 968 137 323 969 136 323 970 185 323 971 138 324 972 137 324 973 184 324 974 139 325 975 138 325 976 183 325 977 140 326 978 139 326 979 182 326 980 141 327 981 140 327 982 181 327 983 142 328 984 141 328 985 180 328 986 143 329 987 142 329 988 179 329 989 144 330 990 143 330 991 178 330 992 145 331 993 144 331 994 177 331 995 146 332 996 145 332 997 176 332 998 147 333 999 146 333 1000 175 333 1001 148 334 1002 147 334 1003 174 334 1004 149 335 1005 148 335 1006 173 335 1007 150 336 1008 149 336 1009 172 336 1010 151 337 1011 150 337 1012 171 337 1013 152 338 1014 151 338 1015 170 338 1016 153 339 1017 152 339 1018 169 339 1019 154 340 1020 153 340 1021 168 340 1022 155 341 1023 154 341 1024 167 341 1025 156 342 1026 155 342 1027 166 342 1028 157 343 1029 156 343 1030 165 343 1031 158 344 1032 157 344 1033 164 344 1034 159 345 1035 158 345 1036 163 345 1037 160 346 1038 159 346 1039 162 346 1040 128 347 1041 129 347 1042 160 347 1043
+
+
+
+
+
+
+ 4.62388e-7 1.242424 -0.9999986 0 1 1 0.2423855 1.218552 -0.9999986 0.1950903 0.9807853 1 0.4754558 1.14785 -0.9999986 0.3826835 0.9238795 1 0.6902546 1.033038 -0.9999986 0.5555703 0.8314696 1 0.8785272 0.8785268 -0.9999986 0.7071068 0.7071068 1 1.033039 0.6902541 -0.9999986 0.8314696 0.5555703 1 1.147851 0.4754553 -0.9999986 0.9238795 0.3826835 1 1.218552 0.242385 -0.9999986 0.9807853 0.1950903 1 1.242425 0 -0.9999986 1 0 1 1.218552 -0.242385 -0.9999986 0.9807853 -0.1950903 1 1.147851 -0.4754553 -0.9999986 0.9238795 -0.3826835 1 1.033039 -0.6902541 -0.9999986 0.8314696 -0.5555703 1 0.8785272 -0.8785268 -0.9999986 0.7071068 -0.7071068 1 0.6902546 -1.033038 -0.9999986 0.5555703 -0.8314696 1 0.4754558 -1.14785 -0.9999986 0.3826835 -0.9238795 1 0.2423855 -1.218552 -0.9999986 0.1950903 -0.9807853 1 4.62388e-7 -1.242424 -0.9999986 0 -1 1 -0.2423845 -1.218552 -0.9999986 -0.1950903 -0.9807853 1 -0.4754548 -1.14785 -0.9999986 -0.3826835 -0.9238795 1 -0.6902536 -1.033038 -0.9999986 -0.5555703 -0.8314696 1 -0.8785263 -0.8785268 -0.9999986 -0.7071068 -0.7071068 1 -1.033038 -0.6902541 -0.9999986 -0.8314696 -0.5555703 1 -1.14785 -0.4754553 -0.9999986 -0.9238795 -0.3826835 1 -1.218551 -0.242385 -0.9999986 -0.9807853 -0.1950903 1 -1.242424 0 -0.9999986 -1 0 1 -1.218551 0.242385 -0.9999986 -0.9807853 0.1950903 1 -1.14785 0.4754553 -0.9999986 -0.9238795 0.3826835 1 -1.033038 0.6902541 -0.9999986 -0.8314696 0.5555703 1 -0.8785263 0.8785268 -0.9999986 -0.7071068 0.7071068 1 -0.6902536 1.033038 -0.9999986 -0.5555703 0.8314696 1 -0.4754548 1.14785 -0.9999986 -0.3826835 0.9238795 1 -0.2423845 1.218552 -0.9999986 -0.1950903 0.9807853 1 0 1 0.5106036 0.1950903 0.9807853 0.5106036 0.3826835 0.9238795 0.5106036 0.5555703 0.8314696 0.5106036 0.7071068 0.7071068 0.5106036 0.8314696 0.5555703 0.5106036 0.9238795 0.3826835 0.5106036 0.9807853 0.1950903 0.5106036 1 0 0.5106036 0.9807853 -0.1950903 0.5106036 0.9238795 -0.3826835 0.5106036 0.8314696 -0.5555703 0.5106036 0.7071068 -0.7071068 0.5106036 0.5555703 -0.8314696 0.5106036 0.3826835 -0.9238795 0.5106036 0.1950903 -0.9807853 0.5106036 0 -1 0.5106036 -0.1950903 -0.9807853 0.5106036 -0.3826835 -0.9238795 0.5106036 -0.5555703 -0.8314696 0.5106036 -0.7071068 -0.7071068 0.5106036 -0.8314696 -0.5555703 0.5106036 -0.9238795 -0.3826835 0.5106036 -0.9807853 -0.1950903 0.5106036 -1 0 0.5106036 -0.9807853 0.1950903 0.5106036 -0.9238795 0.3826835 0.5106036 -0.8314696 0.5555703 0.5106036 -0.7071068 0.7071068 0.5106036 -0.5555703 0.8314696 0.5106036 -0.3826835 0.9238795 0.5106036 -0.1950903 0.9807853 0.5106036 0.1950903 0.9807853 -0.308205 0.3826835 0.9238795 -0.308205 0.5555703 0.8314696 -0.308205 0.7071068 0.7071068 -0.308205 0.8314696 0.5555703 -0.308205 0.9238795 0.3826835 -0.308205 0.9807853 0.1950903 -0.308205 1 0 -0.308205 0.9807853 -0.1950903 -0.308205 0.9238795 -0.3826835 -0.308205 0.8314696 -0.5555703 -0.308205 0.7071068 -0.7071068 -0.308205 0.5555703 -0.8314696 -0.308205 0.3826835 -0.9238795 -0.308205 0.1950903 -0.9807853 -0.308205 0 -1 -0.308205 -0.1950903 -0.9807853 -0.308205 -0.3826835 -0.9238795 -0.308205 -0.5555703 -0.8314696 -0.308205 -0.7071068 -0.7071068 -0.308205 -0.8314696 -0.5555703 -0.308205 -0.9238795 -0.3826835 -0.308205 -0.9807853 -0.1950903 -0.308205 -1 0 -0.308205 -0.9807853 0.1950903 -0.308205 -0.9238795 0.3826835 -0.308205 -0.8314696 0.5555703 -0.308205 -0.7071068 0.7071068 -0.308205 -0.5555703 0.8314696 -0.308205 -0.3826835 0.9238795 -0.308205 -0.1950903 0.9807853 -0.308205 0 1 -0.3082049 2.29839e-7 0.8795036 -0.2588687 2.29839e-7 0.8795036 0.4612718 -0.1715813 0.8626043 0.4612718 -0.3365691 0.8125557 0.4612718 -0.4886227 0.7312814 0.4612718 -0.6218988 0.6219046 0.4612718 -0.7312757 0.4886285 0.4612718 -0.81255 0.3365749 0.4612718 -0.8625985 0.1715871 0.4612718 -0.8794978 5.51614e-6 0.4612718 -0.8625985 -0.171576 0.4612718 -0.81255 -0.3365638 0.4612718 -0.7312757 -0.4886174 0.4612718 -0.6218988 -0.6218935 0.4612718 -0.4886227 -0.7312704 0.4612718 -0.3365691 -0.8125447 0.4612718 -0.1715813 -0.8625932 0.4612718 2.29839e-7 -0.8794925 0.4612718 0.1715818 -0.8625932 0.4612718 0.3365696 -0.8125447 0.4612718 0.4886232 -0.7312704 0.4612718 0.6218993 -0.6218935 0.4612718 0.7312762 -0.4886174 0.4612718 0.8125505 -0.3365638 0.4612718 0.862599 -0.171576 0.4612718 0.8794983 5.51614e-6 0.4612718 0.862599 0.1715871 0.4612718 0.8125505 0.3365749 0.4612718 0.7312762 0.4886285 0.4612718 0.6218993 0.6219046 0.4612718 0.4886232 0.7312814 0.4612718 0.3365696 0.8125557 0.4612718 0.1715818 0.8626043 0.4612718 0.1715818 0.8626043 -0.2588688 0.3365696 0.8125557 -0.2588688 0.4886232 0.7312814 -0.2588688 0.6218993 0.6219046 -0.2588688 0.7312762 0.4886285 -0.2588688 0.8125505 0.3365749 -0.2588688 0.862599 0.1715871 -0.2588688 0.8794983 5.51614e-6 -0.2588688 0.862599 -0.171576 -0.2588688 0.8125505 -0.3365638 -0.2588688 0.7312762 -0.4886174 -0.2588688 0.6218993 -0.6218935 -0.2588688 0.4886232 -0.7312704 -0.2588688 0.3365696 -0.8125447 -0.2588688 0.1715818 -0.8625932 -0.2588688 2.29839e-7 -0.8794925 -0.2588688 -0.1715813 -0.8625932 -0.2588688 -0.3365691 -0.8125447 -0.2588688 -0.4886227 -0.7312704 -0.2588688 -0.6218988 -0.6218935 -0.2588688 -0.7312757 -0.4886174 -0.2588688 -0.81255 -0.3365638 -0.2588688 -0.8625985 -0.171576 -0.2588688 -0.8794978 5.51614e-6 -0.2588688 -0.8625985 0.1715871 -0.2588688 -0.81255 0.3365749 -0.2588688 -0.7312757 0.4886285 -0.2588688 -0.6218988 0.6219046 -0.2588688 -0.4886227 0.7312814 -0.2588688 -0.3365691 0.8125557 -0.2588688 -0.1715813 0.8626043 -0.2588688
+
+
+
+
+
+
+
+
+
+ 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713968 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713968 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713968 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713968 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713968 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713968 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713968 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713968 0.8819213 0 0 0 1 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 0 0 -1 -0.03728777 -0.3785886 -0.9248137 0.2413713 0.2941118 0.9247909 -0.1793555 0.3355506 0.9247905 -0.1104304 -0.3640402 -0.9248135 0.1793558 0.335551 0.9247902 -0.2413708 0.2941113 0.9247912 -0.1793296 -0.3355022 -0.924813 0.110447 0.3640951 0.9247898 -0.2941096 0.2413695 0.924792 -0.2413381 -0.2940713 -0.9248124 0.03729379 0.3786468 0.9247896 -0.335545 0.1793525 0.9247931 -0.2940729 -0.2413393 -0.9248116 -0.3640849 0.1104438 0.9247942 -0.3355074 -0.1793324 -0.9248105 -0.3786327 0.03729212 0.9247955 -0.3640493 -0.1104331 -0.9248095 -0.3786298 -0.03729182 0.9247966 -0.3786014 -0.03728902 -0.9248084 -0.3640766 -0.1104413 0.9247978 -0.3786043 0.03728932 -0.9248071 -0.3355326 -0.1793459 0.9247989 -0.3640576 0.1104356 -0.924806 -0.2940949 -0.2413575 0.9247998 -0.3355199 0.1793391 -0.9248048 0.03729075 0.3786185 -0.9248014 -0.2413561 -0.2940934 0.9248007 -0.2940875 0.2413514 -0.9248037 0.1104388 0.364068 -0.9248015 -0.1793431 -0.3355273 0.9248014 -0.2413528 0.2940892 -0.9248029 0.1793423 0.335526 -0.924802 0.09255057 0.9396815 0.3292916 0.2740951 0.9035701 0.3292917 0.4451062 0.8327349 0.3292918 0.5990121 0.7298982 0.3292919 0.7298982 0.5990121 0.3292919 0.8327348 0.4451061 0.3292921 0.9035699 0.2740951 0.3292921 0.9396814 0.09255057 0.3292921 0.9396814 -0.09255057 0.3292921 0.9035699 -0.274095 0.3292921 0.8327348 -0.4451061 0.329292 0.7298982 -0.5990121 0.3292919 0.5990121 -0.7298982 0.3292919 0.4451062 -0.8327349 0.3292918 0.2740951 -0.9035701 0.3292917 0.09255057 -0.9396815 0.3292917 -0.09255057 -0.9396816 0.3292915 -0.2740951 -0.9035702 0.3292915 -0.4451063 -0.8327351 0.3292913 -0.5990121 -0.7298985 0.3292912 -0.7298983 -0.5990123 0.3292911 -0.8327353 -0.4451059 0.3292911 -0.9035702 -0.2740951 0.329291 -0.9396818 -0.09255063 0.329291 -0.9396818 0.09255063 0.329291 -0.9035702 0.2740951 0.329291 -0.8327353 0.4451059 0.3292911 -0.7298983 0.5990123 0.3292911 -0.5990121 0.7298985 0.3292912 -0.4451063 0.8327351 0.3292913 -0.2740951 0.9035702 0.3292914 -0.09255063 0.9396816 0.3292915 -0.09801733 0.9951847 0 -0.2902848 0.9569403 0 -0.4713967 0.8819213 0 -0.6343932 0.7730106 0 -0.7730104 0.6343933 0 -0.8819213 0.4713967 0 -0.9569404 0.2902845 0 -0.9951847 0.09801733 0 -0.9951847 -0.09801733 0 -0.9569404 -0.2902845 0 -0.8819213 -0.4713967 0 -0.7730104 -0.6343933 0 -0.6343932 -0.7730106 0 -0.4713967 -0.8819213 0 -0.2902848 -0.9569403 0 -0.09801703 -0.9951848 0 0.09801697 -0.9951848 0 0.2902848 -0.9569403 0 0.4713967 -0.8819213 0 0.6343933 -0.7730104 0 0.7730103 -0.6343935 0 0.8819213 -0.4713967 0 0.9569404 -0.2902845 0 0.9951847 -0.09801733 0 0.9951847 0.09801733 0 0.9569404 0.2902845 0 0.8819213 0.4713967 0 0.7730103 0.6343935 0 0.6343933 0.7730104 0 0.4713967 0.8819213 0 0.2902848 0.9569403 0 0.09801733 0.9951847 0 -0.110447 0.3640948 0.9247899 0.2941103 0.2413702 0.9247917 0.03728765 -0.3785889 -0.9248136 -0.03729385 0.3786467 0.9247896 0.335546 0.1793531 0.9247926 0.1104305 -0.3640404 -0.9248133 0.364086 0.1104443 0.9247937 0.1793299 -0.3355027 -0.9248129 0.378634 0.03729224 0.9247949 0.2413386 -0.2940719 -0.9248121 0.3786311 -0.03729194 0.9247961 0.2940736 -0.2413401 -0.9248112 0.3640778 -0.1104418 0.9247972 0.3355084 -0.1793329 -0.9248101 0.3355336 -0.1793464 0.9247984 0.3640505 -0.1104334 -0.924809 0.2940956 -0.241358 0.9247995 0.3786027 -0.0372892 -0.9248078 0.2413566 -0.2940939 0.9248004 0.3786056 0.03728944 -0.9248067 0.1793433 -0.3355278 0.9248011 0.3640588 0.110436 -0.9248054 0.1104387 -0.3640678 0.9248015 0.3355209 0.1793396 -0.9248043 -0.03729069 0.3786183 -0.9248014 0.03729057 -0.3786171 0.9248019 0.2940882 0.241352 -0.9248034 -0.1104386 0.3640675 -0.9248017 -0.03729045 -0.3786171 0.9248019 0.2413532 0.2940897 -0.9248026 -0.179342 0.3355255 -0.9248022 -0.1104387 -0.3640673 0.9248018 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713968 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713968 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713968 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713968 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713968 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713968 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713968 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713968 0.8819213 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.03728765 -0.3785887 -0.9248136 0.2413713 0.2941118 0.9247908 -0.1793555 0.3355506 0.9247905 -0.1104304 -0.36404 -0.9248135 0.1793558 0.3355511 0.9247903 -0.2413709 0.2941113 0.9247912 -0.1793296 -0.3355022 -0.924813 0.1104471 0.3640952 0.9247897 -0.2941096 0.2413695 0.9247921 -0.2413381 -0.2940714 -0.9248123 0.03729385 0.3786469 0.9247896 -0.335545 0.1793525 0.9247931 -0.2940729 -0.2413393 -0.9248116 -0.3640848 0.1104439 0.9247942 -0.3355074 -0.1793324 -0.9248106 -0.3786327 0.03729212 0.9247954 -0.3640492 -0.1104331 -0.9248095 -0.3786298 -0.03729182 0.9247967 -0.3786014 -0.03728902 -0.9248084 -0.3640766 -0.1104414 0.9247978 -0.3786043 0.03728932 -0.9248072 -0.3355326 -0.1793459 0.9247989 -0.3640576 0.1104356 -0.9248059 -0.2940949 -0.2413575 0.9247999 -0.3355199 0.1793391 -0.9248049 0.03729069 0.3786185 -0.9248014 -0.2413561 -0.2940933 0.9248007 -0.2940876 0.2413514 -0.9248037 0.1104387 0.3640679 -0.9248016 -0.1793431 -0.3355273 0.9248014 -0.2413527 0.2940892 -0.9248028 0.1793423 0.3355259 -0.924802 0.09255081 0.9396816 0.3292916 0.2740949 0.9035701 0.3292918 0.4451061 0.832735 0.3292918 0.599012 0.7298982 0.3292919 0.7298982 0.599012 0.329292 0.8327349 0.445106 0.329292 0.9035699 0.2740949 0.3292921 0.9396814 0.09255069 0.3292922 0.9396814 -0.09255069 0.3292922 0.9035699 -0.2740949 0.3292921 0.8327349 -0.445106 0.329292 0.7298982 -0.599012 0.329292 0.599012 -0.7298982 0.3292919 0.4451061 -0.832735 0.3292918 0.2740949 -0.9035701 0.3292918 0.09255069 -0.9396816 0.3292917 -0.09255069 -0.9396816 0.3292915 -0.2740949 -0.9035702 0.3292914 -0.4451062 -0.8327351 0.3292912 -0.5990122 -0.7298984 0.3292912 -0.7298984 -0.5990122 0.3292912 -0.8327351 -0.4451062 0.329291 -0.9035703 -0.274095 0.329291 -0.9396818 -0.09255069 0.329291 -0.9396818 0.09255069 0.329291 -0.9035703 0.274095 0.329291 -0.8327351 0.4451062 0.329291 -0.7298984 0.5990122 0.3292912 -0.5990122 0.7298984 0.3292912 -0.4451062 0.8327351 0.3292912 -0.2740949 0.9035702 0.3292914 -0.09255075 0.9396816 0.3292915 -0.09801733 0.9951847 0 -0.2902848 0.9569403 0 -0.4713967 0.8819213 0 -0.6343932 0.7730106 0 -0.7730104 0.6343933 0 -0.8819213 0.4713967 0 -0.9569404 0.2902845 0 -0.9951847 0.09801733 0 -0.9951847 -0.09801733 0 -0.9569404 -0.2902845 0 -0.8819213 -0.4713967 0 -0.7730104 -0.6343933 0 -0.6343932 -0.7730106 0 -0.4713967 -0.8819213 0 -0.2902848 -0.9569403 0 -0.09801703 -0.9951848 0 0.09801697 -0.9951848 0 0.2902848 -0.9569403 0 0.4713967 -0.8819213 0 0.6343933 -0.7730104 0 0.7730103 -0.6343935 0 0.8819213 -0.4713967 0 0.9569404 -0.2902845 0 0.9951847 -0.09801733 0 0.9951847 0.09801733 0 0.9569404 0.2902845 0 0.8819213 0.4713967 0 0.7730103 0.6343935 0 0.6343933 0.7730104 0 0.4713967 0.8819213 0 0.2902848 0.9569403 0 0.09801733 0.9951847 0 -0.1104469 0.3640947 0.92479 0.2941102 0.2413701 0.9247916 0.03728777 -0.3785887 -0.9248136 -0.03729373 0.3786466 0.9247897 0.335546 0.179353 0.9247927 0.1104304 -0.3640406 -0.9248133 0.3640861 0.1104443 0.9247937 0.1793299 -0.3355026 -0.9248128 0.3786339 0.03729224 0.9247949 0.2413386 -0.2940719 -0.9248121 0.3786311 -0.03729194 0.9247961 0.2940735 -0.2413399 -0.9248112 0.3640778 -0.1104417 0.9247974 0.3355084 -0.179333 -0.9248101 0.3355336 -0.1793464 0.9247984 0.3640505 -0.1104335 -0.924809 0.2940956 -0.2413582 0.9247995 0.3786027 -0.03728914 -0.9248079 0.2413567 -0.294094 0.9248004 0.3786056 0.03728944 -0.9248066 0.1793433 -0.3355278 0.9248011 0.3640587 0.110436 -0.9248055 0.1104388 -0.3640677 0.9248016 0.3355208 0.1793396 -0.9248043 -0.03729069 0.3786184 -0.9248014 0.03729045 -0.3786172 0.9248019 0.2940883 0.241352 -0.9248033 -0.1104387 0.3640675 -0.9248016 -0.03729057 -0.3786169 0.924802 0.2413532 0.2940898 -0.9248026 -0.179342 0.3355255 -0.9248022 -0.1104386 -0.3640674 0.9248017
+
+
+
+
+
+
+
+
+
+ 1 1 0.96875 0.8776509 1 0.8776509 0.96875 1 0.9375 0.8776509 0.96875 0.8776509 0.9375 1 0.90625 0.8776509 0.9375 0.8776509 0.90625 1 0.875 0.8776509 0.90625 0.8776509 0.875 1 0.84375 0.8776509 0.875 0.8776509 0.84375 1 0.8125 0.8776509 0.84375 0.8776509 0.8125 1 0.78125 0.8776509 0.8125 0.8776509 0.78125 1 0.75 0.8776509 0.78125 0.8776509 0.75 1 0.71875 0.8776509 0.75 0.8776509 0.71875 1 0.6875 0.8776509 0.71875 0.8776509 0.6875 1 0.65625 0.8776509 0.6875 0.8776509 0.65625 1 0.625 0.8776509 0.65625 0.8776509 0.625 1 0.59375 0.8776509 0.625 0.8776509 0.59375 1 0.5625 0.8776509 0.59375 0.8776509 0.5625 1 0.53125 0.8776509 0.5625 0.8776509 0.53125 1 0.5 0.8776509 0.53125 0.8776509 0.5 1 0.46875 0.8776509 0.5 0.8776509 0.46875 1 0.4375 0.8776509 0.46875 0.8776509 0.4375 1 0.40625 0.8776509 0.4375 0.8776509 0.40625 1 0.375 0.8776509 0.40625 0.8776509 0.375 1 0.34375 0.8776509 0.375 0.8776509 0.34375 1 0.3125 0.8776509 0.34375 0.8776509 0.3125 1 0.28125 0.8776509 0.3125 0.8776509 0.28125 1 0.25 0.8776509 0.28125 0.8776509 0.25 1 0.21875 0.8776509 0.25 0.8776509 0.21875 1 0.1875 0.8776509 0.21875 0.8776509 0.1875 1 0.15625 0.8776509 0.1875 0.8776509 0.15625 1 0.125 0.8776509 0.15625 0.8776509 0.125 1 0.09375 0.8776509 0.125 0.8776509 0.09375 1 0.0625 0.8776509 0.09375 0.8776509 0.1581559 0.02826887 0.4717311 0.1581559 0.341844 0.4717311 0.0625 1 0.03125 0.8776509 0.0625 0.8776509 0.03125 1 0 0.8776509 0.03125 0.8776509 0.7968217 0.01461154 0.5146116 0.2031783 0.7031784 0.4853885 0.46875 0.8776509 0.5 0.8776509 0.5 0.8776509 0.90625 0.6729488 0.875 0.6729488 0.875 0.6729488 0.0625 0.6729487 0.09375 0.6729487 0.0625 0.6729487 0.4375 0.8776509 0.46875 0.8776509 0.46875 0.8776509 0.9375 0.6729487 0.90625 0.6729488 0.90625 0.6729488 0.09375 0.6729487 0.125 0.6729488 0.09375 0.6729487 0.40625 0.8776509 0.4375 0.8776509 0.4375 0.8776509 0.96875 0.6729487 0.9375 0.6729487 0.9375 0.6729487 0.125 0.6729488 0.15625 0.6729488 0.125 0.6729488 0.375 0.8776509 0.40625 0.8776509 0.40625 0.8776509 1 0.6729488 0.96875 0.6729487 0.96875 0.6729487 0.15625 0.6729488 0.1875 0.6729487 0.15625 0.6729488 0.34375 0.8776509 0.375 0.8776509 0.375 0.8776509 0.1875 0.6729487 0.21875 0.6729487 0.1875 0.6729487 0.3125 0.8776509 0.34375 0.8776509 0.34375 0.8776509 0.21875 0.6729487 0.25 0.6729488 0.21875 0.6729487 0.28125 0.8776509 0.3125 0.8776509 0.3125 0.8776509 0.25 0.6729488 0.28125 0.6729487 0.25 0.6729488 0.25 0.8776509 0.28125 0.8776509 0.28125 0.8776509 0.28125 0.6729487 0.3125 0.6729487 0.28125 0.6729487 0.21875 0.8776509 0.25 0.8776509 0.25 0.8776509 0.3125 0.6729487 0.34375 0.6729487 0.3125 0.6729487 0.1875 0.8776509 0.21875 0.8776509 0.21875 0.8776509 0.34375 0.6729487 0.375 0.6729488 0.34375 0.6729487 0.15625 0.8776509 0.1875 0.8776509 0.1875 0.8776509 1 0.8776509 0.96875 0.8776509 1 0.8776509 0.375 0.6729488 0.40625 0.6729488 0.375 0.6729488 0.125 0.8776509 0.15625 0.8776509 0.15625 0.8776509 0.96875 0.8776509 0.9375 0.8776509 0.96875 0.8776509 0.40625 0.6729488 0.4375 0.6729487 0.40625 0.6729488 0.09375 0.8776509 0.125 0.8776509 0.125 0.8776509 0.9375 0.8776509 0.90625 0.8776509 0.9375 0.8776509 1 0.5 0.96875 0.6729487 0.96875 0.5 0.96875 0.5 0.9375 0.6729487 0.9375 0.5 0.9375 0.5 0.90625 0.6729488 0.90625 0.5 0.90625 0.5 0.875 0.6729488 0.875 0.5 0.875 0.5 0.84375 0.6729487 0.84375 0.5 0.84375 0.5 0.8125 0.6729487 0.8125 0.5 0.8125 0.5 0.78125 0.6729487 0.78125 0.5 0.78125 0.5 0.75 0.6729488 0.75 0.5 0.75 0.6729488 0.71875 0.5 0.75 0.5 0.71875 0.6729487 0.6875 0.5 0.71875 0.5 0.6875 0.6729487 0.65625 0.5 0.6875 0.5 0.65625 0.6729488 0.625 0.5 0.65625 0.5 0.625 0.6729488 0.59375 0.5 0.625 0.5 0.59375 0.6729487 0.5625 0.5 0.59375 0.5 0.5625 0.6729487 0.53125 0.5 0.5625 0.5 0.53125 0.6729487 0.5 0.5 0.53125 0.5 0.5 0.6729488 0.46875 0.5 0.5 0.5 0.46875 0.6729487 0.4375 0.5 0.46875 0.5 0.4375 0.6729487 0.40625 0.5 0.4375 0.5 0.40625 0.6729488 0.375 0.5 0.40625 0.5 0.375 0.6729488 0.34375 0.5 0.375 0.5 0.34375 0.6729487 0.3125 0.5 0.34375 0.5 0.3125 0.6729487 0.28125 0.5 0.3125 0.5 0.28125 0.6729487 0.25 0.5 0.28125 0.5 0.25 0.5 0.21875 0.6729487 0.21875 0.5 0.21875 0.5 0.1875 0.6729487 0.1875 0.5 0.1875 0.5 0.15625 0.6729488 0.15625 0.5 0.15625 0.5 0.125 0.6729488 0.125 0.5 0.125 0.5 0.09375 0.6729487 0.09375 0.5 0.09375 0.5 0.0625 0.6729487 0.0625 0.5 0.0625 0.5 0.03125 0.6729487 0.03125 0.5 0.03125 0.5 0 0.6729488 0 0.5 0.03125 0.8776509 0 0.6729488 0.03125 0.6729487 0.0625 0.8776509 0.03125 0.6729487 0.0625 0.6729487 0.09375 0.8776509 0.0625 0.6729487 0.09375 0.6729487 0.125 0.8776509 0.09375 0.6729487 0.125 0.6729488 0.15625 0.8776509 0.125 0.6729488 0.15625 0.6729488 0.1875 0.8776509 0.15625 0.6729488 0.1875 0.6729487 0.21875 0.8776509 0.1875 0.6729487 0.21875 0.6729487 0.25 0.8776509 0.21875 0.6729487 0.25 0.6729488 0.28125 0.8776509 0.25 0.6729488 0.28125 0.6729487 0.3125 0.8776509 0.28125 0.6729487 0.3125 0.6729487 0.34375 0.8776509 0.3125 0.6729487 0.34375 0.6729487 0.375 0.8776509 0.34375 0.6729487 0.375 0.6729488 0.40625 0.8776509 0.375 0.6729488 0.40625 0.6729488 0.4375 0.8776509 0.40625 0.6729488 0.4375 0.6729487 0.46875 0.8776509 0.4375 0.6729487 0.46875 0.6729487 0.5 0.8776509 0.46875 0.6729487 0.5 0.6729488 0.53125 0.8776509 0.5 0.6729488 0.53125 0.6729487 0.5625 0.8776509 0.53125 0.6729487 0.5625 0.6729487 0.59375 0.8776509 0.5625 0.6729487 0.59375 0.6729487 0.625 0.8776509 0.59375 0.6729487 0.625 0.6729488 0.65625 0.8776509 0.625 0.6729488 0.65625 0.6729488 0.6875 0.8776509 0.65625 0.6729488 0.6875 0.6729487 0.71875 0.8776509 0.6875 0.6729487 0.71875 0.6729487 0.75 0.8776509 0.71875 0.6729487 0.75 0.6729488 0.78125 0.8776509 0.75 0.6729488 0.78125 0.6729487 0.8125 0.8776509 0.78125 0.6729487 0.8125 0.6729487 0.84375 0.8776509 0.8125 0.6729487 0.84375 0.6729487 0.875 0.8776509 0.84375 0.6729487 0.875 0.6729488 0.90625 0.8776509 0.875 0.6729488 0.90625 0.6729488 0.9375 0.8776509 0.90625 0.6729488 0.9375 0.6729487 0.96875 0.8776509 0.9375 0.6729487 0.96875 0.6729487 1 0.6729488 0.96875 0.8776509 0.96875 0.6729487 0.03125 0.6729487 0.0625 0.6729487 0.03125 0.6729487 0.875 0.6729488 0.84375 0.6729487 0.84375 0.6729487 0.53125 0.8776509 0.5 0.8776509 0.53125 0.8776509 0 0.6729488 0.03125 0.6729487 0 0.6729488 0.84375 0.6729487 0.8125 0.6729487 0.8125 0.6729487 0.5625 0.8776509 0.53125 0.8776509 0.5625 0.8776509 0.8125 0.6729487 0.78125 0.6729487 0.78125 0.6729487 0.59375 0.8776509 0.5625 0.8776509 0.59375 0.8776509 0.78125 0.6729487 0.75 0.6729488 0.75 0.6729488 0.625 0.8776509 0.59375 0.8776509 0.625 0.8776509 0.75 0.6729488 0.71875 0.6729487 0.71875 0.6729487 0.65625 0.8776509 0.625 0.8776509 0.65625 0.8776509 0.71875 0.6729487 0.6875 0.6729487 0.6875 0.6729487 0.6875 0.8776509 0.65625 0.8776509 0.6875 0.8776509 0.6875 0.6729487 0.65625 0.6729488 0.65625 0.6729488 0.71875 0.8776509 0.6875 0.8776509 0.71875 0.8776509 0.65625 0.6729488 0.625 0.6729488 0.625 0.6729488 0.75 0.8776509 0.71875 0.8776509 0.75 0.8776509 0.625 0.6729488 0.59375 0.6729487 0.59375 0.6729487 0.78125 0.8776509 0.75 0.8776509 0.78125 0.8776509 0.59375 0.6729487 0.5625 0.6729487 0.5625 0.6729487 0.8125 0.8776509 0.78125 0.8776509 0.8125 0.8776509 0.5625 0.6729487 0.53125 0.6729487 0.53125 0.6729487 0.84375 0.8776509 0.8125 0.8776509 0.84375 0.8776509 0 0.8776509 0.03125 0.8776509 0.03125 0.8776509 0.53125 0.6729487 0.5 0.6729488 0.5 0.6729488 0.875 0.8776509 0.84375 0.8776509 0.875 0.8776509 0.03125 0.8776509 0.0625 0.8776509 0.0625 0.8776509 0.46875 0.6729487 0.5 0.6729488 0.46875 0.6729487 0.90625 0.8776509 0.875 0.8776509 0.90625 0.8776509 0.0625 0.8776509 0.09375 0.8776509 0.09375 0.8776509 0.4375 0.6729487 0.46875 0.6729487 0.4375 0.6729487 1 1 0.96875 1 0.96875 0.8776509 0.96875 1 0.9375 1 0.9375 0.8776509 0.9375 1 0.90625 1 0.90625 0.8776509 0.90625 1 0.875 1 0.875 0.8776509 0.875 1 0.84375 1 0.84375 0.8776509 0.84375 1 0.8125 1 0.8125 0.8776509 0.8125 1 0.78125 1 0.78125 0.8776509 0.78125 1 0.75 1 0.75 0.8776509 0.75 1 0.71875 1 0.71875 0.8776509 0.71875 1 0.6875 1 0.6875 0.8776509 0.6875 1 0.65625 1 0.65625 0.8776509 0.65625 1 0.625 1 0.625 0.8776509 0.625 1 0.59375 1 0.59375 0.8776509 0.59375 1 0.5625 1 0.5625 0.8776509 0.5625 1 0.53125 1 0.53125 0.8776509 0.53125 1 0.5 1 0.5 0.8776509 0.5 1 0.46875 1 0.46875 0.8776509 0.46875 1 0.4375 1 0.4375 0.8776509 0.4375 1 0.40625 1 0.40625 0.8776509 0.40625 1 0.375 1 0.375 0.8776509 0.375 1 0.34375 1 0.34375 0.8776509 0.34375 1 0.3125 1 0.3125 0.8776509 0.3125 1 0.28125 1 0.28125 0.8776509 0.28125 1 0.25 1 0.25 0.8776509 0.25 1 0.21875 1 0.21875 0.8776509 0.21875 1 0.1875 1 0.1875 0.8776509 0.1875 1 0.15625 1 0.15625 0.8776509 0.15625 1 0.125 1 0.125 0.8776509 0.125 1 0.09375 1 0.09375 0.8776509 0.09375 1 0.0625 1 0.0625 0.8776509 0.341844 0.4717311 0.2968217 0.4853885 0.25 0.49 0.25 0.49 0.2031783 0.4853885 0.341844 0.4717311 0.2031783 0.4853885 0.1581559 0.4717311 0.341844 0.4717311 0.1581559 0.4717311 0.1166631 0.4495527 0.08029437 0.4197056 0.08029437 0.4197056 0.05044728 0.3833369 0.02826887 0.341844 0.02826887 0.341844 0.01461154 0.2968217 0.00999999 0.25 0.00999999 0.25 0.01461154 0.2031783 0.02826887 0.341844 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.341844 0.02826887 0.1581559 0.05044728 0.1166631 0.08029437 0.08029437 0.08029437 0.08029437 0.1166631 0.05044728 0.1581559 0.02826887 0.1581559 0.02826887 0.2031783 0.01461154 0.341844 0.02826887 0.2031783 0.01461154 0.25 0.00999999 0.341844 0.02826887 0.25 0.00999999 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.02826887 0.3833369 0.05044728 0.4197056 0.08029437 0.4197056 0.08029437 0.4495527 0.1166631 0.4717311 0.1581559 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.341844 0.4853885 0.2031783 0.49 0.25 0.4717311 0.341844 0.49 0.25 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.4495527 0.341844 0.4717311 0.1581559 0.4717311 0.08029437 0.4197056 0.341844 0.4717311 0.08029437 0.4197056 0.02826887 0.341844 0.341844 0.4717311 0.02826887 0.1581559 0.08029437 0.08029437 0.02826887 0.341844 0.08029437 0.08029437 0.1581559 0.02826887 0.02826887 0.341844 0.341844 0.02826887 0.4197056 0.08029437 0.1581559 0.02826887 0.4197056 0.08029437 0.4717311 0.1581559 0.1581559 0.02826887 0.4717311 0.341844 0.4197056 0.4197056 0.4717311 0.1581559 0.4197056 0.4197056 0.341844 0.4717311 0.4717311 0.1581559 0.341844 0.4717311 0.02826887 0.341844 0.1581559 0.02826887 0.0625 1 0.03125 1 0.03125 0.8776509 0.03125 1 0 1 0 0.8776509 0.7031784 0.4853885 0.75 0.49 0.7968217 0.4853885 0.7968217 0.4853885 0.841844 0.4717311 0.7031784 0.4853885 0.841844 0.4717311 0.8833369 0.4495527 0.7031784 0.4853885 0.8833369 0.4495527 0.9197056 0.4197056 0.9495527 0.3833369 0.9495527 0.3833369 0.9717311 0.341844 0.9853885 0.2968217 0.9853885 0.2968217 0.99 0.25 0.9853885 0.2031783 0.9853885 0.2031783 0.9717311 0.1581559 0.9853885 0.2968217 0.9717311 0.1581559 0.9495527 0.1166631 0.9853885 0.2968217 0.9495527 0.1166631 0.9197056 0.08029437 0.8833369 0.05044728 0.8833369 0.05044728 0.841844 0.02826887 0.7968217 0.01461154 0.7968217 0.01461154 0.75 0.00999999 0.7031784 0.01461154 0.7031784 0.01461154 0.658156 0.02826887 0.7968217 0.01461154 0.658156 0.02826887 0.6166632 0.05044728 0.7968217 0.01461154 0.6166632 0.05044728 0.5802944 0.08029437 0.5504473 0.1166631 0.5504473 0.1166631 0.5282689 0.1581559 0.6166632 0.05044728 0.5282689 0.1581559 0.5146116 0.2031783 0.6166632 0.05044728 0.5146116 0.2031783 0.51 0.25 0.5146116 0.2968217 0.5146116 0.2968217 0.5282689 0.341844 0.5146116 0.2031783 0.5282689 0.341844 0.5504473 0.3833369 0.5146116 0.2031783 0.5504473 0.3833369 0.5802944 0.4197056 0.6166632 0.4495527 0.6166632 0.4495527 0.658156 0.4717311 0.7031784 0.4853885 0.8833369 0.4495527 0.9495527 0.3833369 0.9853885 0.2968217 0.9495527 0.1166631 0.8833369 0.05044728 0.9853885 0.2968217 0.8833369 0.05044728 0.7968217 0.01461154 0.9853885 0.2968217 0.5504473 0.3833369 0.6166632 0.4495527 0.5146116 0.2031783 0.6166632 0.4495527 0.7031784 0.4853885 0.5146116 0.2031783 0.7031784 0.4853885 0.8833369 0.4495527 0.9853885 0.2968217 0.7968217 0.01461154 0.6166632 0.05044728 0.5146116 0.2031783 0.7031784 0.4853885 0.9853885 0.2968217 0.7968217 0.01461154 0.46875 0.8776509 0.46875 0.8776509 0.5 0.8776509 0.90625 0.6729488 0.90625 0.6729488 0.875 0.6729488 0.0625 0.6729487 0.09375 0.6729487 0.09375 0.6729487 0.4375 0.8776509 0.4375 0.8776509 0.46875 0.8776509 0.9375 0.6729487 0.9375 0.6729487 0.90625 0.6729488 0.09375 0.6729487 0.125 0.6729488 0.125 0.6729488 0.40625 0.8776509 0.40625 0.8776509 0.4375 0.8776509 0.96875 0.6729487 0.96875 0.6729487 0.9375 0.6729487 0.125 0.6729488 0.15625 0.6729488 0.15625 0.6729488 0.375 0.8776509 0.375 0.8776509 0.40625 0.8776509 1 0.6729488 1 0.6729488 0.96875 0.6729487 0.15625 0.6729488 0.1875 0.6729487 0.1875 0.6729487 0.34375 0.8776509 0.34375 0.8776509 0.375 0.8776509 0.1875 0.6729487 0.21875 0.6729487 0.21875 0.6729487 0.3125 0.8776509 0.3125 0.8776509 0.34375 0.8776509 0.21875 0.6729487 0.25 0.6729488 0.25 0.6729488 0.28125 0.8776509 0.28125 0.8776509 0.3125 0.8776509 0.25 0.6729488 0.28125 0.6729487 0.28125 0.6729487 0.25 0.8776509 0.25 0.8776509 0.28125 0.8776509 0.28125 0.6729487 0.3125 0.6729487 0.3125 0.6729487 0.21875 0.8776509 0.21875 0.8776509 0.25 0.8776509 0.3125 0.6729487 0.34375 0.6729487 0.34375 0.6729487 0.1875 0.8776509 0.1875 0.8776509 0.21875 0.8776509 0.34375 0.6729487 0.375 0.6729488 0.375 0.6729488 0.15625 0.8776509 0.15625 0.8776509 0.1875 0.8776509 1 0.8776509 0.96875 0.8776509 0.96875 0.8776509 0.375 0.6729488 0.40625 0.6729488 0.40625 0.6729488 0.125 0.8776509 0.125 0.8776509 0.15625 0.8776509 0.96875 0.8776509 0.9375 0.8776509 0.9375 0.8776509 0.40625 0.6729488 0.4375 0.6729487 0.4375 0.6729487 0.09375 0.8776509 0.09375 0.8776509 0.125 0.8776509 0.9375 0.8776509 0.90625 0.8776509 0.90625 0.8776509 1 0.5 1 0.6729488 0.96875 0.6729487 0.96875 0.5 0.96875 0.6729487 0.9375 0.6729487 0.9375 0.5 0.9375 0.6729487 0.90625 0.6729488 0.90625 0.5 0.90625 0.6729488 0.875 0.6729488 0.875 0.5 0.875 0.6729488 0.84375 0.6729487 0.84375 0.5 0.84375 0.6729487 0.8125 0.6729487 0.8125 0.5 0.8125 0.6729487 0.78125 0.6729487 0.78125 0.5 0.78125 0.6729487 0.75 0.6729488 0.75 0.6729488 0.71875 0.6729487 0.71875 0.5 0.71875 0.6729487 0.6875 0.6729487 0.6875 0.5 0.6875 0.6729487 0.65625 0.6729488 0.65625 0.5 0.65625 0.6729488 0.625 0.6729488 0.625 0.5 0.625 0.6729488 0.59375 0.6729487 0.59375 0.5 0.59375 0.6729487 0.5625 0.6729487 0.5625 0.5 0.5625 0.6729487 0.53125 0.6729487 0.53125 0.5 0.53125 0.6729487 0.5 0.6729488 0.5 0.5 0.5 0.6729488 0.46875 0.6729487 0.46875 0.5 0.46875 0.6729487 0.4375 0.6729487 0.4375 0.5 0.4375 0.6729487 0.40625 0.6729488 0.40625 0.5 0.40625 0.6729488 0.375 0.6729488 0.375 0.5 0.375 0.6729488 0.34375 0.6729487 0.34375 0.5 0.34375 0.6729487 0.3125 0.6729487 0.3125 0.5 0.3125 0.6729487 0.28125 0.6729487 0.28125 0.5 0.28125 0.6729487 0.25 0.6729488 0.25 0.5 0.25 0.5 0.25 0.6729488 0.21875 0.6729487 0.21875 0.5 0.21875 0.6729487 0.1875 0.6729487 0.1875 0.5 0.1875 0.6729487 0.15625 0.6729488 0.15625 0.5 0.15625 0.6729488 0.125 0.6729488 0.125 0.5 0.125 0.6729488 0.09375 0.6729487 0.09375 0.5 0.09375 0.6729487 0.0625 0.6729487 0.0625 0.5 0.0625 0.6729487 0.03125 0.6729487 0.03125 0.5 0.03125 0.6729487 0 0.6729488 0.03125 0.8776509 0 0.8776509 0 0.6729488 0.0625 0.8776509 0.03125 0.8776509 0.03125 0.6729487 0.09375 0.8776509 0.0625 0.8776509 0.0625 0.6729487 0.125 0.8776509 0.09375 0.8776509 0.09375 0.6729487 0.15625 0.8776509 0.125 0.8776509 0.125 0.6729488 0.1875 0.8776509 0.15625 0.8776509 0.15625 0.6729488 0.21875 0.8776509 0.1875 0.8776509 0.1875 0.6729487 0.25 0.8776509 0.21875 0.8776509 0.21875 0.6729487 0.28125 0.8776509 0.25 0.8776509 0.25 0.6729488 0.3125 0.8776509 0.28125 0.8776509 0.28125 0.6729487 0.34375 0.8776509 0.3125 0.8776509 0.3125 0.6729487 0.375 0.8776509 0.34375 0.8776509 0.34375 0.6729487 0.40625 0.8776509 0.375 0.8776509 0.375 0.6729488 0.4375 0.8776509 0.40625 0.8776509 0.40625 0.6729488 0.46875 0.8776509 0.4375 0.8776509 0.4375 0.6729487 0.5 0.8776509 0.46875 0.8776509 0.46875 0.6729487 0.53125 0.8776509 0.5 0.8776509 0.5 0.6729488 0.5625 0.8776509 0.53125 0.8776509 0.53125 0.6729487 0.59375 0.8776509 0.5625 0.8776509 0.5625 0.6729487 0.625 0.8776509 0.59375 0.8776509 0.59375 0.6729487 0.65625 0.8776509 0.625 0.8776509 0.625 0.6729488 0.6875 0.8776509 0.65625 0.8776509 0.65625 0.6729488 0.71875 0.8776509 0.6875 0.8776509 0.6875 0.6729487 0.75 0.8776509 0.71875 0.8776509 0.71875 0.6729487 0.78125 0.8776509 0.75 0.8776509 0.75 0.6729488 0.8125 0.8776509 0.78125 0.8776509 0.78125 0.6729487 0.84375 0.8776509 0.8125 0.8776509 0.8125 0.6729487 0.875 0.8776509 0.84375 0.8776509 0.84375 0.6729487 0.90625 0.8776509 0.875 0.8776509 0.875 0.6729488 0.9375 0.8776509 0.90625 0.8776509 0.90625 0.6729488 0.96875 0.8776509 0.9375 0.8776509 0.9375 0.6729487 1 0.6729488 1 0.8776509 0.96875 0.8776509 0.03125 0.6729487 0.0625 0.6729487 0.0625 0.6729487 0.875 0.6729488 0.875 0.6729488 0.84375 0.6729487 0.53125 0.8776509 0.5 0.8776509 0.5 0.8776509 0 0.6729488 0.03125 0.6729487 0.03125 0.6729487 0.84375 0.6729487 0.84375 0.6729487 0.8125 0.6729487 0.5625 0.8776509 0.53125 0.8776509 0.53125 0.8776509 0.8125 0.6729487 0.8125 0.6729487 0.78125 0.6729487 0.59375 0.8776509 0.5625 0.8776509 0.5625 0.8776509 0.78125 0.6729487 0.78125 0.6729487 0.75 0.6729488 0.625 0.8776509 0.59375 0.8776509 0.59375 0.8776509 0.75 0.6729488 0.75 0.6729488 0.71875 0.6729487 0.65625 0.8776509 0.625 0.8776509 0.625 0.8776509 0.71875 0.6729487 0.71875 0.6729487 0.6875 0.6729487 0.6875 0.8776509 0.65625 0.8776509 0.65625 0.8776509 0.6875 0.6729487 0.6875 0.6729487 0.65625 0.6729488 0.71875 0.8776509 0.6875 0.8776509 0.6875 0.8776509 0.65625 0.6729488 0.65625 0.6729488 0.625 0.6729488 0.75 0.8776509 0.71875 0.8776509 0.71875 0.8776509 0.625 0.6729488 0.625 0.6729488 0.59375 0.6729487 0.78125 0.8776509 0.75 0.8776509 0.75 0.8776509 0.59375 0.6729487 0.59375 0.6729487 0.5625 0.6729487 0.8125 0.8776509 0.78125 0.8776509 0.78125 0.8776509 0.5625 0.6729487 0.5625 0.6729487 0.53125 0.6729487 0.84375 0.8776509 0.8125 0.8776509 0.8125 0.8776509 0 0.8776509 0 0.8776509 0.03125 0.8776509 0.53125 0.6729487 0.53125 0.6729487 0.5 0.6729488 0.875 0.8776509 0.84375 0.8776509 0.84375 0.8776509 0.03125 0.8776509 0.03125 0.8776509 0.0625 0.8776509 0.46875 0.6729487 0.5 0.6729488 0.5 0.6729488 0.90625 0.8776509 0.875 0.8776509 0.875 0.8776509 0.0625 0.8776509 0.0625 0.8776509 0.09375 0.8776509 0.4375 0.6729487 0.46875 0.6729487 0.46875 0.6729487
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 65 0 1 64 0 2 3 1 3 66 1 4 65 1 5 5 2 6 67 2 7 66 2 8 7 3 9 68 3 10 67 3 11 9 4 12 69 4 13 68 4 14 11 5 15 70 5 16 69 5 17 13 6 18 71 6 19 70 6 20 15 7 21 72 7 22 71 7 23 17 8 24 73 8 25 72 8 26 19 9 27 74 9 28 73 9 29 21 10 30 75 10 31 74 10 32 23 11 33 76 11 34 75 11 35 25 12 36 77 12 37 76 12 38 27 13 39 78 13 40 77 13 41 29 14 42 79 14 43 78 14 44 31 15 45 80 15 46 79 15 47 33 16 48 81 16 49 80 16 50 35 17 51 82 17 52 81 17 53 37 18 54 83 18 55 82 18 56 39 19 57 84 19 58 83 19 59 41 20 60 85 20 61 84 20 62 43 21 63 86 21 64 85 21 65 45 22 66 87 22 67 86 22 68 47 23 69 88 23 70 87 23 71 49 24 72 89 24 73 88 24 74 51 25 75 90 25 76 89 25 77 53 26 78 91 26 79 90 26 80 55 27 81 92 27 82 91 27 83 57 28 84 93 28 85 92 28 86 59 29 87 94 29 88 93 29 89 37 30 90 21 30 91 5 30 92 61 31 93 95 31 94 94 31 95 63 32 96 64 32 97 95 32 98 30 33 99 46 33 100 62 33 101 81 34 102 145 34 103 80 34 104 98 35 105 164 35 106 99 35 107 125 36 108 189 36 109 190 36 110 82 37 111 144 37 112 81 37 113 97 38 114 163 38 115 98 38 116 124 39 117 188 39 118 189 39 119 83 40 120 143 40 121 82 40 122 96 41 123 162 41 124 97 41 125 123 42 126 187 42 127 188 42 128 84 43 129 142 43 130 83 43 131 127 44 132 161 44 133 96 44 134 122 45 135 186 45 136 187 45 137 85 46 138 141 46 139 84 46 140 121 47 141 185 47 142 186 47 143 86 48 144 140 48 145 85 48 146 120 49 147 184 49 148 185 49 149 87 50 150 139 50 151 86 50 152 119 51 153 183 51 154 184 51 155 88 52 156 138 52 157 87 52 158 118 53 159 182 53 160 183 53 161 89 54 162 137 54 163 88 54 164 117 55 165 181 55 166 182 55 167 90 56 168 136 56 169 89 56 170 116 57 171 180 57 172 181 57 173 91 58 174 135 58 175 90 58 176 64 59 177 160 59 178 129 59 179 115 60 180 179 60 181 180 60 182 92 61 183 134 61 184 91 61 185 65 62 186 159 62 187 160 62 188 114 63 189 178 63 190 179 63 191 93 64 192 133 64 193 92 64 194 66 65 195 158 65 196 159 65 197 0 66 198 96 66 199 2 66 200 2 67 201 97 67 202 4 67 203 4 68 204 98 68 205 6 68 206 6 69 207 99 69 208 8 69 209 8 70 210 100 70 211 10 70 212 10 71 213 101 71 214 12 71 215 12 72 216 102 72 217 14 72 218 14 73 219 103 73 220 16 73 221 103 74 222 18 74 223 16 74 224 104 75 225 20 75 226 18 75 227 105 76 228 22 76 229 20 76 230 106 77 231 24 77 232 22 77 233 107 78 234 26 78 235 24 78 236 108 79 237 28 79 238 26 79 239 109 80 240 30 80 241 28 80 242 110 81 243 32 81 244 30 81 245 111 82 246 34 82 247 32 82 248 112 83 249 36 83 250 34 83 251 113 84 252 38 84 253 36 84 254 114 85 255 40 85 256 38 85 257 115 86 258 42 86 259 40 86 260 116 87 261 44 87 262 42 87 263 117 88 264 46 88 265 44 88 266 118 89 267 48 89 268 46 89 269 48 90 270 120 90 271 50 90 272 50 91 273 121 91 274 52 91 275 52 92 276 122 92 277 54 92 278 54 93 279 123 93 280 56 93 281 56 94 282 124 94 283 58 94 284 58 95 285 125 95 286 60 95 287 60 96 288 126 96 289 62 96 290 62 97 291 127 97 292 0 97 293 126 130 390 190 130 391 191 130 392 99 131 393 165 131 394 100 131 395 79 132 396 145 132 397 146 132 398 127 133 399 191 133 400 128 133 401 100 134 402 166 134 403 101 134 404 78 135 405 146 135 406 147 135 407 101 136 408 167 136 409 102 136 410 77 137 411 147 137 412 148 137 413 102 138 414 168 138 415 103 138 416 76 139 417 148 139 418 149 139 419 103 140 420 169 140 421 104 140 422 75 141 423 149 141 424 150 141 425 104 142 426 170 142 427 105 142 428 74 143 429 150 143 430 151 143 431 105 144 432 171 144 433 106 144 434 73 145 435 151 145 436 152 145 437 106 146 438 172 146 439 107 146 440 72 147 441 152 147 442 153 147 443 107 148 444 173 148 445 108 148 446 71 149 447 153 149 448 154 149 449 108 150 450 174 150 451 109 150 452 70 151 453 154 151 454 155 151 455 109 152 456 175 152 457 110 152 458 69 153 459 155 153 460 156 153 461 64 154 462 130 154 463 95 154 464 110 155 465 176 155 466 111 155 467 68 156 468 156 156 469 157 156 470 95 157 471 131 157 472 94 157 473 112 158 474 176 158 475 177 158 476 67 159 477 157 159 478 158 159 479 94 160 480 132 160 481 93 160 482 113 161 483 177 161 484 178 161 485 1 162 486 3 162 487 65 162 488 3 163 489 5 163 490 66 163 491 5 164 492 7 164 493 67 164 494 7 165 495 9 165 496 68 165 497 9 166 498 11 166 499 69 166 500 11 167 501 13 167 502 70 167 503 13 168 504 15 168 505 71 168 506 15 169 507 17 169 508 72 169 509 17 170 510 19 170 511 73 170 512 19 171 513 21 171 514 74 171 515 21 172 516 23 172 517 75 172 518 23 173 519 25 173 520 76 173 521 25 174 522 27 174 523 77 174 524 27 175 525 29 175 526 78 175 527 29 176 528 31 176 529 79 176 530 31 177 531 33 177 532 80 177 533 33 178 534 35 178 535 81 178 536 35 179 537 37 179 538 82 179 539 37 180 540 39 180 541 83 180 542 39 181 543 41 181 544 84 181 545 41 182 546 43 182 547 85 182 548 43 183 549 45 183 550 86 183 551 45 184 552 47 184 553 87 184 554 47 185 555 49 185 556 88 185 557 49 186 558 51 186 559 89 186 560 51 187 561 53 187 562 90 187 563 53 188 564 55 188 565 91 188 566 55 189 567 57 189 568 92 189 569 57 190 570 59 190 571 93 190 572 59 191 573 61 191 574 94 191 575 5 192 576 3 192 577 1 192 578 1 193 579 63 193 580 5 193 581 63 194 582 61 194 583 5 194 584 61 195 585 59 195 586 57 195 587 57 196 588 55 196 589 53 196 590 53 197 591 51 197 592 49 197 593 49 198 594 47 198 595 53 198 596 47 199 597 45 199 598 53 199 599 45 200 600 43 200 601 41 200 602 41 201 603 39 201 604 37 201 605 37 202 606 35 202 607 29 202 608 35 203 609 33 203 610 29 203 611 33 204 612 31 204 613 29 204 614 29 205 615 27 205 616 25 205 617 25 206 618 23 206 619 21 206 620 21 207 621 19 207 622 13 207 623 19 208 624 17 208 625 13 208 626 17 209 627 15 209 628 13 209 629 13 210 630 11 210 631 9 210 632 9 211 633 7 211 634 5 211 635 61 212 636 57 212 637 5 212 638 57 213 639 53 213 640 5 213 641 45 214 642 41 214 643 53 214 644 41 215 645 37 215 646 53 215 647 29 216 648 25 216 649 37 216 650 25 217 651 21 217 652 37 217 653 13 218 654 9 218 655 21 218 656 9 219 657 5 219 658 21 219 659 5 220 660 53 220 661 37 220 662 61 221 663 63 221 664 95 221 665 63 222 666 1 222 667 64 222 668 62 223 669 0 223 670 2 223 671 2 224 672 4 224 673 62 224 674 4 225 675 6 225 676 62 225 677 6 226 678 8 226 679 10 226 680 10 227 681 12 227 682 14 227 683 14 228 684 16 228 685 18 228 686 18 229 687 20 229 688 14 229 689 20 230 690 22 230 691 14 230 692 22 231 693 24 231 694 26 231 695 26 232 696 28 232 697 30 232 698 30 233 699 32 233 700 34 233 701 34 234 702 36 234 703 30 234 704 36 235 705 38 235 706 30 235 707 38 236 708 40 236 709 42 236 710 42 237 711 44 237 712 38 237 713 44 238 714 46 238 715 38 238 716 46 239 717 48 239 718 50 239 719 50 240 720 52 240 721 46 240 722 52 241 723 54 241 724 46 241 725 54 242 726 56 242 727 58 242 728 58 243 729 60 243 730 62 243 731 6 244 732 10 244 733 14 244 734 22 245 735 26 245 736 14 245 737 26 246 738 30 246 739 14 246 740 54 247 741 58 247 742 46 247 743 58 248 744 62 248 745 46 248 746 62 249 747 6 249 748 14 249 749 30 250 750 38 250 751 46 250 752 62 251 753 14 251 754 30 251 755 81 252 756 144 252 757 145 252 758 98 253 759 163 253 760 164 253 761 125 254 762 124 254 763 189 254 764 82 255 765 143 255 766 144 255 767 97 256 768 162 256 769 163 256 770 124 257 771 123 257 772 188 257 773 83 258 774 142 258 775 143 258 776 96 259 777 161 259 778 162 259 779 123 260 780 122 260 781 187 260 782 84 261 783 141 261 784 142 261 785 127 262 786 128 262 787 161 262 788 122 263 789 121 263 790 186 263 791 85 264 792 140 264 793 141 264 794 121 265 795 120 265 796 185 265 797 86 266 798 139 266 799 140 266 800 120 267 801 119 267 802 184 267 803 87 268 804 138 268 805 139 268 806 119 269 807 118 269 808 183 269 809 88 270 810 137 270 811 138 270 812 118 271 813 117 271 814 182 271 815 89 272 816 136 272 817 137 272 818 117 273 819 116 273 820 181 273 821 90 274 822 135 274 823 136 274 824 116 275 825 115 275 826 180 275 827 91 276 828 134 276 829 135 276 830 64 277 831 65 277 832 160 277 833 115 278 834 114 278 835 179 278 836 92 279 837 133 279 838 134 279 839 65 280 840 66 280 841 159 280 842 114 281 843 113 281 844 178 281 845 93 282 846 132 282 847 133 282 848 66 283 849 67 283 850 158 283 851 0 284 852 127 284 853 96 284 854 2 285 855 96 285 856 97 285 857 4 286 858 97 286 859 98 286 860 6 287 861 98 287 862 99 287 863 8 288 864 99 288 865 100 288 866 10 289 867 100 289 868 101 289 869 12 290 870 101 290 871 102 290 872 14 291 873 102 291 874 103 291 875 103 292 876 104 292 877 18 292 878 104 293 879 105 293 880 20 293 881 105 294 882 106 294 883 22 294 884 106 295 885 107 295 886 24 295 887 107 296 888 108 296 889 26 296 890 108 297 891 109 297 892 28 297 893 109 298 894 110 298 895 30 298 896 110 299 897 111 299 898 32 299 899 111 300 900 112 300 901 34 300 902 112 301 903 113 301 904 36 301 905 113 302 906 114 302 907 38 302 908 114 303 909 115 303 910 40 303 911 115 304 912 116 304 913 42 304 914 116 305 915 117 305 916 44 305 917 117 306 918 118 306 919 46 306 920 118 307 921 119 307 922 48 307 923 48 308 924 119 308 925 120 308 926 50 309 927 120 309 928 121 309 929 52 310 930 121 310 931 122 310 932 54 311 933 122 311 934 123 311 935 56 312 936 123 312 937 124 312 938 58 313 939 124 313 940 125 313 941 60 314 942 125 314 943 126 314 944 62 315 945 126 315 946 127 315 947 126 348 1044 125 348 1045 190 348 1046 99 349 1047 164 349 1048 165 349 1049 79 350 1050 80 350 1051 145 350 1052 127 351 1053 126 351 1054 191 351 1055 100 352 1056 165 352 1057 166 352 1058 78 353 1059 79 353 1060 146 353 1061 101 354 1062 166 354 1063 167 354 1064 77 355 1065 78 355 1066 147 355 1067 102 356 1068 167 356 1069 168 356 1070 76 357 1071 77 357 1072 148 357 1073 103 358 1074 168 358 1075 169 358 1076 75 359 1077 76 359 1078 149 359 1079 104 360 1080 169 360 1081 170 360 1082 74 361 1083 75 361 1084 150 361 1085 105 362 1086 170 362 1087 171 362 1088 73 363 1089 74 363 1090 151 363 1091 106 364 1092 171 364 1093 172 364 1094 72 365 1095 73 365 1096 152 365 1097 107 366 1098 172 366 1099 173 366 1100 71 367 1101 72 367 1102 153 367 1103 108 368 1104 173 368 1105 174 368 1106 70 369 1107 71 369 1108 154 369 1109 109 370 1110 174 370 1111 175 370 1112 69 371 1113 70 371 1114 155 371 1115 64 372 1116 129 372 1117 130 372 1118 110 373 1119 175 373 1120 176 373 1121 68 374 1122 69 374 1123 156 374 1124 95 375 1125 130 375 1126 131 375 1127 112 376 1128 111 376 1129 176 376 1130 67 377 1131 68 377 1132 157 377 1133 94 378 1134 131 378 1135 132 378 1136 113 379 1137 112 379 1138 177 379 1139
+
+
+
+
+
+ 130 98 294 128 98 295 191 98 296 131 99 297 191 99 298 190 99 299 132 100 300 190 100 301 189 100 302 133 101 303 189 101 304 188 101 305 134 102 306 188 102 307 187 102 308 135 103 309 187 103 310 186 103 311 136 104 312 186 104 313 185 104 314 137 105 315 185 105 316 184 105 317 138 106 318 184 106 319 183 106 320 139 107 321 183 107 322 182 107 323 140 108 324 182 108 325 181 108 326 141 109 327 181 109 328 180 109 329 142 110 330 180 110 331 179 110 332 143 111 333 179 111 334 178 111 335 144 112 336 178 112 337 177 112 338 145 113 339 177 113 340 176 113 341 146 114 342 176 114 343 175 114 344 147 115 345 175 115 346 174 115 347 148 116 348 174 116 349 173 116 350 149 117 351 173 117 352 172 117 353 150 118 354 172 118 355 171 118 356 151 119 357 171 119 358 170 119 359 152 120 360 170 120 361 169 120 362 153 121 363 169 121 364 168 121 365 154 122 366 168 122 367 167 122 368 155 123 369 167 123 370 166 123 371 156 124 372 166 124 373 165 124 374 157 125 375 165 125 376 164 125 377 158 126 378 164 126 379 163 126 380 159 127 381 163 127 382 162 127 383 160 128 384 162 128 385 161 128 386 128 129 387 160 129 388 161 129 389 130 316 948 129 316 949 128 316 950 131 317 951 130 317 952 191 317 953 132 318 954 131 318 955 190 318 956 133 319 957 132 319 958 189 319 959 134 320 960 133 320 961 188 320 962 135 321 963 134 321 964 187 321 965 136 322 966 135 322 967 186 322 968 137 323 969 136 323 970 185 323 971 138 324 972 137 324 973 184 324 974 139 325 975 138 325 976 183 325 977 140 326 978 139 326 979 182 326 980 141 327 981 140 327 982 181 327 983 142 328 984 141 328 985 180 328 986 143 329 987 142 329 988 179 329 989 144 330 990 143 330 991 178 330 992 145 331 993 144 331 994 177 331 995 146 332 996 145 332 997 176 332 998 147 333 999 146 333 1000 175 333 1001 148 334 1002 147 334 1003 174 334 1004 149 335 1005 148 335 1006 173 335 1007 150 336 1008 149 336 1009 172 336 1010 151 337 1011 150 337 1012 171 337 1013 152 338 1014 151 338 1015 170 338 1016 153 339 1017 152 339 1018 169 339 1019 154 340 1020 153 340 1021 168 340 1022 155 341 1023 154 341 1024 167 341 1025 156 342 1026 155 342 1027 166 342 1028 157 343 1029 156 343 1030 165 343 1031 158 344 1032 157 344 1033 164 344 1034 159 345 1035 158 345 1036 163 345 1037 160 346 1038 159 346 1039 162 346 1040 128 347 1041 129 347 1042 160 347 1043
+
+
+
+
+
+
+ 4.62388e-7 1.242424 -0.9999986 0 1 1 0.2423855 1.218552 -0.9999986 0.1950903 0.9807853 1 0.4754558 1.14785 -0.9999986 0.3826835 0.9238795 1 0.6902546 1.033038 -0.9999986 0.5555703 0.8314696 1 0.8785272 0.8785268 -0.9999986 0.7071068 0.7071068 1 1.033039 0.6902541 -0.9999986 0.8314696 0.5555703 1 1.147851 0.4754553 -0.9999986 0.9238795 0.3826835 1 1.218552 0.242385 -0.9999986 0.9807853 0.1950903 1 1.242425 0 -0.9999986 1 0 1 1.218552 -0.242385 -0.9999986 0.9807853 -0.1950903 1 1.147851 -0.4754553 -0.9999986 0.9238795 -0.3826835 1 1.033039 -0.6902541 -0.9999986 0.8314696 -0.5555703 1 0.8785272 -0.8785268 -0.9999986 0.7071068 -0.7071068 1 0.6902546 -1.033038 -0.9999986 0.5555703 -0.8314696 1 0.4754558 -1.14785 -0.9999986 0.3826835 -0.9238795 1 0.2423855 -1.218552 -0.9999986 0.1950903 -0.9807853 1 4.62388e-7 -1.242424 -0.9999986 0 -1 1 -0.2423845 -1.218552 -0.9999986 -0.1950903 -0.9807853 1 -0.4754548 -1.14785 -0.9999986 -0.3826835 -0.9238795 1 -0.6902536 -1.033038 -0.9999986 -0.5555703 -0.8314696 1 -0.8785263 -0.8785268 -0.9999986 -0.7071068 -0.7071068 1 -1.033038 -0.6902541 -0.9999986 -0.8314696 -0.5555703 1 -1.14785 -0.4754553 -0.9999986 -0.9238795 -0.3826835 1 -1.218551 -0.242385 -0.9999986 -0.9807853 -0.1950903 1 -1.242424 0 -0.9999986 -1 0 1 -1.218551 0.242385 -0.9999986 -0.9807853 0.1950903 1 -1.14785 0.4754553 -0.9999986 -0.9238795 0.3826835 1 -1.033038 0.6902541 -0.9999986 -0.8314696 0.5555703 1 -0.8785263 0.8785268 -0.9999986 -0.7071068 0.7071068 1 -0.6902536 1.033038 -0.9999986 -0.5555703 0.8314696 1 -0.4754548 1.14785 -0.9999986 -0.3826835 0.9238795 1 -0.2423845 1.218552 -0.9999986 -0.1950903 0.9807853 1 0 1 0.5106036 0.1950903 0.9807853 0.5106036 0.3826835 0.9238795 0.5106036 0.5555703 0.8314696 0.5106036 0.7071068 0.7071068 0.5106036 0.8314696 0.5555703 0.5106036 0.9238795 0.3826835 0.5106036 0.9807853 0.1950903 0.5106036 1 0 0.5106036 0.9807853 -0.1950903 0.5106036 0.9238795 -0.3826835 0.5106036 0.8314696 -0.5555703 0.5106036 0.7071068 -0.7071068 0.5106036 0.5555703 -0.8314696 0.5106036 0.3826835 -0.9238795 0.5106036 0.1950903 -0.9807853 0.5106036 0 -1 0.5106036 -0.1950903 -0.9807853 0.5106036 -0.3826835 -0.9238795 0.5106036 -0.5555703 -0.8314696 0.5106036 -0.7071068 -0.7071068 0.5106036 -0.8314696 -0.5555703 0.5106036 -0.9238795 -0.3826835 0.5106036 -0.9807853 -0.1950903 0.5106036 -1 0 0.5106036 -0.9807853 0.1950903 0.5106036 -0.9238795 0.3826835 0.5106036 -0.8314696 0.5555703 0.5106036 -0.7071068 0.7071068 0.5106036 -0.5555703 0.8314696 0.5106036 -0.3826835 0.9238795 0.5106036 -0.1950903 0.9807853 0.5106036 0.1950903 0.9807853 -0.308205 0.3826835 0.9238795 -0.308205 0.5555703 0.8314696 -0.308205 0.7071068 0.7071068 -0.308205 0.8314696 0.5555703 -0.308205 0.9238795 0.3826835 -0.308205 0.9807853 0.1950903 -0.308205 1 0 -0.308205 0.9807853 -0.1950903 -0.308205 0.9238795 -0.3826835 -0.308205 0.8314696 -0.5555703 -0.308205 0.7071068 -0.7071068 -0.308205 0.5555703 -0.8314696 -0.308205 0.3826835 -0.9238795 -0.308205 0.1950903 -0.9807853 -0.308205 0 -1 -0.308205 -0.1950903 -0.9807853 -0.308205 -0.3826835 -0.9238795 -0.308205 -0.5555703 -0.8314696 -0.308205 -0.7071068 -0.7071068 -0.308205 -0.8314696 -0.5555703 -0.308205 -0.9238795 -0.3826835 -0.308205 -0.9807853 -0.1950903 -0.308205 -1 0 -0.308205 -0.9807853 0.1950903 -0.308205 -0.9238795 0.3826835 -0.308205 -0.8314696 0.5555703 -0.308205 -0.7071068 0.7071068 -0.308205 -0.5555703 0.8314696 -0.308205 -0.3826835 0.9238795 -0.308205 -0.1950903 0.9807853 -0.308205 0 1 -0.3082049 2.29839e-7 0.8795036 -0.2588687 2.29839e-7 0.8795036 0.4612718 -0.1715813 0.8626043 0.4612718 -0.3365691 0.8125557 0.4612718 -0.4886227 0.7312814 0.4612718 -0.6218988 0.6219046 0.4612718 -0.7312757 0.4886285 0.4612718 -0.81255 0.3365749 0.4612718 -0.8625985 0.1715871 0.4612718 -0.8794978 5.51614e-6 0.4612718 -0.8625985 -0.171576 0.4612718 -0.81255 -0.3365638 0.4612718 -0.7312757 -0.4886174 0.4612718 -0.6218988 -0.6218935 0.4612718 -0.4886227 -0.7312704 0.4612718 -0.3365691 -0.8125447 0.4612718 -0.1715813 -0.8625932 0.4612718 2.29839e-7 -0.8794925 0.4612718 0.1715818 -0.8625932 0.4612718 0.3365696 -0.8125447 0.4612718 0.4886232 -0.7312704 0.4612718 0.6218993 -0.6218935 0.4612718 0.7312762 -0.4886174 0.4612718 0.8125505 -0.3365638 0.4612718 0.862599 -0.171576 0.4612718 0.8794983 5.51614e-6 0.4612718 0.862599 0.1715871 0.4612718 0.8125505 0.3365749 0.4612718 0.7312762 0.4886285 0.4612718 0.6218993 0.6219046 0.4612718 0.4886232 0.7312814 0.4612718 0.3365696 0.8125557 0.4612718 0.1715818 0.8626043 0.4612718 0.1715818 0.8626043 -0.2588688 0.3365696 0.8125557 -0.2588688 0.4886232 0.7312814 -0.2588688 0.6218993 0.6219046 -0.2588688 0.7312762 0.4886285 -0.2588688 0.8125505 0.3365749 -0.2588688 0.862599 0.1715871 -0.2588688 0.8794983 5.51614e-6 -0.2588688 0.862599 -0.171576 -0.2588688 0.8125505 -0.3365638 -0.2588688 0.7312762 -0.4886174 -0.2588688 0.6218993 -0.6218935 -0.2588688 0.4886232 -0.7312704 -0.2588688 0.3365696 -0.8125447 -0.2588688 0.1715818 -0.8625932 -0.2588688 2.29839e-7 -0.8794925 -0.2588688 -0.1715813 -0.8625932 -0.2588688 -0.3365691 -0.8125447 -0.2588688 -0.4886227 -0.7312704 -0.2588688 -0.6218988 -0.6218935 -0.2588688 -0.7312757 -0.4886174 -0.2588688 -0.81255 -0.3365638 -0.2588688 -0.8625985 -0.171576 -0.2588688 -0.8794978 5.51614e-6 -0.2588688 -0.8625985 0.1715871 -0.2588688 -0.81255 0.3365749 -0.2588688 -0.7312757 0.4886285 -0.2588688 -0.6218988 0.6219046 -0.2588688 -0.4886227 0.7312814 -0.2588688 -0.3365691 0.8125557 -0.2588688 -0.1715813 0.8626043 -0.2588688
+
+
+
+
+
+
+
+
+
+ 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713968 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713968 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713968 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713968 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713968 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713968 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713968 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713968 0.8819213 0 0 0 1 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 0 0 -1 -0.03728777 -0.3785886 -0.9248137 0.2413713 0.2941118 0.9247909 -0.1793555 0.3355506 0.9247905 -0.1104304 -0.3640402 -0.9248135 0.1793558 0.335551 0.9247902 -0.2413708 0.2941113 0.9247912 -0.1793296 -0.3355022 -0.924813 0.110447 0.3640951 0.9247898 -0.2941096 0.2413695 0.924792 -0.2413381 -0.2940713 -0.9248124 0.03729379 0.3786468 0.9247896 -0.335545 0.1793525 0.9247931 -0.2940729 -0.2413393 -0.9248116 -0.3640849 0.1104438 0.9247942 -0.3355074 -0.1793324 -0.9248105 -0.3786327 0.03729212 0.9247955 -0.3640493 -0.1104331 -0.9248095 -0.3786298 -0.03729182 0.9247966 -0.3786014 -0.03728902 -0.9248084 -0.3640766 -0.1104413 0.9247978 -0.3786043 0.03728932 -0.9248071 -0.3355326 -0.1793459 0.9247989 -0.3640576 0.1104356 -0.924806 -0.2940949 -0.2413575 0.9247998 -0.3355199 0.1793391 -0.9248048 0.03729075 0.3786185 -0.9248014 -0.2413561 -0.2940934 0.9248007 -0.2940875 0.2413514 -0.9248037 0.1104388 0.364068 -0.9248015 -0.1793431 -0.3355273 0.9248014 -0.2413528 0.2940892 -0.9248029 0.1793423 0.335526 -0.924802 0.09255057 0.9396815 0.3292916 0.2740951 0.9035701 0.3292917 0.4451062 0.8327349 0.3292918 0.5990121 0.7298982 0.3292919 0.7298982 0.5990121 0.3292919 0.8327348 0.4451061 0.3292921 0.9035699 0.2740951 0.3292921 0.9396814 0.09255057 0.3292921 0.9396814 -0.09255057 0.3292921 0.9035699 -0.274095 0.3292921 0.8327348 -0.4451061 0.329292 0.7298982 -0.5990121 0.3292919 0.5990121 -0.7298982 0.3292919 0.4451062 -0.8327349 0.3292918 0.2740951 -0.9035701 0.3292917 0.09255057 -0.9396815 0.3292917 -0.09255057 -0.9396816 0.3292915 -0.2740951 -0.9035702 0.3292915 -0.4451063 -0.8327351 0.3292913 -0.5990121 -0.7298985 0.3292912 -0.7298983 -0.5990123 0.3292911 -0.8327353 -0.4451059 0.3292911 -0.9035702 -0.2740951 0.329291 -0.9396818 -0.09255063 0.329291 -0.9396818 0.09255063 0.329291 -0.9035702 0.2740951 0.329291 -0.8327353 0.4451059 0.3292911 -0.7298983 0.5990123 0.3292911 -0.5990121 0.7298985 0.3292912 -0.4451063 0.8327351 0.3292913 -0.2740951 0.9035702 0.3292914 -0.09255063 0.9396816 0.3292915 -0.09801733 0.9951847 0 -0.2902848 0.9569403 0 -0.4713967 0.8819213 0 -0.6343932 0.7730106 0 -0.7730104 0.6343933 0 -0.8819213 0.4713967 0 -0.9569404 0.2902845 0 -0.9951847 0.09801733 0 -0.9951847 -0.09801733 0 -0.9569404 -0.2902845 0 -0.8819213 -0.4713967 0 -0.7730104 -0.6343933 0 -0.6343932 -0.7730106 0 -0.4713967 -0.8819213 0 -0.2902848 -0.9569403 0 -0.09801703 -0.9951848 0 0.09801697 -0.9951848 0 0.2902848 -0.9569403 0 0.4713967 -0.8819213 0 0.6343933 -0.7730104 0 0.7730103 -0.6343935 0 0.8819213 -0.4713967 0 0.9569404 -0.2902845 0 0.9951847 -0.09801733 0 0.9951847 0.09801733 0 0.9569404 0.2902845 0 0.8819213 0.4713967 0 0.7730103 0.6343935 0 0.6343933 0.7730104 0 0.4713967 0.8819213 0 0.2902848 0.9569403 0 0.09801733 0.9951847 0 -0.110447 0.3640948 0.9247899 0.2941103 0.2413702 0.9247917 0.03728765 -0.3785889 -0.9248136 -0.03729385 0.3786467 0.9247896 0.335546 0.1793531 0.9247926 0.1104305 -0.3640404 -0.9248133 0.364086 0.1104443 0.9247937 0.1793299 -0.3355027 -0.9248129 0.378634 0.03729224 0.9247949 0.2413386 -0.2940719 -0.9248121 0.3786311 -0.03729194 0.9247961 0.2940736 -0.2413401 -0.9248112 0.3640778 -0.1104418 0.9247972 0.3355084 -0.1793329 -0.9248101 0.3355336 -0.1793464 0.9247984 0.3640505 -0.1104334 -0.924809 0.2940956 -0.241358 0.9247995 0.3786027 -0.0372892 -0.9248078 0.2413566 -0.2940939 0.9248004 0.3786056 0.03728944 -0.9248067 0.1793433 -0.3355278 0.9248011 0.3640588 0.110436 -0.9248054 0.1104387 -0.3640678 0.9248015 0.3355209 0.1793396 -0.9248043 -0.03729069 0.3786183 -0.9248014 0.03729057 -0.3786171 0.9248019 0.2940882 0.241352 -0.9248034 -0.1104386 0.3640675 -0.9248017 -0.03729045 -0.3786171 0.9248019 0.2413532 0.2940897 -0.9248026 -0.179342 0.3355255 -0.9248022 -0.1104387 -0.3640673 0.9248018 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713968 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713968 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713968 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713968 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713968 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713968 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713968 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713968 0.8819213 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.03728765 -0.3785887 -0.9248136 0.2413713 0.2941118 0.9247908 -0.1793555 0.3355506 0.9247905 -0.1104304 -0.36404 -0.9248135 0.1793558 0.3355511 0.9247903 -0.2413709 0.2941113 0.9247912 -0.1793296 -0.3355022 -0.924813 0.1104471 0.3640952 0.9247897 -0.2941096 0.2413695 0.9247921 -0.2413381 -0.2940714 -0.9248123 0.03729385 0.3786469 0.9247896 -0.335545 0.1793525 0.9247931 -0.2940729 -0.2413393 -0.9248116 -0.3640848 0.1104439 0.9247942 -0.3355074 -0.1793324 -0.9248106 -0.3786327 0.03729212 0.9247954 -0.3640492 -0.1104331 -0.9248095 -0.3786298 -0.03729182 0.9247967 -0.3786014 -0.03728902 -0.9248084 -0.3640766 -0.1104414 0.9247978 -0.3786043 0.03728932 -0.9248072 -0.3355326 -0.1793459 0.9247989 -0.3640576 0.1104356 -0.9248059 -0.2940949 -0.2413575 0.9247999 -0.3355199 0.1793391 -0.9248049 0.03729069 0.3786185 -0.9248014 -0.2413561 -0.2940933 0.9248007 -0.2940876 0.2413514 -0.9248037 0.1104387 0.3640679 -0.9248016 -0.1793431 -0.3355273 0.9248014 -0.2413527 0.2940892 -0.9248028 0.1793423 0.3355259 -0.924802 0.09255081 0.9396816 0.3292916 0.2740949 0.9035701 0.3292918 0.4451061 0.832735 0.3292918 0.599012 0.7298982 0.3292919 0.7298982 0.599012 0.329292 0.8327349 0.445106 0.329292 0.9035699 0.2740949 0.3292921 0.9396814 0.09255069 0.3292922 0.9396814 -0.09255069 0.3292922 0.9035699 -0.2740949 0.3292921 0.8327349 -0.445106 0.329292 0.7298982 -0.599012 0.329292 0.599012 -0.7298982 0.3292919 0.4451061 -0.832735 0.3292918 0.2740949 -0.9035701 0.3292918 0.09255069 -0.9396816 0.3292917 -0.09255069 -0.9396816 0.3292915 -0.2740949 -0.9035702 0.3292914 -0.4451062 -0.8327351 0.3292912 -0.5990122 -0.7298984 0.3292912 -0.7298984 -0.5990122 0.3292912 -0.8327351 -0.4451062 0.329291 -0.9035703 -0.274095 0.329291 -0.9396818 -0.09255069 0.329291 -0.9396818 0.09255069 0.329291 -0.9035703 0.274095 0.329291 -0.8327351 0.4451062 0.329291 -0.7298984 0.5990122 0.3292912 -0.5990122 0.7298984 0.3292912 -0.4451062 0.8327351 0.3292912 -0.2740949 0.9035702 0.3292914 -0.09255075 0.9396816 0.3292915 -0.09801733 0.9951847 0 -0.2902848 0.9569403 0 -0.4713967 0.8819213 0 -0.6343932 0.7730106 0 -0.7730104 0.6343933 0 -0.8819213 0.4713967 0 -0.9569404 0.2902845 0 -0.9951847 0.09801733 0 -0.9951847 -0.09801733 0 -0.9569404 -0.2902845 0 -0.8819213 -0.4713967 0 -0.7730104 -0.6343933 0 -0.6343932 -0.7730106 0 -0.4713967 -0.8819213 0 -0.2902848 -0.9569403 0 -0.09801703 -0.9951848 0 0.09801697 -0.9951848 0 0.2902848 -0.9569403 0 0.4713967 -0.8819213 0 0.6343933 -0.7730104 0 0.7730103 -0.6343935 0 0.8819213 -0.4713967 0 0.9569404 -0.2902845 0 0.9951847 -0.09801733 0 0.9951847 0.09801733 0 0.9569404 0.2902845 0 0.8819213 0.4713967 0 0.7730103 0.6343935 0 0.6343933 0.7730104 0 0.4713967 0.8819213 0 0.2902848 0.9569403 0 0.09801733 0.9951847 0 -0.1104469 0.3640947 0.92479 0.2941102 0.2413701 0.9247916 0.03728777 -0.3785887 -0.9248136 -0.03729373 0.3786466 0.9247897 0.335546 0.179353 0.9247927 0.1104304 -0.3640406 -0.9248133 0.3640861 0.1104443 0.9247937 0.1793299 -0.3355026 -0.9248128 0.3786339 0.03729224 0.9247949 0.2413386 -0.2940719 -0.9248121 0.3786311 -0.03729194 0.9247961 0.2940735 -0.2413399 -0.9248112 0.3640778 -0.1104417 0.9247974 0.3355084 -0.179333 -0.9248101 0.3355336 -0.1793464 0.9247984 0.3640505 -0.1104335 -0.924809 0.2940956 -0.2413582 0.9247995 0.3786027 -0.03728914 -0.9248079 0.2413567 -0.294094 0.9248004 0.3786056 0.03728944 -0.9248066 0.1793433 -0.3355278 0.9248011 0.3640587 0.110436 -0.9248055 0.1104388 -0.3640677 0.9248016 0.3355208 0.1793396 -0.9248043 -0.03729069 0.3786184 -0.9248014 0.03729045 -0.3786172 0.9248019 0.2940883 0.241352 -0.9248033 -0.1104387 0.3640675 -0.9248016 -0.03729057 -0.3786169 0.924802 0.2413532 0.2940898 -0.9248026 -0.179342 0.3355255 -0.9248022 -0.1104386 -0.3640674 0.9248017
+
+
+
+
+
+
+
+
+
+ 1 1 0.96875 0.8776509 1 0.8776509 0.96875 1 0.9375 0.8776509 0.96875 0.8776509 0.9375 1 0.90625 0.8776509 0.9375 0.8776509 0.90625 1 0.875 0.8776509 0.90625 0.8776509 0.875 1 0.84375 0.8776509 0.875 0.8776509 0.84375 1 0.8125 0.8776509 0.84375 0.8776509 0.8125 1 0.78125 0.8776509 0.8125 0.8776509 0.78125 1 0.75 0.8776509 0.78125 0.8776509 0.75 1 0.71875 0.8776509 0.75 0.8776509 0.71875 1 0.6875 0.8776509 0.71875 0.8776509 0.6875 1 0.65625 0.8776509 0.6875 0.8776509 0.65625 1 0.625 0.8776509 0.65625 0.8776509 0.625 1 0.59375 0.8776509 0.625 0.8776509 0.59375 1 0.5625 0.8776509 0.59375 0.8776509 0.5625 1 0.53125 0.8776509 0.5625 0.8776509 0.53125 1 0.5 0.8776509 0.53125 0.8776509 0.5 1 0.46875 0.8776509 0.5 0.8776509 0.46875 1 0.4375 0.8776509 0.46875 0.8776509 0.4375 1 0.40625 0.8776509 0.4375 0.8776509 0.40625 1 0.375 0.8776509 0.40625 0.8776509 0.375 1 0.34375 0.8776509 0.375 0.8776509 0.34375 1 0.3125 0.8776509 0.34375 0.8776509 0.3125 1 0.28125 0.8776509 0.3125 0.8776509 0.28125 1 0.25 0.8776509 0.28125 0.8776509 0.25 1 0.21875 0.8776509 0.25 0.8776509 0.21875 1 0.1875 0.8776509 0.21875 0.8776509 0.1875 1 0.15625 0.8776509 0.1875 0.8776509 0.15625 1 0.125 0.8776509 0.15625 0.8776509 0.125 1 0.09375 0.8776509 0.125 0.8776509 0.09375 1 0.0625 0.8776509 0.09375 0.8776509 0.1581559 0.02826887 0.4717311 0.1581559 0.341844 0.4717311 0.0625 1 0.03125 0.8776509 0.0625 0.8776509 0.03125 1 0 0.8776509 0.03125 0.8776509 0.7968217 0.01461154 0.5146116 0.2031783 0.7031784 0.4853885 0.46875 0.8776509 0.5 0.8776509 0.5 0.8776509 0.90625 0.6729488 0.875 0.6729488 0.875 0.6729488 0.0625 0.6729487 0.09375 0.6729487 0.0625 0.6729487 0.4375 0.8776509 0.46875 0.8776509 0.46875 0.8776509 0.9375 0.6729487 0.90625 0.6729488 0.90625 0.6729488 0.09375 0.6729487 0.125 0.6729488 0.09375 0.6729487 0.40625 0.8776509 0.4375 0.8776509 0.4375 0.8776509 0.96875 0.6729487 0.9375 0.6729487 0.9375 0.6729487 0.125 0.6729488 0.15625 0.6729488 0.125 0.6729488 0.375 0.8776509 0.40625 0.8776509 0.40625 0.8776509 1 0.6729488 0.96875 0.6729487 0.96875 0.6729487 0.15625 0.6729488 0.1875 0.6729487 0.15625 0.6729488 0.34375 0.8776509 0.375 0.8776509 0.375 0.8776509 0.1875 0.6729487 0.21875 0.6729487 0.1875 0.6729487 0.3125 0.8776509 0.34375 0.8776509 0.34375 0.8776509 0.21875 0.6729487 0.25 0.6729488 0.21875 0.6729487 0.28125 0.8776509 0.3125 0.8776509 0.3125 0.8776509 0.25 0.6729488 0.28125 0.6729487 0.25 0.6729488 0.25 0.8776509 0.28125 0.8776509 0.28125 0.8776509 0.28125 0.6729487 0.3125 0.6729487 0.28125 0.6729487 0.21875 0.8776509 0.25 0.8776509 0.25 0.8776509 0.3125 0.6729487 0.34375 0.6729487 0.3125 0.6729487 0.1875 0.8776509 0.21875 0.8776509 0.21875 0.8776509 0.34375 0.6729487 0.375 0.6729488 0.34375 0.6729487 0.15625 0.8776509 0.1875 0.8776509 0.1875 0.8776509 1 0.8776509 0.96875 0.8776509 1 0.8776509 0.375 0.6729488 0.40625 0.6729488 0.375 0.6729488 0.125 0.8776509 0.15625 0.8776509 0.15625 0.8776509 0.96875 0.8776509 0.9375 0.8776509 0.96875 0.8776509 0.40625 0.6729488 0.4375 0.6729487 0.40625 0.6729488 0.09375 0.8776509 0.125 0.8776509 0.125 0.8776509 0.9375 0.8776509 0.90625 0.8776509 0.9375 0.8776509 1 0.5 0.96875 0.6729487 0.96875 0.5 0.96875 0.5 0.9375 0.6729487 0.9375 0.5 0.9375 0.5 0.90625 0.6729488 0.90625 0.5 0.90625 0.5 0.875 0.6729488 0.875 0.5 0.875 0.5 0.84375 0.6729487 0.84375 0.5 0.84375 0.5 0.8125 0.6729487 0.8125 0.5 0.8125 0.5 0.78125 0.6729487 0.78125 0.5 0.78125 0.5 0.75 0.6729488 0.75 0.5 0.75 0.6729488 0.71875 0.5 0.75 0.5 0.71875 0.6729487 0.6875 0.5 0.71875 0.5 0.6875 0.6729487 0.65625 0.5 0.6875 0.5 0.65625 0.6729488 0.625 0.5 0.65625 0.5 0.625 0.6729488 0.59375 0.5 0.625 0.5 0.59375 0.6729487 0.5625 0.5 0.59375 0.5 0.5625 0.6729487 0.53125 0.5 0.5625 0.5 0.53125 0.6729487 0.5 0.5 0.53125 0.5 0.5 0.6729488 0.46875 0.5 0.5 0.5 0.46875 0.6729487 0.4375 0.5 0.46875 0.5 0.4375 0.6729487 0.40625 0.5 0.4375 0.5 0.40625 0.6729488 0.375 0.5 0.40625 0.5 0.375 0.6729488 0.34375 0.5 0.375 0.5 0.34375 0.6729487 0.3125 0.5 0.34375 0.5 0.3125 0.6729487 0.28125 0.5 0.3125 0.5 0.28125 0.6729487 0.25 0.5 0.28125 0.5 0.25 0.5 0.21875 0.6729487 0.21875 0.5 0.21875 0.5 0.1875 0.6729487 0.1875 0.5 0.1875 0.5 0.15625 0.6729488 0.15625 0.5 0.15625 0.5 0.125 0.6729488 0.125 0.5 0.125 0.5 0.09375 0.6729487 0.09375 0.5 0.09375 0.5 0.0625 0.6729487 0.0625 0.5 0.0625 0.5 0.03125 0.6729487 0.03125 0.5 0.03125 0.5 0 0.6729488 0 0.5 0.03125 0.8776509 0 0.6729488 0.03125 0.6729487 0.0625 0.8776509 0.03125 0.6729487 0.0625 0.6729487 0.09375 0.8776509 0.0625 0.6729487 0.09375 0.6729487 0.125 0.8776509 0.09375 0.6729487 0.125 0.6729488 0.15625 0.8776509 0.125 0.6729488 0.15625 0.6729488 0.1875 0.8776509 0.15625 0.6729488 0.1875 0.6729487 0.21875 0.8776509 0.1875 0.6729487 0.21875 0.6729487 0.25 0.8776509 0.21875 0.6729487 0.25 0.6729488 0.28125 0.8776509 0.25 0.6729488 0.28125 0.6729487 0.3125 0.8776509 0.28125 0.6729487 0.3125 0.6729487 0.34375 0.8776509 0.3125 0.6729487 0.34375 0.6729487 0.375 0.8776509 0.34375 0.6729487 0.375 0.6729488 0.40625 0.8776509 0.375 0.6729488 0.40625 0.6729488 0.4375 0.8776509 0.40625 0.6729488 0.4375 0.6729487 0.46875 0.8776509 0.4375 0.6729487 0.46875 0.6729487 0.5 0.8776509 0.46875 0.6729487 0.5 0.6729488 0.53125 0.8776509 0.5 0.6729488 0.53125 0.6729487 0.5625 0.8776509 0.53125 0.6729487 0.5625 0.6729487 0.59375 0.8776509 0.5625 0.6729487 0.59375 0.6729487 0.625 0.8776509 0.59375 0.6729487 0.625 0.6729488 0.65625 0.8776509 0.625 0.6729488 0.65625 0.6729488 0.6875 0.8776509 0.65625 0.6729488 0.6875 0.6729487 0.71875 0.8776509 0.6875 0.6729487 0.71875 0.6729487 0.75 0.8776509 0.71875 0.6729487 0.75 0.6729488 0.78125 0.8776509 0.75 0.6729488 0.78125 0.6729487 0.8125 0.8776509 0.78125 0.6729487 0.8125 0.6729487 0.84375 0.8776509 0.8125 0.6729487 0.84375 0.6729487 0.875 0.8776509 0.84375 0.6729487 0.875 0.6729488 0.90625 0.8776509 0.875 0.6729488 0.90625 0.6729488 0.9375 0.8776509 0.90625 0.6729488 0.9375 0.6729487 0.96875 0.8776509 0.9375 0.6729487 0.96875 0.6729487 1 0.6729488 0.96875 0.8776509 0.96875 0.6729487 0.03125 0.6729487 0.0625 0.6729487 0.03125 0.6729487 0.875 0.6729488 0.84375 0.6729487 0.84375 0.6729487 0.53125 0.8776509 0.5 0.8776509 0.53125 0.8776509 0 0.6729488 0.03125 0.6729487 0 0.6729488 0.84375 0.6729487 0.8125 0.6729487 0.8125 0.6729487 0.5625 0.8776509 0.53125 0.8776509 0.5625 0.8776509 0.8125 0.6729487 0.78125 0.6729487 0.78125 0.6729487 0.59375 0.8776509 0.5625 0.8776509 0.59375 0.8776509 0.78125 0.6729487 0.75 0.6729488 0.75 0.6729488 0.625 0.8776509 0.59375 0.8776509 0.625 0.8776509 0.75 0.6729488 0.71875 0.6729487 0.71875 0.6729487 0.65625 0.8776509 0.625 0.8776509 0.65625 0.8776509 0.71875 0.6729487 0.6875 0.6729487 0.6875 0.6729487 0.6875 0.8776509 0.65625 0.8776509 0.6875 0.8776509 0.6875 0.6729487 0.65625 0.6729488 0.65625 0.6729488 0.71875 0.8776509 0.6875 0.8776509 0.71875 0.8776509 0.65625 0.6729488 0.625 0.6729488 0.625 0.6729488 0.75 0.8776509 0.71875 0.8776509 0.75 0.8776509 0.625 0.6729488 0.59375 0.6729487 0.59375 0.6729487 0.78125 0.8776509 0.75 0.8776509 0.78125 0.8776509 0.59375 0.6729487 0.5625 0.6729487 0.5625 0.6729487 0.8125 0.8776509 0.78125 0.8776509 0.8125 0.8776509 0.5625 0.6729487 0.53125 0.6729487 0.53125 0.6729487 0.84375 0.8776509 0.8125 0.8776509 0.84375 0.8776509 0 0.8776509 0.03125 0.8776509 0.03125 0.8776509 0.53125 0.6729487 0.5 0.6729488 0.5 0.6729488 0.875 0.8776509 0.84375 0.8776509 0.875 0.8776509 0.03125 0.8776509 0.0625 0.8776509 0.0625 0.8776509 0.46875 0.6729487 0.5 0.6729488 0.46875 0.6729487 0.90625 0.8776509 0.875 0.8776509 0.90625 0.8776509 0.0625 0.8776509 0.09375 0.8776509 0.09375 0.8776509 0.4375 0.6729487 0.46875 0.6729487 0.4375 0.6729487 1 1 0.96875 1 0.96875 0.8776509 0.96875 1 0.9375 1 0.9375 0.8776509 0.9375 1 0.90625 1 0.90625 0.8776509 0.90625 1 0.875 1 0.875 0.8776509 0.875 1 0.84375 1 0.84375 0.8776509 0.84375 1 0.8125 1 0.8125 0.8776509 0.8125 1 0.78125 1 0.78125 0.8776509 0.78125 1 0.75 1 0.75 0.8776509 0.75 1 0.71875 1 0.71875 0.8776509 0.71875 1 0.6875 1 0.6875 0.8776509 0.6875 1 0.65625 1 0.65625 0.8776509 0.65625 1 0.625 1 0.625 0.8776509 0.625 1 0.59375 1 0.59375 0.8776509 0.59375 1 0.5625 1 0.5625 0.8776509 0.5625 1 0.53125 1 0.53125 0.8776509 0.53125 1 0.5 1 0.5 0.8776509 0.5 1 0.46875 1 0.46875 0.8776509 0.46875 1 0.4375 1 0.4375 0.8776509 0.4375 1 0.40625 1 0.40625 0.8776509 0.40625 1 0.375 1 0.375 0.8776509 0.375 1 0.34375 1 0.34375 0.8776509 0.34375 1 0.3125 1 0.3125 0.8776509 0.3125 1 0.28125 1 0.28125 0.8776509 0.28125 1 0.25 1 0.25 0.8776509 0.25 1 0.21875 1 0.21875 0.8776509 0.21875 1 0.1875 1 0.1875 0.8776509 0.1875 1 0.15625 1 0.15625 0.8776509 0.15625 1 0.125 1 0.125 0.8776509 0.125 1 0.09375 1 0.09375 0.8776509 0.09375 1 0.0625 1 0.0625 0.8776509 0.341844 0.4717311 0.2968217 0.4853885 0.25 0.49 0.25 0.49 0.2031783 0.4853885 0.341844 0.4717311 0.2031783 0.4853885 0.1581559 0.4717311 0.341844 0.4717311 0.1581559 0.4717311 0.1166631 0.4495527 0.08029437 0.4197056 0.08029437 0.4197056 0.05044728 0.3833369 0.02826887 0.341844 0.02826887 0.341844 0.01461154 0.2968217 0.00999999 0.25 0.00999999 0.25 0.01461154 0.2031783 0.02826887 0.341844 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.341844 0.02826887 0.1581559 0.05044728 0.1166631 0.08029437 0.08029437 0.08029437 0.08029437 0.1166631 0.05044728 0.1581559 0.02826887 0.1581559 0.02826887 0.2031783 0.01461154 0.341844 0.02826887 0.2031783 0.01461154 0.25 0.00999999 0.341844 0.02826887 0.25 0.00999999 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.02826887 0.3833369 0.05044728 0.4197056 0.08029437 0.4197056 0.08029437 0.4495527 0.1166631 0.4717311 0.1581559 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.341844 0.4853885 0.2031783 0.49 0.25 0.4717311 0.341844 0.49 0.25 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.4495527 0.341844 0.4717311 0.1581559 0.4717311 0.08029437 0.4197056 0.341844 0.4717311 0.08029437 0.4197056 0.02826887 0.341844 0.341844 0.4717311 0.02826887 0.1581559 0.08029437 0.08029437 0.02826887 0.341844 0.08029437 0.08029437 0.1581559 0.02826887 0.02826887 0.341844 0.341844 0.02826887 0.4197056 0.08029437 0.1581559 0.02826887 0.4197056 0.08029437 0.4717311 0.1581559 0.1581559 0.02826887 0.4717311 0.341844 0.4197056 0.4197056 0.4717311 0.1581559 0.4197056 0.4197056 0.341844 0.4717311 0.4717311 0.1581559 0.341844 0.4717311 0.02826887 0.341844 0.1581559 0.02826887 0.0625 1 0.03125 1 0.03125 0.8776509 0.03125 1 0 1 0 0.8776509 0.7031784 0.4853885 0.75 0.49 0.7968217 0.4853885 0.7968217 0.4853885 0.841844 0.4717311 0.7031784 0.4853885 0.841844 0.4717311 0.8833369 0.4495527 0.7031784 0.4853885 0.8833369 0.4495527 0.9197056 0.4197056 0.9495527 0.3833369 0.9495527 0.3833369 0.9717311 0.341844 0.9853885 0.2968217 0.9853885 0.2968217 0.99 0.25 0.9853885 0.2031783 0.9853885 0.2031783 0.9717311 0.1581559 0.9853885 0.2968217 0.9717311 0.1581559 0.9495527 0.1166631 0.9853885 0.2968217 0.9495527 0.1166631 0.9197056 0.08029437 0.8833369 0.05044728 0.8833369 0.05044728 0.841844 0.02826887 0.7968217 0.01461154 0.7968217 0.01461154 0.75 0.00999999 0.7031784 0.01461154 0.7031784 0.01461154 0.658156 0.02826887 0.7968217 0.01461154 0.658156 0.02826887 0.6166632 0.05044728 0.7968217 0.01461154 0.6166632 0.05044728 0.5802944 0.08029437 0.5504473 0.1166631 0.5504473 0.1166631 0.5282689 0.1581559 0.6166632 0.05044728 0.5282689 0.1581559 0.5146116 0.2031783 0.6166632 0.05044728 0.5146116 0.2031783 0.51 0.25 0.5146116 0.2968217 0.5146116 0.2968217 0.5282689 0.341844 0.5146116 0.2031783 0.5282689 0.341844 0.5504473 0.3833369 0.5146116 0.2031783 0.5504473 0.3833369 0.5802944 0.4197056 0.6166632 0.4495527 0.6166632 0.4495527 0.658156 0.4717311 0.7031784 0.4853885 0.8833369 0.4495527 0.9495527 0.3833369 0.9853885 0.2968217 0.9495527 0.1166631 0.8833369 0.05044728 0.9853885 0.2968217 0.8833369 0.05044728 0.7968217 0.01461154 0.9853885 0.2968217 0.5504473 0.3833369 0.6166632 0.4495527 0.5146116 0.2031783 0.6166632 0.4495527 0.7031784 0.4853885 0.5146116 0.2031783 0.7031784 0.4853885 0.8833369 0.4495527 0.9853885 0.2968217 0.7968217 0.01461154 0.6166632 0.05044728 0.5146116 0.2031783 0.7031784 0.4853885 0.9853885 0.2968217 0.7968217 0.01461154 0.46875 0.8776509 0.46875 0.8776509 0.5 0.8776509 0.90625 0.6729488 0.90625 0.6729488 0.875 0.6729488 0.0625 0.6729487 0.09375 0.6729487 0.09375 0.6729487 0.4375 0.8776509 0.4375 0.8776509 0.46875 0.8776509 0.9375 0.6729487 0.9375 0.6729487 0.90625 0.6729488 0.09375 0.6729487 0.125 0.6729488 0.125 0.6729488 0.40625 0.8776509 0.40625 0.8776509 0.4375 0.8776509 0.96875 0.6729487 0.96875 0.6729487 0.9375 0.6729487 0.125 0.6729488 0.15625 0.6729488 0.15625 0.6729488 0.375 0.8776509 0.375 0.8776509 0.40625 0.8776509 1 0.6729488 1 0.6729488 0.96875 0.6729487 0.15625 0.6729488 0.1875 0.6729487 0.1875 0.6729487 0.34375 0.8776509 0.34375 0.8776509 0.375 0.8776509 0.1875 0.6729487 0.21875 0.6729487 0.21875 0.6729487 0.3125 0.8776509 0.3125 0.8776509 0.34375 0.8776509 0.21875 0.6729487 0.25 0.6729488 0.25 0.6729488 0.28125 0.8776509 0.28125 0.8776509 0.3125 0.8776509 0.25 0.6729488 0.28125 0.6729487 0.28125 0.6729487 0.25 0.8776509 0.25 0.8776509 0.28125 0.8776509 0.28125 0.6729487 0.3125 0.6729487 0.3125 0.6729487 0.21875 0.8776509 0.21875 0.8776509 0.25 0.8776509 0.3125 0.6729487 0.34375 0.6729487 0.34375 0.6729487 0.1875 0.8776509 0.1875 0.8776509 0.21875 0.8776509 0.34375 0.6729487 0.375 0.6729488 0.375 0.6729488 0.15625 0.8776509 0.15625 0.8776509 0.1875 0.8776509 1 0.8776509 0.96875 0.8776509 0.96875 0.8776509 0.375 0.6729488 0.40625 0.6729488 0.40625 0.6729488 0.125 0.8776509 0.125 0.8776509 0.15625 0.8776509 0.96875 0.8776509 0.9375 0.8776509 0.9375 0.8776509 0.40625 0.6729488 0.4375 0.6729487 0.4375 0.6729487 0.09375 0.8776509 0.09375 0.8776509 0.125 0.8776509 0.9375 0.8776509 0.90625 0.8776509 0.90625 0.8776509 1 0.5 1 0.6729488 0.96875 0.6729487 0.96875 0.5 0.96875 0.6729487 0.9375 0.6729487 0.9375 0.5 0.9375 0.6729487 0.90625 0.6729488 0.90625 0.5 0.90625 0.6729488 0.875 0.6729488 0.875 0.5 0.875 0.6729488 0.84375 0.6729487 0.84375 0.5 0.84375 0.6729487 0.8125 0.6729487 0.8125 0.5 0.8125 0.6729487 0.78125 0.6729487 0.78125 0.5 0.78125 0.6729487 0.75 0.6729488 0.75 0.6729488 0.71875 0.6729487 0.71875 0.5 0.71875 0.6729487 0.6875 0.6729487 0.6875 0.5 0.6875 0.6729487 0.65625 0.6729488 0.65625 0.5 0.65625 0.6729488 0.625 0.6729488 0.625 0.5 0.625 0.6729488 0.59375 0.6729487 0.59375 0.5 0.59375 0.6729487 0.5625 0.6729487 0.5625 0.5 0.5625 0.6729487 0.53125 0.6729487 0.53125 0.5 0.53125 0.6729487 0.5 0.6729488 0.5 0.5 0.5 0.6729488 0.46875 0.6729487 0.46875 0.5 0.46875 0.6729487 0.4375 0.6729487 0.4375 0.5 0.4375 0.6729487 0.40625 0.6729488 0.40625 0.5 0.40625 0.6729488 0.375 0.6729488 0.375 0.5 0.375 0.6729488 0.34375 0.6729487 0.34375 0.5 0.34375 0.6729487 0.3125 0.6729487 0.3125 0.5 0.3125 0.6729487 0.28125 0.6729487 0.28125 0.5 0.28125 0.6729487 0.25 0.6729488 0.25 0.5 0.25 0.5 0.25 0.6729488 0.21875 0.6729487 0.21875 0.5 0.21875 0.6729487 0.1875 0.6729487 0.1875 0.5 0.1875 0.6729487 0.15625 0.6729488 0.15625 0.5 0.15625 0.6729488 0.125 0.6729488 0.125 0.5 0.125 0.6729488 0.09375 0.6729487 0.09375 0.5 0.09375 0.6729487 0.0625 0.6729487 0.0625 0.5 0.0625 0.6729487 0.03125 0.6729487 0.03125 0.5 0.03125 0.6729487 0 0.6729488 0.03125 0.8776509 0 0.8776509 0 0.6729488 0.0625 0.8776509 0.03125 0.8776509 0.03125 0.6729487 0.09375 0.8776509 0.0625 0.8776509 0.0625 0.6729487 0.125 0.8776509 0.09375 0.8776509 0.09375 0.6729487 0.15625 0.8776509 0.125 0.8776509 0.125 0.6729488 0.1875 0.8776509 0.15625 0.8776509 0.15625 0.6729488 0.21875 0.8776509 0.1875 0.8776509 0.1875 0.6729487 0.25 0.8776509 0.21875 0.8776509 0.21875 0.6729487 0.28125 0.8776509 0.25 0.8776509 0.25 0.6729488 0.3125 0.8776509 0.28125 0.8776509 0.28125 0.6729487 0.34375 0.8776509 0.3125 0.8776509 0.3125 0.6729487 0.375 0.8776509 0.34375 0.8776509 0.34375 0.6729487 0.40625 0.8776509 0.375 0.8776509 0.375 0.6729488 0.4375 0.8776509 0.40625 0.8776509 0.40625 0.6729488 0.46875 0.8776509 0.4375 0.8776509 0.4375 0.6729487 0.5 0.8776509 0.46875 0.8776509 0.46875 0.6729487 0.53125 0.8776509 0.5 0.8776509 0.5 0.6729488 0.5625 0.8776509 0.53125 0.8776509 0.53125 0.6729487 0.59375 0.8776509 0.5625 0.8776509 0.5625 0.6729487 0.625 0.8776509 0.59375 0.8776509 0.59375 0.6729487 0.65625 0.8776509 0.625 0.8776509 0.625 0.6729488 0.6875 0.8776509 0.65625 0.8776509 0.65625 0.6729488 0.71875 0.8776509 0.6875 0.8776509 0.6875 0.6729487 0.75 0.8776509 0.71875 0.8776509 0.71875 0.6729487 0.78125 0.8776509 0.75 0.8776509 0.75 0.6729488 0.8125 0.8776509 0.78125 0.8776509 0.78125 0.6729487 0.84375 0.8776509 0.8125 0.8776509 0.8125 0.6729487 0.875 0.8776509 0.84375 0.8776509 0.84375 0.6729487 0.90625 0.8776509 0.875 0.8776509 0.875 0.6729488 0.9375 0.8776509 0.90625 0.8776509 0.90625 0.6729488 0.96875 0.8776509 0.9375 0.8776509 0.9375 0.6729487 1 0.6729488 1 0.8776509 0.96875 0.8776509 0.03125 0.6729487 0.0625 0.6729487 0.0625 0.6729487 0.875 0.6729488 0.875 0.6729488 0.84375 0.6729487 0.53125 0.8776509 0.5 0.8776509 0.5 0.8776509 0 0.6729488 0.03125 0.6729487 0.03125 0.6729487 0.84375 0.6729487 0.84375 0.6729487 0.8125 0.6729487 0.5625 0.8776509 0.53125 0.8776509 0.53125 0.8776509 0.8125 0.6729487 0.8125 0.6729487 0.78125 0.6729487 0.59375 0.8776509 0.5625 0.8776509 0.5625 0.8776509 0.78125 0.6729487 0.78125 0.6729487 0.75 0.6729488 0.625 0.8776509 0.59375 0.8776509 0.59375 0.8776509 0.75 0.6729488 0.75 0.6729488 0.71875 0.6729487 0.65625 0.8776509 0.625 0.8776509 0.625 0.8776509 0.71875 0.6729487 0.71875 0.6729487 0.6875 0.6729487 0.6875 0.8776509 0.65625 0.8776509 0.65625 0.8776509 0.6875 0.6729487 0.6875 0.6729487 0.65625 0.6729488 0.71875 0.8776509 0.6875 0.8776509 0.6875 0.8776509 0.65625 0.6729488 0.65625 0.6729488 0.625 0.6729488 0.75 0.8776509 0.71875 0.8776509 0.71875 0.8776509 0.625 0.6729488 0.625 0.6729488 0.59375 0.6729487 0.78125 0.8776509 0.75 0.8776509 0.75 0.8776509 0.59375 0.6729487 0.59375 0.6729487 0.5625 0.6729487 0.8125 0.8776509 0.78125 0.8776509 0.78125 0.8776509 0.5625 0.6729487 0.5625 0.6729487 0.53125 0.6729487 0.84375 0.8776509 0.8125 0.8776509 0.8125 0.8776509 0 0.8776509 0 0.8776509 0.03125 0.8776509 0.53125 0.6729487 0.53125 0.6729487 0.5 0.6729488 0.875 0.8776509 0.84375 0.8776509 0.84375 0.8776509 0.03125 0.8776509 0.03125 0.8776509 0.0625 0.8776509 0.46875 0.6729487 0.5 0.6729488 0.5 0.6729488 0.90625 0.8776509 0.875 0.8776509 0.875 0.8776509 0.0625 0.8776509 0.0625 0.8776509 0.09375 0.8776509 0.4375 0.6729487 0.46875 0.6729487 0.46875 0.6729487
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 65 0 1 64 0 2 3 1 3 66 1 4 65 1 5 5 2 6 67 2 7 66 2 8 7 3 9 68 3 10 67 3 11 9 4 12 69 4 13 68 4 14 11 5 15 70 5 16 69 5 17 13 6 18 71 6 19 70 6 20 15 7 21 72 7 22 71 7 23 17 8 24 73 8 25 72 8 26 19 9 27 74 9 28 73 9 29 21 10 30 75 10 31 74 10 32 23 11 33 76 11 34 75 11 35 25 12 36 77 12 37 76 12 38 27 13 39 78 13 40 77 13 41 29 14 42 79 14 43 78 14 44 31 15 45 80 15 46 79 15 47 33 16 48 81 16 49 80 16 50 35 17 51 82 17 52 81 17 53 37 18 54 83 18 55 82 18 56 39 19 57 84 19 58 83 19 59 41 20 60 85 20 61 84 20 62 43 21 63 86 21 64 85 21 65 45 22 66 87 22 67 86 22 68 47 23 69 88 23 70 87 23 71 49 24 72 89 24 73 88 24 74 51 25 75 90 25 76 89 25 77 53 26 78 91 26 79 90 26 80 55 27 81 92 27 82 91 27 83 57 28 84 93 28 85 92 28 86 59 29 87 94 29 88 93 29 89 37 30 90 21 30 91 5 30 92 61 31 93 95 31 94 94 31 95 63 32 96 64 32 97 95 32 98 30 33 99 46 33 100 62 33 101 81 34 102 145 34 103 80 34 104 98 35 105 164 35 106 99 35 107 125 36 108 189 36 109 190 36 110 82 37 111 144 37 112 81 37 113 97 38 114 163 38 115 98 38 116 124 39 117 188 39 118 189 39 119 83 40 120 143 40 121 82 40 122 96 41 123 162 41 124 97 41 125 123 42 126 187 42 127 188 42 128 84 43 129 142 43 130 83 43 131 127 44 132 161 44 133 96 44 134 122 45 135 186 45 136 187 45 137 85 46 138 141 46 139 84 46 140 121 47 141 185 47 142 186 47 143 86 48 144 140 48 145 85 48 146 120 49 147 184 49 148 185 49 149 87 50 150 139 50 151 86 50 152 119 51 153 183 51 154 184 51 155 88 52 156 138 52 157 87 52 158 118 53 159 182 53 160 183 53 161 89 54 162 137 54 163 88 54 164 117 55 165 181 55 166 182 55 167 90 56 168 136 56 169 89 56 170 116 57 171 180 57 172 181 57 173 91 58 174 135 58 175 90 58 176 64 59 177 160 59 178 129 59 179 115 60 180 179 60 181 180 60 182 92 61 183 134 61 184 91 61 185 65 62 186 159 62 187 160 62 188 114 63 189 178 63 190 179 63 191 93 64 192 133 64 193 92 64 194 66 65 195 158 65 196 159 65 197 0 66 198 96 66 199 2 66 200 2 67 201 97 67 202 4 67 203 4 68 204 98 68 205 6 68 206 6 69 207 99 69 208 8 69 209 8 70 210 100 70 211 10 70 212 10 71 213 101 71 214 12 71 215 12 72 216 102 72 217 14 72 218 14 73 219 103 73 220 16 73 221 103 74 222 18 74 223 16 74 224 104 75 225 20 75 226 18 75 227 105 76 228 22 76 229 20 76 230 106 77 231 24 77 232 22 77 233 107 78 234 26 78 235 24 78 236 108 79 237 28 79 238 26 79 239 109 80 240 30 80 241 28 80 242 110 81 243 32 81 244 30 81 245 111 82 246 34 82 247 32 82 248 112 83 249 36 83 250 34 83 251 113 84 252 38 84 253 36 84 254 114 85 255 40 85 256 38 85 257 115 86 258 42 86 259 40 86 260 116 87 261 44 87 262 42 87 263 117 88 264 46 88 265 44 88 266 118 89 267 48 89 268 46 89 269 48 90 270 120 90 271 50 90 272 50 91 273 121 91 274 52 91 275 52 92 276 122 92 277 54 92 278 54 93 279 123 93 280 56 93 281 56 94 282 124 94 283 58 94 284 58 95 285 125 95 286 60 95 287 60 96 288 126 96 289 62 96 290 62 97 291 127 97 292 0 97 293 126 130 390 190 130 391 191 130 392 99 131 393 165 131 394 100 131 395 79 132 396 145 132 397 146 132 398 127 133 399 191 133 400 128 133 401 100 134 402 166 134 403 101 134 404 78 135 405 146 135 406 147 135 407 101 136 408 167 136 409 102 136 410 77 137 411 147 137 412 148 137 413 102 138 414 168 138 415 103 138 416 76 139 417 148 139 418 149 139 419 103 140 420 169 140 421 104 140 422 75 141 423 149 141 424 150 141 425 104 142 426 170 142 427 105 142 428 74 143 429 150 143 430 151 143 431 105 144 432 171 144 433 106 144 434 73 145 435 151 145 436 152 145 437 106 146 438 172 146 439 107 146 440 72 147 441 152 147 442 153 147 443 107 148 444 173 148 445 108 148 446 71 149 447 153 149 448 154 149 449 108 150 450 174 150 451 109 150 452 70 151 453 154 151 454 155 151 455 109 152 456 175 152 457 110 152 458 69 153 459 155 153 460 156 153 461 64 154 462 130 154 463 95 154 464 110 155 465 176 155 466 111 155 467 68 156 468 156 156 469 157 156 470 95 157 471 131 157 472 94 157 473 112 158 474 176 158 475 177 158 476 67 159 477 157 159 478 158 159 479 94 160 480 132 160 481 93 160 482 113 161 483 177 161 484 178 161 485 1 162 486 3 162 487 65 162 488 3 163 489 5 163 490 66 163 491 5 164 492 7 164 493 67 164 494 7 165 495 9 165 496 68 165 497 9 166 498 11 166 499 69 166 500 11 167 501 13 167 502 70 167 503 13 168 504 15 168 505 71 168 506 15 169 507 17 169 508 72 169 509 17 170 510 19 170 511 73 170 512 19 171 513 21 171 514 74 171 515 21 172 516 23 172 517 75 172 518 23 173 519 25 173 520 76 173 521 25 174 522 27 174 523 77 174 524 27 175 525 29 175 526 78 175 527 29 176 528 31 176 529 79 176 530 31 177 531 33 177 532 80 177 533 33 178 534 35 178 535 81 178 536 35 179 537 37 179 538 82 179 539 37 180 540 39 180 541 83 180 542 39 181 543 41 181 544 84 181 545 41 182 546 43 182 547 85 182 548 43 183 549 45 183 550 86 183 551 45 184 552 47 184 553 87 184 554 47 185 555 49 185 556 88 185 557 49 186 558 51 186 559 89 186 560 51 187 561 53 187 562 90 187 563 53 188 564 55 188 565 91 188 566 55 189 567 57 189 568 92 189 569 57 190 570 59 190 571 93 190 572 59 191 573 61 191 574 94 191 575 5 192 576 3 192 577 1 192 578 1 193 579 63 193 580 5 193 581 63 194 582 61 194 583 5 194 584 61 195 585 59 195 586 57 195 587 57 196 588 55 196 589 53 196 590 53 197 591 51 197 592 49 197 593 49 198 594 47 198 595 53 198 596 47 199 597 45 199 598 53 199 599 45 200 600 43 200 601 41 200 602 41 201 603 39 201 604 37 201 605 37 202 606 35 202 607 29 202 608 35 203 609 33 203 610 29 203 611 33 204 612 31 204 613 29 204 614 29 205 615 27 205 616 25 205 617 25 206 618 23 206 619 21 206 620 21 207 621 19 207 622 13 207 623 19 208 624 17 208 625 13 208 626 17 209 627 15 209 628 13 209 629 13 210 630 11 210 631 9 210 632 9 211 633 7 211 634 5 211 635 61 212 636 57 212 637 5 212 638 57 213 639 53 213 640 5 213 641 45 214 642 41 214 643 53 214 644 41 215 645 37 215 646 53 215 647 29 216 648 25 216 649 37 216 650 25 217 651 21 217 652 37 217 653 13 218 654 9 218 655 21 218 656 9 219 657 5 219 658 21 219 659 5 220 660 53 220 661 37 220 662 61 221 663 63 221 664 95 221 665 63 222 666 1 222 667 64 222 668 62 223 669 0 223 670 2 223 671 2 224 672 4 224 673 62 224 674 4 225 675 6 225 676 62 225 677 6 226 678 8 226 679 10 226 680 10 227 681 12 227 682 14 227 683 14 228 684 16 228 685 18 228 686 18 229 687 20 229 688 14 229 689 20 230 690 22 230 691 14 230 692 22 231 693 24 231 694 26 231 695 26 232 696 28 232 697 30 232 698 30 233 699 32 233 700 34 233 701 34 234 702 36 234 703 30 234 704 36 235 705 38 235 706 30 235 707 38 236 708 40 236 709 42 236 710 42 237 711 44 237 712 38 237 713 44 238 714 46 238 715 38 238 716 46 239 717 48 239 718 50 239 719 50 240 720 52 240 721 46 240 722 52 241 723 54 241 724 46 241 725 54 242 726 56 242 727 58 242 728 58 243 729 60 243 730 62 243 731 6 244 732 10 244 733 14 244 734 22 245 735 26 245 736 14 245 737 26 246 738 30 246 739 14 246 740 54 247 741 58 247 742 46 247 743 58 248 744 62 248 745 46 248 746 62 249 747 6 249 748 14 249 749 30 250 750 38 250 751 46 250 752 62 251 753 14 251 754 30 251 755 81 252 756 144 252 757 145 252 758 98 253 759 163 253 760 164 253 761 125 254 762 124 254 763 189 254 764 82 255 765 143 255 766 144 255 767 97 256 768 162 256 769 163 256 770 124 257 771 123 257 772 188 257 773 83 258 774 142 258 775 143 258 776 96 259 777 161 259 778 162 259 779 123 260 780 122 260 781 187 260 782 84 261 783 141 261 784 142 261 785 127 262 786 128 262 787 161 262 788 122 263 789 121 263 790 186 263 791 85 264 792 140 264 793 141 264 794 121 265 795 120 265 796 185 265 797 86 266 798 139 266 799 140 266 800 120 267 801 119 267 802 184 267 803 87 268 804 138 268 805 139 268 806 119 269 807 118 269 808 183 269 809 88 270 810 137 270 811 138 270 812 118 271 813 117 271 814 182 271 815 89 272 816 136 272 817 137 272 818 117 273 819 116 273 820 181 273 821 90 274 822 135 274 823 136 274 824 116 275 825 115 275 826 180 275 827 91 276 828 134 276 829 135 276 830 64 277 831 65 277 832 160 277 833 115 278 834 114 278 835 179 278 836 92 279 837 133 279 838 134 279 839 65 280 840 66 280 841 159 280 842 114 281 843 113 281 844 178 281 845 93 282 846 132 282 847 133 282 848 66 283 849 67 283 850 158 283 851 0 284 852 127 284 853 96 284 854 2 285 855 96 285 856 97 285 857 4 286 858 97 286 859 98 286 860 6 287 861 98 287 862 99 287 863 8 288 864 99 288 865 100 288 866 10 289 867 100 289 868 101 289 869 12 290 870 101 290 871 102 290 872 14 291 873 102 291 874 103 291 875 103 292 876 104 292 877 18 292 878 104 293 879 105 293 880 20 293 881 105 294 882 106 294 883 22 294 884 106 295 885 107 295 886 24 295 887 107 296 888 108 296 889 26 296 890 108 297 891 109 297 892 28 297 893 109 298 894 110 298 895 30 298 896 110 299 897 111 299 898 32 299 899 111 300 900 112 300 901 34 300 902 112 301 903 113 301 904 36 301 905 113 302 906 114 302 907 38 302 908 114 303 909 115 303 910 40 303 911 115 304 912 116 304 913 42 304 914 116 305 915 117 305 916 44 305 917 117 306 918 118 306 919 46 306 920 118 307 921 119 307 922 48 307 923 48 308 924 119 308 925 120 308 926 50 309 927 120 309 928 121 309 929 52 310 930 121 310 931 122 310 932 54 311 933 122 311 934 123 311 935 56 312 936 123 312 937 124 312 938 58 313 939 124 313 940 125 313 941 60 314 942 125 314 943 126 314 944 62 315 945 126 315 946 127 315 947 126 348 1044 125 348 1045 190 348 1046 99 349 1047 164 349 1048 165 349 1049 79 350 1050 80 350 1051 145 350 1052 127 351 1053 126 351 1054 191 351 1055 100 352 1056 165 352 1057 166 352 1058 78 353 1059 79 353 1060 146 353 1061 101 354 1062 166 354 1063 167 354 1064 77 355 1065 78 355 1066 147 355 1067 102 356 1068 167 356 1069 168 356 1070 76 357 1071 77 357 1072 148 357 1073 103 358 1074 168 358 1075 169 358 1076 75 359 1077 76 359 1078 149 359 1079 104 360 1080 169 360 1081 170 360 1082 74 361 1083 75 361 1084 150 361 1085 105 362 1086 170 362 1087 171 362 1088 73 363 1089 74 363 1090 151 363 1091 106 364 1092 171 364 1093 172 364 1094 72 365 1095 73 365 1096 152 365 1097 107 366 1098 172 366 1099 173 366 1100 71 367 1101 72 367 1102 153 367 1103 108 368 1104 173 368 1105 174 368 1106 70 369 1107 71 369 1108 154 369 1109 109 370 1110 174 370 1111 175 370 1112 69 371 1113 70 371 1114 155 371 1115 64 372 1116 129 372 1117 130 372 1118 110 373 1119 175 373 1120 176 373 1121 68 374 1122 69 374 1123 156 374 1124 95 375 1125 130 375 1126 131 375 1127 112 376 1128 111 376 1129 176 376 1130 67 377 1131 68 377 1132 157 377 1133 94 378 1134 131 378 1135 132 378 1136 113 379 1137 112 379 1138 177 379 1139
+
+
+
+
+
+ 130 98 294 128 98 295 191 98 296 131 99 297 191 99 298 190 99 299 132 100 300 190 100 301 189 100 302 133 101 303 189 101 304 188 101 305 134 102 306 188 102 307 187 102 308 135 103 309 187 103 310 186 103 311 136 104 312 186 104 313 185 104 314 137 105 315 185 105 316 184 105 317 138 106 318 184 106 319 183 106 320 139 107 321 183 107 322 182 107 323 140 108 324 182 108 325 181 108 326 141 109 327 181 109 328 180 109 329 142 110 330 180 110 331 179 110 332 143 111 333 179 111 334 178 111 335 144 112 336 178 112 337 177 112 338 145 113 339 177 113 340 176 113 341 146 114 342 176 114 343 175 114 344 147 115 345 175 115 346 174 115 347 148 116 348 174 116 349 173 116 350 149 117 351 173 117 352 172 117 353 150 118 354 172 118 355 171 118 356 151 119 357 171 119 358 170 119 359 152 120 360 170 120 361 169 120 362 153 121 363 169 121 364 168 121 365 154 122 366 168 122 367 167 122 368 155 123 369 167 123 370 166 123 371 156 124 372 166 124 373 165 124 374 157 125 375 165 125 376 164 125 377 158 126 378 164 126 379 163 126 380 159 127 381 163 127 382 162 127 383 160 128 384 162 128 385 161 128 386 128 129 387 160 129 388 161 129 389 130 316 948 129 316 949 128 316 950 131 317 951 130 317 952 191 317 953 132 318 954 131 318 955 190 318 956 133 319 957 132 319 958 189 319 959 134 320 960 133 320 961 188 320 962 135 321 963 134 321 964 187 321 965 136 322 966 135 322 967 186 322 968 137 323 969 136 323 970 185 323 971 138 324 972 137 324 973 184 324 974 139 325 975 138 325 976 183 325 977 140 326 978 139 326 979 182 326 980 141 327 981 140 327 982 181 327 983 142 328 984 141 328 985 180 328 986 143 329 987 142 329 988 179 329 989 144 330 990 143 330 991 178 330 992 145 331 993 144 331 994 177 331 995 146 332 996 145 332 997 176 332 998 147 333 999 146 333 1000 175 333 1001 148 334 1002 147 334 1003 174 334 1004 149 335 1005 148 335 1006 173 335 1007 150 336 1008 149 336 1009 172 336 1010 151 337 1011 150 337 1012 171 337 1013 152 338 1014 151 338 1015 170 338 1016 153 339 1017 152 339 1018 169 339 1019 154 340 1020 153 340 1021 168 340 1022 155 341 1023 154 341 1024 167 341 1025 156 342 1026 155 342 1027 166 342 1028 157 343 1029 156 343 1030 165 343 1031 158 344 1032 157 344 1033 164 344 1034 159 345 1035 158 345 1036 163 345 1037 160 346 1038 159 346 1039 162 346 1040 128 347 1041 129 347 1042 160 347 1043
+
+
+
+
+
+
+ -5.529761 -1 -1 -5.529761 -1 1 -5.529761 1 -1 -5.529761 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -5.570997 118.0518 -1.000008 -5.570997 118.0518 0.9999923 -5.315354 118.0518 -1.000008 -5.315354 118.0518 0.9999923 -5.570998 -1.177753 -1.000008 -5.570998 -1.177753 0.9999923 -5.315355 -1.177753 -1.000008 -5.315355 -1.177753 0.9999923 0.8244804 118.0518 -1.000008 0.8244804 118.0518 0.9999923 1.080123 118.0518 -1.000008 1.080123 118.0518 0.9999923 0.8244798 -1.177755 -1.000008 0.8244798 -1.177755 0.9999923 1.080122 -1.177755 -1.000008 1.080122 -1.177755 0.9999923 -5.529761 115.2515 -1.000008 -5.529761 115.2515 0.9999923 -5.529761 117.2515 -1.000008 -5.529761 117.2515 0.9999923 1 115.2515 -1.000008 1 115.2515 0.9999923 1 117.2515 -1.000008 1 117.2515 0.9999923 -5.529761 98.75653 -1.000008 -5.529761 98.75653 0.9999923 -5.529761 100.7565 -1.000008 -5.529761 100.7565 0.9999923 1 98.75653 -1.000008 1 98.75653 0.9999923 1 100.7565 -1.000008 1 100.7565 0.9999923 -5.529761 14.22618 -1.000008 -5.529761 14.22618 0.9999923 -5.529761 16.22618 -1.000008 -5.529761 16.22618 0.9999923 1 14.22618 -1.000008 1 14.22618 0.9999923 1 16.22618 -1.000008 1 16.22618 0.9999923
+
+
+
+
+
+
+
+
+
+ -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0 1 0 1 0 0 0 -1 0 -1 0 0 0 0 -1 0 0 1 0 1 0 1 0 0 0 -1 0 -1 0 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 0 1 0 1 0 0 0 -1 0 -1 0 0 0 0 -1 0 0 1 0 1 0 1 0 0 0 -1 0 -1 0 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1
+
+
+
+
+
+
+
+
+
+ 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 9 6 18 10 6 19 8 6 20 11 7 21 14 7 22 10 7 23 15 8 24 12 8 25 14 8 26 13 9 27 8 9 28 12 9 29 14 10 30 8 10 31 10 10 32 11 11 33 13 11 34 15 11 35 17 12 36 18 12 37 16 12 38 19 13 39 22 13 40 18 13 41 23 14 42 20 14 43 22 14 44 21 15 45 16 15 46 20 15 47 22 16 48 16 16 49 18 16 50 19 17 51 21 17 52 23 17 53 25 18 54 26 18 55 24 18 56 27 19 57 30 19 58 26 19 59 31 20 60 28 20 61 30 20 62 29 21 63 24 21 64 28 21 65 30 22 66 24 22 67 26 22 68 27 23 69 29 23 70 31 23 71 33 24 72 34 24 73 32 24 74 35 25 75 38 25 76 34 25 77 39 26 78 36 26 79 38 26 80 37 27 81 32 27 82 36 27 83 38 28 84 32 28 85 34 28 86 35 29 87 37 29 88 39 29 89 41 30 90 42 30 91 40 30 92 43 31 93 46 31 94 42 31 95 47 32 96 44 32 97 46 32 98 45 33 99 40 33 100 44 33 101 46 34 102 40 34 103 42 34 104 43 35 105 45 35 106 47 35 107 1 36 108 3 36 109 2 36 110 3 37 111 7 37 112 6 37 113 7 38 114 5 38 115 4 38 116 5 39 117 1 39 118 0 39 119 6 40 120 4 40 121 0 40 122 3 41 123 1 41 124 5 41 125 9 42 126 11 42 127 10 42 128 11 43 129 15 43 130 14 43 131 15 44 132 13 44 133 12 44 134 13 45 135 9 45 136 8 45 137 14 46 138 12 46 139 8 46 140 11 47 141 9 47 142 13 47 143 17 48 144 19 48 145 18 48 146 19 49 147 23 49 148 22 49 149 23 50 150 21 50 151 20 50 152 21 51 153 17 51 154 16 51 155 22 52 156 20 52 157 16 52 158 19 53 159 17 53 160 21 53 161 25 54 162 27 54 163 26 54 164 27 55 165 31 55 166 30 55 167 31 56 168 29 56 169 28 56 170 29 57 171 25 57 172 24 57 173 30 58 174 28 58 175 24 58 176 27 59 177 25 59 178 29 59 179 33 60 180 35 60 181 34 60 182 35 61 183 39 61 184 38 61 185 39 62 186 37 62 187 36 62 188 37 63 189 33 63 190 32 63 191 38 64 192 36 64 193 32 64 194 35 65 195 33 65 196 37 65 197 41 66 198 43 66 199 42 66 200 43 67 201 47 67 202 46 67 203 47 68 204 45 68 205 44 68 206 45 69 207 41 69 208 40 69 209 46 70 210 44 70 211 40 70 212 43 71 213 41 71 214 45 71 215
+
+
+
+
+
+
+ -1 -0.7568256 -1 -1 -1 -0.7568256 -1 -0.8319706 -0.9880982 -1 -0.8997599 -0.9535579 -1 -0.9535579 -0.8997599 -1 -0.9880982 -0.8319706 -1 -1 0.7568256 -1 -0.7568256 1 -1 -0.9880982 0.8319706 -1 -0.9535579 0.8997599 -1 -0.8997599 0.9535579 -1 -0.8319706 0.9880982 -1 1 -0.7568256 -1 0.7568256 -1 -1 0.9880982 -0.8319706 -1 0.9535579 -0.8997599 -1 0.8997599 -0.9535579 -1 0.8319706 -0.9880982 -1 0.7568256 1 -1 1 0.7568256 -1 0.8319706 0.9880982 -1 0.8997599 0.9535579 -1 0.9535579 0.8997599 -1 0.9880982 0.8319706 1 -1 -0.7568256 1 -0.7568256 -1 1 -0.9880982 -0.8319706 1 -0.9535579 -0.8997599 1 -0.8997599 -0.9535579 1 -0.8319706 -0.9880982 1 -0.7568256 1 1 -1 0.7568256 1 -0.8319706 0.9880982 1 -0.8997599 0.9535579 1 -0.9535579 0.8997599 1 -0.9880982 0.8319706 1 0.7568256 -1 1 1 -0.7568256 1 0.8319706 -0.9880982 1 0.8997599 -0.9535579 1 0.9535579 -0.8997599 1 0.9880982 -0.8319706 1 1 0.7568256 1 0.7568256 1 1 0.9880982 0.8319706 1 0.9535579 0.8997599 1 0.8997599 0.9535579 1 0.8319706 0.9880982
+
+
+
+
+
+
+
+
+
+ 0 -1 0 1 0 0 0 0 1 -1 0 0 0 1 0 0 0.1564344 -0.9876884 0 0.4539902 -0.8910067 0 0.7071068 -0.7071068 0 0.8910067 -0.4539902 0 0.9876884 -0.1564344 0 0.1564344 0.9876884 0 0.4539902 0.8910067 0 0.7071068 0.7071068 0 0.8910067 0.4539902 0 0.9876884 0.1564344 0 -0.1564344 -0.9876884 0 -0.4539902 -0.8910067 0 -0.7071068 -0.7071068 0 -0.8910067 -0.4539902 0 -0.9876884 -0.1564344 0 -0.1564344 0.9876884 0 -0.4539902 0.8910067 0 -0.7071068 0.7071068 0 -0.8910067 0.4539902 0 -0.9876884 0.1564344 0 0 -1 0 -1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0 1 0 0 0.1564344 -0.9876884 0 0.4539902 -0.8910067 0 0.7071068 -0.7071068 0 0.8910067 -0.4539902 0 0.9876884 -0.1564344 0 0.1564344 0.9876884 0 0.4539902 0.8910067 0 0.7071068 0.7071068 0 0.8910067 0.4539902 0 0.9876884 0.1564344 0 -0.1564344 -0.9876884 0 -0.4539902 -0.8910067 0 -0.7071068 -0.7071068 0 -0.8910067 -0.4539902 0 -0.9876884 -0.1564344 0 -0.1564344 0.9876884 0 -0.4539902 0.8910067 0 -0.7071068 0.7071068 0 -0.8910067 0.4539902 0 -0.9876884 0.1564344 0 0 -1
+
+
+
+
+
+
+
+
+
+ 0.5946033 0.75 0.4053968 1 0.4053968 0.75 0.375 0.7196032 0.625 0.7196032 0.5946033 0.75 0.875 0.5303968 0.625 0.7196032 0.625 0.5303968 0.375 0.2196032 0.625 0.2196032 0.5946033 0.25 0.5946033 0.25 0.4053968 0.5 0.4053968 0.25 0.125 0.5303968 0.375 0.5210037 0.375 0.5303968 0.125 0.5210037 0.375 0.51253 0.375 0.5210037 0.125 0.51253 0.375 0.5 0.375 0.51253 0.375 0.25 0.3960037 0.5 0.375 0.5 0.3960037 0.25 0.4053968 0.5 0.3960037 0.5 0.625 0.5303968 0.875 0.5210037 0.875 0.5303968 0.625 0.5210037 0.875 0.5 0.875 0.5210037 0.625 0.5 0.61247 0.25 0.625 0.25 0.61247 0.5 0.6039963 0.25 0.61247 0.25 0.6039963 0.5 0.5946033 0.25 0.6039963 0.25 0.375 0.7196032 0.125 0.7289963 0.125 0.7196032 0.375 0.7289963 0.125 0.73747 0.125 0.7289963 0.375 0.73747 0.125 0.75 0.125 0.73747 0.375 0.75 0.3960037 1 0.375 1 0.3960037 0.75 0.4053968 1 0.3960037 1 0.875 0.7196032 0.625 0.7289963 0.625 0.7196032 0.875 0.7289963 0.625 0.75 0.625 0.7289963 0.625 1 0.61247 0.75 0.625 0.75 0.61247 1 0.6039963 0.75 0.61247 0.75 0.6039963 1 0.5946033 0.75 0.6039963 0.75 0.375 0.5303968 0.125 0.7196032 0.125 0.5303968 0.5946033 0.75 0.5946033 1 0.4053968 1 0.375 0.7196032 0.375 0.5303968 0.4053968 0.5 0.375 0.5303968 0.3764877 0.5210037 0.4053968 0.5 0.3764877 0.5210037 0.3808053 0.51253 0.38753 0.5058053 0.38753 0.5058053 0.3960037 0.5014877 0.4053968 0.5 0.4053968 0.5 0.5946033 0.5 0.375 0.7196032 0.5946033 0.5 0.6039964 0.5014877 0.625 0.5303968 0.375 0.7196032 0.5946033 0.5 0.625 0.5303968 0.6039964 0.5014877 0.61247 0.5058053 0.6191948 0.51253 0.6191948 0.51253 0.6235122 0.5210036 0.6039964 0.5014877 0.6235122 0.5210036 0.625 0.5303968 0.6039964 0.5014877 0.625 0.5303968 0.625 0.7196032 0.375 0.7196032 0.625 0.7196032 0.6235123 0.7289964 0.61247 0.7441948 0.6235123 0.7289964 0.6191948 0.73747 0.61247 0.7441948 0.61247 0.7441948 0.6039964 0.7485123 0.5946033 0.75 0.5946033 0.75 0.4053968 0.75 0.375 0.7196032 0.4053968 0.75 0.3960037 0.7485123 0.375 0.7196032 0.3960037 0.7485123 0.38753 0.7441947 0.3808053 0.73747 0.3808053 0.73747 0.3764877 0.7289963 0.3960037 0.7485123 0.3764877 0.7289963 0.375 0.7196032 0.3960037 0.7485123 0.3764877 0.5210037 0.38753 0.5058053 0.4053968 0.5 0.625 0.7196032 0.61247 0.7441948 0.5946033 0.75 0.875 0.5303968 0.875 0.7196032 0.625 0.7196032 0.375 0.2196032 0.375 0.03039675 0.4053968 0 0.375 0.03039675 0.3764877 0.02100366 0.4053968 0 0.3764877 0.02100366 0.3808053 0.01252996 0.38753 0.005805253 0.38753 0.005805253 0.3960037 0.001487672 0.4053968 0 0.4053968 0 0.5946033 0 0.375 0.2196032 0.5946033 0 0.6039964 0.001487672 0.625 0.03039675 0.375 0.2196032 0.5946033 0 0.625 0.03039675 0.6039964 0.001487672 0.61247 0.005805253 0.6191948 0.01252996 0.6191948 0.01252996 0.6235122 0.02100366 0.6039964 0.001487672 0.6235122 0.02100366 0.625 0.03039675 0.6039964 0.001487672 0.625 0.03039675 0.625 0.2196032 0.375 0.2196032 0.625 0.2196032 0.6235123 0.2289963 0.61247 0.2441947 0.6235123 0.2289963 0.6191948 0.23747 0.61247 0.2441947 0.61247 0.2441947 0.6039964 0.2485123 0.5946033 0.25 0.5946033 0.25 0.4053968 0.25 0.375 0.2196032 0.4053968 0.25 0.3960037 0.2485123 0.375 0.2196032 0.3960037 0.2485123 0.38753 0.2441947 0.3808053 0.23747 0.3808053 0.23747 0.3764877 0.2289963 0.3960037 0.2485123 0.3764877 0.2289963 0.375 0.2196032 0.3960037 0.2485123 0.3764877 0.02100366 0.38753 0.005805253 0.4053968 0 0.625 0.2196032 0.61247 0.2441947 0.5946033 0.25 0.5946033 0.25 0.5946033 0.5 0.4053968 0.5 0.125 0.5303968 0.125 0.5210037 0.375 0.5210037 0.125 0.5210037 0.125 0.51253 0.375 0.51253 0.125 0.51253 0.125 0.5 0.375 0.5 0.375 0.25 0.3960037 0.25 0.3960037 0.5 0.3960037 0.25 0.4053968 0.25 0.4053968 0.5 0.625 0.5303968 0.625 0.5210037 0.875 0.5210037 0.625 0.5210037 0.625 0.5 0.875 0.5 0.625 0.5 0.61247 0.5 0.61247 0.25 0.61247 0.5 0.6039963 0.5 0.6039963 0.25 0.6039963 0.5 0.5946033 0.5 0.5946033 0.25 0.375 0.7196032 0.375 0.7289963 0.125 0.7289963 0.375 0.7289963 0.375 0.73747 0.125 0.73747 0.375 0.73747 0.375 0.75 0.125 0.75 0.375 0.75 0.3960037 0.75 0.3960037 1 0.3960037 0.75 0.4053968 0.75 0.4053968 1 0.875 0.7196032 0.875 0.7289963 0.625 0.7289963 0.875 0.7289963 0.875 0.75 0.625 0.75 0.625 1 0.61247 1 0.61247 0.75 0.61247 1 0.6039963 1 0.6039963 0.75 0.6039963 1 0.5946033 1 0.5946033 0.75 0.375 0.5303968 0.375 0.7196032 0.125 0.7196032
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 31 0 0 1 0 1 24 0 2 25 1 3 30 1 4 31 1 5 18 2 6 30 2 7 43 2 8 13 3 9 18 3 10 19 3 11 19 4 12 37 4 13 12 4 14 13 5 15 38 5 16 36 5 17 17 6 18 39 6 19 38 6 20 16 7 21 40 7 22 39 7 23 15 8 24 41 8 25 40 8 26 14 9 27 37 9 28 41 9 29 43 10 30 20 10 31 18 10 32 47 11 33 21 11 34 20 11 35 46 12 36 22 12 37 21 12 38 45 13 39 23 13 40 22 13 41 44 14 42 19 14 43 23 14 44 25 15 45 2 15 46 0 15 47 29 16 48 3 16 49 2 16 50 28 17 51 4 17 52 3 17 53 27 18 54 5 18 55 4 18 56 26 19 57 1 19 58 5 19 59 7 20 60 32 20 61 30 20 62 11 21 63 33 21 64 32 21 65 10 22 66 34 22 67 33 22 68 9 23 69 35 23 70 34 23 71 8 24 72 31 24 73 35 24 74 36 25 75 0 25 76 13 25 77 31 26 78 6 26 79 1 26 80 25 27 81 36 27 82 37 27 83 36 28 84 38 28 85 37 28 86 38 29 87 39 29 88 40 29 89 40 30 90 41 30 91 37 30 92 37 31 93 42 31 94 25 31 95 42 32 96 44 32 97 43 32 98 25 33 99 42 33 100 43 33 101 44 34 102 45 34 103 46 34 104 46 35 105 47 35 106 44 35 107 47 36 108 43 36 109 44 36 110 43 37 111 30 37 112 25 37 113 30 38 114 32 38 115 34 38 116 32 39 117 33 39 118 34 39 119 34 40 120 35 40 121 31 40 122 31 41 123 24 41 124 25 41 125 24 42 126 26 42 127 25 42 128 26 43 129 27 43 130 28 43 131 28 44 132 29 44 133 26 44 134 29 45 135 25 45 136 26 45 137 38 46 138 40 46 139 37 46 140 30 47 141 34 47 142 31 47 143 18 48 144 7 48 145 30 48 146 13 49 147 0 49 148 1 49 149 0 50 150 2 50 151 1 50 152 2 51 153 3 51 154 4 51 155 4 52 156 5 52 157 1 52 158 1 53 159 6 53 160 13 53 161 6 54 162 8 54 163 7 54 164 13 55 165 6 55 166 7 55 167 8 56 168 9 56 169 10 56 170 10 57 171 11 57 172 8 57 173 11 58 174 7 58 175 8 58 176 7 59 177 18 59 178 13 59 179 18 60 180 20 60 181 22 60 182 20 61 183 21 61 184 22 61 185 22 62 186 23 62 187 19 62 188 19 63 189 12 63 190 13 63 191 12 64 192 14 64 193 13 64 194 14 65 195 15 65 196 16 65 197 16 66 198 17 66 199 14 66 200 17 67 201 13 67 202 14 67 203 2 68 204 4 68 205 1 68 206 18 69 207 22 69 208 19 69 209 19 70 210 42 70 211 37 70 212 13 71 213 17 71 214 38 71 215 17 72 216 16 72 217 39 72 218 16 73 219 15 73 220 40 73 221 15 74 222 14 74 223 41 74 224 14 75 225 12 75 226 37 75 227 43 76 228 47 76 229 20 76 230 47 77 231 46 77 232 21 77 233 46 78 234 45 78 235 22 78 236 45 79 237 44 79 238 23 79 239 44 80 240 42 80 241 19 80 242 25 81 243 29 81 244 2 81 245 29 82 246 28 82 247 3 82 248 28 83 249 27 83 250 4 83 251 27 84 252 26 84 253 5 84 254 26 85 255 24 85 256 1 85 257 7 86 258 11 86 259 32 86 260 11 87 261 10 87 262 33 87 263 10 88 264 9 88 265 34 88 266 9 89 267 8 89 268 35 89 269 8 90 270 6 90 271 31 90 272 36 91 273 25 91 274 0 91 275
+
+
+
+
+
+
+ -0.005142211 0.3560282 0.1393873 -0.1562415 0.2105299 0.0824238 -0.2858994 0.2105299 0.0824238 -0.4094155 0.09173345 0.03591418 -0.2573212 0.09172272 0.03590989 -0.2573212 -0.05415678 -0.0212028 -0.1055529 0.09177327 0.03592967 0.02298182 0.09177327 0.03592967 0.1464105 0.2105299 0.0824238 -0.005142211 0.2105299 0.0824238 -0.03618305 0.2837858 0.1111038 -0.03618305 0.2104402 0.08238863 -0.1124573 0.2104402 0.08238863 -0.01300173 0.1805353 0.07068073 0.07141667 0.1805353 0.07068073 0.0102846 0.121711 0.04765057 -0.0740931 0.121711 0.04765057 -0.1435734 0.1805353 0.07068073 -0.05692553 0.1805353 0.07068073 -0.1180346 0.121711 0.04765057 -0.2046594 0.121711 0.04765057 -0.2733249 0.1805353 0.07068073 -0.1876605 0.1805353 0.07068073 -0.2487926 0.121711 0.04765057 -0.3344163 0.121711 0.04765057 -0.2265189 0.09177827 0.0359317 -0.1493425 0.09177827 0.0359317 -0.2265189 0.01739144 0.006808757 0.0809375 -0.03424954 -0.01340913 0.0809375 -0.01076054 -0.004212975 0.09165352 -0.01087498 -0.004257798 0.09615892 -0.01137948 -0.004455327 0.1002128 -0.01251578 -0.004900097 0.1034994 -0.01452541 -0.005686879 0.1062997 -0.01970601 -0.007715225 0.1065075 -0.02213144 -0.008664727 0.1056941 -0.02679967 -0.01049232 0.1034711 -0.03009963 -0.01178431 0.1001651 -0.0322628 -0.01263117 0.09610235 -0.03352093 -0.01312386 0.09160929 -0.03410601 -0.01335287 0.1122428 -0.03955793 -0.01548731 0.1146792 -0.03851318 -0.01507818 0.1169002 -0.0372312 -0.01457643 0.1188962 -0.03573083 -0.01398897 0.1206574 -0.03402972 -0.01332294 0.1221742 -0.03214645 -0.01258563 0.1234369 -0.03009891 -0.01178395 0.1244359 -0.02790522 -0.01092517 0.1251614 -0.02558374 -0.01001632 0.1256038 -0.02315282 -0.009064555 0.1257534 -0.02063012 -0.008077025 0.1252774 -0.01507639 -0.005902647 0.1239131 -0.01046943 -0.004099011 0.1217556 -0.006720781 -0.002631306 0.1189004 -0.003741979 -0.001465082 0.1154427 -0.001444578 -5.65648e-4 0.1114779 2.59638e-4 1.01566e-4 0.1071013 0.001459121 5.71251e-4 0.09749376 0.002697706 0.001056075 0.06247532 0.002979993 0.001166582 0.06247532 -0.08420896 -0.03296852 0.0809375 -0.08420896 -0.03296852 0.0809375 -0.0479958 -0.01879084 0.09032231 -0.04821038 -0.01887476 0.09304052 -0.04888176 -0.01913762 0.09517431 -0.05005168 -0.01959562 0.09688174 -0.05176162 -0.02026522 0.09832072 -0.05405378 -0.0211625 0.1107196 -0.08420896 -0.03296852 0.1312764 -0.08420896 -0.03296852 0.1155101 -0.04812002 -0.01883947 0.1142875 -0.04613733 -0.01806318 0.1120058 -0.04348039 -0.01702296 0.1079723 -0.04129457 -0.01616716 -0.08758747 -0.07046842 -0.02758896 -0.08758747 -0.01076054 -0.004212975 -0.07348859 -0.01098561 -0.004301071 -0.06972497 -0.01165413 -0.004562735 -0.06608283 -0.01275658 -0.004994392 -0.06261205 -0.01428318 -0.005592107 -0.05936253 -0.01622462 -0.006352186 -0.05638426 -0.01857113 -0.007270812 -0.0537272 -0.02131319 -0.008344292 -0.05144125 -0.02444076 -0.00956881 -0.04957634 -0.02794456 -0.01094067 -0.04818242 -0.03181505 -0.01245594 -0.04730951 -0.03604245 -0.01411092 -0.04700744 -0.04061698 -0.01590192 -0.04730951 -0.04519271 -0.0176934 -0.04818248 -0.04942059 -0.01934862 -0.04957634 -0.05329108 -0.020864 -0.05144125 -0.05679464 -0.02223563 -0.0537272 -0.05992174 -0.02345979 -0.05638432 -0.0626626 -0.02453291 -0.05936259 -0.06500792 -0.02545118 -0.06261205 -0.06694841 -0.02621078 -0.06608283 -0.06847405 -0.02680814 -0.06972503 -0.06957554 -0.02723944 -0.07348865 -0.07024359 -0.02750098 -0.1060436 0.002979993 0.001166582 -0.1060436 -0.08420896 -0.03296852 -0.07390683 -0.08401179 -0.03289127 -0.06068253 -0.08226275 -0.03220653 -0.0545758 -0.08059525 -0.03155374 -0.04890614 -0.07832241 -0.03066384 -0.04374867 -0.07538652 -0.02951443 -0.0391786 -0.07172989 -0.02808284 -0.03527104 -0.06729459 -0.02634644 -0.03210103 -0.0620234 -0.02428269 -0.02974367 -0.05585861 -0.02186918 -0.02827423 -0.04874229 -0.01908302 -0.02776771 -0.04061698 -0.01590192 -0.02827423 -0.03249382 -0.01272165 -0.02974367 -0.02537894 -0.009936094 -0.03210103 -0.01921439 -0.007522702 -0.03527104 -0.01394295 -0.005458831 -0.0391786 -0.00950694 -0.00372219 -0.04374867 -0.005849123 -0.002290129 -0.04890614 -0.002911806 -0.001140117 -0.0545758 -6.37293e-4 -2.49624e-4 -0.06068253 0.001031398 4.03762e-4 -0.07390683 0.002782583 0.001089334 0.01023375 0.002979993 0.001166582 -0.008228361 0.002979993 0.001166582 -0.008228361 -0.08420896 -0.03296852 0.04594016 -0.08420896 -0.03296852 0.04594016 -0.07046842 -0.02758896 0.01023375 -0.07046842 -0.02758896 0.06247538 -0.03346037 -0.01310014 0.06247532 -0.04847478 -0.01897823 0.09931051 -0.05646109 -0.02210509 0.104166 -0.01575875 -0.006169795 0.1052329 -0.01773238 -0.00694251 0.1056281 -0.01846361 -0.007228732 0.1061009 -0.02446556 -0.009578585 0.1058975 -0.02563261 -0.01003551 0.1063042 -0.0232985 -0.009121656 0.1045826 -0.02844953 -0.01113831 0.1040269 -0.02927446 -0.01146125 0.1051383 -0.0276246 -0.01081538 0.1013063 -0.03151607 -0.01233887 0.1023887 -0.03080773 -0.01206159 -0.06729465 -0.08313727 -0.0325489 -0.06729465 0.00190711 7.46489e-4
+
+
+
+
+
+
+
+
+
+ 0 -0.3645622 0.9311791 -2.09502e-6 -0.3645625 0.9311789 4.69089e-7 -0.364563 0.9311788 -2.77901e-6 -0.3645622 0.9311791 -2.02032e-6 -0.3645631 0.9311786 9.99913e-7 -0.3645644 0.9311782 0 -0.3645603 0.9311798 0 -0.3645603 0.9311798 5.82934e-7 -0.3645633 0.9311786 0 -0.3645635 0.9311785 0 -0.3645622 0.931179 5.58631e-7 -0.3645634 0.9311786 0 -0.3645628 0.9311788 0 -0.3645628 0.9311789 0 -0.3645645 0.9311781 0 -0.3645645 0.9311781 -1.93e-7 -0.3645622 0.9311791 1.41109e-6 -0.3645641 0.9311783 0 -0.3645635 0.9311785 0 -0.3645622 0.9311791 1.4854e-6 -0.3645639 0.9311784 1.25183e-6 -0.3645648 0.931178 1.75829e-6 -0.3645546 0.931182 6.48566e-6 -0.3645625 0.931179 -6.57991e-6 -0.3645588 0.9311804 1.2094e-5 -0.3645586 0.9311804 -3.14163e-5 -0.3645541 0.9311823 -1.65736e-7 -0.3645616 0.9311792 1.63109e-6 -0.3645747 0.9311741 -2.2035e-5 -0.3645374 0.9311888 1.63363e-5 -0.3645935 0.9311668 0 -0.3645623 0.931179 1.53019e-6 -0.3645676 0.931177 -9.40315e-6 -0.3645671 0.9311771 1.34673e-5 -0.3645731 0.9311748 -3.95367e-6 -0.3645629 0.9311787 2.25289e-6 -0.3645722 0.9311752 -2.47978e-5 -0.3645083 0.9312002 1.15075e-5 -0.3646129 0.9311592 -2.34155e-7 -0.3645712 0.9311755 -3.22611e-6 -0.3645746 0.9311742 -2.74169e-6 -0.3645746 0.9311742 -5.71527e-6 -0.3645742 0.9311744 1.25188e-5 -0.3644945 0.9312055 -2.69338e-5 -0.3646373 0.9311497 6.1727e-6 -0.3645399 0.9311878 1.02029e-5 -0.3645423 0.9311869 3.54643e-6 -0.3645637 0.9311784 -2.81744e-5 -0.3645866 0.9311695 1.78505e-5 -0.3645412 0.9311873 7.70131e-6 -0.3645531 0.9311826 -1.0028e-5 -0.3645566 0.9311813 -1.46867e-5 -0.3645624 0.9311789 1.24786e-5 -0.3645662 0.9311775 0 -0.3645713 0.9311754 8.3332e-6 -0.3645694 0.9311762 -1.36678e-6 -0.3645665 0.9311773 -2.82564e-6 -0.3645629 0.9311787 4.96628e-6 -0.3645706 0.9311758 3.55632e-6 -0.3645646 0.9311781 2.01406e-6 -0.364562 0.9311791 1.12083e-6 -0.3645595 0.9311801 -7.91751e-7 -0.364549 0.9311842 -3.07258e-6 -0.3645676 0.9311769 6.08732e-6 -0.3645721 0.9311752 -6.0721e-7 -0.3645567 0.9311813 -1.5058e-6 -0.3645707 0.9311757 8.0799e-7 -0.3645631 0.9311787 -6.61379e-6 -0.3645557 0.9311816 -6.3347e-6 -0.3645528 0.9311828 2.93327e-6 -0.3645596 0.93118 8.2993e-6 -0.3645663 0.9311774 -8.9166e-6 -0.364566 0.9311775 1.19705e-5 -0.3645589 0.9311804 7.80564e-6 -0.36456 0.9311799 0 -0.3645654 0.9311779 0 -0.3645622 0.9311791 -2.88027e-6 -0.3645628 0.9311788 -4.71771e-7 -0.3645625 0.9311789 1.90309e-6 -0.3645631 0.9311786 0 -0.3645627 0.9311789 8.62327e-7 -0.3645642 0.9311782 -2.10246e-6 -0.3645617 0.9311792 0 -0.3645603 0.9311798 -1.03257e-6 -0.3645626 0.9311789 0 -0.3645635 0.9311786 0 -0.3645622 0.9311791 0 -0.3645646 0.9311781 -2.00767e-6 -0.3645641 0.9311783 0 -0.3645628 0.9311788 1.41109e-6 -0.3645641 0.9311783 0 -0.3645646 0.9311781 -2.0104e-6 -0.3645628 0.9311788 1.36276e-7 -0.3645622 0.9311791 0 -0.3645635 0.9311786 1.4907e-6 -0.3645616 0.9311792 2.03276e-6 -0.3645646 0.9311781 7.25087e-7 -0.3645645 0.9311782 6.36881e-6 -0.3645598 0.93118 0 -0.3645653 0.9311778 -8.34472e-6 -0.3645598 0.93118 2.33317e-6 -0.3645595 0.9311801 -8.03607e-6 -0.3645552 0.9311818 3.28308e-5 -0.3646035 0.9311629 2.29627e-6 -0.3645646 0.9311781 1.07359e-5 -0.3645794 0.9311723 -2.32613e-6 -0.364562 0.9311792 -3.06049e-7 -0.3645657 0.9311777 2.84076e-6 -0.3645681 0.9311767 -2.156e-5 -0.3645581 0.9311805 2.93793e-5 -0.3645858 0.9311699 -1.84105e-6 -0.3645653 0.9311779 6.10751e-6 -0.3645772 0.9311732 7.92208e-7 -0.364559 0.9311803 1.52967e-6 -0.364539 0.9311881 0 -0.3645221 0.9311947 -3.19725e-6 -0.3645778 0.9311729 -1.34855e-6 -0.364554 0.9311822 -9.02378e-7 -0.3645402 0.9311877 -6.25835e-6 -0.3645821 0.9311713 -3.09906e-6 -0.3645594 0.9311801 -5.50203e-6 -0.3645691 0.9311764 -1.01301e-5 -0.3645829 0.931171 3.24172e-5 -0.3645166 0.9311969 -2.70363e-5 -0.364585 0.9311701 2.41421e-5 -0.3645434 0.9311863 5.66372e-6 -0.3645631 0.9311786 1.69124e-6 -0.3645637 0.9311785 -1.51486e-5 -0.3645547 0.931182 -2.65764e-6 -0.3645614 0.9311793 1.03474e-5 -0.3645696 0.9311761 -1.1857e-6 -0.3645668 0.9311773 5.28981e-7 -0.3645638 0.9311785 8.44592e-6 -0.3645818 0.9311714 -9.24349e-6 -0.3645718 0.9311753 0 -0.3645695 0.9311761 -4.14087e-7 -0.3645602 0.9311798 -1.50536e-6 -0.3645673 0.9311771 1.51875e-6 -0.364553 0.9311827 -4.22414e-6 -0.3645498 0.9311839 -3.43646e-6 -0.3645756 0.9311738 -1.99117e-6 -0.3645584 0.9311805 -1.30114e-5 -0.3645688 0.9311765 -6.87321e-6 -0.3645539 0.9311823 4.04599e-6 -0.3645586 0.9311804 -1.54151e-6 -0.3645635 0.9311785 -1.29534e-5 -0.3645685 0.9311766 2.78488e-5 -0.3645563 0.9311814 -1.66516e-5 -0.364561 0.9311796 1.61163e-5 -0.3645421 0.9311869 0 -0.3645654 0.9311778
+
+
+
+
+
+
+
+
+
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 9 0 0 14 0 1 8 0 2 9 1 3 10 1 4 11 1 5 57 2 6 33 2 7 56 2 8 76 3 9 101 3 10 75 3 11 128 4 12 124 4 13 125 4 14 14 5 15 7 5 16 8 5 17 13 6 18 11 6 19 18 6 20 18 7 21 12 7 22 17 7 23 24 8 24 2 8 25 3 8 26 16 9 27 18 9 28 19 9 29 2 10 30 22 10 31 1 10 32 4 11 33 24 11 34 3 11 35 23 12 36 25 12 37 20 12 38 20 13 39 26 13 40 19 13 41 19 14 42 6 14 43 16 14 44 7 15 45 16 15 46 6 15 47 27 16 48 4 16 49 5 16 50 27 17 51 6 17 52 26 17 53 20 18 54 22 18 55 23 18 56 17 19 57 1 19 58 22 19 59 10 20 60 1 20 61 12 20 62 29 21 63 129 21 64 28 21 65 130 22 66 28 22 67 129 22 68 130 23 69 62 23 70 63 23 71 28 24 72 64 24 73 40 24 74 40 25 75 65 25 76 39 25 77 39 26 78 66 26 79 38 26 80 38 27 81 66 27 82 74 27 83 74 28 84 67 28 85 73 28 86 68 29 87 73 29 88 67 29 89 71 30 90 68 30 91 131 30 92 71 31 93 69 31 94 70 31 95 59 32 96 29 32 97 30 32 98 59 33 99 31 33 100 58 33 101 58 34 102 32 34 103 57 34 104 56 35 105 132 35 106 55 35 107 54 36 108 132 36 109 133 36 110 53 37 111 133 37 112 134 37 113 52 38 114 134 38 115 34 38 116 34 39 117 51 39 118 52 39 119 50 40 120 35 40 121 137 40 122 49 41 123 137 41 124 135 41 125 48 42 126 135 42 127 136 42 128 47 43 129 136 43 130 36 43 131 46 44 132 36 44 133 140 44 134 45 45 135 140 45 136 138 45 137 44 46 138 138 46 139 139 46 140 43 47 141 139 47 142 37 47 143 42 48 144 37 48 145 142 48 146 41 49 147 142 49 148 141 49 149 141 50 150 74 50 151 41 50 152 82 51 153 119 51 154 81 51 155 143 52 156 97 52 157 98 52 158 77 53 159 144 53 160 122 53 161 89 54 162 112 54 163 88 54 164 80 55 165 121 55 166 79 55 167 122 56 168 76 56 169 77 56 170 81 57 171 120 57 172 80 57 173 84 58 174 115 58 175 116 58 176 93 59 177 106 59 178 107 59 179 87 60 180 112 60 181 113 60 182 143 61 183 99 61 184 102 61 185 113 62 186 86 62 187 87 62 188 109 63 189 92 63 190 108 63 191 116 64 192 83 64 193 84 64 194 110 65 195 91 65 196 109 65 197 111 66 198 90 66 199 110 66 200 94 67 201 105 67 202 106 67 203 85 68 204 114 68 205 115 68 206 83 69 207 118 69 208 82 69 209 75 70 210 102 70 211 99 70 212 96 71 213 103 71 214 104 71 215 95 72 216 104 72 217 105 72 218 79 73 219 144 73 220 78 73 221 108 74 222 93 74 223 107 74 224 128 75 225 126 75 226 127 75 227 9 76 228 13 76 229 14 76 230 9 77 231 0 77 232 10 77 233 57 78 234 32 78 235 33 78 236 76 79 237 100 79 238 101 79 239 128 80 240 123 80 241 124 80 242 14 81 243 15 81 244 7 81 245 13 82 246 9 82 247 11 82 248 18 83 249 11 83 250 12 83 251 24 84 252 21 84 253 2 84 254 16 85 255 13 85 256 18 85 257 2 86 258 21 86 259 22 86 260 4 87 261 23 87 262 24 87 263 23 88 264 4 88 265 25 88 266 20 89 267 25 89 268 26 89 269 19 90 270 26 90 271 6 90 272 7 91 273 15 91 274 16 91 275 27 92 276 25 92 277 4 92 278 27 93 279 5 93 280 6 93 281 20 94 282 17 94 283 22 94 284 17 95 285 12 95 286 1 95 287 10 96 288 0 96 289 1 96 290 29 97 291 60 97 292 129 97 293 130 98 294 63 98 295 28 98 296 130 99 297 61 99 298 62 99 299 28 100 300 63 100 301 64 100 302 40 101 303 64 101 304 65 101 305 39 102 306 65 102 307 66 102 308 74 103 309 66 103 310 67 103 311 68 104 312 72 104 313 73 104 314 71 105 315 72 105 316 68 105 317 71 106 318 131 106 319 69 106 320 59 107 321 60 107 322 29 107 323 59 108 324 30 108 325 31 108 326 58 109 327 31 109 328 32 109 329 56 110 330 33 110 331 132 110 332 54 111 333 55 111 334 132 111 335 53 112 336 54 112 337 133 112 338 52 113 339 53 113 340 134 113 341 34 114 342 35 114 343 51 114 344 50 115 345 51 115 346 35 115 347 49 116 348 50 116 349 137 116 350 48 117 351 49 117 352 135 117 353 47 118 354 48 118 355 136 118 356 46 119 357 47 119 358 36 119 359 45 120 360 46 120 361 140 120 362 44 121 363 45 121 364 138 121 365 43 122 366 44 122 367 139 122 368 42 123 369 43 123 370 37 123 371 41 124 372 42 124 373 142 124 374 141 125 375 38 125 376 74 125 377 82 126 378 118 126 379 119 126 380 143 127 381 103 127 382 97 127 383 77 128 384 78 128 385 144 128 386 89 129 387 111 129 388 112 129 389 80 130 390 120 130 391 121 130 392 122 131 393 100 131 394 76 131 395 81 132 396 119 132 397 120 132 398 84 133 399 85 133 400 115 133 401 93 134 402 94 134 403 106 134 404 87 135 405 88 135 406 112 135 407 143 136 408 98 136 409 99 136 410 113 137 411 114 137 412 86 137 413 109 138 414 91 138 415 92 138 416 116 139 417 117 139 418 83 139 419 110 140 420 90 140 421 91 140 422 111 141 423 89 141 424 90 141 425 94 142 426 95 142 427 105 142 428 85 143 429 86 143 430 114 143 431 83 144 432 117 144 433 118 144 434 75 145 435 101 145 436 102 145 437 96 146 438 97 146 439 103 146 440 95 147 441 96 147 442 104 147 443 79 148 444 121 148 445 144 148 446 108 149 447 92 149 448 93 149 449 128 150 450 125 150 451 126 150 452
+
+
+
+
+
+
+ -0.005142211 0.3560282 0.1393873 -0.1562415 0.2105299 0.0824238 -0.2858994 0.2105299 0.0824238 -0.4094155 0.09173345 0.03591418 -0.2573212 0.09172272 0.03590989 -0.2573212 -0.05415678 -0.0212028 -0.1055529 0.09177327 0.03592967 0.02298182 0.09177327 0.03592967 0.1464105 0.2105299 0.0824238 -0.005142211 0.2105299 0.0824238 -0.03618305 0.2837858 0.1111038 -0.03618305 0.2104402 0.08238863 -0.1124573 0.2104402 0.08238863 -0.01300173 0.1805353 0.07068073 0.07141667 0.1805353 0.07068073 0.0102846 0.121711 0.04765057 -0.0740931 0.121711 0.04765057 -0.1435734 0.1805353 0.07068073 -0.05692553 0.1805353 0.07068073 -0.1180346 0.121711 0.04765057 -0.2046594 0.121711 0.04765057 -0.2733249 0.1805353 0.07068073 -0.1876605 0.1805353 0.07068073 -0.2487926 0.121711 0.04765057 -0.3344163 0.121711 0.04765057 -0.2265189 0.09177827 0.0359317 -0.1493425 0.09177827 0.0359317 -0.2265189 0.01739144 0.006808757 0.0809375 -0.03424954 -0.01340913 0.0809375 -0.01076054 -0.004212975 0.09165352 -0.01087498 -0.004257798 0.09615892 -0.01137948 -0.004455327 0.1002128 -0.01251578 -0.004900097 0.1034994 -0.01452541 -0.005686879 0.1062997 -0.01970601 -0.007715225 0.1065075 -0.02213144 -0.008664727 0.1056941 -0.02679967 -0.01049232 0.1034711 -0.03009963 -0.01178431 0.1001651 -0.0322628 -0.01263117 0.09610235 -0.03352093 -0.01312386 0.09160929 -0.03410601 -0.01335287 0.1122428 -0.03955793 -0.01548731 0.1146792 -0.03851318 -0.01507818 0.1169002 -0.0372312 -0.01457643 0.1188962 -0.03573083 -0.01398897 0.1206574 -0.03402972 -0.01332294 0.1221742 -0.03214645 -0.01258563 0.1234369 -0.03009891 -0.01178395 0.1244359 -0.02790522 -0.01092517 0.1251614 -0.02558374 -0.01001632 0.1256038 -0.02315282 -0.009064555 0.1257534 -0.02063012 -0.008077025 0.1252774 -0.01507639 -0.005902647 0.1239131 -0.01046943 -0.004099011 0.1217556 -0.006720781 -0.002631306 0.1189004 -0.003741979 -0.001465082 0.1154427 -0.001444578 -5.65648e-4 0.1114779 2.59638e-4 1.01566e-4 0.1071013 0.001459121 5.71251e-4 0.09749376 0.002697706 0.001056075 0.06247532 0.002979993 0.001166582 0.06247532 -0.08420896 -0.03296852 0.0809375 -0.08420896 -0.03296852 0.0809375 -0.0479958 -0.01879084 0.09032231 -0.04821038 -0.01887476 0.09304052 -0.04888176 -0.01913762 0.09517431 -0.05005168 -0.01959562 0.09688174 -0.05176162 -0.02026522 0.09832072 -0.05405378 -0.0211625 0.1107196 -0.08420896 -0.03296852 0.1312764 -0.08420896 -0.03296852 0.1155101 -0.04812002 -0.01883947 0.1142875 -0.04613733 -0.01806318 0.1120058 -0.04348039 -0.01702296 0.1079723 -0.04129457 -0.01616716 -0.08758747 -0.07046842 -0.02758896 -0.08758747 -0.01076054 -0.004212975 -0.07348859 -0.01098561 -0.004301071 -0.06972497 -0.01165413 -0.004562735 -0.06608283 -0.01275658 -0.004994392 -0.06261205 -0.01428318 -0.005592107 -0.05936253 -0.01622462 -0.006352186 -0.05638426 -0.01857113 -0.007270812 -0.0537272 -0.02131319 -0.008344292 -0.05144125 -0.02444076 -0.00956881 -0.04957634 -0.02794456 -0.01094067 -0.04818242 -0.03181505 -0.01245594 -0.04730951 -0.03604245 -0.01411092 -0.04700744 -0.04061698 -0.01590192 -0.04730951 -0.04519271 -0.0176934 -0.04818248 -0.04942059 -0.01934862 -0.04957634 -0.05329108 -0.020864 -0.05144125 -0.05679464 -0.02223563 -0.0537272 -0.05992174 -0.02345979 -0.05638432 -0.0626626 -0.02453291 -0.05936259 -0.06500792 -0.02545118 -0.06261205 -0.06694841 -0.02621078 -0.06608283 -0.06847405 -0.02680814 -0.06972503 -0.06957554 -0.02723944 -0.07348865 -0.07024359 -0.02750098 -0.1060436 0.002979993 0.001166582 -0.1060436 -0.08420896 -0.03296852 -0.07390683 -0.08401179 -0.03289127 -0.06068253 -0.08226275 -0.03220653 -0.0545758 -0.08059525 -0.03155374 -0.04890614 -0.07832241 -0.03066384 -0.04374867 -0.07538652 -0.02951443 -0.0391786 -0.07172989 -0.02808284 -0.03527104 -0.06729459 -0.02634644 -0.03210103 -0.0620234 -0.02428269 -0.02974367 -0.05585861 -0.02186918 -0.02827423 -0.04874229 -0.01908302 -0.02776771 -0.04061698 -0.01590192 -0.02827423 -0.03249382 -0.01272165 -0.02974367 -0.02537894 -0.009936094 -0.03210103 -0.01921439 -0.007522702 -0.03527104 -0.01394295 -0.005458831 -0.0391786 -0.00950694 -0.00372219 -0.04374867 -0.005849123 -0.002290129 -0.04890614 -0.002911806 -0.001140117 -0.0545758 -6.37293e-4 -2.49624e-4 -0.06068253 0.001031398 4.03762e-4 -0.07390683 0.002782583 0.001089334 0.01023375 0.002979993 0.001166582 -0.008228361 0.002979993 0.001166582 -0.008228361 -0.08420896 -0.03296852 0.04594016 -0.08420896 -0.03296852 0.04594016 -0.07046842 -0.02758896 0.01023375 -0.07046842 -0.02758896 0.06247538 -0.03346037 -0.01310014 0.06247532 -0.04847478 -0.01897823 0.09931051 -0.05646109 -0.02210509 0.104166 -0.01575875 -0.006169795 0.1052329 -0.01773238 -0.00694251 0.1056281 -0.01846361 -0.007228732 0.1061009 -0.02446556 -0.009578585 0.1058975 -0.02563261 -0.01003551 0.1063042 -0.0232985 -0.009121656 0.1045826 -0.02844953 -0.01113831 0.1040269 -0.02927446 -0.01146125 0.1051383 -0.0276246 -0.01081538 0.1013063 -0.03151607 -0.01233887 0.1023887 -0.03080773 -0.01206159 -0.06729465 -0.08313727 -0.0325489 -0.06729465 0.00190711 7.46489e-4
+
+
+
+
+
+
+
+
+
+ 0 -0.3645622 0.9311791 -2.09502e-6 -0.3645625 0.9311789 4.69089e-7 -0.364563 0.9311788 -2.77901e-6 -0.3645622 0.9311791 -2.02032e-6 -0.3645631 0.9311786 9.99913e-7 -0.3645644 0.9311782 0 -0.3645603 0.9311798 0 -0.3645603 0.9311798 5.82934e-7 -0.3645633 0.9311786 0 -0.3645635 0.9311785 0 -0.3645622 0.931179 5.58631e-7 -0.3645634 0.9311786 0 -0.3645628 0.9311788 0 -0.3645628 0.9311789 0 -0.3645645 0.9311781 0 -0.3645645 0.9311781 -1.93e-7 -0.3645622 0.9311791 1.41109e-6 -0.3645641 0.9311783 0 -0.3645635 0.9311785 0 -0.3645622 0.9311791 1.4854e-6 -0.3645639 0.9311784 1.25183e-6 -0.3645648 0.931178 1.75829e-6 -0.3645546 0.931182 6.48566e-6 -0.3645625 0.931179 -6.57991e-6 -0.3645588 0.9311804 1.2094e-5 -0.3645586 0.9311804 -3.14163e-5 -0.3645541 0.9311823 -1.65736e-7 -0.3645616 0.9311792 1.63109e-6 -0.3645747 0.9311741 -2.2035e-5 -0.3645374 0.9311888 1.63363e-5 -0.3645935 0.9311668 0 -0.3645623 0.931179 1.53019e-6 -0.3645676 0.931177 -9.40315e-6 -0.3645671 0.9311771 1.34673e-5 -0.3645731 0.9311748 -3.95367e-6 -0.3645629 0.9311787 2.25289e-6 -0.3645722 0.9311752 -2.47978e-5 -0.3645083 0.9312002 1.15075e-5 -0.3646129 0.9311592 -2.34155e-7 -0.3645712 0.9311755 -3.22611e-6 -0.3645746 0.9311742 -2.74169e-6 -0.3645746 0.9311742 -5.71527e-6 -0.3645742 0.9311744 1.25188e-5 -0.3644945 0.9312055 -2.69338e-5 -0.3646373 0.9311497 6.1727e-6 -0.3645399 0.9311878 1.02029e-5 -0.3645423 0.9311869 3.54643e-6 -0.3645637 0.9311784 -2.81744e-5 -0.3645866 0.9311695 1.78505e-5 -0.3645412 0.9311873 7.70131e-6 -0.3645531 0.9311826 -1.0028e-5 -0.3645566 0.9311813 -1.46867e-5 -0.3645624 0.9311789 1.24786e-5 -0.3645662 0.9311775 0 -0.3645713 0.9311754 8.3332e-6 -0.3645694 0.9311762 -1.36678e-6 -0.3645665 0.9311773 -2.82564e-6 -0.3645629 0.9311787 4.96628e-6 -0.3645706 0.9311758 3.55632e-6 -0.3645646 0.9311781 2.01406e-6 -0.364562 0.9311791 1.12083e-6 -0.3645595 0.9311801 -7.91751e-7 -0.364549 0.9311842 -3.07258e-6 -0.3645676 0.9311769 6.08732e-6 -0.3645721 0.9311752 -6.0721e-7 -0.3645567 0.9311813 -1.5058e-6 -0.3645707 0.9311757 8.0799e-7 -0.3645631 0.9311787 -6.61379e-6 -0.3645557 0.9311816 -6.3347e-6 -0.3645528 0.9311828 2.93327e-6 -0.3645596 0.93118 8.2993e-6 -0.3645663 0.9311774 -8.9166e-6 -0.364566 0.9311775 1.19705e-5 -0.3645589 0.9311804 7.80564e-6 -0.36456 0.9311799 0 -0.3645654 0.9311779 0 -0.3645622 0.9311791 -2.88027e-6 -0.3645628 0.9311788 -4.71771e-7 -0.3645625 0.9311789 1.90309e-6 -0.3645631 0.9311786 0 -0.3645627 0.9311789 8.62327e-7 -0.3645642 0.9311782 -2.10246e-6 -0.3645617 0.9311792 0 -0.3645603 0.9311798 -1.03257e-6 -0.3645626 0.9311789 0 -0.3645635 0.9311786 0 -0.3645622 0.9311791 0 -0.3645646 0.9311781 -2.00767e-6 -0.3645641 0.9311783 0 -0.3645628 0.9311788 1.41109e-6 -0.3645641 0.9311783 0 -0.3645646 0.9311781 -2.0104e-6 -0.3645628 0.9311788 1.36276e-7 -0.3645622 0.9311791 0 -0.3645635 0.9311786 1.4907e-6 -0.3645616 0.9311792 2.03276e-6 -0.3645646 0.9311781 7.25087e-7 -0.3645645 0.9311782 6.36881e-6 -0.3645598 0.93118 0 -0.3645653 0.9311778 -8.34472e-6 -0.3645598 0.93118 2.33317e-6 -0.3645595 0.9311801 -8.03607e-6 -0.3645552 0.9311818 3.28308e-5 -0.3646035 0.9311629 2.29627e-6 -0.3645646 0.9311781 1.07359e-5 -0.3645794 0.9311723 -2.32613e-6 -0.364562 0.9311792 -3.06049e-7 -0.3645657 0.9311777 2.84076e-6 -0.3645681 0.9311767 -2.156e-5 -0.3645581 0.9311805 2.93793e-5 -0.3645858 0.9311699 -1.84105e-6 -0.3645653 0.9311779 6.10751e-6 -0.3645772 0.9311732 7.92208e-7 -0.364559 0.9311803 1.52967e-6 -0.364539 0.9311881 0 -0.3645221 0.9311947 -3.19725e-6 -0.3645778 0.9311729 -1.34855e-6 -0.364554 0.9311822 -9.02378e-7 -0.3645402 0.9311877 -6.25835e-6 -0.3645821 0.9311713 -3.09906e-6 -0.3645594 0.9311801 -5.50203e-6 -0.3645691 0.9311764 -1.01301e-5 -0.3645829 0.931171 3.24172e-5 -0.3645166 0.9311969 -2.70363e-5 -0.364585 0.9311701 2.41421e-5 -0.3645434 0.9311863 5.66372e-6 -0.3645631 0.9311786 1.69124e-6 -0.3645637 0.9311785 -1.51486e-5 -0.3645547 0.931182 -2.65764e-6 -0.3645614 0.9311793 1.03474e-5 -0.3645696 0.9311761 -1.1857e-6 -0.3645668 0.9311773 5.28981e-7 -0.3645638 0.9311785 8.44592e-6 -0.3645818 0.9311714 -9.24349e-6 -0.3645718 0.9311753 0 -0.3645695 0.9311761 -4.14087e-7 -0.3645602 0.9311798 -1.50536e-6 -0.3645673 0.9311771 1.51875e-6 -0.364553 0.9311827 -4.22414e-6 -0.3645498 0.9311839 -3.43646e-6 -0.3645756 0.9311738 -1.99117e-6 -0.3645584 0.9311805 -1.30114e-5 -0.3645688 0.9311765 -6.87321e-6 -0.3645539 0.9311823 4.04599e-6 -0.3645586 0.9311804 -1.54151e-6 -0.3645635 0.9311785 -1.29534e-5 -0.3645685 0.9311766 2.78488e-5 -0.3645563 0.9311814 -1.66516e-5 -0.364561 0.9311796 1.61163e-5 -0.3645421 0.9311869 0 -0.3645654 0.9311778
+
+
+
+
+
+
+
+
+
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 9 0 0 14 0 1 8 0 2 9 1 3 10 1 4 11 1 5 57 2 6 33 2 7 56 2 8 76 3 9 101 3 10 75 3 11 128 4 12 124 4 13 125 4 14 14 5 15 7 5 16 8 5 17 13 6 18 11 6 19 18 6 20 18 7 21 12 7 22 17 7 23 24 8 24 2 8 25 3 8 26 16 9 27 18 9 28 19 9 29 2 10 30 22 10 31 1 10 32 4 11 33 24 11 34 3 11 35 23 12 36 25 12 37 20 12 38 20 13 39 26 13 40 19 13 41 19 14 42 6 14 43 16 14 44 7 15 45 16 15 46 6 15 47 27 16 48 4 16 49 5 16 50 27 17 51 6 17 52 26 17 53 20 18 54 22 18 55 23 18 56 17 19 57 1 19 58 22 19 59 10 20 60 1 20 61 12 20 62 29 21 63 129 21 64 28 21 65 130 22 66 28 22 67 129 22 68 130 23 69 62 23 70 63 23 71 28 24 72 64 24 73 40 24 74 40 25 75 65 25 76 39 25 77 39 26 78 66 26 79 38 26 80 38 27 81 66 27 82 74 27 83 74 28 84 67 28 85 73 28 86 68 29 87 73 29 88 67 29 89 71 30 90 68 30 91 131 30 92 71 31 93 69 31 94 70 31 95 59 32 96 29 32 97 30 32 98 59 33 99 31 33 100 58 33 101 58 34 102 32 34 103 57 34 104 56 35 105 132 35 106 55 35 107 54 36 108 132 36 109 133 36 110 53 37 111 133 37 112 134 37 113 52 38 114 134 38 115 34 38 116 34 39 117 51 39 118 52 39 119 50 40 120 35 40 121 137 40 122 49 41 123 137 41 124 135 41 125 48 42 126 135 42 127 136 42 128 47 43 129 136 43 130 36 43 131 46 44 132 36 44 133 140 44 134 45 45 135 140 45 136 138 45 137 44 46 138 138 46 139 139 46 140 43 47 141 139 47 142 37 47 143 42 48 144 37 48 145 142 48 146 41 49 147 142 49 148 141 49 149 141 50 150 74 50 151 41 50 152 82 51 153 119 51 154 81 51 155 143 52 156 97 52 157 98 52 158 77 53 159 144 53 160 122 53 161 89 54 162 112 54 163 88 54 164 80 55 165 121 55 166 79 55 167 122 56 168 76 56 169 77 56 170 81 57 171 120 57 172 80 57 173 84 58 174 115 58 175 116 58 176 93 59 177 106 59 178 107 59 179 87 60 180 112 60 181 113 60 182 143 61 183 99 61 184 102 61 185 113 62 186 86 62 187 87 62 188 109 63 189 92 63 190 108 63 191 116 64 192 83 64 193 84 64 194 110 65 195 91 65 196 109 65 197 111 66 198 90 66 199 110 66 200 94 67 201 105 67 202 106 67 203 85 68 204 114 68 205 115 68 206 83 69 207 118 69 208 82 69 209 75 70 210 102 70 211 99 70 212 96 71 213 103 71 214 104 71 215 95 72 216 104 72 217 105 72 218 79 73 219 144 73 220 78 73 221 108 74 222 93 74 223 107 74 224 128 75 225 126 75 226 127 75 227 9 76 228 13 76 229 14 76 230 9 77 231 0 77 232 10 77 233 57 78 234 32 78 235 33 78 236 76 79 237 100 79 238 101 79 239 128 80 240 123 80 241 124 80 242 14 81 243 15 81 244 7 81 245 13 82 246 9 82 247 11 82 248 18 83 249 11 83 250 12 83 251 24 84 252 21 84 253 2 84 254 16 85 255 13 85 256 18 85 257 2 86 258 21 86 259 22 86 260 4 87 261 23 87 262 24 87 263 23 88 264 4 88 265 25 88 266 20 89 267 25 89 268 26 89 269 19 90 270 26 90 271 6 90 272 7 91 273 15 91 274 16 91 275 27 92 276 25 92 277 4 92 278 27 93 279 5 93 280 6 93 281 20 94 282 17 94 283 22 94 284 17 95 285 12 95 286 1 95 287 10 96 288 0 96 289 1 96 290 29 97 291 60 97 292 129 97 293 130 98 294 63 98 295 28 98 296 130 99 297 61 99 298 62 99 299 28 100 300 63 100 301 64 100 302 40 101 303 64 101 304 65 101 305 39 102 306 65 102 307 66 102 308 74 103 309 66 103 310 67 103 311 68 104 312 72 104 313 73 104 314 71 105 315 72 105 316 68 105 317 71 106 318 131 106 319 69 106 320 59 107 321 60 107 322 29 107 323 59 108 324 30 108 325 31 108 326 58 109 327 31 109 328 32 109 329 56 110 330 33 110 331 132 110 332 54 111 333 55 111 334 132 111 335 53 112 336 54 112 337 133 112 338 52 113 339 53 113 340 134 113 341 34 114 342 35 114 343 51 114 344 50 115 345 51 115 346 35 115 347 49 116 348 50 116 349 137 116 350 48 117 351 49 117 352 135 117 353 47 118 354 48 118 355 136 118 356 46 119 357 47 119 358 36 119 359 45 120 360 46 120 361 140 120 362 44 121 363 45 121 364 138 121 365 43 122 366 44 122 367 139 122 368 42 123 369 43 123 370 37 123 371 41 124 372 42 124 373 142 124 374 141 125 375 38 125 376 74 125 377 82 126 378 118 126 379 119 126 380 143 127 381 103 127 382 97 127 383 77 128 384 78 128 385 144 128 386 89 129 387 111 129 388 112 129 389 80 130 390 120 130 391 121 130 392 122 131 393 100 131 394 76 131 395 81 132 396 119 132 397 120 132 398 84 133 399 85 133 400 115 133 401 93 134 402 94 134 403 106 134 404 87 135 405 88 135 406 112 135 407 143 136 408 98 136 409 99 136 410 113 137 411 114 137 412 86 137 413 109 138 414 91 138 415 92 138 416 116 139 417 117 139 418 83 139 419 110 140 420 90 140 421 91 140 422 111 141 423 89 141 424 90 141 425 94 142 426 95 142 427 105 142 428 85 143 429 86 143 430 114 143 431 83 144 432 117 144 433 118 144 434 75 145 435 101 145 436 102 145 437 96 146 438 97 146 439 103 146 440 95 147 441 96 147 442 104 147 443 79 148 444 121 148 445 144 148 446 108 149 447 92 149 448 93 149 449 128 150 450 125 150 451 126 150 452
+
+
+
+
+
+
+ -0.005142211 0.3560282 0.1393873 -0.1562415 0.2105299 0.0824238 -0.2858994 0.2105299 0.0824238 -0.4094155 0.09173345 0.03591418 -0.2573212 0.09172272 0.03590989 -0.2573212 -0.05415678 -0.0212028 -0.1055529 0.09177327 0.03592967 0.02298182 0.09177327 0.03592967 0.1464105 0.2105299 0.0824238 -0.005142211 0.2105299 0.0824238 -0.03618305 0.2837858 0.1111038 -0.03618305 0.2104402 0.08238863 -0.1124573 0.2104402 0.08238863 -0.01300173 0.1805353 0.07068073 0.07141667 0.1805353 0.07068073 0.0102846 0.121711 0.04765057 -0.0740931 0.121711 0.04765057 -0.1435734 0.1805353 0.07068073 -0.05692553 0.1805353 0.07068073 -0.1180346 0.121711 0.04765057 -0.2046594 0.121711 0.04765057 -0.2733249 0.1805353 0.07068073 -0.1876605 0.1805353 0.07068073 -0.2487926 0.121711 0.04765057 -0.3344163 0.121711 0.04765057 -0.2265189 0.09177827 0.0359317 -0.1493425 0.09177827 0.0359317 -0.2265189 0.01739144 0.006808757 0.0809375 -0.03424954 -0.01340913 0.0809375 -0.01076054 -0.004212975 0.09165352 -0.01087498 -0.004257798 0.09615892 -0.01137948 -0.004455327 0.1002128 -0.01251578 -0.004900097 0.1034994 -0.01452541 -0.005686879 0.1062997 -0.01970601 -0.007715225 0.1065075 -0.02213144 -0.008664727 0.1056941 -0.02679967 -0.01049232 0.1034711 -0.03009963 -0.01178431 0.1001651 -0.0322628 -0.01263117 0.09610235 -0.03352093 -0.01312386 0.09160929 -0.03410601 -0.01335287 0.1122428 -0.03955793 -0.01548731 0.1146792 -0.03851318 -0.01507818 0.1169002 -0.0372312 -0.01457643 0.1188962 -0.03573083 -0.01398897 0.1206574 -0.03402972 -0.01332294 0.1221742 -0.03214645 -0.01258563 0.1234369 -0.03009891 -0.01178395 0.1244359 -0.02790522 -0.01092517 0.1251614 -0.02558374 -0.01001632 0.1256038 -0.02315282 -0.009064555 0.1257534 -0.02063012 -0.008077025 0.1252774 -0.01507639 -0.005902647 0.1239131 -0.01046943 -0.004099011 0.1217556 -0.006720781 -0.002631306 0.1189004 -0.003741979 -0.001465082 0.1154427 -0.001444578 -5.65648e-4 0.1114779 2.59638e-4 1.01566e-4 0.1071013 0.001459121 5.71251e-4 0.09749376 0.002697706 0.001056075 0.06247532 0.002979993 0.001166582 0.06247532 -0.08420896 -0.03296852 0.0809375 -0.08420896 -0.03296852 0.0809375 -0.0479958 -0.01879084 0.09032231 -0.04821038 -0.01887476 0.09304052 -0.04888176 -0.01913762 0.09517431 -0.05005168 -0.01959562 0.09688174 -0.05176162 -0.02026522 0.09832072 -0.05405378 -0.0211625 0.1107196 -0.08420896 -0.03296852 0.1312764 -0.08420896 -0.03296852 0.1155101 -0.04812002 -0.01883947 0.1142875 -0.04613733 -0.01806318 0.1120058 -0.04348039 -0.01702296 0.1079723 -0.04129457 -0.01616716 -0.08758747 -0.07046842 -0.02758896 -0.08758747 -0.01076054 -0.004212975 -0.07348859 -0.01098561 -0.004301071 -0.06972497 -0.01165413 -0.004562735 -0.06608283 -0.01275658 -0.004994392 -0.06261205 -0.01428318 -0.005592107 -0.05936253 -0.01622462 -0.006352186 -0.05638426 -0.01857113 -0.007270812 -0.0537272 -0.02131319 -0.008344292 -0.05144125 -0.02444076 -0.00956881 -0.04957634 -0.02794456 -0.01094067 -0.04818242 -0.03181505 -0.01245594 -0.04730951 -0.03604245 -0.01411092 -0.04700744 -0.04061698 -0.01590192 -0.04730951 -0.04519271 -0.0176934 -0.04818248 -0.04942059 -0.01934862 -0.04957634 -0.05329108 -0.020864 -0.05144125 -0.05679464 -0.02223563 -0.0537272 -0.05992174 -0.02345979 -0.05638432 -0.0626626 -0.02453291 -0.05936259 -0.06500792 -0.02545118 -0.06261205 -0.06694841 -0.02621078 -0.06608283 -0.06847405 -0.02680814 -0.06972503 -0.06957554 -0.02723944 -0.07348865 -0.07024359 -0.02750098 -0.1060436 0.002979993 0.001166582 -0.1060436 -0.08420896 -0.03296852 -0.07390683 -0.08401179 -0.03289127 -0.06068253 -0.08226275 -0.03220653 -0.0545758 -0.08059525 -0.03155374 -0.04890614 -0.07832241 -0.03066384 -0.04374867 -0.07538652 -0.02951443 -0.0391786 -0.07172989 -0.02808284 -0.03527104 -0.06729459 -0.02634644 -0.03210103 -0.0620234 -0.02428269 -0.02974367 -0.05585861 -0.02186918 -0.02827423 -0.04874229 -0.01908302 -0.02776771 -0.04061698 -0.01590192 -0.02827423 -0.03249382 -0.01272165 -0.02974367 -0.02537894 -0.009936094 -0.03210103 -0.01921439 -0.007522702 -0.03527104 -0.01394295 -0.005458831 -0.0391786 -0.00950694 -0.00372219 -0.04374867 -0.005849123 -0.002290129 -0.04890614 -0.002911806 -0.001140117 -0.0545758 -6.37293e-4 -2.49624e-4 -0.06068253 0.001031398 4.03762e-4 -0.07390683 0.002782583 0.001089334 0.01023375 0.002979993 0.001166582 -0.008228361 0.002979993 0.001166582 -0.008228361 -0.08420896 -0.03296852 0.04594016 -0.08420896 -0.03296852 0.04594016 -0.07046842 -0.02758896 0.01023375 -0.07046842 -0.02758896 0.06247538 -0.03346037 -0.01310014 0.06247532 -0.04847478 -0.01897823 0.09931051 -0.05646109 -0.02210509 0.104166 -0.01575875 -0.006169795 0.1052329 -0.01773238 -0.00694251 0.1056281 -0.01846361 -0.007228732 0.1061009 -0.02446556 -0.009578585 0.1058975 -0.02563261 -0.01003551 0.1063042 -0.0232985 -0.009121656 0.1045826 -0.02844953 -0.01113831 0.1040269 -0.02927446 -0.01146125 0.1051383 -0.0276246 -0.01081538 0.1013063 -0.03151607 -0.01233887 0.1023887 -0.03080773 -0.01206159 -0.06729465 -0.08313727 -0.0325489 -0.06729465 0.00190711 7.46489e-4
+
+
+
+
+
+
+
+
+
+ 0 -0.3645622 0.9311791 -2.09502e-6 -0.3645625 0.9311789 4.69089e-7 -0.364563 0.9311788 -2.77901e-6 -0.3645622 0.9311791 -2.02032e-6 -0.3645631 0.9311786 9.99913e-7 -0.3645644 0.9311782 0 -0.3645603 0.9311798 0 -0.3645603 0.9311798 5.82934e-7 -0.3645633 0.9311786 0 -0.3645635 0.9311785 0 -0.3645622 0.931179 5.58631e-7 -0.3645634 0.9311786 0 -0.3645628 0.9311788 0 -0.3645628 0.9311789 0 -0.3645645 0.9311781 0 -0.3645645 0.9311781 -1.93e-7 -0.3645622 0.9311791 1.41109e-6 -0.3645641 0.9311783 0 -0.3645635 0.9311785 0 -0.3645622 0.9311791 1.4854e-6 -0.3645639 0.9311784 1.25183e-6 -0.3645648 0.931178 1.75829e-6 -0.3645546 0.931182 6.48566e-6 -0.3645625 0.931179 -6.57991e-6 -0.3645588 0.9311804 1.2094e-5 -0.3645586 0.9311804 -3.14163e-5 -0.3645541 0.9311823 -1.65736e-7 -0.3645616 0.9311792 1.63109e-6 -0.3645747 0.9311741 -2.2035e-5 -0.3645374 0.9311888 1.63363e-5 -0.3645935 0.9311668 0 -0.3645623 0.931179 1.53019e-6 -0.3645676 0.931177 -9.40315e-6 -0.3645671 0.9311771 1.34673e-5 -0.3645731 0.9311748 -3.95367e-6 -0.3645629 0.9311787 2.25289e-6 -0.3645722 0.9311752 -2.47978e-5 -0.3645083 0.9312002 1.15075e-5 -0.3646129 0.9311592 -2.34155e-7 -0.3645712 0.9311755 -3.22611e-6 -0.3645746 0.9311742 -2.74169e-6 -0.3645746 0.9311742 -5.71527e-6 -0.3645742 0.9311744 1.25188e-5 -0.3644945 0.9312055 -2.69338e-5 -0.3646373 0.9311497 6.1727e-6 -0.3645399 0.9311878 1.02029e-5 -0.3645423 0.9311869 3.54643e-6 -0.3645637 0.9311784 -2.81744e-5 -0.3645866 0.9311695 1.78505e-5 -0.3645412 0.9311873 7.70131e-6 -0.3645531 0.9311826 -1.0028e-5 -0.3645566 0.9311813 -1.46867e-5 -0.3645624 0.9311789 1.24786e-5 -0.3645662 0.9311775 0 -0.3645713 0.9311754 8.3332e-6 -0.3645694 0.9311762 -1.36678e-6 -0.3645665 0.9311773 -2.82564e-6 -0.3645629 0.9311787 4.96628e-6 -0.3645706 0.9311758 3.55632e-6 -0.3645646 0.9311781 2.01406e-6 -0.364562 0.9311791 1.12083e-6 -0.3645595 0.9311801 -7.91751e-7 -0.364549 0.9311842 -3.07258e-6 -0.3645676 0.9311769 6.08732e-6 -0.3645721 0.9311752 -6.0721e-7 -0.3645567 0.9311813 -1.5058e-6 -0.3645707 0.9311757 8.0799e-7 -0.3645631 0.9311787 -6.61379e-6 -0.3645557 0.9311816 -6.3347e-6 -0.3645528 0.9311828 2.93327e-6 -0.3645596 0.93118 8.2993e-6 -0.3645663 0.9311774 -8.9166e-6 -0.364566 0.9311775 1.19705e-5 -0.3645589 0.9311804 7.80564e-6 -0.36456 0.9311799 0 -0.3645654 0.9311779 0 -0.3645622 0.9311791 -2.88027e-6 -0.3645628 0.9311788 -4.71771e-7 -0.3645625 0.9311789 1.90309e-6 -0.3645631 0.9311786 0 -0.3645627 0.9311789 8.62327e-7 -0.3645642 0.9311782 -2.10246e-6 -0.3645617 0.9311792 0 -0.3645603 0.9311798 -1.03257e-6 -0.3645626 0.9311789 0 -0.3645635 0.9311786 0 -0.3645622 0.9311791 0 -0.3645646 0.9311781 -2.00767e-6 -0.3645641 0.9311783 0 -0.3645628 0.9311788 1.41109e-6 -0.3645641 0.9311783 0 -0.3645646 0.9311781 -2.0104e-6 -0.3645628 0.9311788 1.36276e-7 -0.3645622 0.9311791 0 -0.3645635 0.9311786 1.4907e-6 -0.3645616 0.9311792 2.03276e-6 -0.3645646 0.9311781 7.25087e-7 -0.3645645 0.9311782 6.36881e-6 -0.3645598 0.93118 0 -0.3645653 0.9311778 -8.34472e-6 -0.3645598 0.93118 2.33317e-6 -0.3645595 0.9311801 -8.03607e-6 -0.3645552 0.9311818 3.28308e-5 -0.3646035 0.9311629 2.29627e-6 -0.3645646 0.9311781 1.07359e-5 -0.3645794 0.9311723 -2.32613e-6 -0.364562 0.9311792 -3.06049e-7 -0.3645657 0.9311777 2.84076e-6 -0.3645681 0.9311767 -2.156e-5 -0.3645581 0.9311805 2.93793e-5 -0.3645858 0.9311699 -1.84105e-6 -0.3645653 0.9311779 6.10751e-6 -0.3645772 0.9311732 7.92208e-7 -0.364559 0.9311803 1.52967e-6 -0.364539 0.9311881 0 -0.3645221 0.9311947 -3.19725e-6 -0.3645778 0.9311729 -1.34855e-6 -0.364554 0.9311822 -9.02378e-7 -0.3645402 0.9311877 -6.25835e-6 -0.3645821 0.9311713 -3.09906e-6 -0.3645594 0.9311801 -5.50203e-6 -0.3645691 0.9311764 -1.01301e-5 -0.3645829 0.931171 3.24172e-5 -0.3645166 0.9311969 -2.70363e-5 -0.364585 0.9311701 2.41421e-5 -0.3645434 0.9311863 5.66372e-6 -0.3645631 0.9311786 1.69124e-6 -0.3645637 0.9311785 -1.51486e-5 -0.3645547 0.931182 -2.65764e-6 -0.3645614 0.9311793 1.03474e-5 -0.3645696 0.9311761 -1.1857e-6 -0.3645668 0.9311773 5.28981e-7 -0.3645638 0.9311785 8.44592e-6 -0.3645818 0.9311714 -9.24349e-6 -0.3645718 0.9311753 0 -0.3645695 0.9311761 -4.14087e-7 -0.3645602 0.9311798 -1.50536e-6 -0.3645673 0.9311771 1.51875e-6 -0.364553 0.9311827 -4.22414e-6 -0.3645498 0.9311839 -3.43646e-6 -0.3645756 0.9311738 -1.99117e-6 -0.3645584 0.9311805 -1.30114e-5 -0.3645688 0.9311765 -6.87321e-6 -0.3645539 0.9311823 4.04599e-6 -0.3645586 0.9311804 -1.54151e-6 -0.3645635 0.9311785 -1.29534e-5 -0.3645685 0.9311766 2.78488e-5 -0.3645563 0.9311814 -1.66516e-5 -0.364561 0.9311796 1.61163e-5 -0.3645421 0.9311869 0 -0.3645654 0.9311778
+
+
+
+
+
+
+
+
+
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 9 0 0 14 0 1 8 0 2 9 1 3 10 1 4 11 1 5 57 2 6 33 2 7 56 2 8 76 3 9 101 3 10 75 3 11 128 4 12 124 4 13 125 4 14 14 5 15 7 5 16 8 5 17 13 6 18 11 6 19 18 6 20 18 7 21 12 7 22 17 7 23 24 8 24 2 8 25 3 8 26 16 9 27 18 9 28 19 9 29 2 10 30 22 10 31 1 10 32 4 11 33 24 11 34 3 11 35 23 12 36 25 12 37 20 12 38 20 13 39 26 13 40 19 13 41 19 14 42 6 14 43 16 14 44 7 15 45 16 15 46 6 15 47 27 16 48 4 16 49 5 16 50 27 17 51 6 17 52 26 17 53 20 18 54 22 18 55 23 18 56 17 19 57 1 19 58 22 19 59 10 20 60 1 20 61 12 20 62 29 21 63 129 21 64 28 21 65 130 22 66 28 22 67 129 22 68 130 23 69 62 23 70 63 23 71 28 24 72 64 24 73 40 24 74 40 25 75 65 25 76 39 25 77 39 26 78 66 26 79 38 26 80 38 27 81 66 27 82 74 27 83 74 28 84 67 28 85 73 28 86 68 29 87 73 29 88 67 29 89 71 30 90 68 30 91 131 30 92 71 31 93 69 31 94 70 31 95 59 32 96 29 32 97 30 32 98 59 33 99 31 33 100 58 33 101 58 34 102 32 34 103 57 34 104 56 35 105 132 35 106 55 35 107 54 36 108 132 36 109 133 36 110 53 37 111 133 37 112 134 37 113 52 38 114 134 38 115 34 38 116 34 39 117 51 39 118 52 39 119 50 40 120 35 40 121 137 40 122 49 41 123 137 41 124 135 41 125 48 42 126 135 42 127 136 42 128 47 43 129 136 43 130 36 43 131 46 44 132 36 44 133 140 44 134 45 45 135 140 45 136 138 45 137 44 46 138 138 46 139 139 46 140 43 47 141 139 47 142 37 47 143 42 48 144 37 48 145 142 48 146 41 49 147 142 49 148 141 49 149 141 50 150 74 50 151 41 50 152 82 51 153 119 51 154 81 51 155 143 52 156 97 52 157 98 52 158 77 53 159 144 53 160 122 53 161 89 54 162 112 54 163 88 54 164 80 55 165 121 55 166 79 55 167 122 56 168 76 56 169 77 56 170 81 57 171 120 57 172 80 57 173 84 58 174 115 58 175 116 58 176 93 59 177 106 59 178 107 59 179 87 60 180 112 60 181 113 60 182 143 61 183 99 61 184 102 61 185 113 62 186 86 62 187 87 62 188 109 63 189 92 63 190 108 63 191 116 64 192 83 64 193 84 64 194 110 65 195 91 65 196 109 65 197 111 66 198 90 66 199 110 66 200 94 67 201 105 67 202 106 67 203 85 68 204 114 68 205 115 68 206 83 69 207 118 69 208 82 69 209 75 70 210 102 70 211 99 70 212 96 71 213 103 71 214 104 71 215 95 72 216 104 72 217 105 72 218 79 73 219 144 73 220 78 73 221 108 74 222 93 74 223 107 74 224 128 75 225 126 75 226 127 75 227 9 76 228 13 76 229 14 76 230 9 77 231 0 77 232 10 77 233 57 78 234 32 78 235 33 78 236 76 79 237 100 79 238 101 79 239 128 80 240 123 80 241 124 80 242 14 81 243 15 81 244 7 81 245 13 82 246 9 82 247 11 82 248 18 83 249 11 83 250 12 83 251 24 84 252 21 84 253 2 84 254 16 85 255 13 85 256 18 85 257 2 86 258 21 86 259 22 86 260 4 87 261 23 87 262 24 87 263 23 88 264 4 88 265 25 88 266 20 89 267 25 89 268 26 89 269 19 90 270 26 90 271 6 90 272 7 91 273 15 91 274 16 91 275 27 92 276 25 92 277 4 92 278 27 93 279 5 93 280 6 93 281 20 94 282 17 94 283 22 94 284 17 95 285 12 95 286 1 95 287 10 96 288 0 96 289 1 96 290 29 97 291 60 97 292 129 97 293 130 98 294 63 98 295 28 98 296 130 99 297 61 99 298 62 99 299 28 100 300 63 100 301 64 100 302 40 101 303 64 101 304 65 101 305 39 102 306 65 102 307 66 102 308 74 103 309 66 103 310 67 103 311 68 104 312 72 104 313 73 104 314 71 105 315 72 105 316 68 105 317 71 106 318 131 106 319 69 106 320 59 107 321 60 107 322 29 107 323 59 108 324 30 108 325 31 108 326 58 109 327 31 109 328 32 109 329 56 110 330 33 110 331 132 110 332 54 111 333 55 111 334 132 111 335 53 112 336 54 112 337 133 112 338 52 113 339 53 113 340 134 113 341 34 114 342 35 114 343 51 114 344 50 115 345 51 115 346 35 115 347 49 116 348 50 116 349 137 116 350 48 117 351 49 117 352 135 117 353 47 118 354 48 118 355 136 118 356 46 119 357 47 119 358 36 119 359 45 120 360 46 120 361 140 120 362 44 121 363 45 121 364 138 121 365 43 122 366 44 122 367 139 122 368 42 123 369 43 123 370 37 123 371 41 124 372 42 124 373 142 124 374 141 125 375 38 125 376 74 125 377 82 126 378 118 126 379 119 126 380 143 127 381 103 127 382 97 127 383 77 128 384 78 128 385 144 128 386 89 129 387 111 129 388 112 129 389 80 130 390 120 130 391 121 130 392 122 131 393 100 131 394 76 131 395 81 132 396 119 132 397 120 132 398 84 133 399 85 133 400 115 133 401 93 134 402 94 134 403 106 134 404 87 135 405 88 135 406 112 135 407 143 136 408 98 136 409 99 136 410 113 137 411 114 137 412 86 137 413 109 138 414 91 138 415 92 138 416 116 139 417 117 139 418 83 139 419 110 140 420 90 140 421 91 140 422 111 141 423 89 141 424 90 141 425 94 142 426 95 142 427 105 142 428 85 143 429 86 143 430 114 143 431 83 144 432 117 144 433 118 144 434 75 145 435 101 145 436 102 145 437 96 146 438 97 146 439 103 146 440 95 147 441 96 147 442 104 147 443 79 148 444 121 148 445 144 148 446 108 149 447 92 149 448 93 149 449 128 150 450 125 150 451 126 150 452
+
+
+
+
+
+
+ -2.895522 -0.6669735 0.0878328 0.1145882 0.9091753 0.4534754 -2.973302 -1.059562 -1 -2.895522 -0.8779322 0.1687357 -2.895522 -0.7321633 0.09179246 0.1145882 1.041564 0.4596558 -2.973302 1.064065 -1 -2.895522 -0.7909719 0.1032838 -2.895522 -0.8376427 0.1211822 1.102477 0.87454 0.6800699 0.9239788 0.8675349 0.7258993 -2.895522 -0.8676071 0.1437353 -2.895522 -0.8779322 0.6723197 1.931145 0.9453731 0.1694508 1.980617 -1.059562 -1 -2.895522 -0.6669735 0.7532226 1.87544 0.958566 0.07834327 -2.895522 -0.8676071 0.6973201 -2.895522 -0.8376427 0.7198732 1.0656 0.8718593 0.6976081 1.980617 1.064065 -1 -2.895522 -0.7909719 0.7377715 -2.895522 -0.7321633 0.7492629 1.964806 0.9494499 0.141297 -2.895522 0.8571078 0.1687357 1.976025 0.9531277 0.1158992 -2.895522 0.6461491 0.0878328 1.018728 0.8695866 0.7124762 -2.895522 0.8467827 0.1437353 -2.764235 0.9584811 0.3735234 -2.895522 0.8168182 0.1211822 1.963701 0.9560464 0.09574329 -2.895522 0.7701475 0.1032838 1.110744 0.4171029 0.7266641 -2.895522 0.7113389 0.09179246 1.929042 0.9579203 0.08280241 -2.895522 0.6461491 0.7532226 0.9689974 0.8680681 0.7224107 -2.895522 0.8571078 0.6723197 -2.212794 0.9070042 0.7412561 -2.895522 0.7113389 0.7492629 1.110744 0.01319849 0.7266641 -2.722259 0.9387817 0.5142486 -2.895522 0.7701475 0.7377715 -2.895522 0.8168182 0.7198732 -2.602721 0.9220814 0.6335497 -2.895522 0.8467827 0.6973201 1.606475 0.9172182 0.3638829 1.478097 0.9196068 0.3852298 -2.423821 0.9109227 0.7132642 1.651204 0.9189769 0.3517377 1.615447 0.9173043 0.3632885 1.402127 0.9021703 0.4993047 1.87544 1.065824 0.08225083 1.625365 0.9175541 0.3615634 1.635261 0.9179432 0.3588765 1.375569 0.9091753 0.4534754 1.644164 0.9184334 0.3554908 -2.953132 -1.101704 -0.02619224 1.472314 0.9150816 0.4148348 1.455846 0.9101789 0.4469098 1.4312 0.905645 0.4765717 1.976024 1.060386 0.1198067 1.963701 1.063305 0.09965085 1.929041 1.065179 0.08670997 1.530201 0.9232728 0.3220711 1.110744 -0.3907058 0.7266641 1.592943 0.9172182 0.3638829 1.371995 0.9676504 0.07091426 1.533272 0.9214018 0.3349916 -2.953132 1.101686 -0.02619224 1.542183 0.919714 0.3466475 1.556064 0.9183745 0.3558976 1.478097 0.9568554 0.1415386 0.01304346 0.9625791 0.1538554 1.573554 0.9175145 0.3618365 1.412599 0.9668287 0.07629024 1.447021 0.9644886 0.09159964 -1.510438 0.9899878 0.1484498 1.470021 0.9609864 0.1145119 -1.605211 0.9988348 0.08525007 1.623184 0.958566 0.07834327 0.1145882 0.9568553 0.1415386 1.530201 0.9495931 0.1403083 0.2206898 0.9676503 0.07091426 1.594451 0.9581269 0.08137607 0.1226646 0.9609864 0.1145119 1.56853 0.9568523 0.09017753 1.547959 0.9548673 0.1038862 -1.517652 0.9933734 0.1242643 1.534752 0.9523659 0.12116 0.1456646 0.9644885 0.09159964 -0.154524 0.8886139 0.7336434 0.01304346 0.8988519 0.6533908 0.1800864 0.9668286 0.07629024 3.183262 0.8234184 -1 0.2206898 0.8675349 0.7258993 0.1145882 0.8783299 0.6552749 -0.1027429 0.889115 0.7297155 1.931144 -0.9453768 0.1694508 -1.538197 0.9962436 0.1037608 1.87544 -0.9585698 0.07834327 1.964806 -0.9494538 0.141297 0.1800864 0.8683566 0.7205234 0.1456646 0.8706967 0.7052139 1.976024 -0.9531315 0.1158991 -1.568943 0.9981614 0.09006083 1.963701 -0.9560502 0.09574323 1.929042 -0.957924 0.08280241 0.1226646 0.8741988 0.6823018 -0.05603033 0.8905692 0.7183165 -0.01895904 0.8928342 0.7005621 0.004842042 0.8956882 0.6781902 3.183262 -0.7068113 -1 -1.605211 0.9070041 0.7412561 -1.365124 0.9625791 0.1538554 1.606475 -0.9172221 0.3638829 1.651204 -0.9189808 0.3517377 -1.510438 0.9158511 0.6780564 1.615446 -0.917308 0.3632885 1.625365 -0.9175579 0.3615634 -1.568943 0.9076776 0.7364454 -2.935304 -1.000009 0.7958086 1.63526 -0.9179469 0.3588765 -1.333121 0.9685969 0.1066842 1.644164 -0.9184373 0.3554908 -1.538197 0.9095954 0.7227454 -1.356922 0.9657429 0.129056 -1.365124 0.8988519 0.6533908 -1.517652 0.9124655 0.7022419 0.1145882 -0.9091828 0.4534753 1.5302 -0.9232765 0.3220711 -1.197556 0.8886139 0.7336434 1.592942 -0.9172221 0.3638829 1.102477 -0.8745476 0.6800699 1.533271 -0.9214055 0.3349916 -1.356922 0.8956882 0.6781902 1.542183 -0.9197177 0.3466475 1.556064 -0.9183783 0.3558976 0.9239788 -0.8675425 0.7258992 1.0656 -0.8718668 0.697608 1.573554 -0.9175182 0.3618364 -1.333121 0.8928342 0.7005621 1.018728 -0.8695943 0.7124761 -2.935304 -0.9974009 0.8122738 -2.669462 0.9988349 0.08525007 0.9689974 -0.8680756 0.7224107 -1.29605 0.8905692 0.7183165 1.623184 -0.9585698 0.07834327 -1.249337 0.889115 0.7297155 1.5302 -0.949597 0.1403083 -2.935304 -0.9898327 0.8271273 1.59445 -0.9581307 0.08137607 -2.764235 0.9899879 0.1484498 1.56853 -0.9568562 0.09017753 -2.70573 0.9981614 0.09006083 1.547959 -0.954871 0.1038861 1.478097 -0.9196144 0.3852298 -2.736477 0.9962436 0.1037608 1.534751 -0.9523695 0.12116 1.402127 -0.9021779 0.4993047 1.375569 -0.9091829 0.4534753 -2.935304 -0.9780449 0.8389151 1.472314 -0.9150893 0.4148348 -2.935304 -0.9631915 0.8464833 1.455846 -0.9101865 0.4469098 -2.757021 0.9933735 0.1242643 1.4312 -0.9056528 0.4765716 -2.935304 0.9999899 0.7958086 1.5302 1.030531 0.3259786 -2.935304 0.9631726 0.8464833 -2.764235 -0.9584963 0.3735234 1.371995 -0.9676582 0.07091426 -2.935304 0.9780261 0.8389151 -2.212794 -0.9070195 0.7412561 1.478097 -0.9568631 0.1415386 1.412599 -0.9668362 0.07629019 -2.722259 -0.938797 0.5142485 1.447021 -0.9644963 0.0915997 1.470021 -0.9609943 0.1145119 -2.935304 0.9898139 0.8271273 -2.602721 -0.9220967 0.6335497 0.1145882 -0.9568628 0.1415386 0.2206898 -0.9676579 0.07091426 -2.423821 -0.9109379 0.7132641 0.1226646 -0.960994 0.1145118 0.1456646 -0.9644961 0.09159964 0.1800864 -0.9668361 0.07629019 0.0130434 0.9625779 0.1538549 -0.154524 0.972816 0.07360237 0.2206898 -0.8675424 0.7258992 0.01304334 -0.9625906 0.1538554 0.1145882 -0.8783375 0.6552749 0.1800864 -0.8683641 0.7205232 -0.1545242 -0.9728287 0.07360291 0.1456646 -0.8707042 0.7052139 0.004841923 -0.9657545 0.129056 0.1226646 -0.8742063 0.6823017 -2.935304 0.9973821 0.8122738 0.004842042 0.9657417 0.1290555 -0.01895916 -0.9686084 0.1066842 -0.05603045 -0.9708734 0.08892971 0.9999994 -0.9467263 0.8490911 1.072716 -1.000009 0.7958086 -0.102743 -0.9723277 0.07753074 -0.01895898 0.9685957 0.1066837 -0.1545242 -0.8886255 0.7336433 0.01304334 -0.8988636 0.6533908 1.003558 -0.9631915 0.8464833 -0.05603033 0.9708607 0.08892923 -0.102743 -0.8891266 0.7297154 -0.05603045 -0.8905807 0.7183164 1.623184 1.065825 0.08225083 -0.01895916 -0.8928458 0.7005621 1.5302 1.056852 0.1442158 1.013886 -0.9780449 0.8389151 0.004841923 -0.8956998 0.6781902 -1.197556 -0.9728287 0.07360285 -0.1027429 0.9723149 0.0775302 -1.365124 -0.9625905 0.1538553 -1.510438 -0.9900031 0.1484497 -1.249337 -0.9723274 0.07753074 1.59445 1.065385 0.08528363 -1.29605 -0.9708733 0.08892971 -1.605211 -0.9988501 0.08525002 1.568529 1.064111 0.09408509 -1.333121 -0.9686084 0.1066842 -1.356922 -0.9657543 0.129056 -0.154524 0.8886127 0.7336426 -1.365124 -0.8988634 0.6533908 -1.517652 -0.9933889 0.1242642 -1.538197 -0.996259 0.1037608 -1.197556 -0.8886255 0.7336432 -1.356922 -0.8956996 0.6781902 1.547958 1.062126 0.1077938 -1.333121 -0.8928457 0.7005621 -1.568943 -0.9981766 0.09006083 1.029974 -0.9898327 0.8271273 -1.29605 -0.8905806 0.7183165 -1.249337 -0.8891264 0.7297155 -1.605211 -0.9070195 0.7412561 -1.510438 1.043266 0.1523319 -1.510438 -0.9158666 0.6780564 1.534751 1.059624 0.1250675 -1.568943 -0.907693 0.7364453 0.0130434 0.8988507 0.6533901 -1.538197 -0.9096108 0.7227453 -0.1027429 0.8891138 0.7297148 -1.517652 -0.9124811 0.7022418 1.050245 -0.9974009 0.8122738 -0.05603033 0.890568 0.7183158 -2.669462 -0.9988501 0.08525002 -1.60521 1.052113 0.08913218 -2.764235 -0.9900031 0.1484497 -0.01895898 0.892833 0.7005614 -2.70573 -0.9981766 0.09006083 -2.736477 -0.996259 0.1037608 -1.517652 1.046651 0.1281464 -2.757021 -0.9933889 0.1242642 0.004842042 0.8956871 0.6781895 1.87544 -1.065844 0.08225089 1.072716 0.9999899 0.7958086 -1.538196 1.049521 0.107643 1.976024 -1.060405 0.1198067 1.9637 -1.063324 0.09965091 -1.197556 0.972816 0.07360237 0.1145882 1.010718 0.6614553 1.929041 -1.065198 0.08671003 -1.365123 0.9625779 0.1538549 0.9999994 0.9467074 0.8490911 1.050245 0.9973821 0.8122738 -1.249337 0.9723149 0.0775302 -1.568943 1.051439 0.09394299 -1.296049 0.9708607 0.08892923 0.1145881 -1.041582 0.4596558 1.029974 0.9898139 0.8271273 -1.333121 0.9685957 0.1066837 -1.356922 0.9657417 0.1290555 2.094711 -0.7093079 0.1329374 -1.365123 0.8988507 0.6533901 -1.197556 0.8886127 0.7336426 1.5302 -1.03055 0.3259786 -1.510438 0.9691296 0.6819383 -1.356922 0.8956871 0.6781895 2.131235 -0.2796128 0.1108984 -1.333121 0.892833 0.7005614 -1.296049 0.890568 0.7183158 1.013886 0.9780261 0.8389151 1.623183 -1.065844 0.08225089 1.5302 -1.056871 0.1442158 -1.249337 0.8891138 0.7297148 1.59445 -1.065404 0.08528369 1.568529 -1.06413 0.09408515 2.004912 -0.4857091 0.1871216 1.547958 -1.062145 0.1077938 1.534751 -1.059643 0.1250676 1.003558 0.9631726 0.8464833 -2.669461 1.052113 0.08913224 -2.882021 -0.9467263 0.8490911 -2.764234 1.043266 0.1523319 2.105997 -0.6336155 0.126127 -2.705729 1.051439 0.09394299 -2.736476 1.049522 0.107643 -2.898486 -0.947532 0.8489635 2.116179 -0.5438445 0.1199832 -2.75702 1.046651 0.1281464 -2.91334 -0.9498709 0.8485931 2.12426 -0.4487825 0.1151075 2.129447 -0.3577343 0.1119771 -2.925128 -0.9535134 0.8480162 -2.932696 -0.9581035 0.8472892 2.131235 -0.2063191 0.1108984 2.131235 0.2327162 0.1108984 -2.882021 0.9467074 0.8490911 1.478096 -1.089262 0.1477192 2.004676 0.01319849 0.1872645 1.47002 -1.093394 0.1206924 1.44702 -1.096896 0.09778028 0.01304328 -0.9625971 0.1538549 1.412598 -1.099236 0.08247083 -0.1545241 -0.972835 0.07360237 -2.932696 0.9580847 0.8472892 0.1145881 -1.089262 0.1477192 0.1800863 -1.099236 0.08247083 0.1456645 -1.096896 0.09778028 0.004841923 -0.9657609 0.1290555 0.1226646 -1.093394 0.1206924 2.131235 -0.118512 0.1108984 0.1145881 -1.010737 0.6614553 -0.0189591 -0.9686148 0.1066837 -2.925128 0.9534946 0.8480162 -0.05603045 -0.9708799 0.08892923 2.131235 -0.03070497 0.1108984 -0.102743 -0.972334 0.07753026 -2.91334 0.9498521 0.8485931 2.131235 0.05710208 0.1108984 -2.898486 0.9475132 0.8489635 3.028066 0.8954855 -0.03792351 2.131235 0.1449091 0.1108984 2.131235 0.3060099 0.1108984 3.183262 0.8234184 -0.2293319 -1.197556 -0.972835 0.07360237 2.094711 0.735705 0.1329374 3.076024 0.8732156 -0.05581891 -1.249337 -0.972334 0.0775302 -1.296049 -0.9708797 0.08892923 3.119288 0.8531255 -0.08748942 -1.333121 -0.9686148 0.1066837 2.004912 0.512106 0.1871216 3.153622 0.8371821 -0.129835 -1.356922 -0.9657607 0.1290555 2.129447 0.3841314 0.1119771 -1.510438 -1.043285 0.152332 2.12426 0.4751796 0.1151075 -1.60521 -1.052131 0.0891323 3.175666 0.8269457 -0.1787106 -1.517652 -1.04667 0.1281465 -1.538196 -1.04954 0.107643 3.183262 -0.7068113 -0.2293319 2.116179 0.5702416 0.1199832 -1.568943 -1.051458 0.09394311 3.028066 -0.7711411 -0.03792351 2.105997 0.6600126 0.126127 -1.510438 -0.9691484 0.6819384 3.175666 -0.7099598 -0.1787106 3.153622 -0.7190972 -0.129835 3.119288 -0.7333289 -0.08748942 3.076024 -0.7512621 -0.05581885 -2.669461 -1.052131 0.0891323 -2.764234 -1.043285 0.152332 -2.973302 -9.41753e-6 -1 1.980617 -9.41753e-6 -1 -2.705729 -1.051458 0.09394311 -2.736475 -1.04954 0.107643 -2.953132 -9.41753e-6 -0.02619224 -2.757019 -1.04667 0.1281465 2.18475 1.09766 0.1568908 2.285018 1.087611 0.1190578 2.219188 1.09705 0.07902616 2.177603 1.101686 -0.02619224 2.214959 1.097787 0.1421837 1.991688 -0.9996994 0.195102 2.251659 1.094109 0.1283358 2.2851 -1.079106 0.1190404 2.056912 -0.9268161 0.1557451 2.18475 -1.097679 0.1568908 2.008017 -0.9991908 0.1852484 2.024188 -0.9904466 0.1754904 2.177603 -1.101704 -0.02619224 2.219188 -1.097069 0.07902616 2.038618 -0.9743224 0.1667835 2.251701 -1.089866 0.1283271 2.049894 -0.9523969 0.1599797 2.056912 0.9532132 0.1557451 2.21497 -1.096664 0.1421814 2.423754 0.004063427 0.1195227 1.991688 1.026096 0.195102 2.049894 0.978794 0.1599797 2.318108 -9.41753e-6 0.1305581 2.038618 1.000719 0.1667835 2.390481 0.002026975 0.1250404 2.024188 1.016843 0.1754904 2.351812 5.36239e-4 0.1290797 3.31455 0.1106841 -1 2.008017 1.025587 0.1852484 3.314572 0.006041765 -1 3.271269 0.05600631 -1 3.318084 0.07749205 -1 3.318093 0.03919029 -1 3.160132 0.009715974 -0.03792351 3.160099 0.1148195 -0.03792357 3.117318 0.05814212 -0.02700412 3.163375 0.04299747 -0.03792351 3.163363 0.08146804 -0.03792351 3.207829 0.1136063 -0.05581891 1.110744 -0.7011463 0.7266641 3.207863 0.008540332 -0.05581891 3.211176 0.08026635 -0.05581891 1.16415 -0.8070434 0.6944387 3.211189 0.04180955 -0.05581891 1.114809 -0.7378597 0.724211 1.126386 -0.7708767 0.7172255 3.250884 0.1124723 -0.08748942 3.250916 0.007504105 -0.08748942 1.143712 -0.7951709 0.7067708 3.254307 0.07916581 -0.08748942 1.16415 0.8334405 0.6944387 1.110744 0.7275434 0.7266641 3.254319 0.04074478 -0.08748942 3.28505 0.1115425 -0.129835 1.143712 0.821568 0.7067708 3.285079 0.006700992 -0.129835 1.126386 0.7972738 0.7172255 1.114809 0.7642568 0.724211 3.288534 0.07828003 -0.129835 3.288545 0.03990536 -0.129835 3.306987 0.110925 -0.1787106 3.307012 0.006198525 -0.1787106 3.31051 0.07770282 -0.1787106 3.310519 0.03937023 -0.1787106 3.314548 0.1106951 -0.2293319 3.314571 0.006035447 -0.2293319 3.318083 0.0774967 -0.2293319 3.318092 0.03918862 -0.2293319 2.024267 -0.9996994 0.2490963 1.186032 -0.8070434 0.7307031 2.071805 -0.9743224 0.2217833 2.057189 -0.9904466 0.2301811 2.040808 -0.9991908 0.2395926 2.140055 0.6600126 0.1825703 2.083227 -0.9523969 0.2152211 2.090335 -0.9268161 0.2111369 2.128623 -0.7093079 0.1891389 2.140055 -0.6336155 0.1825703 2.150369 -0.5438445 0.1766447 2.128623 0.735705 0.1891389 2.165619 0.3060099 0.1678825 2.165619 0.1449091 0.1678825 2.165619 0.2327162 0.1678825 2.165619 -0.118512 0.1678825 2.165619 -0.03070497 0.1678825 2.165619 0.05710208 0.1678825 2.158554 -0.4487825 0.1719421 2.163809 -0.3577343 0.1689228 2.165619 -0.2796128 0.1678825 2.165619 -0.2063191 0.1678825 2.163809 0.3841314 0.1689228 2.158554 0.4751796 0.1719421 2.150369 0.5702416 0.1766447 1.132308 -0.7011463 0.762401 1.132925 -0.3907058 0.763424 1.133728 0.01319849 0.7647551 1.134531 0.4171029 0.7660862 1.151072 0.7972738 0.7581372 1.136337 -0.7378597 0.7598885 1.139324 0.7642568 0.7648388 1.147954 -0.7708767 0.7529693 1.135149 0.7275434 0.7671093 1.16539 -0.7951709 0.7426967 2.072036 1.000719 0.2221659 2.057507 1.016843 0.2307078 2.090402 0.9532132 0.2112478 2.083371 0.978794 0.2154605 2.024727 1.026096 0.2498581 2.041205 1.025587 0.2402498 1.189253 0.8334405 0.7360408 1.168605 0.821568 0.7480247 -1.510438 -1.027189 0.6180034 -1.510438 -1.016404 0.6885535 -2.764234 -1.079659 0.1574238 -2.757019 -1.082685 0.133188 -2.705729 -1.087112 0.09893411 -2.669461 -1.087838 0.09413063 -2.736475 -1.085302 0.1126492 -1.538196 -1.089576 0.1132473 -1.510438 -1.08413 0.1580497 -1.517652 -1.087105 0.1338067 -1.60521 -1.091633 0.09466195 -1.568943 -1.091166 0.09950155 -2.764234 1.078981 0.1573314 -2.75702 1.081979 0.1330918 -2.705729 1.086221 0.09881186 -2.669461 1.086817 0.09399032 -2.736476 1.084522 0.1125425 -1.568943 1.086221 0.0988118 -1.517652 1.081979 0.1330918 -1.510438 1.078981 0.1573314 -1.538196 1.084522 0.1125425 -1.60521 1.086817 0.09399026 -1.510438 1.013312 0.6881232 -1.197556 -1.093809 0.08903539 -1.249337 -1.093137 0.09294152 -0.102743 -1.097232 0.09346395 -0.05603045 -1.095987 0.1048896 -0.1545241 -1.097534 0.08951061 -0.0189591 -1.093921 0.1226693 -1.296049 -1.091559 0.1043246 -1.333121 -1.089227 0.1220706 -1.356922 -1.086371 0.1444421 0.004841923 -1.091235 0.1450626 0.01304328 -1.088193 0.1698775 -1.333121 1.083434 0.121334 -1.249337 1.087043 0.09216642 -1.197556 1.087529 0.08823668 -1.296049 1.085632 0.1035709 -0.1027429 1.087043 0.09216642 -0.01895898 1.083434 0.121334 -0.05603033 1.085632 0.1035709 0.004842042 1.080665 0.1437166 0.0130434 1.077595 0.168528 -0.154524 1.087529 0.08823668 0.1800863 -1.099315 0.08248299 0.1740083 -1.099254 0.08524012 0.1846752 -1.099329 0.08186328 1.44702 -1.098972 0.09809762 1.47002 -1.098458 0.1214665 1.412598 -1.099315 0.08248299 1.408009 -1.099329 0.08186328 0.1456645 -1.097586 0.09788578 0.1226646 -1.094655 0.1208853 0.1214846 -1.09416 0.1248503 1.477245 -1.096472 0.145904 0.1145881 -1.090762 0.1479483 0.1145881 -1.082432 0.2050161 1.478096 -1.096059 0.1487581 0.1145881 -1.051114 0.4611127 0.1145881 -1.050862 0.4631485 0.1145881 -1.020323 0.6629205 0.1145882 1.017189 0.6567842 0.1145882 1.016502 0.6623393 0.1145882 1.041637 0.4591771 0.1145882 1.041577 0.4596579 1.975589 -1.083111 0.1240998 1.976024 -1.083345 0.1231285 1.971282 -1.086217 0.1156266 1.970939 -1.086538 0.1150997 1.969327 -1.087176 0.1125002 1.966565 -1.088061 0.1080163 1.9637 -1.088869 0.1033499 1.5302 -1.094447 0.149657 1.533717 -1.096508 0.1348471 1.5302 -1.067921 0.3313902 1.725364 -1.098055 0.08691519 1.87544 -1.093876 0.08631008 1.929041 -1.091732 0.09055238 1.564733 -1.098892 0.1017017 1.568529 -1.098949 0.09912717 1.623183 -1.099214 0.08708304 1.59445 -1.099146 0.09016966 1.547958 -1.098159 0.1130089 1.534751 -1.096864 0.1304573 1.96966 1.084506 0.1126724 1.976024 1.084666 0.1233225 1.5302 1.080185 0.1475946 1.5302 1.057631 0.3299027 1.547958 1.084705 0.1110633 1.534751 1.082561 0.128389 1.568529 1.086406 0.09731358 1.59445 1.087498 0.08848565 1.963701 1.085715 0.102896 1.87544 1.087875 0.08544379 1.929041 1.087321 0.08991628 1.623184 1.087875 0.08544379 -2.723017 -1.0343 0.5250263 -2.722259 -1.033988 0.5275738 -2.602721 -1.019612 0.6472003 -2.423821 -1.01028 0.7271705 -2.230886 -1.006591 0.7527477 -2.212794 -1.006225 0.7551434 -1.605211 -1.006225 0.7551434 -1.568943 -1.006959 0.750341 -1.510438 -1.015869 0.6920552 -1.510438 -1.016404 0.6885551 -1.517652 -1.012178 0.716198 -1.538197 -1.00905 0.7366653 -2.764235 -1.051298 0.3865142 -2.764235 -1.079223 0.1609393 -2.764234 -1.079224 0.1609361 -2.723017 1.033504 0.5249173 -2.764235 1.078546 0.1608465 -2.764234 1.078546 0.1608433 -2.764235 1.050638 0.386424 -2.722259 1.033189 0.5274641 -2.602721 1.018396 0.6470322 -2.423821 1.008512 0.7269251 -2.212794 1.005041 0.7549797 -1.605211 1.005041 0.7549797 -1.568943 1.005637 0.7501582 -1.538197 1.007336 0.7364276 -1.510438 1.012877 0.6916385 -1.510438 1.013312 0.6881248 -1.517652 1.009878 0.7158782 -1.538197 1.049031 0.1111502 -1.605211 1.051622 0.09263944 -2.70573 1.050948 0.09745019 -2.757021 1.04616 0.1316537 -2.764234 1.042775 0.155836 -1.510438 0.9691293 0.6819399 -1.510438 1.042775 0.1558392 -1.568943 1.050948 0.09745019 -2.736477 1.049031 0.1111502 -1.517652 1.04616 0.1316537 -2.669462 1.051622 0.09263944 -1.538197 -1.049049 0.1111506 -1.510438 -1.042794 0.1558396 -1.510438 -0.9691482 0.68194 -2.764234 -1.042794 0.1558365 -2.757021 -1.046179 0.1316541 -2.70573 -1.050967 0.09745067 -1.605211 -1.05164 0.09263986 -1.517652 -1.046179 0.1316541 -2.736477 -1.049049 0.1111506 -2.669462 -1.05164 0.09263986 -1.568943 -1.050967 0.09745067 -1.365124 -1.029961 0.59987 -1.365124 -1.019428 0.6687716 -1.356922 -1.015649 0.6934925 -1.333121 -1.01224 0.7157936 -1.29605 -1.009535 0.7334918 -1.249337 -1.007798 0.7448547 -1.197556 -1.007199 0.7487701 0.01304334 -1.019429 0.6687702 0.01304334 -1.019428 0.6687716 0.004841923 -1.015649 0.6934925 -0.01895916 -1.01224 0.7157936 -0.05603045 -1.009535 0.7334917 -0.102743 -1.007798 0.7448547 -0.1545242 -1.007199 0.7487701 -1.365123 -1.083271 0.1692496 -1.356922 -1.086371 0.1444434 -1.356922 -1.086371 0.1444435 0.01304334 -1.056251 0.4278924 0.01304334 -1.088193 0.1698787 0.01304328 -1.088193 0.1698787 -1.365124 -1.08327 0.1692509 -1.365124 1.077595 0.1685283 -1.365124 1.077152 0.1721146 -1.333121 1.083434 0.1213341 -1.333121 1.083434 0.1213343 -1.356922 1.080665 0.1437169 0.01304346 1.077595 0.1685283 0.0130434 1.077595 0.1685283 0.01304346 1.015764 0.6683051 0.01304346 1.015764 0.6683056 0.004842042 1.012694 0.693117 -0.01895904 1.009925 0.7154997 -0.05603033 1.007727 0.7332627 -0.1027429 1.006317 0.7446673 -0.154524 1.00583 0.748597 -1.197556 1.00583 0.748597 -1.249337 1.006317 0.7446673 -1.29605 1.007727 0.7332627 -1.333121 1.009925 0.7154997 -1.365124 1.015764 0.6683052 -1.365124 1.015764 0.6683056 -1.356922 1.012694 0.693117 0.0130434 0.9625791 0.1538553 0.0130434 0.898852 0.6533903 -1.197556 0.8886139 0.7336428 -0.154524 0.8886139 0.7336428 -1.365123 0.898852 0.6533903 -1.365123 0.9625792 0.153855 -1.333121 0.9685969 0.106684 -1.356922 0.965743 0.1290556 -1.249337 0.889115 0.729715 -1.296049 0.8905693 0.718316 -1.333121 0.8928343 0.7005615 -1.356922 0.8956883 0.6781896 -0.1027429 0.889115 0.729715 -0.05603033 0.8905693 0.718316 -0.01895898 0.8928343 0.7005615 0.004842042 0.8956883 0.6781896 0.01304328 -0.9625969 0.1538562 -0.05603045 -0.9708797 0.08893054 0.004841923 -0.9657607 0.1290568 -1.356922 -0.9657605 0.1290567 -1.333121 -0.9686146 0.1066849 -1.249337 -0.9723338 0.07753151 -0.1545242 -0.9728348 0.07360368 -0.01895916 -0.9686146 0.1066849 -1.29605 -0.9708796 0.08893054 -1.197556 -0.9728348 0.07360363 -0.102743 -0.9723338 0.07753151 1.063103 -1.011079 0.7196974 0.9854729 -1.00775 0.740392 1.018728 -1.00885 0.7337617 0.4086558 -1.007427 0.7472807 0.9239788 -1.007205 0.7472468 0.9689974 -1.007504 0.7437225 0.1145882 -1.018223 0.6766566 0.1145882 -1.020323 0.6629208 0.1226646 -1.014091 0.7036833 0.1456646 -1.010589 0.7265955 0.1800864 -1.008249 0.7419049 0.2206898 -1.007427 0.7472807 1.224274 -1.025119 0.6278934 1.440448 -1.039954 0.4857095 1.4312 -1.039536 0.497036 1.402127 -1.037701 0.5200195 1.444068 -1.045421 0.4820864 1.452466 -1.047702 0.4720921 1.465167 -1.051523 0.4499347 1.455846 -1.048309 0.468022 1.465197 -1.051538 0.4498776 1.475182 -1.056084 0.4213596 1.472314 -1.053591 0.4360051 1.475185 -1.056092 0.4213486 1.478097 -1.094052 0.1625082 1.478097 -1.060455 0.3926971 1.478096 -1.094053 0.1625058 1.475191 -1.056105 0.4213155 1.475203 -1.056126 0.4212592 1.478097 -1.059937 0.3950884 1.478097 -1.058283 0.4064254 1.475228 -1.056175 0.4211353 1.47529 -1.056234 0.4208207 1.102477 -1.01391 0.7013717 1.0656 -1.011205 0.718906 1.478097 1.048351 0.4049085 1.470122 1.044142 0.4389308 1.472314 1.044672 0.434643 1.478097 1.04909 0.3989373 1.0656 1.009535 0.7186521 1.063863 1.009467 0.7192054 0.1145882 1.041637 0.4591771 1.46443 1.042764 0.4500655 1.463148 1.042617 0.4525986 1.454081 1.040693 0.4690334 1.455846 1.040957 0.4668994 0.2206898 1.087407 0.08921933 0.1800864 1.086739 0.09461879 1.371995 1.087407 0.08921933 1.412599 1.086739 0.09461879 0.1456646 1.084837 0.1099951 1.447021 1.084837 0.1099951 0.1226646 1.08199 0.1330074 0.1145882 1.078632 0.1601523 1.470021 1.08199 0.1330074 1.478097 1.078632 0.1601523 1.102477 1.011714 0.7010372 1.402127 1.034817 0.51958 1.4312 1.037771 0.4967674 1.018728 1.007688 0.7335852 0.9689974 1.006453 0.7435631 0.9239788 1.00602 0.7470669 0.1145882 1.014795 0.6761339 0.1145882 1.016502 0.6623395 0.1226646 1.011437 0.7032788 0.1456646 1.00859 0.7262911 0.1800864 1.006688 0.7416675 0.2206898 1.00602 0.7470669 0.1145882 1.041564 0.4596558 0.1145882 1.039464 0.4733902 0.1145882 1.010718 0.6614554 1.478096 -1.087163 0.1614527 0.1145882 -1.041582 0.4596558 0.1145882 -1.087163 0.1614552 1.447021 -1.094796 0.1115162 1.470021 -1.091294 0.1344284 0.1226646 -1.091294 0.1344284 0.1456646 -1.094796 0.1115162 0.2206898 -1.097958 0.09083086 0.1800864 -1.097136 0.09620678 1.412599 -1.097136 0.09620678 1.371995 -1.097958 0.0908308 0.1145882 -1.010737 0.6614556 0.1145882 -1.039483 0.4733918 1.612319 -1.052178 0.3830299 1.976024 -1.08288 0.1346874 1.973104 -1.082786 0.1297971 1.615446 -1.05247 0.3828607 1.625365 -1.053353 0.3812273 1.63526 -1.054193 0.3786057 1.651204 -1.055427 0.371496 1.644164 -1.054907 0.3752525 1.964806 -1.081415 0.1604058 1.931144 -1.078348 0.1887058 1.542183 -1.062228 0.3672838 1.536238 -1.063614 0.3595464 1.5302 -1.06626 0.3427758 1.5302 -1.067921 0.3313922 1.533271 -1.064282 0.355681 1.536119 -1.063656 0.3593931 1.5504 -1.061147 0.3727178 1.550424 -1.061143 0.3727337 1.550439 -1.061136 0.3727425 1.550441 -1.061135 0.3727441 1.556064 -1.060257 0.3764424 1.560126 -1.059849 0.3777918 1.560128 -1.059849 0.3777923 1.566378 -1.059207 0.3798661 1.573554 -1.058241 0.382214 1.574728 -1.058141 0.382326 1.576787 -1.058012 0.3825293 1.576795 -1.058011 0.3825299 1.579516 -1.057767 0.3827877 1.589035 -1.055993 0.3835566 1.592942 -1.055382 0.3838893 1.601438 -1.054318 0.3837352 1.601943 -1.054276 0.3837291 1.603037 -1.054088 0.383702 1.606475 -1.053657 0.3836394 1.607923 -1.053503 0.3835192 1.608485 -1.052804 0.3833799 1.611624 -1.052367 0.3831043 1.541123 1.05334 0.364582 1.538572 1.053754 0.361235 1.530201 1.056218 0.3413223 1.530201 1.05763 0.3299047 1.533272 1.054614 0.3542816 1.542183 1.053168 0.3659724 1.976025 1.084381 0.1349054 1.973105 1.084308 0.1300189 1.964806 1.083006 0.1606367 1.931145 1.080081 0.1889573 1.556064 1.05202 0.3752503 1.568641 1.05149 0.3795336 1.573554 1.051783 0.3812794 1.575431 1.051902 0.3814988 1.576961 1.051896 0.3816628 1.587268 1.052548 0.3828681 1.589029 1.052565 0.3830602 1.592943 1.052806 0.3835169 1.601427 1.053351 0.3835958 1.601697 1.053359 0.3835968 1.606475 1.053611 0.3836334 1.614195 1.054062 0.3831765 1.615342 1.054097 0.383104 1.615447 1.054103 0.3830978 1.625365 1.054732 0.3814275 1.635261 1.055415 0.3787832 1.651204 1.056679 0.3716779 1.644164 1.056086 0.3754237 1.973105 1.059429 0.1264163 1.530201 1.030531 0.3259806 1.530201 1.055203 0.1556012 1.963701 1.061656 0.1110362 1.87544 1.064176 0.09363621 1.929042 1.06353 0.09809535 1.534752 1.057976 0.136453 1.56853 1.062462 0.1054705 1.547959 1.060477 0.1191791 1.623184 1.064176 0.09363621 1.594451 1.063737 0.09666901 1.973104 -1.059448 0.1264176 1.5302 -1.03055 0.3259806 1.5302 -1.055222 0.1556034 1.534751 -1.057995 0.1364551 1.56853 -1.062481 0.1054726 1.623184 -1.064195 0.09363836 1.59445 -1.063755 0.09667116 1.929042 -1.063549 0.0980975 1.963701 -1.061675 0.1110383 1.547959 -1.060496 0.1191812 1.87544 -1.064195 0.09363836 -2.948904 -0.8779322 0.1687357 -2.949446 -0.8676071 0.1437353 -2.937608 -0.8707969 0.6895964 -2.937982 -0.8779322 0.6723197 -2.949935 -0.8376427 0.1211822 -2.950659 -0.1387258 0.0878328 -2.950659 -0.6669735 0.0878328 -2.950573 -0.7321633 0.09179246 -2.950324 -0.7909719 0.1032838 -2.950707 0.6461491 0.0878328 -2.949519 0.8467827 0.1437353 -2.948987 0.8571078 0.1687357 -2.93828 0.8571078 0.6723197 -2.937932 0.8503538 0.6886731 -2.950623 0.7113389 0.09179246 -2.950379 0.7701475 0.1032838 -2.949998 0.8168182 0.1211822 -2.937638 -0.8676071 0.6973201 -2.950707 -0.1356471 0.0878328 -2.93769 -0.863941 0.7000795 -2.937946 0.8204306 0.7171543 -2.937883 0.8467827 0.6973201 -2.937287 -0.8376427 0.7198732 -2.936931 -0.7909719 0.7377715 -2.936713 -0.7321633 0.7492629 -2.936654 -0.6669735 0.7532226 -2.950773 0.04591351 0.0878328 -2.937131 0.6461491 0.7532226 -2.937498 0.7701475 0.7377715 -2.937888 0.8168182 0.7198732 -2.937237 0.7113389 0.7492629
+
+
+
+
+
+
+
+
+
+ 1.28299e-7 0.1564343 0.9876884 0.3829196 -0.9237817 9.65815e-7 0 0 1 0 0 -1 0.5140661 -0.003849029 0.8577418 0.2377495 0 0.9713265 0.003961801 -0.9908785 0.1347 -0.003599762 -0.9924178 0.1228573 -3.93844e-7 -0.9885164 0.1511131 0.02812397 -0.9891253 0.1443615 -0.07466703 -0.9971513 0.01068747 0.8555622 -0.07415413 -0.5123616 0 -0.9997584 0.02198189 0.01378422 -0.9923298 0.1228474 0.1416208 -0.9395942 0.3116188 0.105782 -0.1390557 -0.9846186 -0.06680536 -0.1429797 -0.9874684 -0.9822846 -0.04168653 -0.1826997 -0.003930687 -0.9895082 0.1444232 0.05062836 -0.9821941 0.1809186 -1 0 0 0.00615704 -0.989497 0.1444233 4.89298e-7 -0.9885165 0.1511132 -1 0 0 -0.9590317 -0.04281431 -0.2800449 0.9590336 -0.04265236 -0.2800632 -0.001389443 -0.9955319 0.09441554 -0.003607749 -0.9924168 0.1228654 0.4092595 -0.904236 -0.1219177 -4.55513e-7 0.9924336 0.1227824 -3.52058e-7 0.9924337 0.1227818 0 0.9924337 0.1227815 4.89959e-7 0.9924335 0.122783 6.66573e-7 0.9924337 0.1227818 -0.9997856 0 0.02070826 0.9834544 0.1811559 -1.68541e-7 0.2134888 0.02775388 0.9765512 0.3491049 -0.06057554 0.9351237 0 0.4539912 0.8910061 0 0.7071068 0.7071068 0 0.8910061 0.4539912 0 0.9876884 0.156434 -0.9997649 -1.482e-6 0.02168542 -0.9998995 0.01147192 0.008334815 0 -0.4539912 0.8910062 0 -0.7071068 0.7071068 0 -0.8910062 0.4539912 0 -0.9876901 0.1564236 0.2092148 -0.03538417 0.9772292 -0.007750332 0 0.99997 -0.02493202 0 0.9996892 -0.04888266 0 0.9988045 -0.09562033 0 0.9954179 -0.295215 0 0.9554309 1.22468e-7 -0.1564343 0.9876884 0.3745899 0.06335377 0.9250237 0.7943099 0.1411293 0.5908929 0.9115629 0.1651028 0.3765556 0.9747494 0.1787728 0.1338055 0 0 -1 0 0 -1 0.9729376 -0.1792187 0.1458527 0.8992195 -0.1649203 0.405223 0.7694057 -0.1393553 0.6233739 0.587687 -0.1044177 0.8023222 0.6192687 0.1074535 0.7777917 0.9834544 -0.181156 0 0 0.9992547 -0.03860408 -0.9997856 0 0.02070826 0 0 -1 -0.01022124 0.9998714 -0.0123552 0.1888458 -0.9818247 0.01890653 0 0 -1 0 0 -1 0 0 -1 0.2238411 -0.02181106 0.9743816 0.2307144 7.18687e-5 0.9730215 0.220341 0.02156108 0.9751846 0.04371863 0.006476819 0.9990229 0.1042783 -0.01026022 0.9944953 0.164839 -0.02153974 0.9860853 0.4374054 0.03158128 0.8987097 0.3557447 0.03321528 0.9339928 0.2735826 0.0318759 0.9613202 0.9944077 -0.105609 6.69153e-7 1 2.1783e-4 1.5455e-6 0.9943778 0.1058903 9.39773e-7 0.9836236 -0.1039952 0.147206 0.9889933 2.39901e-4 0.1479606 0.9837008 0.1043184 0.1464597 0.9078767 -0.09476464 0.4083867 0.9120517 2.49367e-4 0.410075 0.9086287 0.0951789 0.4066138 0.7751027 -0.07935523 0.6268322 0.7777218 2.36453e-4 0.6286087 0.7766351 0.07983291 0.6248717 0.5906022 -0.05903851 0.8048003 0.5918636 1.90818e-4 0.8060382 0.5925124 0.05948084 0.8033623 0.3501167 -0.03411543 0.9360846 0.3505304 1.09006e-4 0.9365514 0.3516238 0.03440719 0.9355089 0.4211706 0.9069814 4.39738e-7 -0.8390961 -0.1989107 0.5063123 0.5166355 0 0.8562055 -0.8390976 0.1989104 0.5063103 0.1673761 -0.9807069 -0.1009913 0.8562055 0 -0.5166355 0.856206 0 -0.5166347 0.5166641 -6.93513e-5 0.8561881 0.8562065 0 -0.5166338 0.5166352 0 0.8562057 0.8562059 1.23048e-7 -0.5166348 -0.8562055 0 0.5166354 -0.8562055 0 0.5166354 0.5166349 0 0.8562058 0.5166347 -1.83704e-7 0.856206 0.5166346 -3.83471e-7 0.856206 0.5166342 1.14384e-6 0.8562061 0.516635 2.05906e-7 0.8562058 0.5166351 0 0.8562057 0.5166351 0 0.8562057 0.5166351 0 0.8562057 0.5166352 0 0.8562057 0.5166351 0 0.8562057 0.516635 -1.67873e-7 0.8562058 0.5166342 -1.1205e-6 0.8562062 0.5166346 3.60914e-7 0.856206 0.5166347 1.50731e-7 0.8562059 0.5166349 0 0.8562058 -0.8558999 -0.0267167 0.5164509 -0.854317 -0.066401 0.5154935 -0.852018 -0.09879189 0.5141066 -0.8487915 -0.1313217 0.5121597 -0.8435101 -0.1715734 0.5089728 -0.8562055 0 0.5166354 -0.8562055 0 0.5166354 -0.8562055 0 0.5166355 -0.8562055 0 0.5166354 -0.8562055 0 0.5166354 -0.8435101 0.1715734 0.5089728 -0.8487915 0.1313218 0.5121597 -0.8520181 0.09879171 0.5141063 -0.8543158 0.06640237 0.5154951 -0.8558998 0.02671682 0.516451 0.5166352 -1.13304e-6 0.8562057 -0.8153717 -0.3051341 0.4919981 -0.7339802 -0.5149058 0.4428828 -0.5919013 -0.7225614 0.3571525 -0.3597159 -0.9074648 0.2170535 -0.0228213 -0.9996447 0.01377046 -0.8153738 0.3051303 0.491997 -0.7339826 0.5148985 0.4428872 -0.5918965 0.7225662 0.3571507 -0.3597147 0.9074655 0.2170526 -0.02282142 0.9996447 0.01377046 0.849134 -0.1282592 -0.5123681 0.7923387 -0.3789756 -0.478097 0.6578757 -0.6400159 -0.3969625 0.3812999 -0.8953632 -0.2300764 0.8491344 0.128259 -0.5123676 0.792338 0.3789769 -0.4780973 0.6578767 0.6400147 -0.3969625 0.3812991 0.8953635 -0.2300761 0.1673764 0.9807069 -0.1009914 1.49939e-6 0.990346 0.1386173 0 -0.1386325 0.9903439 -1 0 0 1 0 0 0.1327531 -0.1374056 0.9815784 0.4103071 -0.1264256 0.9031416 0.7098321 -0.09764897 0.6975695 0.9590318 -0.03927439 0.2805631 -0.1327536 -0.1374058 0.9815784 -0.4103077 -0.1264259 0.9031412 -0.7098315 -0.09764903 0.6975699 -0.9590318 -0.03927445 0.2805627 -0.9596277 0.03899407 -0.2785573 0 -0.9903432 0.1386371 0 0.1386328 0.9903439 -1 0 0 1 0 0 0.1327543 0.1374056 0.9815784 0.4103088 0.1264264 0.9031406 0.7098321 0.09764945 0.6975693 0.9590293 0.0392757 0.2805714 -0.1327541 0.1374052 0.9815784 -0.4103068 0.1264262 0.9031417 -0.7098296 0.09764909 0.6975719 -0.9590318 0.03927421 0.2805627 -0.9596205 -0.03899747 -0.2785815 -1 0 0 0 0.9919607 0.1265473 0 0.1414213 -0.9899495 1 0 0 0.0762465 -0.1261793 0.9890729 0.2388806 -0.1228839 0.9632422 0.4347843 -0.1139605 0.8932948 0.7212317 -0.08765834 0.6871251 0.9502034 -0.04030364 0.3090133 0.0762369 0.1411648 -0.9870463 0.238874 0.1368583 -0.9613579 0.434709 0.1274774 -0.891503 0.6876775 0.1025022 -0.718744 0.9501727 0.0441839 -0.3085765 -0.07624673 -0.1261793 0.9890729 -0.2388807 -0.1228839 0.9632422 -0.4347845 -0.1139605 0.8932947 -0.68782 -0.09185862 0.7200456 -0.9501786 -0.03944557 0.3091998 -0.07623803 0.1410098 -0.9870684 -0.2388557 0.1373279 -0.9612955 -0.4347452 0.1273575 -0.8915024 -0.6877804 0.1026604 -0.718623 -0.9501681 0.04408633 -0.3086046 0 -0.1265476 0.9919605 -1 0 0 0 -0.9905139 0.1374123 0.07624703 0.1261794 0.9890729 0.2388802 0.1228842 0.9632423 0.4347845 0.1139607 0.8932947 0.6878178 0.09185886 0.7200476 0.937608 0.04399979 0.3448987 -0.07624661 0.1261791 0.9890729 -0.2388801 0.122884 0.9632424 -0.434785 0.1139605 0.8932945 -0.6878192 0.0918585 0.7200464 -0.9501789 0.03944557 0.3091992 0 0.1265476 0.9919606 0 0.9885122 0.1511415 1 0 0 -0.8659821 0.4943337 0.07555979 1 0 0 0.9694766 0.03704696 -0.2423691 -1.70872e-7 -0.9885195 0.1510933 1 0 0 -1 0 0 -0.4498214 -0.8828647 0.1349464 1 0 0 0.1327541 0.1497286 0.9797742 0.4103076 0.1378051 0.9014752 0.7098324 0.1064242 0.6962843 0.9590314 0.04280513 0.2800475 0.9569033 -0.04388016 -0.2870724 -0.1327524 0.1497287 0.9797745 -0.4103068 0.1377906 0.9014778 -0.7098332 0.1064263 0.6962831 -0.9590305 0.04280543 0.28005 -0.08376187 -0.1428076 0.9861997 -0.3529857 -0.1340861 0.9259709 -0.8555584 -0.074193 0.5123624 -0.9162806 0.05740129 -0.3964025 -1.74027e-7 0.9896777 0.1433106 0.9730032 0.03307503 -0.2284097 0 -0.143311 0.9896777 0.1060479 -0.1425029 0.984097 0.3245264 -0.1355546 0.936113 0.5585379 -0.1188735 0.8209169 0.7974308 -0.08647555 0.5971818 0.9734342 -0.03281342 0.2266032 1 0 0 -0.08376312 0.142807 0.9861997 -0.352986 0.1340857 0.9259707 -0.8555646 0.07418799 0.5123528 -0.9162762 -0.05740278 -0.3964126 -6.59532e-7 -0.9896787 0.1433048 0.9730031 -0.03307497 -0.2284097 0 0.143311 0.9896777 0.1060511 0.1425033 0.9840966 0.3245232 0.1355549 0.9361141 0.5585379 0.1188735 0.8209169 0.7974311 0.08647537 0.5971816 0.9734345 0.03281331 0.2266021 1 0 0 1.29535e-7 0.9903439 0.1386327 0 -0.1386331 0.9903438 0 0.1386328 -0.9903439 -1 0 0 0.1327539 0.1374058 -0.9815783 0.4103075 0.1264259 -0.9031413 0.7098326 0.09764879 -0.697569 0.959031 0.03927487 -0.2805655 1 0 0 0.1327533 -0.1374061 0.9815784 0.4103074 -0.1264261 0.9031413 0.7098323 -0.09764909 0.6975693 0.9586545 -0.03945112 0.2818244 -0.1327535 -0.1374061 0.9815784 -0.4103076 -0.1264261 0.9031413 -0.7098324 -0.09764879 0.6975691 -0.9590318 -0.03927439 0.2805629 -0.1327534 0.1374058 -0.9815784 -0.4103074 0.1264259 -0.9031413 -0.7098327 0.09764885 -0.6975688 -0.9590319 0.03927439 -0.2805625 0 -0.9903439 0.1386327 0 0.1386331 0.9903438 0 -0.138633 -0.9903438 -1 0 0 0.1327542 -0.1374056 -0.9815783 0.4103075 -0.1264259 -0.9031413 0.7098329 -0.09764909 -0.6975686 0.9590212 -0.03927952 -0.2805982 1 0 0 0.1327537 0.1374062 0.9815783 0.4103065 0.1264262 0.9031417 0.7098318 0.09764903 0.6975697 0.9592812 0.03915715 0.2797254 -0.1327543 0.1374061 0.9815782 -0.4103056 0.1264262 0.9031422 -0.7098324 0.09764885 0.6975692 -0.9590319 0.03927445 0.2805625 -0.1327551 -0.1374058 -0.9815782 -0.4103061 -0.1264264 -0.9031419 -0.7098332 -0.09764915 -0.6975684 -0.9590319 -0.03927445 -0.2805628 -1 0 0 0.001162707 0.9937691 0.1114523 0 0.1265474 -0.9919605 1 0 0 0.398109 -0.1160864 0.9099633 0.687821 -0.0918582 0.7200447 0.9501788 -0.03944551 0.3091998 0.0762465 0.126179 -0.989073 0.2388814 0.1228837 -0.9632421 0.4347844 0.1139602 -0.8932948 0.6878224 0.09185814 -0.7200435 0.9501785 0.03944557 -0.3092004 -0.9666289 -0.03241902 0.2541214 -0.07624655 0.126179 -0.989073 -0.2388809 0.1228836 -0.9632421 -0.4347849 0.1139602 -0.8932946 -0.687821 0.09185814 -0.7200446 -0.9501785 0.03944551 -0.3092004 -1 0 0 0 -0.9919607 0.1265472 0 -0.1265476 -0.9919605 1 0 0 0.07624769 0.1260033 0.9890953 0.2388811 0.1225224 0.9632881 0.434789 0.1138519 0.8933064 0.6878211 0.09178596 0.7200538 0.9618136 0.03463667 0.2715051 0.07624602 -0.1261788 -0.989073 0.23888 -0.1228834 -0.9632425 0.4347848 -0.1139601 -0.8932946 0.687819 -0.09185862 -0.7200466 0.9501788 -0.03944557 -0.3091995 -0.07624638 0.1260371 0.989091 -0.2388793 0.1225532 0.9632847 -0.4347912 0.1137776 0.8933147 -0.687817 0.0925576 0.719959 -0.9268108 0.047522 0.3725095 -0.07624781 -0.1261792 -0.9890728 -0.2388795 -0.1228842 -0.9632424 -0.4347839 -0.1139602 -0.8932951 -0.687821 -0.0918582 -0.7200448 -0.9501788 -0.03944545 -0.3091995 0 0.126405 0.9919787 0 0.988519 0.1510968 1 0 0 0 0.1510966 -0.988519 -1 0 0 1 0 0 -3.42343e-7 0.988519 0.1510965 0 0.988519 0.1510971 0 0.988519 0.1510968 0 0.9885189 0.1510974 9.62153e-7 0.9885192 0.151095 -0.07815128 0.1506344 -0.9854957 -0.1980832 0.1481027 -0.9689317 -0.3055467 0.1438707 -0.9412451 -0.4335421 0.136158 -0.8907874 -0.6203913 0.118504 -0.775288 -0.7727463 0.09590339 -0.6274279 -0.8917247 0.06838291 -0.4473821 -0.9818629 0.02864676 -0.1874157 -0.5209213 0.1289762 -0.8438046 0.1327538 -0.1497591 0.9797697 0.4103077 -0.1377921 0.9014771 0.709832 -0.106428 0.6962842 0.9590315 -0.04280561 0.2800468 0.1327525 0.1497593 -0.9797698 0.4103088 0.1377922 -0.9014766 0.7098315 0.1064281 -0.6962847 0.9590317 0.04280549 -0.2800464 -0.132754 -0.1497594 0.9797697 -0.4103066 -0.1377923 0.9014775 -0.709833 -0.1064279 0.6962832 -0.959031 -0.04280591 0.2800487 0 -0.1510966 0.988519 -2.00293e-6 -0.98852 0.1510893 1 0 0 0 -0.1510965 -0.988519 -1 0 0 1 0 0 3.19521e-7 -0.9885189 0.1510971 -7.08163e-7 -0.988519 0.1510969 -8.63061e-7 -0.9885191 0.1510966 -1.19828e-6 -0.9885196 0.1510926 -2.52611e-6 -0.9885191 0.1510957 -0.07815074 -0.1506344 -0.9854957 -0.1980815 -0.1481032 -0.968932 -0.3055586 -0.1438701 -0.9412413 -0.4335411 -0.1361582 -0.8907878 -0.6203916 -0.1185042 -0.7752878 -0.7727459 -0.09590381 -0.6274283 -0.8917252 -0.0651552 -0.4478628 -0.9818573 -0.02937602 -0.1873319 -0.5209214 -0.1289763 -0.8438045 0.1327536 0.1497594 0.9797697 0.4103079 0.1377923 0.901477 0.7098321 0.1064282 0.6962841 0.9590315 0.04280561 0.2800468 0.132752 -0.1497597 -0.9797698 0.4103077 -0.1377919 -0.9014771 0.7098327 -0.106428 -0.6962834 0.9590316 -0.04280543 -0.2800466 -0.1327546 0.1497592 0.9797696 -0.4103075 0.1377923 0.9014772 -0.7098323 0.1064281 0.6962838 -0.9590308 0.04280596 0.2800492 0 0.1510966 0.988519 2.69593e-5 0.143312 -0.9896775 -0.5496515 0.1197214 -0.8267709 -0.08376175 -0.1428074 0.9861997 -0.3529865 -0.1340855 0.9259706 -0.8555632 -0.07419186 0.5123545 -0.916279 0.05740195 -0.3964063 -0.6454703 0.1094591 -0.7559014 -0.06680613 0.1429911 -0.9874667 -0.1730866 0.141148 -0.9747401 -0.2645841 0.1382039 -0.9544081 -0.3586691 0.1337758 -0.9238292 -0.4742428 0.1261703 -0.8713063 -4.0649e-6 0.9896773 0.1433135 0.1060564 0.1425032 -0.984096 0.3245222 0.135555 -0.9361144 0.5585399 0.1188735 -0.8209156 0.7974302 0.08647561 -0.5971828 0.973434 0.0328136 -0.2266042 0 -0.1433112 0.9896777 0.1060479 -0.142503 0.9840969 0.3245266 -0.1355546 0.9361129 0.5585377 -0.1188737 0.8209171 0.7974312 -0.08647537 0.5971812 0.9734343 -0.03281348 0.2266033 1 0 0 -4.36686e-6 -0.1433116 -0.9896776 -0.5496515 -0.1197216 -0.8267709 -0.08376169 0.1428077 0.9861998 -0.3529853 0.1340857 0.925971 -0.8555635 0.07419091 0.5123542 -0.916279 -0.05740201 -0.3964061 -0.6454708 -0.1094591 -0.7559009 -0.06683152 -0.1428063 -0.9874917 -0.1730844 -0.1411481 -0.9747405 -0.2645813 -0.138204 -0.954409 -0.3586757 -0.1337754 -0.9238268 -0.4742418 -0.1261706 -0.8713068 0 -0.9896777 0.1433109 0.1060448 -0.1425033 -0.9840972 0.3245227 -0.1355552 -0.9361142 0.5585367 -0.1188738 -0.8209176 0.7974299 -0.08647549 -0.5971831 0.9734342 -0.03281342 -0.2266036 0 0.1433113 0.9896777 0.1060493 0.1425032 0.9840967 0.3245244 0.1355553 0.9361135 0.558537 0.1188742 0.8209174 0.7974313 0.08647531 0.5971812 0.9734342 0.03281342 0.2266033 1 0 0 0 1 0 0 0 -1 -1 0 0 0 -1 0 0 -0.06062865 0.9981604 0 -0.1917768 0.9814385 0 -0.3580724 0.9336938 0 -0.6013617 0.798977 0 -0.9242766 0.3817234 0 -0.06062865 -0.9981604 0 -0.1917768 -0.9814386 0 -0.3580729 -0.9336936 0 -0.6013618 -0.7989769 0 -0.9242763 -0.3817241 0 0.06062865 0.9981604 0 0.1917768 0.9814386 0 0.3580724 0.9336938 0 0.6013616 0.798977 0 0.9242766 0.3817234 0 0.06062865 -0.9981604 0 0.1917768 -0.9814386 0 0.3580729 -0.9336937 0 0.6013626 -0.7989764 0 0.9242762 -0.3817244 0 0 1 0 0.1564341 0.9876884 1.49607e-7 0.1564345 0.9876883 0 0.156434 0.9876884 0 0.156434 0.9876884 1.77729e-7 0.1564344 0.9876883 0.3829144 -0.9237839 -8.46004e-7 0.3829168 -0.9237829 3.92439e-7 0.3829165 -0.923783 2.35166e-7 0.3488978 -0.9233667 -0.1602008 0.3168434 -0.9465008 -0.06120747 0.357534 -0.9272465 -0.1112812 0.2814555 -0.9595743 0 0 0 1 0 0 -1 0.5910155 3.60782e-5 0.8066602 0.5334312 0 0.8458435 0.5910155 -3.60782e-5 0.8066602 0.5530308 -0.003845453 0.8331519 0.591039 -2.00849e-5 0.8066431 0.5910465 -1.20471e-5 0.8066375 0.5910497 -7.08237e-6 0.8066351 0.4981765 -5.84893e-7 0.8670756 0.4981766 -3.51471e-7 0.8670755 0.498177 3.46272e-7 0.8670754 0.4981769 0 0.8670753 0.591039 2.00504e-5 0.806643 0.5910498 7.03584e-6 0.8066351 0.5910465 1.20471e-5 0.8066375 0.5036222 -0.003850519 0.8639153 0.5036219 -0.003849804 0.8639156 0.4970951 0.01547449 0.8675581 0.4890671 0.02937078 0.8717516 0.5530301 -0.003845214 0.8331524 0.5140668 -0.003848791 0.8577416 0.4981766 -5.33665e-7 0.8670756 0.5036184 -0.003840267 0.8639177 0.4964051 0.03608816 0.8673406 0.5013225 -0.002460777 0.865257 0.5690273 -0.04453855 0.8211116 0.5530484 0.07500028 0.8297665 0.5279484 0.01989871 0.8490433 0.5352562 0.01132893 0.8446138 0.5091019 -0.009159147 0.8606575 0.5105705 -0.007156133 0.859806 0.5449009 0.002421021 0.8384969 0.5124801 -0.005179643 0.8586835 0.4981769 0 0.8670754 0.3090363 -0.01473265 0.9509361 0.3126026 0.01519411 0.9497625 0.2229179 -0.007814884 0.9748059 0.5036198 -0.003846645 0.8639168 0.5036223 -0.003849446 0.8639155 0.4981786 1.55731e-6 0.8670744 0.4981766 0 0.8670756 0.4995282 -2.78948e-4 0.8662976 0.4981766 0 0.8670756 0.4981766 0 0.8670756 0.4981775 1.66352e-7 0.867075 0.4981776 -1.71668e-7 0.8670751 0.1489015 -0.03606444 0.9881942 0.1565958 0.03534442 0.9870302 0.1944606 0.0212965 0.9806791 0.1903578 -0.02155977 0.981478 0.2377495 0 0.9713265 0.2377495 0 0.9713265 0.2242609 0.007779657 0.9744981 0.2377495 0 0.9713265 0.2377495 0 0.9713265 0.2377495 0 0.9713265 0.2377495 0 0.9713265 0.0100004 -0.9923699 0.1228899 -0.003930866 -0.9895083 0.1444224 -0.003930032 -0.9895085 0.1444218 4.35955e-4 -0.9893907 0.1452787 -3.57408e-4 -0.9893742 0.1453909 -0.003618955 -0.9924196 0.1228423 -0.003374636 -0.9923571 0.1233532 2.52564e-7 -0.9885166 0.1511126 -3.53429e-7 -0.9885163 0.1511143 0.01571273 -0.9883959 0.1510846 -1.33578e-6 -0.9885182 0.1511012 6.04553e-7 -0.9885165 0.151113 5.85752e-7 -0.9885162 0.151115 -2.59807e-7 -0.9885171 0.1511092 -2.55684e-7 -0.9885168 0.1511111 2.9402e-7 -0.988516 0.1511164 3.5568e-7 -0.9885153 0.1511209 -2.55291e-7 -0.9885168 0.1511113 -4.06831e-7 -0.9885181 0.1511026 0 -0.988516 0.1511163 0 -0.9885175 0.151107 0 -0.9885167 0.1511116 0 -0.9885172 0.1511083 0 -0.9885175 0.1511066 -6.27648e-7 -0.9885156 0.1511192 0 -0.9885174 0.1511066 0 -0.9885171 0.151109 0 -0.9885156 0.1511186 0 -0.9885164 0.1511138 -3.17419e-7 -0.9885165 0.1511132 -1.56516e-7 -0.9885171 0.1511088 0 -0.9885161 0.1511157 -1.82849e-7 -0.9885159 0.1511171 -0.44986 -0.8828433 0.134958 -3.19965e-7 -0.9885164 0.1511136 -2.98208e-7 -0.9885164 0.1511133 0.001193761 -0.9852197 0.1712911 0 -0.9885171 0.1511088 0.01290762 -0.9964026 0.08375662 -0.07331889 -0.9970006 0.0247811 -0.409283 -0.9116678 0.03673261 -0.07247549 -0.997063 0.02475196 -0.09530556 -0.9945982 -0.04112559 -0.09531068 -0.9945974 -0.04113358 -0.09534078 -0.9945923 -0.0411846 -0.09530395 -0.9945985 -0.04112201 -0.09529757 -0.9945995 -0.04111129 -0.09529644 -0.9946 -0.04110318 -0.07491624 -0.9963819 0.04013055 -0.09530013 -0.9945991 -0.04111468 -0.07332742 -0.9969999 0.02478271 -0.07339805 -0.9970867 0.02076339 -0.09530836 -0.9945978 -0.04112964 -0.09528034 -0.9946025 -0.04108071 0.8555551 -0.07398658 -0.5123977 0.8555477 -0.07394784 -0.5124158 -0.3536596 -0.9353742 0 -0.003600239 -0.9924173 0.122861 -0.003600656 -0.9924179 0.1228563 -0.003600716 -0.9924179 0.1228568 0.001582026 -0.9956384 0.09328246 -0.003600239 -0.9924178 0.1228573 -0.00360006 -0.9924182 0.1228543 -0.00360018 -0.9924177 0.1228581 -0.003600299 -0.9924174 0.1228607 -0.003600418 -0.9924181 0.1228554 -0.003600418 -0.992419 0.122848 -0.003600299 -0.9924178 0.1228576 -0.003600299 -0.9924178 0.1228578 0.001091122 -0.9926117 0.12133 5.20564e-4 -0.9897851 0.1425665 -0.003600656 -0.9924181 0.1228551 -0.01517814 -0.9998192 -0.01145625 -0.003600001 -0.9924176 0.1228597 -0.003600656 -0.9924181 0.122855 -0.003600001 -0.9924176 0.122859 -0.002684652 -0.9928706 0.119166 -0.005756914 -0.999769 -0.02070569 -0.002899706 -0.9935055 0.1137467 -0.002881944 -0.9944094 0.1055541 -0.003600358 -0.9924177 0.1228585 -0.003599405 -0.9924179 0.1228566 0 -0.9997584 0.02198189 0.02812445 -0.9891245 0.1443669 0.01143729 -0.9968958 0.07789731 -3.53668e-7 -0.9997584 0.02197939 -0.003601253 -0.9924176 0.1228594 -0.003600299 -0.9924178 0.1228577 0 -0.9997583 0.02198821 -0.001252293 -0.9980221 0.0628525 0.01290243 -0.9964007 0.083781 0.01290637 -0.9964029 0.08375322 0.005616545 -0.9998489 0.01645493 0 -0.9997584 0.02198165 2.13494e-7 -0.9997584 0.02198064 -7.0186e-7 -0.9997579 0.02200233 1.18808e-6 -0.9997598 0.02191585 0 -0.9954955 0.09480905 0.02362459 -0.9952012 0.09495496 0.03948813 -0.9901533 0.1343026 0.01334404 -0.9894279 0.1444109 0.02812391 -0.9891247 0.1443659 0.02812451 -0.9891242 0.1443685 0.1361107 -0.9803081 0.1430734 0.02812153 -0.9891249 0.1443648 0.02812552 -0.9891242 0.1443682 0.05678015 -0.9757789 0.2112618 0.02852123 -0.9890536 0.1447737 0.02863502 -0.9890258 0.1449405 0.06748914 -0.9750902 0.2112923 0.03284865 -0.9878719 0.1517564 0.9818748 0.0300278 0.1871368 0.9818617 0.02931493 0.1873187 0.02727788 -0.9891486 0.1443644 0.03076434 -0.9882106 0.1499782 0.05515164 -0.9779517 0.201417 0.9817717 0.04107928 0.1855714 0.9818575 0.02404534 0.1880892 0.1396538 -0.9354135 0.3248054 0.04559844 -0.9845437 0.169099 0.08177131 -0.9731702 0.2150657 0.06420546 -0.9765985 0.2052634 0.0469954 -0.9831653 0.176571 0.03340417 -0.9878291 0.1519141 0.04101479 -0.9843345 0.1714743 0.55846 -0.1170695 -0.8212291 0.1627213 -0.890488 0.4249151 -0.322228 0.09285008 0.9420977 0.04292666 -0.9847198 0.1687722 0.7727455 0.09589362 0.6274304 0.09792709 -0.9692027 0.2259563 0.06766378 -0.9747546 0.2127797 0.0446341 -0.9846721 0.1686075 0.06420218 -0.9765999 0.2052575 0.0439704 -0.9840963 0.1721078 0.3617864 -0.6363174 0.6813302 0.06679672 0.1430067 0.987465 0.2748829 -0.7998392 0.5335698 0.1230934 -0.9479891 0.2935386 0.1463069 -0.9305436 0.3356826 0.2583664 -0.8185351 0.5130761 -7.58645e-5 0.1436617 0.9896269 0.1246216 -0.9510692 0.282731 0.1242306 -0.9512161 0.2824085 -0.003930389 -0.9895082 0.1444233 -0.003930985 -0.9895083 0.1444227 -0.00397104 -0.9895075 0.1444268 0.02812594 -0.9891238 0.1443709 0.1245899 -0.9503824 0.2850449 0.02828741 -0.9890697 0.1447102 -0.00360018 -0.9924178 0.1228579 -0.003600776 -0.9924177 0.1228581 -0.003598988 -0.9924178 0.1228577 -0.003600597 -0.9924177 0.1228581 -0.08324116 -0.9889816 0.1224185 -0.00360012 -0.9924178 0.1228578 -0.003599524 -0.9924178 0.1228575 0 -0.9990649 -0.04323512 0 -0.9990649 -0.04323512 1.56094e-6 0.9924338 0.1227803 1.54965e-6 0.9924338 0.1227815 1.11644e-6 0.9924337 0.1227812 0.04029113 0.9916267 0.122691 2.08744e-6 0.9924339 0.1227802 -8.10108e-6 0.9924354 0.1227682 -1.8947e-6 0.992434 0.1227794 2.39894e-6 0.9924334 0.1227844 0.01009857 0.9997878 0.01795297 0.01052701 0.9998538 0.01347464 -3.31426e-6 0.9924289 0.1228201 -6.39021e-7 0.9924339 0.1227799 -3.88653e-7 0.9924336 0.1227827 -3.20002e-7 0.9924333 0.1227851 -6.4793e-7 0.9924339 0.12278 -1.97507e-7 0.9924336 0.1227823 0 0.9924334 0.1227845 0 0.9924336 0.1227828 0 0.9924336 0.1227828 -1.23119e-7 0.9924352 0.1227695 0 0.9924337 0.1227818 0 0.9924338 0.1227813 -1.08378e-6 0.9924334 0.1227836 -5.15499e-5 0.9924335 0.1227832 1.70152e-6 0.9924342 0.1227784 0 0.9924337 0.1227819 -2.43365e-7 0.9924337 0.1227824 -0.002675771 0.9925326 0.1219497 -0.05084145 0.9966624 0.06386899 -0.04394751 0.9963476 0.07321292 -0.0476256 0.9965317 0.0682367 0 0.9924337 0.122782 0 0.9924337 0.122782 -0.04448974 0.9963895 0.07230877 -0.03060686 0.9947392 0.09776049 -0.04801553 0.9967047 0.06537795 -0.05374199 0.9969757 0.05613511 -0.01650804 0.9932917 0.1144502 -0.06605237 0.9975154 0.02449744 -0.06502312 0.997762 0.0155912 -2.60322e-6 0.9924339 0.1227799 -0.00859034 0.9929271 0.1184141 9.277e-7 0.9924335 0.1227832 -0.02280551 0.994336 0.1038074 -0.05435776 0.9970011 0.05508214 -2.41984e-7 0.9924343 0.1227772 -2.33403e-7 0.9924347 0.1227739 -2.00131e-6 0.992434 0.1227793 -0.06501883 0.9977621 0.01559889 0 0.9924335 0.1227834 0 0.9924328 0.1227885 -0.0648359 0.9977958 0.01414191 0.3342946 0.9424686 0 0.7669227 0.6124287 -0.1917306 0 0.9924337 0.1227821 7.71976e-7 0.9924336 0.1227825 0 0.9924337 0.1227817 -1.01312e-5 0.9924333 0.1227854 5.84501e-7 0.9924336 0.1227827 4.87031e-7 0.9924337 0.1227817 1.4419e-7 0.9924338 0.1227807 4.26971e-7 0.9924335 0.1227838 -0.06452268 0.99758 0.02590537 -0.02066159 0.9942754 0.1048314 -0.05303293 0.9970445 0.05558651 -0.02678269 0.9945086 0.1011694 -0.06445014 0.9972802 0.03575414 0 0.9924335 0.1227832 0 0.9924335 0.1227835 -0.06684678 0.1448935 -0.9871866 -0.0552293 0.9971381 0.05162751 0 0.9924336 0.1227825 -0.02595478 0.9939739 0.1065003 0 0.9924339 0.1227812 -0.05392652 0.9969832 0.05582529 1.68081e-7 0.9924336 0.1227823 2.42716e-7 0.992433 0.1227872 2.42485e-7 0.9924331 0.1227872 2.21651e-7 0.9924337 0.1227822 1.7052e-7 0.9924333 0.1227852 -1.88571e-6 0.9924342 0.122778 -0.02562421 0.992107 0.1227477 4.34702e-6 0.9924332 0.1227856 -1.05864e-6 0.9924337 0.1227818 5.87353e-6 0.9924331 0.1227869 -3.31091e-7 0.9924335 0.1227837 -8.27088e-7 0.9924337 0.1227817 -0.06571888 0.997471 0.0270667 -0.06604552 0.9975156 0.02450799 4.65005e-7 0.9924336 0.1227832 2.09743e-7 0.9924337 0.1227815 2.83423e-7 0.9924336 0.1227825 -0.0660454 0.9975155 0.024513 -0.06604534 0.9975155 0.02451092 -0.06604492 0.9975156 0.02450823 -0.06606036 0.9975146 0.02450823 4.52718e-7 0.9924334 0.1227844 -0.06604856 0.9975154 0.02450644 -9.23915e-7 0.9924339 0.1227807 7.40967e-7 0.9924335 0.1227834 6.81208e-7 0.9924335 0.1227833 2.25617e-7 0.9924342 0.1227778 0.005649685 0.9761715 0.2169269 -0.4408276 0.8908005 0.1102069 -1.83002e-7 0.992434 0.1227796 -4.50667e-7 0.9924336 0.122783 -3.62642e-7 0.9924336 0.1227836 0 0.9924339 0.1227803 -2.06011e-7 0.9924341 0.1227788 -4.20317e-7 0.9924337 0.122782 -3.82244e-7 0.9924336 0.1227831 -3.22673e-7 0.9924337 0.1227815 -4.28204e-7 0.992435 0.1227716 -3.86289e-7 0.9924357 0.1227661 0 0.9924345 0.1227754 -3.24424e-7 0.9924338 0.122781 2.6589e-7 0.9924342 0.1227773 -6.04017e-6 0.9924345 0.1227757 1.14831e-6 0.9924337 0.1227813 -2.1366e-6 0.992434 0.1227793 2.66586e-7 0.9924346 0.1227747 4.86578e-7 0.9924339 0.1227799 4.69466e-7 0.9924339 0.1227798 0 0.9924349 0.1227716 0 0.9924348 0.1227727 0 0.9924344 0.1227758 0 0.992435 0.1227716 2.93618e-7 0.9924331 0.1227865 0 0.9924349 0.1227726 2.69593e-7 0.9924336 0.1227828 2.12844e-7 0.9924337 0.1227819 5.10433e-7 0.992434 0.1227791 1.78947e-7 0.9924344 0.122776 -0.08162164 0.9891247 0.1223528 4.72126e-7 0.9924333 0.1227847 5.22412e-7 0.9924333 0.122785 0.01668381 0.9701032 0.2421188 -1.08141e-6 0.9924347 0.1227734 -2.84599e-7 0.9924337 0.1227821 -0.9997856 0 0.02070826 0.9834544 0.1811561 0 0.2040047 0.03450411 0.9783617 0.204005 0.03450298 0.9783617 0.3716775 -0.06286132 0.9262313 0 0.4539912 0.8910062 0 0.7071068 0.7071068 0 0.8910062 0.4539912 0 0.9876884 0.156434 -0.999783 -3.63667e-4 0.02082544 -0.9998725 -0.01577031 0.002500593 -0.999765 -5.47962e-6 0.02167689 -0.9998722 -0.01579636 0.00246936 -0.999765 0 0.02168411 -0.9997649 0 0.02168411 -0.9997649 0 0.02168309 -0.9997649 1.05264e-6 0.02168333 -0.999765 6.37564e-7 0.02168166 -0.999765 9.2399e-7 0.02168077 -0.9997649 1.2613e-6 0.02168166 -0.9997649 3.88337e-7 0.02168208 -0.9998724 -0.01578366 0.002482593 -1 0 0 -1 0 0 -1 0 0 -0.999808 0 0.01959156 -1 0 0 -1 0 0 -0.9997741 0 0.02125787 -0.9997871 1.10003e-4 0.02063477 -1 0 0 -0.9997639 3.76282e-4 0.02172964 -0.999771 0.002449214 0.02125746 -0.9999113 -3.63463e-4 0.01332157 -0.9997831 -3.62353e-4 0.02082288 -0.9998419 0.002023816 0.01766413 -0.9998973 -0.01160091 0.008428514 -0.9997741 -3.84308e-7 0.02125632 -0.999774 4.51455e-7 0.02125906 -0.9998579 0.001170814 0.01681858 -0.9998732 5.99481e-4 0.01591366 -0.9997741 -5.50278e-7 0.0212565 -0.9997741 -1.01995e-6 0.02125561 -0.9998944 1.70466e-5 0.01452988 -0.999774 2.43635e-6 0.02126079 -0.999783 -3.6438e-4 0.02082812 -0.9997832 -3.60518e-4 0.02082127 -0.9997564 0.001808822 0.0219981 -0.9998959 0.01040005 0.01000213 -0.9997823 -3.97189e-4 0.02086359 -0.9999057 0.009712874 0.00970751 0 -0.4539912 0.8910061 0 -0.7071068 0.7071068 0 -0.8910061 0.4539912 0 -0.9876901 0.1564236 0.2092149 -0.03538423 0.9772293 0.2178449 -0.02832019 0.9755724 -0.007750332 0 0.99997 -0.02493202 0 0.9996891 -0.04888266 0 0.9988045 -0.09562039 0 0.9954179 -0.295215 0 0.9554309 1.77729e-7 -0.1564344 0.9876883 0 -0.156434 0.9876884 0 -0.156434 0.9876884 1.48622e-7 -0.1564345 0.9876883 0 -0.1564341 0.9876884 0.3517704 0.06103801 0.9340942 0.7721138 0.1398457 0.619906 0.9005694 0.1651679 0.4021123 0.9731271 0.1792538 0.1445401 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.9745741 -0.1787407 0.1351186 0.9102851 -0.1648715 0.3797347 0.7916328 -0.1406539 0.5945873 0.6157574 -0.1068443 0.7806582 0.5910623 0.1050172 0.7997605 0.9834544 -0.181156 0 0.391317 0.9131134 -0.1144331 0 0.9992546 -0.03860408 -0.9997856 0 0.02070826 0 0 -1 0.1756029 0.9828087 -0.05701559 0.06182926 0.9978957 0.01952689 0.09783238 0.99519 -0.005064427 0.03790175 -0.9992415 0.008936703 0.06182295 -0.9978961 0.01952713 0.292682 -0.9547102 -0.05353146 0.4382939 -0.03169971 0.8982726 0.3581439 -0.0335254 0.9330644 0.2774146 -0.03236907 0.9602049 0.04392755 -0.006452023 0.9990139 0.1034998 0.01015526 0.9945777 0.1622942 0.02120327 0.9865146 0.9944069 -0.1056166 1.0008e-6 1 2.11641e-4 1.23792e-6 0.9943779 0.1058893 8.932e-7 0.9835308 -0.1044538 0.1475006 0.9889959 2.15433e-4 0.1479425 0.9836152 0.1047443 0.1467305 0.9074583 -0.09594249 0.4090409 0.91206 2.21238e-4 0.4100569 0.9082354 0.0963155 0.4072245 0.7744011 -0.08083242 0.6275101 0.7777321 2.12607e-4 0.6285958 0.7759764 0.08128356 0.6255027 0.5898178 -0.0603857 0.8052755 0.5918697 1.79967e-4 0.8060337 0.5917724 0.06083023 0.8038066 0.3495495 -0.03494209 0.9362661 0.3505277 1.13004e-4 0.9365524 0.351087 0.03524476 0.9356793 0.4211671 0.906983 -7.79871e-7 0.1962083 0.9805623 0 0.2300364 0.9698462 -0.08050853 0.2210353 0.9657728 -0.1357436 0.4211693 0.906982 -3.62825e-7 0.2764057 0.9516271 -0.134185 0.4211699 0.9069818 0 -0.8390976 -0.1989101 0.5063103 0.5166352 0 0.8562057 0.5166352 0 0.8562057 0.5166355 0 0.8562055 -0.8390967 0.1989108 0.5063114 0.1673744 -0.980707 -0.1009938 0.856206 0 -0.5166347 0.8562065 0 -0.5166338 0.5166563 -3.18403e-5 0.8561929 0.5166444 -1.91208e-6 0.8562001 0.5166454 -3.68291e-6 0.8561995 0.5166447 -2.75523e-6 0.8561999 0.5166368 1.08276e-6 0.8562047 0.5166354 0 0.8562055 0.5166352 0 0.8562057 0.5166335 -1.15213e-6 0.8562066 0.516636 1.20359e-6 0.8562052 0.5166358 8.9972e-7 0.8562053 0.5166352 1.1377e-6 0.8562056 0.8562061 0 -0.5166345 0.5166352 0 0.8562057 0.5166355 0 0.8562055 0.5166355 0 0.8562055 0.8562055 0 -0.5166355 -0.8562055 0 0.5166354 -0.8562055 0 0.5166354 -0.8558998 -0.02671682 0.516451 -0.8543158 -0.06640237 0.5154951 -0.8520181 -0.09879171 0.5141064 -0.8487915 -0.1313218 0.5121597 -0.8435101 -0.1715734 0.5089728 -0.8562055 0 0.5166354 -0.8562055 0 0.5166354 -0.8562055 0 0.5166354 -0.8562055 0 0.5166354 -0.8562055 0 0.5166354 -0.8435101 0.1715734 0.5089728 -0.8487915 0.1313217 0.5121597 -0.852018 0.09879189 0.5141066 -0.854317 0.066401 0.5154935 -0.8558999 0.0267167 0.5164509 0.5166358 -9.42564e-7 0.8562053 0.516636 -1.20359e-6 0.8562051 0.5166335 1.1562e-6 0.8562066 0.5166352 0 0.8562057 0.5166355 0 0.8562055 0.5166368 -1.07971e-6 0.8562047 0.5166447 2.75522e-6 0.8561999 0.5166454 3.6829e-6 0.8561995 0.5166444 1.91216e-6 0.8562001 0.5166563 3.18399e-5 0.856193 0.5166641 6.93513e-5 0.8561881 -0.815373 -0.3051316 0.4919976 -0.7339754 -0.5149121 0.4428833 -0.591897 -0.7225651 0.3571522 -0.3597146 -0.9074653 0.2170532 -0.02282285 -0.9996447 0.01377087 -0.815372 0.3051341 0.4919978 -0.7339849 0.5148954 0.442887 -0.5918948 0.7225677 0.3571506 -0.3597149 0.9074653 0.2170526 -0.02282285 0.9996447 0.01377081 0.8491343 -0.1282587 -0.5123677 0.7923382 -0.3789764 -0.4780974 0.6578762 -0.6400154 -0.3969624 0.3812996 -0.8953633 -0.2300764 0.8491343 0.1282587 -0.5123677 0.7923384 0.3789764 -0.478097 0.657876 0.6400154 -0.3969628 0.3812998 0.8953633 -0.2300761 0.1673748 0.9807069 -0.1009941 -0.02727907 0.9899754 0.1385803 -4.56086e-5 0.990346 0.1386173 2.64421e-5 0.9903426 0.138642 0.1160825 0.9836488 0.1376945 6.6006e-5 0.9903462 0.1386162 -1.69057e-5 0.9903458 0.1386182 -1.76308e-5 0.990346 0.1386173 6.77493e-5 0.9903463 0.1386156 1.34863e-5 0.9903463 0.1386156 -4.26042e-6 0.9903458 0.1386185 -4.34813e-6 0.9903459 0.1386182 1.19991e-5 0.9903461 0.1386174 8.61528e-6 0.990346 0.1386173 -1.30297e-6 0.9903459 0.1386188 -1.31359e-6 0.9903459 0.1386185 8.61945e-6 0.990346 0.1386173 0 0.9903458 0.1386188 1.49939e-6 0.990346 0.1386173 0 0.990346 0.1386173 0 -0.1386327 0.9903439 -1 0 0 1 0 0 0.1327531 -0.1374055 0.9815785 0.4103072 -0.1264256 0.9031414 0.7098319 -0.09764873 0.6975697 0.9590318 -0.03927445 0.2805629 -0.1327535 -0.1374057 0.9815784 -0.4103077 -0.1264258 0.9031413 -0.7098316 -0.09764903 0.6975699 -0.9590319 -0.03927445 0.2805627 -0.9596277 0.03899407 -0.2785573 -1.14023e-5 -0.9903448 0.1386258 -0.02920567 -0.9899216 0.1385729 -0.02727872 -0.9899754 0.1385804 1.99556e-5 -0.9903433 0.1386365 7.56471e-6 -0.9903433 0.1386365 1.65087e-5 -0.9903435 0.1386353 1.83231e-5 -0.9903435 0.1386348 7.10205e-6 -0.9903434 0.1386359 3.52916e-6 -0.9903434 0.1386359 -7.09888e-6 -0.9903435 0.1386359 -6.58625e-6 -0.9903435 0.1386353 -7.23367e-6 -0.9903479 0.1386041 -3.21107e-6 -0.9903479 0.1386041 -1.57007e-5 -0.9903432 0.1386376 -1.5116e-5 -0.9903435 0.1386359 -2.01089e-6 -0.9903433 0.1386368 1.95061e-6 -0.9903432 0.1386377 0 -0.9903433 0.1386368 1.97185e-6 -0.9903432 0.1386371 0 0.1386326 0.9903439 -1 0 0 -1 0 0 1 0 0 0.1327543 0.1374056 0.9815784 0.410308 0.1264256 0.9031411 0.7098318 0.09764909 0.6975698 0.9590293 0.0392757 0.2805714 -0.1327548 0.1374058 0.9815782 -0.4103059 0.1264254 0.9031421 -0.7098301 0.09764945 0.6975714 -0.9590319 0.03927433 0.2805626 -0.9596277 -0.03899407 -0.2785573 -1 0 0 -1 0 0 -1 0 0 -2.48221e-6 0.9919609 0.1265452 4.27612e-6 0.9919603 0.1265497 0 0.9919605 0.1265473 1.1057e-6 0.9919604 0.126549 1.75659e-6 0.9919608 0.1265456 0 0.9919607 0.1265467 9.41772e-7 0.9919608 0.1265457 2.68277e-7 0.9919607 0.1265468 0 0.9919606 0.1265473 -2.68277e-7 0.9919606 0.1265468 -9.41772e-7 0.9919607 0.1265457 0 0.9919607 0.1265467 -1.75658e-6 0.9919608 0.1265456 0 0.9919605 0.1265473 -4.2761e-6 0.9919603 0.1265497 2.48222e-6 0.9919608 0.1265452 -1.11856e-6 0.9919604 0.126549 2.56927e-7 0.9919606 0.1265469 0 0.9919606 0.1265473 -2.56927e-7 0.9919607 0.1265469 0 0.9919605 0.1265473 0 0.1414213 -0.9899495 1 0 0 0.0762465 -0.1261793 0.9890729 0.2388808 -0.122884 0.9632422 0.4347844 -0.1139605 0.8932948 0.6877364 -0.1050583 0.7183185 0.6878184 -0.09425133 0.7197378 0.6125565 -0.1000266 0.7840723 0.9501783 -0.04047322 0.3090686 0.07623797 0.1410098 -0.9870684 0.2388556 0.1373279 -0.9612956 0.4347451 0.1273575 -0.8915026 0.687781 0.1026603 -0.7186224 0.9501681 0.04408633 -0.3086047 -0.07624661 -0.1261792 0.989073 -0.2388809 -0.122884 0.9632422 -0.4347845 -0.1139605 0.8932947 -0.6878198 -0.09185856 0.7200458 -0.9501787 -0.03944557 0.3091996 -0.07623803 0.1410098 -0.9870684 -0.2388557 0.1373279 -0.9612955 -0.4347452 0.1273575 -0.8915024 -0.6877804 0.1026604 -0.718623 -0.9501681 0.04408633 -0.3086046 0 -0.1265476 0.9919605 -1 0 0 0.01956558 -0.9889457 0.1469817 -0.01776826 -0.9910758 0.1321105 -0.0217359 -0.9907982 0.1335908 0.02084696 -0.9887433 0.1481626 0.008359313 -0.9895862 0.1436986 -0.0102784 -0.9904682 0.1373574 -0.005381107 -0.9912126 0.1321691 0.005512416 -0.9904307 0.1379012 0.002539217 -0.9905979 0.1367821 -0.004449427 -0.990739 0.1357075 -0.005274236 -0.9905043 0.1373805 0.00214976 -0.9908232 0.1351472 8.64412e-4 -0.9904704 0.1377227 6.20859e-4 -0.990902 0.1345841 -0.002308964 -0.9907274 0.1358448 -0.003468215 -0.9900842 0.1404322 -0.001083374 -0.9900693 0.1405759 -8.36143e-4 -0.9905189 0.1373744 0 -0.9905139 0.1374123 0.07624691 0.1261795 0.9890729 0.2388803 0.1228841 0.9632422 0.4347848 0.1139605 0.8932945 0.6878184 0.09185856 0.7200471 0.9370029 0.04420572 0.3465132 -0.07624697 0.1261793 0.9890729 -0.2388796 0.1228839 0.9632425 -0.4347853 0.1139605 0.8932943 -0.6878195 0.09185862 0.720046 -0.9501788 0.03944551 0.3091996 0 0.1265478 0.9919605 0 0.9885122 0.1511415 -0.5172545 0.8460057 0.1293136 1 0 0 1 0 0 0.9694766 0.03704696 -0.2423691 0 -0.988519 0.1510969 -1.98064e-6 -0.9885195 0.1510934 -1.6733e-6 -0.9885195 0.1510936 -1.67663e-6 -0.9885195 0.1510934 7.66649e-7 -0.9885195 0.1510936 0 -0.9885196 0.1510931 -7.4525e-7 -0.9885196 0.1510934 1.74227e-6 -0.9885195 0.1510934 9.88866e-6 -0.9885194 0.1510936 9.11133e-6 -0.9885194 0.1510941 2.39057e-6 -0.9885195 0.151093 1.76128e-6 -0.9885196 0.151093 0.5313341 -0.837436 0.1280037 2.3015e-6 -0.9885183 0.1511012 2.12876e-6 -0.9885195 0.1510936 -1.09889e-5 -0.9885195 0.1510933 -2.00341e-6 -0.9885195 0.1510933 0 -0.9885196 0.1510931 0 -0.9885196 0.1510925 1 0 0 1 0 0 -1 0 0 0 -0.9885196 0.1510927 -0.4219434 -0.8962134 0.1369867 1 0 0 1 0 0 0.4103074 0.1377959 0.9014766 0.4103101 0.1377638 0.9014803 0.7098324 0.1064308 0.6962832 0.9590314 0.04280608 0.2800472 0.9590315 0.04280406 0.2800473 0.9569037 -0.04387998 -0.2870711 -0.4103067 0.137764 0.9014819 -0.7098333 0.1064265 0.6962832 -0.9590332 0.04280495 0.2800413 -0.9590308 0.04280245 0.2800498 -0.08376175 -0.1428073 0.9861998 -0.3529857 -0.134086 0.9259709 -0.855562 -0.07419228 0.5123566 -0.8555601 -0.07419437 0.5123592 -0.9162806 0.05740135 -0.3964025 -6.44035e-6 0.9896777 0.1433106 1.78836e-6 0.9896777 0.1433106 -1.22714e-6 0.9896777 0.1433107 -1.23893e-6 0.9896777 0.1433106 4.67694e-7 0.9896777 0.1433107 -1.74027e-7 0.9896777 0.1433106 4.71987e-7 0.9896777 0.1433106 -3.15365e-6 0.9896777 0.1433106 3.7278e-7 0.9896777 0.1433106 -1.96926e-6 0.9896777 0.1433106 -1.05255e-5 0.9896778 0.1433103 -0.02126425 0.9894539 0.1432788 -0.1046974 0.9842386 0.1425234 -6.53109e-6 0.9896777 0.1433107 1.7838e-6 0.9896777 0.1433107 -1.02128e-5 0.9896778 0.1433104 -2.14284e-6 0.9896778 0.1433103 3.8431e-7 0.9896777 0.1433106 -3.1445e-6 0.9896777 0.1433106 0.973748 0.03262197 -0.2252793 0 -0.1433109 0.9896777 0.1060478 -0.1425029 0.984097 0.3245263 -0.1355546 0.936113 0.5585378 -0.1188735 0.8209169 0.7974308 -0.08647543 0.5971819 0.9734343 -0.03281348 0.2266031 1 0 0 -0.08376306 0.1428072 0.9861997 -0.3529859 0.1340858 0.9259708 -0.8555577 0.07419312 0.5123636 -0.8555631 0.07418966 0.5123551 -0.8555575 0.07419317 0.5123639 -0.85556 0.07419437 0.5123596 -0.9162781 -0.05740189 -0.3964081 -0.9162781 -0.05740189 -0.3964082 -0.1046991 -0.9842383 0.1425237 0.06334739 -0.9876899 0.143024 -2.79238e-5 -0.9896801 0.1432942 -4.95516e-6 -0.9896771 0.1433151 -1.44824e-5 -0.9896802 0.1432942 3.21991e-6 -0.9896772 0.1433147 3.83001e-6 -0.9896786 0.1433048 2.81456e-6 -0.9896771 0.1433147 -6.68471e-6 -0.9896757 0.143325 0 -0.9896757 0.143325 2.71629e-6 -0.9896771 0.1433147 9.84102e-7 -0.98968 0.1432949 0 -0.98968 0.1432949 -4.27208e-6 -0.9896771 0.1433154 -7.05323e-6 -0.9896765 0.1433192 7.36296e-6 -0.9896772 0.1433144 0 -0.9896771 0.1433154 -4.7616e-7 -0.9896771 0.1433147 3.25642e-6 -0.9896771 0.1433151 0.9734382 -0.0328108 -0.2265862 0 0.1433109 0.9896777 0 0.1433106 0.9896778 0.1060504 0.1425027 0.9840967 0.3245234 0.135555 0.936114 0.5585379 0.1188735 0.820917 0.5585375 0.1188737 0.8209171 0.7974312 0.08647549 0.5971813 0.973433 0.03281432 0.2266086 0.9734342 0.03281289 0.2266036 1 0 0 2.39286e-7 0.9903439 0.1386326 2.31273e-6 0.9903437 0.1386339 -3.02675e-7 0.9903439 0.1386326 -1.25576e-6 0.9903441 0.1386312 2.14693e-7 0.9903439 0.1386327 -1.4913e-7 0.9903439 0.1386328 1.54147e-7 0.9903439 0.1386327 0 0.9903439 0.1386328 -1.4147e-6 0.9903441 0.1386309 -1.261e-7 0.9903438 0.1386327 1.30519e-7 0.9903439 0.1386324 1.83779e-6 0.9903438 0.1386334 2.11324e-7 0.9903439 0.1386327 1.77585e-6 0.9903439 0.1386327 -1.05141e-6 0.9903436 0.1386345 -7.71118e-7 0.9903437 0.1386342 0 0.9903439 0.1386327 0 -0.1386331 0.9903439 0 0.1386328 -0.9903439 -1 0 0 -1 0 0 -1 0 0 0.1327539 0.1374059 -0.9815783 0.4103074 0.1264257 -0.9031414 0.7098327 0.09764915 -0.6975687 0.9590365 0.03927242 -0.2805475 0.9590311 0.03927439 -0.2805653 1 0 0 0.1327533 -0.1374061 0.9815784 0.4103074 -0.1264261 0.9031414 0.7098328 -0.09764868 0.6975688 0.9588879 -0.03934186 0.2810447 0.9590317 -0.03927463 0.2805631 0.9590319 -0.03927433 0.2805627 -0.1327535 -0.1374061 0.9815784 -0.4103074 -0.1264262 0.9031413 -0.7098329 -0.09764915 0.6975686 -0.9590317 -0.03927457 0.2805631 -0.132753 0.1374056 -0.9815785 -0.4103068 0.1264256 -0.9031417 -0.7098327 0.09764891 -0.6975688 -0.9590319 0.03927445 -0.2805625 3.15119e-6 -0.9903445 0.1386284 -9.40463e-6 -0.9903427 0.1386407 -1.65814e-5 -0.9903421 0.1386451 -1.64465e-6 -0.9903439 0.1386324 -1.34221e-5 -0.9903447 0.1386269 4.52468e-6 -0.9903432 0.1386379 -2.85294e-6 -0.9903442 0.1386306 0 -0.9903439 0.1386327 -1.81673e-7 -0.9903439 0.1386328 3.08203e-7 -0.9903439 0.1386326 -6.24561e-7 -0.9903438 0.138633 -2.81056e-7 -0.9903439 0.1386326 1.62923e-5 -0.9903421 0.138645 9.65843e-6 -0.9903427 0.1386409 -3.15118e-6 -0.9903445 0.1386284 0 -0.9903439 0.1386327 2.37365e-7 -0.9903439 0.1386327 0 0.1386333 0.9903438 0 -0.138633 -0.9903438 -1 0 0 -1 0 0 -1 0 0 0.1327561 -0.1374059 -0.981578 0.132754 -0.1374059 -0.9815783 0.4103072 -0.1264254 -0.9031416 0.7098326 -0.0976485 -0.6975689 0.9590313 -0.03927475 -0.2805646 0.9590311 -0.03927582 -0.2805652 1 0 0 0.1327543 0.1374058 0.9815783 0.4103061 0.1264259 0.903142 0.7098321 0.09764915 0.6975694 0.959032 0.03927439 0.2805622 0.9590319 0.03927457 0.2805625 0.9586871 0.03943598 0.2817161 -0.1327548 0.1374058 0.9815782 -0.4103053 0.126426 0.9031423 -0.7098326 0.09764903 0.6975688 -0.959032 0.03927439 0.2805624 -0.1327548 -0.137406 -0.9815782 -0.4103072 -0.1264259 -0.9031414 -0.7098332 -0.09764915 -0.6975683 -0.9590317 -0.03927463 -0.2805632 -1 0 0 -1 0 0 0.1010372 0.9677072 0.2309423 -0.1483208 0.988431 -0.03170168 -0.8931432 0.4461567 0.05691748 -0.4516258 0.8850345 0.1129065 -0.03374981 0.9927399 0.1154492 -0.03390997 0.9927363 0.115433 -0.0483933 0.9926823 0.1106341 -0.04866206 0.9927062 0.1103007 0.01551192 0.9918412 0.1265321 -0.02512204 0.9916476 0.1265074 -0.01532679 0.9937612 0.1104711 -0.01545685 0.9938207 0.1099156 0.01339441 0.9924181 0.1221748 -0.007925927 0.993875 0.1102257 -0.00788784 0.9938648 0.1103199 0.0133509 0.9924204 0.1221612 0.008370995 0.993005 0.1177748 -0.004020333 0.993888 0.1103203 -0.004092633 0.9939323 0.1099172 0.008316218 0.9930192 0.1176592 0.005492746 0.9933212 0.1152514 -0.001246511 0.9938905 0.110363 -0.001247584 0.9938958 0.1103161 0.005481421 0.9932931 0.1154932 0.003280222 0.9935542 0.1133106 0 0.9938837 0.1104315 0 0.9938837 0.1104315 0.003258883 0.9935563 0.1132919 0.001162707 0.9937691 0.1114523 0 0.1265474 -0.9919605 1 0 0 1 0 0 1 0 0 0.4872585 -0.1105084 0.8662373 0.6878209 -0.0918582 0.7200448 0.9501787 -0.03944551 0.3091998 0.0762465 0.126179 -0.9890729 0.2388809 0.1228836 -0.9632422 0.4347848 0.1139603 -0.8932946 0.6878219 0.09185802 -0.720044 0.9501785 0.03944557 -0.3092002 -0.9696784 -0.03092616 0.2424196 -0.0762465 0.126179 -0.9890729 -0.2388814 0.1228837 -0.9632421 -0.4347847 0.1139602 -0.8932946 -0.6878213 0.0918582 -0.7200444 -0.9501785 0.03944557 -0.3092001 -1 0 0 -1 0 0 -1 0 0 7.3606e-7 -0.9919606 0.1265469 -8.6205e-7 -0.9919605 0.1265486 -7.75376e-6 -0.9919599 0.1265532 -8.77416e-7 -0.9919607 0.126547 7.94893e-6 -0.9919599 0.1265531 -4.32858e-6 -0.9919609 0.1265449 3.15637e-6 -0.9919599 0.1265528 -1.31972e-6 -0.9919607 0.126546 0 -0.9919606 0.1265472 -3.5041e-6 -0.9919598 0.1265531 -6.30639e-7 -0.9919606 0.1265472 8.99984e-7 -0.9919607 0.1265466 5.79591e-6 -0.9919614 0.1265414 -1.51526e-5 -0.9919596 0.1265554 -8.05677e-7 -0.9919605 0.1265472 5.32293e-7 -0.9919601 0.1265508 7.21431e-6 -0.9919596 0.1265553 2.70317e-6 -0.9919602 0.1265506 -4.11187e-6 -0.9919614 0.1265404 0 -0.9919606 0.1265472 -1.09478e-6 -0.9919603 0.1265496 0 -0.1265476 -0.9919605 1 0 0 1 0 0 0.07624751 0.1259487 0.9891023 0.23888 0.1227017 0.9632656 0.4347839 0.1138321 0.8933113 0.6878063 0.08572793 0.7208144 0.950178 0.03944534 0.3092018 0.9501788 0.03944551 0.3091997 0.07624495 -0.1261793 -0.9890731 0.2388797 -0.1228835 -0.9632425 0.4347851 -0.11396 -0.8932945 0.6878197 -0.09185826 -0.7200459 0.9501788 -0.03944551 -0.3091993 -0.07624638 0.1260371 0.989091 -0.2388803 0.1227455 0.9632599 -0.4347848 0.1137914 0.8933161 -0.6878201 0.09175503 0.7200587 -0.9501791 0.03954148 0.3091863 -0.9501787 0.03974926 0.3091609 0 0.126547 0.9919606 -0.07624721 -0.1261795 -0.9890728 -0.2388812 -0.1228835 -0.9632421 -0.4347837 -0.1139603 -0.8932951 -0.6878211 -0.09185808 -0.7200445 -0.9501789 -0.0394454 -0.3091993 0 0.126405 0.9919787 -3.95399e-6 0.9885185 0.1510994 0 0.988519 0.151097 -2.88048e-7 0.988519 0.1510972 0 0.988519 0.1510966 0 0.9885194 0.151094 0 0.988519 0.1510967 -3.61263e-6 0.9885202 0.1510886 -7.14063e-7 0.9885191 0.1510959 7.09523e-7 0.9885185 0.1510995 2.47235e-7 0.988519 0.1510965 1 0 0 1 0 0 1 0 0 0 0.1510966 -0.988519 -1 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 2.94311e-7 0.988519 0.1510965 -8.38866e-7 0.9885191 0.1510953 1.48275e-6 0.988519 0.1510968 3.89426e-7 0.988519 0.1510967 0 0.988519 0.1510965 -3.86895e-7 0.988519 0.1510965 2.15825e-6 0.9885191 0.1510958 -2.25625e-6 0.9885187 0.1510984 -2.95876e-7 0.988519 0.1510965 0 0.988519 0.1510965 -0.07815146 0.1506345 -0.9854957 -0.198083 0.1481026 -0.9689317 -0.305547 0.1438708 -0.941245 -0.305547 0.1438708 -0.941245 -0.433543 0.1361582 -0.890787 -0.6203896 0.1185036 -0.7752894 -0.772745 0.09590357 -0.6274294 -0.7727461 0.09590333 -0.6274281 -0.8917229 0.06838363 -0.4473859 -0.8917244 0.06838315 -0.4473829 -0.8917236 0.06838339 -0.4473844 -0.8917284 0.06838321 -0.4473749 -0.9818629 0.02864676 -0.1874157 -0.5209214 0.1289766 -0.8438044 0.1327537 -0.1497591 0.9797697 0.4103076 -0.137792 0.9014772 0.7098321 -0.106428 0.6962841 0.9590315 -0.04280555 0.2800471 0.132753 0.1497594 -0.9797697 0.4103083 0.1377921 -0.9014769 0.7098317 0.1064282 -0.6962845 0.9590316 0.04280549 -0.2800466 -0.1327537 -0.1497592 0.9797697 -0.4103065 -0.1377923 0.9014776 -0.7098333 -0.106428 0.6962828 -0.9590309 -0.04280585 0.280049 0 -0.1510964 0.988519 -8.63293e-6 -0.9885179 0.1511032 9.88941e-7 -0.9885191 0.1510962 0 -0.9885191 0.1510964 -1.64804e-7 -0.988519 0.1510963 -1.2791e-6 -0.9885193 0.151095 1.14028e-5 -0.988515 0.1511232 7.19886e-6 -0.9885104 0.1511529 -1.67557e-7 -0.988519 0.1510967 -7.02902e-7 -0.9885187 0.1510987 0 -0.9885188 0.1510979 1 0 0 1 0 0 0 -0.1510964 -0.988519 0 -0.1510962 -0.988519 -1 0 0 -1 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 -4.31581e-6 -0.9885187 0.1510986 -1.46958e-5 -0.9885177 0.1511049 -8.38272e-7 -0.988519 0.1510968 0 -0.988519 0.1510968 6.81455e-6 -0.9885203 0.1510877 -6.95403e-7 -0.988519 0.1510967 7.67736e-6 -0.9885181 0.1511029 5.32245e-6 -0.9885182 0.1511014 -3.05269e-6 -0.9885196 0.1510932 -2.08619e-7 -0.988519 0.1510972 -0.07815086 -0.1506345 -0.9854956 -0.1980842 -0.1481027 -0.9689316 -0.1980839 -0.1481026 -0.9689315 -0.3055474 -0.1438712 -0.9412449 -0.3055465 -0.143871 -0.9412451 -0.433541 -0.1361583 -0.890788 -0.6203899 -0.1185038 -0.7752891 -0.7727475 -0.09590309 -0.6274265 -0.7727482 -0.09590786 -0.6274249 -0.7727445 -0.09590387 -0.6274299 -0.8917242 -0.06838321 -0.4473833 -0.8917242 -0.06838321 -0.4473832 -0.8917242 -0.06838315 -0.4473829 -0.9820883 -0.03466534 -0.1852053 -0.9830656 -0.06234455 -0.1723232 -0.9818636 -0.02864623 -0.1874122 -0.9818777 -0.0306552 -0.1870202 -0.9818622 -0.02864724 -0.1874189 -0.9818609 -0.02953881 -0.1872875 -0.981863 -0.02864634 -0.1874158 -0.5209213 -0.1289765 -0.8438046 -0.5209218 -0.1289768 -0.8438041 0.1327542 0.1497592 0.9797697 0.4103072 0.1377921 0.9014773 0.7098322 0.1064282 0.6962839 0.9590315 0.04280567 0.2800469 0.1327545 -0.149759 -0.9797697 0.4103056 -0.1377927 -0.9014779 0.7098334 -0.1064277 -0.6962828 0.9590315 -0.04280561 -0.2800471 -0.1327539 0.1497595 0.9797697 -0.4103077 0.1377923 0.901477 -0.7098325 0.1064281 0.6962836 -0.9586974 0.04297626 0.2811627 -0.9588573 0.04289448 0.2806292 -0.9590309 0.04280579 0.2800489 0 0.1510968 0.988519 -3.5494e-7 0.1433111 -0.9896777 0 0.1433112 -0.9896777 -1.82306e-6 0.143311 -0.9896777 -0.5496515 0.1197214 -0.8267709 -0.0837621 -0.1428076 0.9861997 -0.3529855 -0.134086 0.9259709 -0.8555592 -0.07419288 0.5123611 -0.8555602 -0.07419234 0.5123595 -0.8555631 -0.07419192 0.5123547 -0.9162788 0.05740195 -0.3964065 -0.6454703 0.1094591 -0.7559013 -0.06675553 0.1429916 -0.98747 -0.0668019 0.142991 -0.9874671 -0.06679809 0.1429913 -0.9874672 -0.1730836 0.1411483 -0.9747406 -0.2645854 0.1382038 -0.9544078 -0.358668 0.133776 -0.9238296 -0.4742446 0.1261701 -0.8713054 3.74802e-6 0.9896782 0.1433077 -2.45125e-6 0.9896773 0.1433143 0 0.9896777 0.1433107 8.49383e-7 0.989678 0.1433092 -1.5059e-7 0.9896777 0.1433112 -5.10715e-6 0.9896795 0.1432991 -2.72497e-7 0.9896777 0.1433115 9.27798e-6 0.9896749 0.1433306 0 0.9896777 0.143311 9.82394e-7 0.9896778 0.1433104 9.94265e-7 0.9896777 0.1433104 -2.31077e-6 0.9896777 0.1433111 0 0.9896777 0.1433111 0 0.9896777 0.143311 -1.62184e-7 0.9896777 0.1433107 0 0.9896776 0.143311 -1.23498e-6 0.9896779 0.1433096 7.40312e-7 0.9896777 0.1433111 -3.9664e-6 0.989678 0.1433088 -1.91203e-7 0.9896777 0.1433112 -3.22143e-6 0.9896774 0.1433132 0.1060476 0.142503 -0.984097 0.1060491 0.142503 -0.9840968 0.1060459 0.1425032 -0.9840971 0.1060466 0.1424885 -0.9840991 0.1060484 0.142503 -0.9840968 0.3245261 0.1355548 -0.9361131 0.3245238 0.1355548 -0.936114 0.5585384 0.1188735 -0.8209165 0.7974255 0.08647596 -0.5971887 0.7974453 0.08647263 -0.5971628 0.7974312 0.08647531 -0.5971813 0.9734339 0.03281366 -0.2266045 0 -0.1433112 0.9896777 0.1060478 -0.142503 0.9840969 0.3245261 -0.1355548 0.9361131 0.5585379 -0.1188737 0.8209168 0.7974314 -0.08647531 0.5971811 0.9734342 -0.03281348 0.2266033 1 0 0 1 0 0 1 0 0 -3.4922e-6 -0.1433112 -0.9896776 0 -0.1433112 -0.9896777 2.41584e-5 -0.1433095 -0.9896779 -0.5496513 -0.1197212 -0.826771 -0.08376246 0.1428073 0.9861997 -0.3529859 0.1340858 0.9259707 -0.8555597 0.0741924 0.5123605 -0.8555588 0.074193 0.5123619 -0.8555601 0.07419282 0.5123596 -0.9162788 -0.05740195 -0.3964065 -0.6454703 -0.1094589 -0.7559015 -0.06679934 -0.1429845 -0.9874681 -0.06679642 -0.1429911 -0.9874674 -0.06679999 -0.1429911 -0.9874671 -0.06679874 -0.1429911 -0.9874672 -0.06680822 -0.1429909 -0.9874666 -0.1730835 -0.1411482 -0.9747406 -0.2645829 -0.1382038 -0.9544085 -0.3586686 -0.1337763 -0.9238293 -0.4742429 -0.1261706 -0.8713063 4.07744e-5 -0.9896615 0.1434231 -4.70716e-6 -0.9896765 0.143319 1.23324e-5 -0.9896816 0.1432845 0 -0.9896783 0.1433066 -1.27668e-5 -0.9896757 0.1433253 9.10705e-6 -0.989679 0.143302 -1.07876e-6 -0.9896779 0.1433096 -1.35436e-5 -0.989677 0.1433156 -1.82298e-6 -0.9896776 0.1433119 -3.48919e-5 -0.9896804 0.1432924 -9.15424e-6 -0.9896786 0.1433047 1.96098e-6 -0.9896774 0.143313 0 -0.9896777 0.1433109 0 -0.9896778 0.1433109 3.16766e-6 -0.9896778 0.1433104 -5.22849e-6 -0.9896776 0.1433112 2.8584e-6 -0.9896777 0.143311 -4.13283e-6 -0.9896778 0.1433106 9.95146e-7 -0.9896776 0.1433116 -5.51912e-5 -0.9896919 0.1432132 -2.05477e-6 -0.9896774 0.1433128 0.1059368 -0.139981 -0.9844708 0.1060282 -0.1425035 -0.9840989 0.1060478 -0.1425031 -0.984097 0.1060401 -0.1424717 -0.9841023 0.1060525 -0.1425023 -0.9840964 0.1060578 -0.1425029 -0.9840959 0.3245323 -0.1355546 -0.936111 0.3245242 -0.135555 -0.9361137 0.3245207 -0.1355555 -0.9361148 0.5591216 -0.1191028 -0.8204861 0.5596498 -0.1209897 -0.8198498 0.5583782 -0.1127245 -0.8218924 0.5585419 -0.118873 -0.8209142 0.5585372 -0.1188738 -0.8209173 0.7974344 -0.08657348 -0.5971628 0.7974322 -0.08647525 -0.5971801 0.7974317 -0.08647531 -0.5971807 0.9734339 -0.03281366 -0.2266045 0 0.1433114 0.9896776 0.1060493 0.1425032 0.9840967 0.324523 0.135555 0.9361141 0.5585392 0.1188734 0.8209161 0.7974317 0.08647513 0.5971807 0.9734343 0.03281342 0.2266032 1 0 0 1 0 0 1 0 0 0 1 0 0 0 -1 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0 -1 0 0 -0.06062865 0.9981604 0 -0.1917768 0.9814386 0 -0.3580724 0.9336938 0 -0.6013616 0.798977 0 -0.9242767 0.3817234 0 -0.06062865 -0.9981604 0 -0.1917768 -0.9814385 0 -0.3580729 -0.9336935 0 -0.601361 -0.7989774 0 -0.6013611 -0.7989773 0 -0.924277 -0.3817225 -2.41025e-7 -0.9242768 -0.3817231 0 0.06062865 0.9981604 0 0.1917768 0.9814386 0 0.3580724 0.9336938 0 0.6013616 0.798977 0 0.9242766 0.3817234 0 0.06062865 -0.9981604 0 0.1917768 -0.9814385 0 0.3580729 -0.9336936 0 0.6013609 -0.7989775 -1.97838e-7 0.6013611 -0.7989774 0 0.924278 -0.38172 6.51949e-7 0.9242767 -0.381723 0 0 1 0 0 1 0 0 1 0 0 1
+
+
+
+
+
+
+
+
+
+ 0.8743537 0.505812 0.8736047 0.5062673 0.875 0.5046022 0.5017627 0.75 0.5100395 0.7503841 0.5179039 0.7514989 0.8716151 0.5066604 0.625 0.7433397 0.625 0.5066604 0.375 0.625 0.125 0.75 0.125 0.625 0.6144427 0.62336 0.6143736 0.5731982 0.625 0.5066604 0.5303372 0.6249999 0.5384811 0.6385648 0.5381201 0.6486093 0.6119105 0.7601179 0.6177962 0.75 0.6123399 0.7625864 0.6177962 1 0.5884171 0.9876403 0.6015034 0.9802527 0.6046173 0.8162293 0.6064937 0.8217775 0.6037628 0.8225322 0.5442775 0.7763577 0.5425823 0.7745711 0.5440358 0.773859 0.5639337 0.7556056 0.5423319 0.7554451 0.5314134 0.75 0.5365223 0.7570865 0.5363616 0.7572796 0.5361303 0.7575547 0.5381748 0.7834566 0.5393883 0.8429387 0.5278533 0.7524455 0.5489923 0.8474408 0.5528185 0.8402186 0.5771957 0.8346799 0.5661801 0.7566103 0.566154 0.7565482 0.5767653 0.7571943 0.5664007 0.7576855 0.5664008 0.7576851 0.5663875 0.7575593 0.5660642 0.7563652 0.5660544 0.7563424 0.5659825 0.7562332 0.5714776 0.7595786 0.5714635 0.759586 0.5714838 0.7595747 0.6064919 0.7559792 0.6177962 0.75 0.6088231 0.756417 0.5278533 0.7524455 0.5365223 0.7570865 0.535887 0.7578421 0.5810608 0.8272311 0.6030992 0.8169599 0.5528185 0.8402186 0.5489922 0.8474409 0.5465829 0.8430813 0.5528185 0.8402186 0.6037628 0.8225322 0.5771957 0.8346799 0.6030992 0.8169599 0.5808373 0.8273342 0.5810608 0.8272311 0.5528185 0.8402186 0.5440619 0.8438937 0.5465829 0.8430813 0.5436308 0.8440347 0.5440077 0.776563 0.5417143 0.778307 0.5442775 0.7763577 0.547899 0.9260615 0.5491118 0.9180531 0.549112 0.9180531 0.5278533 1 0.5479192 0.9902285 0.5483039 0.9902265 0.375 0.75 0.520886 0.75 0.5278533 0.7524455 0.5278533 0.25 0.5729831 0.2599095 0.5483025 0.2597735 0.5699051 0.4896246 0.5730397 0.4912947 0.5649413 0.4896572 0.537675 0.4767428 0.5358597 0.4878427 0.5278533 0.4975544 0.6063748 0.3363352 0.606534 0.3454677 0.6038146 0.3443064 0.5478885 0.3239358 0.6038146 0.3443064 0.5495002 0.3320393 0.5278533 0.125 0.375 0.25 0.375 0.125 0.375 0.5 0.5017627 0.6164405 0.375 0.6164424 0.5278533 0.5 0.5278533 0.5 0.5278533 0.625 0.5278533 0.6328686 0.527464 0.750061 0.5274639 0.6330705 0.6247739 0.5046021 0.875 0.5 0.875 0.5046022 0.625 0.5 0.6220305 0.25 0.625 0.25 0.6220305 0.5 0.6200222 0.25 0.6220305 0.25 0.6200222 0.5 0.6177961 0.25 0.6200222 0.25 0.5278533 0 0.5465497 0.02485078 0.5440785 0.02856355 0.6076876 0.2295546 0.6246475 0.2453978 0.6177961 0.25 0.6247739 0.7453978 0.875 0.75 0.625 0.75 0.625 0.75 0.6220305 1 0.6220305 0.75 0.6220305 0.75 0.6200222 1 0.6200222 0.75 0.6200222 0.75 0.6177962 1 0.6177962 0.75 0.5278533 0.625 0.5278533 0.75 0.5278533 0.6328686 0.8716151 0.5066604 0.8726611 0.7434405 0.8716151 0.7433397 0.8726611 0.5065597 0.875 0.7433397 0.8726611 0.7434405 0.625 0.2433397 0.6248546 0.00581187 0.625 0.006660282 0.6248547 0.2441881 0.6247563 0.005238115 0.6248546 0.00581187 0.6247565 0.2447618 0.6246474 0.004602134 0.6247563 0.005238115 0.8736047 0.7437328 0.8743535 0.7441881 0.875 0.7453979 0.5278533 0.6171028 0.5274638 0.4999321 0.5278533 0.5 0.5263071 0.6166852 0.5179042 0.4983208 0.5263068 0.4997341 0.5179041 0.6163692 0.5100397 0.4995697 0.5179042 0.4983208 0.5100396 0.6164203 0.5017627 0.5 0.5100397 0.4995697 0.375 0.625 0.375 0.5 0.375 0.5 0.375 0.75 0.375 0.625 0.375 0.625 0.5100396 0.6335111 0.5017627 0.75 0.5017627 0.6335393 0.5179041 0.633425 0.5100395 0.7503841 0.5100396 0.6335111 0.5263072 0.63326 0.5179039 0.7514989 0.5179041 0.633425 0.5274639 0.6330705 0.5263075 0.7502395 0.5263072 0.63326 0.5274639 0.6168929 0.5263068 0.4997341 0.5274638 0.4999321 0.5017627 0.6335393 0.375 0.75 0.375 0.6335383 0.5278533 0.4975544 0.375 0.5 0.5278533 0.25 0.375 0 0.5278533 0.125 0.375 0.125 0.375 0.5 0.125 0.625 0.125 0.5 0.520886 0.5 0.5314134 0.5 0.5291633 0.5002833 0.5278533 0.7487701 0.520886 0.75 0.5278534 0.7495838 0.375 0.6164424 0.375 0.62179 0.375 0.625 0.375 0.62179 0.375 0.6278424 0.375 0.625 0.375 0.6278424 0.375 0.6329779 0.375 0.625 0.5278533 0.6328686 0.5278701 0.6278846 0.5278533 0.625 0.5278701 0.6278846 0.5279166 0.6220672 0.5278533 0.625 0.5279166 0.6220672 0.5279808 0.6169529 0.5278533 0.625 0.5303372 0.6249999 0.5291678 0.7495837 0.5287261 0.6249382 0.5287261 0.6249382 0.5278534 0.7495838 0.5278533 0.6249327 0.5278533 0.6249327 0.5278533 0.75 0.5278533 0.625 0.5303372 0.6249999 0.5291633 0.5002833 0.5314134 0.5 0.5287261 0.6249382 0.5278533 0.5002854 0.5291633 0.5002833 0.5278533 0.6249327 0.5278533 0.5 0.5278533 0.5002854 0.375 0.6335383 0.5017917 0.6281973 0.5017627 0.6335393 0.5017917 0.6281973 0.375 0.62179 0.5017914 0.6217901 0.5017914 0.6217901 0.375 0.6164424 0.5017627 0.6164405 0.5017627 0.6335393 0.5101417 0.6281655 0.5100396 0.6335111 0.5101417 0.6281655 0.5017914 0.6217901 0.5101408 0.6217748 0.5101408 0.6217748 0.5017627 0.6164405 0.5100396 0.6164203 0.5100396 0.6335111 0.5180953 0.6280772 0.5179041 0.633425 0.5180953 0.6280772 0.5101408 0.6217748 0.518094 0.6217328 0.518094 0.6217328 0.5100396 0.6164203 0.5179041 0.6163692 0.5179041 0.633425 0.5264451 0.628046 0.5263072 0.63326 0.5264451 0.628046 0.518094 0.6217328 0.5264443 0.6219219 0.5264443 0.6219219 0.5179041 0.6163692 0.5263071 0.6166852 0.5263072 0.63326 0.5274934 0.6279653 0.5274639 0.6330705 0.5274934 0.6279653 0.5264443 0.6219219 0.5274934 0.6220235 0.5274934 0.6220235 0.5263071 0.6166852 0.5274639 0.6168929 0.5274639 0.6330705 0.5278701 0.6278846 0.5278533 0.6328686 0.5278701 0.6278846 0.5274934 0.6220235 0.5278702 0.6221134 0.5278702 0.6221134 0.5274639 0.6168929 0.5278533 0.6171028 0.5263068 0.4997341 0.5179042 0.4983208 0.5017627 0.5 0.375 0.5368601 0.2443365 0.5103259 0.375 0.5103259 0.625 0.6875 0.4059466 0.6875 0.4060045 0.625 0.375 0.71314 0.2445977 0.7396742 0.2426913 0.71314 0.6106659 0.4020609 0.3885582 0.5 0.3885582 0.3710941 0.7146734 0.625 0.625 0.5625 0.7178073 0.5625 0.7115396 0.6875 0.625 0.625 0.7146734 0.625 0.3885582 0.75 0.3843423 0.7494727 0.3805097 0.7479618 0.7091313 0.7355375 0.625 0.6875 0.7115396 0.6875 0.4060045 0.625 0.375 0.5982206 0.4059465 0.5625 0.7178073 0.5625 0.625 0.5144626 0.7202154 0.5144626 0.375 0.6607206 0.2408492 0.6517794 0.375 0.6517794 0.375 0.5982206 0.2408492 0.5892794 0.375 0.5892794 0.4059466 0.6875 0.375 0.71314 0.375 0.7040153 0.4059466 0.6875 0.375 0.7040153 0.375 0.6933807 0.4059466 0.6875 0.375 0.6933807 0.375 0.6822774 0.4059466 0.6875 0.375 0.6822774 0.375 0.671792 0.4059466 0.6875 0.375 0.671792 0.375 0.6629511 0.4060045 0.625 0.375 0.6517794 0.375 0.6410676 0.4060045 0.625 0.375 0.6410676 0.375 0.6303559 0.4060045 0.625 0.375 0.6303559 0.375 0.6196442 0.4060045 0.625 0.375 0.6196442 0.375 0.6089323 0.4060045 0.625 0.375 0.6089323 0.375 0.5982206 0.375 0.5797492 0.4059465 0.5625 0.375 0.5892794 0.375 0.5686421 0.4059465 0.5625 0.375 0.5797492 0.375 0.5570452 0.4059465 0.5625 0.375 0.5686421 0.375 0.5460939 0.4059465 0.5625 0.375 0.5570452 0.375 0.5368601 0.4059465 0.5625 0.375 0.5460939 0.375 0.5892794 0.2409394 0.5797492 0.375 0.5797492 0.375 0.5797492 0.2412012 0.5686421 0.375 0.5686421 0.375 0.5686421 0.2416086 0.5566193 0.375 0.5566193 0.375 0.5566193 0.2421221 0.5459848 0.375 0.5459848 0.375 0.5459848 0.2426914 0.5368601 0.375 0.5368601 0.375 0.6517794 0.2408492 0.6410676 0.375 0.6410676 0.375 0.6410676 0.2408492 0.6303558 0.375 0.6303559 0.375 0.6303559 0.2408492 0.6196441 0.375 0.6196442 0.375 0.6196442 0.2408492 0.6089324 0.375 0.6089323 0.375 0.6089323 0.2408492 0.5982206 0.375 0.5982206 0.375 0.7040153 0.2426913 0.71314 0.2421221 0.7040153 0.375 0.6933807 0.2421221 0.7040153 0.2416086 0.6933807 0.375 0.6813579 0.2416086 0.6933807 0.2412012 0.6813579 0.375 0.6702508 0.2412012 0.6813579 0.2409394 0.6702508 0.375 0.6607206 0.2409394 0.6702508 0.2408492 0.6607206 0.3885582 0.5 0.6106659 0.5 0.4059465 0.5625 0.375 0.5103259 0.2443878 0.5070548 0.375 0.5070548 0.375 0.5070548 0.2446196 0.5039436 0.375 0.5039436 0.2450082 0.5 0.375 0.5039436 0.2446196 0.5039436 0.3842632 0.3705163 0.375 0.5 0.375 0.3700082 0.3885582 0.3710941 0.3842632 0.5 0.3842632 0.3705163 0.375 0.7396742 0.2449515 0.7429453 0.2445977 0.7396742 0.375 0.7429453 0.2455202 0.7460564 0.2449515 0.7429453 0.375 0.7460564 0.2462481 0.75 0.2455202 0.7460564 0.375 0.75 0.3842632 0.8779362 0.375 0.8787519 0.3842632 0.75 0.3885582 0.8771125 0.3842632 0.8779362 0.7202154 0.5144626 0.625 0.5087816 0.7206451 0.5087816 0.7206451 0.5087816 0.625 0.5 0.7213135 0.5 0.625 0.4036865 0.6162965 0.5 0.6162965 0.4028809 0.6162965 0.4028809 0.6106659 0.5 0.6106659 0.4020609 0.7089912 0.7412185 0.625 0.7355375 0.7091313 0.7355375 0.625 0.75 0.7089912 0.7412185 0.7091473 0.75 0.6162965 0.75 0.625 0.8341474 0.6162965 0.834576 0.6106659 0.75 0.6162965 0.834576 0.6106659 0.8353731 0.3885582 0.75 0.6106659 0.8353731 0.3885582 0.8771125 0.3768333 0.5116654 0.375 0.7311029 0.3763365 0.7159283 0.375 0.5188971 0.2888546 0.731103 0.2888547 0.5188971 0.600915 0.75 0.3990851 0.838654 0.3990851 0.75 0.3990851 0.4113467 0.4003368 0.4961079 0.3990851 0.5 0.375 0.5116655 0.2888547 0.5188971 0.2886638 0.5116655 0.375 0.5 0.2886638 0.5116655 0.2881204 0.5 0.3898681 0.5 0.375 0.4131203 0.3898681 0.4123064 0.3990851 0.5 0.3898681 0.4123064 0.3990851 0.4113467 0.2888546 0.731103 0.375 0.7383345 0.2886638 0.7383345 0.2886638 0.7383345 0.375 0.75 0.28812 0.75 0.375 0.83688 0.3898681 0.75 0.3898681 0.8376936 0.3898681 0.8376936 0.3990851 0.75 0.3990851 0.838654 0.6009156 0.8596736 0.600915 0.75 0.6009156 0.75 0.375 0.5188971 0.375 0.7311029 0.3763368 0.7311028 0.375 0.7311029 0.2863669 0.5188971 0.2769464 0.731103 0.3990851 0.75 0.5765497 0.75 0.600915 0.75 0.3990851 0.4097102 0.4003369 0.4961074 0.4003701 0.4072234 0.375 0.5188971 0.2864978 0.5116655 0.2863669 0.5188971 0.2864978 0.5116655 0.375 0.5 0.2862296 0.5 0.3898681 0.5 0.375 0.4112291 0.375 0.5 0.3990851 0.5 0.3898681 0.4106006 0.3898681 0.5 0.375 0.7383345 0.2769464 0.731103 0.2764354 0.7383345 0.375 0.75 0.2764354 0.7383345 0.2756226 0.75 0.3898681 0.75 0.375 0.8493774 0.3898681 0.8503687 0.3990851 0.75 0.3898681 0.8503687 0.3990851 0.8513885 0.600915 0.75 0.6009156 0.8673027 0.600915 0.75 0.4053968 0.7500017 0.4053968 0.75 0.5946033 0.7500018 0.375 0.7196032 0.625 0.5303968 0.4053968 0.5 0.625 0.5303968 0.6250019 0.7196032 0.625 0.7196032 0.5860456 0.25 0.4053968 0.4999982 0.5860456 0.25 0.375 0.5210037 0.2130712 0.5303968 0.21305 0.5210037 0.375 0.51253 0.21305 0.5210037 0.2129891 0.51253 0.375 0.5 0.2129891 0.51253 0.2128939 0.5 0.3750003 0.4999983 0.375 0.5 0.3750001 0.337894 0.4053968 0.5 0.3960037 0.4999982 0.4053968 0.4999982 0.625 0.5303968 0.6250018 0.5210037 0.6250017 0.5303968 0.625 0.5210037 0.6250017 0.5 0.6250018 0.5210037 0.625 0.5 0.61247 0.4999982 0.625 0.4999982 0.61247 0.5 0.6039963 0.4999983 0.61247 0.4999982 0.6039963 0.5 0.5946032 0.4999982 0.6039963 0.4999983 0.2130712 0.7196032 0.375 0.7289963 0.21305 0.7289963 0.21305 0.7289963 0.375 0.73747 0.212989 0.73747 0.212989 0.73747 0.375 0.75 0.2128939 0.75 0.375 0.912106 0.3960037 0.75 0.3960037 0.9122259 0.3960037 0.9122259 0.4053968 0.75 0.4053968 0.9123592 0.625 0.7196032 0.6250017 0.7289963 0.625 0.7289963 0.625 0.7289963 0.6250017 0.75 0.625 0.75 0.625 0.75 0.61247 0.7500017 0.61247 0.75 0.61247 0.75 0.6039963 0.7500018 0.6039963 0.75 0.6039963 0.75 0.5946033 0.7500018 0.5946033 0.75 0.375 0.5303968 0.2130712 0.7196032 0.2130712 0.5303968 0.4114657 0.75 0.4053973 0.75 0.4053968 0.75 0.375 0.5303968 0.375 0.7196032 0.375 0.7196032 0.375 0.5303968 0.2044739 0.5210037 0.2042335 0.5303968 0.375 0.5210037 0.2046494 0.51253 0.2044739 0.5210037 0.375 0.51253 0.2047435 0.5 0.2046494 0.51253 0.375 0.5 0.3960037 0.3297461 0.3750001 0.329743 0.3960037 0.3297451 0.3960041 0.5 0.3960041 0.3297451 0.375 0.7289963 0.1989752 0.7196033 0.1986936 0.7289963 0.375 0.73747 0.1986936 0.7289963 0.1983982 0.73747 0.375 0.75 0.1983982 0.73747 0.1981182 0.75 0.3960037 0.75 0.375 0.9268819 0.3960037 0.927119 0.4053968 0.75 0.3960037 0.927119 0.4053968 0.9272907 0.375 0.7196032 0.2042335 0.5303968 0.1989752 0.7196033 0.521019 0.5 0.5208362 0.5 0.5208362 0.5 0.5151531 0.25 0.5151523 0.25 0.5149696 0.25 0.5980436 0.5 0.5262613 0.5 0.521019 0.5 0.521019 0.5 0.521019 0.4999661 0.5903939 0.25 0.5980436 0.485621 0.5980436 0.5 0.5980436 0.5 0.3802427 0.5194538 0.3822948 0.5120092 0.37682 0.5128506 0.5151523 0.25 0.5157084 0.25 0.4179593 0.25 0.4071984 0.75 0.402353 0.75 0.4072697 0.7640891 0.5980437 0.5 0.5980436 0.5 0.521019 0.5 0.5921767 0.25 0.521019 0.4431915 0.521019 0.5 0.375 0.5120092 0.3748032 0.5120092 0.375 0.5128505 0.375 0.5 0.3739264 0.5098886 0.375 0.5120092 0.375 0.4982835 0.3916407 0.5 0.3916407 0.4968628 0.4019564 0.5 0.3931477 0.4965965 0.3916407 0.5 0.5980436 0.4761692 0.5980437 0.5 0.5980437 0.4761692 0.375 0.7371494 0.374803 0.7379909 0.375 0.7379909 0.375 0.75 0.374803 0.7379909 0.3698385 0.75 0.3916407 0.75 0.375 0.7551611 0.3916407 0.7625907 0.3916407 0.75 0.3916407 0.7625907 0.4008683 0.7668424 0.335386 0.6595793 0.375 0.6843556 0.3352202 0.6843555 0.3352202 0.6843555 0.375 0.7003759 0.3347384 0.7003759 0.375 0.75 0.331381 0.75 0.3343764 0.7243734 0.375 0.7936188 0.3900708 0.75 0.3900709 0.7946955 0.3876235 0.5426637 0.3849683 0.6258172 0.3776553 0.5307752 0.5883923 0.4513151 0.588394 0.4999999 0.5883923 0.5 0.375 0.5429795 0.335386 0.6595793 0.3353861 0.5429795 0.375 0.5296981 0.3353861 0.5429795 0.3352732 0.5296981 0.375 0.5177168 0.3352732 0.5296981 0.3349457 0.5177168 0.375 0.5 0.3349457 0.5177168 0.3344355 0.5 0.4124876 0.5 0.375 0.4594355 0.4124876 0.4587924 0.4292525 0.5 0.4124876 0.4587924 0.4292525 0.4580798 0.5707498 0.25 0.4292525 0.4580798 0.5741855 0.25 0.3273291 0.6843556 0.375 0.6595793 0.3246387 0.6595793 0.3291075 0.7003759 0.375 0.6843556 0.3273291 0.6843556 0.3306458 0.7309063 0.375 0.7003759 0.3297552 0.7230325 0.375 0.75 0.375 0.7912126 0.3772434 0.7910391 0.3776553 0.5307752 0.3849701 0.5474793 0.3876254 0.5346274 0.5883941 0.4328609 0.5883923 0.5 0.588394 0.5 0.375 0.5429795 0.3171311 0.5902102 0.375 0.6595793 0.3150486 0.5429795 0.375 0.5296981 0.3143811 0.5296981 0.3143811 0.5296981 0.375 0.5177168 0.3124454 0.5177168 0.375 0.5 0.3118892 0.5144474 0.375 0.5177168 0.4124876 0.5 0.375 0.4352982 0.375 0.5 0.4292525 0.5 0.4292525 0.4324933 0.4162961 0.4326485 0.4292525 0.5 0.5754879 0.25 0.4292525 0.4324933 0.4848592 0.5 0.5839537 0.5322048 0.375 0.7311029 0.375 0.5188971 0.2905067 0.731103 0.2905066 0.5188971 0.625 0.6099542 0.7819217 0.731103 0.625 0.7311029 0.600915 0.7944061 0.3990851 0.75 0.600915 0.75 0.625 0.6099542 0.7812053 0.5678766 0.7819217 0.6099542 0.625 0.5678766 0.7791651 0.5 0.7812053 0.5678766 0.625 0.5 0.5384889 0.3488886 0.625 0.3458351 0.4848592 0.5 0.4848592 0.3524901 0.5375205 0.3489491 0.476527 0.25 0.3990851 0.3582501 0.4814434 0.25 0.2905067 0.5116655 0.375 0.5188971 0.2905066 0.5188971 0.375 0.5 0.2905067 0.5116655 0.2905066 0.5 0.3898681 0.4155066 0.375 0.5 0.375 0.4155066 0.3990838 0.4155066 0.3990851 0.3582501 0.3990851 0.5 0.2905067 0.731103 0.375 0.7383345 0.2905065 0.7383345 0.375 0.7383345 0.2905067 0.75 0.2905065 0.7383345 0.375 0.8344932 0.3898681 0.75 0.3898681 0.8344936 0.3898681 0.75 0.3990851 0.8344934 0.3898681 0.8344936 0.7817985 0.7383345 0.625 0.7311029 0.7819217 0.731103 0.625 0.7383345 0.7814478 0.75 0.625 0.75 0.6101319 0.9059228 0.625 0.75 0.625 0.9064481 0.600915 0.905304 0.6101319 0.75 0.6101319 0.9059228 0.5839537 0.5322048 0.4848592 0.5 0.375 0.5188971 0.375 0.7311029 0.2905012 0.5188971 0.2905013 0.731103 0.625 0.6099542 0.783792 0.731103 0.7837921 0.6099542 0.5940628 1 0.5979177 1 0.600915 0.75 0.625 0.6099542 0.7838406 0.6063467 0.625 0.5678766 0.7810873 0.5 0.625 0.5678766 0.7840111 0.5678766 0.625 0.5 0.5384888 0.3476334 0.5384888 0.5 0.5384888 0.5 0.5384888 0.3476334 0.5375201 0.3477005 0.3990851 0.3571899 0.476527 0.25 0.4814778 0.25 0.375 0.5188971 0.2905012 0.5116655 0.2905012 0.5188971 0.2905012 0.5116655 0.375 0.5 0.2905013 0.5 0.375 0.4155015 0.3898681 0.5 0.3898681 0.4155019 0.3990851 0.3571895 0.3990835 0.357215 0.3990851 0.4153975 0.2905015 0.7383345 0.375 0.7311029 0.2905013 0.731103 0.375 0.75 0.2905015 0.7383345 0.2905011 0.75 0.3898681 0.75 0.375 0.8344989 0.3898681 0.834499 0.3898681 0.75 0.3990851 0.8344989 0.3990851 0.75 0.783792 0.731103 0.625 0.7383345 0.7838891 0.7383345 0.7838891 0.7383345 0.625 0.75 0.784166 0.75 0.625 0.909166 0.6101319 0.75 0.6101319 0.9095794 0.6101319 0.9095794 0.600915 0.75 0.6009141 0.9100004 0.5946033 0.9150326 0.5946033 0.9150267 0.4053968 0.9123571 0.6249998 0.5303955 0.623512 0.5210032 0.6235122 0.5210036 0.625 0.7196032 0.7904624 0.5303968 0.7904624 0.7196032 0.4053968 0.2979621 0.5916946 0.25 0.5860456 0.25 0.212896 0.5000001 0.375 0.5 0.375 0.5 0.3960037 0.5 0.375 0.3378961 0.3960037 0.3377762 0.4053968 0.5 0.3960037 0.3377762 0.4053968 0.3376434 0.625 0.5303968 0.7904413 0.5210037 0.7904624 0.5303968 0.625 0.5210037 0.7903802 0.5 0.7904413 0.5210037 0.625 0.5 0.61247 0.334715 0.625 0.3346197 0.61247 0.5 0.6039963 0.3348346 0.61247 0.334715 0.6039963 0.5 0.5946033 0.3349664 0.6039963 0.3348337 0.4053968 0.75 0.4053968 0.9123578 0.4053968 0.75 0.625 0.7196032 0.7904412 0.7289963 0.625 0.7289963 0.625 0.7289963 0.7903804 0.75 0.625 0.75 0.625 0.75 0.61247 0.9152852 0.61247 0.75 0.61247 0.75 0.6039963 0.9151654 0.6039963 0.75 0.5946033 0.9150326 0.6039963 0.75 0.6039963 0.9151654 0.5091924 0.75 0.5918707 1 0.5918713 1 0.625 0.7196032 0.375 0.7196032 0.4053968 0.75 0.7923783 0.5303968 0.625 0.7196032 0.7923783 0.7196032 0.5860455 0.25 0.5918713 0.25 0.5657738 0.25 0.375 0.5303968 0.374991 0.5210037 0.3749913 0.5303968 0.375 0.5210037 0.3749912 0.51253 0.374991 0.5210037 0.375 0.51253 0.3749914 0.5 0.3749912 0.51253 0.375 0.5 0.3960037 0.499991 0.3750001 0.499991 0.4053968 0.5 0.4053968 0.3296489 0.4053962 0.3296749 0.625 0.5210037 0.7923783 0.5303968 0.7925159 0.5210037 0.625 0.5 0.7925159 0.5210037 0.792915 0.5 0.61247 0.5 0.625 0.3320849 0.61247 0.3314633 0.6039963 0.5 0.61247 0.3314633 0.6039963 0.3306795 0.5946033 0.5 0.6039963 0.3306795 0.5946033 0.3298109 0.3749914 0.7289962 0.375 0.7196032 0.3749914 0.7196032 0.375 0.73747 0.3749914 0.7289962 0.3749911 0.73747 0.375 0.75 0.3749911 0.73747 0.3749914 0.75 0.3960037 0.75 0.375 0.7500088 0.3960037 0.750009 0.4053968 0.7500088 0.4053968 0.9272989 0.4053968 0.75 0.625 0.7289963 0.7923783 0.7196032 0.625 0.7196032 0.625 0.75 0.7925156 0.7289963 0.625 0.7289963 0.61247 0.75 0.625 0.9179148 0.625 0.75 0.6039963 0.75 0.61247 0.9185368 0.61247 0.75 0.6039963 0.9193188 0.5946033 0.75 0.5946033 0.9201936 0.375 0.7196032 0.3749913 0.5303968 0.3749914 0.7196032 0.6075075 0 0.521019 0.01879853 0.625 0.0281077 0.521019 0.25 0.521019 0.3013996 0.521019 0.305715 0.875 0.5290875 0.6841812 0.7218922 0.875 0.7218922 0.4843853 0.75 0.4918964 0.75 0.4896172 0.75 0.521019 0.25 0.521019 0.429526 0.5980435 0.3057148 0.521019 0.01879853 0.4019565 0 0.375 0.2305462 0.5062704 0.008154809 0.4949705 0 0.521019 0.01879853 0.518513 0.0157845 0.5062704 0.001060247 0.521019 0.01879853 0.521019 0.008598685 0.521019 0.004079759 0.521019 0.01879853 0.521019 0.01392912 0.521019 0.008598685 0.521019 0.01879853 0.875 0.7218922 0.6843186 0.7342341 0.875 0.734234 0.875 0.734234 0.6847099 0.75 0.875 0.75 0.625 1 0.625 0.8097098 0.6155518 0.810274 0.6151883 1 0.6075075 0.8109868 0.6075075 1 0.5385115 1 0.5309233 0.8179431 0.5309233 1 0.5309233 1 0.5309233 0.8179431 0.5217285 0.8197174 0.5133311 0.8208316 0.5082334 0.8212686 0.5062704 1 0.4949705 0.8226031 0.5062704 1 0.5062704 0.8214367 0.6075075 1 0.5385115 0.8172249 0.5385115 1 0.125 0.5120092 0.2900139 0.5194538 0.2902255 0.5120092 0.125 0.5 0.2902255 0.5120092 0.2908288 0.5 0.3916407 0.25 0.375 0.4158287 0.3916407 0.4167314 0.4019564 0.25 0.3916407 0.4167314 0.4019564 0.4177961 0.875 0.5290875 0.6843931 0.5179562 0.6841812 0.5290875 0.875 0.5179562 0.6849962 0.5 0.6843931 0.5179562 0.625 0.25 0.6083593 0.4391011 0.625 0.4400037 0.6083593 0.25 0.5980435 0.4380365 0.6083593 0.4391003 0.2900137 0.7305462 0.125 0.7379909 0.2902255 0.7379909 0.2902255 0.7379909 0.125 0.75 0.2908287 0.75 0.375 0.8341712 0.3916407 1 0.3916407 0.8332684 0.3916407 0.8332684 0.4019565 1 0.4019565 0.8322038 0.2900139 0.5194538 0.125 0.7305462 0.2900137 0.7305462 0.6075075 0 0.6198766 0.006582021 0.625 0.0281077 0.521019 0.25 0.5180357 0.5 0.5127928 0.5 0.875 0.7218922 0.682559 0.7218923 0.6822529 0.5806179 0.4843853 0.75 0.4872354 0.75 0.4881481 0.75 0.5898174 0.5 0.521019 0.25 0.5980436 0.25 0.4019565 0 0.521019 0.01879853 0.375 0.01945376 0.5062704 0.001060247 0.521019 0.01879853 0.4949705 0 0.521019 0.004079759 0.521019 0.01879853 0.5062704 0.001060247 0.521019 0.008598685 0.521019 0.01879853 0.521019 0.004079759 0.521019 0.01392912 0.521019 0.01879853 0.521019 0.008598685 0.875 0.7218922 0.6828813 0.734234 0.682559 0.7218923 0.875 0.75 0.6831187 0.75 0.6832349 0.7394573 0.6151883 1 0.6151883 0.8080061 0.6157109 0.8080124 0.6075075 1 0.6151883 0.8080061 0.6151883 1 0.5309233 0.8155215 0.5385115 1 0.5309233 1 0.5309233 1 0.521019 1 0.5272068 0.8172899 0.5062705 0.8091562 0.5126446 0.8090655 0.5126712 0.8090751 0.5004563 0.8087175 0.5006262 0.8087996 0.5006657 0.808805 0.5385115 1 0.579463 0.8080023 0.6075075 1 0.125 0.5194538 0.3045411 0.5120092 0.304541 0.5194538 0.3045411 0.5120092 0.125 0.5 0.3045409 0.5 0.3916407 0.25 0.375 0.4295409 0.375 0.25 0.3916407 0.25 0.4019564 0.4295412 0.3916407 0.4295415 0.875 0.5179562 0.682253 0.5290875 0.6822526 0.5179562 0.875 0.5 0.6822526 0.5179562 0.6822524 0.5 0.6083593 0.25 0.625 0.4427475 0.6083593 0.4427484 0.5980436 0.25 0.6083593 0.4427484 0.5980436 0.4427487 0.3045409 0.7379909 0.125 0.7305462 0.3045406 0.7305462 0.125 0.75 0.3045409 0.7379909 0.3045407 0.75 0.3916407 1 0.375 0.8204591 0.3916407 0.8204593 0.3916407 1 0.3916407 0.8204593 0.4019556 0.8204603 0.125 0.7305462 0.304541 0.5194538 0.3045406 0.7305462 0.801218 0.6739752 0.8012272 0.6746335 0.625 0.6863051 0.6143665 0.75 0.4547678 0.9243733 0.4547678 0.75 0.2382931 0.6595793 0.375 0.6843556 0.238293 0.6843556 0.375 0.6843556 0.2382932 0.7003759 0.238293 0.6843556 0.205099 0.75 0.2060883 0.7382424 0.2382921 0.7382425 0.375 0.919901 0.4329106 0.75 0.4329106 0.9228817 0.4547678 0.75 0.4329106 0.9228817 0.4329106 0.75 0.8020418 0.7051597 0.8020731 0.7079614 0.625 0.7082177 0.625 0.75 0.8020793 0.7082177 0.8025699 0.75 0.6220692 0.75 0.625 0.9275701 0.6220692 0.9279507 0.6180247 0.75 0.6220692 0.9279507 0.6180247 0.9281848 0.6143665 0.75 0.6180247 0.9281848 0.6143665 0.9282488 0.6099098 0.5218836 0.6180084 0.5562068 0.5883923 0.5 0.8000661 0.6393908 0.8001222 0.6436912 0.625 0.6532508 0.625 0.5 0.7979979 0.5 0.7981123 0.5761452 0.625 0.5 0.6099097 0.3272501 0.625 0.3270022 0.5997047 0.5 0.5997048 0.327563 0.6057744 0.3273768 0.5997047 0.5 0.5883923 0.3279083 0.5997048 0.3275651 0.375 0.5429795 0.2382931 0.6595793 0.2382929 0.5429795 0.238293 0.5296981 0.375 0.5429795 0.2382929 0.5429795 0.2382931 0.5177168 0.375 0.5296981 0.238293 0.5296981 0.375 0.5 0.2382931 0.5177168 0.2382931 0.5 0.4124876 0.363293 0.375 0.5 0.375 0.3632931 0.4292525 0.3632932 0.4124876 0.5 0.4124876 0.363293 0.5673294 0.25 0.5807616 0.25 0.5639064 0.25 0.8021669 0.6779075 0.625 0.6532508 0.801608 0.6863051 0.6143665 0.75 0.4547678 0.9221246 0.6143665 0.9266228 0.2382735 0.6843556 0.375 0.6595793 0.2382737 0.6595793 0.375 0.7003759 0.2382735 0.6843556 0.2382735 0.7003759 0.375 0.7003759 0.2382739 0.7003762 0.2382735 0.7382397 0.4329106 0.75 0.375 0.9179525 0.4329106 0.9208177 0.4329106 0.9208177 0.4547678 0.75 0.4329106 0.75 0.7996208 0.7005791 0.7998743 0.6988816 0.8004788 0.6912141 0.625 0.75 0.7999609 0.7082177 0.625 0.7082177 0.6220692 0.75 0.625 0.9257803 0.625 0.75 0.6180247 0.75 0.6220692 0.9263637 0.6220692 0.75 0.6143665 0.9266228 0.6180247 0.75 0.6143665 0.75 0.6143665 0.75 0.4292525 0.5 0.375 0.5429795 0.8069254 0.613809 0.625 0.6058937 0.8045544 0.6437072 0.8071592 0.6058937 0.807952 0.5624476 0.625 0.5 0.625 0.5 0.625 0.3163446 0.6188874 0.315911 0.6099097 0.5 0.6099097 0.3155275 0.6031023 0.31519 0.5883923 0.5 0.5997048 0.3150532 0.5883921 0.3149142 0.375 0.6595793 0.2382739 0.5429795 0.2382737 0.6595793 0.2382739 0.5429795 0.375 0.5296981 0.2382736 0.5296981 0.2382736 0.5296981 0.375 0.5177168 0.2382736 0.5177168 0.375 0.5177168 0.2382737 0.4999999 0.2382736 0.5177168 0.375 0.5 0.4124876 0.3632736 0.375 0.3632739 0.4292525 0.5 0.4124876 0.3632767 0.4124876 0.5 0.5673295 0.25 0.4292525 0.5 0.5639065 0.25 0.4053968 1 0.5946033 0.8956977 0.5946033 1 0.875 0.5303968 0.7739598 0.7196032 0.7727873 0.5303968 0.61247 0.2441947 0.6039964 0.2485123 0.5946033 0.25 0.4053968 0.25 0.5946033 0.3550333 0.4053968 0.3813358 0.125 0.5303968 0.2603547 0.5210037 0.2605614 0.5303968 0.125 0.5210037 0.2597544 0.51253 0.2603547 0.5210037 0.125 0.51253 0.2588196 0.5 0.2597544 0.51253 0.375 0.25 0.3960037 0.3826419 0.375 0.3838196 0.3960037 0.25 0.4053968 0.3813358 0.3960037 0.3826419 0.875 0.5210037 0.7727873 0.5303968 0.7725268 0.5210037 0.875 0.5 0.7725268 0.5210037 0.771886 0.5 0.61247 0.25 0.625 0.353114 0.61247 0.354071 0.61247 0.25 0.61247 0.354071 0.6114484 0.3542138 0.6039963 0.25 0.6039963 0.3540581 0.6007476 0.3541794 0.2602311 0.7289963 0.125 0.7196032 0.260442 0.7196032 0.2596191 0.73747 0.125 0.7289963 0.2602311 0.7289963 0.2586656 0.75 0.125 0.73747 0.2596191 0.73747 0.3960037 0.8675362 0.375 1 0.375 0.8663344 0.4053968 0.868868 0.3960037 1 0.3960037 0.8675362 0.7739598 0.7196032 0.875 0.7289963 0.7738158 0.7289963 0.7738158 0.7289963 0.875 0.75 0.7732799 0.75 0.625 0.8982799 0.61247 1 0.61247 0.8974061 0.6039963 1 0.6039963 0.8965416 0.6050331 0.8964163 0.5946033 1 0.5946033 0.8956977 0.6010944 0.8966178 0.2607237 0.6168841 0.2605614 0.643045 0.125 0.7196032 0.8736047 0.5062673 0.8726611 0.5065597 0.875 0.5046022 0.8726611 0.5065597 0.8716151 0.5066604 0.875 0.5046022 0.8716151 0.5066604 0.625 0.5066604 0.6247739 0.5046021 0.6247739 0.5046021 0.875 0.5046022 0.8716151 0.5066604 0.875 0.5046022 0.8748343 0.5052382 0.8743537 0.505812 0.5179039 0.7514989 0.5263075 0.7502395 0.5017627 0.75 0.5263075 0.7502395 0.527464 0.750061 0.5017627 0.75 0.527464 0.750061 0.5278533 0.75 0.5017627 0.75 0.5278533 0.75 0.5278533 0.75 0.520886 0.75 0.5017627 0.75 0.5278533 0.75 0.375 0.75 0.520886 0.75 0.375 0.75 0.5278533 0.75 0.375 0.75 0.375 0.75 0.5017627 0.75 0.8716151 0.5066604 0.8716151 0.7433397 0.625 0.7433397 0.375 0.625 0.375 0.75 0.125 0.75 0.6236242 0.5027455 0.6246475 0.5046022 0.625 0.5066604 0.625 0.5066604 0.625 0.7433397 0.6144427 0.62336 0.625 0.7433397 0.6246474 0.7453979 0.6236242 0.7472545 0.6144427 0.62336 0.625 0.7433397 0.6143888 0.6735206 0.6236242 0.7472545 0.6220304 0.7487279 0.625 0.7433397 0.6220304 0.7487279 0.6200222 0.749674 0.625 0.7433397 0.6200222 0.749674 0.6177962 0.75 0.625 0.7433397 0.5314134 0.75 0.5407 0.7368219 0.5417345 0.7388125 0.5314134 0.75 0.5417345 0.7388125 0.5429478 0.7399767 0.6177962 0.75 0.5314134 0.75 0.5442153 0.7401922 0.6097298 0.7249436 0.6177962 0.75 0.5442153 0.7401922 0.6220305 0.501272 0.6236242 0.5027455 0.625 0.5066604 0.6177961 0.5 0.6200223 0.500326 0.625 0.5066604 0.6200223 0.500326 0.6220305 0.501272 0.625 0.5066604 0.5416076 0.508128 0.5405647 0.5101309 0.5314134 0.5 0.5428276 0.5069536 0.5416076 0.508128 0.5314134 0.5 0.5314134 0.5 0.6177961 0.5 0.5440989 0.5067323 0.609646 0.5217815 0.6177961 0.5 0.6113222 0.5231084 0.6143888 0.6735206 0.625 0.7433397 0.6142011 0.7121073 0.614157 0.5346062 0.625 0.5066604 0.6143736 0.5731982 0.5314134 0.75 0.5429478 0.7399767 0.5442153 0.7401922 0.5440989 0.5067323 0.5428276 0.5069536 0.5314134 0.5 0.609646 0.5217815 0.5440989 0.5067323 0.6177961 0.5 0.6177962 0.75 0.6097298 0.7249436 0.6114003 0.7236094 0.6177962 0.75 0.6114003 0.7236094 0.625 0.7433397 0.6113222 0.5231084 0.6177961 0.5 0.625 0.5066604 0.6114003 0.7236094 0.6128443 0.7206969 0.625 0.7433397 0.6128443 0.7206969 0.6138287 0.7166544 0.625 0.7433397 0.6127781 0.5260166 0.6113222 0.5231084 0.625 0.5066604 0.6137753 0.5300582 0.6127781 0.5260166 0.625 0.5066604 0.6138287 0.7166544 0.6142011 0.7121073 0.625 0.7433397 0.614157 0.5346062 0.6137753 0.5300582 0.625 0.5066604 0.5399494 0.7342052 0.5407 0.7368219 0.5314134 0.75 0.5314134 0.75 0.5303372 0.6249999 0.5373846 0.6871948 0.5303372 0.6249999 0.5314134 0.5 0.5372307 0.5597922 0.5376251 0.5899936 0.5303372 0.6249999 0.5373315 0.5810676 0.5314134 0.5 0.5405647 0.5101309 0.5398063 0.5127591 0.5314134 0.5 0.5398063 0.5127591 0.5394063 0.5157558 0.5395545 0.7312163 0.5399494 0.7342052 0.5314134 0.75 0.5379909 0.7061529 0.5395545 0.7312163 0.5314134 0.75 0.5314134 0.5 0.5394063 0.5157558 0.5378339 0.5408348 0.5314134 0.5 0.5378339 0.5408348 0.5374489 0.5495162 0.5376052 0.6974715 0.5379909 0.7061529 0.5314134 0.75 0.5373846 0.6871948 0.5376052 0.6974715 0.5314134 0.75 0.5314134 0.5 0.5374489 0.5495162 0.5372307 0.5597922 0.5372307 0.5597922 0.5371932 0.5706621 0.5303372 0.6249999 0.5373432 0.6763231 0.5373846 0.6871948 0.5303372 0.6249999 0.5374761 0.6659159 0.5373432 0.6763231 0.5303372 0.6249999 0.5371932 0.5706621 0.5373315 0.5810676 0.5303372 0.6249999 0.5376251 0.5899936 0.5379955 0.5983701 0.5303372 0.6249999 0.5379955 0.5983701 0.5383835 0.6084125 0.5303372 0.6249999 0.5377622 0.656988 0.5374761 0.6659159 0.5303372 0.6249999 0.5381201 0.6486093 0.5377622 0.656988 0.5303372 0.6249999 0.5386514 0.6184616 0.5303372 0.6249999 0.5383835 0.6084125 0.5386514 0.6184616 0.5386923 0.6285142 0.5303372 0.6249999 0.5386923 0.6285142 0.5384811 0.6385648 0.5303372 0.6249999 0.6119105 0.7601179 0.611514 0.7593786 0.6177962 0.75 0.611514 0.7593786 0.6106946 0.7579194 0.6177962 0.75 0.6106946 0.7579194 0.6089379 0.756473 0.6177962 0.75 0.6177962 0.75 0.6124233 0.7941811 0.6123399 0.7625864 0.6102528 0.968803 0.6130611 0.9566325 0.6177962 1 0.6177962 1 0.5881383 0.9876922 0.5884171 0.9876403 0.6015034 0.9802527 0.6102528 0.968803 0.6177962 1 0.605996 0.913747 0.5982364 0.9154332 0.6038157 0.9057009 0.5982364 0.9154332 0.5962396 0.9074881 0.6038157 0.9057009 0.6063808 0.9136633 0.605996 0.913747 0.605996 0.913747 0.6063808 0.9136633 0.605996 0.913747 0.6038157 0.9057009 0.6063808 0.9136633 0.6038157 0.9057009 0.6065348 0.9045375 0.6090371 0.9135216 0.6063808 0.9136633 0.6065348 0.9045375 0.6090371 0.9135216 0.6065348 0.9045375 0.6089885 0.9024608 0.6112888 0.914288 0.6090371 0.9135216 0.6089885 0.9024608 0.6112888 0.914288 0.6089885 0.9024608 0.6109361 0.8996672 0.6127938 0.9158546 0.6112888 0.914288 0.6109361 0.8996672 0.6127938 0.9158546 0.6109361 0.8996672 0.6121865 0.8964428 0.6133221 0.9179787 0.6127938 0.9158546 0.6121865 0.8964428 0.6133221 0.9179787 0.6121865 0.8964428 0.6126172 0.8931227 0.6177962 1 0.6130611 0.9566325 0.6133245 0.9554893 0.6133221 0.9179787 0.6126172 0.8931227 0.6177962 0.75 0.6126172 0.8931227 0.612604 0.8288019 0.6177962 0.75 0.6177962 1 0.6133245 0.9554893 0.6133221 0.9179787 0.6124233 0.7941811 0.6177962 0.75 0.6124237 0.8058942 0.6177962 0.75 0.6177962 1 0.6133221 0.9179787 0.6124237 0.8058942 0.6177962 0.75 0.612604 0.8288019 0.6118301 0.8086977 0.6124237 0.8058942 0.6121706 0.8258029 0.6124237 0.8058942 0.612604 0.8288019 0.6121706 0.8258029 0.6101374 0.8116515 0.6118301 0.8086977 0.6109144 0.8234906 0.6118301 0.8086977 0.6121706 0.8258029 0.6109144 0.8234906 0.6076047 0.814294 0.6101374 0.8116515 0.6089583 0.8221038 0.6101374 0.8116515 0.6109144 0.8234906 0.6089583 0.8221038 0.6030992 0.8169599 0.6030992 0.8169599 0.6046173 0.8162293 0.6046173 0.8162293 0.6076047 0.814294 0.6064937 0.8217775 0.6076047 0.814294 0.6089583 0.8221038 0.6064937 0.8217775 0.6037628 0.8225322 0.6030992 0.8169599 0.6037628 0.8225322 0.6030992 0.8169599 0.6046173 0.8162293 0.6037628 0.8225322 0.5442775 0.7763577 0.5417143 0.778307 0.5425823 0.7745711 0.5376451 0.7561698 0.5373907 0.7564644 0.5369746 0.756601 0.5369746 0.756601 0.5369046 0.7566232 0.5376451 0.7561698 0.5369046 0.7566232 0.5278533 0.7524455 0.5314134 0.75 0.5314134 0.75 0.5966627 0.7561944 0.5829427 0.7559984 0.5802737 0.7562138 0.5791041 0.7564685 0.5654501 0.7559099 0.5791041 0.7564685 0.5659672 0.7562085 0.5658642 0.7561247 0.5314134 0.75 0.5829427 0.7559984 0.5644349 0.7556372 0.5829427 0.7559984 0.5802737 0.7562138 0.5644349 0.7556372 0.5314134 0.75 0.5644349 0.7556372 0.5639337 0.7556056 0.5369046 0.7566232 0.5314134 0.75 0.5376451 0.7561698 0.5791041 0.7564685 0.5658642 0.7561247 0.5654501 0.7559099 0.5395621 0.7555323 0.5376451 0.7561698 0.5314134 0.75 0.5423319 0.7554451 0.5395621 0.7555323 0.5314134 0.75 0.5802737 0.7562138 0.5654501 0.7559099 0.5649576 0.755742 0.5802737 0.7562138 0.5649576 0.755742 0.5644349 0.7556372 0.5361303 0.7575547 0.535887 0.7578421 0.5365223 0.7570865 0.5365223 0.7570865 0.5364949 0.75712 0.5363616 0.7572796 0.5463999 0.9182624 0.5463999 0.9182624 0.5491118 0.9180531 0.5491118 0.9180531 0.547899 0.9260615 0.5463999 0.9182624 0.547899 0.9260615 0.545251 0.9269917 0.5463999 0.9182624 0.545251 0.9269917 0.5430068 0.9285057 0.5463999 0.9182624 0.5463999 0.9182624 0.5430068 0.9285057 0.5463999 0.9182624 0.5430068 0.9285057 0.5415076 0.9303657 0.5420135 0.916257 0.5463999 0.9182624 0.5430068 0.9285057 0.5439541 0.9176389 0.5439541 0.9176389 0.5430068 0.9285057 0.5420135 0.916257 0.5420135 0.916257 0.5415076 0.9303657 0.5407674 0.9142442 0.5415076 0.9303657 0.5409815 0.9322939 0.5407674 0.9142442 0.5407674 0.9142442 0.5409815 0.9322939 0.5403375 0.9117786 0.5409815 0.9322939 0.5409899 0.9855949 0.5278533 1 0.5409815 0.9322939 0.5278533 1 0.5403375 0.9117786 0.5465829 0.8430813 0.5489922 0.8474409 0.5462934 0.8490693 0.5436308 0.8440347 0.5465829 0.8430813 0.5462934 0.8490693 0.5436308 0.8440347 0.5462934 0.8490693 0.5438632 0.8513576 0.5394555 0.8431345 0.5397518 0.8432936 0.5419376 0.8540719 0.5397518 0.8432936 0.5411285 0.8440505 0.5419376 0.8540719 0.5411285 0.8440505 0.5436308 0.8440347 0.5438632 0.8513576 0.5411285 0.8440505 0.5438632 0.8513576 0.5419376 0.8540719 0.5394555 0.8431345 0.5419376 0.8540719 0.540704 0.8569489 0.5393883 0.8429387 0.5394555 0.8431345 0.5402827 0.8597183 0.5394555 0.8431345 0.540704 0.8569489 0.5402827 0.8597183 0.5393883 0.8429387 0.5402827 0.8597183 0.5278533 1 0.5402827 0.8597183 0.5403375 0.9117786 0.5278533 1 0.5430197 0.9889008 0.5452676 0.9898982 0.5278533 1 0.5278533 1 0.5278533 0.7524455 0.5393883 0.8429387 0.5278533 0.7524455 0.5358881 0.7620933 0.5371272 0.768575 0.5376852 0.7731825 0.5278533 0.7524455 0.5371272 0.768575 0.5278533 0.7524455 0.5376852 0.7731825 0.5381748 0.7834566 0.5415176 0.9873942 0.5430197 0.9889008 0.5278533 1 0.5409899 0.9855949 0.5415176 0.9873942 0.5278533 1 0.5390288 0.7750232 0.5392848 0.7750528 0.5395947 0.7807059 0.5392848 0.7750528 0.5404258 0.7751809 0.5395947 0.7807059 0.5421559 0.77478 0.5425823 0.7745711 0.5417143 0.778307 0.5404258 0.7751809 0.5421559 0.77478 0.5417143 0.778307 0.5404258 0.7751809 0.5417143 0.778307 0.5395947 0.7807059 0.5390288 0.7750232 0.5395947 0.7807059 0.5382207 0.7832061 0.5380922 0.7743303 0.5390288 0.7750232 0.5382207 0.7832061 0.5380922 0.7743303 0.5382207 0.7832061 0.5376852 0.7731825 0.5382207 0.7832061 0.5381748 0.7834566 0.5376852 0.7731825 0.5489923 0.8474408 0.5489923 0.8474408 0.5489922 0.8474409 0.5489922 0.8474409 0.5528185 0.8402186 0.5489923 0.8474408 0.5528185 0.8402186 0.6030992 0.8169599 0.5771957 0.8346799 0.5456411 0.775511 0.5456409 0.7755113 0.5442775 0.7763577 0.5442775 0.7763577 0.5440358 0.773859 0.5456411 0.775511 0.5440358 0.773859 0.5619103 0.7627874 0.5456411 0.775511 0.5619103 0.7627874 0.5619105 0.7627873 0.5630411 0.762084 0.5619103 0.7627874 0.5630411 0.762084 0.5684695 0.7613384 0.5456411 0.775511 0.5619103 0.7627874 0.5684695 0.7613384 0.568723 0.7611768 0.5684695 0.7613384 0.5653389 0.760058 0.5630411 0.762084 0.5642883 0.7611557 0.5684695 0.7613384 0.5684695 0.7613384 0.5642883 0.7611557 0.5646255 0.7608035 0.5646255 0.7608035 0.5646396 0.7607888 0.5684695 0.7613384 0.5646396 0.7607888 0.5653389 0.760058 0.5684695 0.7613384 0.5714635 0.759586 0.5714296 0.7596046 0.5714838 0.7595747 0.5714296 0.7596046 0.5699065 0.7604277 0.5714838 0.7595747 0.5699065 0.7604277 0.568723 0.7611768 0.5653389 0.760058 0.5653389 0.760058 0.5657786 0.7593758 0.5699065 0.7604277 0.5657786 0.7593758 0.5657799 0.7593739 0.5699065 0.7604277 0.5714891 0.759572 0.5714876 0.7595728 0.5699065 0.7604277 0.5714876 0.7595728 0.5714838 0.7595747 0.5699065 0.7604277 0.5746592 0.7580618 0.5746526 0.7580646 0.5663875 0.7575593 0.5746526 0.7580646 0.5730948 0.7586963 0.5663875 0.7575593 0.5767653 0.7571943 0.5746592 0.7580618 0.5663189 0.7569404 0.5664106 0.7577807 0.5730948 0.7586963 0.5664158 0.7578355 0.5730948 0.7586963 0.5714891 0.759572 0.5661584 0.7586578 0.5714891 0.759572 0.5699065 0.7604277 0.5660771 0.7589097 0.5660771 0.7589097 0.5699065 0.7604277 0.5657806 0.7593726 0.5657806 0.7593726 0.5657808 0.7593725 0.5660771 0.7589097 0.5699065 0.7604277 0.5657799 0.7593739 0.5657806 0.7593726 0.5660771 0.7589097 0.5661582 0.7586578 0.5661584 0.7586578 0.5714891 0.759572 0.5660771 0.7589097 0.5661584 0.7586578 0.578497 0.756688 0.5772535 0.7570546 0.5791041 0.7564685 0.5772535 0.7570546 0.5767653 0.7571943 0.5659825 0.7562332 0.5663875 0.7575593 0.5730948 0.7586963 0.5664007 0.7576855 0.5730948 0.7586963 0.5664106 0.7577807 0.5664007 0.7576855 0.5664158 0.7578355 0.5730948 0.7586963 0.5662799 0.7582735 0.5661584 0.7586578 0.5662799 0.7582735 0.5730948 0.7586963 0.5659672 0.7562085 0.5791041 0.7564685 0.5772535 0.7570546 0.5660976 0.7564154 0.5660642 0.7563652 0.5659825 0.7562332 0.5659825 0.7562332 0.5659672 0.7562085 0.5772535 0.7570546 0.5746592 0.7580618 0.5663407 0.7571191 0.5663189 0.7569404 0.5746592 0.7580618 0.5663875 0.7575593 0.5663407 0.7571191 0.5660976 0.7564154 0.5659825 0.7562332 0.5767653 0.7571943 0.5661801 0.7566103 0.566172 0.7565909 0.566154 0.7565482 0.566154 0.7565482 0.5660976 0.7564154 0.5767653 0.7571943 0.5767653 0.7571943 0.5663189 0.7569404 0.5661801 0.7566103 0.6064919 0.7559792 0.5966627 0.7561944 0.6177962 0.75 0.5966627 0.7561944 0.5314134 0.75 0.6177962 0.75 0.6177962 0.75 0.6089379 0.756473 0.6088231 0.756417 0.5355687 0.7597064 0.5358881 0.7620933 0.5278533 0.7524455 0.5278533 0.7524455 0.5369046 0.7566232 0.5365223 0.7570865 0.535887 0.7578421 0.5355687 0.7597064 0.5278533 0.7524455 0.549112 0.9180531 0.5962396 0.9074881 0.547899 0.9260615 0.5962396 0.9074881 0.5982364 0.9154332 0.547899 0.9260615 0.5729843 0.9900903 0.5881383 0.9876922 0.6177962 1 0.5278533 1 0.5452676 0.9898982 0.5479192 0.9902285 0.5479192 0.9902285 0.5483035 0.9902265 0.5483039 0.9902265 0.5483039 0.9902265 0.5729843 0.9900903 0.5278533 1 0.5729843 0.9900903 0.6177962 1 0.5278533 1 0.5278533 0.7524455 0.5278533 1 0.375 0.75 0.5278533 1 0.375 1 0.375 0.75 0.5479179 0.2597714 0.5452662 0.2601017 0.5278533 0.25 0.5278533 0.25 0.6177961 0.25 0.5729831 0.2599095 0.6177961 0.25 0.5881366 0.2623076 0.5729831 0.2599095 0.5483021 0.2597735 0.5479179 0.2597714 0.5483025 0.2597735 0.5479179 0.2597714 0.5278533 0.25 0.5483025 0.2597735 0.5649413 0.4896572 0.5646326 0.4893381 0.5692908 0.489241 0.5649413 0.4896572 0.5692908 0.489241 0.5699051 0.4896246 0.5730397 0.4912947 0.5735093 0.491479 0.5649413 0.4896572 0.54395 0.3323618 0.54395 0.3323618 0.5414976 0.3196316 0.54395 0.3323618 0.54395 0.3323618 0.5414976 0.3196316 0.5478885 0.3239358 0.5495002 0.3320393 0.549108 0.331949 0.5452405 0.3230056 0.5478885 0.3239358 0.546396 0.3317389 0.5478885 0.3239358 0.549108 0.331949 0.546396 0.3317389 0.5429965 0.3214916 0.5452405 0.3230056 0.54395 0.3323618 0.5452405 0.3230056 0.546396 0.3317389 0.54395 0.3323618 0.5414976 0.3196316 0.5429965 0.3214916 0.54395 0.3323618 0.5409718 0.3177037 0.5414976 0.3196316 0.5407627 0.3357554 0.5414976 0.3196316 0.54395 0.3323618 0.5420089 0.3337432 0.5414976 0.3196316 0.5420089 0.3337432 0.5407627 0.3357554 0.5409718 0.3177037 0.5407627 0.3357554 0.5403327 0.3382208 0.5409879 0.264405 0.5409718 0.3177037 0.5278533 0.25 0.5409718 0.3177037 0.5403327 0.3382208 0.5278533 0.25 0.5278533 0.25 0.5452662 0.2601017 0.5430181 0.2610991 0.6088337 0.4936041 0.6088986 0.4935437 0.6177961 0.5 0.6065828 0.494154 0.6088337 0.4936041 0.6177961 0.5 0.5278533 0.25 0.5430181 0.2610991 0.5415158 0.2626056 0.5278533 0.25 0.5415158 0.2626056 0.5409879 0.264405 0.6065828 0.494154 0.6177961 0.5 0.5829352 0.4941037 0.6177961 0.5 0.5314134 0.5 0.5639041 0.4944021 0.5829352 0.4941037 0.6177961 0.5 0.5643905 0.4943642 0.5643905 0.4943642 0.6177961 0.5 0.5639041 0.4944021 0.5278533 0.4975544 0.5278533 0.25 0.5402741 0.3902778 0.5278533 0.25 0.5403327 0.3382208 0.5402741 0.3902778 0.5800798 0.4937235 0.5829352 0.4941037 0.5643905 0.4943642 0.5765777 0.4927099 0.5768262 0.49278 0.5656417 0.4937479 0.5768262 0.49278 0.5800798 0.4937235 0.5656417 0.4937479 0.5656417 0.4937479 0.5800798 0.4937235 0.5653063 0.4940214 0.5735093 0.491479 0.5747236 0.4919605 0.5660918 0.492653 0.5747236 0.4919605 0.5749984 0.4920703 0.5660918 0.492653 0.5735093 0.491479 0.5661482 0.4921088 0.5661564 0.492022 0.5649413 0.4896572 0.5735093 0.491479 0.5650711 0.4897929 0.5661482 0.4921088 0.5735093 0.491479 0.5661407 0.4921792 0.5650711 0.4897929 0.5735093 0.491479 0.5658174 0.4909507 0.5749984 0.4920703 0.5765777 0.4927099 0.5660633 0.4929128 0.5800798 0.4937235 0.5643905 0.4943642 0.5648745 0.4942334 0.5278533 0.4975544 0.5402741 0.3902778 0.5402242 0.4090698 0.5402741 0.3902778 0.5406954 0.3930469 0.5402242 0.4090698 0.5658174 0.4909507 0.5735093 0.491479 0.566061 0.491721 0.5661564 0.492022 0.566061 0.491721 0.5735093 0.491479 0.5406954 0.3930469 0.5419287 0.3959235 0.5408292 0.4073448 0.5402242 0.4090698 0.5406954 0.3930469 0.5408292 0.4073448 0.5660918 0.492653 0.5661407 0.4921792 0.5735093 0.491479 0.548983 0.4025546 0.548983 0.4025546 0.5808401 0.4227006 0.548983 0.4025546 0.548983 0.4025546 0.5808401 0.4227006 0.548983 0.4025546 0.6037597 0.4274661 0.5808401 0.4227006 0.6037597 0.4274661 0.6024813 0.4327556 0.5808401 0.4227006 0.5807875 0.4226764 0.5807875 0.4226764 0.5479855 0.4073793 0.548983 0.4025546 0.5808401 0.4227006 0.5807875 0.4226764 0.5462843 0.4009261 0.548983 0.4025546 0.5479855 0.4073793 0.548983 0.4025546 0.5807875 0.4226764 0.5479855 0.4073793 0.5438541 0.398638 0.5462843 0.4009261 0.5450252 0.4064297 0.5462843 0.4009261 0.5479855 0.4073793 0.5450252 0.4064297 0.5660633 0.4929128 0.5660827 0.4927334 0.5749984 0.4920703 0.5660827 0.4927334 0.5660918 0.492653 0.5749984 0.4920703 0.5658472 0.4934387 0.5659238 0.4932532 0.5765777 0.4927099 0.5659238 0.4932532 0.5659283 0.4932426 0.5765777 0.4927099 0.5659283 0.4932426 0.5660633 0.4929128 0.5765777 0.4927099 0.5419287 0.3959235 0.5438541 0.398638 0.5425127 0.4064201 0.5438541 0.398638 0.5450252 0.4064297 0.5425127 0.4064201 0.5656417 0.4937479 0.565644 0.4937441 0.5656704 0.4937047 0.5656704 0.4937047 0.5658472 0.4934387 0.5765777 0.4927099 0.5419287 0.3959235 0.5425127 0.4064201 0.5408292 0.4073448 0.5656417 0.4937479 0.5656704 0.4937047 0.5765777 0.4927099 0.5278533 0.4975544 0.5402242 0.4090698 0.539076 0.4653462 0.5648745 0.4942334 0.5653063 0.4940214 0.5800798 0.4937235 0.5278533 0.4975544 0.539076 0.4653462 0.537675 0.4767428 0.539076 0.4653462 0.539501 0.4675887 0.5380825 0.4755959 0.539076 0.4653462 0.5380825 0.4755959 0.537675 0.4767428 0.539501 0.4675887 0.5408697 0.4701024 0.5390033 0.4748971 0.5380825 0.4755959 0.539501 0.4675887 0.5390033 0.4748971 0.5692908 0.489241 0.5646326 0.4893381 0.5640107 0.4886934 0.5627346 0.4877397 0.5615737 0.487008 0.5615735 0.4870079 0.5692908 0.489241 0.5640107 0.4886934 0.5627346 0.4877397 0.5455109 0.4744701 0.5692908 0.489241 0.5615735 0.4870079 0.5692908 0.489241 0.5627346 0.4877397 0.5615735 0.4870079 0.5429627 0.4725069 0.5455109 0.4744701 0.5438663 0.4760021 0.5455109 0.4744701 0.5615735 0.4870079 0.5438663 0.4760021 0.5423364 0.4945384 0.5639041 0.4944021 0.5314134 0.5 0.539546 0.4944357 0.5423364 0.4945384 0.5314134 0.5 0.5408697 0.4701024 0.5429627 0.4725069 0.5403642 0.4747259 0.5429627 0.4725069 0.5438663 0.4760021 0.5420408 0.4751062 0.5429627 0.4725069 0.5420408 0.4751062 0.5403642 0.4747259 0.539546 0.4944357 0.5314134 0.5 0.5376089 0.4937777 0.5314134 0.5 0.5278533 0.4975544 0.5368661 0.4933161 0.5376089 0.4937777 0.5314134 0.5 0.5368661 0.4933161 0.5368661 0.4933161 0.5373488 0.4934732 0.5376089 0.4937777 0.5408697 0.4701024 0.5403642 0.4747259 0.5390033 0.4748971 0.5363464 0.492689 0.5368661 0.4933161 0.5278533 0.4975544 0.5358502 0.4920964 0.5363464 0.492689 0.5278533 0.4975544 0.5355392 0.4902338 0.5358502 0.4920964 0.5278533 0.4975544 0.5358597 0.4878427 0.5355392 0.4902338 0.5278533 0.4975544 0.6030922 0.4330435 0.6024813 0.4327556 0.6037597 0.4274661 0.6030922 0.4330435 0.6037597 0.4274661 0.6037597 0.4274661 0.6046105 0.4337735 0.6030923 0.4330435 0.6030922 0.4330435 0.6046105 0.4337735 0.6030922 0.4330435 0.6037597 0.4274661 0.6046105 0.4337735 0.6037597 0.4274661 0.6064911 0.4282211 0.6075986 0.4357075 0.6046105 0.4337735 0.6064911 0.4282211 0.6075986 0.4357075 0.6064911 0.4282211 0.6089562 0.4278954 0.6101322 0.4383488 0.6075986 0.4357075 0.6089562 0.4278954 0.6101322 0.4383488 0.6089562 0.4278954 0.6109129 0.4265087 0.6118254 0.4413015 0.6101322 0.4383488 0.6109129 0.4265087 0.6118254 0.4413015 0.6109129 0.4265087 0.6121693 0.4241968 0.6124188 0.4440991 0.6118254 0.4413015 0.6121693 0.4241968 0.6124188 0.4440991 0.6121693 0.4241968 0.6126028 0.4211977 0.612329 0.4873743 0.6124188 0.4440991 0.6177961 0.5 0.6124188 0.4440991 0.6126028 0.4211977 0.6177961 0.5 0.6177961 0.5 0.6088986 0.4935437 0.6106855 0.492062 0.5884152 0.2623596 0.5881366 0.2623076 0.6177961 0.25 0.6015009 0.2697471 0.5884152 0.2623596 0.6177961 0.25 0.6177961 0.5 0.6106855 0.492062 0.6119014 0.4898529 0.6177961 0.5 0.6119014 0.4898529 0.612329 0.4873743 0.6102492 0.2811966 0.6015009 0.2697471 0.6177961 0.25 0.613322 0.2945102 0.6102492 0.2811966 0.6177961 0.25 0.6177961 0.25 0.6177961 0.5 0.6133195 0.3320216 0.6177961 0.5 0.6126028 0.4211977 0.6126163 0.3568782 0.6133195 0.3320216 0.6177961 0.5 0.6126163 0.3568782 0.6133195 0.3320216 0.613322 0.2945102 0.6177961 0.25 0.6127908 0.3341459 0.6133195 0.3320216 0.6121854 0.3535583 0.6133195 0.3320216 0.6126163 0.3568782 0.6121854 0.3535583 0.6112852 0.3357122 0.6127908 0.3341459 0.610935 0.3503346 0.6127908 0.3341459 0.6121854 0.3535583 0.610935 0.3503346 0.6090321 0.3364781 0.6112852 0.3357122 0.6089873 0.3475425 0.6112852 0.3357122 0.610935 0.3503346 0.6089873 0.3475425 0.6059895 0.3362513 0.6059895 0.3362513 0.6063748 0.3363352 0.6063748 0.3363352 0.6090321 0.3364781 0.606534 0.3454677 0.6090321 0.3364781 0.6089873 0.3475425 0.606534 0.3454677 0.6038146 0.3443064 0.6059895 0.3362513 0.6038146 0.3443064 0.6059895 0.3362513 0.6063748 0.3363352 0.6038146 0.3443064 0.5478885 0.3239358 0.6059895 0.3362513 0.6038146 0.3443064 0.5278533 0.125 0.5278533 0.25 0.375 0.25 0.375 0.5 0.5017627 0.5 0.5017627 0.6164405 0.5278533 0.625 0.5278533 0.6171028 0.5278533 0.625 0.5278533 0.6171028 0.5278533 0.5 0.5278533 0.625 0.5278533 0.6328686 0.5278533 0.75 0.527464 0.750061 0.6247739 0.5046021 0.625 0.5 0.875 0.5 0.625 0.5 0.6220305 0.5 0.6220305 0.25 0.6220305 0.5 0.6200222 0.5 0.6200222 0.25 0.6200222 0.5 0.6177961 0.5 0.6177961 0.25 0.5404615 0.1094368 0.5404623 0.1302692 0.5278533 0.125 0.6177961 0 0.6076307 0.01786434 0.6067532 0.01755583 0.6177961 0 0.6067532 0.01755583 0.6047942 0.01687401 0.5404615 0.1094368 0.5278533 0.125 0.5404614 0.1090836 0.5278533 0.125 0.5278533 0 0.5404323 0.04849159 0.5404323 0.04849159 0.5404614 0.1090836 0.5278533 0.125 0.5278533 0 0.6177961 0 0.5492928 0.02335846 0.6177961 0 0.6047942 0.01687401 0.5492928 0.02335846 0.5408613 0.04098075 0.5404323 0.04849159 0.5278533 0 0.5421182 0.03411996 0.5408613 0.04098075 0.5278533 0 0.5278533 0 0.5492928 0.02335846 0.5465497 0.02485078 0.5440785 0.02856355 0.5421182 0.03411996 0.5278533 0 0.6076307 0.01786434 0.6177961 0 0.607952 0.01828879 0.6177961 0 0.6200222 3.25978e-4 0.6236242 0.002745449 0.6200222 3.25978e-4 0.6220304 0.001271963 0.6236242 0.002745449 0.6236242 0.002745449 0.6246474 0.004602134 0.6177961 0 0.6246474 0.004602134 0.6246475 0.2453978 0.6141995 0.2051561 0.6246475 0.2453978 0.6236242 0.2472545 0.6220304 0.2487279 0.6220304 0.2487279 0.6200222 0.249674 0.6177961 0.25 0.5278533 0.25 0.5278533 0.125 0.5404344 0.1991226 0.5278533 0.125 0.5404623 0.1302692 0.5404344 0.1991226 0.6220304 0.2487279 0.6177961 0.25 0.6246475 0.2453978 0.6177961 0.25 0.5278533 0.25 0.5493006 0.2242265 0.6048531 0.2305546 0.6177961 0.25 0.5493006 0.2242265 0.6246474 0.004602134 0.6141995 0.2051561 0.614192 0.04225939 0.6141995 0.2051561 0.6246475 0.2453978 0.6137233 0.213224 0.6102535 0.02134746 0.607952 0.01828879 0.6246474 0.004602134 0.6246474 0.004602134 0.607952 0.01828879 0.6177961 0 0.5278533 0.25 0.5404344 0.1991226 0.5408638 0.2066322 0.5278533 0.25 0.5408638 0.2066322 0.5421216 0.2134892 0.6123573 0.02697914 0.6102535 0.02134746 0.6246474 0.004602134 0.6137105 0.03419029 0.6123573 0.02697914 0.6246474 0.004602134 0.5278533 0.25 0.5421216 0.2134892 0.544083 0.2190389 0.5278533 0.25 0.544083 0.2190389 0.5465558 0.2227429 0.614192 0.04225939 0.6137105 0.03419029 0.6246474 0.004602134 0.5278533 0.25 0.5465558 0.2227429 0.5493006 0.2242265 0.6137233 0.213224 0.6246475 0.2453978 0.6123813 0.2204344 0.6123813 0.2204344 0.6246475 0.2453978 0.6102948 0.2260666 0.6177961 0.25 0.6048531 0.2305546 0.6067061 0.229903 0.6177961 0.25 0.6067061 0.229903 0.6076876 0.2295546 0.6102948 0.2260666 0.6246475 0.2453978 0.6099811 0.2264886 0.6076876 0.2295546 0.6099811 0.2264886 0.6246475 0.2453978 0.6247739 0.7453978 0.875 0.7453979 0.875 0.75 0.625 0.75 0.625 1 0.6220305 1 0.6220305 0.75 0.6220305 1 0.6200222 1 0.6200222 0.75 0.6200222 1 0.6177962 1 0.5278533 0.6328686 0.5278533 0.625 0.5278533 0.625 0.5278533 0.625 0.5278533 0.75 0.5278533 0.75 0.8716151 0.5066604 0.8726611 0.5065597 0.8726611 0.7434405 0.8726611 0.5065597 0.875 0.5066604 0.875 0.7433397 0.625 0.2433397 0.6248547 0.2441881 0.6248546 0.00581187 0.6248547 0.2441881 0.6247565 0.2447618 0.6247563 0.005238115 0.6247565 0.2447618 0.6246475 0.2453978 0.6246474 0.004602134 0.8743535 0.7441881 0.8748344 0.7447618 0.875 0.7453979 0.875 0.7453979 0.6247739 0.7453978 0.8716151 0.7433397 0.6247739 0.7453978 0.625 0.7433397 0.8716151 0.7433397 0.8716151 0.7433397 0.8726611 0.7434405 0.875 0.7453979 0.8726611 0.7434405 0.8736047 0.7437328 0.875 0.7453979 0.5278533 0.6171028 0.5274639 0.6168929 0.5274638 0.4999321 0.5263071 0.6166852 0.5179041 0.6163692 0.5179042 0.4983208 0.5179041 0.6163692 0.5100396 0.6164203 0.5100397 0.4995697 0.5100396 0.6164203 0.5017627 0.6164405 0.5017627 0.5 0.375 0.6164424 0.375 0.625 0.375 0.5 0.375 0.625 0.375 0.625 0.375 0.5 0.375 0.625 0.375 0.6335383 0.375 0.75 0.375 0.75 0.375 0.75 0.375 0.625 0.5100396 0.6335111 0.5100395 0.7503841 0.5017627 0.75 0.5179041 0.633425 0.5179039 0.7514989 0.5100395 0.7503841 0.5263072 0.63326 0.5263075 0.7502395 0.5179039 0.7514989 0.5274639 0.6330705 0.527464 0.750061 0.5263075 0.7502395 0.5274639 0.6168929 0.5263071 0.6166852 0.5263068 0.4997341 0.5017627 0.6335393 0.5017627 0.75 0.375 0.75 0.5278533 0.4975544 0.520886 0.5 0.375 0.5 0.375 0.5 0.375 0.25 0.5278533 0.25 0.375 0 0.5278533 0 0.5278533 0.125 0.375 0.5 0.375 0.625 0.125 0.625 0.5267048 0.5008903 0.5246943 0.5016605 0.520886 0.5 0.520886 0.5 0.5278533 0.4975544 0.5314134 0.5 0.5291633 0.5002833 0.5267048 0.5008903 0.520886 0.5 0.5278533 0.7487701 0.5278532 0.7478464 0.520886 0.75 0.5278532 0.7478464 0.5278533 0.7524455 0.520886 0.75 0.520886 0.75 0.5278533 0.75 0.5278534 0.7495838 0.5303372 0.6249999 0.5314134 0.75 0.5291678 0.7495837 0.5287261 0.6249382 0.5291678 0.7495837 0.5278534 0.7495838 0.5278533 0.6249327 0.5278534 0.7495838 0.5278533 0.75 0.5303372 0.6249999 0.5287261 0.6249382 0.5291633 0.5002833 0.5287261 0.6249382 0.5278533 0.6249327 0.5278533 0.5002854 0.5278533 0.6249327 0.5278533 0.625 0.5278533 0.5 0.375 0.6335383 0.375 0.6281979 0.5017917 0.6281973 0.5017917 0.6281973 0.375 0.6281979 0.375 0.62179 0.5017914 0.6217901 0.375 0.62179 0.375 0.6164424 0.5017627 0.6335393 0.5017917 0.6281973 0.5101417 0.6281655 0.5101417 0.6281655 0.5017917 0.6281973 0.5017914 0.6217901 0.5101408 0.6217748 0.5017914 0.6217901 0.5017627 0.6164405 0.5100396 0.6335111 0.5101417 0.6281655 0.5180953 0.6280772 0.5180953 0.6280772 0.5101417 0.6281655 0.5101408 0.6217748 0.518094 0.6217328 0.5101408 0.6217748 0.5100396 0.6164203 0.5179041 0.633425 0.5180953 0.6280772 0.5264451 0.628046 0.5264451 0.628046 0.5180953 0.6280772 0.518094 0.6217328 0.5264443 0.6219219 0.518094 0.6217328 0.5179041 0.6163692 0.5263072 0.63326 0.5264451 0.628046 0.5274934 0.6279653 0.5274934 0.6279653 0.5264451 0.628046 0.5264443 0.6219219 0.5274934 0.6220235 0.5264443 0.6219219 0.5263071 0.6166852 0.5274639 0.6330705 0.5274934 0.6279653 0.5278701 0.6278846 0.5278701 0.6278846 0.5274934 0.6279653 0.5274934 0.6220235 0.5278702 0.6221134 0.5274934 0.6220235 0.5274639 0.6168929 0.5179042 0.4983208 0.5100397 0.4995697 0.5017627 0.5 0.5017627 0.5 0.375 0.5 0.375 0.5 0.375 0.5 0.520886 0.5 0.5278533 0.5 0.520886 0.5 0.5278533 0.5 0.5278533 0.5 0.5278533 0.5 0.5274638 0.4999321 0.5017627 0.5 0.375 0.5 0.5278533 0.5 0.5017627 0.5 0.5274638 0.4999321 0.5263068 0.4997341 0.5017627 0.5 0.375 0.5368601 0.2426914 0.5368601 0.2443365 0.5103259 0.375 0.6607206 0.375 0.6517794 0.4059466 0.6875 0.375 0.6517794 0.4060045 0.625 0.4059466 0.6875 0.4060045 0.625 0.625 0.625 0.625 0.6875 0.375 0.71314 0.375 0.7396742 0.2445977 0.7396742 0.6106659 0.4020609 0.6106659 0.5 0.3885582 0.5 0.7146734 0.625 0.625 0.625 0.625 0.5625 0.7115396 0.6875 0.625 0.6875 0.625 0.625 0.3805097 0.7479618 0.377513 0.7456797 0.3885582 0.75 0.377513 0.7456797 0.37564 0.7428452 0.3885582 0.75 0.37564 0.7428452 0.375 0.7396742 0.3885582 0.75 0.375 0.7396742 0.375 0.71314 0.3885582 0.75 0.375 0.71314 0.4059466 0.6875 0.3885582 0.75 0.4059466 0.6875 0.625 0.6875 0.6106659 0.75 0.6106659 0.75 0.625 0.6875 0.625 0.7355375 0.625 0.7355375 0.6239549 0.7411106 0.6106659 0.75 0.6239549 0.7411106 0.6209172 0.7458607 0.6106659 0.75 0.6209172 0.7458607 0.6162022 0.7489417 0.6106659 0.75 0.6106659 0.75 0.3885582 0.75 0.4059466 0.6875 0.7091313 0.7355375 0.625 0.7355375 0.625 0.6875 0.375 0.5982206 0.375 0.5892794 0.4059465 0.5625 0.4059465 0.5625 0.625 0.5625 0.4060045 0.625 0.625 0.5625 0.625 0.625 0.4060045 0.625 0.7178073 0.5625 0.625 0.5625 0.625 0.5144626 0.375 0.6607206 0.2408492 0.6607206 0.2408492 0.6517794 0.375 0.5982206 0.2408492 0.5982206 0.2408492 0.5892794 0.375 0.5892794 0.2408492 0.5892794 0.2409394 0.5797492 0.375 0.5797492 0.2409394 0.5797492 0.2412012 0.5686421 0.375 0.5686421 0.2412012 0.5686421 0.2416086 0.5566193 0.375 0.5566193 0.2416086 0.5566193 0.2421221 0.5459848 0.375 0.5459848 0.2421221 0.5459848 0.2426914 0.5368601 0.375 0.6517794 0.2408492 0.6517794 0.2408492 0.6410676 0.375 0.6410676 0.2408492 0.6410676 0.2408492 0.6303558 0.375 0.6303559 0.2408492 0.6303558 0.2408492 0.6196441 0.375 0.6196442 0.2408492 0.6196441 0.2408492 0.6089324 0.375 0.6089323 0.2408492 0.6089324 0.2408492 0.5982206 0.375 0.7040153 0.375 0.71314 0.2426913 0.71314 0.375 0.6933807 0.375 0.7040153 0.2421221 0.7040153 0.375 0.6813579 0.375 0.6933807 0.2416086 0.6933807 0.375 0.6702508 0.375 0.6813579 0.2412012 0.6813579 0.375 0.6607206 0.375 0.6702508 0.2409394 0.6702508 0.6162022 0.5010584 0.6209172 0.5041395 0.6106659 0.5 0.6209172 0.5041395 0.6239549 0.5088894 0.6106659 0.5 0.6239549 0.5088894 0.625 0.5144626 0.6106659 0.5 0.625 0.5144626 0.625 0.5625 0.6106659 0.5 0.625 0.5625 0.4059465 0.5625 0.6106659 0.5 0.4059465 0.5625 0.375 0.5368601 0.3885582 0.5 0.3885582 0.5 0.375 0.5368601 0.375 0.5103259 0.375 0.5103259 0.3756399 0.5071547 0.3885582 0.5 0.3756399 0.5071547 0.377513 0.5043203 0.3885582 0.5 0.377513 0.5043203 0.3805097 0.5020383 0.3885582 0.5 0.3805097 0.5020383 0.3843423 0.5005272 0.3885582 0.5 0.375 0.5103259 0.2443365 0.5103259 0.2443878 0.5070548 0.375 0.5070548 0.2443878 0.5070548 0.2446196 0.5039436 0.2450082 0.5 0.375 0.5 0.375 0.5039436 0.3842632 0.3705163 0.3842632 0.5 0.375 0.5 0.3885582 0.3710941 0.3885582 0.5 0.3842632 0.5 0.375 0.7396742 0.375 0.7429453 0.2449515 0.7429453 0.375 0.7429453 0.375 0.7460564 0.2455202 0.7460564 0.375 0.7460564 0.375 0.75 0.2462481 0.75 0.375 0.75 0.3842632 0.75 0.3842632 0.8779362 0.3842632 0.75 0.3885582 0.75 0.3885582 0.8771125 0.7202154 0.5144626 0.625 0.5144626 0.625 0.5087816 0.7206451 0.5087816 0.625 0.5087816 0.625 0.5 0.625 0.4036865 0.625 0.5 0.6162965 0.5 0.6162965 0.4028809 0.6162965 0.5 0.6106659 0.5 0.7089912 0.7412185 0.625 0.7412185 0.625 0.7355375 0.625 0.75 0.625 0.7412185 0.7089912 0.7412185 0.6162965 0.75 0.625 0.75 0.625 0.8341474 0.6106659 0.75 0.6162965 0.75 0.6162965 0.834576 0.3885582 0.75 0.6106659 0.75 0.6106659 0.8353731 0.4004217 0.5003452 0.6009156 0.552122 0.600915 0.5521213 0.3898681 0.5014385 0.3990851 0.5 0.3912048 0.5017043 0.3990851 0.5 0.4004204 0.5 0.3912048 0.5017043 0.4004217 0.5003452 0.600915 0.5521213 0.3990851 0.5 0.3912048 0.5017362 0.4004217 0.5003452 0.3990851 0.5 0.3820543 0.5055348 0.3898681 0.5014385 0.383391 0.5062541 0.3898681 0.5014385 0.3912048 0.5017043 0.383391 0.5062541 0.3912048 0.5017362 0.3990851 0.5 0.3898681 0.5014385 0.383391 0.5063366 0.3912048 0.5017362 0.3898681 0.5014385 0.3768333 0.5116654 0.3820543 0.5055348 0.3781698 0.5188738 0.3820543 0.5055348 0.383391 0.5062541 0.3781698 0.5188738 0.383391 0.5063366 0.3898681 0.5014385 0.3820543 0.5055348 0.3781699 0.5189936 0.383391 0.5063366 0.3820543 0.5055348 0.375 0.7311029 0.3768333 0.5116654 0.3763366 0.7157075 0.3768333 0.5116654 0.3781698 0.5188738 0.3763366 0.7157075 0.3781699 0.5189936 0.3820543 0.5055348 0.3768333 0.5116654 0.375 0.7311029 0.3763366 0.7157075 0.3763365 0.7159283 0.3763365 0.7159283 0.3781699 0.5189936 0.3768333 0.5116654 0.375 0.7311029 0.375 0.7311029 0.3763365 0.7159283 0.375 0.5188971 0.375 0.7311029 0.2888546 0.731103 0.600915 0.75 0.600915 0.8596736 0.3990851 0.838654 0.3990851 0.4113467 0.4003694 0.4088347 0.4003368 0.4961079 0.375 0.5116655 0.375 0.5188971 0.2888547 0.5188971 0.375 0.5 0.375 0.5116655 0.2886638 0.5116655 0.3898681 0.5 0.375 0.5 0.375 0.4131203 0.3990851 0.5 0.3898681 0.5 0.3898681 0.4123064 0.2888546 0.731103 0.375 0.7311029 0.375 0.7383345 0.2886638 0.7383345 0.375 0.7383345 0.375 0.75 0.375 0.83688 0.375 0.75 0.3898681 0.75 0.3898681 0.8376936 0.3898681 0.75 0.3990851 0.75 0.6009156 0.8596736 0.600915 0.8596736 0.600915 0.75 0.391205 0.5014383 0.4004206 0.5 0.3990851 0.5 0.3990851 0.75 0.600915 0.75 0.4004218 0.75 0.600915 0.75 0.600915 0.75 0.4004218 0.75 0.391205 0.5014383 0.3990851 0.5 0.3898681 0.5014385 0.3833911 0.5055345 0.391205 0.5014383 0.3898681 0.5014385 0.3898681 0.7485615 0.3990851 0.75 0.3912049 0.7485614 0.3990851 0.75 0.4004218 0.75 0.3912049 0.7485614 0.3833911 0.5055345 0.3898681 0.5014385 0.3820543 0.5055348 0.37817 0.5116652 0.3833911 0.5055345 0.3820543 0.5055348 0.3820543 0.7444652 0.3898681 0.7485615 0.3833911 0.7444652 0.3898681 0.7485615 0.3912049 0.7485614 0.3833911 0.7444652 0.37817 0.5116652 0.3820543 0.5055348 0.3768333 0.5116654 0.3763367 0.5188969 0.37817 0.5116652 0.3768333 0.5116654 0.3768333 0.7383344 0.3820543 0.7444652 0.3781701 0.7383345 0.3820543 0.7444652 0.3833911 0.7444652 0.3781701 0.7383345 0.3763367 0.5188969 0.3768333 0.5116654 0.375 0.5188971 0.3768333 0.7383344 0.3781701 0.7383345 0.3763368 0.7311028 0.3763368 0.7311028 0.3763367 0.5188969 0.375 0.5188971 0.375 0.7311029 0.3768333 0.7383344 0.3763368 0.7311028 0.375 0.7311029 0.375 0.5188971 0.2863669 0.5188971 0.401264 0.75 0.5765497 0.75 0.3990851 0.75 0.5765497 0.75 0.5980631 1 0.600915 0.75 0.3990851 0.4097102 0.3990851 0.5 0.4003369 0.4961074 0.375 0.5188971 0.375 0.5116655 0.2864978 0.5116655 0.2864978 0.5116655 0.375 0.5116655 0.375 0.5 0.3898681 0.5 0.3898681 0.4106013 0.375 0.4112291 0.3990851 0.5 0.3990851 0.4097102 0.3898681 0.4106006 0.375 0.7383345 0.375 0.7311029 0.2769464 0.731103 0.375 0.75 0.375 0.7383345 0.2764354 0.7383345 0.3898681 0.75 0.375 0.75 0.375 0.8493774 0.3990851 0.75 0.3898681 0.75 0.3898681 0.8503687 0.600915 0.75 0.600915 0.8673028 0.6009156 0.8673027 0.4053968 0.7500017 0.4053969 0.9123592 0.4053968 0.75 0.4053969 0.9123592 0.4053968 0.9123592 0.4053968 0.75 0.4053968 0.75 0.5946033 0.75 0.5946033 0.7500018 0.3808053 0.51253 0.38753 0.5058053 0.4053968 0.5 0.38753 0.5058053 0.3960037 0.5014877 0.4053968 0.5 0.4053968 0.5 0.5946033 0.5 0.375 0.7196032 0.3808053 0.51253 0.4053968 0.5 0.3764877 0.5210037 0.5946033 0.5 0.6039964 0.5014877 0.61247 0.5058053 0.61247 0.5058053 0.6191948 0.51253 0.5946033 0.5 0.6191948 0.51253 0.6235122 0.5210036 0.5946033 0.5 0.6235122 0.5210036 0.625 0.5303968 0.5946033 0.5 0.625 0.5303968 0.625 0.5303968 0.375 0.7196032 0.625 0.5303968 0.6235122 0.5210036 0.5946033 0.5 0.6235122 0.5210036 0.6191948 0.51253 0.5946033 0.5 0.6191948 0.51253 0.61247 0.5058053 0.5946033 0.5 0.61247 0.5058053 0.6039964 0.5014877 0.5946033 0.5 0.5946033 0.5 0.4053968 0.5 0.625 0.5303968 0.4053968 0.5 0.3960037 0.5014877 0.38753 0.5058053 0.38753 0.5058053 0.3808053 0.51253 0.4053968 0.5 0.3808053 0.51253 0.3764877 0.5210037 0.4053968 0.5 0.3764877 0.5210037 0.375 0.7196032 0.4053968 0.5 0.375 0.7196032 0.375 0.7196032 0.625 0.5303968 0.375 0.7196032 0.3764877 0.5210037 0.4053968 0.5 0.625 0.5303968 0.375 0.7196032 0.5946033 0.5 0.625 0.5303968 0.625 0.5303968 0.6250019 0.7196032 0.5860456 0.25 0.4053968 0.5 0.4053968 0.4999982 0.375 0.5210037 0.375 0.5303968 0.2130712 0.5303968 0.375 0.51253 0.375 0.5210037 0.21305 0.5210037 0.375 0.5 0.375 0.51253 0.2129891 0.51253 0.3750003 0.4999983 0.3960037 0.4999982 0.375 0.5 0.3960037 0.4999982 0.3960037 0.5 0.375 0.5 0.375 0.5 0.375 0.337894 0.3750001 0.337894 0.4053968 0.5 0.3960037 0.5 0.3960037 0.4999982 0.625 0.5303968 0.625 0.5210037 0.6250018 0.5210037 0.625 0.5210037 0.625 0.5 0.6250017 0.5 0.625 0.5 0.61247 0.5 0.61247 0.4999982 0.61247 0.5 0.6039963 0.5 0.6039963 0.4999983 0.6039963 0.5 0.5946033 0.5 0.5946032 0.4999982 0.2130712 0.7196032 0.375 0.7196032 0.375 0.7289963 0.21305 0.7289963 0.375 0.7289963 0.375 0.73747 0.212989 0.73747 0.375 0.73747 0.375 0.75 0.375 0.912106 0.375 0.75 0.3960037 0.75 0.3960037 0.9122259 0.3960037 0.75 0.4053968 0.75 0.625 0.7196032 0.6250019 0.7196032 0.6250017 0.7289963 0.625 0.7289963 0.6250017 0.7289963 0.6250017 0.75 0.625 0.75 0.625 0.7500019 0.61247 0.7500017 0.61247 0.75 0.61247 0.7500017 0.6039963 0.7500018 0.6039963 0.75 0.6039963 0.7500018 0.5946033 0.7500018 0.375 0.5303968 0.375 0.7196032 0.2130712 0.7196032 0.4114657 0.75 0.4114661 0.75 0.4053973 0.75 0.3875303 0.5058051 0.3960041 0.5014877 0.3960037 0.5014877 0.3960037 0.7485123 0.4053968 0.75 0.3960037 0.7485123 0.4053968 0.75 0.4053968 0.75 0.3960037 0.7485123 0.3875303 0.5058051 0.3960037 0.5014877 0.38753 0.5058053 0.3808054 0.5125299 0.3875303 0.5058051 0.38753 0.5058053 0.38753 0.7441947 0.3960037 0.7485123 0.38753 0.7441947 0.3960037 0.7485123 0.3960037 0.7485123 0.38753 0.7441947 0.3808054 0.5125299 0.38753 0.5058053 0.3808053 0.51253 0.3764878 0.5210036 0.3808054 0.5125299 0.3808053 0.51253 0.3808053 0.73747 0.38753 0.7441947 0.3808053 0.73747 0.38753 0.7441947 0.38753 0.7441947 0.3808053 0.73747 0.3764878 0.5210036 0.3808053 0.51253 0.3764877 0.5210037 0.375 0.5303967 0.3764878 0.5210036 0.375 0.5303968 0.3764878 0.5210036 0.3764877 0.5210037 0.375 0.5303968 0.3764877 0.7289963 0.3808053 0.73747 0.3808053 0.73747 0.3764877 0.7289963 0.3808053 0.73747 0.3764877 0.7289963 0.3764877 0.7289963 0.3764877 0.7289963 0.375 0.7196032 0.3764877 0.7289963 0.375 0.7196032 0.375 0.7196032 0.375 0.7196032 0.375 0.5303967 0.375 0.5303968 0.375 0.5303968 0.375 0.5210037 0.2044739 0.5210037 0.375 0.5210037 0.375 0.51253 0.2046494 0.51253 0.375 0.51253 0.375 0.5 0.2047435 0.5 0.375 0.5 0.3960037 0.5 0.3960037 0.3297461 0.3960037 0.3297451 0.3960037 0.5 0.3960041 0.5 0.375 0.7289963 0.375 0.7196032 0.1989752 0.7196033 0.375 0.73747 0.375 0.7289963 0.1986936 0.7289963 0.375 0.75 0.375 0.73747 0.1983982 0.73747 0.3960037 0.75 0.375 0.75 0.375 0.9268819 0.4053968 0.75 0.3960037 0.75 0.3960037 0.927119 0.375 0.7196032 0.375 0.5303968 0.2042335 0.5303968 0.521019 0.5 0.521019 0.5 0.5208362 0.5 0.5980436 0.5 0.5980436 0.5 0.5262613 0.5 0.5903939 0.25 0.5925142 0.25 0.5921767 0.25 0.5921767 0.25 0.521019 0.5 0.5903939 0.25 0.5980436 0.485621 0.5980436 0.485621 0.5980436 0.5 0.4071993 0.5 0.521019 0.5 0.521019 0.5 0.3916406 0.5014808 0.3828954 0.5056979 0.3881382 0.5056979 0.3828954 0.5056979 0.377052 0.5120092 0.3822948 0.5120092 0.3881382 0.5056979 0.3828954 0.5056979 0.3822948 0.5120092 0.377052 0.5120092 0.37682 0.5128506 0.3822948 0.5120092 0.37682 0.5128506 0.37682 0.7371493 0.3802428 0.7305461 0.37682 0.7371493 0.3770519 0.7379907 0.3822947 0.737991 0.3770519 0.7379907 0.3828954 0.7443021 0.3822947 0.737991 0.3916407 0.7485193 0.4019565 0.75 0.3968837 0.7485195 0.4019565 0.75 0.4071984 0.75 0.3968837 0.7485195 0.3828954 0.7443021 0.3916407 0.7485193 0.3881382 0.7443023 0.3822947 0.737991 0.3828954 0.7443021 0.3881382 0.7443023 0.4071993 0.5 0.521019 0.5 0.4019564 0.5 0.3968835 0.5014808 0.4071993 0.5 0.4019564 0.5 0.3916407 0.7485193 0.3968837 0.7485195 0.3881382 0.7443023 0.3968835 0.5014808 0.4019564 0.5 0.3916406 0.5014808 0.3881382 0.5056979 0.3968835 0.5014808 0.3916406 0.5014808 0.37682 0.7371493 0.3822947 0.737991 0.3802428 0.7305461 0.37682 0.5128506 0.3802428 0.7305461 0.3802427 0.5194538 0.4179593 0.25 0.4019564 0.4962731 0.4019564 0.5 0.4019564 0.5 0.5151523 0.25 0.4179593 0.25 0.4071984 0.75 0.4019565 0.75 0.402353 0.75 0.521019 0.5 0.5262619 0.5 0.521019 0.5 0.5262619 0.5 0.5980437 0.5 0.521019 0.5 0.592736 0.25 0.521019 0.4431915 0.5921767 0.25 0.521019 0.4431915 0.521019 0.4763038 0.521019 0.5 0.3732838 0.5 0.3739264 0.5098886 0.375 0.5 0.3739264 0.5098886 0.3748028 0.5120092 0.375 0.5120092 0.375 0.4982835 0.375 0.5 0.3916407 0.5 0.4019564 0.4962724 0.3931477 0.4965965 0.4019564 0.5 0.3931477 0.4965965 0.3916407 0.4968628 0.3916407 0.5 0.5980436 0.4761692 0.5980436 0.5 0.5980437 0.5 0.375 0.75 0.375 0.7379909 0.374803 0.7379909 0.3916407 0.75 0.375 0.75 0.375 0.7551611 0.4008683 0.7668424 0.4019564 0.7668977 0.4019565 0.75 0.4019565 0.75 0.3916407 0.75 0.4008683 0.7668424 0.335386 0.6595793 0.375 0.6595793 0.375 0.6843556 0.3352202 0.6843555 0.375 0.6843556 0.375 0.7003759 0.3343764 0.7243734 0.3347384 0.7003759 0.375 0.7003759 0.375 0.7003759 0.375 0.75 0.3343764 0.7243734 0.375 0.7936188 0.375 0.75 0.3900708 0.75 0.4002026 0.513312 0.4136683 0.5042986 0.4078813 0.5058108 0.3902342 0.5171976 0.378904 0.5291944 0.3888723 0.5328157 0.378904 0.5291944 0.375 0.6595793 0.3849682 0.6312794 0.3888723 0.5328157 0.378904 0.5291944 0.3849682 0.6312794 0.375 0.6595793 0.375 0.6595793 0.3849682 0.6312794 0.375 0.6595793 0.3776553 0.5307752 0.3849683 0.6258172 0.3849682 0.6312794 0.375 0.6595793 0.3849683 0.6258172 0.3776553 0.5307752 0.3853613 0.5210204 0.3876235 0.5426637 0.3853613 0.5210204 0.3973637 0.5116044 0.3953295 0.5214729 0.3973637 0.5116044 0.4124875 0.5032736 0.407332 0.510664 0.4124875 0.5032736 0.4292525 0.5 0.4224559 0.5027271 0.4292525 0.5 0.5883923 0.5 0.4392208 0.5 0.5883923 0.5 0.588394 0.5000008 0.4392208 0.5 0.4002026 0.513312 0.4078813 0.5058108 0.3902342 0.5171976 0.3888723 0.5328157 0.4002026 0.513312 0.3902342 0.5171976 0.4292525 0.5 0.4392208 0.5 0.4224559 0.5027271 0.4124875 0.5032736 0.4224559 0.5027271 0.407332 0.510664 0.3973637 0.5116044 0.407332 0.510664 0.3953295 0.5214729 0.3853613 0.5210204 0.3953295 0.5214729 0.3876235 0.5426637 0.5883923 0.4513151 0.5883941 0.451315 0.588394 0.4999999 0.375 0.5429795 0.375 0.6595793 0.335386 0.6595793 0.375 0.5296981 0.375 0.5429795 0.3353861 0.5429795 0.375 0.5177168 0.375 0.5296981 0.3352732 0.5296981 0.375 0.5 0.375 0.5177168 0.3349457 0.5177168 0.4124876 0.5 0.375 0.5 0.375 0.4594355 0.4292525 0.5 0.4124876 0.5 0.4124876 0.4587924 0.5707498 0.25 0.4292525 0.5 0.4292525 0.4580798 0.3273291 0.6843556 0.375 0.6843556 0.375 0.6595793 0.3291075 0.7003759 0.375 0.7003759 0.375 0.6843556 0.3291075 0.7003759 0.3293405 0.7119106 0.375 0.7003759 0.3293405 0.7119106 0.3297552 0.7230325 0.375 0.7003759 0.3306458 0.7309063 0.3337876 0.75 0.375 0.75 0.375 0.75 0.375 0.7003759 0.3306458 0.7309063 0.3900727 0.791922 0.3900738 0.7499999 0.3772434 0.7910391 0.3900738 0.7499999 0.375 0.75 0.3772434 0.7910391 0.588394 0.5000008 0.5883923 0.5 0.4392227 0.5 0.5883923 0.5 0.4292525 0.5 0.4392227 0.5 0.4292525 0.5 0.4124875 0.5032736 0.4224577 0.5036003 0.4124875 0.5032736 0.3973637 0.5116044 0.4073337 0.5126497 0.4224577 0.5036003 0.4124875 0.5032736 0.4073337 0.5126497 0.3973637 0.5116044 0.3853613 0.5210204 0.3953316 0.523509 0.3853613 0.5210204 0.3776553 0.5307752 0.3876254 0.5346274 0.3953316 0.523509 0.3853613 0.5210204 0.3876254 0.5346274 0.3776553 0.5307752 0.375 0.5429795 0.3849701 0.5474793 0.375 0.5429795 0.375 0.6595793 0.3849701 0.5474793 0.375 0.6595793 0.3789041 0.6869594 0.3849701 0.666562 0.3789041 0.6869594 0.3902343 0.7111898 0.3888742 0.6942338 0.3849701 0.666562 0.3789041 0.6869594 0.3888742 0.6942338 0.3902343 0.7111898 0.4078815 0.7311475 0.4002044 0.7190375 0.4078815 0.7311475 0.4136695 0.7347427 0.4002044 0.7190375 0.4224577 0.5036003 0.4392227 0.5 0.4292525 0.5 0.3902343 0.7111898 0.4002044 0.7190375 0.3888742 0.6942338 0.375 0.6595793 0.3849701 0.666562 0.3849701 0.5474793 0.4073337 0.5126497 0.3973637 0.5116044 0.3953316 0.523509 0.5883941 0.4328609 0.5883923 0.4328609 0.5883923 0.5 0.3150486 0.5429795 0.3171311 0.5902102 0.375 0.5429795 0.3171311 0.5902102 0.3246387 0.6595793 0.375 0.6595793 0.3150486 0.5429795 0.375 0.5429795 0.375 0.5296981 0.3143811 0.5296981 0.375 0.5296981 0.375 0.5177168 0.3102981 0.5 0.3118892 0.5144474 0.375 0.5 0.3118892 0.5144474 0.3124454 0.5177168 0.375 0.5177168 0.4124876 0.5 0.4124876 0.4331316 0.375 0.4352982 0.4162961 0.4326485 0.4124876 0.4331293 0.4124876 0.5 0.4124876 0.5 0.4292525 0.5 0.4162961 0.4326485 0.4292525 0.5 0.5707498 0.25 0.5754879 0.25 0.3768333 0.5116654 0.3820543 0.5055348 0.3990851 0.5 0.3820543 0.5055348 0.3898681 0.5014385 0.3990851 0.5 0.3990851 0.5 0.4848592 0.5 0.375 0.7311029 0.3768333 0.5116654 0.3990851 0.5 0.375 0.7311029 0.4848592 0.5 0.5384888 0.5083698 0.5839537 0.5322048 0.5839537 0.5322048 0.6143324 0.5678766 0.375 0.7311029 0.6143324 0.5678766 0.625 0.6099542 0.375 0.7311029 0.625 0.6099542 0.625 0.6099542 0.375 0.7311029 0.625 0.6099542 0.6231667 0.6027228 0.600915 0.5521214 0.375 0.7311029 0.625 0.6099542 0.600915 0.5521214 0.6231667 0.6027228 0.6179457 0.5821288 0.600915 0.5521214 0.6179457 0.5821288 0.6101319 0.5629442 0.600915 0.5521214 0.600915 0.5521214 0.3990851 0.5 0.375 0.7311029 0.3990851 0.5 0.3898681 0.5014385 0.3820543 0.5055348 0.3820543 0.5055348 0.3768333 0.5116654 0.3990851 0.5 0.3768333 0.5116654 0.375 0.7311029 0.3990851 0.5 0.375 0.7311029 0.375 0.7311029 0.625 0.6099542 0.375 0.5188971 0.375 0.7311029 0.2905067 0.731103 0.625 0.6099542 0.7819217 0.6099542 0.7819217 0.731103 0.600915 0.7944061 0.3990851 0.8344934 0.3990851 0.75 0.600915 0.75 0.600915 0.905304 0.600915 0.7944061 0.600915 0.905304 0.600915 0.8651272 0.600915 0.7944061 0.625 0.6099542 0.625 0.5678766 0.7812053 0.5678766 0.625 0.5678766 0.625 0.5 0.7791651 0.5 0.625 0.5 0.5384888 0.5 0.5384889 0.3488886 0.5375205 0.3489491 0.5384889 0.3488886 0.5384888 0.5 0.5384888 0.5 0.4848592 0.5 0.5375205 0.3489491 0.476527 0.25 0.3990851 0.5 0.3990851 0.3582501 0.2905067 0.5116655 0.375 0.5116655 0.375 0.5188971 0.375 0.5 0.375 0.5116655 0.2905067 0.5116655 0.3898681 0.4155066 0.3898681 0.5 0.375 0.5 0.3990838 0.4155066 0.3990839 0.3582503 0.3990851 0.3582501 0.3990851 0.5 0.3898681 0.5 0.3990838 0.4155066 0.3898681 0.5 0.3898681 0.4155066 0.3990838 0.4155066 0.2905067 0.731103 0.375 0.7311029 0.375 0.7383345 0.375 0.7383345 0.375 0.75 0.2905067 0.75 0.375 0.8344932 0.375 0.75 0.3898681 0.75 0.3898681 0.75 0.3990851 0.75 0.3990851 0.8344934 0.7817985 0.7383345 0.625 0.7383345 0.625 0.7311029 0.625 0.7383345 0.7817985 0.7383345 0.7814478 0.75 0.6101319 0.9059228 0.6101319 0.75 0.625 0.75 0.600915 0.905304 0.600915 0.75 0.6101319 0.75 0.375 0.7311029 0.3768333 0.7383344 0.3990851 0.75 0.3768333 0.7383344 0.3820543 0.7444652 0.3990851 0.75 0.3820543 0.7444652 0.3898681 0.7485615 0.3990851 0.75 0.3990851 0.75 0.600915 0.75 0.625 0.731103 0.600915 0.75 0.6101319 0.7485616 0.6179457 0.7444651 0.6231666 0.7383345 0.600915 0.75 0.6179457 0.7444651 0.6231666 0.7383345 0.625 0.731103 0.600915 0.75 0.625 0.731103 0.625 0.6099542 0.375 0.7311029 0.625 0.6099542 0.6143324 0.5678766 0.375 0.5188971 0.6143324 0.5678766 0.5839537 0.5322048 0.375 0.5188971 0.5839537 0.5322048 0.5384888 0.5083698 0.4848592 0.5 0.4848592 0.5 0.3990851 0.5 0.375 0.5188971 0.3990851 0.5 0.3898681 0.5014385 0.3820543 0.5055348 0.3768333 0.5116654 0.3990851 0.5 0.3820543 0.5055348 0.3768333 0.5116654 0.375 0.5188971 0.3990851 0.5 0.375 0.5188971 0.375 0.7311029 0.625 0.6099542 0.625 0.731103 0.375 0.7311029 0.3990851 0.75 0.375 0.7311029 0.375 0.5188971 0.2905012 0.5188971 0.625 0.6099542 0.625 0.731103 0.783792 0.731103 0.5940628 1 0.5965838 1 0.5979177 1 0.600915 0.75 0.3990851 0.75 0.5940628 1 0.3990851 0.75 0.4019013 0.75 0.5940628 1 0.7837921 0.6099542 0.7838406 0.6063467 0.625 0.6099542 0.7838406 0.6063467 0.7840111 0.5678766 0.625 0.5678766 0.7810873 0.5 0.625 0.5 0.625 0.5678766 0.625 0.5 0.625 0.3439127 0.5384888 0.3476334 0.5375201 0.3477005 0.4848592 0.3514576 0.4848592 0.5 0.4848592 0.5 0.5384888 0.5 0.5375201 0.3477005 0.3990851 0.3571899 0.3990851 0.5 0.476527 0.25 0.375 0.5188971 0.375 0.5116655 0.2905012 0.5116655 0.2905012 0.5116655 0.375 0.5116655 0.375 0.5 0.375 0.4155015 0.375 0.5 0.3898681 0.5 0.3898681 0.4155019 0.3898681 0.5 0.3990851 0.4153975 0.3898681 0.5 0.3990851 0.5 0.3990851 0.4153975 0.3990851 0.5 0.3990851 0.3571895 0.3990851 0.4153975 0.2905015 0.7383345 0.375 0.7383345 0.375 0.7311029 0.375 0.75 0.375 0.7383345 0.2905015 0.7383345 0.3898681 0.75 0.375 0.75 0.375 0.8344989 0.3898681 0.75 0.389868 0.8344998 0.3990851 0.8344989 0.783792 0.731103 0.625 0.731103 0.625 0.7383345 0.7838891 0.7383345 0.625 0.7383345 0.625 0.75 0.625 0.909166 0.625 0.75 0.6101319 0.75 0.6101319 0.9095794 0.6101319 0.75 0.600915 0.75 0.4053968 0.75 0.5946033 0.75 0.4053968 0.9123571 0.5946033 0.75 0.5946033 0.9150326 0.4053968 0.9123571 0.3875299 0.5058053 0.38753 0.5058053 0.3960036 0.5014879 0.38753 0.5058053 0.3960037 0.5014877 0.3960036 0.5014879 0.5946033 0.5 0.4053968 0.5 0.594603 0.5 0.4053968 0.5 0.4053968 0.5 0.594603 0.5 0.4053966 0.5 0.3960036 0.5014879 0.4053968 0.5 0.3960036 0.5014879 0.3960037 0.5014877 0.4053968 0.5 0.6039964 0.5014877 0.5946033 0.5 0.594603 0.5 0.6039964 0.5014877 0.594603 0.5 0.6039962 0.5014877 0.594603 0.5 0.4053966 0.5 0.5946033 0.5 0.4053966 0.5 0.4053968 0.5 0.5946033 0.5 0.61247 0.5058053 0.6039964 0.5014877 0.6039962 0.5014877 0.61247 0.5058053 0.6039962 0.5014877 0.6124698 0.5058053 0.6039962 0.5014877 0.594603 0.5 0.5946033 0.5 0.6191948 0.51253 0.61247 0.5058053 0.6191946 0.5125299 0.61247 0.5058053 0.6124698 0.5058053 0.6191946 0.5125299 0.6039962 0.5014877 0.5946033 0.5 0.6039964 0.5014877 0.6124698 0.5058052 0.6039962 0.5014877 0.6039964 0.5014877 0.6235122 0.5210036 0.6191948 0.51253 0.6191946 0.5125299 0.6235122 0.5210036 0.6191946 0.5125299 0.623512 0.5210033 0.6124698 0.5058052 0.6039964 0.5014877 0.61247 0.5058053 0.6191946 0.5125299 0.6124698 0.5058052 0.61247 0.5058053 0.625 0.5303968 0.6235122 0.5210036 0.623512 0.5210033 0.625 0.5303968 0.623512 0.5210033 0.6249998 0.5303955 0.6191946 0.5125299 0.61247 0.5058053 0.6191948 0.51253 0.623512 0.5210032 0.6191946 0.5125299 0.6191948 0.51253 0.625 0.5303968 0.625 0.5303968 0.6249998 0.5303955 0.625 0.5303968 0.6249998 0.5303955 0.6249998 0.5303955 0.623512 0.5210032 0.6191948 0.51253 0.6235122 0.5210036 0.625 0.5303968 0.6249998 0.5303955 0.6235122 0.5210036 0.625 0.7196032 0.625 0.5303968 0.7904624 0.5303968 0.5916946 0.25 0.5916947 0.25 0.5860456 0.25 0.5860456 0.25 0.4053968 0.5 0.4053968 0.2979621 0.4053968 0.5 0.4053968 0.3376434 0.4053968 0.2979621 0.212896 0.5000001 0.2128959 0.5 0.375 0.5 0.3960037 0.5 0.375 0.5 0.375 0.3378961 0.4053968 0.5 0.3960037 0.5 0.3960037 0.3377762 0.625 0.5303968 0.625 0.5210037 0.7904413 0.5210037 0.625 0.5210037 0.625 0.5 0.7903802 0.5 0.625 0.5 0.61247 0.5 0.61247 0.334715 0.61247 0.5 0.6039963 0.5 0.6039963 0.3348346 0.6039963 0.5 0.5946033 0.5 0.5946033 0.3349664 0.4053968 0.75 0.4053968 0.9123571 0.4053968 0.9123578 0.625 0.7196032 0.7904624 0.7196032 0.7904412 0.7289963 0.625 0.7289963 0.7904412 0.7289963 0.7903804 0.75 0.625 0.75 0.625 0.9153801 0.61247 0.9152852 0.61247 0.75 0.61247 0.9152852 0.6039963 0.9151654 0.5946033 0.9150326 0.5946033 0.75 0.6039963 0.75 0.5918713 1 0.5946033 0.75 0.5091924 0.75 0.5946033 0.75 0.4053968 0.75 0.5091924 0.75 0.4053968 0.75 0.4114659 0.75 0.5091924 0.75 0.3764877 0.7289963 0.3808053 0.73747 0.4053968 0.75 0.3808053 0.73747 0.38753 0.7441947 0.4053968 0.75 0.38753 0.7441947 0.3960037 0.7485123 0.4053968 0.75 0.4053968 0.75 0.5946033 0.75 0.625 0.7196032 0.5946033 0.75 0.6039964 0.7485123 0.61247 0.7441948 0.6191948 0.73747 0.5946033 0.75 0.61247 0.7441948 0.6191948 0.73747 0.6235123 0.7289964 0.5946033 0.75 0.6235123 0.7289964 0.625 0.7196032 0.5946033 0.75 0.625 0.7196032 0.625 0.5303968 0.375 0.5303968 0.625 0.5303968 0.6235122 0.5210036 0.5946033 0.5 0.375 0.5303968 0.625 0.5303968 0.5946033 0.5 0.6235122 0.5210036 0.6191948 0.51253 0.5946033 0.5 0.6191948 0.51253 0.61247 0.5058053 0.5946033 0.5 0.61247 0.5058053 0.6039964 0.5014877 0.5946033 0.5 0.5946033 0.5 0.4053968 0.5 0.375 0.5303968 0.4053968 0.5 0.3960037 0.5014877 0.38753 0.5058053 0.3808053 0.51253 0.4053968 0.5 0.38753 0.5058053 0.3808053 0.51253 0.3764877 0.5210037 0.4053968 0.5 0.3764877 0.5210037 0.375 0.5303968 0.4053968 0.5 0.375 0.5303968 0.375 0.7196032 0.625 0.7196032 0.375 0.7196032 0.3764877 0.7289963 0.4053968 0.75 0.7923783 0.5303968 0.625 0.5303968 0.625 0.7196032 0.5657738 0.25 0.4053968 0.3296489 0.4053968 0.5 0.4053968 0.5 0.5860455 0.25 0.5657738 0.25 0.375 0.5303968 0.375 0.5210037 0.374991 0.5210037 0.375 0.5210037 0.375 0.51253 0.3749912 0.51253 0.375 0.51253 0.375 0.5 0.3749914 0.5 0.375 0.5 0.3960037 0.5 0.3960037 0.499991 0.4053962 0.3296749 0.3960037 0.3297371 0.4053968 0.5 0.3960037 0.3297371 0.3960037 0.5 0.4053968 0.5 0.625 0.5210037 0.625 0.5303968 0.7923783 0.5303968 0.625 0.5 0.625 0.5210037 0.7925159 0.5210037 0.61247 0.5 0.625 0.5 0.625 0.3320849 0.6039963 0.5 0.61247 0.5 0.61247 0.3314633 0.5946033 0.5 0.6039963 0.5 0.6039963 0.3306795 0.3749914 0.7289962 0.375 0.7289963 0.375 0.7196032 0.375 0.73747 0.375 0.7289963 0.3749914 0.7289962 0.375 0.75 0.375 0.73747 0.3749911 0.73747 0.3960037 0.75 0.375 0.75 0.375 0.7500088 0.4053968 0.75 0.3960037 0.75 0.4053968 0.7500088 0.3960037 0.75 0.3960037 0.750009 0.4053968 0.7500088 0.4053968 0.7500088 0.4053968 0.9272989 0.4053968 0.9272989 0.625 0.7289963 0.7925156 0.7289963 0.7923783 0.7196032 0.625 0.75 0.7929148 0.75 0.7925156 0.7289963 0.61247 0.75 0.61247 0.9185368 0.625 0.9179148 0.6039963 0.75 0.6039963 0.9193205 0.61247 0.9185368 0.6039963 0.9193188 0.6039963 0.75 0.5946033 0.75 0.375 0.7196032 0.375 0.5303968 0.3749913 0.5303968 0.5980437 0 0.6083595 1.99639e-4 0.6171048 0.004133284 0.6171048 0.004133284 0.6229482 0.01481008 0.5980437 0 0.6229482 0.01481008 0.625 0.0281077 0.5980437 0 0.625 0.0281077 0.625 0.0281077 0.521019 0.25 0.625 0.0281077 0.6236684 0.01673942 0.6198766 0.006582021 0.521019 0.25 0.625 0.0281077 0.521019 0.01879853 0.6198766 0.006582021 0.6142016 0.001568436 0.6075075 0 0.6075075 0 0.5385115 0 0.521019 0.01879853 0.6075075 0 0.625 0.0281077 0.6198766 0.006582021 0.521019 0.25 0.5980437 0 0.625 0.0281077 0.521019 0.305715 0.521019 0.429526 0.521019 0.25 0.521019 0.25 0.4019564 0.25 0.521019 0.3013996 0.4019564 0.25 0.4019564 0.4177961 0.521019 0.3013996 0.875 0.5290875 0.6841812 0.5290875 0.6841812 0.7218922 0.4896172 0.75 0.4019565 0.8322038 0.4019565 1 0.4019565 1 0.4843853 0.75 0.4896172 0.75 0.5980435 0.3057148 0.5980435 0.3136842 0.5980435 0.4380365 0.5980435 0.4380365 0.5980435 0.25 0.5980435 0.3057148 0.5980435 0.25 0.521019 0.25 0.5980435 0.3057148 0.375 0.2305462 0.3770519 0.0120092 0.4019564 0 0.3770519 0.0120092 0.3828953 0.005697846 0.4019564 0 0.3828953 0.005697846 0.3916407 0.001480817 0.4019564 0 0.4019564 0 0.5210189 0.01879847 0.375 0.2305462 0.5210189 0.01879847 0.521019 0.01879853 0.375 0.2305462 0.521019 0.01879853 0.4949705 0 0.4019565 0 0.4019565 0 0.3916407 0.001480817 0.3828954 0.005697846 0.3828954 0.005697846 0.3770519 0.01200914 0.4019565 0 0.3770519 0.01200914 0.375 0.2305462 0.4019565 0 0.375 0.2305462 0.375 0.2305462 0.521019 0.01879853 0.875 0.7218922 0.6841812 0.7218922 0.6843186 0.7342341 0.875 0.734234 0.6843186 0.7342341 0.6847099 0.75 0.6155518 0.810274 0.6151883 0.8102957 0.6151883 1 0.6151883 1 0.625 1 0.6155518 0.810274 0.6151883 1 0.6151883 0.8102957 0.6075075 0.8109868 0.5385115 1 0.5385115 0.8172249 0.5309233 0.8179431 0.5217285 0.8197174 0.521019 0.8198011 0.521019 1 0.521019 1 0.5309233 1 0.5217285 0.8197174 0.5082334 0.8212686 0.5062704 0.8214367 0.5062704 1 0.5062704 1 0.521019 1 0.5133311 0.8208316 0.521019 1 0.521019 0.8198011 0.5144793 0.8205084 0.5133311 0.8208316 0.521019 1 0.5144793 0.8205084 0.4949705 0.8226031 0.4949705 1 0.5062704 1 0.6075075 1 0.6075075 0.8109868 0.5385115 0.8172249 0.125 0.5120092 0.125 0.5194538 0.2900139 0.5194538 0.125 0.5 0.125 0.5120092 0.2902255 0.5120092 0.3916407 0.25 0.375 0.25 0.375 0.4158287 0.4019564 0.25 0.3916407 0.25 0.3916407 0.4167314 0.875 0.5290875 0.875 0.5179562 0.6843931 0.5179562 0.875 0.5179562 0.875 0.5 0.6849962 0.5 0.625 0.25 0.6083593 0.25 0.6083593 0.4391011 0.6083593 0.25 0.5980435 0.25 0.5980435 0.4380365 0.2900137 0.7305462 0.125 0.7305462 0.125 0.7379909 0.2902255 0.7379909 0.125 0.7379909 0.125 0.75 0.375 0.8341712 0.375 1 0.3916407 1 0.3916407 0.8332684 0.3916407 1 0.4019565 1 0.2900139 0.5194538 0.125 0.5194538 0.125 0.7305462 0.6171047 0.2422552 0.6083593 0.2481033 0.5980436 0.25 0.5980436 0.25 0.521019 0.25 0.625 0.2209125 0.521019 0.25 0.521019 0.01879853 0.625 0.0281077 0.625 0.0281077 0.521019 0.01879853 0.6075075 0 0.521019 0.01879853 0.5385115 0 0.6075075 0 0.6075075 0 0.6142016 0.001568436 0.6198766 0.006582021 0.6198766 0.006582021 0.6236684 0.01673942 0.625 0.0281077 0.625 0.0281077 0.625 0.2209125 0.521019 0.25 0.625 0.2209125 0.6229481 0.2323939 0.5980436 0.25 0.6229481 0.2323939 0.6171047 0.2422552 0.5980436 0.25 0.5127928 0.5 0.4095584 0.25 0.4019564 0.25 0.4019564 0.25 0.521019 0.25 0.5127928 0.5 0.6822529 0.5806179 0.682253 0.5290875 0.875 0.5290875 0.875 0.5290875 0.875 0.7218922 0.6822529 0.5806179 0.4881481 0.75 0.4924754 0.75 0.4843853 0.75 0.4843853 0.75 0.4019565 1 0.4872354 0.75 0.4019565 1 0.4019565 0.8109666 0.4872354 0.75 0.5898174 0.5 0.5286209 0.25 0.521019 0.25 0.5980436 0.25 0.5956195 0.5 0.5898174 0.5 0.5956195 0.5 0.5903767 0.5 0.5898174 0.5 0.3770519 0.01200914 0.3828954 0.005697846 0.4019565 0 0.3828954 0.005697846 0.3916407 0.001480817 0.4019565 0 0.4019565 0 0.4949705 0 0.521019 0.01879853 0.521019 0.01879853 0.521019 0.25 0.375 0.2305462 0.4019565 0 0.375 0.01945376 0.3770519 0.01200914 0.521019 0.25 0.4019564 0.25 0.375 0.2305462 0.4019564 0.25 0.3916407 0.2485191 0.3828954 0.2443021 0.377052 0.2379909 0.4019564 0.25 0.3828954 0.2443021 0.377052 0.2379909 0.375 0.2305462 0.4019564 0.25 0.375 0.2305462 0.375 0.01945376 0.521019 0.01879853 0.875 0.7218922 0.875 0.734234 0.6828813 0.734234 0.6832349 0.7394573 0.6828813 0.734234 0.875 0.734234 0.875 0.734234 0.875 0.75 0.6832349 0.7394573 0.6157109 0.8080124 0.625 0.8081186 0.625 1 0.625 1 0.6151883 1 0.6157109 0.8080124 0.6075075 1 0.6075075 0.8079715 0.6151883 0.8080061 0.5309233 0.8155215 0.5385115 0.8132631 0.5385115 1 0.521019 1 0.521019 0.8096808 0.5272068 0.8172899 0.521019 0.8096808 0.5223773 0.8096609 0.5272068 0.8172899 0.5272068 0.8172899 0.5309233 0.8155215 0.5309233 1 0.5126712 0.8090751 0.521019 0.8096808 0.521019 1 0.521019 1 0.5062704 1 0.5126712 0.8090751 0.5062704 1 0.5062705 0.8091562 0.5126712 0.8090751 0.5006262 0.8087996 0.5006484 0.8088224 0.5006657 0.808805 0.5006484 0.8088224 0.5006615 0.8088359 0.5006657 0.808805 0.5006657 0.808805 0.5062704 0.8091575 0.5062704 1 0.5004563 0.8087175 0.5005772 0.8087555 0.5006262 0.8087996 0.4949705 1 0.4949705 0.8089277 0.5006657 0.808805 0.4949705 0.8089277 0.5004563 0.8087175 0.5006657 0.808805 0.5006657 0.808805 0.5062704 1 0.4949705 1 0.5385115 0.8132631 0.579463 0.8080023 0.5385115 1 0.579463 0.8080023 0.6075075 0.8079715 0.6075075 1 0.125 0.5194538 0.125 0.5120092 0.3045411 0.5120092 0.3045411 0.5120092 0.125 0.5120092 0.125 0.5 0.3916407 0.25 0.3916407 0.4295415 0.375 0.4295409 0.3916407 0.25 0.4019564 0.25 0.4019564 0.4295412 0.875 0.5179562 0.875 0.5290875 0.682253 0.5290875 0.875 0.5 0.875 0.5179562 0.6822526 0.5179562 0.6083593 0.25 0.625 0.25 0.625 0.4427475 0.5980436 0.25 0.6083593 0.25 0.6083593 0.4427484 0.3045409 0.7379909 0.125 0.7379909 0.125 0.7305462 0.125 0.75 0.125 0.7379909 0.3045409 0.7379909 0.3916407 1 0.375 1 0.375 0.8204591 0.4019556 0.8109672 0.4019565 0.8109666 0.4019556 0.8204603 0.4019565 0.8109666 0.4019565 1 0.4019556 0.8204603 0.4019565 1 0.3916407 1 0.4019556 0.8204603 0.125 0.7305462 0.125 0.5194538 0.304541 0.5194538 0.8012272 0.6746335 0.8015536 0.6863051 0.625 0.6863051 0.625 0.6863051 0.625 0.6532508 0.8005118 0.6532508 0.8005118 0.6532508 0.801218 0.6739752 0.625 0.6863051 0.6143665 0.75 0.6143665 0.9282488 0.4547678 0.9243733 0.2382931 0.6595793 0.375 0.6595793 0.375 0.6843556 0.375 0.6843556 0.375 0.7003759 0.2382932 0.7003759 0.2382921 0.7382425 0.2382932 0.7003759 0.375 0.7003759 0.375 0.7003759 0.375 0.75 0.2382921 0.7382425 0.375 0.75 0.205099 0.75 0.2382921 0.7382425 0.375 0.919901 0.375 0.75 0.4329106 0.75 0.4547678 0.75 0.4547678 0.9243733 0.4329106 0.9228817 0.8020731 0.7079614 0.8020793 0.7082177 0.625 0.7082177 0.625 0.7082177 0.625 0.6863051 0.8015536 0.6863051 0.8015536 0.6863051 0.8020418 0.7051597 0.625 0.7082177 0.625 0.75 0.625 0.7082177 0.8020793 0.7082177 0.6220692 0.75 0.625 0.75 0.625 0.9275701 0.6180247 0.75 0.6220692 0.75 0.6220692 0.9279507 0.6143665 0.75 0.6180247 0.75 0.6180247 0.9281848 0.6180084 0.5562068 0.6232083 0.6037076 0.5883923 0.5 0.6232083 0.6037076 0.625 0.6532508 0.5883923 0.5 0.625 0.6532508 0.625 0.6532508 0.5883923 0.5 0.625 0.6532508 0.6244795 0.6388598 0.5883923 0.5 0.6244795 0.6388598 0.6229692 0.6015232 0.5883923 0.5 0.6229692 0.6015232 0.6206166 0.5800326 0.6143664 0.5407714 0.5883923 0.5 0.6229692 0.6015232 0.6143664 0.5407714 0.6206166 0.5800326 0.6176523 0.5546974 0.6143664 0.5407714 0.6143664 0.5407714 0.4547678 0.5 0.375 0.6595793 0.4547678 0.5 0.4301181 0.5 0.378904 0.5291944 0.375 0.6595793 0.4547678 0.5 0.378904 0.5291944 0.4301181 0.5 0.4078813 0.5058108 0.3902342 0.5171976 0.3902342 0.5171976 0.378904 0.5291944 0.4301181 0.5 0.375 0.6595793 0.375 0.6595793 0.6143664 0.5407714 0.375 0.6595793 0.3776553 0.5307752 0.4292525 0.5 0.6143664 0.5407714 0.375 0.6595793 0.4292525 0.5 0.3776553 0.5307752 0.3853613 0.5210204 0.4292525 0.5 0.3853613 0.5210204 0.3973637 0.5116044 0.4292525 0.5 0.3973637 0.5116044 0.4124875 0.5032736 0.4292525 0.5 0.4292525 0.5 0.5883923 0.5 0.6143664 0.5407714 0.5883923 0.5 0.5997047 0.5049241 0.6099098 0.5218836 0.8001222 0.6436912 0.8005118 0.6532508 0.625 0.6532508 0.625 0.6532508 0.625 0.6058937 0.7990174 0.6142149 0.625 0.6058937 0.7988042 0.6058937 0.7990174 0.6142149 0.7988042 0.6058937 0.7989954 0.6104768 0.7990174 0.6142149 0.7990174 0.6142149 0.8000661 0.6393908 0.625 0.6532508 0.7981123 0.5761452 0.7988042 0.6058937 0.625 0.6058937 0.625 0.6058937 0.625 0.5 0.7981123 0.5761452 0.625 0.5 0.6099097 0.5 0.6099097 0.3272501 0.6057744 0.3273768 0.608696 0.3272869 0.6099097 0.5 0.608696 0.3272869 0.6099097 0.3272501 0.6099097 0.5 0.6057744 0.3273768 0.6099097 0.5 0.5997047 0.5 0.5997047 0.5 0.5883923 0.5 0.5883923 0.3279083 0.375 0.5429795 0.375 0.6595793 0.2382931 0.6595793 0.238293 0.5296981 0.375 0.5296981 0.375 0.5429795 0.2382931 0.5177168 0.375 0.5177168 0.375 0.5296981 0.375 0.5 0.375 0.5177168 0.2382931 0.5177168 0.4124876 0.363293 0.4124876 0.5 0.375 0.5 0.4292525 0.3632932 0.4292525 0.5 0.4124876 0.5 0.5673294 0.25 0.5707651 0.25 0.5807616 0.25 0.5639064 0.25 0.4292525 0.5 0.5673294 0.25 0.4292525 0.5 0.4292525 0.3632932 0.5673294 0.25 0.8024646 0.6740022 0.8038416 0.6532508 0.625 0.6532508 0.625 0.6532508 0.625 0.6863051 0.801608 0.6863051 0.8021669 0.6779075 0.8024646 0.6740022 0.625 0.6532508 0.6143665 0.75 0.4547678 0.75 0.4547678 0.9221246 0.2382735 0.6843556 0.375 0.6843556 0.375 0.6595793 0.375 0.7003759 0.375 0.6843556 0.2382735 0.6843556 0.2382735 0.7382397 0.208063 0.7382394 0.2070474 0.75 0.2070474 0.75 0.375 0.75 0.2382735 0.7382397 0.375 0.75 0.375 0.7003759 0.2382735 0.7382397 0.4329106 0.75 0.375 0.75 0.375 0.9179525 0.4329106 0.9208177 0.4547678 0.9221246 0.4547678 0.75 0.8004788 0.6912141 0.8013909 0.6898418 0.801608 0.6863051 0.801608 0.6863051 0.625 0.6863051 0.8004788 0.6912141 0.625 0.6863051 0.625 0.7082177 0.7996208 0.7005791 0.8004788 0.6912141 0.625 0.6863051 0.7996208 0.7005791 0.625 0.7082177 0.7999609 0.7082177 0.7996208 0.7005791 0.625 0.75 0.8007805 0.75 0.7999609 0.7082177 0.6220692 0.75 0.6220692 0.9263637 0.625 0.9257803 0.6180247 0.75 0.6180247 0.926654 0.6220692 0.9263637 0.6143665 0.9266228 0.6180247 0.926654 0.6180247 0.75 0.6206168 0.7432547 0.6229691 0.7290579 0.6143665 0.75 0.6229691 0.7290579 0.6244797 0.7074801 0.5883923 0.5 0.6244797 0.7074801 0.625 0.6863051 0.5883923 0.5 0.625 0.6863051 0.625 0.6532508 0.5883923 0.5 0.625 0.6532508 0.6232083 0.6037076 0.5883923 0.5 0.6232083 0.6037076 0.6180084 0.5562068 0.5883923 0.5 0.6180084 0.5562068 0.6099098 0.5218836 0.5883923 0.5 0.6099098 0.5218836 0.5997047 0.5049241 0.5883923 0.5 0.5883923 0.5 0.4292525 0.5 0.6143665 0.75 0.4292525 0.5 0.4124875 0.5032736 0.3973637 0.5116044 0.3973637 0.5116044 0.3853613 0.5210204 0.4292525 0.5 0.3853613 0.5210204 0.3776553 0.5307752 0.4292525 0.5 0.3776553 0.5307752 0.375 0.5429795 0.4292525 0.5 0.375 0.5429795 0.375 0.6595793 0.6143665 0.75 0.375 0.6595793 0.3789041 0.6869594 0.4547678 0.75 0.3789041 0.6869594 0.3902343 0.7111898 0.4301182 0.7449595 0.3902343 0.7111898 0.4078815 0.7311475 0.4301182 0.7449595 0.4301182 0.7449595 0.4547678 0.75 0.3789041 0.6869594 0.4547678 0.75 0.6143665 0.75 0.375 0.6595793 0.6143665 0.75 0.6176524 0.7484569 0.6206168 0.7432547 0.6229691 0.7290579 0.5883923 0.5 0.6143665 0.75 0.8069254 0.613809 0.8069269 0.6137913 0.807052 0.6087621 0.807052 0.6087621 0.8071592 0.6058937 0.625 0.6058937 0.625 0.6058937 0.625 0.6532508 0.8038416 0.6532508 0.8045544 0.6437072 0.8066627 0.6204558 0.8069254 0.613809 0.625 0.6058937 0.8038416 0.6532508 0.8045544 0.6437072 0.8069254 0.613809 0.807052 0.6087621 0.625 0.6058937 0.8086556 0.5 0.625 0.5 0.8083853 0.5246067 0.625 0.5 0.625 0.6058937 0.8071592 0.6058937 0.8083853 0.5246067 0.625 0.5 0.807952 0.5624476 0.6188874 0.315911 0.6188846 0.3159096 0.618869 0.3159025 0.618869 0.3159025 0.6188426 0.3158997 0.6188874 0.315911 0.6188426 0.3158997 0.6099097 0.3155275 0.6188874 0.315911 0.6099097 0.3155275 0.6099097 0.5 0.6188874 0.315911 0.6099097 0.5 0.625 0.5 0.6188874 0.315911 0.6029656 0.3151654 0.5997048 0.3150532 0.6031023 0.31519 0.5997048 0.3150532 0.5997047 0.5 0.6031023 0.31519 0.5997047 0.5 0.6099097 0.5 0.6031023 0.31519 0.5883923 0.5 0.5997047 0.5 0.5997048 0.3150532 0.375 0.6595793 0.375 0.5429795 0.2382739 0.5429795 0.2382739 0.5429795 0.375 0.5429795 0.375 0.5296981 0.2382736 0.5296981 0.375 0.5296981 0.375 0.5177168 0.375 0.5177168 0.375 0.5 0.2382737 0.4999999 0.375 0.5 0.4124876 0.5 0.4124876 0.3632736 0.4292525 0.5 0.4292525 0.363272 0.4124876 0.3632767 0.5673295 0.25 0.4292525 0.3632737 0.4292525 0.5 0.5639065 0.25 0.5820343 0.25 0.5673295 0.25 0.5820343 0.25 0.5720674 0.25 0.5673295 0.25 0.4053968 1 0.4053968 0.868868 0.5946033 0.8956977 0.875 0.5303968 0.875 0.7196032 0.7739598 0.7196032 0.5946033 0.25 0.4053968 0.25 0.375 0.2196032 0.4053968 0.25 0.3960037 0.2485123 0.38753 0.2441947 0.3808053 0.23747 0.4053968 0.25 0.38753 0.2441947 0.3808053 0.23747 0.3764877 0.2289963 0.4053968 0.25 0.3764877 0.2289963 0.375 0.2196032 0.4053968 0.25 0.375 0.2196032 0.375 0.03039675 0.625 0.03039675 0.375 0.03039675 0.3764877 0.02100366 0.4053968 0 0.625 0.03039675 0.375 0.03039675 0.4053968 0 0.3764877 0.02100366 0.3808053 0.01252996 0.4053968 0 0.3808053 0.01252996 0.38753 0.005805253 0.4053968 0 0.38753 0.005805253 0.3960037 0.001487672 0.4053968 0 0.4053968 0 0.5946033 0 0.625 0.03039675 0.5946033 0 0.6039964 0.001487672 0.61247 0.005805253 0.6191948 0.01252996 0.5946033 0 0.61247 0.005805253 0.6191948 0.01252996 0.6235122 0.02100366 0.5946033 0 0.6235122 0.02100366 0.625 0.03039675 0.5946033 0 0.625 0.03039675 0.625 0.2196032 0.375 0.2196032 0.625 0.2196032 0.6235123 0.2289963 0.5946033 0.25 0.375 0.2196032 0.625 0.2196032 0.5946033 0.25 0.6235123 0.2289963 0.6191948 0.23747 0.5946033 0.25 0.6191948 0.23747 0.61247 0.2441947 0.5946033 0.25 0.4053968 0.25 0.5946033 0.25 0.5946033 0.3550333 0.125 0.5303968 0.125 0.5210037 0.2603547 0.5210037 0.125 0.5210037 0.125 0.51253 0.2597544 0.51253 0.125 0.51253 0.125 0.5 0.2588196 0.5 0.375 0.25 0.3960037 0.25 0.3960037 0.3826419 0.3960037 0.25 0.4053968 0.25 0.4053968 0.3813358 0.875 0.5210037 0.875 0.5303968 0.7727873 0.5303968 0.875 0.5 0.875 0.5210037 0.7725268 0.5210037 0.61247 0.25 0.625 0.25 0.625 0.353114 0.6114484 0.3542138 0.6039963 0.3540581 0.6039963 0.25 0.6039963 0.25 0.61247 0.25 0.6114484 0.3542138 0.6007476 0.3541794 0.5946033 0.3550333 0.5946033 0.25 0.5946033 0.25 0.6039963 0.25 0.6007476 0.3541794 0.2602311 0.7289963 0.125 0.7289963 0.125 0.7196032 0.2596191 0.73747 0.125 0.73747 0.125 0.7289963 0.2586656 0.75 0.125 0.75 0.125 0.73747 0.3960037 0.8675362 0.3960037 1 0.375 1 0.4053968 0.868868 0.4053968 1 0.3960037 1 0.7739598 0.7196032 0.875 0.7196032 0.875 0.7289963 0.7738158 0.7289963 0.875 0.7289963 0.875 0.75 0.625 0.8982799 0.625 1 0.61247 1 0.6050331 0.8964163 0.61247 0.8974061 0.61247 1 0.61247 1 0.6039963 1 0.6050331 0.8964163 0.6010944 0.8966178 0.6039963 0.8965416 0.6039963 1 0.6039963 1 0.5946033 1 0.6010944 0.8966178 0.260442 0.7196032 0.125 0.7196032 0.260442 0.6434885 0.125 0.7196032 0.125 0.5303968 0.2607237 0.6168841 0.260442 0.6434885 0.125 0.7196032 0.2605614 0.643045 0.125 0.5303968 0.2605614 0.5303968 0.2607237 0.6168841
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 330 0 0 334 0 1 170 0 2 358 1 3 364 1 4 365 1 5 313 2 6 202 2 7 269 2 8 371 3 9 2 3 10 370 3 11 471 4 12 472 4 13 269 4 14 398 5 15 459 5 16 465 5 17 708 6 18 203 6 19 707 6 20 122 7 21 584 7 22 585 7 23 709 8 24 643 8 25 642 8 26 544 9 27 560 9 28 559 9 29 793 10 30 796 10 31 385 10 32 554 11 33 556 11 34 557 11 35 537 12 36 533 12 37 388 12 38 652 13 39 543 13 40 651 13 41 818 14 42 820 14 43 722 14 44 813 15 45 814 15 46 815 15 47 822 16 48 823 16 49 824 16 50 731 17 51 734 17 52 730 17 53 736 18 54 203 18 55 737 18 56 388 19 57 554 19 58 558 19 59 546 20 60 547 20 61 543 20 62 520 21 63 542 21 64 543 21 65 641 22 66 651 22 67 547 22 68 545 23 69 546 23 70 543 23 71 540 24 72 542 24 73 539 24 74 541 25 75 535 25 76 544 25 77 495 26 78 648 26 79 654 26 80 58 27 81 489 27 82 596 27 83 14 28 84 389 28 85 388 28 86 70 29 87 601 29 88 599 29 89 738 30 90 740 30 91 825 30 92 582 31 93 580 31 94 379 31 95 609 32 96 675 32 97 674 32 98 506 33 99 673 33 100 656 33 101 374 34 102 6 34 103 370 34 104 95 35 105 440 35 106 403 35 107 337 36 108 377 36 109 395 36 110 409 37 111 367 37 112 416 37 113 296 38 114 173 38 115 170 38 116 287 39 117 180 39 118 173 39 119 275 40 120 198 40 121 180 40 122 270 41 123 168 41 124 198 41 125 58 42 126 876 42 127 879 42 128 896 43 129 170 43 130 168 43 131 208 44 132 162 44 133 215 44 134 215 45 135 151 45 136 237 45 137 237 46 138 144 46 139 249 46 140 249 47 141 122 47 142 203 47 143 395 48 144 361 48 145 409 48 146 313 49 147 303 49 148 298 49 149 336 50 150 306 50 151 303 50 152 334 51 153 309 51 154 306 51 155 330 52 156 310 52 157 309 52 158 321 53 159 164 53 160 310 53 161 306 54 162 309 54 163 164 54 164 410 55 165 343 55 166 337 55 167 422 56 168 349 56 169 346 56 170 429 57 171 355 57 172 349 57 173 436 58 174 340 58 175 355 58 176 371 59 177 20 59 178 95 59 179 113 60 180 371 60 181 406 60 182 437 61 183 358 61 184 441 61 185 431 62 186 364 62 187 437 62 188 423 63 189 365 63 190 431 63 191 416 64 192 366 64 193 423 64 194 414 65 195 346 65 196 343 65 197 441 66 198 113 66 199 405 66 200 379 67 201 20 67 202 70 67 203 2 68 204 374 68 205 370 68 206 20 69 207 370 69 208 6 69 209 378 70 210 376 70 211 380 70 212 394 71 213 389 71 214 391 71 215 403 72 216 407 72 217 406 72 218 407 73 219 408 73 220 406 73 221 408 74 222 405 74 223 406 74 224 409 75 225 412 75 226 411 75 227 412 76 228 413 76 229 411 76 230 413 77 231 410 77 232 411 77 233 398 78 234 394 78 235 402 78 236 402 79 237 391 79 238 400 79 239 400 80 240 383 80 241 395 80 242 398 81 243 380 81 244 376 81 245 402 82 246 382 82 247 380 82 248 400 83 249 377 83 250 382 83 251 405 84 252 443 84 253 441 84 254 443 85 255 407 85 256 442 85 257 442 86 258 403 86 259 440 86 260 441 87 261 439 87 262 437 87 263 439 88 264 442 88 265 438 88 266 438 89 267 440 89 268 436 89 269 437 90 270 435 90 271 431 90 272 435 91 273 438 91 274 434 91 275 434 92 276 436 92 277 429 92 278 431 93 279 428 93 280 423 93 281 428 94 282 434 94 283 425 94 284 425 95 285 429 95 286 422 95 287 423 96 288 419 96 289 416 96 290 419 97 291 425 97 292 417 97 293 417 98 294 422 98 295 414 98 296 416 99 297 412 99 298 409 99 299 412 100 300 417 100 301 413 100 302 413 101 303 414 101 304 410 101 305 346 102 306 349 102 307 340 102 308 342 103 309 481 103 310 393 103 311 278 105 315 451 105 316 452 105 317 485 106 318 396 106 319 483 106 320 471 107 321 33 107 322 472 107 323 470 108 324 41 108 325 471 108 326 469 110 330 66 110 331 470 110 332 472 112 336 427 112 337 477 112 338 284 113 339 465 113 340 311 113 341 312 114 342 456 114 343 339 114 344 339 130 390 466 130 391 351 130 392 351 131 393 467 131 394 353 131 395 353 132 396 468 132 397 359 132 398 359 133 399 449 133 400 362 133 401 362 134 402 455 134 403 342 134 404 311 135 405 459 135 406 327 135 407 327 136 408 460 136 409 332 136 410 332 137 411 461 137 412 335 137 413 335 138 414 457 138 415 338 138 416 338 139 417 458 139 418 312 139 419 300 140 420 452 140 421 453 140 422 304 141 423 453 141 424 454 141 425 307 142 426 454 142 427 462 142 428 308 143 429 462 143 430 463 143 431 284 144 432 463 144 433 464 144 434 393 146 438 482 146 439 397 146 440 397 147 441 479 147 442 399 147 443 480 148 444 399 148 445 479 148 446 484 149 447 401 149 448 480 149 449 483 150 450 404 150 451 484 150 452 384 151 453 450 151 454 451 151 455 392 152 456 446 152 457 450 152 458 390 153 459 447 153 460 446 153 461 387 154 462 448 154 463 447 154 464 386 155 465 444 155 466 448 155 467 477 156 468 433 156 469 475 156 470 475 157 471 432 157 472 473 157 473 473 158 474 430 158 475 486 158 476 486 159 477 426 159 478 485 159 479 474 160 480 415 160 481 469 160 482 421 161 483 474 161 484 476 161 485 424 162 486 476 162 487 478 162 488 418 163 489 478 163 490 445 163 491 381 164 492 445 164 493 444 164 494 272 165 495 252 165 496 613 165 497 297 166 498 508 166 499 502 166 500 282 167 501 506 167 502 241 167 503 499 168 504 616 168 505 299 168 506 301 169 507 502 169 508 501 169 509 302 170 510 501 170 511 503 170 512 305 171 513 503 171 514 500 171 515 299 172 516 500 172 517 499 172 518 508 173 519 272 173 520 504 173 521 504 174 522 262 174 523 507 174 524 507 175 525 257 175 526 505 175 527 505 176 528 241 176 529 506 176 530 610 177 531 282 177 532 617 177 533 368 178 534 354 178 535 629 178 536 354 179 537 492 179 538 497 179 539 352 180 540 487 180 541 363 180 542 489 181 543 626 181 544 597 181 545 368 182 546 491 182 547 492 182 548 491 183 549 373 183 550 493 183 551 375 184 552 493 184 553 373 184 554 369 185 555 490 185 556 375 185 557 360 186 558 497 186 559 498 186 560 357 187 561 498 187 562 494 187 563 356 188 564 494 188 565 496 188 566 352 189 567 496 189 568 495 189 569 363 190 570 592 190 571 625 190 572 676 191 573 188 191 574 677 191 575 280 193 579 679 193 580 228 193 581 279 194 582 681 194 583 680 194 584 271 195 585 523 195 586 522 195 587 273 196 588 522 196 589 524 196 590 276 197 591 524 197 592 521 197 593 682 198 594 276 198 595 657 198 596 268 199 597 683 199 598 681 199 599 280 200 600 684 200 601 678 200 602 290 201 603 685 201 604 684 201 605 286 202 606 686 202 607 685 202 608 285 203 609 687 203 610 686 203 611 283 204 612 680 204 613 687 204 614 530 205 615 218 205 616 525 205 617 525 206 618 209 206 619 527 206 620 527 207 621 205 207 622 526 207 623 526 208 624 199 208 625 528 208 626 528 209 627 188 209 628 529 209 629 228 210 630 688 210 631 247 210 632 247 211 633 689 211 634 250 211 635 250 212 636 690 212 637 254 212 638 254 213 639 691 213 640 259 213 641 259 214 642 677 214 643 245 214 644 265 215 645 530 215 646 523 215 647 520 216 648 692 216 649 318 216 650 341 217 651 320 217 652 698 217 653 341 218 654 511 218 655 510 218 656 344 219 657 516 219 658 511 219 659 345 220 660 517 220 661 516 220 662 347 221 663 518 221 664 517 221 665 518 222 666 695 222 667 649 222 668 333 223 669 514 223 670 512 223 671 331 224 672 512 224 673 513 224 674 329 225 675 513 225 676 515 225 677 325 226 678 515 226 679 519 226 680 318 227 681 519 227 682 520 227 683 320 228 684 510 228 685 514 228 686 5 229 687 744 229 688 550 229 689 551 230 690 5 230 691 550 230 692 266 231 693 772 231 694 5 231 695 5 232 696 551 232 697 548 232 698 549 233 699 773 233 700 266 233 701 781 234 702 782 234 703 533 234 704 274 235 705 545 235 706 543 235 707 774 236 708 544 236 709 729 236 710 785 237 711 328 237 712 274 237 713 328 238 714 546 238 715 274 238 716 323 239 717 531 239 718 533 239 719 324 240 720 532 240 721 323 240 722 538 241 723 326 241 724 539 241 725 322 242 726 540 242 727 326 242 728 547 243 729 785 243 730 710 243 731 537 244 732 536 244 733 319 244 734 317 245 735 536 245 736 534 245 737 316 246 738 534 246 739 535 246 740 316 247 741 535 247 742 541 247 743 580 248 744 64 248 745 581 248 746 581 249 747 63 249 748 579 249 749 62 250 750 572 250 751 571 250 752 572 251 753 853 251 754 832 251 755 863 252 756 862 252 757 222 252 758 574 253 759 854 253 760 169 253 761 212 254 762 580 254 763 582 254 764 222 255 765 582 255 766 578 255 767 225 256 768 578 256 769 577 256 770 234 257 771 577 257 772 575 257 773 243 258 774 575 258 775 576 258 776 214 259 777 576 259 778 573 259 779 169 260 780 573 260 781 574 260 782 564 261 783 260 261 784 563 261 785 558 262 786 267 262 787 564 262 788 554 263 789 264 263 790 556 263 791 263 264 792 553 264 793 552 264 794 291 265 795 869 265 796 870 265 797 800 266 798 281 266 799 865 266 800 288 267 801 562 267 802 260 267 803 567 268 804 291 268 805 568 268 806 568 269 807 292 269 808 566 269 809 294 270 810 565 270 811 292 270 812 295 271 813 569 271 814 294 271 815 289 272 816 559 272 817 560 272 818 289 273 819 561 273 820 559 273 821 145 275 825 613 275 826 622 275 827 39 276 828 606 276 829 114 276 830 617 277 831 78 277 832 118 277 833 39 278 834 604 278 835 605 278 836 49 279 837 603 279 838 604 279 839 45 280 840 602 280 841 603 280 842 29 281 843 601 281 844 598 281 845 29 282 846 599 282 847 601 282 848 614 283 849 145 283 850 622 283 851 158 284 852 614 284 853 620 284 854 615 285 855 158 285 856 620 285 857 616 286 858 599 286 859 153 286 860 613 287 861 106 287 862 619 287 863 106 288 864 612 288 865 619 288 866 612 289 867 89 289 868 621 289 869 89 290 870 618 290 871 621 290 872 607 291 873 114 291 874 606 291 875 121 292 876 608 292 877 126 292 878 611 293 879 126 293 880 608 293 881 609 294 882 129 294 883 611 294 884 224 296 888 632 296 889 629 296 890 174 297 891 589 297 892 588 297 893 625 298 894 591 298 895 242 298 896 174 299 897 587 299 898 184 299 899 585 300 900 184 300 901 586 300 902 181 301 903 584 301 904 177 301 905 177 302 906 584 302 907 583 302 908 596 303 909 171 303 910 595 303 911 251 304 912 628 304 913 632 304 914 628 305 915 256 305 916 631 305 917 631 306 918 258 306 919 627 306 920 596 307 921 597 307 922 626 307 923 633 308 924 224 308 925 629 308 926 231 309 927 633 309 928 623 309 929 230 310 930 623 310 931 630 310 932 230 311 933 624 311 934 220 311 935 589 312 936 244 312 937 590 312 938 590 313 939 246 313 940 594 313 941 594 314 942 248 314 943 593 314 944 593 315 945 242 315 946 591 315 947 663 316 948 662 316 949 660 316 950 678 317 951 684 317 952 149 317 953 92 318 954 669 318 955 668 318 956 656 319 957 673 319 958 128 319 959 657 320 960 124 320 961 682 320 962 127 321 963 658 321 964 659 321 965 115 322 966 659 322 967 655 322 968 132 323 969 670 323 970 669 323 971 149 324 972 671 324 973 670 324 974 147 325 975 672 325 976 671 325 977 142 326 978 675 326 979 672 326 980 136 327 981 674 327 982 675 327 983 74 328 984 661 328 985 676 328 986 92 329 987 667 329 988 98 329 989 98 330 990 666 330 991 110 330 992 110 331 993 665 331 994 111 331 995 111 332 996 664 332 997 112 332 998 663 333 999 112 333 1000 664 333 1001 651 334 1002 641 334 1003 642 334 1004 640 336 1008 206 336 1009 647 336 1010 229 337 1011 635 337 1012 634 337 1013 217 338 1014 697 338 1015 701 338 1016 221 339 1017 700 339 1018 697 339 1019 223 340 1020 696 340 1021 700 340 1022 226 341 1023 695 341 1024 696 341 1025 219 342 1026 654 342 1027 648 342 1028 239 343 1029 640 343 1030 639 343 1031 238 344 1032 639 344 1033 638 344 1034 235 345 1035 638 345 1036 637 345 1037 233 346 1038 637 346 1039 636 346 1040 229 347 1041 636 347 1042 635 347 1043 702 348 1044 194 348 1045 698 348 1046 201 349 1047 702 349 1048 693 349 1049 200 350 1050 693 350 1051 699 350 1052 196 351 1053 699 351 1054 694 351 1055 692 352 1056 652 352 1057 191 352 1058 210 353 1059 647 353 1060 206 353 1061 211 354 1062 646 354 1063 210 354 1064 213 355 1065 645 355 1066 211 355 1067 216 356 1068 644 356 1069 213 356 1070 643 357 1071 207 357 1072 642 357 1073 194 358 1074 701 358 1075 698 358 1076 1 360 1080 744 360 1081 771 360 1082 96 361 1083 764 361 1084 10 361 1085 48 362 1086 738 362 1087 741 362 1088 1 363 1089 772 363 1090 773 363 1091 10 369 1107 763 369 1108 37 369 1109 37 370 1110 762 370 1111 27 370 1112 27 371 1113 762 371 1114 743 371 1115 19 372 1116 759 372 1117 9 372 1118 52 373 1119 761 373 1120 61 373 1121 61 374 1122 761 374 1123 747 374 1124 745 375 1125 739 375 1126 59 375 1127 738 376 1128 59 376 1129 740 376 1130 9 377 1131 760 377 1132 52 377 1133 94 378 1134 749 378 1135 750 378 1136 91 379 1137 750 379 1138 753 379 1139 86 380 1140 753 380 1141 755 380 1142 82 381 1143 755 381 1144 756 381 1145 96 382 1146 769 382 1147 770 382 1148 103 383 1149 768 383 1150 769 383 1151 104 384 1152 767 384 1153 768 384 1154 109 385 1155 765 385 1156 767 385 1157 751 386 1158 76 386 1159 752 386 1160 752 387 1161 77 387 1162 754 387 1163 754 388 1164 79 388 1165 757 388 1166 757 389 1167 73 389 1168 758 389 1169 749 390 1170 68 390 1171 751 390 1172 130 392 1176 786 392 1177 775 392 1178 139 393 1179 707 393 1180 706 393 1181 157 394 1182 728 394 1183 732 394 1184 785 395 1185 130 395 1186 192 395 1187 139 401 1203 708 401 1204 707 401 1205 143 402 1206 705 402 1207 704 402 1208 140 403 1209 737 403 1210 703 403 1211 134 404 1212 737 404 1213 140 404 1214 717 405 1215 160 405 1216 167 405 1217 167 406 1218 165 406 1219 716 406 1220 725 407 1221 723 407 1222 721 407 1223 735 408 1224 731 408 1225 724 408 1226 160 409 1227 715 409 1228 134 409 1229 183 410 1230 782 410 1231 781 410 1232 782 411 1233 186 411 1234 780 411 1235 185 412 1236 780 412 1237 186 412 1238 185 413 1239 776 413 1240 779 413 1241 193 414 1242 714 414 1243 713 414 1244 195 415 1245 713 415 1246 712 415 1247 197 416 1248 712 416 1249 711 416 1250 192 417 1251 711 417 1252 709 417 1253 783 418 1254 172 418 1255 784 418 1256 178 419 1257 783 419 1258 777 419 1259 179 420 1260 777 420 1261 778 420 1262 179 421 1263 778 421 1264 774 421 1265 172 422 1266 781 422 1267 784 422 1268 843 423 1269 844 423 1270 47 423 1271 50 424 1272 834 424 1273 13 424 1274 857 425 1275 35 425 1276 858 425 1277 35 426 1278 856 426 1279 858 426 1280 831 427 1281 832 427 1282 853 427 1283 831 428 1284 23 428 1285 833 428 1286 13 429 1287 833 429 1288 23 429 1289 846 430 1290 847 430 1291 51 430 1292 54 431 1293 848 431 1294 849 431 1295 55 432 1296 849 432 1297 850 432 1298 57 433 1299 850 433 1300 852 433 1301 50 434 1302 852 434 1303 851 434 1304 840 436 1308 841 436 1309 67 436 1310 72 437 1311 835 437 1312 836 437 1313 72 438 1314 830 438 1315 835 438 1316 69 439 1317 829 439 1318 826 439 1319 69 440 1320 827 440 1321 829 440 1322 81 441 1323 857 441 1324 862 441 1325 863 442 1326 81 442 1327 862 442 1328 860 443 1329 85 443 1330 863 443 1331 88 444 1332 860 444 1333 861 444 1334 859 445 1335 88 445 1336 861 445 1337 855 446 1338 90 446 1339 859 446 1340 854 447 1341 827 447 1342 65 447 1343 820 448 1344 133 448 1345 821 448 1346 117 449 1347 796 449 1348 793 449 1349 871 450 1350 101 450 1351 874 450 1352 107 451 1353 871 451 1354 872 451 1355 107 452 1356 872 452 1357 864 452 1358 102 453 1359 788 453 1360 795 453 1361 795 454 1362 99 454 1363 102 454 1364 787 455 1365 824 455 1366 823 455 1367 120 456 1368 790 456 1369 119 456 1370 123 457 1371 791 457 1372 120 457 1373 125 458 1374 792 458 1375 123 458 1376 793 459 1377 125 459 1378 117 459 1379 814 461 1383 141 461 1384 816 461 1385 811 462 1386 810 462 1387 138 462 1388 138 463 1389 807 463 1390 806 463 1391 137 464 1392 797 464 1393 798 464 1394 131 465 1395 801 465 1396 799 465 1397 101 466 1398 869 466 1399 874 466 1400 869 467 1401 152 467 1402 870 467 1403 870 468 1404 154 468 1405 868 468 1406 154 469 1407 873 469 1408 868 469 1409 156 470 1410 867 470 1411 873 470 1412 150 471 1413 867 471 1414 159 471 1415 865 472 1416 150 472 1417 131 472 1418 3 473 1419 878 473 1420 12 473 1421 36 474 1422 900 474 1423 902 474 1424 24 476 1428 887 476 1429 886 476 1430 26 477 1431 889 477 1432 884 477 1433 34 478 1434 890 478 1435 889 478 1436 32 479 1437 891 479 1438 890 479 1439 30 480 1440 885 480 1441 891 480 1442 28 481 1443 886 481 1444 885 481 1445 40 482 1446 902 482 1447 905 482 1448 43 483 1449 905 483 1450 903 483 1451 44 484 1452 903 484 1453 904 484 1454 44 485 1455 904 485 1456 895 485 1457 46 486 1458 896 486 1459 888 486 1460 882 487 1461 0 487 1462 881 487 1463 883 488 1464 4 488 1465 882 488 1466 879 489 1467 7 489 1468 883 489 1469 876 490 1470 8 490 1471 879 490 1472 875 491 1473 11 491 1474 876 491 1475 900 492 1476 22 492 1477 899 492 1478 899 493 1479 21 493 1480 898 493 1481 898 494 1482 18 494 1483 897 494 1484 17 495 1485 892 495 1486 894 495 1487 12 496 1488 878 496 1489 877 496 1490 901 497 1491 893 497 1492 0 497 1493 334 498 1494 336 498 1495 170 498 1496 336 499 1497 313 499 1498 170 499 1499 313 500 1500 269 500 1501 296 500 1502 296 501 1503 170 501 1504 313 501 1505 170 502 1506 321 502 1507 330 502 1508 365 503 1509 366 503 1510 358 503 1511 366 504 1512 367 504 1513 358 504 1514 367 505 1515 361 505 1516 358 505 1517 361 506 1518 383 506 1519 389 506 1520 358 507 1521 361 507 1522 14 507 1523 389 508 1524 14 508 1525 361 508 1526 14 509 1527 113 509 1528 358 509 1529 313 510 1530 298 510 1531 202 510 1532 371 511 1533 14 511 1534 2 511 1535 287 512 1536 296 512 1537 269 512 1538 269 513 1539 202 513 1540 471 513 1541 202 514 1542 208 514 1543 215 514 1544 471 515 1545 202 515 1546 470 515 1547 215 516 1548 237 516 1549 202 516 1550 237 517 1551 249 517 1552 202 517 1553 249 518 1554 203 518 1555 202 518 1556 385 519 1557 446 519 1558 447 519 1559 385 520 1560 447 520 1561 448 520 1562 203 521 1563 385 521 1564 444 521 1565 445 522 1566 203 522 1567 444 522 1568 275 523 1569 287 523 1570 269 523 1571 261 524 1572 270 524 1573 269 524 1574 270 525 1575 275 525 1576 269 525 1577 480 526 1578 479 526 1579 376 526 1580 484 527 1581 480 527 1582 376 527 1583 376 528 1584 261 528 1585 483 528 1586 485 529 1587 261 529 1588 486 529 1589 470 530 1590 202 530 1591 469 530 1592 477 531 1593 269 531 1594 472 531 1595 385 532 1596 448 532 1597 444 532 1598 483 533 1599 484 533 1600 376 533 1601 485 534 1602 483 534 1603 261 534 1604 203 535 1605 445 535 1606 478 535 1607 203 536 1608 478 536 1609 202 536 1610 486 537 1611 261 537 1612 269 537 1613 478 538 1614 476 538 1615 202 538 1616 476 539 1617 474 539 1618 202 539 1619 473 540 1620 486 540 1621 269 540 1622 475 541 1623 473 541 1624 269 541 1625 474 542 1626 469 542 1627 202 542 1628 477 543 1629 475 543 1630 269 543 1631 450 544 1632 446 544 1633 385 544 1634 385 545 1635 398 545 1636 454 545 1637 398 546 1638 376 546 1639 468 546 1640 456 547 1641 398 547 1642 466 547 1643 376 548 1644 479 548 1645 482 548 1646 376 549 1647 482 549 1648 481 549 1649 451 550 1650 450 550 1651 385 550 1652 452 551 1653 451 551 1654 385 551 1655 376 552 1656 481 552 1657 455 552 1658 376 553 1659 455 553 1660 449 553 1661 453 554 1662 452 554 1663 385 554 1664 454 555 1665 453 555 1666 385 555 1667 376 556 1668 449 556 1669 468 556 1670 468 557 1671 467 557 1672 398 557 1673 462 558 1674 454 558 1675 398 558 1676 463 559 1677 462 559 1678 398 559 1679 467 560 1680 466 560 1681 398 560 1682 456 561 1683 458 561 1684 398 561 1685 458 562 1686 457 562 1687 398 562 1688 464 563 1689 463 563 1690 398 563 1691 465 564 1692 464 564 1693 398 564 1694 461 565 1695 398 565 1696 457 565 1697 461 566 1698 460 566 1699 398 566 1700 460 567 1701 459 567 1702 398 567 1703 708 568 1704 704 568 1705 203 568 1706 704 569 1707 705 569 1708 203 569 1709 705 570 1710 703 570 1711 203 570 1712 203 571 1713 706 571 1714 707 571 1715 586 572 1716 587 572 1717 122 572 1718 122 573 1719 583 573 1720 584 573 1721 585 574 1722 586 574 1723 122 574 1724 488 575 1725 487 575 1726 635 575 1727 487 576 1728 634 576 1729 635 576 1730 591 577 1731 592 577 1732 488 577 1733 591 578 1734 488 578 1735 635 578 1736 591 579 1737 635 579 1738 636 579 1739 593 580 1740 591 580 1741 636 580 1742 593 581 1743 636 581 1744 637 581 1745 594 582 1746 593 582 1747 637 582 1748 594 583 1749 637 583 1750 638 583 1751 590 584 1752 594 584 1753 638 584 1754 590 585 1755 638 585 1756 639 585 1757 589 586 1758 590 586 1759 639 586 1760 589 587 1761 639 587 1762 640 587 1763 122 588 1764 587 588 1765 588 588 1766 589 589 1767 640 589 1768 203 589 1769 640 590 1770 647 590 1771 203 590 1772 122 591 1773 588 591 1774 589 591 1775 706 592 1776 203 592 1777 714 592 1778 203 593 1779 122 593 1780 589 593 1781 714 594 1782 203 594 1783 647 594 1784 713 595 1785 714 595 1786 646 595 1787 714 596 1788 647 596 1789 646 596 1790 712 597 1791 713 597 1792 645 597 1793 713 598 1794 646 598 1795 645 598 1796 711 599 1797 712 599 1798 644 599 1799 712 600 1800 645 600 1801 644 600 1802 547 601 1803 710 601 1804 709 601 1805 709 602 1806 711 602 1807 643 602 1808 711 603 1809 644 603 1810 643 603 1811 641 604 1812 547 604 1813 642 604 1814 547 605 1815 709 605 1816 642 605 1817 544 606 1818 535 606 1819 560 606 1820 788 607 1821 789 607 1822 552 607 1823 552 608 1824 553 608 1825 788 608 1826 553 609 1827 388 609 1828 385 609 1829 385 610 1830 715 610 1831 718 610 1832 717 611 1833 716 611 1834 791 611 1835 716 612 1836 787 612 1837 790 612 1838 385 613 1839 718 613 1840 794 613 1841 718 614 1842 717 614 1843 794 614 1844 385 615 1845 794 615 1846 793 615 1847 553 616 1848 385 616 1849 788 616 1850 716 617 1851 790 617 1852 791 617 1853 795 618 1854 788 618 1855 385 618 1856 796 619 1857 795 619 1858 385 619 1859 717 620 1860 791 620 1861 792 620 1862 717 621 1863 792 621 1864 794 621 1865 557 622 1866 558 622 1867 554 622 1868 554 623 1869 555 623 1870 556 623 1871 649 624 1872 650 624 1873 648 624 1874 648 625 1875 495 625 1876 649 625 1877 495 626 1878 496 626 1879 649 626 1880 496 627 1881 494 627 1882 649 627 1883 649 628 1884 494 628 1885 518 628 1886 494 629 1887 498 629 1888 516 629 1889 518 630 1890 494 630 1891 517 630 1892 517 631 1893 494 631 1894 516 631 1895 516 632 1896 498 632 1897 511 632 1898 498 633 1899 497 633 1900 511 633 1901 511 634 1902 497 634 1903 510 634 1904 497 635 1905 492 635 1906 58 635 1907 497 636 1908 58 636 1909 510 636 1910 542 637 1911 520 637 1912 519 637 1913 539 638 1914 542 638 1915 519 638 1916 539 639 1917 519 639 1918 515 639 1919 531 640 1920 532 640 1921 513 640 1922 532 641 1923 538 641 1924 513 641 1925 538 642 1926 539 642 1927 515 642 1928 538 643 1929 515 643 1930 513 643 1931 531 644 1932 513 644 1933 512 644 1934 533 645 1935 531 645 1936 514 645 1937 531 646 1938 512 646 1939 514 646 1940 533 647 1941 514 647 1942 58 647 1943 514 648 1944 510 648 1945 58 648 1946 493 649 1947 490 649 1948 58 649 1949 58 650 1950 388 650 1951 533 650 1952 388 651 1953 563 651 1954 562 651 1955 567 652 1956 388 652 1957 562 652 1958 388 653 1959 567 653 1960 537 653 1961 491 654 1962 493 654 1963 58 654 1964 492 655 1965 491 655 1966 58 655 1967 566 656 1968 565 656 1969 534 656 1970 565 657 1971 569 657 1972 534 657 1973 570 658 1974 560 658 1975 535 658 1976 569 659 1977 570 659 1978 535 659 1979 569 660 1980 535 660 1981 534 660 1982 566 661 1983 534 661 1984 536 661 1985 568 662 1986 566 662 1987 536 662 1988 568 663 1989 536 663 1990 567 663 1991 536 664 1992 537 664 1993 567 664 1994 652 665 1995 653 665 1996 520 665 1997 520 666 1998 543 666 1999 652 666 2000 543 667 2001 547 667 2002 651 667 2003 727 668 2004 729 668 2005 544 668 2006 544 669 2007 559 669 2008 727 669 2009 559 670 2010 561 670 2011 727 670 2012 561 671 2013 800 671 2014 799 671 2015 561 672 2016 799 672 2017 728 672 2018 727 673 2019 561 673 2020 728 673 2021 732 674 2022 728 674 2023 797 674 2024 799 675 2025 801 675 2026 728 675 2027 728 676 2028 801 676 2029 802 676 2030 802 677 2031 798 677 2032 728 677 2033 798 678 2034 797 678 2035 728 678 2036 734 679 2037 735 679 2038 730 679 2039 735 680 2040 733 680 2041 730 680 2042 733 681 2043 732 681 2044 797 681 2045 797 682 2046 803 682 2047 733 682 2048 803 683 2049 804 683 2050 733 683 2051 724 684 2052 726 684 2053 733 684 2054 726 685 2055 730 685 2056 733 685 2057 721 686 2058 723 686 2059 815 686 2060 723 687 2061 725 687 2062 815 687 2063 722 688 2064 721 688 2065 817 688 2066 812 689 2067 725 689 2068 811 689 2069 725 690 2070 724 690 2071 809 690 2072 724 691 2073 733 691 2074 807 691 2075 807 692 2076 733 692 2077 805 692 2078 805 693 2079 806 693 2080 807 693 2081 733 694 2082 804 694 2083 805 694 2084 807 695 2085 808 695 2086 809 695 2087 724 696 2088 807 696 2089 809 696 2090 719 697 2091 720 697 2092 716 697 2093 720 698 2094 722 698 2095 824 698 2096 815 699 2097 725 699 2098 813 699 2099 725 700 2100 812 700 2101 813 700 2102 811 701 2103 725 701 2104 810 701 2105 809 702 2106 810 702 2107 725 702 2108 787 703 2109 716 703 2110 720 703 2111 821 704 2112 822 704 2113 824 704 2114 824 705 2115 787 705 2116 720 705 2117 721 706 2118 816 706 2119 817 706 2120 721 707 2121 815 707 2122 816 707 2123 821 708 2124 824 708 2125 722 708 2126 818 709 2127 819 709 2128 820 709 2129 820 710 2130 821 710 2131 722 710 2132 722 711 2133 817 711 2134 818 711 2135 736 712 2136 715 712 2137 203 712 2138 715 713 2139 385 713 2140 203 713 2141 203 714 2142 703 714 2143 737 714 2144 564 715 2145 563 715 2146 388 715 2147 388 716 2148 553 716 2149 554 716 2150 558 717 2151 564 717 2152 388 717 2153 654 718 2154 634 718 2155 495 718 2156 634 719 2157 487 719 2158 495 719 2159 595 720 2160 583 720 2161 122 720 2162 58 721 2163 490 721 2164 489 721 2165 489 722 2166 597 722 2167 596 722 2168 596 723 2169 595 723 2170 58 723 2171 595 724 2172 122 724 2173 58 724 2174 388 725 2175 58 725 2176 14 725 2177 58 726 2178 2 726 2179 14 726 2180 499 727 2181 500 727 2182 70 727 2183 70 728 2184 168 728 2185 601 728 2186 168 729 2187 598 729 2188 601 729 2189 600 730 2190 499 730 2191 599 730 2192 499 731 2193 70 731 2194 599 731 2195 825 732 2196 826 732 2197 741 732 2198 825 733 2199 741 733 2200 738 733 2201 740 734 2202 739 734 2203 825 734 2204 658 735 2205 657 735 2206 504 735 2207 657 736 2208 521 736 2209 504 736 2210 506 737 2211 656 737 2212 655 737 2213 505 738 2214 506 738 2215 659 738 2216 506 739 2217 655 739 2218 659 739 2219 507 740 2220 505 740 2221 658 740 2222 505 741 2223 659 741 2224 658 741 2225 504 742 2226 507 742 2227 658 742 2228 508 743 2229 504 743 2230 522 743 2231 504 744 2232 521 744 2233 524 744 2234 504 745 2235 524 745 2236 522 745 2237 508 746 2238 522 746 2239 523 746 2240 502 747 2241 508 747 2242 70 747 2243 508 748 2244 523 748 2245 70 748 2246 70 749 2247 500 749 2248 503 749 2249 742 750 2250 743 750 2251 261 750 2252 759 751 2253 742 751 2254 261 751 2255 70 752 2256 503 752 2257 501 752 2258 70 753 2259 501 753 2260 502 753 2261 759 754 2262 261 754 2263 760 754 2264 261 755 2265 376 755 2266 851 755 2267 760 756 2268 261 756 2269 852 756 2270 852 757 2271 261 757 2272 851 757 2273 379 758 2274 70 758 2275 530 758 2276 70 759 2277 523 759 2278 530 759 2279 761 760 2280 760 760 2281 852 760 2282 748 761 2283 747 761 2284 848 761 2285 747 762 2286 761 762 2287 848 762 2288 848 763 2289 761 763 2290 849 763 2291 739 764 2292 745 764 2293 840 764 2294 745 765 2295 746 765 2296 840 765 2297 739 766 2298 838 766 2299 837 766 2300 825 767 2301 739 767 2302 830 767 2303 838 768 2304 739 768 2305 839 768 2306 830 769 2307 739 769 2308 835 769 2309 746 770 2310 748 770 2311 842 770 2312 761 771 2313 852 771 2314 850 771 2315 379 772 2316 530 772 2317 749 772 2318 530 773 2319 525 773 2320 749 773 2321 835 774 2322 739 774 2323 836 774 2324 837 775 2325 836 775 2326 739 775 2327 525 776 2328 527 776 2329 750 776 2330 749 777 2331 525 777 2332 750 777 2333 840 778 2334 839 778 2335 739 778 2336 529 779 2337 661 779 2338 551 779 2339 661 780 2340 660 780 2341 551 780 2342 660 781 2343 662 781 2344 551 781 2345 662 782 2346 548 782 2347 551 782 2348 550 783 2349 744 783 2350 756 783 2351 529 784 2352 551 784 2353 550 784 2354 528 785 2355 529 785 2356 756 785 2357 529 786 2358 550 786 2359 756 786 2360 526 787 2361 528 787 2362 755 787 2363 528 788 2364 756 788 2365 755 788 2366 842 789 2367 841 789 2368 746 789 2369 841 790 2370 840 790 2371 746 790 2372 845 791 2373 844 791 2374 748 791 2375 844 792 2376 843 792 2377 748 792 2378 843 793 2379 842 793 2380 748 793 2381 527 794 2382 526 794 2383 753 794 2384 526 795 2385 755 795 2386 753 795 2387 848 796 2388 847 796 2389 846 796 2390 846 797 2391 845 797 2392 748 797 2393 527 798 2394 753 798 2395 750 798 2396 848 799 2397 846 799 2398 748 799 2399 379 800 2400 749 800 2401 751 800 2402 850 801 2403 849 801 2404 761 801 2405 379 802 2406 751 802 2407 582 802 2408 751 803 2409 752 803 2410 578 803 2411 751 804 2412 578 804 2413 582 804 2414 752 805 2415 754 805 2416 577 805 2417 578 806 2418 752 806 2419 577 806 2420 741 807 2421 826 807 2422 829 807 2423 827 808 2424 828 808 2425 574 808 2426 741 809 2427 829 809 2428 827 809 2429 758 810 2430 741 810 2431 574 810 2432 741 811 2433 827 811 2434 574 811 2435 757 812 2436 758 812 2437 573 812 2438 758 813 2439 574 813 2440 573 813 2441 834 814 2442 851 814 2443 376 814 2444 833 815 2445 834 815 2446 376 815 2447 754 816 2448 757 816 2449 575 816 2450 757 817 2451 573 817 2452 576 817 2453 757 818 2454 576 818 2455 575 818 2456 833 819 2457 376 819 2458 831 819 2459 376 820 2460 379 820 2461 572 820 2462 831 821 2463 376 821 2464 572 821 2465 572 822 2466 832 822 2467 831 822 2468 754 823 2469 575 823 2470 577 823 2471 571 824 2472 572 824 2473 379 824 2474 579 825 2475 571 825 2476 379 825 2477 581 826 2478 579 826 2479 379 826 2480 580 827 2481 581 827 2482 379 827 2483 549 828 2484 548 828 2485 662 828 2486 549 829 2487 662 829 2488 663 829 2489 765 830 2490 766 830 2491 549 830 2492 765 831 2493 549 831 2494 663 831 2495 765 832 2496 663 832 2497 664 832 2498 767 833 2499 765 833 2500 664 833 2501 767 834 2502 664 834 2503 665 834 2504 768 835 2505 767 835 2506 665 835 2507 768 836 2508 665 836 2509 666 836 2510 769 837 2511 768 837 2512 666 837 2513 769 838 2514 666 838 2515 667 838 2516 770 839 2517 769 839 2518 667 839 2519 770 840 2520 667 840 2521 668 840 2522 764 841 2523 770 841 2524 261 841 2525 770 842 2526 668 842 2527 261 842 2528 261 843 2529 743 843 2530 762 843 2531 602 844 2532 598 844 2533 168 844 2534 603 845 2535 602 845 2536 168 845 2537 261 846 2538 762 846 2539 763 846 2540 261 847 2541 763 847 2542 764 847 2543 604 848 2544 603 848 2545 168 848 2546 605 849 2547 604 849 2548 168 849 2549 168 850 2550 261 850 2551 606 850 2552 261 851 2553 668 851 2554 669 851 2555 606 852 2556 261 852 2557 669 852 2558 606 853 2559 605 853 2560 168 853 2561 607 854 2562 606 854 2563 670 854 2564 606 855 2565 669 855 2566 670 855 2567 608 856 2568 607 856 2569 671 856 2570 607 857 2571 670 857 2572 671 857 2573 611 858 2574 608 858 2575 672 858 2576 608 859 2577 671 859 2578 672 859 2579 509 860 2580 610 860 2581 609 860 2582 609 861 2583 611 861 2584 675 861 2585 611 862 2586 672 862 2587 675 862 2588 673 863 2589 509 863 2590 674 863 2591 509 864 2592 609 864 2593 674 864 2594 506 865 2595 509 865 2596 673 865 2597 374 866 2598 70 866 2599 6 866 2600 95 867 2601 340 867 2602 440 867 2603 411 868 2604 410 868 2605 395 868 2606 410 869 2607 337 869 2608 395 869 2609 409 870 2610 361 870 2611 367 870 2612 296 871 2613 287 871 2614 173 871 2615 287 872 2616 275 872 2617 180 872 2618 275 873 2619 270 873 2620 198 873 2621 270 874 2622 261 874 2623 168 874 2624 893 875 2625 901 875 2626 374 875 2627 122 876 2628 892 876 2629 877 876 2630 122 877 2631 877 877 2632 878 877 2633 893 878 2634 374 878 2635 880 878 2636 374 879 2637 58 879 2638 881 879 2639 881 880 2640 880 880 2641 374 880 2642 58 881 2643 122 881 2644 875 881 2645 122 882 2646 878 882 2647 875 882 2648 882 883 2649 881 883 2650 58 883 2651 883 884 2652 882 884 2653 58 884 2654 58 885 2655 875 885 2656 876 885 2657 879 886 2658 883 886 2659 58 886 2660 892 887 2661 122 887 2662 894 887 2663 122 888 2664 144 888 2665 162 888 2666 144 889 2667 151 889 2668 162 889 2669 162 890 2670 164 890 2671 122 890 2672 164 891 2673 170 891 2674 902 891 2675 170 892 2676 173 892 2677 180 892 2678 180 893 2679 198 893 2680 168 893 2681 70 894 2682 374 894 2683 884 894 2684 374 895 2685 901 895 2686 884 895 2687 180 896 2688 168 896 2689 170 896 2690 168 897 2691 70 897 2692 886 897 2693 887 898 2694 168 898 2695 886 898 2696 164 899 2697 902 899 2698 900 899 2699 902 900 2700 170 900 2701 905 900 2702 897 901 2703 894 901 2704 164 901 2705 164 902 2706 894 902 2707 122 902 2708 70 903 2709 884 903 2710 889 903 2711 70 904 2712 889 904 2713 890 904 2714 898 905 2715 897 905 2716 164 905 2717 899 906 2718 898 906 2719 164 906 2720 70 907 2721 890 907 2722 891 907 2723 70 908 2724 891 908 2725 885 908 2726 900 909 2727 899 909 2728 164 909 2729 70 910 2730 885 910 2731 886 910 2732 905 911 2733 170 911 2734 903 911 2735 903 912 2736 170 912 2737 904 912 2738 168 913 2739 887 913 2740 888 913 2741 168 914 2742 888 914 2743 896 914 2744 904 915 2745 170 915 2746 895 915 2747 896 916 2748 895 916 2749 170 916 2750 208 917 2751 164 917 2752 162 917 2753 215 918 2754 162 918 2755 151 918 2756 237 919 2757 151 919 2758 144 919 2759 249 920 2760 144 920 2761 122 920 2762 409 921 2763 411 921 2764 395 921 2765 395 922 2766 383 922 2767 361 922 2768 313 923 2769 336 923 2770 303 923 2771 336 924 2772 334 924 2773 306 924 2774 334 925 2775 330 925 2776 309 925 2777 330 926 2778 321 926 2779 310 926 2780 321 927 2781 170 927 2782 164 927 2783 309 928 2784 310 928 2785 164 928 2786 164 929 2787 208 929 2788 298 929 2789 208 930 2790 202 930 2791 298 930 2792 298 931 2793 303 931 2794 164 931 2795 303 932 2796 306 932 2797 164 932 2798 410 933 2799 414 933 2800 343 933 2801 422 934 2802 429 934 2803 349 934 2804 429 935 2805 436 935 2806 355 935 2807 436 936 2808 440 936 2809 340 936 2810 403 937 2811 406 937 2812 95 937 2813 406 938 2814 371 938 2815 95 938 2816 406 939 2817 405 939 2818 113 939 2819 113 940 2820 14 940 2821 371 940 2822 437 941 2823 364 941 2824 358 941 2825 431 942 2826 365 942 2827 364 942 2828 423 943 2829 366 943 2830 365 943 2831 416 944 2832 367 944 2833 366 944 2834 414 945 2835 422 945 2836 346 945 2837 441 946 2838 358 946 2839 113 946 2840 379 947 2841 378 947 2842 20 947 2843 20 948 2844 6 948 2845 70 948 2846 2 949 2847 58 949 2848 374 949 2849 20 950 2850 371 950 2851 370 950 2852 382 951 2853 377 951 2854 378 951 2855 378 952 2856 379 952 2857 376 952 2858 380 953 2859 382 953 2860 378 953 2861 394 954 2862 385 954 2863 389 954 2864 385 955 2865 388 955 2866 389 955 2867 389 956 2868 383 956 2869 391 956 2870 398 957 2871 385 957 2872 394 957 2873 402 958 2874 394 958 2875 391 958 2876 400 959 2877 391 959 2878 383 959 2879 398 960 2880 402 960 2881 380 960 2882 402 961 2883 400 961 2884 382 961 2885 400 962 2886 395 962 2887 377 962 2888 405 963 2889 408 963 2890 443 963 2891 443 964 2892 408 964 2893 407 964 2894 442 965 2895 407 965 2896 403 965 2897 441 966 2898 443 966 2899 439 966 2900 439 967 2901 443 967 2902 442 967 2903 438 968 2904 442 968 2905 440 968 2906 437 969 2907 439 969 2908 435 969 2909 435 970 2910 439 970 2911 438 970 2912 434 971 2913 438 971 2914 436 971 2915 431 972 2916 435 972 2917 428 972 2918 428 973 2919 435 973 2920 434 973 2921 425 974 2922 434 974 2923 429 974 2924 423 975 2925 428 975 2926 419 975 2927 419 976 2928 428 976 2929 425 976 2930 417 977 2931 425 977 2932 422 977 2933 416 978 2934 419 978 2935 412 978 2936 412 979 2937 419 979 2938 417 979 2939 413 980 2940 417 980 2941 414 980 2942 349 981 2943 355 981 2944 340 981 2945 340 982 2946 95 982 2947 20 982 2948 20 983 2949 378 983 2950 337 983 2951 378 984 2952 377 984 2953 337 984 2954 337 985 2955 343 985 2956 340 985 2957 20 986 2958 337 986 2959 340 986 2960 343 987 2961 346 987 2962 340 987 2963 342 988 2964 455 988 2965 481 988 2966 278 992 2976 384 992 2977 451 992 2978 485 993 2979 426 993 2980 396 993 2981 471 994 2982 41 994 2983 33 994 2984 470 995 2985 66 995 2986 41 995 2987 469 1007 3021 415 1007 3022 66 1007 3023 472 1011 3033 33 1011 3034 427 1011 3035 284 1012 3036 464 1012 3037 465 1012 3038 312 1013 3039 458 1013 3040 456 1013 3041 339 1014 3042 456 1014 3043 466 1014 3044 351 1015 3045 466 1015 3046 467 1015 3047 353 1016 3048 467 1016 3049 468 1016 3050 359 1017 3051 468 1017 3052 449 1017 3053 362 1018 3054 449 1018 3055 455 1018 3056 311 1019 3057 465 1019 3058 459 1019 3059 327 1020 3060 459 1020 3061 460 1020 3062 332 1021 3063 460 1021 3064 461 1021 3065 335 1022 3066 461 1022 3067 457 1022 3068 338 1023 3069 457 1023 3070 458 1023 3071 300 1024 3072 278 1024 3073 452 1024 3074 304 1025 3075 300 1025 3076 453 1025 3077 307 1026 3078 304 1026 3079 454 1026 3080 308 1027 3081 307 1027 3082 462 1027 3083 284 1028 3084 308 1028 3085 463 1028 3086 393 1040 3120 481 1040 3121 482 1040 3122 397 1041 3123 482 1041 3124 479 1041 3125 480 1042 3126 401 1042 3127 399 1042 3128 484 1043 3129 404 1043 3130 401 1043 3131 483 1044 3132 396 1044 3133 404 1044 3134 384 1045 3135 392 1045 3136 450 1045 3137 392 1046 3138 390 1046 3139 446 1046 3140 390 1047 3141 387 1047 3142 447 1047 3143 387 1048 3144 386 1048 3145 448 1048 3146 386 1049 3147 381 1049 3148 444 1049 3149 477 1050 3150 427 1050 3151 433 1050 3152 475 1051 3153 433 1051 3154 432 1051 3155 473 1052 3156 432 1052 3157 430 1052 3158 486 1053 3159 430 1053 3160 426 1053 3161 474 1054 3162 420 1054 3163 415 1054 3164 421 1055 3165 420 1055 3166 474 1055 3167 424 1056 3168 421 1056 3169 476 1056 3170 418 1057 3171 424 1057 3172 478 1057 3173 381 1058 3174 418 1058 3175 445 1058 3176 618 1059 3177 617 1059 3178 282 1059 3179 305 1060 3180 299 1060 3181 615 1060 3182 299 1061 3183 616 1061 3184 615 1061 3185 618 1062 3186 282 1062 3187 241 1062 3188 621 1063 3189 618 1063 3190 241 1063 3191 302 1064 3192 305 1064 3193 620 1064 3194 305 1065 3195 615 1065 3196 620 1065 3197 621 1066 3198 241 1066 3199 257 1066 3200 612 1067 3201 621 1067 3202 257 1067 3203 301 1068 3204 302 1068 3205 614 1068 3206 302 1069 3207 620 1069 3208 614 1069 3209 612 1070 3210 257 1070 3211 262 1070 3212 619 1071 3213 612 1071 3214 262 1071 3215 297 1072 3216 301 1072 3217 622 1072 3218 301 1073 3219 614 1073 3220 622 1073 3221 619 1074 3222 262 1074 3223 272 1074 3224 297 1075 3225 622 1075 3226 613 1075 3227 613 1076 3228 619 1076 3229 272 1076 3230 252 1077 3231 297 1077 3232 613 1077 3233 297 1078 3234 252 1078 3235 508 1078 3236 282 1079 3237 509 1079 3238 506 1079 3239 499 1080 3240 600 1080 3241 616 1080 3242 301 1081 3243 297 1081 3244 502 1081 3245 302 1082 3246 301 1082 3247 501 1082 3248 305 1083 3249 302 1083 3250 503 1083 3251 299 1084 3252 305 1084 3253 500 1084 3254 508 1085 3255 252 1085 3256 272 1085 3257 504 1086 3258 272 1086 3259 262 1086 3260 507 1087 3261 262 1087 3262 257 1087 3263 505 1088 3264 257 1088 3265 241 1088 3266 610 1089 3267 509 1089 3268 282 1089 3269 627 1090 3270 626 1090 3271 369 1090 3272 352 1091 3273 363 1091 3274 624 1091 3275 363 1092 3276 625 1092 3277 624 1092 3278 627 1093 3279 369 1093 3280 375 1093 3281 631 1094 3282 627 1094 3283 375 1094 3284 356 1095 3285 352 1095 3286 630 1095 3287 352 1096 3288 624 1096 3289 630 1096 3290 631 1097 3291 375 1097 3292 373 1097 3293 628 1098 3294 631 1098 3295 373 1098 3296 357 1099 3297 356 1099 3298 623 1099 3299 356 1100 3300 630 1100 3301 623 1100 3302 628 1101 3303 373 1101 3304 372 1101 3305 632 1102 3306 628 1102 3307 372 1102 3308 360 1103 3309 357 1103 3310 633 1103 3311 357 1104 3312 623 1104 3313 633 1104 3314 632 1105 3315 372 1105 3316 368 1105 3317 360 1106 3318 633 1106 3319 629 1106 3320 629 1107 3321 632 1107 3322 368 1107 3323 354 1108 3324 360 1108 3325 629 1108 3326 354 1109 3327 368 1109 3328 492 1109 3329 495 1110 3330 487 1110 3331 352 1110 3332 487 1111 3333 488 1111 3334 363 1111 3335 489 1112 3336 369 1112 3337 626 1112 3338 368 1113 3339 372 1113 3340 491 1113 3341 491 1114 3342 372 1114 3343 373 1114 3344 375 1115 3345 490 1115 3346 493 1115 3347 369 1116 3348 489 1116 3349 490 1116 3350 360 1117 3351 354 1117 3352 497 1117 3353 357 1118 3354 360 1118 3355 498 1118 3356 356 1119 3357 357 1119 3358 494 1119 3359 352 1120 3360 356 1120 3361 496 1120 3362 363 1121 3363 488 1121 3364 592 1121 3365 676 1122 3366 661 1122 3367 188 1122 3368 661 1123 3369 529 1123 3370 188 1123 3371 188 1124 3372 245 1124 3373 677 1124 3374 280 1146 3438 678 1146 3439 679 1146 3440 279 1147 3441 268 1147 3442 681 1147 3443 271 1148 3444 265 1148 3445 523 1148 3446 273 1149 3447 271 1149 3448 522 1149 3449 276 1150 3450 273 1150 3451 524 1150 3452 682 1151 3453 683 1151 3454 276 1151 3455 683 1152 3456 277 1152 3457 276 1152 3458 276 1153 3459 521 1153 3460 657 1153 3461 268 1154 3462 277 1154 3463 683 1154 3464 280 1155 3465 290 1155 3466 684 1155 3467 290 1156 3468 286 1156 3469 685 1156 3470 286 1157 3471 285 1157 3472 686 1157 3473 285 1158 3474 283 1158 3475 687 1158 3476 283 1159 3477 279 1159 3478 680 1159 3479 530 1160 3480 189 1160 3481 218 1160 3482 525 1161 3483 218 1161 3484 209 1161 3485 527 1162 3486 209 1162 3487 205 1162 3488 526 1163 3489 205 1163 3490 199 1163 3491 528 1164 3492 199 1164 3493 188 1164 3494 228 1165 3495 679 1165 3496 688 1165 3497 247 1166 3498 688 1166 3499 689 1166 3500 250 1167 3501 689 1167 3502 690 1167 3503 254 1168 3504 690 1168 3505 691 1168 3506 259 1169 3507 691 1169 3508 677 1169 3509 265 1170 3510 189 1170 3511 530 1170 3512 520 1171 3513 653 1171 3514 692 1171 3515 696 1172 3516 695 1172 3517 350 1172 3518 325 1173 3519 318 1173 3520 694 1173 3521 318 1174 3522 692 1174 3523 694 1174 3524 696 1175 3525 350 1175 3526 347 1175 3527 700 1176 3528 696 1176 3529 347 1176 3530 329 1177 3531 325 1177 3532 699 1177 3533 325 1178 3534 694 1178 3535 699 1178 3536 700 1179 3537 347 1179 3538 345 1179 3539 697 1180 3540 700 1180 3541 345 1180 3542 331 1181 3543 329 1181 3544 693 1181 3545 329 1182 3546 699 1182 3547 693 1182 3548 697 1183 3549 345 1183 3550 344 1183 3551 701 1184 3552 697 1184 3553 341 1184 3554 697 1185 3555 344 1185 3556 341 1185 3557 333 1186 3558 331 1186 3559 693 1186 3560 333 1187 3561 693 1187 3562 702 1187 3563 333 1188 3564 702 1188 3565 320 1188 3566 702 1189 3567 698 1189 3568 320 1189 3569 698 1190 3570 701 1190 3571 341 1190 3572 341 1191 3573 344 1191 3574 511 1191 3575 344 1192 3576 345 1192 3577 516 1192 3578 345 1193 3579 347 1193 3580 517 1193 3581 347 1194 3582 350 1194 3583 518 1194 3584 518 1195 3585 350 1195 3586 695 1195 3587 333 1196 3588 320 1196 3589 514 1196 3590 331 1197 3591 333 1197 3592 512 1197 3593 329 1198 3594 331 1198 3595 513 1198 3596 325 1199 3597 329 1199 3598 515 1199 3599 318 1200 3600 325 1200 3601 519 1200 3602 320 1201 3603 341 1201 3604 510 1201 3605 5 1202 3606 771 1202 3607 744 1202 3608 266 1203 3609 773 1203 3610 772 1203 3611 548 1204 3612 549 1204 3613 266 1204 3614 266 1205 3615 5 1205 3616 548 1205 3617 549 1206 3618 766 1206 3619 773 1206 3620 776 1207 3621 775 1207 3622 274 1207 3623 326 1208 3624 324 1208 3625 780 1208 3626 324 1209 3627 323 1209 3628 782 1209 3629 780 1210 3630 324 1210 3631 782 1210 3632 323 1211 3633 533 1211 3634 782 1211 3635 533 1212 3636 537 1212 3637 784 1212 3638 537 1213 3639 319 1213 3640 783 1213 3641 319 1214 3642 317 1214 3643 783 1214 3644 316 1215 3645 314 1215 3646 778 1215 3647 314 1216 3648 774 1216 3649 778 1216 3650 317 1217 3651 316 1217 3652 777 1217 3653 783 1218 3654 317 1218 3655 777 1218 3656 776 1219 3657 274 1219 3658 322 1219 3659 779 1220 3660 776 1220 3661 322 1220 3662 316 1221 3663 778 1221 3664 777 1221 3665 779 1222 3666 322 1222 3667 326 1222 3668 780 1223 3669 779 1223 3670 326 1223 3671 537 1224 3672 783 1224 3673 784 1224 3674 533 1225 3675 784 1225 3676 781 1225 3677 543 1226 3678 542 1226 3679 322 1226 3680 322 1227 3681 274 1227 3682 543 1227 3683 774 1228 3684 314 1228 3685 544 1228 3686 775 1229 3687 786 1229 3688 274 1229 3689 786 1230 3690 785 1230 3691 274 1230 3692 547 1231 3693 546 1231 3694 328 1231 3695 546 1232 3696 545 1232 3697 274 1232 3698 538 1233 3699 532 1233 3700 324 1233 3701 532 1234 3702 531 1234 3703 323 1234 3704 538 1235 3705 324 1235 3706 326 1235 3707 542 1236 3708 540 1236 3709 322 1236 3710 540 1237 3711 539 1237 3712 326 1237 3713 547 1238 3714 328 1238 3715 785 1238 3716 317 1239 3717 319 1239 3718 536 1239 3719 316 1240 3720 317 1240 3721 534 1240 3722 541 1241 3723 544 1241 3724 314 1241 3725 314 1242 3726 316 1242 3727 541 1242 3728 580 1243 3729 53 1243 3730 64 1243 3731 581 1244 3732 64 1244 3733 63 1244 3734 571 1245 3735 579 1245 3736 63 1245 3737 63 1246 3738 62 1246 3739 571 1246 3740 572 1247 3741 62 1247 3742 853 1247 3743 856 1248 3744 853 1248 3745 62 1248 3746 63 1249 3747 64 1249 3748 858 1249 3749 64 1250 3750 53 1250 3751 857 1250 3752 858 1251 3753 64 1251 3754 857 1251 3755 53 1252 3756 212 1252 3757 857 1252 3758 212 1253 3759 222 1253 3760 862 1253 3761 857 1254 3762 212 1254 3763 862 1254 3764 222 1255 3765 225 1255 3766 863 1255 3767 225 1256 3768 234 1256 3769 860 1256 3770 234 1257 3771 243 1257 3772 861 1257 3773 243 1258 3774 214 1258 3775 859 1258 3776 214 1259 3777 169 1259 3778 855 1259 3779 169 1260 3780 854 1260 3781 855 1260 3782 856 1261 3783 62 1261 3784 63 1261 3785 858 1262 3786 856 1262 3787 63 1262 3788 214 1263 3789 855 1263 3790 859 1263 3791 243 1264 3792 859 1264 3793 861 1264 3794 234 1265 3795 861 1265 3796 860 1265 3797 225 1266 3798 860 1266 3799 863 1266 3800 574 1267 3801 828 1267 3802 854 1267 3803 212 1268 3804 53 1268 3805 580 1268 3806 222 1269 3807 212 1269 3808 582 1269 3809 225 1270 3810 222 1270 3811 578 1270 3812 234 1271 3813 225 1271 3814 577 1271 3815 243 1272 3816 234 1272 3817 575 1272 3818 214 1273 3819 243 1273 3820 576 1273 3821 169 1274 3822 214 1274 3823 573 1274 3824 564 1275 3825 267 1275 3826 260 1275 3827 558 1276 3828 264 1276 3829 267 1276 3830 558 1277 3831 557 1277 3832 264 1277 3833 557 1278 3834 556 1278 3835 264 1278 3836 554 1279 3837 553 1279 3838 263 1279 3839 263 1280 3840 264 1280 3841 554 1280 3842 789 1281 3843 864 1281 3844 552 1281 3845 864 1282 3846 263 1282 3847 552 1282 3848 865 1283 3849 281 1283 3850 866 1283 3851 281 1284 3852 289 1284 3853 866 1284 3854 289 1285 3855 295 1285 3856 867 1285 3857 295 1286 3858 294 1286 3859 873 1286 3860 867 1287 3861 295 1287 3862 873 1287 3863 294 1288 3864 292 1288 3865 868 1288 3866 292 1289 3867 291 1289 3868 870 1289 3869 868 1290 3870 292 1290 3871 870 1290 3872 291 1291 3873 288 1291 3874 869 1291 3875 288 1292 3876 260 1292 3877 869 1292 3878 260 1293 3879 267 1293 3880 874 1293 3881 267 1294 3882 264 1294 3883 871 1294 3884 874 1295 3885 267 1295 3886 871 1295 3887 264 1296 3888 263 1296 3889 872 1296 3890 263 1297 3891 864 1297 3892 872 1297 3893 867 1298 3894 866 1298 3895 289 1298 3896 264 1299 3897 872 1299 3898 871 1299 3899 260 1300 3900 874 1300 3901 869 1300 3902 873 1301 3903 294 1301 3904 868 1301 3905 800 1302 3906 561 1302 3907 281 1302 3908 567 1303 3909 562 1303 3910 288 1303 3911 562 1304 3912 563 1304 3913 260 1304 3914 567 1305 3915 288 1305 3916 291 1305 3917 568 1306 3918 291 1306 3919 292 1306 3920 569 1307 3921 565 1307 3922 294 1307 3923 565 1308 3924 566 1308 3925 292 1308 3926 295 1309 3927 570 1309 3928 569 1309 3929 560 1310 3930 570 1310 3931 295 1310 3932 295 1311 3933 289 1311 3934 560 1311 3935 289 1312 3936 281 1312 3937 561 1312 3938 145 1330 3990 80 1330 3991 613 1330 3992 39 1331 3993 605 1331 3994 606 1331 3995 617 1332 3996 618 1332 3997 78 1332 3998 118 1333 3999 609 1333 4000 617 1333 4001 609 1334 4002 610 1334 4003 617 1334 4004 39 1335 4005 49 1335 4006 604 1335 4007 49 1336 4008 45 1336 4009 603 1336 4010 45 1337 4011 42 1337 4012 602 1337 4013 598 1338 4014 602 1338 4015 42 1338 4016 42 1339 4017 29 1339 4018 598 1339 4019 29 1340 4020 153 1340 4021 599 1340 4022 614 1341 4023 155 1341 4024 145 1341 4025 158 1342 4026 155 1342 4027 614 1342 4028 615 1343 4029 166 1343 4030 158 1343 4031 616 1344 4032 600 1344 4033 599 1344 4034 153 1345 4035 166 1345 4036 616 1345 4037 166 1346 4038 615 1346 4039 616 1346 4040 613 1347 4041 80 1347 4042 106 1347 4043 106 1348 4044 100 1348 4045 612 1348 4046 612 1349 4047 100 1349 4048 89 1349 4049 89 1350 4050 78 1350 4051 618 1350 4052 607 1351 4053 121 1351 4054 114 1351 4055 121 1352 4056 607 1352 4057 608 1352 4058 611 1353 4059 129 1353 4060 126 1353 4061 609 1354 4062 118 1354 4063 129 1354 4064 224 1372 4116 251 1372 4117 632 1372 4118 174 1373 4119 240 1373 4120 589 1373 4121 625 1374 4122 592 1374 4123 591 1374 4124 242 1375 4125 220 1375 4126 625 1375 4127 220 1376 4128 624 1376 4129 625 1376 4130 588 1377 4131 587 1377 4132 174 1377 4133 587 1378 4134 586 1378 4135 184 1378 4136 585 1379 4137 181 1379 4138 184 1379 4139 181 1380 4140 585 1380 4141 584 1380 4142 583 1381 4143 595 1381 4144 171 1381 4145 171 1382 4146 177 1382 4147 583 1382 4148 596 1383 4149 253 1383 4150 171 1383 4151 251 1384 4152 255 1384 4153 628 1384 4154 628 1385 4155 255 1385 4156 256 1385 4157 631 1386 4158 256 1386 4159 258 1386 4160 627 1387 4161 258 1387 4162 626 1387 4163 258 1388 4164 253 1388 4165 626 1388 4166 253 1389 4167 596 1389 4168 626 1389 4169 633 1390 4170 236 1390 4171 224 1390 4172 231 1391 4173 236 1391 4174 633 1391 4175 230 1392 4176 231 1392 4177 623 1392 4178 230 1393 4179 630 1393 4180 624 1393 4181 589 1394 4182 240 1394 4183 244 1394 4184 590 1395 4185 244 1395 4186 246 1395 4187 594 1396 4188 246 1396 4189 248 1396 4190 593 1397 4191 248 1397 4192 242 1397 4193 74 1398 4194 93 1398 4195 660 1398 4196 93 1399 4197 663 1399 4198 660 1399 4199 682 1400 4200 124 1400 4201 683 1400 4202 124 1401 4203 127 1401 4204 683 1401 4205 93 1402 4206 74 1402 4207 677 1402 4208 74 1403 4209 676 1403 4210 677 1403 4211 681 1404 4212 683 1404 4213 115 1404 4214 683 1405 4215 127 1405 4216 115 1405 4217 112 1406 4218 93 1406 4219 677 1406 4220 112 1407 4221 677 1407 4222 691 1407 4223 680 1408 4224 681 1408 4225 128 1408 4226 681 1409 4227 115 1409 4228 128 1409 4229 111 1410 4230 112 1410 4231 691 1410 4232 111 1411 4233 691 1411 4234 690 1411 4235 687 1412 4236 680 1412 4237 128 1412 4238 110 1413 4239 111 1413 4240 689 1413 4241 111 1414 4242 690 1414 4243 689 1414 4244 687 1415 4245 128 1415 4246 136 1415 4247 686 1416 4248 687 1416 4249 136 1416 4250 98 1417 4251 110 1417 4252 689 1417 4253 98 1418 4254 689 1418 4255 688 1418 4256 686 1419 4257 136 1419 4258 142 1419 4259 685 1420 4260 686 1420 4261 142 1420 4262 92 1421 4263 98 1421 4264 688 1421 4265 92 1422 4266 688 1422 4267 679 1422 4268 685 1423 4269 142 1423 4270 147 1423 4271 684 1424 4272 685 1424 4273 147 1424 4274 132 1425 4275 92 1425 4276 678 1425 4277 92 1426 4278 679 1426 4279 678 1426 4280 684 1427 4281 147 1427 4282 149 1427 4283 132 1428 4284 678 1428 4285 149 1428 4286 92 1429 4287 132 1429 4288 669 1429 4289 673 1430 4290 674 1430 4291 128 1430 4292 128 1431 4293 115 1431 4294 656 1431 4295 115 1432 4296 655 1432 4297 656 1432 4298 657 1433 4299 658 1433 4300 124 1433 4301 127 1434 4302 124 1434 4303 658 1434 4304 115 1435 4305 127 1435 4306 659 1435 4307 132 1436 4308 149 1436 4309 670 1436 4310 149 1437 4311 147 1437 4312 671 1437 4313 147 1438 4314 142 1438 4315 672 1438 4316 142 1439 4317 136 1439 4318 675 1439 4319 136 1440 4320 128 1440 4321 674 1440 4322 74 1441 4323 660 1441 4324 661 1441 4325 92 1442 4326 668 1442 4327 667 1442 4328 98 1443 4329 667 1443 4330 666 1443 4331 110 1444 4332 666 1444 4333 665 1444 4334 111 1445 4335 665 1445 4336 664 1445 4337 663 1446 4338 93 1446 4339 112 1446 4340 642 1447 4341 207 1447 4342 651 1447 4343 207 1448 4344 191 1448 4345 651 1448 4346 191 1449 4347 652 1449 4348 651 1449 4349 640 1471 4413 232 1471 4414 206 1471 4415 634 1472 4416 654 1472 4417 219 1472 4418 219 1473 4419 229 1473 4420 634 1473 4421 217 1474 4422 221 1474 4423 697 1474 4424 221 1475 4425 223 1475 4426 700 1475 4427 223 1476 4428 226 1476 4429 696 1476 4430 226 1477 4431 227 1477 4432 695 1477 4433 648 1478 4434 650 1478 4435 219 1478 4436 650 1479 4437 227 1479 4438 219 1479 4439 239 1480 4440 232 1480 4441 640 1480 4442 238 1481 4443 239 1481 4444 639 1481 4445 235 1482 4446 238 1482 4447 638 1482 4448 233 1483 4449 235 1483 4450 637 1483 4451 229 1484 4452 233 1484 4453 636 1484 4454 702 1485 4455 204 1485 4456 194 1485 4457 201 1486 4458 204 1486 4459 702 1486 4460 200 1487 4461 201 1487 4462 693 1487 4463 196 1488 4464 200 1488 4465 699 1488 4466 191 1489 4467 196 1489 4468 692 1489 4469 196 1490 4470 694 1490 4471 692 1490 4472 692 1491 4473 653 1491 4474 652 1491 4475 210 1492 4476 646 1492 4477 647 1492 4478 211 1493 4479 645 1493 4480 646 1493 4481 213 1494 4482 644 1494 4483 645 1494 4484 216 1495 4485 643 1495 4486 644 1495 4487 643 1496 4488 216 1496 4489 207 1496 4490 194 1497 4491 217 1497 4492 701 1497 4493 771 1508 4524 772 1508 4525 1 1508 4526 1 1509 4527 82 1509 4528 744 1509 4529 82 1510 4530 756 1510 4531 744 1510 4532 96 1511 4533 770 1511 4534 764 1511 4535 741 1512 4536 758 1512 4537 73 1512 4538 73 1513 4539 48 1513 4540 741 1513 4541 773 1514 4542 766 1514 4543 765 1514 4544 765 1515 4545 97 1515 4546 773 1515 4547 97 1516 4548 1 1516 4549 773 1516 4550 10 1527 4581 764 1527 4582 763 1527 4583 37 1528 4584 763 1528 4585 762 1528 4586 743 1529 4587 742 1529 4588 19 1529 4589 19 1530 4590 27 1530 4591 743 1530 4592 19 1531 4593 742 1531 4594 759 1531 4595 52 1532 4596 760 1532 4597 761 1532 4598 747 1533 4599 748 1533 4600 60 1533 4601 60 1534 4602 61 1534 4603 747 1534 4604 739 1535 4605 740 1535 4606 59 1535 4607 59 1536 4608 60 1536 4609 745 1536 4610 60 1537 4611 748 1537 4612 746 1537 4613 745 1538 4614 60 1538 4615 746 1538 4616 738 1539 4617 48 1539 4618 59 1539 4619 9 1540 4620 759 1540 4621 760 1540 4622 94 1541 4623 84 1541 4624 749 1541 4625 91 1542 4626 94 1542 4627 750 1542 4628 86 1543 4629 91 1543 4630 753 1543 4631 82 1544 4632 86 1544 4633 755 1544 4634 96 1545 4635 103 1545 4636 769 1545 4637 103 1546 4638 104 1546 4639 768 1546 4640 104 1547 4641 109 1547 4642 767 1547 4643 109 1548 4644 97 1548 4645 765 1548 4646 751 1549 4647 68 1549 4648 76 1549 4649 752 1550 4650 76 1550 4651 77 1550 4652 754 1551 4653 77 1551 4654 79 1551 4655 757 1552 4656 79 1552 4657 73 1552 4658 749 1553 4659 84 1553 4660 68 1553 4661 775 1564 4692 776 1564 4693 182 1564 4694 182 1565 4695 130 1565 4696 775 1565 4697 706 1566 4698 714 1566 4699 190 1566 4700 190 1567 4701 139 1567 4702 706 1567 4703 732 1568 4704 733 1568 4705 157 1568 4706 157 1569 4707 175 1569 4708 728 1569 4709 175 1570 4710 727 1570 4711 728 1570 4712 785 1571 4713 786 1571 4714 130 1571 4715 192 1572 4716 709 1572 4717 785 1572 4718 709 1573 4719 710 1573 4720 785 1573 4721 139 1584 4752 146 1584 4753 708 1584 4754 704 1585 4755 708 1585 4756 146 1585 4757 146 1586 4758 143 1586 4759 704 1586 4760 703 1587 4761 705 1587 4762 143 1587 4763 143 1588 4764 140 1588 4765 703 1588 4766 134 1589 4767 736 1589 4768 737 1589 4769 717 1590 4770 718 1590 4771 160 1590 4772 165 1591 4773 722 1591 4774 716 1591 4775 722 1592 4776 720 1592 4777 716 1592 4778 716 1593 4779 717 1593 4780 167 1593 4781 721 1594 4782 722 1594 4783 165 1594 4784 165 1595 4785 163 1595 4786 721 1595 4787 163 1596 4788 725 1596 4789 721 1596 4790 731 1597 4791 730 1597 4792 724 1597 4793 730 1598 4794 726 1598 4795 724 1598 4796 724 1599 4797 725 1599 4798 163 1599 4799 735 1600 4800 734 1600 4801 731 1600 4802 157 1601 4803 733 1601 4804 724 1601 4805 733 1602 4806 735 1602 4807 724 1602 4808 724 1603 4809 163 1603 4810 157 1603 4811 718 1604 4812 715 1604 4813 160 1604 4814 715 1605 4815 736 1605 4816 134 1605 4817 183 1606 4818 187 1606 4819 782 1606 4820 782 1607 4821 187 1607 4822 186 1607 4823 185 1608 4824 779 1608 4825 780 1608 4826 185 1609 4827 182 1609 4828 776 1609 4829 193 1610 4830 190 1610 4831 714 1610 4832 195 1611 4833 193 1611 4834 713 1611 4835 197 1612 4836 195 1612 4837 712 1612 4838 192 1613 4839 197 1613 4840 711 1613 4841 783 1614 4842 176 1614 4843 172 1614 4844 178 1615 4845 176 1615 4846 783 1615 4847 179 1616 4848 178 1616 4849 777 1616 4850 729 1617 4851 727 1617 4852 774 1617 4853 727 1618 4854 175 1618 4855 774 1618 4856 175 1619 4857 179 1619 4858 774 1619 4859 172 1620 4860 183 1620 4861 781 1620 4862 844 1621 4863 845 1621 4864 47 1621 4865 47 1622 4866 67 1622 4867 842 1622 4868 842 1623 4869 843 1623 4870 47 1623 4871 50 1624 4872 851 1624 4873 834 1624 4874 857 1625 4875 16 1625 4876 35 1625 4877 35 1626 4878 31 1626 4879 856 1626 4880 853 1627 4881 856 1627 4882 31 1627 4883 31 1628 4884 25 1628 4885 853 1628 4886 25 1629 4887 831 1629 4888 853 1629 4889 831 1630 4890 25 1630 4891 23 1630 4892 13 1631 4893 834 1631 4894 833 1631 4895 847 1632 4896 848 1632 4897 51 1632 4898 51 1633 4899 47 1633 4900 845 1633 4901 845 1634 4902 846 1634 4903 51 1634 4904 54 1635 4905 51 1635 4906 848 1635 4907 55 1636 4908 54 1636 4909 849 1636 4910 57 1637 4911 55 1637 4912 850 1637 4913 50 1638 4914 57 1638 4915 852 1638 4916 841 1660 4980 842 1660 4981 67 1660 4982 67 1661 4983 75 1661 4984 839 1661 4985 75 1662 4986 837 1662 4987 839 1662 4988 837 1663 4989 838 1663 4990 839 1663 4991 839 1664 4992 840 1664 4993 67 1664 4994 836 1665 4995 837 1665 4996 75 1665 4997 75 1666 4998 72 1666 4999 836 1666 5000 72 1667 5001 71 1667 5002 830 1667 5003 826 1668 5004 825 1668 5005 71 1668 5006 825 1669 5007 830 1669 5008 71 1669 5009 826 1670 5010 71 1670 5011 69 1670 5012 69 1671 5013 65 1671 5014 827 1671 5015 81 1672 5016 16 1672 5017 857 1672 5018 863 1673 5019 85 1673 5020 81 1673 5021 860 1674 5022 87 1674 5023 85 1674 5024 88 1675 5025 87 1675 5026 860 1675 5027 859 1676 5028 90 1676 5029 88 1676 5030 855 1677 5031 83 1677 5032 90 1677 5033 854 1678 5034 828 1678 5035 827 1678 5036 65 1679 5037 83 1679 5038 854 1679 5039 83 1680 5040 855 1680 5041 854 1680 5042 818 1681 5043 817 1681 5044 133 1681 5045 133 1682 5046 116 1682 5047 821 1682 5048 820 1683 5049 818 1683 5050 133 1683 5051 117 1684 5052 99 1684 5053 796 1684 5054 871 1685 5055 108 1685 5056 101 1685 5057 107 1686 5058 108 1686 5059 871 1686 5060 864 1687 5061 789 1687 5062 788 1687 5063 788 1688 5064 105 1688 5065 864 1688 5066 105 1689 5067 107 1689 5068 864 1689 5069 102 1690 5070 105 1690 5071 788 1690 5072 795 1691 5073 796 1691 5074 99 1691 5075 823 1692 5076 822 1692 5077 821 1692 5078 821 1693 5079 116 1693 5080 823 1693 5081 116 1694 5082 119 1694 5083 787 1694 5084 823 1695 5085 116 1695 5086 787 1695 5087 119 1696 5088 790 1696 5089 787 1696 5090 120 1697 5091 791 1697 5092 790 1697 5093 123 1698 5094 792 1698 5095 791 1698 5096 125 1699 5097 794 1699 5098 792 1699 5099 793 1700 5100 794 1700 5101 125 1700 5102 814 1722 5166 813 1722 5167 812 1722 5168 812 1723 5169 811 1723 5170 141 1723 5171 141 1724 5172 133 1724 5173 817 1724 5174 816 1725 5175 815 1725 5176 814 1725 5177 141 1726 5178 817 1726 5179 816 1726 5180 814 1727 5181 812 1727 5182 141 1727 5183 807 1728 5184 138 1728 5185 809 1728 5186 138 1729 5187 141 1729 5188 811 1729 5189 809 1730 5190 138 1730 5191 810 1730 5192 806 1731 5193 805 1731 5194 804 1731 5195 804 1732 5196 803 1732 5197 806 1732 5198 803 1733 5199 797 1733 5200 806 1733 5201 797 1734 5202 137 1734 5203 806 1734 5204 137 1735 5205 138 1735 5206 806 1735 5207 802 1736 5208 801 1736 5209 798 1736 5210 801 1737 5211 135 1737 5212 798 1737 5213 135 1738 5214 137 1738 5215 798 1738 5216 131 1739 5217 135 1739 5218 801 1739 5219 101 1740 5220 148 1740 5221 869 1740 5222 869 1741 5223 148 1741 5224 152 1741 5225 870 1742 5226 152 1742 5227 154 1742 5228 154 1743 5229 156 1743 5230 873 1743 5231 156 1744 5232 159 1744 5233 867 1744 5234 150 1745 5235 866 1745 5236 867 1745 5237 865 1746 5238 866 1746 5239 150 1746 5240 131 1747 5241 799 1747 5242 865 1747 5243 799 1748 5244 800 1748 5245 865 1748 5246 3 1749 5247 875 1749 5248 878 1749 5249 36 1750 5250 15 1750 5251 900 1750 5252 24 1772 5316 38 1772 5317 887 1772 5318 26 1773 5319 34 1773 5320 889 1773 5321 34 1774 5322 32 1774 5323 890 1774 5324 32 1775 5325 30 1775 5326 891 1775 5327 30 1776 5328 28 1776 5329 885 1776 5330 28 1777 5331 24 1777 5332 886 1777 5333 40 1778 5334 36 1778 5335 902 1778 5336 43 1779 5337 40 1779 5338 905 1779 5339 44 1780 5340 43 1780 5341 903 1780 5342 895 1781 5343 896 1781 5344 46 1781 5345 46 1782 5346 44 1782 5347 895 1782 5348 888 1783 5349 887 1783 5350 38 1783 5351 38 1784 5352 46 1784 5353 888 1784 5354 882 1785 5355 4 1785 5356 0 1785 5357 883 1786 5358 7 1786 5359 4 1786 5360 879 1787 5361 8 1787 5362 7 1787 5363 876 1788 5364 11 1788 5365 8 1788 5366 875 1789 5367 3 1789 5368 11 1789 5369 900 1790 5370 15 1790 5371 22 1790 5372 899 1791 5373 22 1791 5374 21 1791 5375 898 1792 5376 21 1792 5377 18 1792 5378 894 1793 5379 897 1793 5380 18 1793 5381 18 1794 5382 17 1794 5383 894 1794 5384 877 1795 5385 892 1795 5386 17 1795 5387 17 1796 5388 12 1796 5389 877 1796 5390 881 1797 5391 0 1797 5392 880 1797 5393 0 1798 5394 26 1798 5395 901 1798 5396 880 1799 5397 0 1799 5398 893 1799 5399 26 1800 5400 884 1800 5401 901 1800 5402
+
+
+
+
+
+ 66 104 312 293 104 313 315 104 314 381 109 327 386 109 328 387 109 329 315 111 333 312 111 334 348 111 335 293 115 345 278 115 346 300 115 347 293 116 348 300 116 349 304 116 350 293 117 351 304 117 352 307 117 353 293 118 354 307 118 355 308 118 356 293 119 357 308 119 358 284 119 359 315 120 360 311 120 361 327 120 362 315 121 363 327 121 364 332 121 365 315 122 366 332 122 367 335 122 368 315 123 369 335 123 370 338 123 371 315 124 372 338 124 373 312 124 374 351 125 375 348 125 376 339 125 377 353 126 378 348 126 379 351 126 380 359 127 381 348 127 382 353 127 383 362 128 384 348 128 385 359 128 386 342 129 387 348 129 388 362 129 389 396 145 435 426 145 436 348 145 437 189 192 576 228 192 577 188 192 578 29 274 822 45 274 823 145 274 824 181 295 885 171 295 886 251 295 887 206 335 1005 194 335 1006 191 335 1007 9 359 1077 56 359 1078 10 359 1079 56 364 1092 73 364 1093 68 364 1094 59 365 1095 48 365 1096 56 365 1097 60 366 1098 59 366 1099 56 366 1100 61 367 1101 60 367 1102 56 367 1103 52 368 1104 61 368 1105 56 368 1106 134 391 1173 143 391 1174 139 391 1175 175 396 1188 161 396 1189 172 396 1190 163 397 1191 161 397 1192 157 397 1193 165 398 1194 161 398 1195 163 398 1196 167 399 1197 161 399 1198 165 399 1199 160 400 1200 161 400 1201 167 400 1202 71 435 1305 72 435 1306 65 435 1307 117 460 1380 150 460 1381 148 460 1382 44 475 1425 46 475 1426 38 475 1427 284 989 2967 311 989 2968 293 989 2969 311 990 2970 315 990 2971 293 990 2972 315 991 2973 41 991 2974 66 991 2975 387 996 2988 390 996 2989 381 996 2990 390 997 2991 392 997 2992 381 997 2993 392 998 2994 384 998 2995 381 998 2996 384 999 2997 278 999 2998 381 999 2999 278 1000 3000 293 1000 3001 381 1000 3002 293 1001 3003 66 1001 3004 418 1001 3005 418 1002 3006 66 1002 3007 415 1002 3008 415 1003 3009 420 1003 3010 418 1003 3011 420 1004 3012 421 1004 3013 418 1004 3014 421 1005 3015 424 1005 3016 418 1005 3017 418 1006 3018 381 1006 3019 293 1006 3020 312 1008 3024 339 1008 3025 348 1008 3026 348 1009 3027 33 1009 3028 315 1009 3029 33 1010 3030 41 1010 3031 315 1010 3032 430 1029 3087 432 1029 3088 426 1029 3089 432 1030 3090 433 1030 3091 426 1030 3092 433 1031 3093 427 1031 3094 426 1031 3095 427 1032 3096 33 1032 3097 426 1032 3098 33 1033 3099 348 1033 3100 426 1033 3101 348 1034 3102 342 1034 3103 396 1034 3104 396 1035 3105 342 1035 3106 393 1035 3107 393 1036 3108 397 1036 3109 396 1036 3110 397 1037 3111 399 1037 3112 396 1037 3113 399 1038 3114 401 1038 3115 396 1038 3116 401 1039 3117 404 1039 3118 396 1039 3119 273 1125 3375 276 1125 3376 268 1125 3377 276 1126 3378 277 1126 3379 268 1126 3380 268 1127 3381 279 1127 3382 265 1127 3383 273 1128 3384 268 1128 3385 271 1128 3386 279 1129 3387 283 1129 3388 285 1129 3389 285 1130 3390 286 1130 3391 279 1130 3392 286 1131 3393 290 1131 3394 279 1131 3395 290 1132 3396 280 1132 3397 279 1132 3398 280 1133 3399 228 1133 3400 265 1133 3401 228 1134 3402 247 1134 3403 245 1134 3404 247 1135 3405 250 1135 3406 245 1135 3407 250 1136 3408 254 1136 3409 245 1136 3410 254 1137 3411 259 1137 3412 245 1137 3413 245 1138 3414 188 1138 3415 228 1138 3416 188 1139 3417 199 1139 3418 205 1139 3419 205 1140 3420 209 1140 3421 188 1140 3422 209 1141 3423 218 1141 3424 188 1141 3425 218 1142 3426 189 1142 3427 188 1142 3428 189 1143 3429 265 1143 3430 228 1143 3431 265 1144 3432 271 1144 3433 268 1144 3434 280 1145 3435 265 1145 3436 279 1145 3437 155 1313 3939 158 1313 3940 153 1313 3941 158 1314 3942 166 1314 3943 153 1314 3944 153 1315 3945 29 1315 3946 145 1315 3947 155 1316 3948 153 1316 3949 145 1316 3950 29 1317 3951 42 1317 3952 45 1317 3953 45 1318 3954 49 1318 3955 145 1318 3956 49 1319 3957 39 1319 3958 145 1319 3959 39 1320 3960 114 1320 3961 80 1320 3962 114 1321 3963 121 1321 3964 118 1321 3965 80 1322 3966 114 1322 3967 118 1322 3968 121 1323 3969 126 1323 3970 118 1323 3971 126 1324 3972 129 1324 3973 118 1324 3974 118 1325 3975 78 1325 3976 80 1325 3977 78 1326 3978 89 1326 3979 100 1326 3980 100 1327 3981 106 1327 3982 78 1327 3983 106 1328 3984 80 1328 3985 78 1328 3986 80 1329 3987 145 1329 3988 39 1329 3989 224 1355 4065 236 1355 4066 220 1355 4067 236 1356 4068 231 1356 4069 220 1356 4070 231 1357 4071 230 1357 4072 220 1357 4073 220 1358 4074 242 1358 4075 240 1358 4076 242 1359 4077 248 1359 4078 246 1359 4079 244 1360 4080 242 1360 4081 246 1360 4082 244 1361 4083 240 1361 4084 242 1361 4085 240 1362 4086 174 1362 4087 224 1362 4088 174 1363 4089 184 1363 4090 251 1363 4091 184 1364 4092 181 1364 4093 251 1364 4094 181 1365 4095 177 1365 4096 171 1365 4097 171 1366 4098 253 1366 4099 251 1366 4100 253 1367 4101 258 1367 4102 256 1367 4103 255 1368 4104 253 1368 4105 256 1368 4106 255 1369 4107 251 1369 4108 253 1369 4109 251 1370 4110 224 1370 4111 174 1370 4112 240 1371 4113 224 1371 4114 220 1371 4115 204 1450 4350 201 1450 4351 191 1450 4352 201 1451 4353 200 1451 4354 191 1451 4355 200 1452 4356 196 1452 4357 191 1452 4358 191 1453 4359 207 1453 4360 206 1453 4361 207 1454 4362 216 1454 4363 213 1454 4364 211 1455 4365 207 1455 4366 213 1455 4367 211 1456 4368 210 1456 4369 207 1456 4370 210 1457 4371 206 1457 4372 207 1457 4373 206 1458 4374 232 1458 4375 217 1458 4376 232 1459 4377 239 1459 4378 229 1459 4379 217 1460 4380 232 1460 4381 229 1460 4382 239 1461 4383 238 1461 4384 229 1461 4385 238 1462 4386 235 1462 4387 229 1462 4388 235 1463 4389 233 1463 4390 229 1463 4391 229 1464 4392 219 1464 4393 217 1464 4394 219 1465 4395 227 1465 4396 226 1465 4397 223 1466 4398 219 1466 4399 226 1466 4400 223 1467 4401 221 1467 4402 219 1467 4403 221 1468 4404 217 1468 4405 219 1468 4406 217 1469 4407 194 1469 4408 206 1469 4409 194 1470 4410 204 1470 4411 191 1470 4412 97 1498 4494 109 1498 4495 104 1498 4496 104 1499 4497 103 1499 4498 97 1499 4499 103 1500 4500 96 1500 4501 97 1500 4502 96 1501 4503 10 1501 4504 1 1501 4505 10 1502 4506 37 1502 4507 27 1502 4508 1 1503 4509 10 1503 4510 56 1503 4511 27 1504 4512 19 1504 4513 9 1504 4514 9 1505 4515 52 1505 4516 56 1505 4517 9 1506 4518 10 1506 4519 27 1506 4520 1 1507 4521 97 1507 4522 96 1507 4523 84 1517 4551 94 1517 4552 82 1517 4553 94 1518 4554 91 1518 4555 82 1518 4556 91 1519 4557 86 1519 4558 82 1519 4559 82 1520 4560 1 1520 4561 84 1520 4562 1 1521 4563 56 1521 4564 84 1521 4565 56 1522 4566 48 1522 4567 73 1522 4568 73 1523 4569 79 1523 4570 77 1523 4571 77 1524 4572 76 1524 4573 73 1524 4574 76 1525 4575 68 1525 4576 73 1525 4577 68 1526 4578 84 1526 4579 56 1526 4580 195 1554 4662 197 1554 4663 192 1554 4664 192 1555 4665 130 1555 4666 190 1555 4667 130 1556 4668 161 1556 4669 139 1556 4670 139 1557 4671 161 1557 4672 134 1557 4673 161 1558 4674 160 1558 4675 134 1558 4676 134 1559 4677 140 1559 4678 143 1559 4679 143 1560 4680 146 1560 4681 139 1560 4682 139 1561 4683 190 1561 4684 130 1561 4685 190 1562 4686 193 1562 4687 192 1562 4688 193 1563 4689 195 1563 4690 192 1563 4691 176 1574 4722 178 1574 4723 175 1574 4724 178 1575 4725 179 1575 4726 175 1575 4727 175 1576 4728 157 1576 4729 161 1576 4730 161 1577 4731 130 1577 4732 183 1577 4733 175 1578 4734 172 1578 4735 176 1578 4736 130 1579 4737 182 1579 4738 183 1579 4739 182 1580 4740 185 1580 4741 186 1580 4742 187 1581 4743 182 1581 4744 186 1581 4745 187 1582 4746 183 1582 4747 182 1582 4748 183 1583 4749 172 1583 4750 161 1583 4751 72 1639 4917 75 1639 4918 65 1639 4919 75 1640 4920 67 1640 4921 65 1640 4922 67 1641 4923 47 1641 4924 65 1641 4925 47 1642 4926 51 1642 4927 65 1642 4928 51 1643 4929 54 1643 4930 65 1643 4931 54 1644 4932 55 1644 4933 50 1644 4934 65 1645 4935 54 1645 4936 50 1645 4937 55 1646 4938 57 1646 4939 50 1646 4940 50 1647 4941 13 1647 4942 16 1647 4943 13 1648 4944 23 1648 4945 35 1648 4946 16 1649 4947 13 1649 4948 35 1649 4949 23 1650 4950 25 1650 4951 31 1650 4952 31 1651 4953 35 1651 4954 23 1651 4955 16 1652 4956 81 1652 4957 50 1652 4958 81 1653 4959 85 1653 4960 83 1653 4961 50 1654 4962 81 1654 4963 83 1654 4964 85 1655 4965 87 1655 4966 83 1655 4967 87 1656 4968 88 1656 4969 83 1656 4970 88 1657 4971 90 1657 4972 83 1657 4973 83 1658 4974 65 1658 4975 50 1658 4976 65 1659 4977 69 1659 4978 71 1659 4979 123 1701 5103 120 1701 5104 117 1701 5105 120 1702 5106 119 1702 5107 131 1702 5108 119 1703 5109 116 1703 5110 131 1703 5111 116 1704 5112 133 1704 5113 131 1704 5114 133 1705 5115 141 1705 5116 131 1705 5117 141 1706 5118 138 1706 5119 131 1706 5120 138 1707 5121 137 1707 5122 131 1707 5123 137 1708 5124 135 1708 5125 131 1708 5126 131 1709 5127 150 1709 5128 117 1709 5129 150 1710 5130 159 1710 5131 156 1710 5132 156 1711 5133 154 1711 5134 150 1711 5135 154 1712 5136 152 1712 5137 150 1712 5138 152 1713 5139 148 1713 5140 150 1713 5141 148 1714 5142 101 1714 5143 117 1714 5144 101 1715 5145 108 1715 5146 99 1715 5147 108 1716 5148 107 1716 5149 102 1716 5150 107 1717 5151 105 1717 5152 102 1717 5153 102 1718 5154 99 1718 5155 108 1718 5156 99 1719 5157 117 1719 5158 101 1719 5159 117 1720 5160 125 1720 5161 123 1720 5162 120 1721 5163 131 1721 5164 117 1721 5165 38 1751 5253 24 1751 5254 26 1751 5255 24 1752 5256 28 1752 5257 30 1752 5258 32 1753 5259 24 1753 5260 30 1753 5261 32 1754 5262 34 1754 5263 24 1754 5264 34 1755 5265 26 1755 5266 24 1755 5267 26 1756 5268 0 1756 5269 15 1756 5270 0 1757 5271 4 1757 5272 3 1757 5273 15 1758 5274 0 1758 5275 3 1758 5276 4 1759 5277 7 1759 5278 3 1759 5279 7 1760 5280 8 1760 5281 3 1760 5282 8 1761 5283 11 1761 5284 3 1761 5285 3 1762 5286 12 1762 5287 15 1762 5288 12 1763 5289 17 1763 5290 18 1763 5291 21 1764 5292 12 1764 5293 18 1764 5294 21 1765 5295 22 1765 5296 12 1765 5297 22 1766 5298 15 1766 5299 12 1766 5300 15 1767 5301 36 1767 5302 26 1767 5303 36 1768 5304 40 1768 5305 38 1768 5306 26 1769 5307 36 1769 5308 38 1769 5309 40 1770 5310 43 1770 5311 38 1770 5312 43 1771 5313 44 1771 5314 38 1771 5315
+
+
+
+
+
+
+ 0 0.8076725 -1 0 1 1 0.1575691 0.7921533 -1 0.1950903 0.9807853 1 0.3090829 0.7461921 -1 0.3826835 0.9238795 1 0.4487188 0.6715551 -1 0.5555703 0.8314696 1 0.5711107 0.5711107 -1 0.7071068 0.7071068 1 0.6715551 0.4487188 -1 0.8314696 0.5555703 1 0.7461921 0.3090829 -1 0.9238795 0.3826835 1 0.7921533 0.1575691 -1 0.9807853 0.1950903 1 0.8076725 0 -1 1 0 1 0.7921533 -0.1575691 -1 0.9807853 -0.1950903 1 0.7461921 -0.3090829 -1 0.9238795 -0.3826835 1 0.6715551 -0.4487188 -1 0.8314696 -0.5555703 1 0.5711107 -0.5711107 -1 0.7071068 -0.7071068 1 0.4487188 -0.6715551 -1 0.5555703 -0.8314696 1 0.3090829 -0.7461921 -1 0.3826835 -0.9238795 1 0.1575691 -0.7921533 -1 0.1950903 -0.9807853 1 0 -0.8076725 -1 0 -1 1 -0.1575691 -0.7921533 -1 -0.1950903 -0.9807853 1 -0.3090829 -0.7461921 -1 -0.3826835 -0.9238795 1 -0.4487188 -0.6715551 -1 -0.5555703 -0.8314696 1 -0.5711107 -0.5711107 -1 -0.7071068 -0.7071068 1 -0.6715551 -0.4487188 -1 -0.8314696 -0.5555703 1 -0.7461921 -0.3090829 -1 -0.9238795 -0.3826835 1 -0.7921533 -0.1575691 -1 -0.9807853 -0.1950903 1 -0.8076725 0 -1 -1 0 1 -0.7921533 0.1575691 -1 -0.9807853 0.1950903 1 -0.7461921 0.3090829 -1 -0.9238795 0.3826835 1 -0.6715551 0.4487188 -1 -0.8314696 0.5555703 1 -0.5711107 0.5711107 -1 -0.7071068 0.7071068 1 -0.4487188 0.6715551 -1 -0.5555703 0.8314696 1 -0.3090829 0.7461921 -1 -0.3826835 0.9238795 1 -0.1575691 0.7921533 -1 -0.1950903 0.9807853 1 0 1 -1 0.1950903 0.9807853 -1 0.3826835 0.9238795 -1 0.5555703 0.8314696 -1 0.7071068 0.7071068 -1 0.8314696 0.5555703 -1 0.9238795 0.3826835 -1 0.9807853 0.1950903 -1 1 0 -1 0.9807853 -0.1950903 -1 0.9238795 -0.3826835 -1 0.8314696 -0.5555703 -1 0.7071068 -0.7071068 -1 0.5555703 -0.8314696 -1 0.3826835 -0.9238795 -1 0.1950903 -0.9807853 -1 0 -1 -1 -0.1950903 -0.9807853 -1 -0.3826835 -0.9238795 -1 -0.5555703 -0.8314696 -1 -0.7071068 -0.7071068 -1 -0.8314696 -0.5555703 -1 -0.9238795 -0.3826835 -1 -0.9807853 -0.1950903 -1 -1 0 -1 -0.9807853 0.1950903 -1 -0.9238795 0.3826835 -1 -0.8314696 0.5555703 -1 -0.7071068 0.7071068 -1 -0.5555703 0.8314696 -1 -0.3826835 0.9238795 -1 -0.1950903 0.9807853 -1 0 0.8076725 -1.172876 0.1575691 0.7921533 -1.172876 0.3090829 0.7461921 -1.172876 0.4487188 0.6715551 -1.172876 0.5711107 0.5711107 -1.172876 0.6715551 0.4487188 -1.172876 0.7461921 0.3090829 -1.172876 0.7921533 0.1575691 -1.172876 0.8076725 0 -1.172876 0.7921533 -0.1575691 -1.172876 0.7461921 -0.3090829 -1.172876 0.6715551 -0.4487188 -1.172876 0.5711107 -0.5711107 -1.172876 0.4487188 -0.6715551 -1.172876 0.3090829 -0.7461921 -1.172876 0.1575691 -0.7921533 -1.172876 0 -0.8076725 -1.172876 -0.1575691 -0.7921533 -1.172876 -0.3090829 -0.7461921 -1.172876 -0.4487188 -0.6715551 -1.172876 -0.5711107 -0.5711107 -1.172876 -0.6715551 -0.4487188 -1.172876 -0.7461921 -0.3090829 -1.172876 -0.7921533 -0.1575691 -1.172876 -0.8076725 0 -1.172876 -0.7921533 0.1575691 -1.172876 -0.7461921 0.3090829 -1.172876 -0.6715551 0.4487188 -1.172876 -0.5711107 0.5711107 -1.172876 -0.4487188 0.6715551 -1.172876 -0.3090829 0.7461921 -1.172876 -0.1575691 0.7921533 -1.172876
+
+
+
+
+
+
+
+
+
+ 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713967 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713967 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713967 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713967 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713967 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713967 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713967 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713967 0.8819213 0 0 0 1 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 -0.8819211 -0.471397 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.9951847 -0.09801715 0 -0.9569404 -0.2902846 0 0.9569404 -0.2902846 0 -0.9951847 -0.09801715 0 0.8819211 -0.471397 0 -0.9951847 0.09801715 0 0.7730104 -0.6343935 0 -0.9569404 0.2902846 0 0.6343935 -0.7730104 0 -0.8819211 0.471397 0 0.471397 -0.8819211 0 0.09801715 0.9951847 0 -0.7730104 0.6343935 0 0.2902846 -0.9569404 0 0.2902846 0.9569404 0 -0.6343935 0.7730104 0 0.09801715 -0.9951847 0 0.471397 0.8819211 0 -0.471397 0.8819211 0 -0.09801715 -0.9951847 0 0.6343935 0.7730104 0 -0.2902846 0.9569404 0 -0.2902846 -0.9569404 0 0.7730104 0.6343935 0 -0.09801715 0.9951847 0 -0.471397 -0.8819211 0 0.8819211 0.471397 0 -0.6343935 -0.7730104 0 0.9569404 0.2902846 0 -0.7730104 -0.6343935 0 0.9951847 0.09801715 0 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713967 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713967 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713967 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713967 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713967 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713967 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713967 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713967 0.8819213 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 -0.8819211 -0.471397 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.9951847 -0.09801715 0 -0.9569404 -0.2902846 0 0.9569404 -0.2902846 0 -0.9951847 -0.09801715 0 0.8819211 -0.471397 0 -0.9951847 0.09801715 0 0.7730104 -0.6343935 0 -0.9569404 0.2902846 0 0.6343935 -0.7730104 0 -0.8819211 0.471397 0 0.471397 -0.8819211 0 0.09801715 0.9951847 0 -0.7730104 0.6343935 0 0.2902846 -0.9569404 0 0.2902846 0.9569404 0 -0.6343935 0.7730104 0 0.09801715 -0.9951847 0 0.471397 0.8819211 0 -0.471397 0.8819211 0 -0.09801715 -0.9951847 0 0.6343935 0.7730104 0 -0.2902846 0.9569404 0 -0.2902846 -0.9569404 0 0.7730104 0.6343935 0 -0.09801715 0.9951847 0 -0.471397 -0.8819211 0 0.8819211 0.471397 0 -0.6343935 -0.7730104 0 0.9569404 0.2902846 0 -0.7730104 -0.6343935 0 0.9951847 0.09801715 0
+
+
+
+
+
+
+
+
+
+ 1 1 0.96875 0.5 1 0.5 0.96875 1 0.9375 0.5 0.96875 0.5 0.9375 1 0.90625 0.5 0.9375 0.5 0.90625 1 0.875 0.5 0.90625 0.5 0.875 1 0.84375 0.5 0.875 0.5 0.84375 1 0.8125 0.5 0.84375 0.5 0.8125 1 0.78125 0.5 0.8125 0.5 0.78125 1 0.75 0.5 0.78125 0.5 0.75 1 0.71875 0.5 0.75 0.5 0.71875 1 0.6875 0.5 0.71875 0.5 0.6875 1 0.65625 0.5 0.6875 0.5 0.65625 1 0.625 0.5 0.65625 0.5 0.625 1 0.59375 0.5 0.625 0.5 0.59375 1 0.5625 0.5 0.59375 0.5 0.5625 1 0.53125 0.5 0.5625 0.5 0.53125 1 0.5 0.5 0.53125 0.5 0.5 1 0.46875 0.5 0.5 0.5 0.46875 1 0.4375 0.5 0.46875 0.5 0.4375 1 0.40625 0.5 0.4375 0.5 0.40625 1 0.375 0.5 0.40625 0.5 0.375 1 0.34375 0.5 0.375 0.5 0.34375 1 0.3125 0.5 0.34375 0.5 0.3125 1 0.28125 0.5 0.3125 0.5 0.28125 1 0.25 0.5 0.28125 0.5 0.25 1 0.21875 0.5 0.25 0.5 0.21875 1 0.1875 0.5 0.21875 0.5 0.1875 1 0.15625 0.5 0.1875 0.5 0.15625 1 0.125 0.5 0.15625 0.5 0.125 1 0.09375 0.5 0.125 0.5 0.09375 1 0.0625 0.5 0.09375 0.5 0.1581559 0.02826887 0.4717311 0.1581559 0.341844 0.4717311 0.0625 1 0.03125 0.5 0.0625 0.5 0.03125 1 0 0.5 0.03125 0.5 0.5709138 0.1758201 0.5888267 0.1423075 0.5888267 0.1423075 0.7499998 0.4438413 0.7968217 0.4853885 0.7878164 0.4401167 0.8241797 0.429086 0.7968217 0.4853885 0.841844 0.4717311 0.8241797 0.429086 0.8833369 0.4495527 0.8576923 0.4111731 0.8576923 0.4111731 0.9197056 0.4197056 0.8870664 0.3870664 0.9111729 0.3576924 0.9197056 0.4197056 0.9495527 0.3833369 0.9290859 0.3241798 0.9495527 0.3833369 0.9717311 0.341844 0.9290859 0.3241798 0.9853885 0.2968217 0.9401167 0.2878164 0.9438412 0.25 0.9853885 0.2968217 0.99 0.25 0.9438412 0.25 0.9853885 0.2031783 0.9401167 0.2121833 0.9290859 0.1758201 0.9853885 0.2031783 0.9717311 0.1581559 0.9290859 0.1758201 0.9495527 0.1166631 0.9111729 0.1423074 0.9111729 0.1423074 0.9197056 0.08029437 0.8870664 0.1129334 0.8576923 0.08882677 0.9197056 0.08029437 0.8833369 0.05044728 0.8241798 0.07091385 0.8833369 0.05044728 0.841844 0.02826887 0.8241798 0.07091385 0.7968217 0.01461154 0.7878165 0.05988317 0.7499998 0.0561586 0.7968217 0.01461154 0.75 0.00999999 0.7499998 0.0561586 0.7031784 0.01461154 0.7121834 0.05988317 0.6758201 0.07091385 0.7031784 0.01461154 0.658156 0.02826887 0.6758201 0.07091385 0.6166632 0.05044728 0.6423074 0.08882677 0.6423074 0.08882677 0.5802944 0.08029437 0.6129334 0.1129334 0.5888267 0.1423075 0.5802944 0.08029437 0.5504473 0.1166631 0.5709138 0.1758201 0.5504473 0.1166631 0.5282689 0.1581559 0.5709138 0.1758201 0.5146116 0.2031783 0.5598831 0.2121834 0.5561586 0.25 0.5146116 0.2031783 0.51 0.25 0.5561586 0.25 0.5146116 0.2968217 0.5598831 0.2878165 0.5709139 0.3241798 0.5146116 0.2968217 0.5282689 0.341844 0.5709139 0.3241798 0.5504473 0.3833369 0.5888268 0.3576925 0.5888268 0.3576925 0.5802944 0.4197056 0.6129334 0.3870665 0.6423075 0.4111732 0.5802944 0.4197056 0.6166632 0.4495527 0.6758201 0.4290861 0.6166632 0.4495527 0.658156 0.4717311 0.6758201 0.4290861 0.7031784 0.4853885 0.7121832 0.4401167 0.7499998 0.4438413 0.7031784 0.4853885 0.75 0.49 0.5888268 0.3576925 0.7121832 0.4401167 0.7878165 0.05988317 0.9401167 0.2121833 0.9438412 0.25 0.9438412 0.25 0.5598831 0.2121834 0.5709138 0.1758201 0.5709138 0.1758201 0.9290859 0.1758201 0.9401167 0.2121833 0.9401167 0.2121833 0.5561586 0.25 0.5598831 0.2121834 0.5598831 0.2121834 0.9111729 0.1423074 0.9290859 0.1758201 0.9290859 0.1758201 0.5598831 0.2878165 0.5561586 0.25 0.5561586 0.25 0.8870664 0.1129334 0.9111729 0.1423074 0.9111729 0.1423074 0.5709139 0.3241798 0.5598831 0.2878165 0.5598831 0.2878165 0.8576923 0.08882677 0.8870664 0.1129334 0.8870664 0.1129334 0.5888268 0.3576925 0.5709139 0.3241798 0.5709139 0.3241798 0.8241798 0.07091385 0.8576923 0.08882677 0.8576923 0.08882677 0.7878164 0.4401167 0.7499998 0.4438413 0.7499998 0.4438413 0.6129334 0.3870665 0.5888268 0.3576925 0.5888268 0.3576925 0.7878165 0.05988317 0.8241798 0.07091385 0.8241798 0.07091385 0.8241797 0.429086 0.7878164 0.4401167 0.7878164 0.4401167 0.6423075 0.4111732 0.6129334 0.3870665 0.6129334 0.3870665 0.7499998 0.0561586 0.7878165 0.05988317 0.7878165 0.05988317 0.8576923 0.4111731 0.8241797 0.429086 0.8241797 0.429086 0.6758201 0.4290861 0.6423075 0.4111732 0.6423075 0.4111732 0.7121834 0.05988317 0.7499998 0.0561586 0.7499998 0.0561586 0.8870664 0.3870664 0.8576923 0.4111731 0.8576923 0.4111731 0.7121832 0.4401167 0.6758201 0.4290861 0.6758201 0.4290861 0.6758201 0.07091385 0.7121834 0.05988317 0.7121834 0.05988317 0.9111729 0.3576924 0.8870664 0.3870664 0.8870664 0.3870664 0.7499998 0.4438413 0.7121832 0.4401167 0.7121832 0.4401167 0.6423074 0.08882677 0.6758201 0.07091385 0.6758201 0.07091385 0.9290859 0.3241798 0.9111729 0.3576924 0.9111729 0.3576924 0.6129334 0.1129334 0.6423074 0.08882677 0.6423074 0.08882677 0.9401167 0.2878164 0.9290859 0.3241798 0.9290859 0.3241798 0.5888267 0.1423075 0.6129334 0.1129334 0.6129334 0.1129334 0.9438412 0.25 0.9401167 0.2878164 0.9401167 0.2878164 1 1 0.96875 1 0.96875 0.5 0.96875 1 0.9375 1 0.9375 0.5 0.9375 1 0.90625 1 0.90625 0.5 0.90625 1 0.875 1 0.875 0.5 0.875 1 0.84375 1 0.84375 0.5 0.84375 1 0.8125 1 0.8125 0.5 0.8125 1 0.78125 1 0.78125 0.5 0.78125 1 0.75 1 0.75 0.5 0.75 1 0.71875 1 0.71875 0.5 0.71875 1 0.6875 1 0.6875 0.5 0.6875 1 0.65625 1 0.65625 0.5 0.65625 1 0.625 1 0.625 0.5 0.625 1 0.59375 1 0.59375 0.5 0.59375 1 0.5625 1 0.5625 0.5 0.5625 1 0.53125 1 0.53125 0.5 0.53125 1 0.5 1 0.5 0.5 0.5 1 0.46875 1 0.46875 0.5 0.46875 1 0.4375 1 0.4375 0.5 0.4375 1 0.40625 1 0.40625 0.5 0.40625 1 0.375 1 0.375 0.5 0.375 1 0.34375 1 0.34375 0.5 0.34375 1 0.3125 1 0.3125 0.5 0.3125 1 0.28125 1 0.28125 0.5 0.28125 1 0.25 1 0.25 0.5 0.25 1 0.21875 1 0.21875 0.5 0.21875 1 0.1875 1 0.1875 0.5 0.1875 1 0.15625 1 0.15625 0.5 0.15625 1 0.125 1 0.125 0.5 0.125 1 0.09375 1 0.09375 0.5 0.09375 1 0.0625 1 0.0625 0.5 0.341844 0.4717311 0.2968217 0.4853885 0.25 0.49 0.25 0.49 0.2031783 0.4853885 0.341844 0.4717311 0.2031783 0.4853885 0.1581559 0.4717311 0.341844 0.4717311 0.1581559 0.4717311 0.1166631 0.4495527 0.08029437 0.4197056 0.08029437 0.4197056 0.05044728 0.3833369 0.02826887 0.341844 0.02826887 0.341844 0.01461154 0.2968217 0.00999999 0.25 0.00999999 0.25 0.01461154 0.2031783 0.02826887 0.341844 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.341844 0.02826887 0.1581559 0.05044728 0.1166631 0.08029437 0.08029437 0.08029437 0.08029437 0.1166631 0.05044728 0.1581559 0.02826887 0.1581559 0.02826887 0.2031783 0.01461154 0.341844 0.02826887 0.2031783 0.01461154 0.25 0.00999999 0.341844 0.02826887 0.25 0.00999999 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.02826887 0.3833369 0.05044728 0.4197056 0.08029437 0.4197056 0.08029437 0.4495527 0.1166631 0.4717311 0.1581559 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.341844 0.4853885 0.2031783 0.49 0.25 0.4717311 0.341844 0.49 0.25 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.4495527 0.341844 0.4717311 0.1581559 0.4717311 0.08029437 0.4197056 0.341844 0.4717311 0.08029437 0.4197056 0.02826887 0.341844 0.341844 0.4717311 0.02826887 0.1581559 0.08029437 0.08029437 0.02826887 0.341844 0.08029437 0.08029437 0.1581559 0.02826887 0.02826887 0.341844 0.341844 0.02826887 0.4197056 0.08029437 0.1581559 0.02826887 0.4197056 0.08029437 0.4717311 0.1581559 0.1581559 0.02826887 0.4717311 0.341844 0.4197056 0.4197056 0.4717311 0.1581559 0.4197056 0.4197056 0.341844 0.4717311 0.4717311 0.1581559 0.341844 0.4717311 0.02826887 0.341844 0.1581559 0.02826887 0.0625 1 0.03125 1 0.03125 0.5 0.03125 1 0 1 0 0.5 0.5709138 0.1758201 0.5709138 0.1758201 0.5888267 0.1423075 0.7499998 0.4438413 0.75 0.49 0.7968217 0.4853885 0.8241797 0.429086 0.7878164 0.4401167 0.7968217 0.4853885 0.8241797 0.429086 0.841844 0.4717311 0.8833369 0.4495527 0.8576923 0.4111731 0.8833369 0.4495527 0.9197056 0.4197056 0.9111729 0.3576924 0.8870664 0.3870664 0.9197056 0.4197056 0.9290859 0.3241798 0.9111729 0.3576924 0.9495527 0.3833369 0.9290859 0.3241798 0.9717311 0.341844 0.9853885 0.2968217 0.9438412 0.25 0.9401167 0.2878164 0.9853885 0.2968217 0.9438412 0.25 0.99 0.25 0.9853885 0.2031783 0.9290859 0.1758201 0.9401167 0.2121833 0.9853885 0.2031783 0.9290859 0.1758201 0.9717311 0.1581559 0.9495527 0.1166631 0.9111729 0.1423074 0.9495527 0.1166631 0.9197056 0.08029437 0.8576923 0.08882677 0.8870664 0.1129334 0.9197056 0.08029437 0.8241798 0.07091385 0.8576923 0.08882677 0.8833369 0.05044728 0.8241798 0.07091385 0.841844 0.02826887 0.7968217 0.01461154 0.7499998 0.0561586 0.7878165 0.05988317 0.7968217 0.01461154 0.7499998 0.0561586 0.75 0.00999999 0.7031784 0.01461154 0.6758201 0.07091385 0.7121834 0.05988317 0.7031784 0.01461154 0.6758201 0.07091385 0.658156 0.02826887 0.6166632 0.05044728 0.6423074 0.08882677 0.6166632 0.05044728 0.5802944 0.08029437 0.5888267 0.1423075 0.6129334 0.1129334 0.5802944 0.08029437 0.5709138 0.1758201 0.5888267 0.1423075 0.5504473 0.1166631 0.5709138 0.1758201 0.5282689 0.1581559 0.5146116 0.2031783 0.5561586 0.25 0.5598831 0.2121834 0.5146116 0.2031783 0.5561586 0.25 0.51 0.25 0.5146116 0.2968217 0.5709139 0.3241798 0.5598831 0.2878165 0.5146116 0.2968217 0.5709139 0.3241798 0.5282689 0.341844 0.5504473 0.3833369 0.5888268 0.3576925 0.5504473 0.3833369 0.5802944 0.4197056 0.6423075 0.4111732 0.6129334 0.3870665 0.5802944 0.4197056 0.6758201 0.4290861 0.6423075 0.4111732 0.6166632 0.4495527 0.6758201 0.4290861 0.658156 0.4717311 0.7031784 0.4853885 0.7499998 0.4438413 0.7121832 0.4401167 0.7031784 0.4853885 0.7121832 0.4401167 0.7499998 0.4438413 0.8576923 0.4111731 0.7499998 0.4438413 0.7878164 0.4401167 0.8576923 0.4111731 0.7878164 0.4401167 0.8241797 0.429086 0.8576923 0.4111731 0.8576923 0.4111731 0.8870664 0.3870664 0.9401167 0.2878164 0.8870664 0.3870664 0.9111729 0.3576924 0.9401167 0.2878164 0.9111729 0.3576924 0.9290859 0.3241798 0.9401167 0.2878164 0.9401167 0.2878164 0.9438412 0.25 0.9111729 0.1423074 0.9438412 0.25 0.9401167 0.2121833 0.9111729 0.1423074 0.9401167 0.2121833 0.9290859 0.1758201 0.9111729 0.1423074 0.9111729 0.1423074 0.8870664 0.1129334 0.7878165 0.05988317 0.8870664 0.1129334 0.8576923 0.08882677 0.7878165 0.05988317 0.8576923 0.08882677 0.8241798 0.07091385 0.7878165 0.05988317 0.7878165 0.05988317 0.7499998 0.0561586 0.6423074 0.08882677 0.7499998 0.0561586 0.7121834 0.05988317 0.6423074 0.08882677 0.7121834 0.05988317 0.6758201 0.07091385 0.6423074 0.08882677 0.6423074 0.08882677 0.6129334 0.1129334 0.5598831 0.2121834 0.6129334 0.1129334 0.5888267 0.1423075 0.5598831 0.2121834 0.5888267 0.1423075 0.5709138 0.1758201 0.5598831 0.2121834 0.5598831 0.2121834 0.5561586 0.25 0.5888268 0.3576925 0.5561586 0.25 0.5598831 0.2878165 0.5888268 0.3576925 0.5598831 0.2878165 0.5709139 0.3241798 0.5888268 0.3576925 0.5888268 0.3576925 0.6129334 0.3870665 0.7121832 0.4401167 0.6129334 0.3870665 0.6423075 0.4111732 0.7121832 0.4401167 0.6423075 0.4111732 0.6758201 0.4290861 0.7121832 0.4401167 0.7121832 0.4401167 0.8576923 0.4111731 0.9401167 0.2878164 0.9401167 0.2878164 0.9111729 0.1423074 0.7121832 0.4401167 0.9111729 0.1423074 0.7878165 0.05988317 0.7121832 0.4401167 0.7878165 0.05988317 0.6423074 0.08882677 0.5598831 0.2121834 0.5598831 0.2121834 0.5888268 0.3576925 0.7878165 0.05988317 0.9401167 0.2121833 0.9401167 0.2121833 0.9438412 0.25 0.5598831 0.2121834 0.5598831 0.2121834 0.5709138 0.1758201 0.9290859 0.1758201 0.9290859 0.1758201 0.9401167 0.2121833 0.5561586 0.25 0.5561586 0.25 0.5598831 0.2121834 0.9111729 0.1423074 0.9111729 0.1423074 0.9290859 0.1758201 0.5598831 0.2878165 0.5598831 0.2878165 0.5561586 0.25 0.8870664 0.1129334 0.8870664 0.1129334 0.9111729 0.1423074 0.5709139 0.3241798 0.5709139 0.3241798 0.5598831 0.2878165 0.8576923 0.08882677 0.8576923 0.08882677 0.8870664 0.1129334 0.5888268 0.3576925 0.5888268 0.3576925 0.5709139 0.3241798 0.8241798 0.07091385 0.8241798 0.07091385 0.8576923 0.08882677 0.7878164 0.4401167 0.7878164 0.4401167 0.7499998 0.4438413 0.6129334 0.3870665 0.6129334 0.3870665 0.5888268 0.3576925 0.7878165 0.05988317 0.7878165 0.05988317 0.8241798 0.07091385 0.8241797 0.429086 0.8241797 0.429086 0.7878164 0.4401167 0.6423075 0.4111732 0.6423075 0.4111732 0.6129334 0.3870665 0.7499998 0.0561586 0.7499998 0.0561586 0.7878165 0.05988317 0.8576923 0.4111731 0.8576923 0.4111731 0.8241797 0.429086 0.6758201 0.4290861 0.6758201 0.4290861 0.6423075 0.4111732 0.7121834 0.05988317 0.7121834 0.05988317 0.7499998 0.0561586 0.8870664 0.3870664 0.8870664 0.3870664 0.8576923 0.4111731 0.7121832 0.4401167 0.7121832 0.4401167 0.6758201 0.4290861 0.6758201 0.07091385 0.6758201 0.07091385 0.7121834 0.05988317 0.9111729 0.3576924 0.9111729 0.3576924 0.8870664 0.3870664 0.7499998 0.4438413 0.7499998 0.4438413 0.7121832 0.4401167 0.6423074 0.08882677 0.6423074 0.08882677 0.6758201 0.07091385 0.9290859 0.3241798 0.9290859 0.3241798 0.9111729 0.3576924 0.6129334 0.1129334 0.6129334 0.1129334 0.6423074 0.08882677 0.9401167 0.2878164 0.9401167 0.2878164 0.9290859 0.3241798 0.5888267 0.1423075 0.5888267 0.1423075 0.6129334 0.1129334 0.9438412 0.25 0.9438412 0.25 0.9401167 0.2878164
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 65 0 1 64 0 2 3 1 3 66 1 4 65 1 5 5 2 6 67 2 7 66 2 8 7 3 9 68 3 10 67 3 11 9 4 12 69 4 13 68 4 14 11 5 15 70 5 16 69 5 17 13 6 18 71 6 19 70 6 20 15 7 21 72 7 22 71 7 23 17 8 24 73 8 25 72 8 26 19 9 27 74 9 28 73 9 29 21 10 30 75 10 31 74 10 32 23 11 33 76 11 34 75 11 35 25 12 36 77 12 37 76 12 38 27 13 39 78 13 40 77 13 41 29 14 42 79 14 43 78 14 44 31 15 45 80 15 46 79 15 47 33 16 48 81 16 49 80 16 50 35 17 51 82 17 52 81 17 53 37 18 54 83 18 55 82 18 56 39 19 57 84 19 58 83 19 59 41 20 60 85 20 61 84 20 62 43 21 63 86 21 64 85 21 65 45 22 66 87 22 67 86 22 68 47 23 69 88 23 70 87 23 71 49 24 72 89 24 73 88 24 74 51 25 75 90 25 76 89 25 77 53 26 78 91 26 79 90 26 80 55 27 81 92 27 82 91 27 83 57 28 84 93 28 85 92 28 86 59 29 87 94 29 88 93 29 89 37 30 90 21 30 91 5 30 92 61 31 93 95 31 94 94 31 95 63 32 96 64 32 97 95 32 98 44 33 99 117 33 100 42 33 101 0 34 102 65 34 103 2 34 104 4 35 105 65 35 106 66 35 107 4 36 108 67 36 109 6 36 110 6 37 111 68 37 112 8 37 113 10 38 114 68 38 115 69 38 116 12 39 117 69 39 118 70 39 119 12 40 120 71 40 121 14 40 122 16 41 123 71 41 124 72 41 125 16 42 126 73 42 127 18 42 128 20 43 129 73 43 130 74 43 131 20 44 132 75 44 133 22 44 134 22 45 135 76 45 136 24 45 137 26 46 138 76 46 139 77 46 140 28 47 141 77 47 142 78 47 143 28 48 144 79 48 145 30 48 146 32 49 147 79 49 148 80 49 149 32 50 150 81 50 151 34 50 152 36 51 153 81 51 154 82 51 155 36 52 156 83 52 157 38 52 158 38 53 159 84 53 160 40 53 161 42 54 162 84 54 163 85 54 164 44 55 165 85 55 166 86 55 167 44 56 168 87 56 169 46 56 170 48 57 171 87 57 172 88 57 173 48 58 174 89 58 175 50 58 176 52 59 177 89 59 178 90 59 179 52 60 180 91 60 181 54 60 182 54 61 183 92 61 184 56 61 185 58 62 186 92 62 187 93 62 188 60 63 189 93 63 190 94 63 191 60 64 192 95 64 193 62 64 194 0 65 195 95 65 196 64 65 197 18 67 201 104 67 202 16 67 203 46 68 204 118 68 205 44 68 206 20 69 207 105 69 208 18 69 209 48 70 210 119 70 211 46 70 212 22 71 213 106 71 214 20 71 215 50 72 216 120 72 217 48 72 218 24 73 219 107 73 220 22 73 221 52 74 222 121 74 223 50 74 224 26 75 225 108 75 226 24 75 227 54 76 228 122 76 229 52 76 230 28 77 231 109 77 232 26 77 233 2 78 234 96 78 235 0 78 236 56 79 237 123 79 238 54 79 239 30 80 240 110 80 241 28 80 242 4 81 243 97 81 244 2 81 245 58 82 246 124 82 247 56 82 248 32 83 249 111 83 250 30 83 251 6 84 252 98 84 253 4 84 254 60 85 255 125 85 256 58 85 257 34 86 258 112 86 259 32 86 260 8 87 261 99 87 262 6 87 263 62 88 264 126 88 265 60 88 266 36 89 267 113 89 268 34 89 269 10 90 270 100 90 271 8 90 272 0 91 273 127 91 274 62 91 275 38 92 276 114 92 277 36 92 278 12 93 279 101 93 280 10 93 281 40 94 282 115 94 283 38 94 284 14 95 285 102 95 286 12 95 287 42 96 288 116 96 289 40 96 290 16 97 291 103 97 292 14 97 293 1 98 294 3 98 295 65 98 296 3 99 297 5 99 298 66 99 299 5 100 300 7 100 301 67 100 302 7 101 303 9 101 304 68 101 305 9 102 306 11 102 307 69 102 308 11 103 309 13 103 310 70 103 311 13 104 312 15 104 313 71 104 314 15 105 315 17 105 316 72 105 317 17 106 318 19 106 319 73 106 320 19 107 321 21 107 322 74 107 323 21 108 324 23 108 325 75 108 326 23 109 327 25 109 328 76 109 329 25 110 330 27 110 331 77 110 332 27 111 333 29 111 334 78 111 335 29 112 336 31 112 337 79 112 338 31 113 339 33 113 340 80 113 341 33 114 342 35 114 343 81 114 344 35 115 345 37 115 346 82 115 347 37 116 348 39 116 349 83 116 350 39 117 351 41 117 352 84 117 353 41 118 354 43 118 355 85 118 356 43 119 357 45 119 358 86 119 359 45 120 360 47 120 361 87 120 362 47 121 363 49 121 364 88 121 365 49 122 366 51 122 367 89 122 368 51 123 369 53 123 370 90 123 371 53 124 372 55 124 373 91 124 374 55 125 375 57 125 376 92 125 377 57 126 378 59 126 379 93 126 380 59 127 381 61 127 382 94 127 383 5 128 384 3 128 385 1 128 386 1 129 387 63 129 388 5 129 389 63 130 390 61 130 391 5 130 392 61 131 393 59 131 394 57 131 395 57 132 396 55 132 397 53 132 398 53 133 399 51 133 400 49 133 401 49 134 402 47 134 403 53 134 404 47 135 405 45 135 406 53 135 407 45 136 408 43 136 409 41 136 410 41 137 411 39 137 412 37 137 413 37 138 414 35 138 415 29 138 416 35 139 417 33 139 418 29 139 419 33 140 420 31 140 421 29 140 422 29 141 423 27 141 424 25 141 425 25 142 426 23 142 427 21 142 428 21 143 429 19 143 430 13 143 431 19 144 432 17 144 433 13 144 434 17 145 435 15 145 436 13 145 437 13 146 438 11 146 439 9 146 440 9 147 441 7 147 442 5 147 443 61 148 444 57 148 445 5 148 446 57 149 447 53 149 448 5 149 449 45 150 450 41 150 451 53 150 452 41 151 453 37 151 454 53 151 455 29 152 456 25 152 457 37 152 458 25 153 459 21 153 460 37 153 461 13 154 462 9 154 463 21 154 464 9 155 465 5 155 466 21 155 467 5 156 468 53 156 469 37 156 470 61 157 471 63 157 472 95 157 473 63 158 474 1 158 475 64 158 476 44 159 477 118 159 478 117 159 479 0 160 480 64 160 481 65 160 482 4 161 483 2 161 484 65 161 485 4 162 486 66 162 487 67 162 488 6 163 489 67 163 490 68 163 491 10 164 492 8 164 493 68 164 494 12 165 495 10 165 496 69 165 497 12 166 498 70 166 499 71 166 500 16 167 501 14 167 502 71 167 503 16 168 504 72 168 505 73 168 506 20 169 507 18 169 508 73 169 509 20 170 510 74 170 511 75 170 512 22 171 513 75 171 514 76 171 515 26 172 516 24 172 517 76 172 518 28 173 519 26 173 520 77 173 521 28 174 522 78 174 523 79 174 524 32 175 525 30 175 526 79 175 527 32 176 528 80 176 529 81 176 530 36 177 531 34 177 532 81 177 533 36 178 534 82 178 535 83 178 536 38 179 537 83 179 538 84 179 539 42 180 540 40 180 541 84 180 542 44 181 543 42 181 544 85 181 545 44 182 546 86 182 547 87 182 548 48 183 549 46 183 550 87 183 551 48 184 552 88 184 553 89 184 554 52 185 555 50 185 556 89 185 557 52 186 558 90 186 559 91 186 560 54 187 561 91 187 562 92 187 563 58 188 564 56 188 565 92 188 566 60 189 567 58 189 568 93 189 569 60 190 570 94 190 571 95 190 572 0 191 573 62 191 574 95 191 575 18 221 663 105 221 664 104 221 665 46 222 666 119 222 667 118 222 668 20 223 669 106 223 670 105 223 671 48 224 672 120 224 673 119 224 674 22 225 675 107 225 676 106 225 677 50 226 678 121 226 679 120 226 680 24 227 681 108 227 682 107 227 683 52 228 684 122 228 685 121 228 686 26 229 687 109 229 688 108 229 689 54 230 690 123 230 691 122 230 692 28 231 693 110 231 694 109 231 695 2 232 696 97 232 697 96 232 698 56 233 699 124 233 700 123 233 701 30 234 702 111 234 703 110 234 704 4 235 705 98 235 706 97 235 707 58 236 708 125 236 709 124 236 710 32 237 711 112 237 712 111 237 713 6 238 714 99 238 715 98 238 716 60 239 717 126 239 718 125 239 719 34 240 720 113 240 721 112 240 722 8 241 723 100 241 724 99 241 725 62 242 726 127 242 727 126 242 728 36 243 729 114 243 730 113 243 731 10 244 732 101 244 733 100 244 734 0 245 735 96 245 736 127 245 737 38 246 738 115 246 739 114 246 740 12 247 741 102 247 742 101 247 743 40 248 744 116 248 745 115 248 746 14 249 747 103 249 748 102 249 749 42 250 750 117 250 751 116 250 752 16 251 753 104 251 754 103 251 755
+
+
+
+
+
+ 123 66 198 127 66 199 111 66 200 127 192 576 96 192 577 99 192 578 96 193 579 97 193 580 99 193 581 97 194 582 98 194 583 99 194 584 99 195 585 100 195 586 103 195 587 100 196 588 101 196 589 103 196 590 101 197 591 102 197 592 103 197 593 103 198 594 104 198 595 107 198 596 104 199 597 105 199 598 107 199 599 105 200 600 106 200 601 107 200 602 107 201 603 108 201 604 111 201 605 108 202 606 109 202 607 111 202 608 109 203 609 110 203 610 111 203 611 111 204 612 112 204 613 115 204 614 112 205 615 113 205 616 115 205 617 113 206 618 114 206 619 115 206 620 115 207 621 116 207 622 119 207 623 116 208 624 117 208 625 119 208 626 117 209 627 118 209 628 119 209 629 119 210 630 120 210 631 123 210 632 120 211 633 121 211 634 123 211 635 121 212 636 122 212 637 123 212 638 123 213 639 124 213 640 127 213 641 124 214 642 125 214 643 127 214 644 125 215 645 126 215 646 127 215 647 127 216 648 99 216 649 103 216 650 103 217 651 107 217 652 127 217 653 107 218 654 111 218 655 127 218 656 111 219 657 115 219 658 119 219 659 119 220 660 123 220 661 111 220 662
+
+
+
+
+
+
+ 0 0.8076725 -1 0 1 1 0.1575691 0.7921533 -1 0.1950903 0.9807853 1 0.3090829 0.7461921 -1 0.3826835 0.9238795 1 0.4487188 0.6715551 -1 0.5555703 0.8314696 1 0.5711107 0.5711107 -1 0.7071068 0.7071068 1 0.6715551 0.4487188 -1 0.8314696 0.5555703 1 0.7461921 0.3090829 -1 0.9238795 0.3826835 1 0.7921533 0.1575691 -1 0.9807853 0.1950903 1 0.8076725 0 -1 1 0 1 0.7921533 -0.1575691 -1 0.9807853 -0.1950903 1 0.7461921 -0.3090829 -1 0.9238795 -0.3826835 1 0.6715551 -0.4487188 -1 0.8314696 -0.5555703 1 0.5711107 -0.5711107 -1 0.7071068 -0.7071068 1 0.4487188 -0.6715551 -1 0.5555703 -0.8314696 1 0.3090829 -0.7461921 -1 0.3826835 -0.9238795 1 0.1575691 -0.7921533 -1 0.1950903 -0.9807853 1 0 -0.8076725 -1 0 -1 1 -0.1575691 -0.7921533 -1 -0.1950903 -0.9807853 1 -0.3090829 -0.7461921 -1 -0.3826835 -0.9238795 1 -0.4487188 -0.6715551 -1 -0.5555703 -0.8314696 1 -0.5711107 -0.5711107 -1 -0.7071068 -0.7071068 1 -0.6715551 -0.4487188 -1 -0.8314696 -0.5555703 1 -0.7461921 -0.3090829 -1 -0.9238795 -0.3826835 1 -0.7921533 -0.1575691 -1 -0.9807853 -0.1950903 1 -0.8076725 0 -1 -1 0 1 -0.7921533 0.1575691 -1 -0.9807853 0.1950903 1 -0.7461921 0.3090829 -1 -0.9238795 0.3826835 1 -0.6715551 0.4487188 -1 -0.8314696 0.5555703 1 -0.5711107 0.5711107 -1 -0.7071068 0.7071068 1 -0.4487188 0.6715551 -1 -0.5555703 0.8314696 1 -0.3090829 0.7461921 -1 -0.3826835 0.9238795 1 -0.1575691 0.7921533 -1 -0.1950903 0.9807853 1 0 1 -1 0.1950903 0.9807853 -1 0.3826835 0.9238795 -1 0.5555703 0.8314696 -1 0.7071068 0.7071068 -1 0.8314696 0.5555703 -1 0.9238795 0.3826835 -1 0.9807853 0.1950903 -1 1 0 -1 0.9807853 -0.1950903 -1 0.9238795 -0.3826835 -1 0.8314696 -0.5555703 -1 0.7071068 -0.7071068 -1 0.5555703 -0.8314696 -1 0.3826835 -0.9238795 -1 0.1950903 -0.9807853 -1 0 -1 -1 -0.1950903 -0.9807853 -1 -0.3826835 -0.9238795 -1 -0.5555703 -0.8314696 -1 -0.7071068 -0.7071068 -1 -0.8314696 -0.5555703 -1 -0.9238795 -0.3826835 -1 -0.9807853 -0.1950903 -1 -1 0 -1 -0.9807853 0.1950903 -1 -0.9238795 0.3826835 -1 -0.8314696 0.5555703 -1 -0.7071068 0.7071068 -1 -0.5555703 0.8314696 -1 -0.3826835 0.9238795 -1 -0.1950903 0.9807853 -1 0 0.8076725 -1.172876 0.1575691 0.7921533 -1.172876 0.3090829 0.7461921 -1.172876 0.4487188 0.6715551 -1.172876 0.5711107 0.5711107 -1.172876 0.6715551 0.4487188 -1.172876 0.7461921 0.3090829 -1.172876 0.7921533 0.1575691 -1.172876 0.8076725 0 -1.172876 0.7921533 -0.1575691 -1.172876 0.7461921 -0.3090829 -1.172876 0.6715551 -0.4487188 -1.172876 0.5711107 -0.5711107 -1.172876 0.4487188 -0.6715551 -1.172876 0.3090829 -0.7461921 -1.172876 0.1575691 -0.7921533 -1.172876 0 -0.8076725 -1.172876 -0.1575691 -0.7921533 -1.172876 -0.3090829 -0.7461921 -1.172876 -0.4487188 -0.6715551 -1.172876 -0.5711107 -0.5711107 -1.172876 -0.6715551 -0.4487188 -1.172876 -0.7461921 -0.3090829 -1.172876 -0.7921533 -0.1575691 -1.172876 -0.8076725 0 -1.172876 -0.7921533 0.1575691 -1.172876 -0.7461921 0.3090829 -1.172876 -0.6715551 0.4487188 -1.172876 -0.5711107 0.5711107 -1.172876 -0.4487188 0.6715551 -1.172876 -0.3090829 0.7461921 -1.172876 -0.1575691 0.7921533 -1.172876
+
+
+
+
+
+
+
+
+
+ 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713967 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713967 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713967 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713967 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713967 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713967 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713967 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713967 0.8819213 0 0 0 1 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 -0.8819211 -0.471397 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.9951847 -0.09801715 0 -0.9569404 -0.2902846 0 0.9569404 -0.2902846 0 -0.9951847 -0.09801715 0 0.8819211 -0.471397 0 -0.9951847 0.09801715 0 0.7730104 -0.6343935 0 -0.9569404 0.2902846 0 0.6343935 -0.7730104 0 -0.8819211 0.471397 0 0.471397 -0.8819211 0 0.09801715 0.9951847 0 -0.7730104 0.6343935 0 0.2902846 -0.9569404 0 0.2902846 0.9569404 0 -0.6343935 0.7730104 0 0.09801715 -0.9951847 0 0.471397 0.8819211 0 -0.471397 0.8819211 0 -0.09801715 -0.9951847 0 0.6343935 0.7730104 0 -0.2902846 0.9569404 0 -0.2902846 -0.9569404 0 0.7730104 0.6343935 0 -0.09801715 0.9951847 0 -0.471397 -0.8819211 0 0.8819211 0.471397 0 -0.6343935 -0.7730104 0 0.9569404 0.2902846 0 -0.7730104 -0.6343935 0 0.9951847 0.09801715 0 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713967 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713967 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713967 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713967 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713967 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713967 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713967 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713967 0.8819213 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 -0.8819211 -0.471397 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.9951847 -0.09801715 0 -0.9569404 -0.2902846 0 0.9569404 -0.2902846 0 -0.9951847 -0.09801715 0 0.8819211 -0.471397 0 -0.9951847 0.09801715 0 0.7730104 -0.6343935 0 -0.9569404 0.2902846 0 0.6343935 -0.7730104 0 -0.8819211 0.471397 0 0.471397 -0.8819211 0 0.09801715 0.9951847 0 -0.7730104 0.6343935 0 0.2902846 -0.9569404 0 0.2902846 0.9569404 0 -0.6343935 0.7730104 0 0.09801715 -0.9951847 0 0.471397 0.8819211 0 -0.471397 0.8819211 0 -0.09801715 -0.9951847 0 0.6343935 0.7730104 0 -0.2902846 0.9569404 0 -0.2902846 -0.9569404 0 0.7730104 0.6343935 0 -0.09801715 0.9951847 0 -0.471397 -0.8819211 0 0.8819211 0.471397 0 -0.6343935 -0.7730104 0 0.9569404 0.2902846 0 -0.7730104 -0.6343935 0 0.9951847 0.09801715 0
+
+
+
+
+
+
+
+
+
+ 1 1 0.96875 0.5 1 0.5 0.96875 1 0.9375 0.5 0.96875 0.5 0.9375 1 0.90625 0.5 0.9375 0.5 0.90625 1 0.875 0.5 0.90625 0.5 0.875 1 0.84375 0.5 0.875 0.5 0.84375 1 0.8125 0.5 0.84375 0.5 0.8125 1 0.78125 0.5 0.8125 0.5 0.78125 1 0.75 0.5 0.78125 0.5 0.75 1 0.71875 0.5 0.75 0.5 0.71875 1 0.6875 0.5 0.71875 0.5 0.6875 1 0.65625 0.5 0.6875 0.5 0.65625 1 0.625 0.5 0.65625 0.5 0.625 1 0.59375 0.5 0.625 0.5 0.59375 1 0.5625 0.5 0.59375 0.5 0.5625 1 0.53125 0.5 0.5625 0.5 0.53125 1 0.5 0.5 0.53125 0.5 0.5 1 0.46875 0.5 0.5 0.5 0.46875 1 0.4375 0.5 0.46875 0.5 0.4375 1 0.40625 0.5 0.4375 0.5 0.40625 1 0.375 0.5 0.40625 0.5 0.375 1 0.34375 0.5 0.375 0.5 0.34375 1 0.3125 0.5 0.34375 0.5 0.3125 1 0.28125 0.5 0.3125 0.5 0.28125 1 0.25 0.5 0.28125 0.5 0.25 1 0.21875 0.5 0.25 0.5 0.21875 1 0.1875 0.5 0.21875 0.5 0.1875 1 0.15625 0.5 0.1875 0.5 0.15625 1 0.125 0.5 0.15625 0.5 0.125 1 0.09375 0.5 0.125 0.5 0.09375 1 0.0625 0.5 0.09375 0.5 0.1581559 0.02826887 0.4717311 0.1581559 0.341844 0.4717311 0.0625 1 0.03125 0.5 0.0625 0.5 0.03125 1 0 0.5 0.03125 0.5 0.5709138 0.1758201 0.5888267 0.1423075 0.5888267 0.1423075 0.7499998 0.4438413 0.7968217 0.4853885 0.7878164 0.4401167 0.8241797 0.429086 0.7968217 0.4853885 0.841844 0.4717311 0.8241797 0.429086 0.8833369 0.4495527 0.8576923 0.4111731 0.8576923 0.4111731 0.9197056 0.4197056 0.8870664 0.3870664 0.9111729 0.3576924 0.9197056 0.4197056 0.9495527 0.3833369 0.9290859 0.3241798 0.9495527 0.3833369 0.9717311 0.341844 0.9290859 0.3241798 0.9853885 0.2968217 0.9401167 0.2878164 0.9438412 0.25 0.9853885 0.2968217 0.99 0.25 0.9438412 0.25 0.9853885 0.2031783 0.9401167 0.2121833 0.9290859 0.1758201 0.9853885 0.2031783 0.9717311 0.1581559 0.9290859 0.1758201 0.9495527 0.1166631 0.9111729 0.1423074 0.9111729 0.1423074 0.9197056 0.08029437 0.8870664 0.1129334 0.8576923 0.08882677 0.9197056 0.08029437 0.8833369 0.05044728 0.8241798 0.07091385 0.8833369 0.05044728 0.841844 0.02826887 0.8241798 0.07091385 0.7968217 0.01461154 0.7878165 0.05988317 0.7499998 0.0561586 0.7968217 0.01461154 0.75 0.00999999 0.7499998 0.0561586 0.7031784 0.01461154 0.7121834 0.05988317 0.6758201 0.07091385 0.7031784 0.01461154 0.658156 0.02826887 0.6758201 0.07091385 0.6166632 0.05044728 0.6423074 0.08882677 0.6423074 0.08882677 0.5802944 0.08029437 0.6129334 0.1129334 0.5888267 0.1423075 0.5802944 0.08029437 0.5504473 0.1166631 0.5709138 0.1758201 0.5504473 0.1166631 0.5282689 0.1581559 0.5709138 0.1758201 0.5146116 0.2031783 0.5598831 0.2121834 0.5561586 0.25 0.5146116 0.2031783 0.51 0.25 0.5561586 0.25 0.5146116 0.2968217 0.5598831 0.2878165 0.5709139 0.3241798 0.5146116 0.2968217 0.5282689 0.341844 0.5709139 0.3241798 0.5504473 0.3833369 0.5888268 0.3576925 0.5888268 0.3576925 0.5802944 0.4197056 0.6129334 0.3870665 0.6423075 0.4111732 0.5802944 0.4197056 0.6166632 0.4495527 0.6758201 0.4290861 0.6166632 0.4495527 0.658156 0.4717311 0.6758201 0.4290861 0.7031784 0.4853885 0.7121832 0.4401167 0.7499998 0.4438413 0.7031784 0.4853885 0.75 0.49 0.5888268 0.3576925 0.7121832 0.4401167 0.7878165 0.05988317 0.9401167 0.2121833 0.9438412 0.25 0.9438412 0.25 0.5598831 0.2121834 0.5709138 0.1758201 0.5709138 0.1758201 0.9290859 0.1758201 0.9401167 0.2121833 0.9401167 0.2121833 0.5561586 0.25 0.5598831 0.2121834 0.5598831 0.2121834 0.9111729 0.1423074 0.9290859 0.1758201 0.9290859 0.1758201 0.5598831 0.2878165 0.5561586 0.25 0.5561586 0.25 0.8870664 0.1129334 0.9111729 0.1423074 0.9111729 0.1423074 0.5709139 0.3241798 0.5598831 0.2878165 0.5598831 0.2878165 0.8576923 0.08882677 0.8870664 0.1129334 0.8870664 0.1129334 0.5888268 0.3576925 0.5709139 0.3241798 0.5709139 0.3241798 0.8241798 0.07091385 0.8576923 0.08882677 0.8576923 0.08882677 0.7878164 0.4401167 0.7499998 0.4438413 0.7499998 0.4438413 0.6129334 0.3870665 0.5888268 0.3576925 0.5888268 0.3576925 0.7878165 0.05988317 0.8241798 0.07091385 0.8241798 0.07091385 0.8241797 0.429086 0.7878164 0.4401167 0.7878164 0.4401167 0.6423075 0.4111732 0.6129334 0.3870665 0.6129334 0.3870665 0.7499998 0.0561586 0.7878165 0.05988317 0.7878165 0.05988317 0.8576923 0.4111731 0.8241797 0.429086 0.8241797 0.429086 0.6758201 0.4290861 0.6423075 0.4111732 0.6423075 0.4111732 0.7121834 0.05988317 0.7499998 0.0561586 0.7499998 0.0561586 0.8870664 0.3870664 0.8576923 0.4111731 0.8576923 0.4111731 0.7121832 0.4401167 0.6758201 0.4290861 0.6758201 0.4290861 0.6758201 0.07091385 0.7121834 0.05988317 0.7121834 0.05988317 0.9111729 0.3576924 0.8870664 0.3870664 0.8870664 0.3870664 0.7499998 0.4438413 0.7121832 0.4401167 0.7121832 0.4401167 0.6423074 0.08882677 0.6758201 0.07091385 0.6758201 0.07091385 0.9290859 0.3241798 0.9111729 0.3576924 0.9111729 0.3576924 0.6129334 0.1129334 0.6423074 0.08882677 0.6423074 0.08882677 0.9401167 0.2878164 0.9290859 0.3241798 0.9290859 0.3241798 0.5888267 0.1423075 0.6129334 0.1129334 0.6129334 0.1129334 0.9438412 0.25 0.9401167 0.2878164 0.9401167 0.2878164 1 1 0.96875 1 0.96875 0.5 0.96875 1 0.9375 1 0.9375 0.5 0.9375 1 0.90625 1 0.90625 0.5 0.90625 1 0.875 1 0.875 0.5 0.875 1 0.84375 1 0.84375 0.5 0.84375 1 0.8125 1 0.8125 0.5 0.8125 1 0.78125 1 0.78125 0.5 0.78125 1 0.75 1 0.75 0.5 0.75 1 0.71875 1 0.71875 0.5 0.71875 1 0.6875 1 0.6875 0.5 0.6875 1 0.65625 1 0.65625 0.5 0.65625 1 0.625 1 0.625 0.5 0.625 1 0.59375 1 0.59375 0.5 0.59375 1 0.5625 1 0.5625 0.5 0.5625 1 0.53125 1 0.53125 0.5 0.53125 1 0.5 1 0.5 0.5 0.5 1 0.46875 1 0.46875 0.5 0.46875 1 0.4375 1 0.4375 0.5 0.4375 1 0.40625 1 0.40625 0.5 0.40625 1 0.375 1 0.375 0.5 0.375 1 0.34375 1 0.34375 0.5 0.34375 1 0.3125 1 0.3125 0.5 0.3125 1 0.28125 1 0.28125 0.5 0.28125 1 0.25 1 0.25 0.5 0.25 1 0.21875 1 0.21875 0.5 0.21875 1 0.1875 1 0.1875 0.5 0.1875 1 0.15625 1 0.15625 0.5 0.15625 1 0.125 1 0.125 0.5 0.125 1 0.09375 1 0.09375 0.5 0.09375 1 0.0625 1 0.0625 0.5 0.341844 0.4717311 0.2968217 0.4853885 0.25 0.49 0.25 0.49 0.2031783 0.4853885 0.341844 0.4717311 0.2031783 0.4853885 0.1581559 0.4717311 0.341844 0.4717311 0.1581559 0.4717311 0.1166631 0.4495527 0.08029437 0.4197056 0.08029437 0.4197056 0.05044728 0.3833369 0.02826887 0.341844 0.02826887 0.341844 0.01461154 0.2968217 0.00999999 0.25 0.00999999 0.25 0.01461154 0.2031783 0.02826887 0.341844 0.01461154 0.2031783 0.02826887 0.1581559 0.02826887 0.341844 0.02826887 0.1581559 0.05044728 0.1166631 0.08029437 0.08029437 0.08029437 0.08029437 0.1166631 0.05044728 0.1581559 0.02826887 0.1581559 0.02826887 0.2031783 0.01461154 0.341844 0.02826887 0.2031783 0.01461154 0.25 0.00999999 0.341844 0.02826887 0.25 0.00999999 0.2968217 0.01461154 0.341844 0.02826887 0.341844 0.02826887 0.3833369 0.05044728 0.4197056 0.08029437 0.4197056 0.08029437 0.4495527 0.1166631 0.4717311 0.1581559 0.4717311 0.1581559 0.4853885 0.2031783 0.4717311 0.341844 0.4853885 0.2031783 0.49 0.25 0.4717311 0.341844 0.49 0.25 0.4853885 0.2968217 0.4717311 0.341844 0.4717311 0.341844 0.4495527 0.3833369 0.4197056 0.4197056 0.4197056 0.4197056 0.3833369 0.4495527 0.341844 0.4717311 0.1581559 0.4717311 0.08029437 0.4197056 0.341844 0.4717311 0.08029437 0.4197056 0.02826887 0.341844 0.341844 0.4717311 0.02826887 0.1581559 0.08029437 0.08029437 0.02826887 0.341844 0.08029437 0.08029437 0.1581559 0.02826887 0.02826887 0.341844 0.341844 0.02826887 0.4197056 0.08029437 0.1581559 0.02826887 0.4197056 0.08029437 0.4717311 0.1581559 0.1581559 0.02826887 0.4717311 0.341844 0.4197056 0.4197056 0.4717311 0.1581559 0.4197056 0.4197056 0.341844 0.4717311 0.4717311 0.1581559 0.341844 0.4717311 0.02826887 0.341844 0.1581559 0.02826887 0.0625 1 0.03125 1 0.03125 0.5 0.03125 1 0 1 0 0.5 0.5709138 0.1758201 0.5709138 0.1758201 0.5888267 0.1423075 0.7499998 0.4438413 0.75 0.49 0.7968217 0.4853885 0.8241797 0.429086 0.7878164 0.4401167 0.7968217 0.4853885 0.8241797 0.429086 0.841844 0.4717311 0.8833369 0.4495527 0.8576923 0.4111731 0.8833369 0.4495527 0.9197056 0.4197056 0.9111729 0.3576924 0.8870664 0.3870664 0.9197056 0.4197056 0.9290859 0.3241798 0.9111729 0.3576924 0.9495527 0.3833369 0.9290859 0.3241798 0.9717311 0.341844 0.9853885 0.2968217 0.9438412 0.25 0.9401167 0.2878164 0.9853885 0.2968217 0.9438412 0.25 0.99 0.25 0.9853885 0.2031783 0.9290859 0.1758201 0.9401167 0.2121833 0.9853885 0.2031783 0.9290859 0.1758201 0.9717311 0.1581559 0.9495527 0.1166631 0.9111729 0.1423074 0.9495527 0.1166631 0.9197056 0.08029437 0.8576923 0.08882677 0.8870664 0.1129334 0.9197056 0.08029437 0.8241798 0.07091385 0.8576923 0.08882677 0.8833369 0.05044728 0.8241798 0.07091385 0.841844 0.02826887 0.7968217 0.01461154 0.7499998 0.0561586 0.7878165 0.05988317 0.7968217 0.01461154 0.7499998 0.0561586 0.75 0.00999999 0.7031784 0.01461154 0.6758201 0.07091385 0.7121834 0.05988317 0.7031784 0.01461154 0.6758201 0.07091385 0.658156 0.02826887 0.6166632 0.05044728 0.6423074 0.08882677 0.6166632 0.05044728 0.5802944 0.08029437 0.5888267 0.1423075 0.6129334 0.1129334 0.5802944 0.08029437 0.5709138 0.1758201 0.5888267 0.1423075 0.5504473 0.1166631 0.5709138 0.1758201 0.5282689 0.1581559 0.5146116 0.2031783 0.5561586 0.25 0.5598831 0.2121834 0.5146116 0.2031783 0.5561586 0.25 0.51 0.25 0.5146116 0.2968217 0.5709139 0.3241798 0.5598831 0.2878165 0.5146116 0.2968217 0.5709139 0.3241798 0.5282689 0.341844 0.5504473 0.3833369 0.5888268 0.3576925 0.5504473 0.3833369 0.5802944 0.4197056 0.6423075 0.4111732 0.6129334 0.3870665 0.5802944 0.4197056 0.6758201 0.4290861 0.6423075 0.4111732 0.6166632 0.4495527 0.6758201 0.4290861 0.658156 0.4717311 0.7031784 0.4853885 0.7499998 0.4438413 0.7121832 0.4401167 0.7031784 0.4853885 0.7121832 0.4401167 0.7499998 0.4438413 0.8576923 0.4111731 0.7499998 0.4438413 0.7878164 0.4401167 0.8576923 0.4111731 0.7878164 0.4401167 0.8241797 0.429086 0.8576923 0.4111731 0.8576923 0.4111731 0.8870664 0.3870664 0.9401167 0.2878164 0.8870664 0.3870664 0.9111729 0.3576924 0.9401167 0.2878164 0.9111729 0.3576924 0.9290859 0.3241798 0.9401167 0.2878164 0.9401167 0.2878164 0.9438412 0.25 0.9111729 0.1423074 0.9438412 0.25 0.9401167 0.2121833 0.9111729 0.1423074 0.9401167 0.2121833 0.9290859 0.1758201 0.9111729 0.1423074 0.9111729 0.1423074 0.8870664 0.1129334 0.7878165 0.05988317 0.8870664 0.1129334 0.8576923 0.08882677 0.7878165 0.05988317 0.8576923 0.08882677 0.8241798 0.07091385 0.7878165 0.05988317 0.7878165 0.05988317 0.7499998 0.0561586 0.6423074 0.08882677 0.7499998 0.0561586 0.7121834 0.05988317 0.6423074 0.08882677 0.7121834 0.05988317 0.6758201 0.07091385 0.6423074 0.08882677 0.6423074 0.08882677 0.6129334 0.1129334 0.5598831 0.2121834 0.6129334 0.1129334 0.5888267 0.1423075 0.5598831 0.2121834 0.5888267 0.1423075 0.5709138 0.1758201 0.5598831 0.2121834 0.5598831 0.2121834 0.5561586 0.25 0.5888268 0.3576925 0.5561586 0.25 0.5598831 0.2878165 0.5888268 0.3576925 0.5598831 0.2878165 0.5709139 0.3241798 0.5888268 0.3576925 0.5888268 0.3576925 0.6129334 0.3870665 0.7121832 0.4401167 0.6129334 0.3870665 0.6423075 0.4111732 0.7121832 0.4401167 0.6423075 0.4111732 0.6758201 0.4290861 0.7121832 0.4401167 0.7121832 0.4401167 0.8576923 0.4111731 0.9401167 0.2878164 0.9401167 0.2878164 0.9111729 0.1423074 0.7121832 0.4401167 0.9111729 0.1423074 0.7878165 0.05988317 0.7121832 0.4401167 0.7878165 0.05988317 0.6423074 0.08882677 0.5598831 0.2121834 0.5598831 0.2121834 0.5888268 0.3576925 0.7878165 0.05988317 0.9401167 0.2121833 0.9401167 0.2121833 0.9438412 0.25 0.5598831 0.2121834 0.5598831 0.2121834 0.5709138 0.1758201 0.9290859 0.1758201 0.9290859 0.1758201 0.9401167 0.2121833 0.5561586 0.25 0.5561586 0.25 0.5598831 0.2121834 0.9111729 0.1423074 0.9111729 0.1423074 0.9290859 0.1758201 0.5598831 0.2878165 0.5598831 0.2878165 0.5561586 0.25 0.8870664 0.1129334 0.8870664 0.1129334 0.9111729 0.1423074 0.5709139 0.3241798 0.5709139 0.3241798 0.5598831 0.2878165 0.8576923 0.08882677 0.8576923 0.08882677 0.8870664 0.1129334 0.5888268 0.3576925 0.5888268 0.3576925 0.5709139 0.3241798 0.8241798 0.07091385 0.8241798 0.07091385 0.8576923 0.08882677 0.7878164 0.4401167 0.7878164 0.4401167 0.7499998 0.4438413 0.6129334 0.3870665 0.6129334 0.3870665 0.5888268 0.3576925 0.7878165 0.05988317 0.7878165 0.05988317 0.8241798 0.07091385 0.8241797 0.429086 0.8241797 0.429086 0.7878164 0.4401167 0.6423075 0.4111732 0.6423075 0.4111732 0.6129334 0.3870665 0.7499998 0.0561586 0.7499998 0.0561586 0.7878165 0.05988317 0.8576923 0.4111731 0.8576923 0.4111731 0.8241797 0.429086 0.6758201 0.4290861 0.6758201 0.4290861 0.6423075 0.4111732 0.7121834 0.05988317 0.7121834 0.05988317 0.7499998 0.0561586 0.8870664 0.3870664 0.8870664 0.3870664 0.8576923 0.4111731 0.7121832 0.4401167 0.7121832 0.4401167 0.6758201 0.4290861 0.6758201 0.07091385 0.6758201 0.07091385 0.7121834 0.05988317 0.9111729 0.3576924 0.9111729 0.3576924 0.8870664 0.3870664 0.7499998 0.4438413 0.7499998 0.4438413 0.7121832 0.4401167 0.6423074 0.08882677 0.6423074 0.08882677 0.6758201 0.07091385 0.9290859 0.3241798 0.9290859 0.3241798 0.9111729 0.3576924 0.6129334 0.1129334 0.6129334 0.1129334 0.6423074 0.08882677 0.9401167 0.2878164 0.9401167 0.2878164 0.9290859 0.3241798 0.5888267 0.1423075 0.5888267 0.1423075 0.6129334 0.1129334 0.9438412 0.25 0.9438412 0.25 0.9401167 0.2878164
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 65 0 1 64 0 2 3 1 3 66 1 4 65 1 5 5 2 6 67 2 7 66 2 8 7 3 9 68 3 10 67 3 11 9 4 12 69 4 13 68 4 14 11 5 15 70 5 16 69 5 17 13 6 18 71 6 19 70 6 20 15 7 21 72 7 22 71 7 23 17 8 24 73 8 25 72 8 26 19 9 27 74 9 28 73 9 29 21 10 30 75 10 31 74 10 32 23 11 33 76 11 34 75 11 35 25 12 36 77 12 37 76 12 38 27 13 39 78 13 40 77 13 41 29 14 42 79 14 43 78 14 44 31 15 45 80 15 46 79 15 47 33 16 48 81 16 49 80 16 50 35 17 51 82 17 52 81 17 53 37 18 54 83 18 55 82 18 56 39 19 57 84 19 58 83 19 59 41 20 60 85 20 61 84 20 62 43 21 63 86 21 64 85 21 65 45 22 66 87 22 67 86 22 68 47 23 69 88 23 70 87 23 71 49 24 72 89 24 73 88 24 74 51 25 75 90 25 76 89 25 77 53 26 78 91 26 79 90 26 80 55 27 81 92 27 82 91 27 83 57 28 84 93 28 85 92 28 86 59 29 87 94 29 88 93 29 89 37 30 90 21 30 91 5 30 92 61 31 93 95 31 94 94 31 95 63 32 96 64 32 97 95 32 98 44 33 99 117 33 100 42 33 101 0 34 102 65 34 103 2 34 104 4 35 105 65 35 106 66 35 107 4 36 108 67 36 109 6 36 110 6 37 111 68 37 112 8 37 113 10 38 114 68 38 115 69 38 116 12 39 117 69 39 118 70 39 119 12 40 120 71 40 121 14 40 122 16 41 123 71 41 124 72 41 125 16 42 126 73 42 127 18 42 128 20 43 129 73 43 130 74 43 131 20 44 132 75 44 133 22 44 134 22 45 135 76 45 136 24 45 137 26 46 138 76 46 139 77 46 140 28 47 141 77 47 142 78 47 143 28 48 144 79 48 145 30 48 146 32 49 147 79 49 148 80 49 149 32 50 150 81 50 151 34 50 152 36 51 153 81 51 154 82 51 155 36 52 156 83 52 157 38 52 158 38 53 159 84 53 160 40 53 161 42 54 162 84 54 163 85 54 164 44 55 165 85 55 166 86 55 167 44 56 168 87 56 169 46 56 170 48 57 171 87 57 172 88 57 173 48 58 174 89 58 175 50 58 176 52 59 177 89 59 178 90 59 179 52 60 180 91 60 181 54 60 182 54 61 183 92 61 184 56 61 185 58 62 186 92 62 187 93 62 188 60 63 189 93 63 190 94 63 191 60 64 192 95 64 193 62 64 194 0 65 195 95 65 196 64 65 197 18 67 201 104 67 202 16 67 203 46 68 204 118 68 205 44 68 206 20 69 207 105 69 208 18 69 209 48 70 210 119 70 211 46 70 212 22 71 213 106 71 214 20 71 215 50 72 216 120 72 217 48 72 218 24 73 219 107 73 220 22 73 221 52 74 222 121 74 223 50 74 224 26 75 225 108 75 226 24 75 227 54 76 228 122 76 229 52 76 230 28 77 231 109 77 232 26 77 233 2 78 234 96 78 235 0 78 236 56 79 237 123 79 238 54 79 239 30 80 240 110 80 241 28 80 242 4 81 243 97 81 244 2 81 245 58 82 246 124 82 247 56 82 248 32 83 249 111 83 250 30 83 251 6 84 252 98 84 253 4 84 254 60 85 255 125 85 256 58 85 257 34 86 258 112 86 259 32 86 260 8 87 261 99 87 262 6 87 263 62 88 264 126 88 265 60 88 266 36 89 267 113 89 268 34 89 269 10 90 270 100 90 271 8 90 272 0 91 273 127 91 274 62 91 275 38 92 276 114 92 277 36 92 278 12 93 279 101 93 280 10 93 281 40 94 282 115 94 283 38 94 284 14 95 285 102 95 286 12 95 287 42 96 288 116 96 289 40 96 290 16 97 291 103 97 292 14 97 293 1 98 294 3 98 295 65 98 296 3 99 297 5 99 298 66 99 299 5 100 300 7 100 301 67 100 302 7 101 303 9 101 304 68 101 305 9 102 306 11 102 307 69 102 308 11 103 309 13 103 310 70 103 311 13 104 312 15 104 313 71 104 314 15 105 315 17 105 316 72 105 317 17 106 318 19 106 319 73 106 320 19 107 321 21 107 322 74 107 323 21 108 324 23 108 325 75 108 326 23 109 327 25 109 328 76 109 329 25 110 330 27 110 331 77 110 332 27 111 333 29 111 334 78 111 335 29 112 336 31 112 337 79 112 338 31 113 339 33 113 340 80 113 341 33 114 342 35 114 343 81 114 344 35 115 345 37 115 346 82 115 347 37 116 348 39 116 349 83 116 350 39 117 351 41 117 352 84 117 353 41 118 354 43 118 355 85 118 356 43 119 357 45 119 358 86 119 359 45 120 360 47 120 361 87 120 362 47 121 363 49 121 364 88 121 365 49 122 366 51 122 367 89 122 368 51 123 369 53 123 370 90 123 371 53 124 372 55 124 373 91 124 374 55 125 375 57 125 376 92 125 377 57 126 378 59 126 379 93 126 380 59 127 381 61 127 382 94 127 383 5 128 384 3 128 385 1 128 386 1 129 387 63 129 388 5 129 389 63 130 390 61 130 391 5 130 392 61 131 393 59 131 394 57 131 395 57 132 396 55 132 397 53 132 398 53 133 399 51 133 400 49 133 401 49 134 402 47 134 403 53 134 404 47 135 405 45 135 406 53 135 407 45 136 408 43 136 409 41 136 410 41 137 411 39 137 412 37 137 413 37 138 414 35 138 415 29 138 416 35 139 417 33 139 418 29 139 419 33 140 420 31 140 421 29 140 422 29 141 423 27 141 424 25 141 425 25 142 426 23 142 427 21 142 428 21 143 429 19 143 430 13 143 431 19 144 432 17 144 433 13 144 434 17 145 435 15 145 436 13 145 437 13 146 438 11 146 439 9 146 440 9 147 441 7 147 442 5 147 443 61 148 444 57 148 445 5 148 446 57 149 447 53 149 448 5 149 449 45 150 450 41 150 451 53 150 452 41 151 453 37 151 454 53 151 455 29 152 456 25 152 457 37 152 458 25 153 459 21 153 460 37 153 461 13 154 462 9 154 463 21 154 464 9 155 465 5 155 466 21 155 467 5 156 468 53 156 469 37 156 470 61 157 471 63 157 472 95 157 473 63 158 474 1 158 475 64 158 476 44 159 477 118 159 478 117 159 479 0 160 480 64 160 481 65 160 482 4 161 483 2 161 484 65 161 485 4 162 486 66 162 487 67 162 488 6 163 489 67 163 490 68 163 491 10 164 492 8 164 493 68 164 494 12 165 495 10 165 496 69 165 497 12 166 498 70 166 499 71 166 500 16 167 501 14 167 502 71 167 503 16 168 504 72 168 505 73 168 506 20 169 507 18 169 508 73 169 509 20 170 510 74 170 511 75 170 512 22 171 513 75 171 514 76 171 515 26 172 516 24 172 517 76 172 518 28 173 519 26 173 520 77 173 521 28 174 522 78 174 523 79 174 524 32 175 525 30 175 526 79 175 527 32 176 528 80 176 529 81 176 530 36 177 531 34 177 532 81 177 533 36 178 534 82 178 535 83 178 536 38 179 537 83 179 538 84 179 539 42 180 540 40 180 541 84 180 542 44 181 543 42 181 544 85 181 545 44 182 546 86 182 547 87 182 548 48 183 549 46 183 550 87 183 551 48 184 552 88 184 553 89 184 554 52 185 555 50 185 556 89 185 557 52 186 558 90 186 559 91 186 560 54 187 561 91 187 562 92 187 563 58 188 564 56 188 565 92 188 566 60 189 567 58 189 568 93 189 569 60 190 570 94 190 571 95 190 572 0 191 573 62 191 574 95 191 575 18 221 663 105 221 664 104 221 665 46 222 666 119 222 667 118 222 668 20 223 669 106 223 670 105 223 671 48 224 672 120 224 673 119 224 674 22 225 675 107 225 676 106 225 677 50 226 678 121 226 679 120 226 680 24 227 681 108 227 682 107 227 683 52 228 684 122 228 685 121 228 686 26 229 687 109 229 688 108 229 689 54 230 690 123 230 691 122 230 692 28 231 693 110 231 694 109 231 695 2 232 696 97 232 697 96 232 698 56 233 699 124 233 700 123 233 701 30 234 702 111 234 703 110 234 704 4 235 705 98 235 706 97 235 707 58 236 708 125 236 709 124 236 710 32 237 711 112 237 712 111 237 713 6 238 714 99 238 715 98 238 716 60 239 717 126 239 718 125 239 719 34 240 720 113 240 721 112 240 722 8 241 723 100 241 724 99 241 725 62 242 726 127 242 727 126 242 728 36 243 729 114 243 730 113 243 731 10 244 732 101 244 733 100 244 734 0 245 735 96 245 736 127 245 737 38 246 738 115 246 739 114 246 740 12 247 741 102 247 742 101 247 743 40 248 744 116 248 745 115 248 746 14 249 747 103 249 748 102 249 749 42 250 750 117 250 751 116 250 752 16 251 753 104 251 754 103 251 755
+
+
+
+
+
+ 123 66 198 127 66 199 111 66 200 127 192 576 96 192 577 99 192 578 96 193 579 97 193 580 99 193 581 97 194 582 98 194 583 99 194 584 99 195 585 100 195 586 103 195 587 100 196 588 101 196 589 103 196 590 101 197 591 102 197 592 103 197 593 103 198 594 104 198 595 107 198 596 104 199 597 105 199 598 107 199 599 105 200 600 106 200 601 107 200 602 107 201 603 108 201 604 111 201 605 108 202 606 109 202 607 111 202 608 109 203 609 110 203 610 111 203 611 111 204 612 112 204 613 115 204 614 112 205 615 113 205 616 115 205 617 113 206 618 114 206 619 115 206 620 115 207 621 116 207 622 119 207 623 116 208 624 117 208 625 119 208 626 117 209 627 118 209 628 119 209 629 119 210 630 120 210 631 123 210 632 120 211 633 121 211 634 123 211 635 121 212 636 122 212 637 123 212 638 123 213 639 124 213 640 127 213 641 124 214 642 125 214 643 127 214 644 125 215 645 126 215 646 127 215 647 127 216 648 99 216 649 103 216 650 103 217 651 107 217 652 127 217 653 107 218 654 111 218 655 127 218 656 111 219 657 115 219 658 119 219 659 119 220 660 123 220 661 111 220 662
+
+
+
+
+
+
+ 0 1 -1 0 0.8076725 1 0.1950903 0.9807853 -1 0.1575691 0.7921533 1 0.3826835 0.9238795 -1 0.3090829 0.7461921 1 0.5555703 0.8314696 -1 0.4487188 0.6715551 1 0.7071068 0.7071068 -1 0.5711107 0.5711107 1 0.8314696 0.5555703 -1 0.6715551 0.4487188 1 0.9238795 0.3826835 -1 0.7461921 0.3090829 1 0.9807853 0.1950903 -1 0.7921533 0.1575691 1 1 0 -1 0.8076725 0 1 0.9807853 -0.1950903 -1 0.7921533 -0.1575691 1 0.9238795 -0.3826835 -1 0.7461921 -0.3090829 1 0.8314696 -0.5555703 -1 0.6715551 -0.4487188 1 0.7071068 -0.7071068 -1 0.5711107 -0.5711107 1 0.5555703 -0.8314696 -1 0.4487188 -0.6715551 1 0.3826835 -0.9238795 -1 0.3090829 -0.7461921 1 0.1950903 -0.9807853 -1 0.1575691 -0.7921533 1 0 -1 -1 0 -0.8076725 1 -0.1950903 -0.9807853 -1 -0.1575691 -0.7921533 1 -0.3826835 -0.9238795 -1 -0.3090829 -0.7461921 1 -0.5555703 -0.8314696 -1 -0.4487188 -0.6715551 1 -0.7071068 -0.7071068 -1 -0.5711107 -0.5711107 1 -0.8314696 -0.5555703 -1 -0.6715551 -0.4487188 1 -0.9238795 -0.3826835 -1 -0.7461921 -0.3090829 1 -0.9807853 -0.1950903 -1 -0.7921533 -0.1575691 1 -1 0 -1 -0.8076725 0 1 -0.9807853 0.1950903 -1 -0.7921533 0.1575691 1 -0.9238795 0.3826835 -1 -0.7461921 0.3090829 1 -0.8314696 0.5555703 -1 -0.6715551 0.4487188 1 -0.7071068 0.7071068 -1 -0.5711107 0.5711107 1 -0.5555703 0.8314696 -1 -0.4487188 0.6715551 1 -0.3826835 0.9238795 -1 -0.3090829 0.7461921 1 -0.1950903 0.9807853 -1 -0.1575691 0.7921533 1 0.1950903 0.9807853 1 0 1 1 0.3826835 0.9238795 1 0.5555703 0.8314696 1 0.7071068 0.7071068 1 0.8314696 0.5555703 1 0.9238795 0.3826835 1 0.9807853 0.1950903 1 1 0 1 0.9807853 -0.1950903 1 0.9238795 -0.3826835 1 0.8314696 -0.5555703 1 0.7071068 -0.7071068 1 0.5555703 -0.8314696 1 0.3826835 -0.9238795 1 0.1950903 -0.9807853 1 0 -1 1 -0.1950903 -0.9807853 1 -0.3826835 -0.9238795 1 -0.5555703 -0.8314696 1 -0.7071068 -0.7071068 1 -0.8314696 -0.5555703 1 -0.9238795 -0.3826835 1 -0.9807853 -0.1950903 1 -1 0 1 -0.9807853 0.1950903 1 -0.9238795 0.3826835 1 -0.8314696 0.5555703 1 -0.7071068 0.7071068 1 -0.5555703 0.8314696 1 -0.3826835 0.9238795 1 -0.1950903 0.9807853 1 0.1575691 0.7921533 1.19926 0 0.8076725 1.19926 0.3090829 0.7461921 1.19926 0.4487188 0.6715551 1.19926 0.5711107 0.5711107 1.19926 0.6715551 0.4487188 1.19926 0.7461921 0.3090829 1.19926 0.7921533 0.1575691 1.19926 0.8076725 0 1.19926 0.7921533 -0.1575691 1.19926 0.7461921 -0.3090829 1.19926 0.6715551 -0.4487188 1.19926 0.5711107 -0.5711107 1.19926 0.4487188 -0.6715551 1.19926 0.3090829 -0.7461921 1.19926 0.1575691 -0.7921533 1.19926 0 -0.8076725 1.19926 -0.1575691 -0.7921533 1.19926 -0.3090829 -0.7461921 1.19926 -0.4487188 -0.6715551 1.19926 -0.5711107 -0.5711107 1.19926 -0.6715551 -0.4487188 1.19926 -0.7461921 -0.3090829 1.19926 -0.7921533 -0.1575691 1.19926 -0.8076725 0 1.19926 -0.7921533 0.1575691 1.19926 -0.7461921 0.3090829 1.19926 -0.6715551 0.4487188 1.19926 -0.5711107 0.5711107 1.19926 -0.4487188 0.6715551 1.19926 -0.3090829 0.7461921 1.19926 -0.1575691 0.7921533 1.19926
+
+
+
+
+
+
+
+
+
+ 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713967 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713967 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713967 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713967 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713967 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713967 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713967 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713967 0.8819213 0 -0.9569403 0.2902845 0 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.6343935 -0.7730103 0 -0.8819211 0.471397 0 0.471397 -0.8819211 0 0.09801715 0.9951847 0 -0.7730103 0.6343935 0 0.2902845 -0.9569403 0 0.2902845 0.9569403 0 -0.6343935 0.7730103 0 0.09801715 -0.9951847 0 0.471397 0.8819211 0 -0.471397 0.8819211 0 -0.09801715 -0.9951847 0 0.6343935 0.7730103 0 -0.2902845 0.9569403 0 -0.2902845 -0.9569403 0 0.7730103 0.6343935 0 -0.09801715 0.9951847 0 -0.471397 -0.8819211 0 0.8819211 0.471397 0 -0.6343935 -0.7730103 0 0.9569404 0.2902845 0 -0.7730103 -0.6343935 0 0.9951847 0.09801715 0 -0.8819211 -0.471397 0 0.9951847 -0.09801715 0 -0.9569403 -0.2902845 0 0.9569403 -0.2902845 0 -0.9951847 -0.09801715 0 0.8819211 -0.471397 0 -0.9951847 0.09801715 0 0.7730103 -0.6343935 0 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713967 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713967 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713967 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713967 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713967 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713967 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713967 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713967 0.8819213 0 -0.9569404 0.2902846 0 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.6343935 -0.7730103 0 -0.8819211 0.471397 0 0.471397 -0.8819211 0 0.09801715 0.9951847 0 -0.7730103 0.6343935 0 0.2902845 -0.9569403 0 0.2902845 0.9569403 0 -0.6343935 0.7730103 0 0.09801715 -0.9951847 0 0.471397 0.8819211 0 -0.471397 0.8819211 0 -0.09801715 -0.9951847 0 0.6343935 0.7730103 0 -0.2902845 0.9569403 0 -0.2902845 -0.9569403 0 0.7730103 0.6343935 0 -0.09801715 0.9951847 0 -0.471397 -0.8819211 0 0.8819211 0.471397 0 -0.6343935 -0.7730103 0 0.9569404 0.2902846 0 -0.7730103 -0.6343935 0 0.9951847 0.09801715 0 -0.8819211 -0.471397 0 0.9951847 -0.09801715 0 -0.9569403 -0.2902845 0 0.9569403 -0.2902845 0 -0.9951847 -0.09801715 0 0.8819211 -0.471397 0 -0.9951847 0.09801715 0 0.7730103 -0.6343935 0
+
+
+
+
+
+
+
+
+
+ 1 1 0.96875 0.5 1 0.5 0.96875 1 0.9375 0.5 0.96875 0.5 0.9375 1 0.90625 0.5 0.9375 0.5 0.90625 1 0.875 0.5 0.90625 0.5 0.875 1 0.84375 0.5 0.875 0.5 0.84375 1 0.8125 0.5 0.84375 0.5 0.8125 1 0.78125 0.5 0.8125 0.5 0.78125 1 0.75 0.5 0.78125 0.5 0.75 1 0.71875 0.5 0.75 0.5 0.71875 1 0.6875 0.5 0.71875 0.5 0.6875 1 0.65625 0.5 0.6875 0.5 0.65625 1 0.625 0.5 0.65625 0.5 0.625 1 0.59375 0.5 0.625 0.5 0.59375 1 0.5625 0.5 0.59375 0.5 0.5625 1 0.53125 0.5 0.5625 0.5 0.53125 1 0.5 0.5 0.53125 0.5 0.5 1 0.46875 0.5 0.5 0.5 0.46875 1 0.4375 0.5 0.46875 0.5 0.4375 1 0.40625 0.5 0.4375 0.5 0.40625 1 0.375 0.5 0.40625 0.5 0.375 1 0.34375 0.5 0.375 0.5 0.34375 1 0.3125 0.5 0.34375 0.5 0.3125 1 0.28125 0.5 0.3125 0.5 0.28125 1 0.25 0.5 0.28125 0.5 0.25 1 0.21875 0.5 0.25 0.5 0.21875 1 0.1875 0.5 0.21875 0.5 0.1875 1 0.15625 0.5 0.1875 0.5 0.15625 1 0.125 0.5 0.15625 0.5 0.125 1 0.09375 0.5 0.125 0.5 0.09375 1 0.0625 0.5 0.09375 0.5 0.05988317 0.2878165 0.07091385 0.3241799 0.07091385 0.3241799 0.0625 1 0.03125 0.5 0.0625 0.5 0.03125 1 0 0.5 0.03125 0.5 0.7968217 0.01461154 0.5146116 0.2031783 0.7031784 0.4853885 0.25 0.4438413 0.2968217 0.4853885 0.25 0.49 0.3241798 0.429086 0.2968217 0.4853885 0.2878165 0.4401167 0.3241798 0.429086 0.3833369 0.4495527 0.341844 0.4717311 0.3576925 0.4111732 0.4197056 0.4197056 0.3833369 0.4495527 0.4111732 0.3576925 0.4197056 0.4197056 0.3870666 0.3870666 0.429086 0.3241798 0.4495527 0.3833369 0.4111732 0.3576925 0.429086 0.3241798 0.4853885 0.2968217 0.4717311 0.341844 0.4438413 0.25 0.4853885 0.2968217 0.4401168 0.2878166 0.4438413 0.25 0.4853885 0.2031783 0.49 0.25 0.429086 0.1758201 0.4853885 0.2031783 0.4401167 0.2121834 0.429086 0.1758201 0.4495527 0.1166631 0.4717311 0.1581559 0.4111732 0.1423075 0.4197056 0.08029437 0.4495527 0.1166631 0.3576925 0.08882677 0.4197056 0.08029437 0.3870666 0.1129334 0.3241798 0.07091385 0.3833369 0.05044728 0.3576925 0.08882677 0.3241798 0.07091385 0.2968217 0.01461154 0.341844 0.02826887 0.25 0.0561586 0.2968217 0.01461154 0.2878165 0.05988317 0.25 0.0561586 0.2031783 0.01461154 0.25 0.00999999 0.1758201 0.07091385 0.2031783 0.01461154 0.2121834 0.05988317 0.1758201 0.07091385 0.1166631 0.05044728 0.1581559 0.02826887 0.1423075 0.08882677 0.08029437 0.08029437 0.1166631 0.05044728 0.08882677 0.1423074 0.08029437 0.08029437 0.1129334 0.1129334 0.07091385 0.1758201 0.05044728 0.1166631 0.08882677 0.1423074 0.07091385 0.1758201 0.01461154 0.2031783 0.02826887 0.1581559 0.05615854 0.25 0.01461154 0.2031783 0.05988317 0.2121833 0.05615854 0.25 0.01461154 0.2968217 0.00999999 0.25 0.07091385 0.3241799 0.01461154 0.2968217 0.05988317 0.2878165 0.07091385 0.3241799 0.05044728 0.3833369 0.02826887 0.341844 0.08882677 0.3576924 0.08029437 0.4197056 0.05044728 0.3833369 0.1423074 0.4111731 0.08029437 0.4197056 0.1129334 0.3870664 0.1758201 0.4290859 0.1166631 0.4495527 0.1423074 0.4111731 0.1758201 0.4290859 0.2031783 0.4853885 0.1581559 0.4717311 0.25 0.4438413 0.2031783 0.4853885 0.2121833 0.4401167 0.3241798 0.429086 0.07091385 0.3241799 0.1758201 0.07091385 0.3870666 0.1129334 0.3576925 0.08882677 0.3576925 0.08882677 0.07091385 0.3241799 0.08882677 0.3576924 0.08882677 0.3576924 0.3576925 0.08882677 0.3241798 0.07091385 0.3241798 0.07091385 0.25 0.4438413 0.2878165 0.4401167 0.2878165 0.4401167 0.08882677 0.3576924 0.1129334 0.3870664 0.1129334 0.3870664 0.3241798 0.07091385 0.2878165 0.05988317 0.2878165 0.05988317 0.2878165 0.4401167 0.3241798 0.429086 0.3241798 0.429086 0.1129334 0.3870664 0.1423074 0.4111731 0.1423074 0.4111731 0.2878165 0.05988317 0.25 0.0561586 0.25 0.0561586 0.3241798 0.429086 0.3576925 0.4111732 0.3576925 0.4111732 0.1423074 0.4111731 0.1758201 0.4290859 0.1758201 0.4290859 0.25 0.0561586 0.2121834 0.05988317 0.2121834 0.05988317 0.3576925 0.4111732 0.3870666 0.3870666 0.3870666 0.3870666 0.1758201 0.4290859 0.2121833 0.4401167 0.2121833 0.4401167 0.2121834 0.05988317 0.1758201 0.07091385 0.1758201 0.07091385 0.3870666 0.3870666 0.4111732 0.3576925 0.4111732 0.3576925 0.2121833 0.4401167 0.25 0.4438413 0.25 0.4438413 0.1758201 0.07091385 0.1423075 0.08882677 0.1423075 0.08882677 0.4111732 0.3576925 0.429086 0.3241798 0.429086 0.3241798 0.1423075 0.08882677 0.1129334 0.1129334 0.1129334 0.1129334 0.429086 0.3241798 0.4401168 0.2878166 0.4401168 0.2878166 0.1129334 0.1129334 0.08882677 0.1423074 0.08882677 0.1423074 0.4401168 0.2878166 0.4438413 0.25 0.4438413 0.25 0.08882677 0.1423074 0.07091385 0.1758201 0.07091385 0.1758201 0.4438413 0.25 0.4401167 0.2121834 0.4401167 0.2121834 0.05988317 0.2121833 0.07091385 0.1758201 0.05988317 0.2121833 0.4401167 0.2121834 0.429086 0.1758201 0.429086 0.1758201 0.05615854 0.25 0.05988317 0.2121833 0.05615854 0.25 0.429086 0.1758201 0.4111732 0.1423075 0.4111732 0.1423075 0.05988317 0.2878165 0.05615854 0.25 0.05988317 0.2878165 0.4111732 0.1423075 0.3870666 0.1129334 0.3870666 0.1129334 1 1 0.96875 1 0.96875 0.5 0.96875 1 0.9375 1 0.9375 0.5 0.9375 1 0.90625 1 0.90625 0.5 0.90625 1 0.875 1 0.875 0.5 0.875 1 0.84375 1 0.84375 0.5 0.84375 1 0.8125 1 0.8125 0.5 0.8125 1 0.78125 1 0.78125 0.5 0.78125 1 0.75 1 0.75 0.5 0.75 1 0.71875 1 0.71875 0.5 0.71875 1 0.6875 1 0.6875 0.5 0.6875 1 0.65625 1 0.65625 0.5 0.65625 1 0.625 1 0.625 0.5 0.625 1 0.59375 1 0.59375 0.5 0.59375 1 0.5625 1 0.5625 0.5 0.5625 1 0.53125 1 0.53125 0.5 0.53125 1 0.5 1 0.5 0.5 0.5 1 0.46875 1 0.46875 0.5 0.46875 1 0.4375 1 0.4375 0.5 0.4375 1 0.40625 1 0.40625 0.5 0.40625 1 0.375 1 0.375 0.5 0.375 1 0.34375 1 0.34375 0.5 0.34375 1 0.3125 1 0.3125 0.5 0.3125 1 0.28125 1 0.28125 0.5 0.28125 1 0.25 1 0.25 0.5 0.25 1 0.21875 1 0.21875 0.5 0.21875 1 0.1875 1 0.1875 0.5 0.1875 1 0.15625 1 0.15625 0.5 0.15625 1 0.125 1 0.125 0.5 0.125 1 0.09375 1 0.09375 0.5 0.09375 1 0.0625 1 0.0625 0.5 0.05988317 0.2878165 0.05988317 0.2878165 0.07091385 0.3241799 0.0625 1 0.03125 1 0.03125 0.5 0.03125 1 0 1 0 0.5 0.7031784 0.4853885 0.75 0.49 0.7968217 0.4853885 0.7968217 0.4853885 0.841844 0.4717311 0.8833369 0.4495527 0.8833369 0.4495527 0.9197056 0.4197056 0.9495527 0.3833369 0.9495527 0.3833369 0.9717311 0.341844 0.9853885 0.2968217 0.9853885 0.2968217 0.99 0.25 0.9853885 0.2031783 0.9853885 0.2031783 0.9717311 0.1581559 0.9495527 0.1166631 0.9495527 0.1166631 0.9197056 0.08029437 0.8833369 0.05044728 0.8833369 0.05044728 0.841844 0.02826887 0.7968217 0.01461154 0.7968217 0.01461154 0.75 0.00999999 0.7031784 0.01461154 0.7031784 0.01461154 0.658156 0.02826887 0.6166632 0.05044728 0.6166632 0.05044728 0.5802944 0.08029437 0.5504473 0.1166631 0.5504473 0.1166631 0.5282689 0.1581559 0.5146116 0.2031783 0.5146116 0.2031783 0.51 0.25 0.5146116 0.2968217 0.5146116 0.2968217 0.5282689 0.341844 0.5504473 0.3833369 0.5504473 0.3833369 0.5802944 0.4197056 0.6166632 0.4495527 0.6166632 0.4495527 0.658156 0.4717311 0.7031784 0.4853885 0.7031784 0.4853885 0.7968217 0.4853885 0.9853885 0.2968217 0.7968217 0.4853885 0.8833369 0.4495527 0.9853885 0.2968217 0.8833369 0.4495527 0.9495527 0.3833369 0.9853885 0.2968217 0.9853885 0.2968217 0.9853885 0.2031783 0.7968217 0.01461154 0.9853885 0.2031783 0.9495527 0.1166631 0.7968217 0.01461154 0.9495527 0.1166631 0.8833369 0.05044728 0.7968217 0.01461154 0.7968217 0.01461154 0.7031784 0.01461154 0.5146116 0.2031783 0.7031784 0.01461154 0.6166632 0.05044728 0.5146116 0.2031783 0.6166632 0.05044728 0.5504473 0.1166631 0.5146116 0.2031783 0.5146116 0.2031783 0.5146116 0.2968217 0.7031784 0.4853885 0.5146116 0.2968217 0.5504473 0.3833369 0.7031784 0.4853885 0.5504473 0.3833369 0.6166632 0.4495527 0.7031784 0.4853885 0.7031784 0.4853885 0.9853885 0.2968217 0.7968217 0.01461154 0.25 0.4438413 0.2878165 0.4401167 0.2968217 0.4853885 0.3241798 0.429086 0.341844 0.4717311 0.2968217 0.4853885 0.3241798 0.429086 0.3576925 0.4111732 0.3833369 0.4495527 0.3576925 0.4111732 0.3870666 0.3870666 0.4197056 0.4197056 0.4111732 0.3576925 0.4495527 0.3833369 0.4197056 0.4197056 0.429086 0.3241798 0.4717311 0.341844 0.4495527 0.3833369 0.429086 0.3241798 0.4401168 0.2878166 0.4853885 0.2968217 0.4438413 0.25 0.49 0.25 0.4853885 0.2968217 0.4438413 0.25 0.4401167 0.2121834 0.4853885 0.2031783 0.429086 0.1758201 0.4717311 0.1581559 0.4853885 0.2031783 0.429086 0.1758201 0.4111732 0.1423075 0.4495527 0.1166631 0.4111732 0.1423075 0.3870666 0.1129334 0.4197056 0.08029437 0.3576925 0.08882677 0.3833369 0.05044728 0.4197056 0.08029437 0.3241798 0.07091385 0.341844 0.02826887 0.3833369 0.05044728 0.3241798 0.07091385 0.2878165 0.05988317 0.2968217 0.01461154 0.25 0.0561586 0.25 0.00999999 0.2968217 0.01461154 0.25 0.0561586 0.2121834 0.05988317 0.2031783 0.01461154 0.1758201 0.07091385 0.1581559 0.02826887 0.2031783 0.01461154 0.1758201 0.07091385 0.1423075 0.08882677 0.1166631 0.05044728 0.1423075 0.08882677 0.1129334 0.1129334 0.08029437 0.08029437 0.08882677 0.1423074 0.05044728 0.1166631 0.08029437 0.08029437 0.07091385 0.1758201 0.02826887 0.1581559 0.05044728 0.1166631 0.07091385 0.1758201 0.05988317 0.2121833 0.01461154 0.2031783 0.05615854 0.25 0.00999999 0.25 0.01461154 0.2031783 0.05615854 0.25 0.05988317 0.2878165 0.01461154 0.2968217 0.07091385 0.3241799 0.02826887 0.341844 0.01461154 0.2968217 0.07091385 0.3241799 0.08882677 0.3576924 0.05044728 0.3833369 0.08882677 0.3576924 0.1129334 0.3870664 0.08029437 0.4197056 0.1423074 0.4111731 0.1166631 0.4495527 0.08029437 0.4197056 0.1758201 0.4290859 0.1581559 0.4717311 0.1166631 0.4495527 0.1758201 0.4290859 0.2121833 0.4401167 0.2031783 0.4853885 0.25 0.4438413 0.25 0.49 0.2031783 0.4853885 0.3241798 0.429086 0.2878165 0.4401167 0.1758201 0.4290859 0.2878165 0.4401167 0.25 0.4438413 0.1758201 0.4290859 0.25 0.4438413 0.2121833 0.4401167 0.1758201 0.4290859 0.1758201 0.4290859 0.1423074 0.4111731 0.1129334 0.3870664 0.1129334 0.3870664 0.08882677 0.3576924 0.07091385 0.3241799 0.07091385 0.3241799 0.05988317 0.2878165 0.05615854 0.25 0.05615854 0.25 0.05988317 0.2121833 0.07091385 0.3241799 0.05988317 0.2121833 0.07091385 0.1758201 0.07091385 0.3241799 0.07091385 0.1758201 0.08882677 0.1423074 0.1129334 0.1129334 0.1129334 0.1129334 0.1423075 0.08882677 0.1758201 0.07091385 0.1758201 0.07091385 0.2121834 0.05988317 0.25 0.0561586 0.25 0.0561586 0.2878165 0.05988317 0.1758201 0.07091385 0.2878165 0.05988317 0.3241798 0.07091385 0.1758201 0.07091385 0.3241798 0.07091385 0.3576925 0.08882677 0.3870666 0.1129334 0.3870666 0.1129334 0.4111732 0.1423075 0.429086 0.1758201 0.429086 0.1758201 0.4401167 0.2121834 0.429086 0.3241798 0.4401167 0.2121834 0.4438413 0.25 0.429086 0.3241798 0.4438413 0.25 0.4401168 0.2878166 0.429086 0.3241798 0.429086 0.3241798 0.4111732 0.3576925 0.3870666 0.3870666 0.3870666 0.3870666 0.3576925 0.4111732 0.3241798 0.429086 0.1758201 0.4290859 0.1129334 0.3870664 0.3241798 0.429086 0.1129334 0.3870664 0.07091385 0.3241799 0.3241798 0.429086 0.07091385 0.1758201 0.1129334 0.1129334 0.07091385 0.3241799 0.1129334 0.1129334 0.1758201 0.07091385 0.07091385 0.3241799 0.3241798 0.07091385 0.3870666 0.1129334 0.429086 0.1758201 0.429086 0.3241798 0.3870666 0.3870666 0.429086 0.1758201 0.3870666 0.3870666 0.3241798 0.429086 0.429086 0.1758201 0.1758201 0.07091385 0.3241798 0.07091385 0.3241798 0.429086 0.3241798 0.07091385 0.429086 0.1758201 0.3241798 0.429086 0.3870666 0.1129334 0.3870666 0.1129334 0.3576925 0.08882677 0.07091385 0.3241799 0.07091385 0.3241799 0.08882677 0.3576924 0.3576925 0.08882677 0.3576925 0.08882677 0.3241798 0.07091385 0.25 0.4438413 0.25 0.4438413 0.2878165 0.4401167 0.08882677 0.3576924 0.08882677 0.3576924 0.1129334 0.3870664 0.3241798 0.07091385 0.3241798 0.07091385 0.2878165 0.05988317 0.2878165 0.4401167 0.2878165 0.4401167 0.3241798 0.429086 0.1129334 0.3870664 0.1129334 0.3870664 0.1423074 0.4111731 0.2878165 0.05988317 0.2878165 0.05988317 0.25 0.0561586 0.3241798 0.429086 0.3241798 0.429086 0.3576925 0.4111732 0.1423074 0.4111731 0.1423074 0.4111731 0.1758201 0.4290859 0.25 0.0561586 0.25 0.0561586 0.2121834 0.05988317 0.3576925 0.4111732 0.3576925 0.4111732 0.3870666 0.3870666 0.1758201 0.4290859 0.1758201 0.4290859 0.2121833 0.4401167 0.2121834 0.05988317 0.2121834 0.05988317 0.1758201 0.07091385 0.3870666 0.3870666 0.3870666 0.3870666 0.4111732 0.3576925 0.2121833 0.4401167 0.2121833 0.4401167 0.25 0.4438413 0.1758201 0.07091385 0.1758201 0.07091385 0.1423075 0.08882677 0.4111732 0.3576925 0.4111732 0.3576925 0.429086 0.3241798 0.1423075 0.08882677 0.1423075 0.08882677 0.1129334 0.1129334 0.429086 0.3241798 0.429086 0.3241798 0.4401168 0.2878166 0.1129334 0.1129334 0.1129334 0.1129334 0.08882677 0.1423074 0.4401168 0.2878166 0.4401168 0.2878166 0.4438413 0.25 0.08882677 0.1423074 0.08882677 0.1423074 0.07091385 0.1758201 0.4438413 0.25 0.4438413 0.25 0.4401167 0.2121834 0.05988317 0.2121833 0.07091385 0.1758201 0.07091385 0.1758201 0.4401167 0.2121834 0.4401167 0.2121834 0.429086 0.1758201 0.05615854 0.25 0.05988317 0.2121833 0.05988317 0.2121833 0.429086 0.1758201 0.429086 0.1758201 0.4111732 0.1423075 0.05988317 0.2878165 0.05615854 0.25 0.05615854 0.25 0.4111732 0.1423075 0.4111732 0.1423075 0.3870666 0.1129334
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 65 0 0 2 0 1 0 0 2 64 1 3 4 1 4 2 1 5 66 2 6 6 2 7 4 2 8 67 3 9 8 3 10 6 3 11 68 4 12 10 4 13 8 4 14 69 5 15 12 5 16 10 5 17 70 6 18 14 6 19 12 6 20 71 7 21 16 7 22 14 7 23 72 8 24 18 8 25 16 8 26 73 9 27 20 9 28 18 9 29 74 10 30 22 10 31 20 10 32 75 11 33 24 11 34 22 11 35 76 12 36 26 12 37 24 12 38 77 13 39 28 13 40 26 13 41 78 14 42 30 14 43 28 14 44 79 15 45 32 15 46 30 15 47 80 16 48 34 16 49 32 16 50 81 17 51 36 17 52 34 17 53 82 18 54 38 18 55 36 18 56 83 19 57 40 19 58 38 19 59 84 20 60 42 20 61 40 20 62 85 21 63 44 21 64 42 21 65 86 22 66 46 22 67 44 22 68 87 23 69 48 23 70 46 23 71 88 24 72 50 24 73 48 24 74 89 25 75 52 25 76 50 25 77 90 26 78 54 26 79 52 26 80 91 27 81 56 27 82 54 27 83 92 28 84 58 28 85 56 28 86 93 29 87 60 29 88 58 29 89 51 30 90 122 30 91 53 30 92 94 31 93 62 31 94 60 31 95 95 32 96 0 32 97 62 32 98 30 33 99 46 33 100 62 33 101 1 34 102 64 34 103 65 34 104 5 35 105 64 35 106 3 35 107 5 36 108 67 36 109 66 36 110 7 37 111 68 37 112 67 37 113 11 38 114 68 38 115 9 38 116 13 39 117 69 39 118 11 39 119 13 40 120 71 40 121 70 40 122 17 41 123 71 41 124 15 41 125 17 42 126 73 42 127 72 42 128 21 43 129 73 43 130 19 43 131 21 44 132 75 44 133 74 44 134 23 45 135 76 45 136 75 45 137 27 46 138 76 46 139 25 46 140 29 47 141 77 47 142 27 47 143 29 48 144 79 48 145 78 48 146 33 49 147 79 49 148 31 49 149 33 50 150 81 50 151 80 50 152 37 51 153 81 51 154 35 51 155 37 52 156 83 52 157 82 52 158 39 53 159 84 53 160 83 53 161 43 54 162 84 54 163 41 54 164 45 55 165 85 55 166 43 55 167 45 56 168 87 56 169 86 56 170 49 57 171 87 57 172 47 57 173 49 58 174 89 58 175 88 58 176 53 59 177 89 59 178 51 59 179 53 60 180 91 60 181 90 60 182 55 61 183 92 61 184 91 61 185 59 62 186 92 62 187 57 62 188 61 63 189 93 63 190 59 63 191 61 64 192 95 64 193 94 64 194 1 65 195 95 65 196 63 65 197 98 66 198 122 66 199 114 66 200 25 67 201 109 67 202 27 67 203 53 68 204 123 68 205 55 68 206 27 69 207 110 69 208 29 69 209 1 70 210 96 70 211 3 70 212 55 71 213 124 71 214 57 71 215 29 72 216 111 72 217 31 72 218 3 73 219 98 73 220 5 73 221 57 74 222 125 74 223 59 74 224 31 75 225 112 75 226 33 75 227 5 76 228 99 76 229 7 76 230 59 77 231 126 77 232 61 77 233 33 78 234 113 78 235 35 78 236 7 79 237 100 79 238 9 79 239 61 80 240 127 80 241 63 80 242 35 81 243 114 81 244 37 81 245 9 82 246 101 82 247 11 82 248 63 83 249 97 83 250 1 83 251 37 84 252 115 84 253 39 84 254 11 85 255 102 85 256 13 85 257 39 86 258 116 86 259 41 86 260 13 87 261 103 87 262 15 87 263 41 88 264 117 88 265 43 88 266 15 89 267 104 89 268 17 89 269 43 90 270 118 90 271 45 90 272 17 91 273 105 91 274 19 91 275 47 92 276 118 92 277 119 92 278 19 93 279 106 93 280 21 93 281 49 94 282 119 94 283 120 94 284 21 95 285 107 95 286 23 95 287 51 96 288 120 96 289 121 96 290 23 97 291 108 97 292 25 97 293 65 98 294 64 98 295 2 98 296 64 99 297 66 99 298 4 99 299 66 100 300 67 100 301 6 100 302 67 101 303 68 101 304 8 101 305 68 102 306 69 102 307 10 102 308 69 103 309 70 103 310 12 103 311 70 104 312 71 104 313 14 104 314 71 105 315 72 105 316 16 105 317 72 106 318 73 106 319 18 106 320 73 107 321 74 107 322 20 107 323 74 108 324 75 108 325 22 108 326 75 109 327 76 109 328 24 109 329 76 110 330 77 110 331 26 110 332 77 111 333 78 111 334 28 111 335 78 112 336 79 112 337 30 112 338 79 113 339 80 113 340 32 113 341 80 114 342 81 114 343 34 114 344 81 115 345 82 115 346 36 115 347 82 116 348 83 116 349 38 116 350 83 117 351 84 117 352 40 117 353 84 118 354 85 118 355 42 118 356 85 119 357 86 119 358 44 119 359 86 120 360 87 120 361 46 120 362 87 121 363 88 121 364 48 121 365 88 122 366 89 122 367 50 122 368 89 123 369 90 123 370 52 123 371 90 124 372 91 124 373 54 124 374 91 125 375 92 125 376 56 125 377 92 126 378 93 126 379 58 126 380 93 127 381 94 127 382 60 127 383 51 128 384 121 128 385 122 128 386 94 129 387 95 129 388 62 129 389 95 130 390 65 130 391 0 130 392 62 131 393 0 131 394 2 131 395 2 132 396 4 132 397 6 132 398 6 133 399 8 133 400 10 133 401 10 134 402 12 134 403 14 134 404 14 135 405 16 135 406 18 135 407 18 136 408 20 136 409 22 136 410 22 137 411 24 137 412 26 137 413 26 138 414 28 138 415 30 138 416 30 139 417 32 139 418 34 139 419 34 140 420 36 140 421 38 140 422 38 141 423 40 141 424 42 141 425 42 142 426 44 142 427 46 142 428 46 143 429 48 143 430 50 143 431 50 144 432 52 144 433 54 144 434 54 145 435 56 145 436 58 145 437 58 146 438 60 146 439 62 146 440 62 147 441 2 147 442 14 147 443 2 148 444 6 148 445 14 148 446 6 149 447 10 149 448 14 149 449 14 150 450 18 150 451 30 150 452 18 151 453 22 151 454 30 151 455 22 152 456 26 152 457 30 152 458 30 153 459 34 153 460 46 153 461 34 154 462 38 154 463 46 154 464 38 155 465 42 155 466 46 155 467 46 156 468 50 156 469 62 156 470 50 157 471 54 157 472 62 157 473 54 158 474 58 158 475 62 158 476 62 159 477 14 159 478 30 159 479 1 160 480 3 160 481 64 160 482 5 161 483 66 161 484 64 161 485 5 162 486 7 162 487 67 162 488 7 163 489 9 163 490 68 163 491 11 164 492 69 164 493 68 164 494 13 165 495 70 165 496 69 165 497 13 166 498 15 166 499 71 166 500 17 167 501 72 167 502 71 167 503 17 168 504 19 168 505 73 168 506 21 169 507 74 169 508 73 169 509 21 170 510 23 170 511 75 170 512 23 171 513 25 171 514 76 171 515 27 172 516 77 172 517 76 172 518 29 173 519 78 173 520 77 173 521 29 174 522 31 174 523 79 174 524 33 175 525 80 175 526 79 175 527 33 176 528 35 176 529 81 176 530 37 177 531 82 177 532 81 177 533 37 178 534 39 178 535 83 178 536 39 179 537 41 179 538 84 179 539 43 180 540 85 180 541 84 180 542 45 181 543 86 181 544 85 181 545 45 182 546 47 182 547 87 182 548 49 183 549 88 183 550 87 183 551 49 184 552 51 184 553 89 184 554 53 185 555 90 185 556 89 185 557 53 186 558 55 186 559 91 186 560 55 187 561 57 187 562 92 187 563 59 188 564 93 188 565 92 188 566 61 189 567 94 189 568 93 189 569 61 190 570 63 190 571 95 190 572 1 191 573 65 191 574 95 191 575 98 192 576 96 192 577 126 192 578 96 193 579 97 193 580 126 193 581 97 194 582 127 194 583 126 194 584 126 195 585 125 195 586 124 195 587 124 196 588 123 196 589 122 196 590 122 197 591 121 197 592 120 197 593 120 198 594 119 198 595 122 198 596 119 199 597 118 199 598 122 199 599 118 200 600 117 200 601 116 200 602 116 201 603 115 201 604 114 201 605 114 202 606 113 202 607 112 202 608 112 203 609 111 203 610 114 203 611 111 204 612 110 204 613 114 204 614 110 205 615 109 205 616 108 205 617 108 206 618 107 206 619 106 206 620 106 207 621 105 207 622 102 207 623 105 208 624 104 208 625 102 208 626 104 209 627 103 209 628 102 209 629 102 210 630 101 210 631 100 210 632 100 211 633 99 211 634 98 211 635 126 212 636 124 212 637 98 212 638 124 213 639 122 213 640 98 213 641 118 214 642 116 214 643 122 214 644 116 215 645 114 215 646 122 215 647 110 216 648 108 216 649 106 216 650 102 217 651 100 217 652 106 217 653 100 218 654 98 218 655 106 218 656 114 219 657 110 219 658 98 219 659 110 220 660 106 220 661 98 220 662 25 221 663 108 221 664 109 221 665 53 222 666 122 222 667 123 222 668 27 223 669 109 223 670 110 223 671 1 224 672 97 224 673 96 224 674 55 225 675 123 225 676 124 225 677 29 226 678 110 226 679 111 226 680 3 227 681 96 227 682 98 227 683 57 228 684 124 228 685 125 228 686 31 229 687 111 229 688 112 229 689 5 230 690 98 230 691 99 230 692 59 231 693 125 231 694 126 231 695 33 232 696 112 232 697 113 232 698 7 233 699 99 233 700 100 233 701 61 234 702 126 234 703 127 234 704 35 235 705 113 235 706 114 235 707 9 236 708 100 236 709 101 236 710 63 237 711 127 237 712 97 237 713 37 238 714 114 238 715 115 238 716 11 239 717 101 239 718 102 239 719 39 240 720 115 240 721 116 240 722 13 241 723 102 241 724 103 241 725 41 242 726 116 242 727 117 242 728 15 243 729 103 243 730 104 243 731 43 244 732 117 244 733 118 244 734 17 245 735 104 245 736 105 245 737 47 246 738 45 246 739 118 246 740 19 247 741 105 247 742 106 247 743 49 248 744 47 248 745 119 248 746 21 249 747 106 249 748 107 249 749 51 250 750 49 250 751 120 250 752 23 251 753 107 251 754 108 251 755
+
+
+
+
+
+ 123 66 198 111 66 200 127 66 199 127 192 576 99 192 578 96 192 577 96 193 579 99 193 581 97 193 580 97 194 582 99 194 584 98 194 583 99 195 585 103 195 587 100 195 586 100 196 588 103 196 590 101 196 589 101 197 591 103 197 593 102 197 592 103 198 594 107 198 596 104 198 595 104 199 597 107 199 599 105 199 598 105 200 600 107 200 602 106 200 601 107 201 603 111 201 605 108 201 604 108 202 606 111 202 608 109 202 607 109 203 609 111 203 611 110 203 610 111 204 612 115 204 614 112 204 613 112 205 615 115 205 617 113 205 616 113 206 618 115 206 620 114 206 619 115 207 621 119 207 623 116 207 622 116 208 624 119 208 626 117 208 625 117 209 627 119 209 629 118 209 628 119 210 630 123 210 632 120 210 631 120 211 633 123 211 635 121 211 634 121 212 636 123 212 638 122 212 637 123 213 639 127 213 641 124 213 640 124 214 642 127 214 644 125 214 643 125 215 645 127 215 647 126 215 646 127 216 648 103 216 650 99 216 649 103 217 651 127 217 653 107 217 652 107 218 654 127 218 656 111 218 655 111 219 657 119 219 659 115 219 658 119 220 660 111 220 662 123 220 661
+
+
+
+
+
+
+ 0 1 -1 0 0.8076725 1 0.1950903 0.9807853 -1 0.1575691 0.7921533 1 0.3826835 0.9238795 -1 0.3090829 0.7461921 1 0.5555703 0.8314696 -1 0.4487188 0.6715551 1 0.7071068 0.7071068 -1 0.5711107 0.5711107 1 0.8314696 0.5555703 -1 0.6715551 0.4487188 1 0.9238795 0.3826835 -1 0.7461921 0.3090829 1 0.9807853 0.1950903 -1 0.7921533 0.1575691 1 1 0 -1 0.8076725 0 1 0.9807853 -0.1950903 -1 0.7921533 -0.1575691 1 0.9238795 -0.3826835 -1 0.7461921 -0.3090829 1 0.8314696 -0.5555703 -1 0.6715551 -0.4487188 1 0.7071068 -0.7071068 -1 0.5711107 -0.5711107 1 0.5555703 -0.8314696 -1 0.4487188 -0.6715551 1 0.3826835 -0.9238795 -1 0.3090829 -0.7461921 1 0.1950903 -0.9807853 -1 0.1575691 -0.7921533 1 0 -1 -1 0 -0.8076725 1 -0.1950903 -0.9807853 -1 -0.1575691 -0.7921533 1 -0.3826835 -0.9238795 -1 -0.3090829 -0.7461921 1 -0.5555703 -0.8314696 -1 -0.4487188 -0.6715551 1 -0.7071068 -0.7071068 -1 -0.5711107 -0.5711107 1 -0.8314696 -0.5555703 -1 -0.6715551 -0.4487188 1 -0.9238795 -0.3826835 -1 -0.7461921 -0.3090829 1 -0.9807853 -0.1950903 -1 -0.7921533 -0.1575691 1 -1 0 -1 -0.8076725 0 1 -0.9807853 0.1950903 -1 -0.7921533 0.1575691 1 -0.9238795 0.3826835 -1 -0.7461921 0.3090829 1 -0.8314696 0.5555703 -1 -0.6715551 0.4487188 1 -0.7071068 0.7071068 -1 -0.5711107 0.5711107 1 -0.5555703 0.8314696 -1 -0.4487188 0.6715551 1 -0.3826835 0.9238795 -1 -0.3090829 0.7461921 1 -0.1950903 0.9807853 -1 -0.1575691 0.7921533 1 0.1950903 0.9807853 1 0 1 1 0.3826835 0.9238795 1 0.5555703 0.8314696 1 0.7071068 0.7071068 1 0.8314696 0.5555703 1 0.9238795 0.3826835 1 0.9807853 0.1950903 1 1 0 1 0.9807853 -0.1950903 1 0.9238795 -0.3826835 1 0.8314696 -0.5555703 1 0.7071068 -0.7071068 1 0.5555703 -0.8314696 1 0.3826835 -0.9238795 1 0.1950903 -0.9807853 1 0 -1 1 -0.1950903 -0.9807853 1 -0.3826835 -0.9238795 1 -0.5555703 -0.8314696 1 -0.7071068 -0.7071068 1 -0.8314696 -0.5555703 1 -0.9238795 -0.3826835 1 -0.9807853 -0.1950903 1 -1 0 1 -0.9807853 0.1950903 1 -0.9238795 0.3826835 1 -0.8314696 0.5555703 1 -0.7071068 0.7071068 1 -0.5555703 0.8314696 1 -0.3826835 0.9238795 1 -0.1950903 0.9807853 1 0.1575691 0.7921533 1.19926 0 0.8076725 1.19926 0.3090829 0.7461921 1.19926 0.4487188 0.6715551 1.19926 0.5711107 0.5711107 1.19926 0.6715551 0.4487188 1.19926 0.7461921 0.3090829 1.19926 0.7921533 0.1575691 1.19926 0.8076725 0 1.19926 0.7921533 -0.1575691 1.19926 0.7461921 -0.3090829 1.19926 0.6715551 -0.4487188 1.19926 0.5711107 -0.5711107 1.19926 0.4487188 -0.6715551 1.19926 0.3090829 -0.7461921 1.19926 0.1575691 -0.7921533 1.19926 0 -0.8076725 1.19926 -0.1575691 -0.7921533 1.19926 -0.3090829 -0.7461921 1.19926 -0.4487188 -0.6715551 1.19926 -0.5711107 -0.5711107 1.19926 -0.6715551 -0.4487188 1.19926 -0.7461921 -0.3090829 1.19926 -0.7921533 -0.1575691 1.19926 -0.8076725 0 1.19926 -0.7921533 0.1575691 1.19926 -0.7461921 0.3090829 1.19926 -0.6715551 0.4487188 1.19926 -0.5711107 0.5711107 1.19926 -0.4487188 0.6715551 1.19926 -0.3090829 0.7461921 1.19926 -0.1575691 0.7921533 1.19926
+
+
+
+
+
+
+
+
+
+ 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713967 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713967 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713967 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713967 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713967 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713967 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713967 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713967 0.8819213 0 -0.09801715 -0.9951847 0 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.6343935 0.7730103 0 -0.2902845 0.9569403 0 -0.2902845 -0.9569403 0 0.7730103 0.6343935 0 -0.09801715 0.9951847 0 -0.471397 -0.8819211 0 0.8819211 0.471397 0 -0.6343935 -0.7730103 0 0.9569404 0.2902845 0 -0.7730103 -0.6343935 0 0.9951847 0.09801715 0 -0.8819211 -0.471397 0 0.9951847 -0.09801715 0 -0.9569403 -0.2902845 0 0.9569403 -0.2902845 0 -0.9951847 -0.09801715 0 0.8819211 -0.471397 0 -0.9951847 0.09801715 0 0.7730103 -0.6343935 0 -0.9569403 0.2902845 0 0.6343935 -0.7730103 0 -0.8819211 0.471397 0 0.471397 -0.8819211 0 0.09801715 0.9951847 0 -0.7730103 0.6343935 0 0.2902845 -0.9569403 0 0.2902845 0.9569403 0 -0.6343935 0.7730103 0 0.09801715 -0.9951847 0 0.471397 0.8819211 0 -0.471397 0.8819211 0 0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713967 0.8819213 0 0.6343933 0.7730104 0 0.7730104 0.6343933 0 0.8819213 0.4713967 0 0.9569404 0.2902846 0 0.9951847 0.09801727 0 0.9951847 -0.09801727 0 0.9569404 -0.2902846 0 0.8819213 -0.4713967 0 0.7730104 -0.6343933 0 0.6343933 -0.7730104 0 0.4713967 -0.8819213 0 0.2902846 -0.9569404 0 0.09801727 -0.9951847 0 -0.09801727 -0.9951847 0 -0.2902846 -0.9569404 0 -0.4713967 -0.8819213 0 -0.6343933 -0.7730104 0 -0.7730104 -0.6343933 0 -0.8819213 -0.4713967 0 -0.9569404 -0.2902846 0 -0.9951847 -0.09801727 0 -0.9951847 0.09801727 0 -0.9569404 0.2902846 0 -0.8819213 0.4713967 0 -0.7730104 0.6343933 0 -0.6343933 0.7730104 0 -0.4713967 0.8819213 0 -0.09801715 -0.9951847 0 -0.2902846 0.9569404 0 -0.09801727 0.9951847 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.6343935 0.7730103 0 -0.2902845 0.9569403 0 -0.2902845 -0.9569403 0 0.7730103 0.6343935 0 -0.09801715 0.9951847 0 -0.471397 -0.8819211 0 0.8819211 0.471397 0 -0.6343935 -0.7730103 0 0.9569404 0.2902846 0 -0.7730103 -0.6343935 0 0.9951847 0.09801715 0 -0.8819211 -0.471397 0 0.9951847 -0.09801715 0 -0.9569403 -0.2902845 0 0.9569403 -0.2902845 0 -0.9951847 -0.09801715 0 0.8819211 -0.471397 0 -0.9951847 0.09801715 0 0.7730103 -0.6343935 0 -0.9569404 0.2902846 0 0.6343935 -0.7730103 0 -0.8819211 0.471397 0 0.471397 -0.8819211 0 0.09801715 0.9951847 0 -0.7730103 0.6343935 0 0.2902845 -0.9569403 0 0.2902845 0.9569403 0 -0.6343935 0.7730103 0 0.09801715 -0.9951847 0 0.471397 0.8819211 0 -0.471397 0.8819211 0
+
+
+
+
+
+
+
+
+
+ 1 1 0.96875 0.5 1 0.5 0.96875 1 0.9375 0.5 0.96875 0.5 0.9375 1 0.90625 0.5 0.9375 0.5 0.90625 1 0.875 0.5 0.90625 0.5 0.875 1 0.84375 0.5 0.875 0.5 0.84375 1 0.8125 0.5 0.84375 0.5 0.8125 1 0.78125 0.5 0.8125 0.5 0.78125 1 0.75 0.5 0.78125 0.5 0.75 1 0.71875 0.5 0.75 0.5 0.71875 1 0.6875 0.5 0.71875 0.5 0.6875 1 0.65625 0.5 0.6875 0.5 0.65625 1 0.625 0.5 0.65625 0.5 0.625 1 0.59375 0.5 0.625 0.5 0.59375 1 0.5625 0.5 0.59375 0.5 0.5625 1 0.53125 0.5 0.5625 0.5 0.53125 1 0.5 0.5 0.53125 0.5 0.5 1 0.46875 0.5 0.5 0.5 0.46875 1 0.4375 0.5 0.46875 0.5 0.4375 1 0.40625 0.5 0.4375 0.5 0.40625 1 0.375 0.5 0.40625 0.5 0.375 1 0.34375 0.5 0.375 0.5 0.34375 1 0.3125 0.5 0.34375 0.5 0.3125 1 0.28125 0.5 0.3125 0.5 0.28125 1 0.25 0.5 0.28125 0.5 0.25 1 0.21875 0.5 0.25 0.5 0.21875 1 0.1875 0.5 0.21875 0.5 0.1875 1 0.15625 0.5 0.1875 0.5 0.15625 1 0.125 0.5 0.15625 0.5 0.125 1 0.09375 0.5 0.125 0.5 0.09375 1 0.0625 0.5 0.09375 0.5 0.25 0.0561586 0.2121834 0.05988317 0.2121834 0.05988317 0.0625 1 0.03125 0.5 0.0625 0.5 0.03125 1 0 0.5 0.03125 0.5 0.7968217 0.01461154 0.5146116 0.2031783 0.7031784 0.4853885 0.25 0.4438413 0.2968217 0.4853885 0.25 0.49 0.3241798 0.429086 0.2968217 0.4853885 0.2878165 0.4401167 0.3241798 0.429086 0.3833369 0.4495527 0.341844 0.4717311 0.3576925 0.4111732 0.4197056 0.4197056 0.3833369 0.4495527 0.4111732 0.3576925 0.4197056 0.4197056 0.3870666 0.3870666 0.429086 0.3241798 0.4495527 0.3833369 0.4111732 0.3576925 0.429086 0.3241798 0.4853885 0.2968217 0.4717311 0.341844 0.4438413 0.25 0.4853885 0.2968217 0.4401168 0.2878166 0.4438413 0.25 0.4853885 0.2031783 0.49 0.25 0.429086 0.1758201 0.4853885 0.2031783 0.4401167 0.2121834 0.429086 0.1758201 0.4495527 0.1166631 0.4717311 0.1581559 0.4111732 0.1423075 0.4197056 0.08029437 0.4495527 0.1166631 0.3576925 0.08882677 0.4197056 0.08029437 0.3870666 0.1129334 0.3241798 0.07091385 0.3833369 0.05044728 0.3576925 0.08882677 0.3241798 0.07091385 0.2968217 0.01461154 0.341844 0.02826887 0.25 0.0561586 0.2968217 0.01461154 0.2878165 0.05988317 0.25 0.0561586 0.2031783 0.01461154 0.25 0.00999999 0.1758201 0.07091385 0.2031783 0.01461154 0.2121834 0.05988317 0.1758201 0.07091385 0.1166631 0.05044728 0.1581559 0.02826887 0.1423075 0.08882677 0.08029437 0.08029437 0.1166631 0.05044728 0.08882677 0.1423074 0.08029437 0.08029437 0.1129334 0.1129334 0.07091385 0.1758201 0.05044728 0.1166631 0.08882677 0.1423074 0.07091385 0.1758201 0.01461154 0.2031783 0.02826887 0.1581559 0.05615854 0.25 0.01461154 0.2031783 0.05988317 0.2121833 0.05615854 0.25 0.01461154 0.2968217 0.00999999 0.25 0.07091385 0.3241799 0.01461154 0.2968217 0.05988317 0.2878165 0.07091385 0.3241799 0.05044728 0.3833369 0.02826887 0.341844 0.08882677 0.3576924 0.08029437 0.4197056 0.05044728 0.3833369 0.1423074 0.4111731 0.08029437 0.4197056 0.1129334 0.3870664 0.1758201 0.4290859 0.1166631 0.4495527 0.1423074 0.4111731 0.1758201 0.4290859 0.2031783 0.4853885 0.1581559 0.4717311 0.25 0.4438413 0.2031783 0.4853885 0.2121833 0.4401167 0.3241798 0.429086 0.07091385 0.3241799 0.1758201 0.07091385 0.3576925 0.4111732 0.3870666 0.3870666 0.3870666 0.3870666 0.1758201 0.4290859 0.2121833 0.4401167 0.2121833 0.4401167 0.2121834 0.05988317 0.1758201 0.07091385 0.1758201 0.07091385 0.3870666 0.3870666 0.4111732 0.3576925 0.4111732 0.3576925 0.2121833 0.4401167 0.25 0.4438413 0.25 0.4438413 0.1758201 0.07091385 0.1423075 0.08882677 0.1423075 0.08882677 0.4111732 0.3576925 0.429086 0.3241798 0.429086 0.3241798 0.1423075 0.08882677 0.1129334 0.1129334 0.1129334 0.1129334 0.429086 0.3241798 0.4401168 0.2878166 0.4401168 0.2878166 0.1129334 0.1129334 0.08882677 0.1423074 0.08882677 0.1423074 0.4401168 0.2878166 0.4438413 0.25 0.4438413 0.25 0.08882677 0.1423074 0.07091385 0.1758201 0.07091385 0.1758201 0.4438413 0.25 0.4401167 0.2121834 0.4401167 0.2121834 0.05988317 0.2121833 0.07091385 0.1758201 0.05988317 0.2121833 0.4401167 0.2121834 0.429086 0.1758201 0.429086 0.1758201 0.05615854 0.25 0.05988317 0.2121833 0.05615854 0.25 0.429086 0.1758201 0.4111732 0.1423075 0.4111732 0.1423075 0.05988317 0.2878165 0.05615854 0.25 0.05988317 0.2878165 0.4111732 0.1423075 0.3870666 0.1129334 0.3870666 0.1129334 0.05988317 0.2878165 0.07091385 0.3241799 0.07091385 0.3241799 0.3870666 0.1129334 0.3576925 0.08882677 0.3576925 0.08882677 0.07091385 0.3241799 0.08882677 0.3576924 0.08882677 0.3576924 0.3576925 0.08882677 0.3241798 0.07091385 0.3241798 0.07091385 0.25 0.4438413 0.2878165 0.4401167 0.2878165 0.4401167 0.08882677 0.3576924 0.1129334 0.3870664 0.1129334 0.3870664 0.3241798 0.07091385 0.2878165 0.05988317 0.2878165 0.05988317 0.2878165 0.4401167 0.3241798 0.429086 0.3241798 0.429086 0.1129334 0.3870664 0.1423074 0.4111731 0.1423074 0.4111731 0.2878165 0.05988317 0.25 0.0561586 0.25 0.0561586 0.3241798 0.429086 0.3576925 0.4111732 0.3576925 0.4111732 0.1423074 0.4111731 0.1758201 0.4290859 0.1758201 0.4290859 1 1 0.96875 1 0.96875 0.5 0.96875 1 0.9375 1 0.9375 0.5 0.9375 1 0.90625 1 0.90625 0.5 0.90625 1 0.875 1 0.875 0.5 0.875 1 0.84375 1 0.84375 0.5 0.84375 1 0.8125 1 0.8125 0.5 0.8125 1 0.78125 1 0.78125 0.5 0.78125 1 0.75 1 0.75 0.5 0.75 1 0.71875 1 0.71875 0.5 0.71875 1 0.6875 1 0.6875 0.5 0.6875 1 0.65625 1 0.65625 0.5 0.65625 1 0.625 1 0.625 0.5 0.625 1 0.59375 1 0.59375 0.5 0.59375 1 0.5625 1 0.5625 0.5 0.5625 1 0.53125 1 0.53125 0.5 0.53125 1 0.5 1 0.5 0.5 0.5 1 0.46875 1 0.46875 0.5 0.46875 1 0.4375 1 0.4375 0.5 0.4375 1 0.40625 1 0.40625 0.5 0.40625 1 0.375 1 0.375 0.5 0.375 1 0.34375 1 0.34375 0.5 0.34375 1 0.3125 1 0.3125 0.5 0.3125 1 0.28125 1 0.28125 0.5 0.28125 1 0.25 1 0.25 0.5 0.25 1 0.21875 1 0.21875 0.5 0.21875 1 0.1875 1 0.1875 0.5 0.1875 1 0.15625 1 0.15625 0.5 0.15625 1 0.125 1 0.125 0.5 0.125 1 0.09375 1 0.09375 0.5 0.09375 1 0.0625 1 0.0625 0.5 0.25 0.0561586 0.25 0.0561586 0.2121834 0.05988317 0.0625 1 0.03125 1 0.03125 0.5 0.03125 1 0 1 0 0.5 0.7031784 0.4853885 0.75 0.49 0.7968217 0.4853885 0.7968217 0.4853885 0.841844 0.4717311 0.8833369 0.4495527 0.8833369 0.4495527 0.9197056 0.4197056 0.9495527 0.3833369 0.9495527 0.3833369 0.9717311 0.341844 0.9853885 0.2968217 0.9853885 0.2968217 0.99 0.25 0.9853885 0.2031783 0.9853885 0.2031783 0.9717311 0.1581559 0.9495527 0.1166631 0.9495527 0.1166631 0.9197056 0.08029437 0.8833369 0.05044728 0.8833369 0.05044728 0.841844 0.02826887 0.7968217 0.01461154 0.7968217 0.01461154 0.75 0.00999999 0.7031784 0.01461154 0.7031784 0.01461154 0.658156 0.02826887 0.6166632 0.05044728 0.6166632 0.05044728 0.5802944 0.08029437 0.5504473 0.1166631 0.5504473 0.1166631 0.5282689 0.1581559 0.5146116 0.2031783 0.5146116 0.2031783 0.51 0.25 0.5146116 0.2968217 0.5146116 0.2968217 0.5282689 0.341844 0.5504473 0.3833369 0.5504473 0.3833369 0.5802944 0.4197056 0.6166632 0.4495527 0.6166632 0.4495527 0.658156 0.4717311 0.7031784 0.4853885 0.7031784 0.4853885 0.7968217 0.4853885 0.9853885 0.2968217 0.7968217 0.4853885 0.8833369 0.4495527 0.9853885 0.2968217 0.8833369 0.4495527 0.9495527 0.3833369 0.9853885 0.2968217 0.9853885 0.2968217 0.9853885 0.2031783 0.7968217 0.01461154 0.9853885 0.2031783 0.9495527 0.1166631 0.7968217 0.01461154 0.9495527 0.1166631 0.8833369 0.05044728 0.7968217 0.01461154 0.7968217 0.01461154 0.7031784 0.01461154 0.5146116 0.2031783 0.7031784 0.01461154 0.6166632 0.05044728 0.5146116 0.2031783 0.6166632 0.05044728 0.5504473 0.1166631 0.5146116 0.2031783 0.5146116 0.2031783 0.5146116 0.2968217 0.7031784 0.4853885 0.5146116 0.2968217 0.5504473 0.3833369 0.7031784 0.4853885 0.5504473 0.3833369 0.6166632 0.4495527 0.7031784 0.4853885 0.7031784 0.4853885 0.9853885 0.2968217 0.7968217 0.01461154 0.25 0.4438413 0.2878165 0.4401167 0.2968217 0.4853885 0.3241798 0.429086 0.341844 0.4717311 0.2968217 0.4853885 0.3241798 0.429086 0.3576925 0.4111732 0.3833369 0.4495527 0.3576925 0.4111732 0.3870666 0.3870666 0.4197056 0.4197056 0.4111732 0.3576925 0.4495527 0.3833369 0.4197056 0.4197056 0.429086 0.3241798 0.4717311 0.341844 0.4495527 0.3833369 0.429086 0.3241798 0.4401168 0.2878166 0.4853885 0.2968217 0.4438413 0.25 0.49 0.25 0.4853885 0.2968217 0.4438413 0.25 0.4401167 0.2121834 0.4853885 0.2031783 0.429086 0.1758201 0.4717311 0.1581559 0.4853885 0.2031783 0.429086 0.1758201 0.4111732 0.1423075 0.4495527 0.1166631 0.4111732 0.1423075 0.3870666 0.1129334 0.4197056 0.08029437 0.3576925 0.08882677 0.3833369 0.05044728 0.4197056 0.08029437 0.3241798 0.07091385 0.341844 0.02826887 0.3833369 0.05044728 0.3241798 0.07091385 0.2878165 0.05988317 0.2968217 0.01461154 0.25 0.0561586 0.25 0.00999999 0.2968217 0.01461154 0.25 0.0561586 0.2121834 0.05988317 0.2031783 0.01461154 0.1758201 0.07091385 0.1581559 0.02826887 0.2031783 0.01461154 0.1758201 0.07091385 0.1423075 0.08882677 0.1166631 0.05044728 0.1423075 0.08882677 0.1129334 0.1129334 0.08029437 0.08029437 0.08882677 0.1423074 0.05044728 0.1166631 0.08029437 0.08029437 0.07091385 0.1758201 0.02826887 0.1581559 0.05044728 0.1166631 0.07091385 0.1758201 0.05988317 0.2121833 0.01461154 0.2031783 0.05615854 0.25 0.00999999 0.25 0.01461154 0.2031783 0.05615854 0.25 0.05988317 0.2878165 0.01461154 0.2968217 0.07091385 0.3241799 0.02826887 0.341844 0.01461154 0.2968217 0.07091385 0.3241799 0.08882677 0.3576924 0.05044728 0.3833369 0.08882677 0.3576924 0.1129334 0.3870664 0.08029437 0.4197056 0.1423074 0.4111731 0.1166631 0.4495527 0.08029437 0.4197056 0.1758201 0.4290859 0.1581559 0.4717311 0.1166631 0.4495527 0.1758201 0.4290859 0.2121833 0.4401167 0.2031783 0.4853885 0.25 0.4438413 0.25 0.49 0.2031783 0.4853885 0.3241798 0.429086 0.2878165 0.4401167 0.1758201 0.4290859 0.2878165 0.4401167 0.25 0.4438413 0.1758201 0.4290859 0.25 0.4438413 0.2121833 0.4401167 0.1758201 0.4290859 0.1758201 0.4290859 0.1423074 0.4111731 0.1129334 0.3870664 0.1129334 0.3870664 0.08882677 0.3576924 0.07091385 0.3241799 0.07091385 0.3241799 0.05988317 0.2878165 0.05615854 0.25 0.05615854 0.25 0.05988317 0.2121833 0.07091385 0.3241799 0.05988317 0.2121833 0.07091385 0.1758201 0.07091385 0.3241799 0.07091385 0.1758201 0.08882677 0.1423074 0.1129334 0.1129334 0.1129334 0.1129334 0.1423075 0.08882677 0.1758201 0.07091385 0.1758201 0.07091385 0.2121834 0.05988317 0.25 0.0561586 0.25 0.0561586 0.2878165 0.05988317 0.1758201 0.07091385 0.2878165 0.05988317 0.3241798 0.07091385 0.1758201 0.07091385 0.3241798 0.07091385 0.3576925 0.08882677 0.3870666 0.1129334 0.3870666 0.1129334 0.4111732 0.1423075 0.429086 0.1758201 0.429086 0.1758201 0.4401167 0.2121834 0.429086 0.3241798 0.4401167 0.2121834 0.4438413 0.25 0.429086 0.3241798 0.4438413 0.25 0.4401168 0.2878166 0.429086 0.3241798 0.429086 0.3241798 0.4111732 0.3576925 0.3870666 0.3870666 0.3870666 0.3870666 0.3576925 0.4111732 0.3241798 0.429086 0.1758201 0.4290859 0.1129334 0.3870664 0.3241798 0.429086 0.1129334 0.3870664 0.07091385 0.3241799 0.3241798 0.429086 0.07091385 0.1758201 0.1129334 0.1129334 0.07091385 0.3241799 0.1129334 0.1129334 0.1758201 0.07091385 0.07091385 0.3241799 0.3241798 0.07091385 0.3870666 0.1129334 0.429086 0.1758201 0.429086 0.3241798 0.3870666 0.3870666 0.429086 0.1758201 0.3870666 0.3870666 0.3241798 0.429086 0.429086 0.1758201 0.1758201 0.07091385 0.3241798 0.07091385 0.3241798 0.429086 0.3241798 0.07091385 0.429086 0.1758201 0.3241798 0.429086 0.3576925 0.4111732 0.3576925 0.4111732 0.3870666 0.3870666 0.1758201 0.4290859 0.1758201 0.4290859 0.2121833 0.4401167 0.2121834 0.05988317 0.2121834 0.05988317 0.1758201 0.07091385 0.3870666 0.3870666 0.3870666 0.3870666 0.4111732 0.3576925 0.2121833 0.4401167 0.2121833 0.4401167 0.25 0.4438413 0.1758201 0.07091385 0.1758201 0.07091385 0.1423075 0.08882677 0.4111732 0.3576925 0.4111732 0.3576925 0.429086 0.3241798 0.1423075 0.08882677 0.1423075 0.08882677 0.1129334 0.1129334 0.429086 0.3241798 0.429086 0.3241798 0.4401168 0.2878166 0.1129334 0.1129334 0.1129334 0.1129334 0.08882677 0.1423074 0.4401168 0.2878166 0.4401168 0.2878166 0.4438413 0.25 0.08882677 0.1423074 0.08882677 0.1423074 0.07091385 0.1758201 0.4438413 0.25 0.4438413 0.25 0.4401167 0.2121834 0.05988317 0.2121833 0.07091385 0.1758201 0.07091385 0.1758201 0.4401167 0.2121834 0.4401167 0.2121834 0.429086 0.1758201 0.05615854 0.25 0.05988317 0.2121833 0.05988317 0.2121833 0.429086 0.1758201 0.429086 0.1758201 0.4111732 0.1423075 0.05988317 0.2878165 0.05615854 0.25 0.05615854 0.25 0.4111732 0.1423075 0.4111732 0.1423075 0.3870666 0.1129334 0.05988317 0.2878165 0.05988317 0.2878165 0.07091385 0.3241799 0.3870666 0.1129334 0.3870666 0.1129334 0.3576925 0.08882677 0.07091385 0.3241799 0.07091385 0.3241799 0.08882677 0.3576924 0.3576925 0.08882677 0.3576925 0.08882677 0.3241798 0.07091385 0.25 0.4438413 0.25 0.4438413 0.2878165 0.4401167 0.08882677 0.3576924 0.08882677 0.3576924 0.1129334 0.3870664 0.3241798 0.07091385 0.3241798 0.07091385 0.2878165 0.05988317 0.2878165 0.4401167 0.2878165 0.4401167 0.3241798 0.429086 0.1129334 0.3870664 0.1129334 0.3870664 0.1423074 0.4111731 0.2878165 0.05988317 0.2878165 0.05988317 0.25 0.0561586 0.3241798 0.429086 0.3241798 0.429086 0.3576925 0.4111732 0.1423074 0.4111731 0.1423074 0.4111731 0.1758201 0.4290859
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 65 0 0 2 0 1 0 0 2 64 1 3 4 1 4 2 1 5 66 2 6 6 2 7 4 2 8 67 3 9 8 3 10 6 3 11 68 4 12 10 4 13 8 4 14 69 5 15 12 5 16 10 5 17 70 6 18 14 6 19 12 6 20 71 7 21 16 7 22 14 7 23 72 8 24 18 8 25 16 8 26 73 9 27 20 9 28 18 9 29 74 10 30 22 10 31 20 10 32 75 11 33 24 11 34 22 11 35 76 12 36 26 12 37 24 12 38 77 13 39 28 13 40 26 13 41 78 14 42 30 14 43 28 14 44 79 15 45 32 15 46 30 15 47 80 16 48 34 16 49 32 16 50 81 17 51 36 17 52 34 17 53 82 18 54 38 18 55 36 18 56 83 19 57 40 19 58 38 19 59 84 20 60 42 20 61 40 20 62 85 21 63 44 21 64 42 21 65 86 22 66 46 22 67 44 22 68 87 23 69 48 23 70 46 23 71 88 24 72 50 24 73 48 24 74 89 25 75 52 25 76 50 25 77 90 26 78 54 26 79 52 26 80 91 27 81 56 27 82 54 27 83 92 28 84 58 28 85 56 28 86 93 29 87 60 29 88 58 29 89 33 30 90 113 30 91 35 30 92 94 31 93 62 31 94 60 31 95 95 32 96 0 32 97 62 32 98 30 33 99 46 33 100 62 33 101 1 34 102 64 34 103 65 34 104 5 35 105 64 35 106 3 35 107 5 36 108 67 36 109 66 36 110 7 37 111 68 37 112 67 37 113 11 38 114 68 38 115 9 38 116 13 39 117 69 39 118 11 39 119 13 40 120 71 40 121 70 40 122 17 41 123 71 41 124 15 41 125 17 42 126 73 42 127 72 42 128 21 43 129 73 43 130 19 43 131 21 44 132 75 44 133 74 44 134 23 45 135 76 45 136 75 45 137 27 46 138 76 46 139 25 46 140 29 47 141 77 47 142 27 47 143 29 48 144 79 48 145 78 48 146 33 49 147 79 49 148 31 49 149 33 50 150 81 50 151 80 50 152 37 51 153 81 51 154 35 51 155 37 52 156 83 52 157 82 52 158 39 53 159 84 53 160 83 53 161 43 54 162 84 54 163 41 54 164 45 55 165 85 55 166 43 55 167 45 56 168 87 56 169 86 56 170 49 57 171 87 57 172 47 57 173 49 58 174 89 58 175 88 58 176 53 59 177 89 59 178 51 59 179 53 60 180 91 60 181 90 60 182 55 61 183 92 61 184 91 61 185 59 62 186 92 62 187 57 62 188 61 63 189 93 63 190 59 63 191 61 64 192 95 64 193 94 64 194 1 65 195 95 65 196 63 65 197 98 66 198 122 66 199 114 66 200 7 67 201 100 67 202 9 67 203 61 68 204 127 68 205 63 68 206 35 69 207 114 69 208 37 69 209 9 70 210 101 70 211 11 70 212 63 71 213 97 71 214 1 71 215 37 72 216 115 72 217 39 72 218 11 73 219 102 73 220 13 73 221 39 74 222 116 74 223 41 74 224 13 75 225 103 75 226 15 75 227 41 76 228 117 76 229 43 76 230 15 77 231 104 77 232 17 77 233 43 78 234 118 78 235 45 78 236 17 79 237 105 79 238 19 79 239 47 80 240 118 80 241 119 80 242 19 81 243 106 81 244 21 81 245 49 82 246 119 82 247 120 82 248 21 83 249 107 83 250 23 83 251 51 84 252 120 84 253 121 84 254 23 85 255 108 85 256 25 85 257 51 86 258 122 86 259 53 86 260 25 87 261 109 87 262 27 87 263 53 88 264 123 88 265 55 88 266 27 89 267 110 89 268 29 89 269 1 90 270 96 90 271 3 90 272 55 91 273 124 91 274 57 91 275 29 92 276 111 92 277 31 92 278 3 93 279 98 93 280 5 93 281 57 94 282 125 94 283 59 94 284 31 95 285 112 95 286 33 95 287 5 96 288 99 96 289 7 96 290 59 97 291 126 97 292 61 97 293 65 98 294 64 98 295 2 98 296 64 99 297 66 99 298 4 99 299 66 100 300 67 100 301 6 100 302 67 101 303 68 101 304 8 101 305 68 102 306 69 102 307 10 102 308 69 103 309 70 103 310 12 103 311 70 104 312 71 104 313 14 104 314 71 105 315 72 105 316 16 105 317 72 106 318 73 106 319 18 106 320 73 107 321 74 107 322 20 107 323 74 108 324 75 108 325 22 108 326 75 109 327 76 109 328 24 109 329 76 110 330 77 110 331 26 110 332 77 111 333 78 111 334 28 111 335 78 112 336 79 112 337 30 112 338 79 113 339 80 113 340 32 113 341 80 114 342 81 114 343 34 114 344 81 115 345 82 115 346 36 115 347 82 116 348 83 116 349 38 116 350 83 117 351 84 117 352 40 117 353 84 118 354 85 118 355 42 118 356 85 119 357 86 119 358 44 119 359 86 120 360 87 120 361 46 120 362 87 121 363 88 121 364 48 121 365 88 122 366 89 122 367 50 122 368 89 123 369 90 123 370 52 123 371 90 124 372 91 124 373 54 124 374 91 125 375 92 125 376 56 125 377 92 126 378 93 126 379 58 126 380 93 127 381 94 127 382 60 127 383 33 128 384 112 128 385 113 128 386 94 129 387 95 129 388 62 129 389 95 130 390 65 130 391 0 130 392 62 131 393 0 131 394 2 131 395 2 132 396 4 132 397 6 132 398 6 133 399 8 133 400 10 133 401 10 134 402 12 134 403 14 134 404 14 135 405 16 135 406 18 135 407 18 136 408 20 136 409 22 136 410 22 137 411 24 137 412 26 137 413 26 138 414 28 138 415 30 138 416 30 139 417 32 139 418 34 139 419 34 140 420 36 140 421 38 140 422 38 141 423 40 141 424 42 141 425 42 142 426 44 142 427 46 142 428 46 143 429 48 143 430 50 143 431 50 144 432 52 144 433 54 144 434 54 145 435 56 145 436 58 145 437 58 146 438 60 146 439 62 146 440 62 147 441 2 147 442 14 147 443 2 148 444 6 148 445 14 148 446 6 149 447 10 149 448 14 149 449 14 150 450 18 150 451 30 150 452 18 151 453 22 151 454 30 151 455 22 152 456 26 152 457 30 152 458 30 153 459 34 153 460 46 153 461 34 154 462 38 154 463 46 154 464 38 155 465 42 155 466 46 155 467 46 156 468 50 156 469 62 156 470 50 157 471 54 157 472 62 157 473 54 158 474 58 158 475 62 158 476 62 159 477 14 159 478 30 159 479 1 160 480 3 160 481 64 160 482 5 161 483 66 161 484 64 161 485 5 162 486 7 162 487 67 162 488 7 163 489 9 163 490 68 163 491 11 164 492 69 164 493 68 164 494 13 165 495 70 165 496 69 165 497 13 166 498 15 166 499 71 166 500 17 167 501 72 167 502 71 167 503 17 168 504 19 168 505 73 168 506 21 169 507 74 169 508 73 169 509 21 170 510 23 170 511 75 170 512 23 171 513 25 171 514 76 171 515 27 172 516 77 172 517 76 172 518 29 173 519 78 173 520 77 173 521 29 174 522 31 174 523 79 174 524 33 175 525 80 175 526 79 175 527 33 176 528 35 176 529 81 176 530 37 177 531 82 177 532 81 177 533 37 178 534 39 178 535 83 178 536 39 179 537 41 179 538 84 179 539 43 180 540 85 180 541 84 180 542 45 181 543 86 181 544 85 181 545 45 182 546 47 182 547 87 182 548 49 183 549 88 183 550 87 183 551 49 184 552 51 184 553 89 184 554 53 185 555 90 185 556 89 185 557 53 186 558 55 186 559 91 186 560 55 187 561 57 187 562 92 187 563 59 188 564 93 188 565 92 188 566 61 189 567 94 189 568 93 189 569 61 190 570 63 190 571 95 190 572 1 191 573 65 191 574 95 191 575 98 192 576 96 192 577 126 192 578 96 193 579 97 193 580 126 193 581 97 194 582 127 194 583 126 194 584 126 195 585 125 195 586 124 195 587 124 196 588 123 196 589 122 196 590 122 197 591 121 197 592 120 197 593 120 198 594 119 198 595 122 198 596 119 199 597 118 199 598 122 199 599 118 200 600 117 200 601 116 200 602 116 201 603 115 201 604 114 201 605 114 202 606 113 202 607 112 202 608 112 203 609 111 203 610 114 203 611 111 204 612 110 204 613 114 204 614 110 205 615 109 205 616 108 205 617 108 206 618 107 206 619 106 206 620 106 207 621 105 207 622 102 207 623 105 208 624 104 208 625 102 208 626 104 209 627 103 209 628 102 209 629 102 210 630 101 210 631 100 210 632 100 211 633 99 211 634 98 211 635 126 212 636 124 212 637 98 212 638 124 213 639 122 213 640 98 213 641 118 214 642 116 214 643 122 214 644 116 215 645 114 215 646 122 215 647 110 216 648 108 216 649 106 216 650 102 217 651 100 217 652 106 217 653 100 218 654 98 218 655 106 218 656 114 219 657 110 219 658 98 219 659 110 220 660 106 220 661 98 220 662 7 221 663 99 221 664 100 221 665 61 222 666 126 222 667 127 222 668 35 223 669 113 223 670 114 223 671 9 224 672 100 224 673 101 224 674 63 225 675 127 225 676 97 225 677 37 226 678 114 226 679 115 226 680 11 227 681 101 227 682 102 227 683 39 228 684 115 228 685 116 228 686 13 229 687 102 229 688 103 229 689 41 230 690 116 230 691 117 230 692 15 231 693 103 231 694 104 231 695 43 232 696 117 232 697 118 232 698 17 233 699 104 233 700 105 233 701 47 234 702 45 234 703 118 234 704 19 235 705 105 235 706 106 235 707 49 236 708 47 236 709 119 236 710 21 237 711 106 237 712 107 237 713 51 238 714 49 238 715 120 238 716 23 239 717 107 239 718 108 239 719 51 240 720 121 240 721 122 240 722 25 241 723 108 241 724 109 241 725 53 242 726 122 242 727 123 242 728 27 243 729 109 243 730 110 243 731 1 244 732 97 244 733 96 244 734 55 245 735 123 245 736 124 245 737 29 246 738 110 246 739 111 246 740 3 247 741 96 247 742 98 247 743 57 248 744 124 248 745 125 248 746 31 249 747 111 249 748 112 249 749 5 250 750 98 250 751 99 250 752 59 251 753 125 251 754 126 251 755
+
+
+
+
+
+ 123 66 198 111 66 200 127 66 199 127 192 576 99 192 578 96 192 577 96 193 579 99 193 581 97 193 580 97 194 582 99 194 584 98 194 583 99 195 585 103 195 587 100 195 586 100 196 588 103 196 590 101 196 589 101 197 591 103 197 593 102 197 592 103 198 594 107 198 596 104 198 595 104 199 597 107 199 599 105 199 598 105 200 600 107 200 602 106 200 601 107 201 603 111 201 605 108 201 604 108 202 606 111 202 608 109 202 607 109 203 609 111 203 611 110 203 610 111 204 612 115 204 614 112 204 613 112 205 615 115 205 617 113 205 616 113 206 618 115 206 620 114 206 619 115 207 621 119 207 623 116 207 622 116 208 624 119 208 626 117 208 625 117 209 627 119 209 629 118 209 628 119 210 630 123 210 632 120 210 631 120 211 633 123 211 635 121 211 634 121 212 636 123 212 638 122 212 637 123 213 639 127 213 641 124 213 640 124 214 642 127 214 644 125 214 643 125 215 645 127 215 647 126 215 646 127 216 648 103 216 650 99 216 649 103 217 651 127 217 653 107 217 652 107 218 654 127 218 656 111 218 655 111 219 657 119 219 659 115 219 658 119 220 660 111 220 662 123 220 661
+
+
+
+ -2.454000 -0.200000 0.535000 -2.454000 -0.200000 0.635000 -2.454000 0.200000 0.535000 -2.454000 0.200000 0.635000 -2.462000 -0.200000 0.535000 -2.462000 -0.200000 0.635000 -2.462000 0.200000 0.535000 -2.462000 0.200000 0.635000 1.0 0.0 0.0 -1.0 0.0 0.0 0.0 1.0 0.0 0.0 -1.0 0.0 0.0 0.0 1.0 0.0 0.0 -1.0 0 1 2 1 3 1 0 1 3 1 1 1 4 0 5 0 7 0 4 0 7 0 6 0 0 3 4 3 5 3 0 3 5 3 1 3 2 2 3 2 7 2 2 2 7 2 6 2 0 5 2 5 6 5 0 5 6 5 4 5 1 4 5 4 7 4 1 4 7 4 3 4
2.686000 -0.200000 0.535000 2.686000 -0.200000 0.635000 2.686000 0.200000 0.535000 2.686000 0.200000 0.635000 2.694000 -0.200000 0.535000 2.694000 -0.200000 0.635000 2.694000 0.200000 0.535000 2.694000 0.200000 0.635000 1.0 0.0 0.0 -1.0 0.0 0.0 0.0 1.0 0.0 0.0 -1.0 0.0 0.0 0.0 1.0 0.0 0.0 -1.0 0 1 2 1 3 1 0 1 3 1 1 1 4 0 5 0 7 0 4 0 7 0 6 0 0 3 4 3 5 3 0 3 5 3 1 3 2 2 3 2 7 2 2 2 7 2 6 2 0 5 2 5 6 5 0 5 6 5 4 5 1 4 5 4 7 4 1 4 7 4 3 4
-2.465000 -0.150400 0.547000 -2.465000 -0.142336 0.547000 -2.465000 -0.150400 0.623000 -2.465000 -0.142336 0.623000 -2.465000 -0.113664 0.547000 -2.465000 -0.105600 0.547000 -2.465000 -0.113664 0.623000 -2.465000 -0.105600 0.623000 -2.465000 -0.150400 0.578160 -2.465000 -0.105600 0.578160 -2.465000 -0.150400 0.591840 -2.465000 -0.105600 0.591840 -2.465000 -0.150400 0.609320 -2.465000 -0.105600 0.609320 -2.465000 -0.150400 0.623000 -2.465000 -0.105600 0.623000 -2.465000 -0.086400 0.547000 -2.465000 -0.078336 0.547000 -2.465000 -0.086400 0.623000 -2.465000 -0.078336 0.623000 -2.465000 -0.086400 0.547000 -2.465000 -0.041600 0.547000 -2.465000 -0.086400 0.560680 -2.465000 -0.041600 0.560680 -2.465000 -0.086400 0.609320 -2.465000 -0.041600 0.609320 -2.465000 -0.086400 0.623000 -2.465000 -0.041600 0.623000 -2.465000 -0.049664 0.560680 -2.465000 -0.041600 0.560680 -2.465000 -0.049664 0.609320 -2.465000 -0.041600 0.609320 -2.465000 -0.022400 0.547000 -2.465000 -0.014336 0.547000 -2.465000 -0.022400 0.623000 -2.465000 -0.014336 0.623000 -2.465000 0.014336 0.547000 -2.465000 0.022400 0.547000 -2.465000 0.014336 0.623000 -2.465000 0.022400 0.623000 -2.465000 -0.022400 0.547000 -2.465000 0.022400 0.547000 -2.465000 -0.022400 0.560680 -2.465000 0.022400 0.560680 -2.465000 -0.022400 0.609320 -2.465000 0.022400 0.609320 -2.465000 -0.022400 0.623000 -2.465000 0.022400 0.623000 -2.465000 0.041600 0.547000 -2.465000 0.049664 0.547000 -2.465000 0.041600 0.623000 -2.465000 0.049664 0.623000 -2.465000 0.041600 0.609320 -2.465000 0.086400 0.609320 -2.465000 0.041600 0.623000 -2.465000 0.086400 0.623000 -2.465000 0.041600 0.578160 -2.465000 0.086400 0.578160 -2.465000 0.041600 0.591840 -2.465000 0.086400 0.591840 -2.465000 0.078336 0.585000 -2.465000 0.086400 0.585000 -2.465000 0.078336 0.623000 -2.465000 0.086400 0.623000 -2.465000 0.049664 0.547000 -2.465000 0.086400 0.547000 -2.465000 0.049664 0.578160 -2.465000 0.086400 0.578160 -2.465000 0.105600 0.558400 -2.465000 0.113664 0.558400 -2.465000 0.105600 0.623000 -2.465000 0.113664 0.623000 -2.465000 0.142336 0.588800 -2.465000 0.150400 0.588800 -2.465000 0.142336 0.623000 -2.465000 0.150400 0.623000 -2.465000 0.105600 0.609320 -2.465000 0.150400 0.609320 -2.465000 0.105600 0.623000 -2.465000 0.150400 0.623000 -2.465000 0.105600 0.578160 -2.465000 0.150400 0.578160 -2.465000 0.105600 0.591840 -2.465000 0.150400 0.591840 -2.465000 0.105600 0.558400 -2.465000 0.150400 0.558400 -2.465000 0.105600 0.572080 -2.465000 0.150400 0.572080 -1.0 0.0 0.0 0 0 2 0 3 0 0 0 3 0 1 0 4 0 6 0 7 0 4 0 7 0 5 0 8 0 10 0 11 0 8 0 11 0 9 0 12 0 14 0 15 0 12 0 15 0 13 0 16 0 18 0 19 0 16 0 19 0 17 0 20 0 22 0 23 0 20 0 23 0 21 0 24 0 26 0 27 0 24 0 27 0 25 0 28 0 30 0 31 0 28 0 31 0 29 0 32 0 34 0 35 0 32 0 35 0 33 0 36 0 38 0 39 0 36 0 39 0 37 0 40 0 42 0 43 0 40 0 43 0 41 0 44 0 46 0 47 0 44 0 47 0 45 0 48 0 50 0 51 0 48 0 51 0 49 0 52 0 54 0 55 0 52 0 55 0 53 0 56 0 58 0 59 0 56 0 59 0 57 0 60 0 62 0 63 0 60 0 63 0 61 0 64 0 66 0 67 0 64 0 67 0 65 0 68 0 70 0 71 0 68 0 71 0 69 0 72 0 74 0 75 0 72 0 75 0 73 0 76 0 78 0 79 0 76 0 79 0 77 0 80 0 82 0 83 0 80 0 83 0 81 0 84 0 86 0 87 0 84 0 87 0 85 0
2.697000 -0.150400 0.547000 2.697000 -0.142336 0.547000 2.697000 -0.150400 0.623000 2.697000 -0.142336 0.623000 2.697000 -0.113664 0.547000 2.697000 -0.105600 0.547000 2.697000 -0.113664 0.623000 2.697000 -0.105600 0.623000 2.697000 -0.150400 0.578160 2.697000 -0.105600 0.578160 2.697000 -0.150400 0.591840 2.697000 -0.105600 0.591840 2.697000 -0.150400 0.609320 2.697000 -0.105600 0.609320 2.697000 -0.150400 0.623000 2.697000 -0.105600 0.623000 2.697000 -0.086400 0.547000 2.697000 -0.078336 0.547000 2.697000 -0.086400 0.623000 2.697000 -0.078336 0.623000 2.697000 -0.086400 0.547000 2.697000 -0.041600 0.547000 2.697000 -0.086400 0.560680 2.697000 -0.041600 0.560680 2.697000 -0.086400 0.609320 2.697000 -0.041600 0.609320 2.697000 -0.086400 0.623000 2.697000 -0.041600 0.623000 2.697000 -0.049664 0.560680 2.697000 -0.041600 0.560680 2.697000 -0.049664 0.609320 2.697000 -0.041600 0.609320 2.697000 -0.022400 0.547000 2.697000 -0.014336 0.547000 2.697000 -0.022400 0.623000 2.697000 -0.014336 0.623000 2.697000 0.014336 0.547000 2.697000 0.022400 0.547000 2.697000 0.014336 0.623000 2.697000 0.022400 0.623000 2.697000 -0.022400 0.547000 2.697000 0.022400 0.547000 2.697000 -0.022400 0.560680 2.697000 0.022400 0.560680 2.697000 -0.022400 0.609320 2.697000 0.022400 0.609320 2.697000 -0.022400 0.623000 2.697000 0.022400 0.623000 2.697000 0.041600 0.547000 2.697000 0.049664 0.547000 2.697000 0.041600 0.623000 2.697000 0.049664 0.623000 2.697000 0.041600 0.609320 2.697000 0.086400 0.609320 2.697000 0.041600 0.623000 2.697000 0.086400 0.623000 2.697000 0.041600 0.578160 2.697000 0.086400 0.578160 2.697000 0.041600 0.591840 2.697000 0.086400 0.591840 2.697000 0.078336 0.585000 2.697000 0.086400 0.585000 2.697000 0.078336 0.623000 2.697000 0.086400 0.623000 2.697000 0.049664 0.547000 2.697000 0.086400 0.547000 2.697000 0.049664 0.578160 2.697000 0.086400 0.578160 2.697000 0.105600 0.558400 2.697000 0.113664 0.558400 2.697000 0.105600 0.623000 2.697000 0.113664 0.623000 2.697000 0.142336 0.588800 2.697000 0.150400 0.588800 2.697000 0.142336 0.623000 2.697000 0.150400 0.623000 2.697000 0.105600 0.609320 2.697000 0.150400 0.609320 2.697000 0.105600 0.623000 2.697000 0.150400 0.623000 2.697000 0.105600 0.578160 2.697000 0.150400 0.578160 2.697000 0.105600 0.591840 2.697000 0.150400 0.591840 2.697000 0.105600 0.558400 2.697000 0.150400 0.558400 2.697000 0.105600 0.572080 2.697000 0.150400 0.572080 1.0 0.0 0.0 0 0 1 0 3 0 0 0 3 0 2 0 4 0 5 0 7 0 4 0 7 0 6 0 8 0 9 0 11 0 8 0 11 0 10 0 12 0 13 0 15 0 12 0 15 0 14 0 16 0 17 0 19 0 16 0 19 0 18 0 20 0 21 0 23 0 20 0 23 0 22 0 24 0 25 0 27 0 24 0 27 0 26 0 28 0 29 0 31 0 28 0 31 0 30 0 32 0 33 0 35 0 32 0 35 0 34 0 36 0 37 0 39 0 36 0 39 0 38 0 40 0 41 0 43 0 40 0 43 0 42 0 44 0 45 0 47 0 44 0 47 0 46 0 48 0 49 0 51 0 48 0 51 0 50 0 52 0 53 0 55 0 52 0 55 0 54 0 56 0 57 0 59 0 56 0 59 0 58 0 60 0 61 0 63 0 60 0 63 0 62 0 64 0 65 0 67 0 64 0 67 0 66 0 68 0 69 0 71 0 68 0 71 0 70 0 72 0 73 0 75 0 72 0 75 0 74 0 76 0 77 0 79 0 76 0 79 0 78 0 80 0 81 0 83 0 80 0 83 0 82 0 84 0 85 0 87 0 84 0 87 0 86 0
+
+
+
+ 0.02172455 0 0 -1.166776 0 0.02172455 0 0.57322 0 0 0.08783734 1.950202 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ 0.02172455 0 0 -1.449772 0 0.02172455 0 0.57322 0 0 0.08783734 1.950202 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ 0.02172455 0 0 0.105062 0 0.02172455 0 0.57322 0 0 0.08783734 1.950202 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ 0.02172455 0 0 -0.1779342 0 0.02172455 0 0.57322 0 0 0.08783734 1.950202 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ 0.02172455 0 0 -1.166776 0 0.02172455 0 -0.6700271 0 0 0.08783734 1.950202 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ 0.02172455 0 0 -1.449772 0 0.02172455 0 -0.6700271 0 0 0.08783734 1.950202 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ 0.02172455 0 0 0.105062 0 0.02172455 0 -0.6700271 0 0 0.08783734 1.950202 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ 0.02172455 0 0 -0.1779342 0 0.02172455 0 -0.6700271 0 0 0.08783734 1.950202 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ 0.02182549 -3.80666e-8 0.01115667 -2.151284 1.23153e-8 0.0685259 2.6108e-9 -0.03285916 0.003601452 -3.63531e-9 -0.0676116 2.122457 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -2.55817e-10 -0.0685259 4.81264e-10 0.08121943 0.02145236 -6.51134e-10 0.01671646 -0.5983985 0.005396188 -6.60044e-10 -0.0664557 2.156812 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 9.37713e-10 0.0685259 5.00942e-11 0.08121943 -0.02145236 2.82933e-9 -0.01671646 0.4787604 0.005396188 -6.60044e-10 -0.0664557 2.156812 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -0.02211413 0 -0.0016617 0.5180618 0 -0.0685259 0 0.5650164 5.36408e-4 0 -0.06850576 1.959475 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -0.02185166 0 -0.01065379 0.5180618 0 -0.0685259 0 -0.07673676 0.003439117 0 -0.06769266 2.126803 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.08007087 0 0 0.6549737 0 0.08007087 0 0.5817391 0 0 0.08007087 2.140224 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.08007087 0 0 0.6549737 0 0.08007087 0 -0.6557658 0 0 0.08007087 2.140224 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.08007087 0 0 -2.227457 0 0.08007087 0 -0.6557658 0 0 0.08007087 2.140224 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -8.54548e-9 -0.02498876 0 0.6701933 0.1954978 -1.09229e-9 0 0.3900639 0 0 0.02498876 2.031909 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ -0.02635354 0 0 -2.388408 0 0.4176945 0 -0.04151662 0 0 0.09571526 0.5681789 0 0 0 1
+
+
+
+ 1 -8.11391e-7 8.84221e-7 0.7849233 1.12852e-6 0.3851632 -0.9228485 -0.9403976 4.08222e-7 0.9228485 0.3851632 0.6336932 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ -1 7.77719e-7 -8.03543e-7 0.7849233 -1.0411e-6 -0.3851632 0.9228485 0.8529088 4.08222e-7 0.9228485 0.3851632 0.6336932 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ -4.37114e-8 -0.9863821 -0.1644698 2.342098 1 -4.42992e-8 -9.3797e-11 0.1174752 -7.19337e-9 -0.1644698 0.9863821 1.199938 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ 0.8036218 0 0 0 0 0.8036218 0 -0.03834184 0 0 0.8036218 1.185294 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.3401778 0 0 1.681154 0 -1.48696e-8 -0.1513907 0.8261697 0 0.3401778 -6.6175e-9 0.4219238 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.3401778 0 0 -1.486193 0 -1.48696e-8 -0.1513907 0.8261697 0 0.3401778 -6.6175e-9 0.4219238 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.3401778 0 0 1.681154 0 -1.48696e-8 -0.1513907 -0.8574947 0 0.3401778 -6.6175e-9 0.4219238 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+
+ 0.3401778 0 0 -1.486193 0 -1.48696e-8 -0.1513907 -0.8574947 0 0.3401778 -6.6175e-9 0.4219238 0 0 0 1
+
+
+
+
+
+
+
+
+
+
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
+
+
+
+
+
\ No newline at end of file
diff --git a/documentation/landing_page/img/favicon.ico b/documentation/landing_page/img/favicon.ico
new file mode 100644
index 00000000..3c3c895b
Binary files /dev/null and b/documentation/landing_page/img/favicon.ico differ
diff --git a/documentation/landing_page/img/logo.png b/documentation/landing_page/img/logo.png
new file mode 100644
index 00000000..e363ae5f
Binary files /dev/null and b/documentation/landing_page/img/logo.png differ
diff --git a/documentation/landing_page/img/plate.png b/documentation/landing_page/img/plate.png
new file mode 100644
index 00000000..a587da62
Binary files /dev/null and b/documentation/landing_page/img/plate.png differ
diff --git a/documentation/landing_page/img/scenario_run.png b/documentation/landing_page/img/scenario_run.png
new file mode 100644
index 00000000..dedb0f46
Binary files /dev/null and b/documentation/landing_page/img/scenario_run.png differ
diff --git a/documentation/landing_page/index.html b/documentation/landing_page/index.html
new file mode 100644
index 00000000..9638c7aa
--- /dev/null
+++ b/documentation/landing_page/index.html
@@ -0,0 +1,214 @@
+
+
+
+
+
+ Automated Driving Open Research (ADORe)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Scenario Execution
+
+
+ ADORe executes complex driving scenarios in real time. The planner computes
+ safe, comfortable trajectories while reacting to dynamic road geometry,
+ lane markings, and surrounding traffic.
+
+
+ The blue corridor shows the planned drivable area. Yellow lane markers define
+ the ego lane boundaries. The vehicle follows the optimal trajectory while
+ respecting all constraints derived from the road network and traffic rules.
+
+
+ Scenarios can be driven in simulation via
+ CARLA
+ or SUMO ,
+ or deployed directly onto physical research vehicles.
+
+
+
+
+
+
+
Quick Start
+
+
If you use Ubuntu 20.04, 22.04 or 24.04 and have curl installed, simply run:
+
+
Or run an unattended/headless install:
+
+
+ To develop ADORe, follow the build instructions in the
+ Technical Reference Manual .
+
+
+
+
+
+
Getting Started
+
+
+ Learn about ADORe by visiting our
+ Technical Reference Manual .
+
+
Is the documentation missing something? Let us know!
+
+ Stuck? Reach out on
+ Github --
+ we are eager to help.
+
+
+
+
+
+
Contribute
+
+
+
+ ADORe is proudly open source. Sponsor features by sending a
+ pull request .
+ We would love to know how you are using ADORe -- reach out on
+ Github .
+
+
+
+ Found a bug? Submit an
+ issue or
+ provide a fix via
+ pull request
+ and earn some open source street cred.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/documentation/landing_page/js/adore.js b/documentation/landing_page/js/adore.js
new file mode 100644
index 00000000..fb87dbb1
--- /dev/null
+++ b/documentation/landing_page/js/adore.js
@@ -0,0 +1,13 @@
+new ClipboardJS('.btn');
+
+$(document).ready(function () {
+ $('[data-toggle="tooltip"]').tooltip({ show: null });
+});
+
+function show(shown) {
+ ['about', 'scenario', 'quickstart', 'documentation', 'contribute', 'sponsors', 'contact'].forEach(function (id) {
+ document.getElementById(id).style.display = 'none';
+ });
+ document.getElementById(shown).style.display = shown === 'about' || shown === 'scenario' ? 'flex' : 'block';
+ return false;
+}
diff --git a/documentation/landing_page/js/car_viewer.js b/documentation/landing_page/js/car_viewer.js
new file mode 100644
index 00000000..953da348
--- /dev/null
+++ b/documentation/landing_page/js/car_viewer.js
@@ -0,0 +1,283 @@
+(function () {
+ const wrap = document.getElementById('car-canvas-wrap');
+ const loadingEl = document.getElementById('car-loading');
+ if (!wrap) return;
+
+ const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: false });
+ renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
+ renderer.setSize(wrap.clientWidth, wrap.clientHeight);
+ renderer.outputEncoding = THREE.sRGBEncoding;
+ renderer.shadowMap.enabled = true;
+ renderer.shadowMap.type = THREE.PCFSoftShadowMap;
+ renderer.setClearColor(0x0f1318, 1);
+ wrap.appendChild(renderer.domElement);
+
+ const scene = new THREE.Scene();
+
+ const camera = new THREE.PerspectiveCamera(38, wrap.clientWidth / wrap.clientHeight, 0.1, 200);
+ camera.position.set(-4.5, 2.4, 4.2);
+ camera.lookAt(0, 0.6, 0);
+
+ // ── Sky gradient background ───────────────────────────────────────
+ // Rendered as a fullscreen quad behind everything
+ const skyScene = new THREE.Scene();
+ const skyCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
+
+ const skyGeo = new THREE.PlaneGeometry(2, 2);
+ const skyMat = new THREE.ShaderMaterial({
+ depthWrite: false,
+ uniforms: {
+ uTop: { value: new THREE.Color(0x1a6fc4) },
+ uBottom: { value: new THREE.Color(0x7ec8e3) },
+ },
+ vertexShader: `
+ varying vec2 vUv;
+ void main() { vUv = uv; gl_Position = vec4(position, 1.0); }
+ `,
+ fragmentShader: `
+ uniform vec3 uTop;
+ uniform vec3 uBottom;
+ varying vec2 vUv;
+ void main() { gl_FragColor = vec4(mix(uBottom, uTop, vUv.y), 1.0); }
+ `,
+ });
+ skyScene.add(new THREE.Mesh(skyGeo, skyMat));
+
+ // ── Sun (billboard sprite) ────────────────────────────────────────
+ const sunCanvas = document.createElement('canvas');
+ sunCanvas.width = sunCanvas.height = 128;
+ const sc = sunCanvas.getContext('2d');
+
+ // Outer glow
+ const glow = sc.createRadialGradient(64, 64, 18, 64, 64, 64);
+ glow.addColorStop(0, 'rgba(255,240,100,0.55)');
+ glow.addColorStop(0.5, 'rgba(255,210,60,0.15)');
+ glow.addColorStop(1, 'rgba(255,200,0,0)');
+ sc.fillStyle = glow;
+ sc.fillRect(0, 0, 128, 128);
+
+ // Sun disc
+ const disc = sc.createRadialGradient(64, 64, 0, 64, 64, 22);
+ disc.addColorStop(0, '#fff9c4');
+ disc.addColorStop(0.6, '#ffe033');
+ disc.addColorStop(1, '#ffb300');
+ sc.beginPath();
+ sc.arc(64, 64, 22, 0, Math.PI * 2);
+ sc.fillStyle = disc;
+ sc.fill();
+
+ // Cartoon rays
+ sc.strokeStyle = '#ffe066';
+ sc.lineWidth = 2.5;
+ sc.lineCap = 'round';
+ for (let i = 0; i < 12; i++) {
+ const angle = (i / 12) * Math.PI * 2;
+ const r0 = 26, r1 = 36 + (i % 3 === 0 ? 8 : 0);
+ sc.beginPath();
+ sc.moveTo(64 + Math.cos(angle) * r0, 64 + Math.sin(angle) * r0);
+ sc.lineTo(64 + Math.cos(angle) * r1, 64 + Math.sin(angle) * r1);
+ sc.stroke();
+ }
+
+ const sunTex = new THREE.CanvasTexture(sunCanvas);
+ const sunSprite = new THREE.Sprite(new THREE.SpriteMaterial({
+ map: sunTex, transparent: true, depthWrite: false, depthTest: false
+ }));
+ sunSprite.scale.set(4.5, 4.5, 1);
+ sunSprite.position.set(18, 14, -60);
+ scene.add(sunSprite);
+
+ // ── Lighting ──────────────────────────────────────────────────────
+ scene.add(new THREE.AmbientLight(0xcce8ff, 0.7));
+
+ const sun = new THREE.DirectionalLight(0xfff5d0, 1.4);
+ sun.position.set(5, 12, 6);
+ sun.castShadow = true;
+ sun.shadow.mapSize.set(1024, 1024);
+ sun.shadow.camera.near = 1;
+ sun.shadow.camera.far = 30;
+ sun.shadow.camera.left = sun.shadow.camera.bottom = -6;
+ sun.shadow.camera.right = sun.shadow.camera.top = 6;
+ sun.shadow.bias = -0.001;
+ scene.add(sun);
+
+ const fill = new THREE.DirectionalLight(0x4DB6AC, 0.18);
+ fill.position.set(-4, 2, -3);
+ scene.add(fill);
+
+ // ── Road ─────────────────────────────────────────────────────────
+ const ROAD_W = 8;
+ const ROAD_L = 40;
+ const LANE_W = ROAD_W / 2;
+ const DASH_SPACING = 2.4;
+ const DASH_LEN = 1.2;
+ const NUM_DASHES = Math.ceil(ROAD_L / DASH_SPACING) + 2;
+
+ const tarmac = new THREE.Mesh(
+ new THREE.PlaneGeometry(ROAD_W, ROAD_L),
+ new THREE.MeshStandardMaterial({ color: 0x252830, roughness: 0.94 })
+ );
+ tarmac.rotation.x = -Math.PI / 2;
+ tarmac.receiveShadow = true;
+ scene.add(tarmac);
+
+ [-1, 1].forEach(side => {
+ const sh = new THREE.Mesh(
+ new THREE.PlaneGeometry(3.5, ROAD_L),
+ new THREE.MeshStandardMaterial({ color: 0x353840, roughness: 0.97 })
+ );
+ sh.rotation.x = -Math.PI / 2;
+ sh.position.x = side * (ROAD_W / 2 + 1.75);
+ sh.receiveShadow = true;
+ scene.add(sh);
+ });
+
+ const edgeMat = new THREE.MeshStandardMaterial({ color: 0xe0ddd0, roughness: 0.55 });
+ [-1, 1].forEach(side => {
+ const edge = new THREE.Mesh(new THREE.PlaneGeometry(0.12, ROAD_L), edgeMat);
+ edge.rotation.x = -Math.PI / 2;
+ edge.position.set(side * (ROAD_W / 2 - 0.08), 0.003, 0);
+ scene.add(edge);
+ });
+
+ // Animated dash group
+ const dashGroup = new THREE.Group();
+ scene.add(dashGroup);
+ const dashGeo = new THREE.PlaneGeometry(0.11, DASH_LEN);
+ dashGeo.rotateX(-Math.PI / 2);
+ const dashMatYellow = new THREE.MeshStandardMaterial({ color: 0xd4b400, roughness: 0.5, metalness: 0.08 });
+
+ for (let i = 0; i < NUM_DASHES; i++) {
+ const m = new THREE.Mesh(dashGeo, dashMatYellow);
+ m.position.set(0, 0.003, (i - NUM_DASHES / 2) * DASH_SPACING);
+ dashGroup.add(m);
+ }
+
+ // ── Materials ─────────────────────────────────────────────────────
+ const matBlack = new THREE.MeshStandardMaterial({ color: 0x141618, metalness: 0.5, roughness: 0.5 });
+ const matWhite = new THREE.MeshStandardMaterial({ color: 0xddeae8, metalness: 0.2, roughness: 0.28 });
+ const matGreen = new THREE.MeshStandardMaterial({ color: 0x4caf50, metalness: 0.05, roughness: 0.5 });
+ const matWindow = new THREE.MeshStandardMaterial({ color: 0x1b3848, metalness: 0.15, roughness: 0.08, transparent: true, opacity: 0.80, depthWrite: false });
+ const matSticker= new THREE.MeshStandardMaterial({ color: 0xf2f0ee, metalness: 0.0, roughness: 0.6 });
+
+ const matMap = {
+ 'BLACK-material': matBlack,
+ 'WHITE-material': matWhite,
+ 'Green-material': matGreen,
+ 'Window-material': matWindow,
+ 'sticker_white-material': matSticker,
+ };
+
+ function pickMat(m) {
+ if (!m) return matBlack;
+ if (matMap[m.name]) return matMap[m.name];
+ const n = m.name.toLowerCase();
+ if (n.includes('window')) return matWindow;
+ if (n.includes('green')) return matGreen;
+ if (n.includes('sticker')) return matSticker;
+ if (n.includes('white')) return matWhite;
+ return matBlack;
+ }
+
+ // ── Load model ────────────────────────────────────────────────────
+ let carGroup = null;
+ let userYaw = 0;
+
+ const loader = new THREE.ColladaLoader();
+ loader.load('img/car_model.dae', function (collada) {
+ carGroup = new THREE.Group();
+ const model = collada.scene;
+
+ const box = new THREE.Box3().setFromObject(model);
+ const center = box.getCenter(new THREE.Vector3());
+ const size = box.getSize(new THREE.Vector3());
+ const scale = 2.4 / Math.max(size.x, size.y, size.z);
+
+ model.position.sub(center);
+ model.scale.setScalar(scale);
+
+ model.traverse(function (child) {
+ if (!child.isMesh) return;
+ child.castShadow = true;
+ child.receiveShadow = false;
+ const mats = Array.isArray(child.material) ? child.material : [child.material];
+ child.material = mats.length === 1 ? pickMat(mats[0]) : mats.map(pickMat);
+ });
+
+ carGroup.add(model);
+ scene.add(carGroup);
+
+ // Sit on road
+ const b2 = new THREE.Box3().setFromObject(carGroup);
+ carGroup.position.y = -b2.min.y;
+
+ // Right lane
+ carGroup.position.x = LANE_W / 2;
+
+ // Face forward (PI) then -90 deg
+ carGroup.rotation.y = Math.PI / 2;
+
+
+
+ if (loadingEl) loadingEl.style.display = 'none';
+
+ }, undefined, function (err) {
+ if (loadingEl) loadingEl.textContent = 'Model unavailable';
+ console.warn('ColladaLoader:', err);
+ });
+
+ // ── Drag to orbit camera ──────────────────────────────────────────
+ const BASE_ANGLE = Math.PI * 0.7;
+ const CAM_R = 6.5, CAM_H = 2.4;
+
+ function updateCamera() {
+ const cx = carGroup ? carGroup.position.x : LANE_W / 2;
+ camera.position.set(
+ Math.sin(BASE_ANGLE + userYaw) * CAM_R + cx,
+ CAM_H,
+ Math.cos(BASE_ANGLE + userYaw) * CAM_R
+ );
+ camera.lookAt(cx, 0.6, 0);
+ }
+
+ let dragging = false, px = 0;
+ wrap.addEventListener('mousedown', e => { dragging = true; px = e.clientX; });
+ window.addEventListener('mousemove', e => {
+ if (!dragging) return;
+ userYaw += (e.clientX - px) * 0.011;
+ px = e.clientX;
+ updateCamera();
+ });
+ window.addEventListener('mouseup', () => { dragging = false; });
+
+ wrap.addEventListener('touchstart', e => { px = e.touches[0].clientX; }, { passive: true });
+ wrap.addEventListener('touchmove', e => {
+ userYaw += (e.touches[0].clientX - px) * 0.013;
+ px = e.touches[0].clientX;
+ updateCamera();
+ }, { passive: true });
+
+ window.addEventListener('resize', () => {
+ const w = wrap.clientWidth, h = wrap.clientHeight;
+ renderer.setSize(w, h);
+ camera.aspect = w / h;
+ camera.updateProjectionMatrix();
+ });
+
+ // ── Render loop ───────────────────────────────────────────────────
+ const ROAD_SPEED = 0.035;
+ let dashOffset = 0;
+
+ renderer.autoClear = false;
+ (function animate() {
+ requestAnimationFrame(animate);
+
+ dashOffset = (dashOffset + ROAD_SPEED) % DASH_SPACING;
+ dashGroup.position.z = dashOffset;
+
+ renderer.clear();
+ renderer.render(skyScene, skyCamera);
+ renderer.clearDepth();
+ renderer.render(scene, camera);
+ })();
+})();
diff --git a/documentation/links.md.template b/documentation/links.md.template
new file mode 100644
index 00000000..9707985f
--- /dev/null
+++ b/documentation/links.md.template
@@ -0,0 +1,8 @@
+### Links
+- [System Requirements](getting_started/system_requirements.md)
+- [Installation and getting started](getting_started/getting_started.md)
+- [Technical Reference Manual]()
+- [Troubleshooting](problems_and_solutions.md)
+- [How to contribute](CONTRIBUTING.md)
+
+
diff --git a/documentation/mkdocs/Dockerfile.mkdocs b/documentation/mkdocs/Dockerfile.mkdocs
new file mode 100644
index 00000000..48c12b69
--- /dev/null
+++ b/documentation/mkdocs/Dockerfile.mkdocs
@@ -0,0 +1,8 @@
+FROM python:3.9.10-slim
+
+RUN python -m pip install mkdocs --upgrade
+
+RUN python -m pip install mkdocs-material mkdocs-pdf-export-plugin weasyprint --upgrade
+
+USER nobody
+CMD cd /tmp/docs && mkdocs build
diff --git a/documentation/mkdocs/gen_docs.py b/documentation/mkdocs/gen_docs.py
deleted file mode 100755
index 83f191ab..00000000
--- a/documentation/mkdocs/gen_docs.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env python3
-import shutil
-from pathlib import Path
-
-# This file lives in documentation/mkdocs/
-MKDOCS_DIR = Path(__file__).resolve().parent
-DOCS_DIR = MKDOCS_DIR / "docs"
-GENERATED_DIR = DOCS_DIR / "generated"
-
-# Repo root = documentation/.. (one level up from documentation/)
-REPO_ROOT = MKDOCS_DIR.parent.parent
-
-# Canonical top-level index
-SOURCE_INDEX = MKDOCS_DIR.parent / "index.md" # documentation/index.md
-DEST_INDEX = DOCS_DIR / "index.md" # mkdocs/docs/index.md
-
-# Where to scan for README.md docs
-SEARCH_ROOTS = [
- REPO_ROOT # whole repo
-]
-
-IGNORE_DIR_NAMES = {
- ".git",
- ".github",
- ".gitlab",
- ".idea",
- ".vscode",
- "__pycache__",
- ".pytest_cache",
- "build",
- "install",
- "log",
- "documentation",
- ".docker",
- ".venv",
-}
-
-
-def should_skip(path: Path) -> bool:
- """Return True if this path is inside a directory we want to ignore."""
- return any(part in IGNORE_DIR_NAMES for part in path.parts)
-
-
-def main() -> None:
- # Ensure docs directory exists (Makefile usually does this, but be robust)
- DOCS_DIR.mkdir(parents=True, exist_ok=True)
-
- # Copy canonical index into mkdocs/docs/index.md if it exists
- if SOURCE_INDEX.exists():
- DEST_INDEX.parent.mkdir(parents=True, exist_ok=True)
- shutil.copy2(SOURCE_INDEX, DEST_INDEX)
- print(f"Copied {SOURCE_INDEX} -> {DEST_INDEX}")
- else:
- print(f"Warning: {SOURCE_INDEX} not found, skipping index.md copy")
-
- # Clean generated area but leave manually-written docs alone
- if GENERATED_DIR.exists():
- shutil.rmtree(GENERATED_DIR)
- GENERATED_DIR.mkdir(parents=True, exist_ok=True)
-
- # Collect README.md files into docs/generated/...
- for root in SEARCH_ROOTS:
- if not root.exists():
- continue
-
- for readme in root.rglob("README.md"):
- if should_skip(readme):
- continue
-
- # Compute path relative to repo root
- rel = readme.relative_to(REPO_ROOT)
- # Put it under docs/generated/... preserving structure
- out_path = GENERATED_DIR / rel
- out_path.parent.mkdir(parents=True, exist_ok=True)
- shutil.copy2(readme, out_path)
- print(f"Copied {readme} -> {out_path}")
-
-
-if __name__ == "__main__":
- main()
diff --git a/documentation/mkdocs/generate_mkdocs.py b/documentation/mkdocs/generate_mkdocs.py
new file mode 100644
index 00000000..81a0949e
--- /dev/null
+++ b/documentation/mkdocs/generate_mkdocs.py
@@ -0,0 +1,21 @@
+import os
+import yaml
+
+def generate_nav_config(directory):
+ nav_config = []
+ for filename in os.listdir(directory):
+ if filename.endswith(".md"):
+ file_path = os.path.join(directory, filename)
+ nav_config.append(filename[:-3] + ": " + file_path)
+ return nav_config
+
+docs_directory = "docs"
+nav_config = generate_nav_config(docs_directory)
+
+config = {
+ "site_name": "ADORe Documentation",
+ "nav": nav_config,
+}
+
+with open("mkdocs.yml", "w") as config_file:
+ yaml.dump(config, config_file)
diff --git a/documentation/mkdocs/mkdocs.yaml b/documentation/mkdocs/mkdocs.yaml
index d25f44dc..73c94945 100644
--- a/documentation/mkdocs/mkdocs.yaml
+++ b/documentation/mkdocs/mkdocs.yaml
@@ -1,146 +1,72 @@
-site_name: ADORe
+site_name: ADORe Documentation
repo_url: https://github.com/eclipse-adore/adore
-
nav:
- - Home: index.md
- - Overview:
- - About: technical_reference_manual/about_adore.md
- - Contact: technical_reference_manual/contact.md
-
- - Getting started:
- - Getting started guide: technical_reference_manual/getting_started/getting_started.md
- - System requirements: technical_reference_manual/getting_started/system_requirements.md
- - Prerequisites: technical_reference_manual/getting_started/prerequisites.md
- - Installing Docker: technical_reference_manual/getting_started/installing_docker.md
- - Run your first scenario: technical_reference_manual/getting_started/running_your_first_scenario.md
-
- - Code reference:
- - Overview: generated/README.md
- - Scenarios:
- - ADORe scenarios: generated/adore_scenarios/README.md
-
- - Libraries:
- - adore_controllers: generated/adore_libraries/adore_controllers/README.md
- - adore_dynamics: generated/adore_libraries/adore_dynamics/README.md
- - adore_map: generated/adore_libraries/adore_map/README.md
- - adore_math: generated/adore_libraries/adore_math/README.md
- - adore_planning: generated/adore_libraries/adore_planning/README.md
-
- - Nodes:
- - decision_maker: generated/adore_ros2_nodes/decision_maker/README.md
- - decision_maker_infrastructure: generated/adore_ros2_nodes/decision_maker_infrastructure/README.md
- - mission_control: generated/adore_ros2_nodes/mission_control/README.md
- - simulated_remote_operator: generated/adore_ros2_nodes/simulated_remote_operator/README.md
- - simulated_vehicle: generated/adore_ros2_nodes/simulated_vehicle/README.md
- - trajectory_tracker: generated/adore_ros2_nodes/trajectory_tracker/README.md
- - visualizer: generated/adore_ros2_nodes/visualizer/README.md
-
- - Interfaces:
- - CARLA bridge: generated/adore_interfaces/carla_bridge/README.md
- - SUMO bridge: generated/adore_interfaces/sumo_bridge/README.md
-
- - Conversions:
- - adore_dynamics_conversions: generated/adore_ros2_conversions/adore_dynamics_conversions/README.md
- - adore_map_conversions: generated/adore_ros2_conversions/adore_map_conversions/README.md
- - adore_math_conversions: generated/adore_ros2_conversions/adore_math_conversions/README.md
-
- - ROS 2 messages:
- - adore_ros2_msgs: generated/ros2_messages/adore_ros2_msgs/README.md
-
- - Tools:
- - ADORe API: generated/tools/adore_api/README.md
- - ROS 2 observer: generated/tools/ros2_observer/README.md
- - ADORe model checker: generated/tools/adore_model_checker/README.md
-
- - System & development:
- - ADORe CLI: technical_reference_manual/system_and_development/adore_cli.md
- - Anonymous cloning: technical_reference_manual/system_and_development/anonymous_cloning.md
- - Creating a ROS2 node: technical_reference_manual/system_and_development/creating_a_new_node.md
- - Documentation system: technical_reference_manual/system_and_development/documentation_generation_system.md
- - Scenario generation: technical_reference_manual/system_and_development/scenario_generation.md
- - System Tests: technical_reference_manual/system_and_development/system_tests.md
- - Unit Tests: technical_reference_manual/system_and_development/unit_testing.md
-
- - Licensing & legal:
- - Licensing overview: technical_reference_manual/licensing.md
- - Software license: technical_reference_manual/software_license.md
- - License check: technical_reference_manual/licensing/license_check.md
- - License header templates:
- - Template (Markdown): technical_reference_manual/licensing/license_header_template.md
- - Template (C header): technical_reference_manual/licensing/license_header_template.h
- - Template (Text): technical_reference_manual/licensing/license_header_template.txt
- - Template (XML): technical_reference_manual/licensing/license_header_template.xml
-
-
+ - About ADORe: README.md
+ - Getting Started:
+ - Getting Started: getting_started/getting_started.md
+ - System Requirements: getting_started/system_requirements.md
+ - Anonymous Cloning: system_and_development/anonymous_cloning.md
+ - Prerequisites: getting_started/prerequisites.md
+ - Installing Docker: getting_started/installing_docker.md
+ - Running Your First Scenario In ADORe: getting_started/running_your_first_scenario.md
+ - Technical Reference Manual:
+ - Table of Contents: technical_reference_manual.md
+ - Documentation: system_and_development/documentation.md
+ - Configuring ADORe: generated/configuring_adore/configuring_adore.md
+ - ADORe Embedded: adore_embedded.md
+ - ADORe ROS Nodes: generated/ROS_NODES_SUMMARY.md
+ - ADORe ROS Messages: generated/modules/adore_ros2_msgs/README.md
+ - ADORe ROS Topics: generated/adore_ros2_msgs/topics.md
+ - ADORe Mission Control Dashboard & REST API:
+ - About The ADORe REST API: generated/api/adore_api/README.md
+ - ADORe Mission Control Web Interface: generated/api/adore_api/adore_mission_control.md
+ - ADORE API Reference: generated/api/adore_api/api_reference.md
+ - ADORE API Examples: generated/api/adore_api/api_reference_curl_examples.md
+ - Creating A New Node: system_and_development/creating_a_new_node.md
+ - Running A Scenario In ADORe: getting_started/running_your_first_scenario.md
+ - Scenario Visualization: generated/visualization/lichtblick/README.md
+ - Scenario Model Checking:
+ - Scenario Model Checking Quick Start: generated/adore_model_checker/model_checking_quick_start.md
+ - Scenario Model Checking API Quick Start: generated/adore_model_checker/model_checking_api_quick_start.md
+ - Scenario Model Checking README: generated/adore_model_checker/README.md
+ - Scenario Model Checking With The ADORe Mission Control: system_and_development/model_checking_with_the_adore_mission_control.md
+ - ADORe And CARLa: generated/carla_bridge/README.md
+ - ADORe And SUMO: system_and_development/sumo_bridge.md
+ - Creating A New Scenario: system_and_development/scenario_generation.md
+ - ADORe CLI:
+ - ADORe CLI: generated/adore_cli/README.md
+ - Multi-arch Build Support: system_and_development/multiarch_support.md
+ - Testing:
+ - System Testing: system_and_development/system_tests.md
+ - ROS Unit Testing: system_and_development/ros_unit_testing.md
+ - C++ Library Testing: system_and_development/library_testing.md
+ - Submodules: generated/modules/modules.md
+ - Troubleshooting: problems_and_solutions.md
+ - Licensing: licensing.md
+ - Third-Party: generated/THIRD-PARTY.md
+ - Notices: generated/NOTICE.md
+ - Publicaitons: publications.md
+ - Contributing: generated/CONTRIBUTING.md
+ - Code of Conduct: generated/CODE_OF_CONDUCT.md
+ - Style Guide: styleguide.md
+ - Contact: contact.md
extra:
github_issues: "https://github.com/eclipse-adore/adore/issues"
- social:
- - icon: fontawesome/brands/github
- link: https://github.com/eclipse-adore/adore
- - icon: material/web
- link: https://www.eclipse.org/adore/ # if you have a landing page
-
-extra_css:
- - stylesheets/extra.css
theme:
- name: material
- custom_dir: overrides
- logo: img/adore_logo_white.png
- favicon: img/DLR_Logo.svg
- font:
- text: Atkinson Hyperlegible Next
- code: Anonymous Pro
-
- # Light/dark toggle with subtle colours (tweak as you like)
+ name: material
palette:
- - scheme: default
- primary: blue grey
- accent: teal
- toggle:
- icon: material/weather-night
- name: Switch to dark mode
- - scheme: slate
- primary: blue grey
- accent: teal
- toggle:
- icon: material/weather-sunny
- name: Switch to light mode
-
+ scheme: slate
+ logo: ../img/logo.png
+ favicon: ../img/favicon.ico
features:
- - navigation.instant
- - navigation.tracking
- - navigation.top
- - navigation.sections
- - navigation.tabs
- - toc.integrate
- content.code.copy
- - content.tabs.link
- - content.action.view # “View source” link
- - search.suggest # search suggestions
- - search.highlight # highlight matches in search results
- - search.share # shareable search URLs
-
-# Nice markdown extras powered by pymdown-extensions
-markdown_extensions:
- - admonition
- - attr_list
- - def_list
- - footnotes
- - md_in_html
- - toc:
- permalink: true
-
- - pymdownx.highlight:
- anchor_linenums: true
- linenums: true
- - pymdownx.inlinehilite
- - pymdownx.details
- - pymdownx.superfences
- - pymdownx.tabbed:
- alternate_style: true
+ footer:
+ links:
+ - title: "Help"
+ url: "https://github.com/eclipse-adore/adore/issues"
plugins:
- search
- - redirects
+ # - pdf-export
diff --git a/documentation/mkdocs/overrides/main.html b/documentation/mkdocs/overrides/main.html
deleted file mode 100644
index 63913c18..00000000
--- a/documentation/mkdocs/overrides/main.html
+++ /dev/null
@@ -1 +0,0 @@
-{% extends "base.html" %}
\ No newline at end of file
diff --git a/documentation/mkdocs/stylesheets/extra.css b/documentation/mkdocs/stylesheets/extra.css
deleted file mode 100644
index f427484f..00000000
--- a/documentation/mkdocs/stylesheets/extra.css
+++ /dev/null
@@ -1,184 +0,0 @@
-/* === Index page specific styles - only when a .hero-section exists === */
-
-/* Hide sidebars on landing page */
-body:has(.hero-section) .md-sidebar,
-body:has(.hero-section) .md-sidebar--primary,
-body:has(.hero-section) .md-sidebar--secondary {
- display: none !important;
-}
-
-/* Make the whole content stack full-width and remove padding/margins */
-body:has(.hero-section) .md-container,
-body:has(.hero-section) .md-main,
-body:has(.hero-section) .md-main__inner,
-body:has(.hero-section) .md-content,
-body:has(.hero-section) .md-content__inner,
-body:has(.hero-section) .md-typeset {
- max-width: 100% !important;
- margin: 0 !important;
- padding: 0 !important;
-}
-
-/* Remove Material's top spacer bar that creates a gap above content */
-body:has(.hero-section) .md-content__inner::before,
-body:has(.hero-section) .md-content__inner::after {
- content: none !important;
- display: none !important;
- height: 0 !important;
-}
-
-/* Hide the markdown H1 on the landing page (hero acts as title) */
-body:has(.hero-section) .md-content h1:first-of-type {
- display: none !important;
-}
-
-/* Hide only "View source of this page" on the landing page */
-body:has(.hero-section)
- a.md-content__button[title="View source of this page"],
-body:has(.hero-section)
- a.md-content__button[aria-label="View source of this page"] {
- display: none !important;
-}
-
-/* Hide the site_name text in the header, keep nav + buttons */
-/* If you only want this on the landing page, wrap it with body:has(.hero-section) */
-.md-header__title .md-header__topic:first-child {
- display: none !important;
-}
-
-/* === Hero section === */
-.hero-section {
- position: relative;
- display: flex;
- align-items: center;
- justify-content: center;
- text-align: center;
-
- /* Fill viewport; if header overlap occurs, use calc(100vh - var(--md-toolbar-height)) */
- min-height: calc(90vh);
-
- margin: 0;
- padding: 4rem 1.5rem;
-
- color: #fff;
- background: linear-gradient(
- 180deg,
- var(--md-primary-fg-color),
- var(--md-accent-fg-color)
- );
-}
-
-/* If you don't use these visually, you can keep them invisible */
-.hero-background,
-.hero-overlay {
- display: none;
-}
-
-.hero-content {
- max-width: 52rem;
-}
-
-/* Center logo in hero */
-.hero-logo-container {
- display: flex;
- justify-content: center;
- align-items: center;
- margin-bottom: 1.5rem;
-}
-
-.hero-logo-container img {
- max-width: 320px;
- height: auto;
-}
-
-/* Theme-aware logo swap: default = light, slate = dark */
-.logo-light {
- display: block;
-}
-
-.logo-dark {
- display: none;
-}
-
-[data-md-color-scheme="slate"] .logo-light {
- display: none;
-}
-
-[data-md-color-scheme="slate"] .logo-dark {
- display: block;
-}
-
-.hero-description {
- margin: 0 auto 2rem;
- font-size: 1.2rem;
- line-height: 1.7;
-}
-
-/* Hero buttons */
-.hero-buttons {
- display: flex;
- flex-wrap: wrap;
- gap: 0.75rem;
- justify-content: center;
-}
-
-.hero-button {
- display: inline-block;
- padding: 0.8rem 1.7rem;
- border-radius: 999px;
- font-weight: 600;
- font-size: 0.95rem;
- letter-spacing: 0.04em;
- text-transform: uppercase;
- text-decoration: none;
- transition:
- transform 0.15s ease,
- box-shadow 0.15s ease,
- background-color 0.15s ease,
- color 0.15s ease;
-}
-
-.hero-button-primary {
- background-color: var(--md-accent-fg-color);
- color: #fff !important;
- box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
-}
-
-.hero-button-primary:hover {
- transform: translateY(-2px);
- box-shadow: 0 6px 16px rgba(0, 0, 0, 0.35);
-}
-
-.hero-button-secondary {
- background-color: transparent;
- color: #fff !important;
- border: 2px solid rgba(255, 255, 255, 0.7);
-}
-
-.hero-button-secondary:hover {
- background-color: rgba(255, 255, 255, 0.12);
-}
-
-/* Simple responsive tweak */
-@media screen and (max-width: 768px) {
- .hero-section {
- padding: 3rem 1.2rem;
- }
-
- .hero-description {
- font-size: 1.05rem;
- }
-
- .hero-buttons {
- flex-direction: column;
- }
-
- .hero-button {
- width: 100%;
- max-width: 260px;
- }
-
- .hero-logo-container img {
- max-width: 260px;
- }
-}
diff --git a/documentation/modules.md b/documentation/modules.md
new file mode 100644
index 00000000..7e28c1f2
--- /dev/null
+++ b/documentation/modules.md
@@ -0,0 +1,11 @@
+## Module Quick Reference
+This section contains an auto-generated aggregation of all README.md files for
+every submoduled within ADORe.
+
+---
+> **⚠️ WARNING:**
+> The following README.md aggregation could be outdated and likely to have many
+> broken links. This is intended to only be a quick reference. Please always
+> follow the individual submodules URLs for the most up-to-date documentation.
+---
+
diff --git a/documentation/populate_module_readme_docs.sh b/documentation/populate_module_readme_docs.sh
new file mode 100644
index 00000000..03324e91
--- /dev/null
+++ b/documentation/populate_module_readme_docs.sh
@@ -0,0 +1,79 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+#set -euxo pipefail #debug mode
+#
+echoerr (){ printf "%s" "$@" >&2;}
+exiterr (){ printf "%s\n" "$@" >&2; exit 1;}
+
+SCRIPT_DIRECTORY="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
+
+SUBMODULES_PATH="$(realpath "${SCRIPT_DIRECTORY}/..")"
+
+EXCLUDES="documentation external/ros-bridge tools/lichtblick/lichtblick"
+
+DOCS_DIR="${SCRIPT_DIRECTORY}/technical_reference_manual"
+MODULE_TEMPLATE_MD_FILE="${SCRIPT_DIRECTORY}/modules.md"
+MODULE_DOCS_DIR="${DOCS_DIR}/generated/modules"
+
+mkdir -p "${MODULE_DOCS_DIR}"
+
+rm -rf "${MODULE_DOCS_DIR}"
+
+echo "SUBMODULES_PATH: ${SUBMODULES_PATH}"
+
+module_readme_files="$(find "${SUBMODULES_PATH}" -type f -name README.md | sort)"
+
+for exclude in $EXCLUDES; do
+ module_readme_files="$(echo "${module_readme_files}" | grep -v "${exclude}")"
+done
+
+
+#echo "${module_readme_files}"
+module_md=$(< "${MODULE_TEMPLATE_MD_FILE}")
+url=
+last_module=""
+for module_readme_file in $module_readme_files; do
+ if [[ ! -s "$module_readme_file" ]]; then
+ continue
+ fi
+
+ #cp "${module_readme_file}" "${MODULE_DOC_DIR}"
+ module_readme_absolute_path=$(dirname "${module_readme_file}")
+ cd "${module_readme_absolute_path}"
+ module_absolute_path="$(git rev-parse --show-toplevel)"
+ remote="$(git config --get remote.origin.url)"
+ url=$(echo ${remote/git@github.com:/https:\/\/github.com\/} | sed 's/\.git$//')
+ module="$(basename -s .git "$remote")"
+ echo " module_readme_file: '${module_readme_file}'"
+ module_readme_relative_path="${module_readme_file/$module_absolute_path/}"
+ module_readme_relative_path=""${module_readme_relative_path/\//}""
+ module_readme_relative_path="${module_readme_relative_path/README.md/}"
+ module_readme_relative_path="${module_readme_relative_path%/}"
+ module_readme_relative_path="${module_readme_relative_path%/}"
+ module_readme_relative_path="${module}/${module_readme_relative_path}"
+ module_readme_relative_path="${module_readme_relative_path%/}"
+ echo " module_readme_relative_path: '${module_readme_relative_path}'"
+
+ module_readme_markdown_link="[${module_readme_relative_path}/README.md 🔗](modules/${module_readme_relative_path}/README.md)"
+ mkdir -p "${MODULE_DOCS_DIR}/${module_readme_relative_path}"
+ cp "${module_readme_file}" "${MODULE_DOCS_DIR}/${module_readme_relative_path}/"
+ #printf "module: ${module} remote: ${remote}\n"
+ if [ "$last_module" != "$module" ]; then
+ last_module=$module
+ echo "module: ${module}"
+ echo " remote: ${remote}"
+ echo " url: ${url}"
+ module_md+=$(printf "\n\n### Module: **%s**\n\n" "${module}")
+ module_md+=$(printf "\n\n**git remote**: ${remote}\n\n")
+ module_md+=$(printf "\n\n**url**: [%s 🔗](%s)\n\n" "${url}" "${url}")
+ #module_md+=$(printf "\n\n#### %s README Links\n\n" "${module}")
+ fi
+ echo " module_readme_relative_path: ${module_readme_relative_path}"
+ echo " module_readme_absolute_path: ${module_readme_absolute_path}"
+ echo " module_readme_file: ${module_readme_file}"
+ echo " module_readme_markdown_link: ${module_readme_markdown_link}"
+ module_md+=$(printf "\n\n%s\n\n" "${module_readme_markdown_link}")
+done
+
+echo -n "${module_md}" > "${MODULE_DOCS_DIR}/modules.md"
diff --git a/documentation/populate_ros_node_summary_docs.sh b/documentation/populate_ros_node_summary_docs.sh
new file mode 100644
index 00000000..c14a4e80
--- /dev/null
+++ b/documentation/populate_ros_node_summary_docs.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+BASE_DIR="../ros2_workspace/src"
+SUMMARY_README="technical_reference_manual/generated/ROS_NODES_SUMMARY.md"
+mkdir -p "technical_reference_manual/generated"
+
+
+echo "# ROS Nodes Summary" > "$SUMMARY_README"
+echo "This document summarizes all of the ROS nodes in ADORe, always review each README.md for the complete documentation for a given node." >> "$SUMMARY_README"
+echo "all ROS nodes are located in \`ros2_workspace/src\`" >> "$SUMMARY_README"
+echo "" >> "$SUMMARY_README"
+
+extract_summary() {
+ local readme="$1"
+ local summary=""
+
+ if [[ -f "$readme" && -s "$readme" ]]; then
+ summary=$(awk '
+ /^#/ && found_first {exit}
+ /^#/ && !found_first {found_first=1}
+ {content = content $0 "\n"}
+ END {
+ gsub(/\n+$/, "", content)
+ gsub(/\n/, " ", content)
+ gsub(/[[:space:]]+/, " ", content)
+ gsub(/^[[:space:]]*/, "", content)
+ print content
+ }
+ ' "$readme")
+ fi
+
+ echo "$summary"
+}
+
+find "$BASE_DIR" -type f -iname "README.md" | while read -r readme; do
+ node_dir=$(dirname "$readme")
+ pkg_xml="$node_dir/package.xml"
+
+ if [[ -f "$pkg_xml" ]]; then
+ package_name=$(grep -oPm1 "(?<=)[^<]+" "$pkg_xml")
+ node_name=$(basename "$node_dir")
+ relative_path=$(realpath --relative-to="$BASE_DIR" "$node_dir")
+ summary=$(extract_summary "$readme")
+
+ echo "## Package: $package_name" >> "$SUMMARY_README"
+ echo "- Node: $node_name" >> "$SUMMARY_README"
+ echo "- Location: $relative_path" >> "$SUMMARY_README"
+ if [[ -n "$summary" ]]; then
+ echo "- Summary: $summary" >> "$SUMMARY_README"
+ fi
+ echo "" >> "$SUMMARY_README"
+ fi
+done
+
+echo "Summary generated in $SUMMARY_README"
diff --git a/documentation/publish.env b/documentation/publish.env
index 6d28da4c..7fe69dec 100644
--- a/documentation/publish.env
+++ b/documentation/publish.env
@@ -8,8 +8,8 @@ PROHIBITED_REMOTES="git@github.com:eclipse/adore.git https://github.com/eclipse/
## The remote where the documentation will be published
## The default unless otherwise specified will be the "origin" remote
-PUBLISH_REMOTE=git@github.com:eclipse-adore/adore
-#PUBLISH_REMOTE=${PUBLISH_REMOTE:-$(git config --get remote.origin.url)}
+#PUBLISH_REMOTE=git@github.com:eclipse-adore/adore
+PUBLISH_REMOTE=${PUBLISH_REMOTE:-$(git config --get remote.origin.url)}
## The documentation will be generated from the "DOCUMENTATION_SOURCE_BRANCH"
DOCUMENTATION_SOURCE_BRANCH=develop
@@ -20,8 +20,8 @@ PUBLISH_BRANCH=gh-pages
## Directory where documentation will be published in the gh-pages branch
## Use "docs" for GitHub Pages docs/ folder publishing
## Use "." for root directory publishing
-# PUBLISH_DIRECTORY=docs
-PUBLISH_DIRECTORY=.
+PUBLISH_DIRECTORY=docs
+#PUBLISH_DIRECTORY=.
## PUBLISH_COMMIT_MESSAGE is the commit message that will be used to commit the documentation to the PUBLISH_BRANCH
PUBLISH_COMMIT_MESSAGE="Publication of docs v1"
diff --git a/documentation/publish_gh-pages.sh b/documentation/publish_gh-pages.sh
old mode 100755
new mode 100644
index 0b5ebba9..b0a87cb6
--- a/documentation/publish_gh-pages.sh
+++ b/documentation/publish_gh-pages.sh
@@ -1,29 +1,17 @@
#!/usr/bin/env bash
-set -euo pipefail
-
-# Determine script directory for robust sourcing and path finding
-SCRIPT_DIRECTORY="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
-
-# Load configuration
-if [ -f "${SCRIPT_DIRECTORY}/publish.env" ]; then
- source "${SCRIPT_DIRECTORY}/publish.env"
-else
- echo "Error: publish.env not found in ${SCRIPT_DIRECTORY}"
- exit 1
-fi
+#set -euo pipefail
exiterr (){ printf "$@\n"; exit 1;}
-CLONE_DIRECTORY=""
+trap cleanup EXIT
+
+source publish.env
function cleanup {
- if [ -d "${CLONE_DIRECTORY}" ]; then
- rm -rf "${CLONE_DIRECTORY}"
- echo "Deleted temp working directory ${CLONE_DIRECTORY}"
- fi
+ #rm -rf "${CLONE_DIRECTORY}"
+ echo "Deleted temp working directory ${CLONE_DIRECTORY}"
}
-trap cleanup EXIT
check_params() {
echo "Please verify the following parameters:"
@@ -45,19 +33,8 @@ check_params() {
check_params
-DOCS_SOURCE_DIRECTORY="${SCRIPT_DIRECTORY}/docs"
-
-# Verify pre-built documentation exists
-if [ ! -d "${DOCS_SOURCE_DIRECTORY}" ]; then
- exiterr "Error: Documentation directory '${DOCS_SOURCE_DIRECTORY}' not found.\nPlease run 'just docs' or 'just docs_all' to build the documentation before publishing."
-fi
-
-# The build process puts the site in documentation/docs/mkdocs.
-# We want to publish the contents of that folder directly to the publish directory so the URL is clean.
-if [ -d "${DOCS_SOURCE_DIRECTORY}/mkdocs" ]; then
- echo "Found 'mkdocs' subdirectory in docs. Using it as source."
- DOCS_SOURCE_DIRECTORY="${DOCS_SOURCE_DIRECTORY}/mkdocs"
-fi
+SCRIPT_DIRECTORY="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
+DOCS_DIRECTORY="${SCRIPT_DIRECTORY}/docs"
printf "Creating temporary workspace directory...\n"
CLONE_DIRECTORY="$(mktemp -d)"
@@ -69,46 +46,38 @@ if [[ $PROHIBITED_REMOTES == *"$git_url"* ]]; then
fi
read -p "Should the remote publish branch: ${PUBLISH_BRANCH} be deleted? (y/n): " answer
-if [[ $answer == [Yy]* ]]; then
- echo "Deleting remote branch ${PUBLISH_BRANCH}..."
- git push "${PUBLISH_REMOTE}" --delete "${PUBLISH_BRANCH}" || true
+if ! [[ $answer == [Yy] ]]; then
+ git push ${PUBLISH_REMOTE} --delete "${PUBLISH_BRANCH}"
+ git branch -d "${PUBLISH_BRANCH}"
fi
+cd "${CLONE_DIRECTORY}"
printf "Cloning adore to: ${CLONE_DIRECTORY}/adore\n"
-# Clone depth 1 to save bandwidth, we only need to push back to it
-git clone --depth 1 "${git_url}" "${CLONE_DIRECTORY}/adore"
-
-cd "${CLONE_DIRECTORY}/adore"
+git clone --depth 1 --single-branch -b "${DOCUMENTATION_SOURCE_BRANCH}" "${git_url}"
-echo "Preparing branch ${PUBLISH_BRANCH}..."
-# Create orphan branch to start fresh each time (state of the art for gh-pages usually involves history, but this script seems to favor fresh state)
-# If we wanted to keep history, we would fetch origin/$PUBLISH_BRANCH and checkout.
-# Using orphan as it aligns with the 'start from scratch' / 'cleaning' approach of the original script.
+cd ${CLONE_DIRECTORY}/adore
git checkout --orphan "${PUBLISH_BRANCH}"
-git rm -rf . > /dev/null 2>&1
-
-# Prepare target directory
-if [[ "${PUBLISH_DIRECTORY}" == "." ]]; then
- echo "Copying documentation to root..."
- cp -r "${DOCS_SOURCE_DIRECTORY}/"* .
-else
- echo "Copying documentation to ${PUBLISH_DIRECTORY}..."
- mkdir -p "${PUBLISH_DIRECTORY}"
- cp -r "${DOCS_SOURCE_DIRECTORY}/"* "${PUBLISH_DIRECTORY}/"
-fi
-# Add .nojekyll to ensure folders starting with _ are not ignored
-touch .nojekyll
+{
+cd ${CLONE_DIRECTORY}/adore/documentation
+make build
+}
-git add .
+cd ${CLONE_DIRECTORY}/adore
+git reset
+pwd
git status
-if git diff --staged --quiet; then
- echo "No changes to commit."
+if [[ "${PUBLISH_DIRECTORY}" == "." ]]; then
+ cp -r ${CLONE_DIRECTORY}/adore/documentation/docs/* .
+ git add . --force
else
- git commit -m "${PUBLISH_COMMIT_MESSAGE}"
- echo "Pushing to ${PUBLISH_REMOTE} branch ${PUBLISH_BRANCH}..."
- git push --force origin "${PUBLISH_BRANCH}"
+ mv ${CLONE_DIRECTORY}/adore/documentation/docs "${PUBLISH_DIRECTORY}"
+ git add "${PUBLISH_DIRECTORY}" --force
fi
-echo "Documentation published successfully."
+git commit -am "${PUBLISH_COMMIT_MESSAGE}"
+
+git remote add publish "${PUBLISH_REMOTE}"
+git push --force --set-upstream publish "${PUBLISH_BRANCH}" | true
+git push publish "${PUBLISH_BRANCH}"
diff --git a/documentation/sphinx/.gitignore b/documentation/sphinx/.gitignore
new file mode 100644
index 00000000..9b28930b
--- /dev/null
+++ b/documentation/sphinx/.gitignore
@@ -0,0 +1,2 @@
+build
+source/api
\ No newline at end of file
diff --git a/documentation/sphinx/Makefile b/documentation/sphinx/Makefile
new file mode 100644
index 00000000..d0c3cbf1
--- /dev/null
+++ b/documentation/sphinx/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = source
+BUILDDIR = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/documentation/sphinx/requirements.pip3 b/documentation/sphinx/requirements.pip3
new file mode 100644
index 00000000..71440551
--- /dev/null
+++ b/documentation/sphinx/requirements.pip3
@@ -0,0 +1,2 @@
+breathe
+exhale
diff --git a/documentation/sphinx/source/conf.py b/documentation/sphinx/source/conf.py
new file mode 100644
index 00000000..005fcfa4
--- /dev/null
+++ b/documentation/sphinx/source/conf.py
@@ -0,0 +1,91 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'ADORe'
+copyright = '2022, Daniel Hess, Reza Dariani, Jan Lauermann, Matthias Nichting, Thomas Lobig, Andrew Koerner, Giovanni Lucente, Eric Neidhardt'
+author = 'Daniel Hess, Reza Dariani, Jan Lauermann, Matthias Nichting, Thomas Lobig, Andrew Koerner, Giovanni Lucente, Eric Neidhardt'
+
+# The full version, including alpha/beta/rc tags
+release = 'latest'
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ 'breathe',
+ 'exhale',
+]
+
+# -- Exhale configuration ---------------------------------------------------
+# Setup the breathe extension
+breathe_projects = {
+ "ADORe": "./../../doxygen/gen_docs/xml"
+}
+breathe_default_project = "ADORe"
+
+ # Setup the exhale extension
+exhale_args = {
+ # These arguments are required
+ "containmentFolder": "./api",
+ "rootFileName": "library_root.rst",
+ "rootFileTitle": "ADORe API",
+ "doxygenStripFromPath": "..",
+ # Suggested optional arguments
+ "createTreeView": True,
+ # TIP: if using the sphinx-bootstrap-theme, you need
+ # "treeViewIsBootstrap": True,
+}
+
+# Tell sphinx what the primary language being documented is.
+primary_domain = 'cpp'
+
+# Tell sphinx what the pygments highlight language should be.
+highlight_language = 'cpp'
+
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = 'en'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = []
+
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'alabaster'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
\ No newline at end of file
diff --git a/documentation/sphinx/source/index.rst b/documentation/sphinx/source/index.rst
new file mode 100644
index 00000000..473dd43e
--- /dev/null
+++ b/documentation/sphinx/source/index.rst
@@ -0,0 +1,20 @@
+.. ADORe documentation master file, created by
+ sphinx-quickstart on Fri Jul 8 12:37:03 2022.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Welcome to ADORe's documentation!
+=================================
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Contents:
+
+ api/library_root
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/documentation/technical_reference_manual/about_adore.md b/documentation/technical_reference_manual/about_adore.md
deleted file mode 100644
index 0f390d6f..00000000
--- a/documentation/technical_reference_manual/about_adore.md
+++ /dev/null
@@ -1,125 +0,0 @@
-# About ADORe
-
-ADORe (Automated Driving Open Research) is an open-source software framework for **testing and developing automated driving** – on real vehicles, in simulation, and in combination with intelligent road infrastructure. It is developed mainly at the German Aerospace Center (DLR), but is explicitly intended for **everyone** to use, extend, and embed in their own projects.
-
-At its core, ADORe is not a “finished” self-driving product. Instead, it is a **research and experimentation platform**:
-
-- A set of **modular libraries** for automated driving (planning, control, multi-agent coordination, interfaces, etc.).
-- A **system-level framework** that connects vehicles, simulations, and infrastructure.
-- An environment to **try out new ideas**, compare strategies, and run experiments under realistic conditions.
-
----
-
-## What problems ADORe tries to solve
-
-Modern automated driving isn’t just about making one clever car. It’s about how many vehicles and the surrounding infrastructure **work together as a system**:
-
-- Vehicles need to drive safely and comfortably on their own.
-- They should also be able to **cooperate** with other vehicles and roadside units.
-- Researchers need a way to evaluate algorithms at this **system level**, not just as isolated components.
-
-ADORe is built to support exactly this kind of work:
-
-- **Single-vehicle autonomy** – local planning and control on the vehicle itself.
-- **Multi-agent / infrastructure-supported automation** – coordination via V2X (vehicle-to-everything) communication, infrastructure assistance, and backend services.
-- **End-to-end experiments** – from high-level mission goals down to trajectory tracking and feedback.
-
----
-
-## Key ideas
-
-### 1. Modular building blocks, not a monolith
-
-ADORe is organised as a set of **ROS 2–based components** that can be combined and swapped:
-
-- Core libraries for geometry, motion planning and trajectory tracking.
-- Nodes for single-vehicle automation (SAAD).
-- Nodes and services for multi-agent / infrastructure-based automation (MAAD).
-- Interfaces towards sensors, vehicles, simulators, and backends.
-
-You can:
-
-- Use individual libraries inside your own stack.
-- Replace ADORe components with your own, as long as you respect the interfaces.
-- Embed ADORe modules into existing projects without adopting everything.
-
-The idea is that you can **start small** (e.g. just use a planning or control component) and grow into more of the framework over time.
-
----
-
-### 2. Designed for both vehicles and infrastructure
-
-ADORe is built around the assumption that automation will often be **shared between vehicle and infrastructure**, rather than living only inside the car:
-
-- On-board stack for local autonomy on research vehicles.
-- Infrastructure-side components that monitor traffic, compute cooperative plans, or assist vehicles via V2X.
-- Back-end middleware to connect ADORe to project-specific cloud or edge services.
-
-This makes it possible to run experiments such as:
-
-- Infrastructure-guided trajectories in complex intersections.
-- Cooperative manoeuvres between several vehicles.
-- Remote-supported operation and supervision.
-
----
-
-### 3. Works in simulation and on real vehicles
-
-ADORe is meant to be **portable across environments**:
-
-- Integration with traffic and vehicle simulators (e.g. SUMO, CARLA and related tools) for large-scale or repeatable tests.
-- Deployment on DLR’s research vehicles with real sensors and actuators.
-- Containerised setups so that the same software can run in CI, on dev machines, and on cars with minimal change.
-
-This allows workflows like:
-
-1. Prototype an idea purely in simulation.
-2. Move the same ADORe components to a vehicle, keeping interfaces and behaviour consistent.
-3. Use infrastructure-side ADORe instances to coordinate both simulated and real traffic participants in mixed scenarios.
-
----
-
-## Who ADORe is for
-
-Although ADORe is developed at DLR, it is meant for a **wider community**:
-
-- **Research groups** working on planning, control, cooperative driving, V2X, traffic management, remote operation, or safety concepts.
-- **Industry teams** who need a flexible, inspectable framework for experiments or prototyping.
-- **Students and hobbyists** who want to explore automated driving beyond single-vehicle demos.
-
-The software is open source, and the goal is to make it possible to:
-
-- Reproduce and extend research results.
-- Plug in your own algorithms (planners, controllers, decision-makers).
-- Integrate ADORe into larger toolchains or platforms.
-
----
-
-## What ADORe is *not*
-
-To set expectations clearly:
-
-- ADORe is **not** a ready-to-deploy commercial driverless system.
-- It **does not target full SAE Level 4+ product deployments**, but rather research, prototyping, and demonstrations.
-- It assumes expert users who are comfortable working with ROS 2, Docker, and modern C++/Python.
-
-Safety, validation, and certification for production systems remain the responsibility of whoever uses the framework.
-
----
-
-## Typical ways people use ADORe
-
-Here are a few common patterns:
-
-- **Use it as a full stack** on a research vehicle or in simulation, and tune or swap selected modules.
-- **Embed individual libraries** (e.g. motion planning, trajectory tracking) inside your own ROS 2 system.
-- **Connect your infrastructure** (traffic controllers, roadside units, digital twins) to ADORe’s multi-agent layer and run cooperative experiments.
-- **Prototype new ideas** (e.g. new decision logic, cooperative strategies, remote support concepts), while reusing all the “boring but necessary” parts like map handling, routing, and interfaces.
-
----
-
-## Learn more
-
-If you want to dive deeper into the architecture and research background behind ADORe, see the VEHITS 2025 paper *“ADORe: Unified Modular Framework for Vehicle and Infrastructure-Based System Level Automation”* included in this repository.
-
-For the practical side (how to build, run, and extend the framework), check the developer-oriented documentation and package-level READMEs in the codebase.
diff --git a/documentation/technical_reference_manual/about_adore.md b/documentation/technical_reference_manual/about_adore.md
new file mode 120000
index 00000000..42061c01
--- /dev/null
+++ b/documentation/technical_reference_manual/about_adore.md
@@ -0,0 +1 @@
+README.md
\ No newline at end of file
diff --git a/documentation/technical_reference_manual/adore_embedded.md b/documentation/technical_reference_manual/adore_embedded.md
new file mode 100644
index 00000000..e4ad72cf
--- /dev/null
+++ b/documentation/technical_reference_manual/adore_embedded.md
@@ -0,0 +1,7 @@
+## ADORe Embedded
+
+ADORe Embedded is a lightweight deployment package (<1GB) designed for embedded
+systems. It supports **Docker**, **Podman**, or standard **unshare/chroot**
+environments.
+
+Download the latest release at: [github.com/eclipse-adore/adore/releases](https://github.com/eclipse-adore/adore/releases)
diff --git a/documentation/technical_reference_manual/getting_started/getting_started.md b/documentation/technical_reference_manual/getting_started/getting_started.md
index b941c9f3..401a02a0 100644
--- a/documentation/technical_reference_manual/getting_started/getting_started.md
+++ b/documentation/technical_reference_manual/getting_started/getting_started.md
@@ -36,34 +36,17 @@ git submodule update --init --recursive
> **ℹ️INFO:** If you would rather clone ADORe anonymously over https please review the [Anonymous Cloning 🔗](../system_and_development/anonymous_cloning.md) guide.
-## Building ADORe Developer Environment
+## Building ADORe
> **⚠️ WARNING:**
-> To use the ADORe developer environment you must have Docker installed.
-
-To have the easiest entry you can [install just](https://github.com/casey/just)
-
-and run:
-```bash
-just dev
-```
-
-Alternatively, simple call
+> To use ADORe you must have Docker, and GNU Make installed and configured for you user.
+Build the ADORe Docker context, known as ADORe CLI, in the base of the ADORe repository:
```bash
-.docker/scripts/run_dev.sh
+make build
```
-This will create and the developer environment where you can build all relevant packages with
-
-```bash
-just build
-```
-
-The full command list is available with
-
-```bash
-just help
-```
+> **ℹ️INFO:** On first run of the ADORe CLI the entire system will be built.
+> Initial build can take 10-15 minutes depending on system and network.
> **⚠️ WARNING:**
> Building ADORe **will** fail until all submodules have been properly initialized.
@@ -72,8 +55,23 @@ just help
> Do not proceed with building ADORe until `git submodule update --init --receive`
> finishes without error.
-Next proceed to [Running Your First Scenario 🔗](running_your_first_scenario.md)
+## Running ADORe
+After cloning and satisfying all system prerequisites and building ADORe
+you can start the ADORe CLI interactive shell docker context.
+To do this navigate to the root of the ADORe repository directory
+and run the following command:
+```bash
+make cli
+```
-## Using in an existing ROS2 project
+> **✅ SUCCESS:**
+> If you are greeted with the following ADORe CLI car then you have successfully setup ADORe:
+```
+ ____
+ __/ |_\__
+ | -.
+ ......'-(_)---(_)--'
+```
-The ADORe packages adore_(libraries/ros2_conversions/ros2_msgs/ros2_nodes/scenarios) can all be used directly in your existing ros2 project by pasting or symlining them into you ros2/colcon workspace.
\ No newline at end of file
+
+Next proceed to [Running Your First Scenario 🔗](running_your_first_scenario.md)
diff --git a/documentation/technical_reference_manual/getting_started/prerequisites.md b/documentation/technical_reference_manual/getting_started/prerequisites.md
index 0dd43b50..56d17c8f 100644
--- a/documentation/technical_reference_manual/getting_started/prerequisites.md
+++ b/documentation/technical_reference_manual/getting_started/prerequisites.md
@@ -1,5 +1,5 @@
# ADORe Prerequisites
-ADORe requires a recent version of Docker on your system. ADORe is
+ADORe requires a recent version of make and Docker on your system. ADORe is
officially supported in Ubuntu 20.04, 22.04 and 24.04. The following document applies to
that.
@@ -13,9 +13,14 @@ should yield something such as the following:
"24.04.2 LTS (Noble Numbat)"
```
-In principle, any x86 Linux operating system supporting Docker will run
+In principle, any x86 Linux operating system supporting Docker and Make will run
ADORe however installation steps for all the tooling will differ.
+### Installing make
+```
+sudo apt-get install -y make
+```
+
### Installing Docker
Review the [Installing Docker 🔗](installing_docker.md)
diff --git a/documentation/technical_reference_manual/getting_started/running_your_first_scenario.md b/documentation/technical_reference_manual/getting_started/running_your_first_scenario.md
index 02d2ddb1..33d15057 100644
--- a/documentation/technical_reference_manual/getting_started/running_your_first_scenario.md
+++ b/documentation/technical_reference_manual/getting_started/running_your_first_scenario.md
@@ -8,19 +8,17 @@ see the [ADORe Lichtblick-Suite README 🔗](../generated/visualization/lichtbli
2. Run a scenario, launch or attach to the `ADORe CLI` from the root of the `ADORe` repo:
```bash
-just dev
+make cli
cd adore_scenarios/simulation_scenarios
ros2 launch simulation_test.launch.py
```
-3. In a separate tab, start Lichtblick visualization
+3. Open lichtblick (in another shell):
```bash
-just lichtblick
+chromium http://localhost:8080//?ds=rosbridge-websocket&ds.url=ws://localhost:9090&ds\=rosbridge-websocket\&layout\=Default.json
```
-Then open the displayed URL with chome based browser.
-
-Some visualization layouts are available in tools/lichtblick/lichtblick_layouts
-
+or with a link:
+[http://localhost:8080//?ds=rosbridge-websocket&ds.url=ws://localhost:9090&ds\=rosbridge-websocket\&layout\=Default.json](http://localhost:8080//?ds=rosbridge-websocket&ds.url=ws://localhost:9090&ds\=rosbridge-websocket\&layout\=Default.json)
## Running A Scenario With The ADORe Mission Control Web Interface
1. Start `lichtblick suite` aka `foxglove` aka `foxbox`.
@@ -28,26 +26,20 @@ see the [ADORe Lichtblick-Suite README 🔗](../generated/visualization/lichtbli
2. start the `ADORe CLI` from the root of the `ADORe` repo:
```bash
-just dev
+make cli
```
-
-or
-
-```bash
-./.docker/scripts/run_dev.sh
-```
-
-3. Start the adore API
+or headlessly:
```bash
-just api_start
+make start
```
+The ADORe Mission Control will automatically start with the ADORe CLI.
-4. Open the web based gui
+3. Open the ADORe Mission Control
[http://localhost:8888](http://localhost:8888)
-5. Select a scenario in the `Senario Manager` and click start
+4. Select a scenario in the `Senario Manager` and click start
-6. Switch to the `Visualization` tab to visualize the scenario
+5. Switch to the `Visualization` tab to visualize the scenario
See the [ADORe Mission Control README 🔗](../generated/api/adore_api/adore_mission_control.md) for more information on the `ADORe Mission Control`.
diff --git a/documentation/technical_reference_manual/getting_started/system_requirements.md b/documentation/technical_reference_manual/getting_started/system_requirements.md
index da3131a5..3658bf41 100644
--- a/documentation/technical_reference_manual/getting_started/system_requirements.md
+++ b/documentation/technical_reference_manual/getting_started/system_requirements.md
@@ -18,10 +18,10 @@ and its components.
> **⚠️ WARNING: Building ADORe ROS nodes on systems with limited resources may cause crashes!**
> By default, ADORe uses parallel builds, which can overwhelm low-resource systems.
> To prevent this, either:
-> - Edit the `.colcon_workspace/colcon_defaults.yaml` file to disable parallel builds, **or**
+> - Edit the `adore.env` file to disable parallel builds, **or**
> - Run a single-core build with:
> ```bash
-> cd .colcon_workspace && colcon build --parallel-workers 1
+> cd ros2_workspace && make build_single_core
> ```
**RAM:**
@@ -31,8 +31,8 @@ and its components.
**HD Storage:**
-- At least 1.5 GB to clone the repository
-- At least 10 GB to build all necessary Docker contexts
+- At least 2.5 GB to clone the repository
+- At least 15 GB to build all necessary Docker contexts
**Operating System:**
@@ -49,3 +49,6 @@ and its components.
- [Docker 🔗](https://www.docker.com/) v20.10.17 or greater and Docker Compose v2.6.0 or greater.
For a guide on installing docker, see [Installing Docker](installing_docker.md).
+
+- [GNU Make 🔗](https://www.gnu.org/software/make/) is the backbone of the ADORe build system and is required.
+
diff --git a/documentation/technical_reference_manual/img/adore_intelligent_intersection_video_image.png b/documentation/technical_reference_manual/img/adore_intelligent_intersection_video_image.png
deleted file mode 100644
index 97094beb..00000000
Binary files a/documentation/technical_reference_manual/img/adore_intelligent_intersection_video_image.png and /dev/null differ
diff --git a/documentation/technical_reference_manual/img/driving_road_video_image.png b/documentation/technical_reference_manual/img/driving_road_video_image.png
deleted file mode 100644
index 5d8916d9..00000000
Binary files a/documentation/technical_reference_manual/img/driving_road_video_image.png and /dev/null differ
diff --git a/documentation/technical_reference_manual/img/remote_operations_video_image.png b/documentation/technical_reference_manual/img/remote_operations_video_image.png
deleted file mode 100644
index 5d18849e..00000000
Binary files a/documentation/technical_reference_manual/img/remote_operations_video_image.png and /dev/null differ
diff --git a/documentation/technical_reference_manual/img/simulated_maad_video_image.png b/documentation/technical_reference_manual/img/simulated_maad_video_image.png
deleted file mode 100644
index ecd664fb..00000000
Binary files a/documentation/technical_reference_manual/img/simulated_maad_video_image.png and /dev/null differ
diff --git a/documentation/technical_reference_manual/licensing/license_header_template.txt b/documentation/technical_reference_manual/licensing/license_header_template.txt
index badf41ab..b4cb97c5 100644
--- a/documentation/technical_reference_manual/licensing/license_header_template.txt
+++ b/documentation/technical_reference_manual/licensing/license_header_template.txt
@@ -1,4 +1,4 @@
-#********************************************************************************
+*!*******************************************************************************
#* Copyright (C) 2017-2020 German Aerospace Center (DLR).
#* Eclipse ADORe, Automated Driving Open Research https://eclipse.org/adore
#*
@@ -10,4 +10,4 @@
#*
#* Contributors:
#* {name} - initial API and implementation
-#********************************************************************************
\ No newline at end of file
+#********************************************************************************
diff --git a/documentation/technical_reference_manual/quick_start.md b/documentation/technical_reference_manual/quick_start.md
new file mode 100644
index 00000000..8b28cad7
--- /dev/null
+++ b/documentation/technical_reference_manual/quick_start.md
@@ -0,0 +1,29 @@
+# ADORe Quick Start
+This is a quick start guide to getting up and running with ADORe with no fuss
+running the automated setup script.
+
+For manual setup or a deeper look into getting ADORe set up please review the
+[Getting Started](getting_started/getting_started.md) guide.
+
+To setup and configure ADORe for a first run you can run the following setup script:
+```bash
+bash <(curl -sSL https://raw.githubusercontent.com/eclipse-adore/adore/develop/tools/adore_setup.sh)
+```
+
+> **ℹ️INFO:**
+> The ADORe setup script can run in non-interactive/unattended mode with:
+`bash <(curl -sSL https://raw.githubusercontent.com/eclipse-adore/adore/develop/tools/adore_setup.sh) --headless`
+
+This script will do the following:
+
+ - Verify that your system meets the minimum requirements to run ADORe
+ - Install the system dependencies GNU Make and Docker
+ - Clone ADORe to your home directory
+ - Build ADORe core components
+
+> **⚠️ WARNING:**
+> The automated ADORe setup script is only supported in Ubuntu!
+
+> **⚠️ WARNING:**
+> As a general rule you should never run shell scripts from untrusted sources.
+
diff --git a/documentation/technical_reference_manual/system_and_development/adore_cli.md b/documentation/technical_reference_manual/system_and_development/adore_cli.md
index 7df50069..5f66e8bf 100644
--- a/documentation/technical_reference_manual/system_and_development/adore_cli.md
+++ b/documentation/technical_reference_manual/system_and_development/adore_cli.md
@@ -12,388 +12,73 @@
* Contributors:
********************************************************************************
-->
-# ADORe Docker-Based Development Environment
-
-## Overview
-
-The ADORe project ships a Docker-based development environment so you can:
-
-* Develop against a **reproducible ROS 2 (Jazzy) stack**.
-* Keep your host system relatively clean.
-* Share the same setup across contributors and CI.
-* Avoid permission issues by matching the container user to your host user.
-* Keep your shell history and workspace state **across container restarts**.
-
-This document explains how it is structured and how to use it day-to-day.
-
----
-
-## Components
-
-### Docker images
-
-There are three main images, all configured via `.docker/scripts/common.sh`:
-
-* **Base image** – `adore_base:` / `adore_base:latest`
-
- * Built from `.docker/base/Dockerfile`.
- * Contains OS, ROS 2 Jazzy and base APT dependencies.
- * No user mapping or developer tooling.
-
-* **Dev image** – `adore_dev:` / `adore_dev:latest`
+## ADORe command line interface (CLI)
+
+The ADORe CLI is a docker run-time context that provides a complete set of tools
+for execution and development within adore. For more information on this tool
+please visit https://github.com/eclipse-adore/adore_cli
+
+The ADORe CLI context provides the following features:
+* Execution environment for all ADORe related program, nodes, binaries
+* Pre-installed ROS 2 development tools
+* Pre-installed system tools such as net-tools (ping), traceroute, nmap, gdb, ZSH etc
+* Pre-installed system dependencies for all ADORe ROS nodes and programs
+* Linked filesystem via Docker Volumes to the ADORe repository
+* REST API for interaction with ADORe and ROS
+* some basic development and debugging tools
+
+### ADORe CLI Usage
+Change directory to the root of the ADORe project and run:
+```
+make cli
+```
+On first run of the ADORe CLI the system will be built including all core
+modules. Initial build can take 10-15 minutes depending on system and network.
- * Defined in `.docker/dev/Dockerfile`.
- * `FROM adore_base:latest`.
- * Installs additional developer packages from `.docker/dev/apt.dev.txt`, including e.g.:
+Once the ADORe CLI context builds and starts you will be presented with a
+zsh shell context:
+```text
+Welcome to the ADORe Development CLI Ubuntu 20.04.6 LTS (GNU/Linux 5.19.0-45-generic x86_64)
- * Shell & terminal tools: `zsh`, `fzf`, `zsh-syntax-highlighting`, `zsh-autosuggestions`, `htop`, `tree`, `bat`, `ripgrep`, `gdb`.
- * ROS tools: `ros-jazzy-rqt`, `ros-jazzy-rqt-common-plugins`, `ros-jazzy-foxglove-bridge`, `ros-jazzy-ros2trace`, `ros-jazzy-tracetools-analysis`.
- * Tracing & debugging: `babeltrace`, `lttng-modules-dkms`.
- * X11 utilities & libraries: `x11-apps`, `libx11-6`, `libxext6`, `libxrender1`, `libxtst6`, `libxi6`, `libgl1`, `mesa-utils`, `x11-utils`.
- * Web & misc: `python3-flask`, `python3-flask-cors`, `jq`.
- * Installs the **Helix editor** (`hx`) and sets `HELIX_RUNTIME`.
- * Installs **Oh My Zsh** (non-interactive) and configures zsh as the default shell.
- * Configures **ccache** and a large, persistent zsh history.
- * Creates or renames a non-root user that matches your host UID/GID.
+ ____
+ __/ |_\__
+ | -.
+ ......'-(_)---(_)--'
-* **CI image** – `adore_ci:` / `adore_ci:latest`
+ Type 'help' for more information.
- * Built from `.docker/ci/Dockerfile`.
- * Used by CI and docs helpers (e.g. `just docs`, `just ci`).
- * Not required for basic development, but available via `Justfile` recipes.
+ADORe CLI: adore git:(main) (0)>
+```
+This will build all necessary ADORe components and launch a docker context.
-Each image is tagged with both `:latest` and a content-addressed tag based on:
+#### How do I know if I am in the ADORe CLI context?
+I am developing a ROS node and I want to add a system dependency. How do I do this?
+In the same directory adjacent or next to your `package.xml` file create a file
+called `requirements.system`. This file will be picked up by the ADORe CLI
+when it is built with:
+```
+make build
+```
+Example `requirements.system` file:
```bash
-IMAGE_TAG = "${GIT_HASH}-${ARCH}"
+curl
+wget
+htop
```
-where `GIT_HASH` is the short git commit hash of the repo, and `ARCH` is the machine architecture.
-
----
-
-## Scripts and helpers
-
-### `.docker/dev/Dockerfile`
-
-Key behavior of the dev image:
-
-* **Apt dependencies**
-
- * Copies `.docker/dev/apt.dev.txt` into the image and installs everything via `apt-get`.
-* **Helix**
-
- * Downloads a specific Helix release, unpacks it into `/opt/helix`.
- * Adds `/usr/local/bin/hx` symlink.
- * Sets `HELIX_RUNTIME=/opt/helix/runtime` in `/etc/profile`.
-* **User mapping**
-
- * Build args: `USERNAME` (default `developer`), `USER_UID` (default 2001), `USER_GID` (default 2001).
- * At build time:
-
- * If a user already exists with `USER_UID`, it is **renamed** to `${USERNAME}` and its home directory moved to `/home/${USERNAME}` while the group is renamed accordingly.
- * Otherwise a new user `${USERNAME}` is created with that UID/GID and `/usr/bin/zsh` as the shell.
- * The `USER` instruction switches to `${USERNAME}` for the rest of the Dockerfile and at runtime.
-* **Workspace & ccache**
-
- * Sets `WORKSPACE="/home/${USERNAME}/adore"` and `WORKDIR ${WORKSPACE}`.
- * Configures ccache via env vars:
-
- * `CCACHE_DIR="${WORKSPACE}/.cache/ccache"`
- * `CC="/usr/lib/ccache/gcc"`
- * `CXX="/usr/lib/ccache/g++"`
-* **Zsh configuration**
-
- * Appends to `${USERNAME}`’s `.zshrc`:
-
- * `HISTFILE=~/adore/.zsh_history`
- * `HISTSIZE=100000`, `SAVEHIST=100000`
- * `setopt HIST_IGNORE_DUPS`, `HIST_REDUCE_BLANKS`, `SHARE_HISTORY`, `INC_APPEND_HISTORY`
- * Ensures the workspace directory and history file exist and are owned by `${USERNAME}`.
-* **ROS & overlay auto-sourcing**
-
- * Appends a block to `.zshrc` that:
-
- * Sources `/opt/ros/${ROS_DISTRO:-jazzy}/setup.zsh` if it exists.
- * Sources the local colcon workspace overlay, preferring:
-
- * `$HOME/adore/.colcon_workspace/install/local_setup.zsh`
- * then `$HOME/adore/.colcon_workspace/install/setup.zsh`.
-* **Default command**
-
- * The container entrypoint is a login zsh shell:
-
- ```dockerfile
- CMD ["/usr/bin/zsh", "-l"]
- ```
-
----
-
-### `.docker/scripts/build_dev.sh`
-
-Builds the **base** and **dev** images on the host:
-
-1. Loads `common.sh` and asserts it is running on the host (via `require_host`).
-
-2. Switches to `$WORKSPACE_ROOT`.
-
-3. If `adore_base:latest` does not exist, builds it:
-
- ```bash
- docker build \
- -f "${DOCKER_BASE_DOCKERFILE}" \
- -t "${DOCKER_BASE_IMAGE_LATEST}" \
- -t "${DOCKER_BASE_IMAGE_TAGGED}" \
- .
- ```
-
-4. Always builds the dev image:
-
- ```bash
- docker build \
- -f "${DOCKER_DEV_DOCKERFILE}" \
- --build-arg USER_UID="${USER_UID}" \
- --build-arg USER_GID="${USER_GID}" \
- --build-arg USERNAME="${USER_NAME}" \
- -t "${DOCKER_DEV_IMAGE_LATEST}" \
- -t "${DOCKER_DEV_IMAGE_TAGGED}" \
- .
- ```
-
-The build args ensure the dev image’s user matches your host user, avoiding permission issues on the bind-mounted workspace.
-
----
-
-### `.docker/scripts/run_dev.sh`
-
-Starts or attaches to the dev container (host-side script):
-
-1. Loads `common.sh` and enforces host execution (`require_host`).
-
-2. Ensures the dev image exists:
-
- * If `adore_dev:latest` is missing, calls `build_dev.sh`.
-
-3. Sets `IMAGE="${DOCKER_DEV_IMAGE_LATEST}"` and `CONTAINER_NAME="${DOCKER_CONTAINER_NAME}"`.
-
-4. If a container with that name is **running**:
-
- * Clears the screen, prints `dev_greeting`, and runs:
-
- ```bash
- docker exec -it \
- -w "/home/${USER_NAME}/adore/" \
- -e HISTFILE="/home/${USER_NAME}/.zsh_history" \
- -e HISTSIZE=100000 \
- -e SAVEHIST=100000 \
- "${CONTAINER_NAME}" \
- zsh
- ```
-
- * Then exits (you’re now attached to the existing container).
-
-5. If a container with that name exists but is **stopped**, it is removed.
-
-6. Ensures host-side zsh history file exists:
-
- ```bash
- HOST_ZSH_HISTORY="${WORKSPACE_ROOT}/.zsh_history"
- touch "${HOST_ZSH_HISTORY}" # if missing
- ```
-
-7. Starts a **fresh** dev container:
-
- ```bash
- docker run --rm -it \
- --name "${CONTAINER_NAME}" \
- --network host \
- -e DISPLAY \
- -e QT_X11_NO_MITSHM=1 \
- -v /tmp/.X11-unix:/tmp/.X11-unix:rw \
- -v "${WORKSPACE_ROOT}:/home/${USER_NAME}/adore" \
- -v "${HOST_ZSH_HISTORY}:/home/${USER_NAME}/.zsh_history" \
- -w "/home/${USER_NAME}/adore/" \
- -e ROS_DISTRO="${ROS_DISTRO}" \
- -e HISTFILE="/home/${USER_NAME}/.zsh_history" \
- -e HISTSIZE=100000 \
- -e SAVEHIST=100000 \
- "${IMAGE}"
- ```
-
-8. Before you get the shell prompt, the script clears the terminal and prints the `dev_greeting` banner.
-
-Key points:
-
-* **Host networking** (`--network host`) simplifies ROS 2 discovery and interaction with host services.
-* **X11 support** is set up via the `/tmp/.X11-unix` bind mount and `DISPLAY`/`QT_X11_NO_MITSHM`.
-* Shell history is **persisted on the host** (`.zsh_history` in the repo) and reused across containers.
-
----
-
-### `.docker/scripts/setup_colcon_src.sh`
-
-Keeps `.colcon_workspace/src` in sync with the top-level package layout:
-
-* Expects **categories** under the repo root:
-
- ```bash
- adore_scenarios
- adore_ros2_conversions
- adore_interfaces
- adore_libraries
- adore_ros2_nodes
- adore_ros2_msgs
- vendor
- ```
-
-* For each category:
-
- * If `${WORKSPACE_ROOT}/${category}` does **not** exist:
-
- * Prints a warning and skips it.
- * If `.colcon_workspace/src/${category}` is already a symlink:
-
- * Verifies it points at the expected relative path (`../../${category}`).
- * Leaves it alone or updates it if the target changed.
- * If a non-symlink node exists at that path:
-
- * Prints an error and exits, to avoid clobbering user files.
- * Otherwise:
-
- * Creates the symlink:
-
- ```bash
- ln -sfn "../../${category}" ".colcon_workspace/src/${category}"
- ```
-
-`just dev` always runs `setup_colcon_src` first, so the colcon workspace reflects whatever packages are present at the top level.
-
----
-
-## Justfile integration
-
-The `Justfile` in the repo root ties all of this together.
-
-Important recipes related to the dev environment:
-
-* **Entry points**
-
- * `just` or `just help` – list all available recipes.
- * `just dev` – ensure colcon symlinks, then run the dev container.
-* **Docker images**
-
- * `just build_dev` – build base + dev images (host).
- * `just clean_images` – remove local ADORe images.
- * `just save` / `just load` – save/load dev/CI images as tarballs.
-* **Workspace cleanup**
-
- * `just clean_ws` – delete `.colcon_workspace/{build,install,log}`.
- * `just clean` – `clean_images` + `clean_ws`.
- * `just clean_build` – clean the workspace and then build.
-* **Colcon builds & tests** (host or inside the dev container)
-
- * `just build` – build the entire `.colcon_workspace`.
- * `just test_ws` – run `colcon test` (skipping vendor packages) + `colcon test-result`.
- * `just build_scenarios`, `just build_nodes`, etc. – targeted builds for subsets of packages.
-* **Tools & GUI**
-
- * `just gui` – run the ADORe scenario launcher.
- * `just edit_roads` – road network editor.
- * `just lichtblick` – Lichtblick visualization wrapper.
-* **Docs & CI**
-
- * `just docs` – build documentation inside the CI image.
- * `just ci` – run a CI-like test/docs pipeline locally.
-
-You can run these either **on the host** (if you have ROS and dependencies installed) or **inside the dev container** (recommended, since that environment is controlled and consistent).
-
----
-
-## Container layout and runtime environment
-
-Once you’re inside the dev container via `just dev` or `.docker/scripts/run_dev.sh`:
-
-* Working directory: `/home//adore` (the mounted repo).
-* Colcon workspace: `/home//adore/.colcon_workspace`.
-* Sources: `.colcon_workspace/src` (symlinks back to top-level ADORe directories).
-* Default shell: `zsh` with Oh My Zsh and custom history options.
-* Editor: `hx` (Helix) is available.
-* ROS:
-
- * `/opt/ros/$ROS_DISTRO/setup.zsh` is sourced automatically.
- * If you have built the workspace, the overlay under `.colcon_workspace/install` is also sourced automatically by `.zshrc`.
-
-All ROS tools from `apt.dev.txt` are ready to use: `rqt`, `ros2trace`, `foxglove-bridge`, etc.
-
----
-
-## Typical workflow
-
-1. **Clone the repo** (on your host machine):
-
- ```bash
- git clone adore
- cd adore
- ```
-
-2. **Start the dev container**:
-
- ```bash
- just dev
- ```
-
- This will:
-
- * Set up `.colcon_workspace/src` symlinks.
- * Build the base/dev images if needed.
- * Start the container or attach to it if already running.
- * Drop you into a login zsh shell inside `adore_dev`.
-
-3. **Build the workspace** (inside the container):
-
- ```bash
- cd .colcon_workspace
- colcon build
- ```
-
- Or:
-
- ```bash
- just build
- ```
-
-4. **Run tests**:
-
- ```bash
- just test_ws
- ```
-
-5. **Run tools and GUIs**:
-
- ```bash
- # Scenario launcher
- just gui
- # Road editor
- just edit_roads
- # Visualization
- just lichtblick
- ```
-6. **Stop / restart later**
+#### How do I know if I am in the ADORe CLI context?
- * Simply exit the shell to stop the container (because it was started with `--rm`).
- * Next time, run `just dev` again; your workspace state and shell history are preserved.
+- If you are in the ADORe CLI context you should have a shell prompt similar to
+ the following: `ADORe CLI: adore git:(master) (0)>`
----
+#### Persistence
+When running the ADORe CLI the adore source directory is mounted as a volume.
+It will be mounted with the same path as the parent context. Any changes made
+in the adore source tree will persist on the host/parent file system.
-## Summary
-The ADORe Docker development environment provides:
-* A consistent ROS 2 Jazzy-based stack with all necessary tools.
-* A user inside the container that matches your host user, avoiding permissions pain.
-* A colcon workspace layout centered on `.colcon_workspace` with symlinks mirroring the repo.
-* Simple host-side entrypoints (`just dev`, `.docker/scripts/run_dev.sh`) to start or attach to a ready-to-use dev shell.
-* Persistent shell history and a curated CLI experience tuned for day-to-day ADORe development.
\ No newline at end of file
diff --git a/documentation/technical_reference_manual/system_and_development/creating_a_new_node.md b/documentation/technical_reference_manual/system_and_development/creating_a_new_node.md
index f31e5760..17d7750a 100644
--- a/documentation/technical_reference_manual/system_and_development/creating_a_new_node.md
+++ b/documentation/technical_reference_manual/system_and_development/creating_a_new_node.md
@@ -1,88 +1,35 @@
-# Adding a new ROS 2 node to ADORe
+# Creating a New ADORe ROS Node
-This guide explains how to add a new ROS 2 node to the ADORe codebase, using the **official ROS 2 tutorials** as the primary reference and then describing what’s different in the ADORe setup.
+This guide will walk through creating a new node that is auto-linked to all
+ADORe user libraries and messages.
-## Recommended ROS 2 tutorials
+## Quick Start
-Before or while adding a node, it’s worth skimming these (Jazzy docs shown, Humble is essentially identical):
+1. **Copy the template node:**
+```bash
+cp -r ros2_workspace/src/example_nodes/ros2_hello_world ros2_workspace/src/my_new_node
+```
-* **Developing a ROS 2 package** (creating packages, C++/Python, install rules) ([docs.ros.org][1])
+2. **Update configuration files:**
+ - Edit `package.xml` - update package name, description, and dependencies
+ - Edit `CMakeLists.txt` - update project name and build targets
+ - Modify source files and tests as needed
- * Jazzy: `https://docs.ros.org/en/jazzy/How-To-Guides/Developing-a-ROS-2-Package.html`
+3. **Build the node:**
+```bash
+make build
+```
-* There you can follow **Writing a simple publisher and subscriber** :
+4. **Run tests:**
+```bash
+make test
+```
- * `Writing a simple publisher and subscriber (C++)`
- * `Writing a simple publisher and subscriber (Python)`
-* Optional but useful:
+5. **Execute the node:**
+```bash
+make run
+```
- * `Creating custom msg and srv files`
- * `Creating a launch file` and `Integrating launch files into ROS 2 packages`
+## Next Steps
-
----
-
-## Where packages live in ADORe
-
-In a generic ROS 2 tutorial, you create packages under something like `~/ros2_ws/src`. ([docs.ros.org][1])
-
-In ADORe, the layout is slightly different:
-
-* The **repo root** is mounted inside the dev container at:
-
- ```bash
- /home//adore
- ```
-
-* The **colcon workspace** is:
-
- ```bash
- /home//adore/.colcon_workspace
- ```
-
-* `.colcon_workspace/src` is populated via symlinks, created by `.docker/scripts/setup_colcon_src.sh`, to mirror a set of top-level “category” directories in the repo (nodes, libraries, interfaces, vendor, etc.).
-
-**Where to put your new node package**
-
-1. Open the repo in the dev container:
-
- ```bash
- just dev
- ```
-
-2. In the container, inspect the top-level directories to see how things are grouped:
-
- ```bash
- ls
- ```
-
- You’ll see one or more directories that contain other ROS 2 packages already (for example, a “nodes” directory, a “libraries” directory, etc.). Choose the category that matches what you’re adding:
-
- * A runtime ROS node → put it alongside other node packages.
- * A pure library → put it alongside existing library packages.
- * New message/service definitions → put them in the interfaces/messages category.
-
-3. You can create the package either:
-
- * Directly in the **top-level category directory**, or
- * Via the **colcon symlink** under `.colcon_workspace/src/` → both end up in the same place because of the symlink.
-
----
-
-
-## What’s different vs the vanilla ROS 2 tutorials?
-
-Here’s a quick comparison between the official docs and the ADORe flow:
-
-| Topic | ROS 2 tutorials | ADORe specifics |
-| ------------------------ | --------------------------------------------------- | ------------------------------------------------------------- |
-| Workspace location | `~/ros2_ws/src` | Repo root + `.colcon_workspace/src` via symlinks |
-| Environment setup | Manually source `/opt/ros//setup` | Dev container auto-sources ROS Jazzy and the colcon overlay |
-| Package creation command | `ros2 pkg create ...` | Same command, but run inside the dev container |
-| Where to create packages | Directly in `~/ros2_ws/src` | In the appropriate top-level category inside the repo |
-| Build command | `colcon build` | `just build` or `colcon build` inside `.colcon_workspace` |
-| Running nodes | `ros2 run ` | Same, but from inside dev container (recommended) |
-
-If you follow the official Jazzy “Developing a ROS 2 package” tutorial step-by-step **inside** the ADORe dev container and just adjust the workspace paths and category directory, you’ll end up with a node that behaves exactly like any other ADORe node, and it will be built and tested automatically by the existing `just`/colcon workflow.
-
-[1]: https://docs.ros.org/en/jazzy/How-To-Guides/Developing-a-ROS-2-Package.html "Developing a ROS 2 package — ROS 2 Documentation: Jazzy documentation"
+- Check existing nodes in `ros2_workspace/src/` for implementation examples
diff --git a/documentation/technical_reference_manual/system_and_development/documentation.md b/documentation/technical_reference_manual/system_and_development/documentation.md
index 23686e76..b54d170b 100644
--- a/documentation/technical_reference_manual/system_and_development/documentation.md
+++ b/documentation/technical_reference_manual/system_and_development/documentation.md
@@ -1,11 +1,36 @@
# Documentation
ADORe provides several sources of Documentation which will be detailed below.
+## Landing page
+The ADORe landing page is the main GitHub io information web page.
+Location: [https://eclipse.github.io/adore/ 🔗](https://eclipse.github.io/adore/)
+
## mkdocs
ADORe uses mkdocs to compile markdown into a searchable document hub.
Location: [https://eclipse.github.io/adore/mkdocs/ 🔗](../)
+## Doxygen
+ADORe utilized Doxygen to auto generate in-source
+
+Location: [doxygen_documentation.md 🔗](doxygen_documentation.md)
+
+## GNU Make
+Every ADORe module provides a Makefile providing "documentation-as-code". To
+learn what a module offers inspect the available make targets. Every ADORe
+module also offers a `make help` target. Call 'make help' to learn what it
+offers such as with the following example:
+```bash
+adore(develop:c0ec4a8) (0)> make help
+Usage: make
+ cli Start ADORe CLI docker context or attach to it if it is already running
+ run Execute a command in the ADORe CLI context `make run cmd=""`
+ stop Stop ADORe CLI docker compose context if it is running
+ build Build and setup adore cli
+ clean Clean ADORe build artifacts
+ start Start the ADORe CLI docker compose context
+```
+
## Documentation Generation
For information on how to build the documentation please visit the
[Documentation Generation 🔗](documentation_generation_system.md)
diff --git a/documentation/technical_reference_manual/system_and_development/documentation_generation_system.md b/documentation/technical_reference_manual/system_and_development/documentation_generation_system.md
index cb64370a..3085054d 100644
--- a/documentation/technical_reference_manual/system_and_development/documentation_generation_system.md
+++ b/documentation/technical_reference_manual/system_and_development/documentation_generation_system.md
@@ -1,340 +1,74 @@
-# Documentation build pipeline
-
-This project uses a MkDocs-based documentation site under `documentation/`.
-This page explains **where the docs come from**, **which commands to run**, and **what is generated automatically**.
-
----
-
-## Overview
-
-There are three main parts to the documentation system:
-
-1. A **MkDocs project** in `documentation/mkdocs/` (theme, navigation, static assets, etc.).
-2. A set of **hand-written docs**:
- - `documentation/index.md` (canonical top-level index)
- - `documentation/technical_reference_manual/` (main manual)
-3. A **generation script**, `documentation/mkdocs/gen_docs.py`, which:
- - Copies the canonical index into the MkDocs project.
- - Collects `README.md` files from the repository.
- - Drops them into `documentation/mkdocs/docs/generated/` in a structured way.
-
-Everything is orchestrated via `just` recipes defined in the `Justfile` at the repo root.
-
----
-
-## Quick commands
-
-From the repo root:
-
-- **Full docs build in CI-style container**
-
- ```bash
- just docs
- ```
-
-This calls `.docker/scripts/run_docs.sh`, which builds the documentation inside the CI Docker image. Use this if you want a **clean, reproducible build** that matches CI.
-
-* **Build docs using your local environment**
-
- ```bash
- just docs_build
- ```
-
- This runs the MkDocs pipeline directly under `documentation/` (no container). You need a working Python + MkDocs environment on your host.
-
-* **Clean everything and rebuild**
-
- ```bash
- just docs_all
- ```
-
- Equivalent to:
-
- ```bash
- just docs_clean
- just docs_build
- ```
-
-* **Serve the built docs locally**
-
- ```bash
- just docs_serve
- ```
-
- This runs a simple HTTP server in `documentation/docs` on port `8000`.
- Open `http://localhost:8000/` in your browser (the MkDocs site is under the `mkdocs/` subdirectory).
-
-* **Clean generated / build artifacts**
-
- ```bash
- just docs_clean
- ```
-
-* **Spellcheck & lint docs** (optional, requires Docker):
-
- ```bash
- just docs_spellcheck
- just docs_lint
- ```
-
- These use an `aspell` Docker image against the technical reference manual.
-
-* **Watch docs and rebuild on changes** (requires `inotifywait`):
-
- ```bash
- just docs_watch
- ```
-
----
-
-## What `docs_build` actually does
-
-The main work happens in two layered recipes:
-
-### 1. `docs_build_mkdocs`
-
-In the `Justfile`:
-
-```make
-# Build mkdocs site into documentation/mkdocs/site
-docs_build_mkdocs:
- cd "$DOCS_ROOT" && \
- mkdir -p mkdocs/docs && \
- rm -rf mkdocs/docs/generated mkdocs/site && \
- cp -r technical_reference_manual mkdocs/docs/technical_reference_manual && \
- python3 mkdocs/gen_docs.py && \
- cd mkdocs && mkdocs build
-```
-
-Step by step:
-
-1. `cd "$DOCS_ROOT"`
- `DOCS_ROOT` is defined as `${WORKSPACE_ROOT}/documentation`, i.e. the `documentation/` directory in the repo root.
-
-2. `mkdir -p mkdocs/docs`
- Ensure the MkDocs `docs/` directory exists.
-
-3. `rm -rf mkdocs/docs/generated mkdocs/site`
-
- * Remove the previous **generated** docs subtree.
- * Remove the previous MkDocs **site** output.
-
-4. `cp -r technical_reference_manual mkdocs/docs/technical_reference_manual`
- Copy the hand-written technical reference manual into the MkDocs `docs/` tree.
- Inside the MkDocs project, it appears under `docs/technical_reference_manual/`.
-
-5. `python3 mkdocs/gen_docs.py`
- Run the documentation generation script (details below).
- This:
-
- * Copies `documentation/index.md` → `documentation/mkdocs/docs/index.md`.
- * Scans the entire repo for `README.md` files and copies them to `mkdocs/docs/generated/...`.
-
-6. `cd mkdocs && mkdocs build`
- Run MkDocs, which:
-
- * Reads `mkdocs.yml` and the Markdown files in `mkdocs/docs/`.
- * Produces a static HTML site under `mkdocs/site/`.
-
-### 2. `docs_build`
-
-After `docs_build_mkdocs` completes:
-
-```make
-# Build docs/ tree from mkdocs output (gh-pages-ready)
-docs_build: docs_build_mkdocs
- cd "$DOCS_ROOT" && \
- rm -rf docs && \
- mkdir -p docs && \
- cp -r mkdocs/site docs/mkdocs &&\
- cp -r mkdocs/img docs/mkdocs
+# Documentation Generation
+ADORe provides tools to generate all of the documentation detailed in the
+[documentation](documentaiton.md) readme.
+
+## Usage: Documentation Generation
+1. cd to the adore documentation directory:
+ ```bash
+ cd adore/documentation
+ ```
+2. Call the build target:
+ ```bash
+ make build
+ ```
+
+## Usage: Serving local copy
+You can build and serve the documentation locally by running the provide `make
+serve` target. Navigate to the documentation directory and run the following:
+```bash
+cd adore/documentation
+make serve
```
-This:
-
-1. Removes any previous `documentation/docs/` directory.
-2. Creates a fresh `documentation/docs/`.
-3. Copies the built MkDocs site (`mkdocs/site/`) to `documentation/docs/mkdocs`.
-4. Copies static images from `mkdocs/img` into `documentation/docs/mkdocs`.
+Once built the documents will be available at
+[http://localhost 🔗](http://localhost)
-The final, self-contained documentation tree is thus at:
+> **ℹ️INFO:**
+> This will build and serve the documentation locally using a docker nginx image
-```text
-documentation/docs/mkdocs/
+## Usage: Spell Checking
+The documentation system uses aspell to "lint" the markdown files
+To do an interactive spell checking session use the provided make target:
```
-
-This is what `just docs_serve` serves, and it can also be used directly for publishing (e.g. to `gh-pages`).
-
----
-
-## How `gen_docs.py` works
-
-`gen_docs.py` lives in `documentation/mkdocs/` and is responsible for **gathering Markdown sources from the repo** into the MkDocs project.
-
-Key paths:
-
-* `MKDOCS_DIR = Path(__file__).resolve().parent`
- → `documentation/mkdocs/`
-
-* `DOCS_DIR = MKDOCS_DIR / "docs"`
- → `documentation/mkdocs/docs/` (MkDocs content root)
-
-* `GENERATED_DIR = DOCS_DIR / "generated"`
- → `documentation/mkdocs/docs/generated/`
-
-* `REPO_ROOT = MKDOCS_DIR.parent.parent`
- → repo root (two levels up from `documentation/mkdocs/`)
-
-* `SOURCE_INDEX = MKDOCS_DIR.parent / "index.md"`
- → `documentation/index.md` (canonical top-level index)
-
-* `DEST_INDEX = DOCS_DIR / "index.md"`
- → `documentation/mkdocs/docs/index.md` (MkDocs landing page)
-
-### 1. Ensuring `docs/` exists
-
-```python
-DOCS_DIR.mkdir(parents=True, exist_ok=True)
+make spellcheck
```
-
-If `documentation/mkdocs/docs/` does not exist, it is created. This makes the script robust even if called before any other build step.
-
-### 2. Copying the canonical index
-
-```python
-if SOURCE_INDEX.exists():
- DEST_INDEX.parent.mkdir(parents=True, exist_ok=True)
- shutil.copy2(SOURCE_INDEX, DEST_INDEX)
+To non-interactively lint/spellcheck all markdown documents run:
```
-
-* If `documentation/index.md` exists, it is copied to `documentation/mkdocs/docs/index.md`.
-* This means **the canonical top-level documentation page lives in `documentation/`, not inside `mkdocs/`**.
-* MkDocs sees this as the root `index.md` of the doc site.
-
-If `documentation/index.md` is missing, the script logs a warning and skips this step.
-
-### 3. Cleaning the `generated/` subtree
-
-```python
-if GENERATED_DIR.exists():
- shutil.rmtree(GENERATED_DIR)
-GENERATED_DIR.mkdir(parents=True, exist_ok=True)
+make lint
```
-The `generated/` directory is **completely recreated** on each run:
+The spell checker (aspell) and lint targets use a custom dictionary: `.aspell.en.pws`
-* Anything under `documentation/mkdocs/docs/generated/` is considered **generated content** and will be removed.
-* Do **not** hand-edit files there; changes will be overwritten on the next build.
+Words can be added to the dictionary to provide exceptions by directly editing this file
+or by running an interactive spell checking session as explained previously.
-### 4. Collecting `README.md` files
-The script scans the repo for `README.md` files, with some directories excluded:
+## Usage: Publication (to gh-pages)
+Steps to publish documentation to gh-pages:
-```python
-SEARCH_ROOTS = [
- REPO_ROOT
-]
+1. Fork the ADORe repo to your personal GitHub
-IGNORE_DIR_NAMES = {
- ".git",
- ".github",
- ".gitlab",
- ".idea",
- ".vscode",
- "__pycache__",
- ".pytest_cache",
- "build",
- "install",
- "log",
- "documentation",
- ".docker",
- ".venv",
-}
-```
+2. Clone the repo locally
-The helper:
+3. Modify the `publish.env` file to specify an originating branch
+> **ℹ️INFO:**
+> You do not need to check out the branch you wish the documentation originate from.
+> The source branch of the gh-pages/documentation is defined in `publish.env`
-```python
-def should_skip(path: Path) -> bool:
- return any(part in IGNORE_DIR_NAMES for part in path.parts)
+4. Run the publication Make target:
```
-
-* Any path whose **components** (directory names) include one of the ignore names is skipped.
-* This prevents:
-
- * Git internals, IDE configs, Python caches, build and install artifacts, etc.
- * The `documentation/` tree itself (so we don’t recursively ingest docs into themselves).
- * The `.docker/` and `.venv/` directories.
-
-The main loop:
-
-```python
-for root in SEARCH_ROOTS:
- if not root.exists():
- continue
-
- for readme in root.rglob("README.md"):
- if should_skip(readme):
- continue
-
- rel = readme.relative_to(REPO_ROOT)
- out_path = GENERATED_DIR / rel
- out_path.parent.mkdir(parents=True, exist_ok=True)
- shutil.copy2(readme, out_path)
+make publish
```
-For each `README.md`:
-
-1. It computes its path relative to the repo root (e.g. `src/nodes/foo/README.md`).
-2. It copies the file to `documentation/mkdocs/docs/generated/src/nodes/foo/README.md`, preserving the directory structure under `generated/`.
-
-**Result:**
-
-* Every `README.md` in the repo (outside ignored directories) appears under `generated/` in the MkDocs docs tree.
-* This makes it easy to surface local package docs in the website without duplicating content.
-
----
-
-## What you should (and shouldn’t) edit
-
-* **Edit by hand:**
-
- * `documentation/index.md` → top-level landing page.
- * `documentation/technical_reference_manual/**/*.md` → main manual.
- * Any other manually created `.md` files under `documentation/mkdocs/docs/` (except `generated/`).
-
-* **Do not edit by hand:**
-
- * Anything under `documentation/mkdocs/docs/generated/` → regenerated from `README.md` files.
- * Anything under `documentation/docs/` → derived build artifacts.
-
-* **To update package-level docs:**
-
- * Edit the relevant `README.md` in the package directory.
- * Rebuild docs: `just docs_build` (or `just docs`).
-
----
-
-## Publishing and CI
-
-* `just docs` is the recommended entry point for CI-style docs builds. It runs `.docker/scripts/run_docs.sh`, which uses the CI Docker image for a controlled environment.
-* `just docs_publish_gh_pages` (wrapped by `just docs_publish`) calls `documentation/publish_gh-pages.sh` to push the built site to the `gh-pages` branch.
-* Docs are also included in the broader CI flow via `just ci`, which runs tests and documentation together.
-
----
-
-## Summary
-
-* **MkDocs** drives the HTML site under `documentation/mkdocs/`.
-* **Hand-written docs** live in `documentation/index.md` and `documentation/technical_reference_manual/`.
-* **Generated docs** are created by `gen_docs.py` from repository `README.md` files and placed in `documentation/mkdocs/docs/generated/`.
-* The main commands you will use are:
+This will push a branch called `gh-pages` containing only a `docs` folder
+to the `origin` remote
- ```bash
- just docs_build # local build
- just docs_serve # local preview on http://localhost:8000/
- just docs_all # clean + build
- just docs # build docs inside CI Docker image
- ```
+5. Configure GitHub to use the branch as a "GitHub Pages"
+You have to enable `gh-pages` on the `docs` directory in order for the publication
+to be active. Visit `https://github.com//adore/settings/pages` to
+configure gh-pages.
+6. Optionally, create a pull/merge request to make this documentation active on the
+primary ADORe repo. Make sure to lint the markdown with `make lint` before
+submitting a pull/merge request.
diff --git a/documentation/technical_reference_manual/system_and_development/doxygen_documentation.md b/documentation/technical_reference_manual/system_and_development/doxygen_documentation.md
new file mode 100644
index 00000000..e21c12c9
--- /dev/null
+++ b/documentation/technical_reference_manual/system_and_development/doxygen_documentation.md
@@ -0,0 +1,6 @@
+# Doxygen Documentation
+
+Doxygen documentation is provide as part of the ADORe Technical Reference Manual
+for the ADORe sources which can be found [HERE](../../../generated_doxygen_documentation/index.html).
+
+
diff --git a/documentation/technical_reference_manual/system_and_development/img/live_model_checking.png b/documentation/technical_reference_manual/system_and_development/img/live_model_checking.png
new file mode 100644
index 00000000..3aa51883
Binary files /dev/null and b/documentation/technical_reference_manual/system_and_development/img/live_model_checking.png differ
diff --git a/documentation/technical_reference_manual/system_and_development/img/model_checking_dashbaord.png b/documentation/technical_reference_manual/system_and_development/img/model_checking_dashbaord.png
new file mode 100644
index 00000000..0dc40015
Binary files /dev/null and b/documentation/technical_reference_manual/system_and_development/img/model_checking_dashbaord.png differ
diff --git a/documentation/technical_reference_manual/system_and_development/img/model_checking_results.png b/documentation/technical_reference_manual/system_and_development/img/model_checking_results.png
new file mode 100644
index 00000000..a6d6043c
Binary files /dev/null and b/documentation/technical_reference_manual/system_and_development/img/model_checking_results.png differ
diff --git a/documentation/technical_reference_manual/system_and_development/library_testing.md b/documentation/technical_reference_manual/system_and_development/library_testing.md
new file mode 100644
index 00000000..9d34b3d7
--- /dev/null
+++ b/documentation/technical_reference_manual/system_and_development/library_testing.md
@@ -0,0 +1,227 @@
+# Library Testing
+
+This document describes how to work with tests in the ADORe libraries system.
+
+## Running Unit Tests
+
+To run all library unit tests:
+```bash
+cd libraries
+make test
+```
+
+If the test binary hasn't been built yet, you'll see an error prompting you to build first:
+```bash
+cd libraries
+make build
+make test
+```
+
+The unit test runner is located at `build/bin/unit_test_runner` after building.
+
+## Creating a New Unit Test
+
+Unit tests use Google Test (GTest) and are automatically discovered and built by the system.
+
+### Step 1: Create Your Test File
+
+Add a new test `.cpp` file in `lib/tests/src/`:
+```bash
+touch lib/tests/src/my_feature_unit_tests.cpp
+```
+
+### Step 2: Write Your Tests
+```cpp
+#include
+#include "my_library/my_feature.h"
+
+class MyFeatureTest : public ::testing::Test {
+protected:
+ void SetUp() override {
+ // Setup code here
+ }
+
+ void TearDown() override {
+ // Cleanup code here
+ }
+};
+
+TEST_F(MyFeatureTest, BasicFunctionality) {
+ EXPECT_EQ(1 + 1, 2);
+ ASSERT_TRUE(true);
+}
+
+TEST_F(MyFeatureTest, AnotherTest) {
+ EXPECT_NE(1, 2);
+}
+```
+
+### Step 3: Build and Run
+```bash
+make build
+make test
+```
+
+All `.cpp` files in `lib/tests/src/` are automatically compiled and linked into the test runner.
+
+## Creating a Simple Test Program
+
+Test programs are standalone executables used for manual testing, debugging, or demonstrations.
+
+### Step 1: Create a Test Program Directory
+```bash
+mkdir -p lib/test_programs/my_test_program
+```
+
+### Step 2: Write Your Program
+
+Create `lib/test_programs/my_test_program/my_test_program.cpp`:
+```cpp
+#include
+#include "my_library/my_feature.h"
+
+int main() {
+ std::cout << "Testing my feature..." << std::endl;
+
+ // Your test code here
+
+ std::cout << "Test complete!" << std::endl;
+ return 0;
+}
+```
+
+### Step 3: Add Dependencies (if needed)
+
+If your test program needs external libraries, create `lib/test_programs/my_test_program/requirements.cmake`:
+```cmake
+find_package(Eigen3 REQUIRED)
+set(Eigen3_TARGETS Eigen3::Eigen)
+```
+
+And optionally `requirements.system` for system packages:
+```
+libeigen3-dev
+```
+
+### Step 4: Build and Run
+
+The build system automatically detects any `.cpp` file with a `main()` function and creates an executable.
+```bash
+make build
+./build/bin/my_test_program
+```
+
+## Test Program vs Unit Test: When to Use Which
+
+### Use Unit Tests When:
+- Testing specific functions or classes
+- Verifying correctness with assertions
+- Running automated tests in CI/CD
+- Testing edge cases and error conditions
+- Need test fixtures and setup/teardown
+
+### Use Test Programs When:
+- Manual testing or debugging
+- Demonstrating library usage
+- Performance benchmarking
+- Interactive testing
+- Generating visual output or files
+
+## Directory Structure
+```
+lib/
+├── tests/ # Unit tests
+│ ├── src/ # Test source files (auto-discovered)
+│ │ ├── feature1_tests.cpp
+│ │ └── feature2_tests.cpp
+│ ├── unit_test_runner.cpp # Test runner main()
+│ └── requirements.cmake # GTest dependencies
+│
+└── test_programs/ # Standalone test programs
+ ├── my_test/
+ │ ├── my_test.cpp # Must have main()
+ │ ├── requirements.cmake # Optional dependencies
+ │ └── requirements.system # Optional system packages
+ └── another_test/
+ └── another_test.cpp
+```
+
+## Excluding Tests from Build
+
+To prevent a test from being built, add it to `.cmakeignore`:
+```bash
+echo "lib/tests/src/broken_test.cpp" >> .cmakeignore
+echo "lib/test_programs/my_test" >> .cmakeignore
+```
+
+## Common GTest Assertions
+```cpp
+EXPECT_EQ(a, b); // a == b
+EXPECT_NE(a, b); // a != b
+EXPECT_LT(a, b); // a < b
+EXPECT_LE(a, b); // a <= b
+EXPECT_GT(a, b); // a > b
+EXPECT_GE(a, b); // a >= b
+EXPECT_TRUE(cond); // condition is true
+EXPECT_FALSE(cond); // condition is false
+EXPECT_NEAR(a, b, e); // |a - b| <= e
+
+ASSERT_EQ(a, b); // Same as EXPECT_* but stops test on failure
+```
+
+## Tips
+
+1. **Naming Convention**: Name test files with `_tests.cpp` or `_unit_tests.cpp` suffix
+2. **Test Organization**: Group related tests in the same file
+3. **Test Fixtures**: Use `TEST_F` with fixture classes for shared setup
+4. **Fast Tests**: Keep unit tests fast (< 1ms per test ideally)
+5. **Descriptive Names**: Use clear test names that describe what is being tested
+6. **One Assertion Focus**: Each test should focus on one specific behavior
+
+## Example: Complete Unit Test
+```cpp
+#include
+#include
+#include "adore_math/PiecewisePolynomial.h"
+
+class PiecewisePolynomialTest : public ::testing::Test {
+protected:
+ void SetUp() override {
+ for (int i = 0; i < 10; ++i) {
+ xValues.push_back(i * 0.1);
+ yValues.push_back(i * 0.1);
+ }
+ }
+
+ std::vector xValues;
+ std::vector yValues;
+ adore::math::PiecewisePolynomial poly;
+};
+
+TEST_F(PiecewisePolynomialTest, ReturnsCorrectSize) {
+ auto result = poly.linearPiecewise(xValues, yValues);
+ EXPECT_EQ(result.breaks.size(), xValues.size());
+}
+
+TEST_F(PiecewisePolynomialTest, HandlesEmptyInput) {
+ std::vector empty;
+ auto result = poly.linearPiecewise(empty, empty);
+ EXPECT_TRUE(result.breaks.empty());
+}
+```
+
+## Troubleshooting
+
+**Tests not found after adding new test file:**
+- Rebuild: `make clean && make build`
+- Check file is in `lib/tests/src/`
+- Verify file not in `.cmakeignore`
+
+**Linking errors:**
+- Add missing dependencies to `lib/tests/requirements.cmake`
+- Check library is built and available
+
+**Test program not created:**
+- Ensure file has `int main()` function
+- Check file not in `.cmakeignore`
+- Rebuild project
diff --git a/documentation/technical_reference_manual/system_and_development/model_checking_with_the_adore_mission_control.md b/documentation/technical_reference_manual/system_and_development/model_checking_with_the_adore_mission_control.md
new file mode 100644
index 00000000..d6fb1b33
--- /dev/null
+++ b/documentation/technical_reference_manual/system_and_development/model_checking_with_the_adore_mission_control.md
@@ -0,0 +1,34 @@
+# ADORe Scenario Model Checking With The ADORe Mission Control
+
+
+Online, offline model checking can be
+
+## Online model checking
+
+
+Open the ADORe Mission Control Web Interface: [ADORe Mission Control Dashboard](http://localhost:8888)
+
+1. Select a Scenario
+2. Enable online model checking by checking the "Model Checking" check box
+3. Select a sample time (the number of seconds data will be collected before model checking)
+4. Click the "Play" button to run the scenario and start the model checking.
+
+
+
+
+5. Wait for the results. Online model checking results will open in the results panel on the left once model checking has finished.
+
+
+
+## Continuous model checking
+1. Following the same procedure as "Online model checking" select a scenario,
+and click play.
+2. Click the "Model Checker" tab in the ADORe Mission Control dashboard.
+3. Click "▶ Start" button.
+4. Continuous model checking results will display in the "Model Checker" tab while a scenario is running
+
+
+
+## Offline Model Checking
+TODO
+
diff --git a/documentation/technical_reference_manual/system_and_development/multiarch_support.md b/documentation/technical_reference_manual/system_and_development/multiarch_support.md
new file mode 100644
index 00000000..0599ca42
--- /dev/null
+++ b/documentation/technical_reference_manual/system_and_development/multiarch_support.md
@@ -0,0 +1,50 @@
+## Multi-Architecture Support
+
+The ADORe CLI supports both **native** and **cross-compilation** workflows for
+`x86_64` and `arm64` architectures.
+
+### Native Build
+
+To build and run ADORe CLI **natively** on your current architecture:
+
+```bash
+make build
+make cli
+```
+
+This will build and run the CLI on your host architecture
+(`x86_64` or `arm64` depending on your system).
+
+### Cross-Compilation
+
+To **cross-compile** the CLI for `arm64` from an `x86_64` host (or vice versa),
+set the `ARCH` environment variable during build and run:
+
+```bash
+ARCH=arm64 make build
+ARCH=arm64 make cli
+```
+
+This compiles the CLI binary for the specified target architecture
+(`arm64` in this case) and runs it using emulation if needed (e.g., with QEMU
+if running on `x86_64`).
+
+### Supported Architectures
+
+- `x86_64` (native or host)
+- `arm64` (native or cross-compiled)
+
+### Notes
+When running `make cli` or `make build` with `ARCH=arm64` on an `x86_64` host
+necessary system dependencies for docker will be automatically installed
+including Docker QEMU.
+
+### Cross Compiling
+
+```bash
+# Cross-compile and run ADORe CLI for ARM64 on an x86_64 host
+ARCH=arm64 make build
+ARCH=arm64 make cli
+```
+
+
diff --git a/documentation/technical_reference_manual/system_and_development/scenario_generation.md b/documentation/technical_reference_manual/system_and_development/new_scenario_creation.md
similarity index 79%
rename from documentation/technical_reference_manual/system_and_development/scenario_generation.md
rename to documentation/technical_reference_manual/system_and_development/new_scenario_creation.md
index 487b992d..f1854fae 100644
--- a/documentation/technical_reference_manual/system_and_development/scenario_generation.md
+++ b/documentation/technical_reference_manual/system_and_development/new_scenario_creation.md
@@ -5,32 +5,21 @@ This guide walks you through the steps to create a custom scenario file for simu
### 1. Copy an Existing Scenario
Start by copying any **working scenario file**. This ensures you have a valid structure and format to begin with.
```bash
-cp existing_scenario.py my_custom_scenario.py
+cp template.launch.py my_custom_scenario.launch.py
```
---
-### 2. Start the Goal Picking Tool
-To use the interactive goal picker tool:
-
-1. Start `lichtblick suite` from the `ADORe` project root:
-```bash
-just lichtblick
-```
-
-2. Open the goal picker tool in your browser:
-
-```bash
-just api_start
-```
-
+### 2. Open the goal picking tool to select a goal:
+1. Once the ADORe CLI is running with `make start` or `make cli` and navigate to the goal picker:
```bash
-chromium http://localhost:8080/assets/goal_picker.html
+chromium "http://localhost:8888/?tab=goal-picker"
```
or use the direct link:
-[http://localhost:8080/assets/goal_picker.html](http://localhost:8080/assets/goal_picker.html)
+[http://localhost:8888/?tab=goal-picker](http://localhost:8888/?tab=goal-picker)
-3. Use the tool to:
+2. Use the goal picking tool to:
- Search for locations using the search box
- Click on the map to place start and goal markers
+ - On the start point set the heading flag (this can be clicked and dragged).
- Toggle between start and goal placement modes
- View coordinates in both Lat/Long and UTM formats
- Copy the generated Python code directly from the text boxes
@@ -39,7 +28,7 @@ or use the direct link:
You can obtain coordinates using one of these methods:
**Method A: Goal Picker Tool (Recommended)**
-- Use the **goal_picker.html** tool as described above
+- Use the **goal picker** tool as described above
- This tool provides both coordinate formats and generates Python code automatically
- Simply click on the map to place markers and copy the generated code
@@ -121,17 +110,3 @@ start_position = Position(utm=(606372, 5797172, 32, 'N'), psi=3.04)
goal_position = Position(utm=(606380, 5797058, 32, 'N'))
```
-**Legacy tuple format:**
-```python
-start_position = (606529.67, 5797315.01, -3.23)
-goal_position = (606447.98, 5797272.22)
-```
----
-## 🔁 Final Check
-Before running the scenario:
-- ✅ Validate the file syntax.
-- ✅ Make sure start and goal positions make sense visually.
-- ✅ Run the simulation and fine-tune as needed.
-- ✅ Test both coordinate formats to ensure compatibility.
-- ✅ Verify the import statement for the Position class is included.
----
diff --git a/documentation/technical_reference_manual/system_and_development/ros_unit_testing.md b/documentation/technical_reference_manual/system_and_development/ros_unit_testing.md
new file mode 100644
index 00000000..73d21b18
--- /dev/null
+++ b/documentation/technical_reference_manual/system_and_development/ros_unit_testing.md
@@ -0,0 +1,122 @@
+# ROS Unit Testing
+
+As with ROS, ADORe supports unit testing with colcon.
+
+## Executing All ROS Unit Tests
+
+All ROS unit tests can be run with the following:
+
+```bash
+# 1. Start and attach to the ADORe CLI
+make cli
+
+# 2. Navigate to the ros2_workspace and run make test
+cd ros2_workspace
+make test
+
+# Optionally, you can invoke colcon directly
+colcon test --pytest-args "-m 'not linter'" --event-handlers console_direct+
+```
+
+## C++ Template Project
+
+In `ros2_workspace/src/example_nodes/ros2_hello_world`, ADORe includes a complete template C++ node example that includes unit tests. This project can be used as a basis/template for another node to include unit tests.
+
+This project also includes a generic Makefile that includes targets: `make build`, `make test` and `make run`.
+
+To run the tests for the `ros2_hello_world` program use the following:
+
+```bash
+# 1. Start and attach to the ADORe CLI
+make cli
+
+# 2. Navigate to the ros2_hello_world directory and run make test
+cd ros2_workspace/src/example_nodes/ros2_hello_world
+make test
+
+# Optionally, you can invoke colcon directly
+cd ros2_workspace && colcon test --packages-select ros2_hello_world --event-handlers console_direct+
+```
+
+Example output:
+```
+make cli
+cd ros2_workspace/src/example_nodes/ros2_hello_world
+make test
+...
+1/1 Test #1: ros2_hello_world_test ............ Passed 0.07 sec
+
+100% tests passed, 0 tests failed out of 1
+
+Label Time Summary:
+gtest = 0.07 sec*proc (1 test)
+
+Total Test time (real) = 0.07 sec
+Finished <<< ros2_hello_world [0.11s]
+```
+
+## Python Template Project
+
+In `ros2_workspace/src/example_nodes/ros2_python_hello_world`, ADORe provides a complete template Python node example with comprehensive unit tests. This project demonstrates Python-specific testing patterns and can serve as a foundation for developing Python-based ROS2 nodes with proper test coverage.
+
+The Python template includes:
+- Unit tests using `pytest` framework
+- Mock testing for ROS2 interfaces
+- Coverage reporting capabilities
+- A generic Makefile with `make build`, `make test`, and `make run` targets
+
+### Running Python Node Tests
+
+To run the tests for the `ros2_python_hello_world` program:
+
+```bash
+# 1. Start and attach to the ADORe CLI
+make cli
+
+# 2. Navigate to the ros2_python_hello_world directory and run make test
+cd ros2_workspace/src/example_nodes/ros2_python_hello_world
+make test
+
+# Optionally, you can invoke colcon directly
+cd ros2_workspace && colcon test --packages-select ros2_python_hello_world --event-handlers console_direct+
+
+# For verbose pytest output with coverage
+cd ros2_workspace && colcon test --packages-select ros2_python_hello_world --pytest-args "-v --cov=ros2_python_hello_world" --event-handlers console_direct+
+```
+
+Example output:
+```
+make cli
+cd ros2_workspace/src/example_nodes/ros2_python_hello_world
+make test
+...
+============================= test session starts ==============================
+platform linux -- Python 3.10.12, pytest-7.4.0
+collected 3 items
+
+test_hello_world_node.py::test_node_creation PASSED [ 33%]
+test_hello_world_node.py::test_timer_callback PASSED [ 66%]
+test_hello_world_node.py::test_message_publishing PASSED [100%]
+
+============================== 3 passed in 0.42s ===============================
+Finished <<< ros2_python_hello_world [0.58s]
+```
+
+### Python Testing Best Practices
+
+The Python template demonstrates several testing patterns specific to Python ROS2 development:
+
+- **Fixture-based setup**: Uses pytest fixtures for node initialization and cleanup
+- **Mocking ROS2 interfaces**: Demonstrates how to mock publishers, subscribers, and services
+- **Async testing**: Includes examples for testing asynchronous ROS2 callbacks
+- **Parameter testing**: Shows how to test node parameters and dynamic reconfiguration
+
+### Coverage Reports
+
+Generate detailed coverage reports for Python nodes:
+
+```bash
+cd ros2_workspace
+colcon test --packages-select ros2_python_hello_world --pytest-args "--cov=ros2_python_hello_world --cov-report=html" --event-handlers console_direct+
+# Coverage report will be available in ros2_workspace/build/ros2_python_hello_world/htmlcov/index.html
+```
diff --git a/documentation/technical_reference_manual/system_and_development/sumo_bridge.md b/documentation/technical_reference_manual/system_and_development/sumo_bridge.md
new file mode 100644
index 00000000..4941a629
--- /dev/null
+++ b/documentation/technical_reference_manual/system_and_development/sumo_bridge.md
@@ -0,0 +1,63 @@
+# ADORe and SUMO
+This document descries how to get ADORe and SUMO running together.
+
+
+## sumo_bridge ROS2 node
+The `sumo_bridge` is a ROS 2 node located in `ros2_workspace/src/adore_interfaces/sumo_bridge`
+that bridges [SUMO](https://sumo.dlr.de) traffic simulation to the
+ADORe stack via libsumo. SUMO vehicles are published as `TrafficParticipantSet`
+messages and the ego vehicle state is injected back into SUMO each simulation step.
+
+## Configuration
+
+All variables are set in `adore.env`.
+
+| Variable | Default | Description |
+|---|---|---|
+| `SUMO_BRIDGE_ENABLE` | `false` | Set to `true` to start the bridge |
+| `SUMO_CONFIG_DIRECTORY` | `ros2_workspace/src/adore_interfaces/sumo_bridge/sumo_configs` | Path relative to `SOURCE_DIRECTORY` containing `.sumocfg` files |
+| `SUMO_BRIDGE_CONFIG_FILE` | `demo_sumo_bridge.sumocfg` | Config filename. Sets `SUMO_CONFIG_FILE` in `adore.env` |
+| `SUMO_HOME` | `/usr/share/sumo` | Path to SUMO installation |
+
+## Starting
+
+The bridge is managed as a host process via `start_sumo_bridge.sh`. It is started automatically when `SUMO_BRIDGE_ENABLE=true` is set in `adore.env`. The script is idempotent -- if the bridge is already running it exits cleanly.
+
+```bash
+bash tools/start_sumo_bridge.sh
+```
+
+Logs and PID are written to `${SOURCE_DIRECTORY}/.log/sumo_bridge/`.
+
+## ROS Parameters
+
+| Parameter | Type | Default | Description |
+|---|---|---|---|
+| `sumo_config_file` | `string` | `""` | Absolute path to the `.sumocfg` file. Required. |
+| `sumo_step_length` | `double` | `0.01` | SUMO simulation step length in seconds |
+| `use_gui` | `bool` | `false` | Launch `sumo-gui` instead of headless `sumo` |
+
+## Topics
+
+| Topic | Type | Direction | Description |
+|---|---|---|---|
+| `traffic_participants` | `TrafficParticipantSet` | publish | SUMO vehicles converted to ADORe traffic participants |
+| `vehicle_state/traffic_participant` | `TrafficParticipant` | subscribe | Ego vehicle state injected into SUMO |
+
+## Launch
+
+Use `sumo_test.launch.py` for a full scenario including the ego vehicle stack and visualizer. The launch file reads `SUMO_CONFIG_FILE` and `SUMO_CONFIG_DIRECTORY` from the environment.
+
+```bash
+make cli
+cd adore_scenarios/simulation_scenarios
+ros2 launch sumo_bridge sumo_test.launch.py
+```
+
+To enable the SUMO GUI, set `use_gui:=True` on the `sumo_bridge` node in the launch file or pass it directly:
+
+```bash
+ros2 run sumo_bridge sumo_bridge --ros-args \
+ --param "sumo_config_file:=" \
+ --param "use_gui:=true"
+```
diff --git a/documentation/technical_reference_manual/system_and_development/system_and_development.md b/documentation/technical_reference_manual/system_and_development/system_and_development.md
new file mode 100644
index 00000000..251ba4df
--- /dev/null
+++ b/documentation/technical_reference_manual/system_and_development/system_and_development.md
@@ -0,0 +1,7 @@
+
+
+
+## ROS Nodes
+
+
+## User Libraries
diff --git a/documentation/technical_reference_manual/system_and_development/system_tests.md b/documentation/technical_reference_manual/system_and_development/system_tests.md
index 564f71fd..f2b95663 100644
--- a/documentation/technical_reference_manual/system_and_development/system_tests.md
+++ b/documentation/technical_reference_manual/system_and_development/system_tests.md
@@ -1,336 +1,88 @@
-````markdown
-# System & end-to-end tests
+# ADORe System Tests
-This document describes the **system / end-to-end testing layer** in this repository and how to extend it with new tests.
+ADORe includes shell-based system tests validate high-level features including
+scenario execution, model checking, and API functionality. These tests run
+automatically as part of the GitHub CI workflow.
-The audience is developers who are already comfortable with unit / integration tests inside individual ROS 2 packages and want to test the **whole system**: API, long-running processes, simulations, GUI, external tools, etc.
+## Prerequisites
----
+- GNU Make and docker are installed
+- ADORe repository cloned locally
+- ADORe is built
+- ADORe CLI stopped (if running)
-## What system tests are for
+## Running Tests
-System tests here are:
-
-- **Black-box**: they interact with the running ADORe stack via public interfaces
- (HTTP API, CLI tools, GUI/X11, files on disk…).
-- **End-to-end**: they aim to cover the full path from an external stimulus to the observable behaviour of the system.
-- **Slow(er) but high value**: they are allowed to take longer than unit tests, but should still be stable, deterministic and CI-friendly.
-
-Typical things to validate:
-
-- “Is the API up and responding with valid JSON?”
-- “Can we start a scenario and get sensible model-checking results?”
-- “Can GUI tools inside the container talk to the host X server?”
-- “Do our compliance / scanning tools pass with the current tree?”
-
----
-
-## Where system tests live
-
-System tests are implemented as shell scripts under:
-
-```text
-tools/system_tests/
- run_system_tests.sh # test runner / harness
- test_helpers.sh # shared helpers (logging, colors, API readiness, etc.)
- NN_some_feature_test.sh # individual test scripts (you add more here)
- ...
-````
-
-### Entry point
-
-From the repo root, the canonical way to run system tests is:
+From the ADORe repository root:
```bash
-just test_system
-```
-
-`Justfile` defines:
+# Stop ADORe CLI if running
+make stop
-```make
-# Run system tests
-test_system:
- ./tools/system_tests/run_system_tests.sh
+# Execute all system tests
+make test
```
-So you can also invoke the runner directly:
-
-```bash
-./tools/system_tests/run_system_tests.sh
-```
-
-The runner script is responsible for:
-
-* Starting the system under test (e.g. API server) before any tests run.
-* Discovering test functions and executing them sequentially.
-* Setting an appropriate process exit code based on pass/fail.
-* Stopping the system under test again at the end.
-
----
-
-## Test harness behaviour
-
-The harness (`run_system_tests.sh`) behaves roughly like this:
-
-1. **Start the system under test**
-
- It uses `just` commands (for example `just api_start` / `just api_stop`) to bring up and tear down the environment the tests rely on.
-
-2. **Load helpers and test scripts**
-
- It sources:
-
- * `test_helpers.sh` – common helpers and configuration.
- * All `*_test.sh` files in the same directory – where each file can define one or more test functions.
-
-3. **Discover test functions**
-
- It collects all shell functions with a name ending in `_test`, sorts them, and treats each as an individual test case.
-
- That means:
+## Writing System Tests
- * You don’t need to register a new test anywhere.
- * As long as the function name ends in `_test` and the file is `*_test.sh`, it will be picked up.
-
-4. **Execute tests**
-
- Each test function is executed in a subshell. The harness:
-
- * Prints which test is running.
- * Consider the test **passed** if the function returns exit code `0`.
- * Consider the test **failed** if the function returns a non-zero code.
- * Continues to the next test even if one fails.
-
- At the end it exits with:
-
- * `0` if all tests passed.
- * `1` if any test failed.
-
-5. **Stop the system under test**
-
- After all tests, the harness calls the appropriate `just` command to stop the system (e.g. shutting down the API process).
-
----
-
-## Shared helpers
-
-`test_helpers.sh` provides shared functionality for all system tests, for example:
-
-* Simple formatting helpers (bold / coloured output).
-* Common configuration variables (e.g. log directory, timeouts).
-* Routines to wait for the system or API to be “ready” (polling a status endpoint until it responds, with a timeout).
-
-When writing new tests:
-
-* Always source `test_helpers.sh` via the runner (you don’t need to do this manually; the runner already does).
-* Prefer using the existing helpers rather than re-implementing things like “wait for API to be ready”.
-* If you need reusable logic for multiple system tests, extend `test_helpers.sh` rather than copying functions between `*_test.sh` files.
-
----
-
-## Naming and structure conventions
-
-### File naming
-
-System test scripts follow this pattern:
-
-```text
-tools/system_tests/NN_descriptive_name_test.sh
-```
-
-Guidelines:
-
-* `NN_` is a **two-digit prefix** (e.g. `01_`, `02_`, …) that controls ordering.
- Use it if you care about approximate execution order (e.g. smoke tests first).
-* `descriptive_name` should describe the theme of the script (“api_health”, “scenario_simulation”, “x11_integration”, etc.).
-* `_test.sh` suffix marks the file as a test script.
-
-You can have more than one test function in a single file if it makes sense to group related checks.
-
-### Function naming
-
-A function is treated as a test if its name ends in `_test`, e.g.:
+Add new test functions to `.tests` in the repository root.
+### Test Function Naming Convention
+All system tests have the following function name convention:
```bash
-smoke_test()
-scenario_model_checking_test()
-gui_integration_test()
+__test
```
-Guidelines:
-
-* Use a unique, descriptive name — it will appear in the harness output.
-* Prefer one “main” test function per file unless you have a clear grouping.
-* Helper functions **should not** end in `_test` (so they aren’t auto-executed).
-
-### Test function contract
+- **Index**: Controls execution order (tests run alphabetically)
+- **Name**: Descriptive test identifier
+- **Suffix**: Must end with `_test` for automatic execution
-Each test function:
+### Environment
-* **Takes no arguments.**
-* Performs whatever actions it needs (HTTP calls, CLI invocations, etc.).
-* Prints human-readable output describing what it’s doing and what it found.
-* Returns:
+- `LOG_DIRECTORY`: Available environment variable for log output
+- Log files: Write to `${LOG_DIRECTORY}/.log`
+- Return codes: `0` for success, `1` for failure
- * `0` on success.
- * A non-zero exit code on failure.
-
-The harness uses this exit code to decide whether the test passed or failed.
-
----
-
-## What a new system test typically looks like
-
-Here is a recommended skeleton for a new test function:
+### Test Template
```bash
-my_new_feature_test() {
- local name="My new feature behaves end-to-end"
- local description="Short description of what this system test validates."
- local status=""
- local message=""
-
- printf "\n"
- printf " Test: %s\n" "${name}"
- printf " Description: %s\n" "${description}\n"
-
- # Optional: wait for API/system readiness using a helper
- # if ! wait_for_api_ready; then
- # printf " Status: %s - system not ready\n" "$(bold "$(red "FAILED")")"
- # return 1
- # fi
-
- # --- Arrange / Act / Assert section ---------------------------------
- # 1. Arrange: put the system into the desired initial state
- # 2. Act: call the API / CLI / GUI action you want to test
- # 3. Assert: inspect responses, logs, or side effects
-
- # Example pseudo-check:
- # if ! curl ...; then
- # message="Some failure description"
- # status="$(bold "$(red "FAILED")")"
- # printf " Message:\n %s\n" "${message}"
- # printf " %-77s %s\n" "Status:" "${status}"
- # return 1
- # fi
-
- message="Short success summary (what we actually validated)."
- status="$(bold "$(green "PASSED")")"
-
- printf " Message:\n %s\n" "${message}"
- printf " %-77s %s\n" "Status:" "${status}"
-
- return 0
+XX_test_name_test() {
+ local action=test_action
+ local name="Test Name Here"
+ local description="This test runs 'make test_command' and validates the output."
+ local status=""
+ local message=""
+ local test_log_file="${LOG_DIRECTORY}/test_command.log"
+
+ printf "\n"
+ printf " Test: %s\n" "${name}"
+ printf " Description: %s\n" "${description}"
+ printf " This test runs [detailed description of what the test validates]. \n"
+ printf " Starting make test_command...\n"
+
+ if ! make test_command >"$test_log_file" 2>&1; then
+ status=$(bold $(red "FAILED"))
+ message=" Make test_command command failed. See log: ${test_log_file}"
+ cat "${test_log_file}"
+ printf " Message:\n%s\n" "$message"
+ printf " %-77s %s\n" "Status:" "${status}"
+ exit 1
+ fi
+
+ status=$(bold $(green "PASSED"))
+ message=" Make test_command succeeded. Tail of log shown below:"
+ printf " Message:\n%s\n" "$message"
+ tail -15 "${test_log_file}"
+ printf " %-77s %s\n" "Status:" "${status}"
+ printf " See the test_command log for full details: %s\n" "$test_log_file"
+ exit 0
}
```
-Feel free to adapt the formatting, as long as:
-
-* The function’s exit code correctly represents pass/fail.
-* Output is understandable by a human reading CI logs.
-
----
-
-## Logging and diagnostics
-
-System tests should be **debuggable** when they fail. Some general recommendations:
-
-* Write richer machine-readable logs (JSON, structured text) into a shared log directory; keep console output concise.
-* Include enough context in the log file names (e.g. the domain of the check).
-* When a test fails, print the tail or a short summary of the relevant log(s) to stdout so CI logs contain a hint without having to dig into artefacts.
-
-The helpers script defines where logs are stored by default and may allow overriding the log directory via an environment variable (e.g. for CI vs local runs). Check `test_helpers.sh` for the exact variable names and behaviour.
-
----
-
-## What to test at the system level
-
-Some ideas for system-level checks you might want to add:
-
-* **API behaviour**
-
- * Smoke tests for key endpoints (status, scenario control, configuration).
- * Schema / field sanity checks (e.g. unique IDs, expected ranges).
- * Error handling for invalid input.
-
-* **Scenario execution**
-
- * Start a scenario, let it run for some time, check that:
-
- * Expected outputs (reports, artefacts, logs) are generated.
- * No obvious error states are present in responses.
- * Round-trip across multiple API calls (start, query progress, stop, retrieve results).
-
-* **Integration with external tools**
-
- * Running internal scanning / analysis tools and checking they succeed.
- * Verifying required OS-level functionality (e.g. presence of system utilities, access to required resources).
-
-* **GUI / X11 integration**
-
- * Launch a minimal GUI app inside the dev/CI environment and verify it can talk to the host X server.
- * Confirm a window appears in the X11 tree.
-
-* **Non-functional behaviour**
-
- * Very coarse performance sanity checks (e.g. “scenario finishes within N seconds on CI hardware”).
- * Resource usage thresholds (if those can be tested reliably).
-
-When deciding whether something belongs in a system test versus a unit / integration test, ask:
-
-> “Does this require the **whole stack** to be running and realistic user workflows to be exercised?”
-
-If the answer is yes, it probably belongs here.
-
----
-
-## Design guidelines for new system tests
-
-* **Idempotent and repeatable**
- Tests should be safe to run multiple times in a row, and in any order. Avoid leaving behind state that breaks subsequent runs.
-
-* **Isolated**
- Avoid relying on side effects from previous tests; set up the state you need in each test.
-
-* **Deterministic**
- Avoid flakiness (e.g. random sleep durations with no checks, reliance on external services that may be down, unbounded timeouts).
-
-* **Configurable**
- Use / extend environment variables for things like:
-
- * API base URL
- * timeouts
- * log locations
- so that CI and local runs can tweak behaviour without changing code.
-
-* **Fast enough for CI**
- Individual system tests can be slower than unit tests, but should still complete in a reasonable time. If something needs several minutes, consider splitting it or enabling it only in certain pipelines.
-
-* **Use shared helpers**
- If you find yourself copying the same snippets (curl patterns, JSON extraction, polling loops), move them into `test_helpers.sh`.
-
----
-
-## Adding a new system test: checklist
-
-1. **Create a new file** under `tools/system_tests/` with the pattern:
-
- ```text
- NN_my_feature_test.sh
- ```
-
-2. **Add one or more functions** in that file whose names end in `_test`.
-
-3. **Use or extend shared helpers** in `test_helpers.sh` instead of duplicating logic.
-
-4. **Make the function self-contained**:
-
- * Arrange, act, assert.
- * Print a clear message on success and on failure.
- * Return `0` for success, non-zero for failure.
-
-5. **Run locally**:
+### Best Practices
- ```bash
- just test_system
- ```
\ No newline at end of file
+- Keep test functions focused on a single feature or scenario
+- Provide clear, descriptive test names and descriptions
+- Log all output for debugging purposes
+- Display meaningful error messages on failure
+- Show partial log output (tail) on success for quick verification
diff --git a/documentation/technical_reference_manual/system_and_development/unit_testing.md b/documentation/technical_reference_manual/system_and_development/unit_testing.md
deleted file mode 100644
index b9a5598a..00000000
--- a/documentation/technical_reference_manual/system_and_development/unit_testing.md
+++ /dev/null
@@ -1,432 +0,0 @@
-````markdown
-# Testing in ADORe
-
-This document explains how tests are structured in ADORe, using:
-
-- `adore_math` – a pure C++ library package
-- `adore_math_conversions` – a ROS 2–integrated C++ package
-
-and how to run them via `colcon` and the `Justfile` helpers.
-
-This document focuses on **unit & package-level tests**, with system tests briefly referenced at the end.
-
----
-
-## Where tests live
-
-Every package is responsible for its own tests:
-
-- Tests go into a `test/` directory **next to** `src/` and `include/`.
-- CMake wires them up using `ament_cmake_gtest`.
-
-### Example: `adore_math`
-
-Structure:
-
-```text
-adore_math/
- include/adore_math/...
- src/...
- test/
- angle_test.cpp
- distance_test.cpp
- polynomian_test.cpp
- CMakeLists.txt
-````
-
-Key CMake snippet in `adore_math/CMakeLists.txt`:
-
-```cmake
-# Tests
-# -------------------------------------------------------------------
-if(BUILD_TESTING)
- find_package(ament_cmake_gtest REQUIRED)
-
- # Library under test, used by test/CMakeLists.txt
- set(ADORE_TEST_LIB_TARGET ${PROJECT_NAME})
-
- add_subdirectory(test)
-endif()
-```
-
-The `test/CMakeLists.txt` then discovers test files and registers them:
-
-```cmake
-# Tests for adore_math
-# Expects:
-# - ADORE_TEST_LIB_TARGET set by parent CMakeLists.txt
-# - ament_cmake_gtest already found
-
-file(GLOB ADORE_MATH_TEST_SOURCES CONFIGURE_DEPENDS
- "*.cpp"
-)
-
-foreach(test_src ${ADORE_MATH_TEST_SOURCES})
- get_filename_component(test_name ${test_src} NAME_WE)
-
- ament_add_gtest(${test_name} ${test_src})
-
- if(TARGET ${test_name})
-
- target_link_libraries(${test_name}
- ${ADORE_TEST_LIB_TARGET}
- Eigen3::Eigen
- )
-
- target_include_directories(${test_name}
- PRIVATE
- ${CMAKE_CURRENT_SOURCE_DIR}/../include
- )
- endif()
-endforeach()
-```
-
-**Takeaways for library-style packages:**
-
-* Put tests in `test/`.
-* Use a `test/CMakeLists.txt` with `ament_add_gtest`.
-* Link tests against the library target (`${PROJECT_NAME}` or similar).
-* Use `if(BUILD_TESTING)` in the main `CMakeLists.txt` and call `add_subdirectory(test)`.
-
----
-
-### Example: `adore_math_conversions`
-
-Structure:
-
-```text
-adore_math_conversions/
- include/...
- src/adore_math_conversions.cpp
- test/test_adore_math_conversions.cpp
-```
-
-Key CMake snippet in `adore_math_conversions/CMakeLists.txt`:
-
-```cmake
-# Tests
-if(BUILD_TESTING)
- find_package(ament_cmake_gtest REQUIRED)
-
- ament_add_gtest(test_adore_math_conversions
- test/test_adore_math_conversions.cpp
- )
-
- if(TARGET test_adore_math_conversions)
- # Link against the library under test so it reuses the same code
- target_link_libraries(test_adore_math_conversions
- ${PROJECT_NAME}
- )
- endif()
-endif()
-
-ament_package()
-```
-
-**Takeaways for node / conversion / ROS packages:**
-
-* Put tests in `test/` and list them directly in the main `CMakeLists.txt` or follow adore_decision_maker structure with separate `CMakeLists.txt` in test directory.
-* Use `ament_add_gtest( test/.cpp)`.
-* Link against `${PROJECT_NAME}` (or the relevant library target).
-
----
-
-## How to write C++ tests
-
-Both `adore_math` and `adore_math_conversions` use **GoogleTest (GTest)** via `ament_cmake_gtest`.
-
-### Test file template
-
-A typical test file looks like this:
-
-```cpp
-
-#include
-
-// Include the code under test
-#include
-
-TEST(Angles, DegreesToRadiansAndBack)
-{
- const double deg = 100.0;
- const double rad = adore::math::to_radians(deg);
-
- EXPECT_NEAR(adore::math::to_degrees(rad), deg, 1e-9);
-}
-```
-
-For more complex tests, you can use fixtures (`TEST_F`) or helpers:
-
-```cpp
-class PiecewisePolynomialTest : public ::testing::Test
-{
-protected:
- void SetUp() override
- {
- // Prepare x/y data, etc.
- }
-
- // Fields: cubicSpline, xValues, yValues, ...
-};
-
-TEST_F(PiecewisePolynomialTest, InterpolationAccuracy)
-{
- std::vector y_interpolated;
- auto result = cubicSpline.linearPiecewise(xValues, yValues);
- cubicSpline.LinearPiecewiseEvaluation(y_interpolated, x_hs, result);
-
- for (size_t i = 0; i < x_hs.size(); ++i)
- {
- double expected = 2 * x_hs[i] + std::sin(x_hs[i]);
- EXPECT_NEAR(y_interpolated[i], expected, 0.5);
- }
-}
-```
-
-### Guidelines / expectations
-
-* **Small and deterministic**
-
- * Avoid non-deterministic behavior (time, randomness, global state).
- * If you measure performance, keep it short and deterministic – it still needs to pass in CI.
-
-* **Round-trip & invariants**
-
- * The conversion tests in `adore_math_conversions` use **round-trip checks**:
-
- * convert C++ → ROS msg → C++ and compare the result.
- * For math utilities:
-
- * test symmetry, bounds, and known identities (e.g. degrees ↔ radians).
-
-* **Naming**
-
- * Prefer `TEST(Category, Behavior)` where `Category` is a class/module and `Behavior` is what you expect.
- * File names generally mirror the unit under test: `distance_test.cpp`, `angle_test.cpp`, …
-
-* **Include paths**
-
- * Include public headers from `include/` and avoid reaching into `src/` whenever possible.
- * If you really need internal details, consider adding a dedicated internal header rather than including `.cpp` directly.
-
----
-
-## Running tests
-
-### Running tests inside the dev container
-
-The dev container has ROS and all build tools installed.
-
-1. Start or attach to the dev container:
-
- ```bash
- just dev
- ```
-
-2. Inside the container, from the repo root:
-
- * Run the whole test suite:
-
- ```bash
- just test_ws
- ```
-
- (This uses the same `Justfile` and will run `colcon test` inside the container.)
-
- * Or run `colcon` manually:
-
- ```bash
- cd .colcon_workspace
- colcon test --packages-select adore_math adore_math_conversions
- colcon test-result --all --verbose
- ```
-
----
-
-### Running tests for a single package
-
-From the repo root (host or dev container):
-
-```bash
-cd .colcon_workspace
-colcon test --packages-select adore_math
-colcon test-result --all --verbose
-```
-
-Replace `adore_math` with `adore_math_conversions` or any other package name.
-
-**Tips:**
-
-* You can pass multiple packages to `--packages-select`:
-
- ```bash
- colcon test --packages-select adore_math adore_math_conversions
- ```
-* If you are iterating on a single test, this makes the cycle much faster than running the whole workspace.
-
----
-
-### Running a single test binary
-
-Sometimes you just want to run one specific test executable directly (e.g., to debug with `gdb`).
-
-After building and running `colcon test` at least once, the test binaries will be in the `build/` directory. For example:
-
-```bash
-cd .colcon_workspace
-./build/adore_math/angle_test
-./build/adore_math_conversions/test_adore_math_conversions
-```
-
-You can also attach a debugger:
-
-```bash
-gdb --args ./build/adore_math/angle_test
-```
-
-> Path details are managed by `ament_cmake_gtest` and `colcon` – if in doubt, inspect the `build/` directory or re-run `colcon test` to regenerate.
-
----
-
-### System tests
-
-System tests are orchestrated separately:
-
-```bash
-just test_system
-```
-
-please see [System Tests](technical_reference_manual/system_and_development/system_tests.md)
-
----
-
-### CI: tests + docs
-
-For a local approximation of CI:
-
-```bash
-just ci
-```
-
-This:
-
-* Uses the CI Docker image.
-* Runs tests and documentation checks via `.docker/scripts/run_ci.sh`.
-
-Use this when you want a **“what CI will do”** check before pushing changes.
-
----
-
-## 5. How to add tests to a new package
-
-### Step 1: Create `test/` directory
-
-Inside your package:
-
-```text
-my_package/
- include/...
- src/...
- test/
- my_feature_test.cpp
-```
-
-### Step 2: Add GTest code
-
-In `test/my_feature_test.cpp`:
-
-```cpp
-#include
-#include
-
-TEST(MyFeature, DoesWhatItSays)
-{
- const auto result = my_package::do_thing(42);
- EXPECT_EQ(result, 123);
-}
-```
-
-Follow the patterns from `adore_math` and `adore_math_conversions`.
-
-### Step 3: Wire it up in CMake
-
-**Option A: test subdirectory (library-style, like `adore_math`)**
-
-`CMakeLists.txt`:
-
-```cmake
-if(BUILD_TESTING)
- find_package(ament_cmake_gtest REQUIRED)
- set(ADORE_TEST_LIB_TARGET ${PROJECT_NAME})
- add_subdirectory(test)
-endif()
-```
-
-`test/CMakeLists.txt` (very similar to `adore_math`):
-
-```cmake
-file(GLOB MY_PACKAGE_TEST_SOURCES CONFIGURE_DEPENDS
- "*.cpp"
-)
-
-foreach(test_src ${MY_PACKAGE_TEST_SOURCES})
- get_filename_component(test_name ${test_src} NAME_WE)
- ament_add_gtest(${test_name} ${test_src})
-
- if(TARGET ${test_name})
- target_link_libraries(${test_name}
- ${ADORE_TEST_LIB_TARGET}
- # extra deps...
- )
- endif()
-endforeach()
-```
-
-**Option B: direct registration (like `adore_math_conversions`)**
-
-`CMakeLists.txt`:
-
-```cmake
-if(BUILD_TESTING)
- find_package(ament_cmake_gtest REQUIRED)
-
- ament_add_gtest(test_my_feature
- test/my_feature_test.cpp
- )
-
- if(TARGET test_my_feature)
- target_link_libraries(test_my_feature
- ${PROJECT_NAME}
- )
- endif()
-endif()
-```
-
-### Step 4: Run the tests
-
-From the repo root:
-
-```bash
-just test_ws
-# or
-cd .colcon_workspace
-colcon test --packages-select my_package
-colcon test-result --all --verbose
-```
-
----
-
-## 6. Summary
-
-* **Tests live in `test/` inside each package.**
-* **Use GTest via `ament_cmake_gtest`** and follow the patterns shown in:
-
- * `adore_math/test/CMakeLists.txt`
- * `adore_math_conversions/CMakeLists.txt`
-* **Run tests** using:
-
- * `just test_ws` – all unit tests in the workspace.
- * `colcon test --packages-select ` – a specific package.
- * `just test_system` – system-level tests.
- * `just ci` – approximate CI: tests + docs, in a container.
-* **Write tests that are small, deterministic, and focused on invariants and round-trips**, mirroring the approach in `adore_math` and `adore_math_conversions`.
diff --git a/requirements.ppa b/requirements.ppa
new file mode 100644
index 00000000..c930a800
--- /dev/null
+++ b/requirements.ppa
@@ -0,0 +1,6 @@
+## User APT/system PPAs for the ADORe cli
+
+# Add any necessary APT PPA dependencies here, one dependency per line
+
+## Required to install helix editor see: http://docs.helix-editor.com/package-managers.html#ubuntudebian
+ppa:maveonair/helix-editor
diff --git a/requirements.system b/requirements.system
new file mode 100644
index 00000000..a8c2f6fd
--- /dev/null
+++ b/requirements.system
@@ -0,0 +1,63 @@
+## User APT/system packages for the ADORe cli
+
+# Add any necessary APT dependencies here, one dependency per line, and invoke
+# `make build` to rebuild the ADORe CLI docker context to make the changes take
+# effect.
+
+
+# Development Tools
+vim
+curl
+wget
+htop
+fzf
+gdb
+gdbserver
+clang-format
+clang-tidy
+cpplint
+cppcheck
+jq
+tree
+
+# Requires helix ppa ppa:maveonair/helix-editor
+helix
+
+# Language servers and intellicense
+clangd
+python3-pylsp
+
+
+## Plotting
+ros-${ROS_DISTRO}-plotjuggler-ros
+ros-${ROS_DISTRO}-plotjuggler
+ros-${ROS_DISTRO}-rosbridge-suite
+python3-matplotlib
+python3-pandas
+
+## Network debugging tools
+telnet
+netcat-traditional
+traceroute
+nmap
+inetutils-ping
+net-tools
+
+#ROS
+ros-${ROS_DISTRO}-ament-index-cpp
+ros-${ROS_DISTRO}-ament-index-cpp
+ros-${ROS_DISTRO}-tracetools
+ros-${ROS_DISTRO}-tracetools-acceleration
+ros-${ROS_DISTRO}-tracetools-acceleration-dbgsym
+ros-${ROS_DISTRO}-tracetools-analysis
+ros-${ROS_DISTRO}-tracetools-dbgsym
+ros-${ROS_DISTRO}-tracetools-image-pipeline
+ros-${ROS_DISTRO}-tracetools-image-pipeline-dbgsym
+ros-${ROS_DISTRO}-tracetools-launch
+ros-${ROS_DISTRO}-tracetools-read
+ros-${ROS_DISTRO}-tracetools-test
+ros-${ROS_DISTRO}-tracetools-trace
+
+# Carla
+ros-${ROS_DISTRO}-rviz2
+
diff --git a/ros2_workspace/Makefile b/ros2_workspace/Makefile
new file mode 100644
index 00000000..a193187e
--- /dev/null
+++ b/ros2_workspace/Makefile
@@ -0,0 +1,124 @@
+SHELL := /bin/bash
+MAKEFLAGS += --no-print-directory
+
+# --- Dependency Checks ---
+.PHONY: check_ros2
+check_ros2:
+ @command -v ros2 >/dev/null 2>&1 || { \
+ echo "ERROR: 'ros2' command not found. Call this inside the ADORe CLI docker context to avoid this error."; \
+ exit 1; \
+ }
+
+.PHONY: check_colcon
+check_colcon:
+ @command -v colcon >/dev/null 2>&1 || { \
+ echo "ERROR: 'colcon' command not found. Call this inside the ADORe CLI docker context to avoid this error."; \
+ exit 1; \
+ }
+
+# A combined target for convenience
+.PHONY: check_deps
+check_deps: check_ros2 check_colcon
+
+
+ROOT_DIR := $(shell dirname "$(realpath $(firstword $(MAKEFILE_LIST)))")
+COLCON_DEFAULTS := $(ROOT_DIR)/colcon_defaults.yaml
+COLCON_DEFAULTS_TEMPLATE := $(ROOT_DIR)/colcon_defaults.yaml.template
+RAM_KB := $(shell awk '/MemAvailable/{print $$2}' /proc/meminfo)
+RAM_GB := $(shell awk '/MemAvailable/{print int($$2/1024/1024)}' /proc/meminfo)
+PARALLEL_WORKERS := $(shell \
+ mem_workers=$$(awk '/MemAvailable/{print int($$2/1024/1024/2)}' /proc/meminfo); \
+ cpu_workers=$$(nproc); \
+ echo $$(( mem_workers < cpu_workers ? mem_workers : cpu_workers )))
+
+define patch_parallel_workers
+ @sed -i 's/^\(\s*parallel-workers:\s*\).*/\1$(PARALLEL_WORKERS)/' $(COLCON_DEFAULTS)
+endef
+
+define ensure_colcon_defaults
+ @if [ ! -f $(COLCON_DEFAULTS) ]; then \
+ cp $(COLCON_DEFAULTS_TEMPLATE) $(COLCON_DEFAULTS); \
+ fi
+endef
+
+.PHONY: help
+help:
+ @printf "Usage: make \033[36m\033[0m\n%s\n" "$$(awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-10s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) | sort | uniq)"
+
+.PHONY: build
+build: check_deps ## Build all ROS2 packages
+ $(call ensure_colcon_defaults)
+ $(call patch_parallel_workers)
+ @echo "Detected RAM: $(RAM_KB) kB ($(RAM_GB) GB)"
+ @echo "Parallel workers: $(PARALLEL_WORKERS)"
+ source /opt/ros/${ROS_DISTRO}/setup.bash && COLCON_DEFAULTS_FILE=$(COLCON_DEFAULTS) colcon build
+ @echo "✅ ROS workspace build complete"
+ touch build/build.success
+
+.PHONY: build_release
+build_release: check_deps ## Build all ROS2 packages in Release mode
+ $(call ensure_colcon_defaults)
+ $(call patch_parallel_workers)
+ @echo "Detected RAM: $(RAM_KB) kB ($(RAM_GB) GB)"
+ @echo "Parallel workers: $(PARALLEL_WORKERS)"
+ source /opt/ros/${ROS_DISTRO}/setup.bash && COLCON_DEFAULTS_FILE=$(COLCON_DEFAULTS) colcon build && source install/local_setup.sh
+
+.PHONY: build_single_core
+build_single_core: check_deps ## Build all ROS2 packages, force single-threaded build regardless of RAM
+ @echo "Executor mode: --executor sequential"
+ source /opt/ros/${ROS_DISTRO}/setup.bash && colcon build --executor sequential
+
+.PHONY: clean
+clean: ## Clean the ROS2 workspace
+ rm -rf build/*
+ rm -rf log/*
+ rm -rf install/*
+
+
+
+.PHONY: clean_build
+clean_build: clean build ## Clean and build all ROS2 packages
+
+.PHONY: test
+test: check_colcon ## Run ROS2 package tests
+ colcon test --pytest-args "-m 'not linter'" --event-handlers console_direct+
+
+.PHONY: ccache_stats
+ccache_stats: ## Print out CCache Stats
+ ccache -s -v
+
+.PHONY: launch
+launch: ## Launch a ROS2 scenario
+ @base_dir="../adore_scenarios"; \
+ export PYTHONPATH="$$PYTHONPATH:$$base_dir"; \
+ selected_file=$$(find $$base_dir -type f -name "*.py" | grep -v "/integration_tests/" | sed 's|^\.\./adore_scenarios/||' | fzf --prompt="Select a scenario to launch: "); \
+ if [ -n "$$selected_file" ]; then \
+ echo "Launching $$selected_file..."; \
+ ros2 launch "$$base_dir/$$selected_file"; \
+ else \
+ echo "No file selected."; \
+ fi
+
+.PHONY: package
+package: ## Package all ROS2 nodes as Debian packages
+ bash tools/ros2_debian_packager.sh
+
+.PHONY: package_adore_ros2_msgs
+package_adore_ros2_msgs: ## Package adore_ros2_msgs as a Debian package
+ bash tools/ros2_debian_packager.sh "adore_ros2_msgs"
+ @echo "✅ adore_ros2_msgs packaging complete"
+ touch build/adore_ros2_msgs.package.success
+
+.PHONY: integration_tests
+integration_tests: ## Run pytest inside adore_scenarios
+ @base_dir="../adore_scenarios"; \
+ PYTHONPATH="$$PYTHONPATH:$$base_dir" pytest "$$base_dir"
+
+.PHONY: force_kill_ros2
+force_kill_ros2: ## Forcefully kill all ROS 2 processes
+ @echo "Forcefully killing all lingering ROS 2 nodes..."
+ @pkill -9 -f ros2 || echo "No ROS 2 nodes found."
+ @pkill -9 -f rclpy || echo "No Python-based ROS 2 nodes found."
+ @pkill -9 -f launch || echo "No ROS 2 launch processes found."
+ @pkill -9 -f colcon || echo "No lingering colcon processes found."
+ @echo "All done!!"
diff --git a/.colcon_workspace/colcon_defaults.yaml b/ros2_workspace/colcon_defaults.yaml.template
similarity index 62%
rename from .colcon_workspace/colcon_defaults.yaml
rename to ros2_workspace/colcon_defaults.yaml.template
index a93a4f0f..01287ac9 100644
--- a/.colcon_workspace/colcon_defaults.yaml
+++ b/ros2_workspace/colcon_defaults.yaml.template
@@ -1,12 +1,13 @@
build:
symlink-install: true
- continue-on-error: true
+ continue-on-error: false
+ parallel-workers: 2
cmake-args:
- - -DCMAKE_C_COMPILER_LAUNCHER=ccache
- -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
- -DCMAKE_POSITION_INDEPENDENT_CODE=ON
- -DCMAKE_BUILD_TYPE=Release
-
+ event-handlers:
+ - console_cohesion+
test:
event-handlers:
- - console_cohesion+
\ No newline at end of file
+ - console_direct+
diff --git a/ros2_workspace/src/adore_interfaces/carla_bridge b/ros2_workspace/src/adore_interfaces/carla_bridge
new file mode 160000
index 00000000..b9e1d2c6
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/carla_bridge
@@ -0,0 +1 @@
+Subproject commit b9e1d2c6c24276ab027cbdb6de6df697cd15875d
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/.gitignore b/ros2_workspace/src/adore_interfaces/hardware_monitor/.gitignore
new file mode 100644
index 00000000..3722712e
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/.gitignore
@@ -0,0 +1 @@
+hardware_monitor/__pycache__
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/README.md b/ros2_workspace/src/adore_interfaces/hardware_monitor/README.md
new file mode 100644
index 00000000..53e4c3ca
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/README.md
@@ -0,0 +1,107 @@
+# hardware_monitor
+
+ROS 2 package that publishes hardware inventory and runtime status for every node in a cluster. Designed to be consumed by the ADORe Mission Control dashboard or any subscriber.
+
+## Nodes
+
+| Node | Topic | Rate | Content |
+|------|-------|------|---------|
+| `hardware_discovery_node` | `/cluster//hardware_inventory` | 0.1 Hz | Static inventory: CPU, RAM, GPU/NPU, PCI, USB, serial, storage, sensors, network interfaces with addresses |
+| `hardware_status_node` | `/cluster//hardware_status` | 0.1 Hz | Runtime metrics: CPU load per-core, RAM/swap, GPU utilization, disk usage, temperatures, network I/O, NTP sync, process count |
+
+Both topics publish `std_msgs/String` containing a JSON object. The hostname segment in the topic name is sanitized (hyphens replaced with underscores); the original hostname is preserved inside the JSON payload under `"hostname"`.
+
+## Build
+
+```bash
+cd ros2_workspace
+colcon build --packages-select hardware_monitor
+source install/setup.bash
+pip3 install -r src/adore_interfaces/hardware_monitor/requirements.pip3
+```
+
+## Run
+
+```bash
+# Start both nodes via launch file
+./start.sh
+
+# Stop
+./stop.sh
+```
+
+Logs go to `${ROS_LOG_DIR}` → `${ROS_HOME}/log` → `~/.ros/log`.
+
+## Configuration
+
+`config/hardware_monitor.yaml` controls publish rates and warning thresholds:
+
+```yaml
+hardware_discovery_node:
+ ros__parameters:
+ publish_rate_hz: 0.1 # every 10 s is appropriate for static hardware
+
+hardware_status_node:
+ ros__parameters:
+ publish_rate_hz: 0.1
+ cpu_warn_percent: 85.0
+ ram_warn_percent: 85.0
+ disk_warn_percent: 85.0
+ temp_warn_celsius: 80.0
+```
+
+Set `node_name` in either section to override the hostname used as the topic segment and JSON identifier.
+
+## ADORe Mission Control integration
+
+`hardware_monitor_api.py` is a Flask blueprint that:
+- Starts and supervises both nodes **in-process** (no `ros2 run`, no PATH dependency)
+- Subscribes to all `/cluster/+/hardware_*` topics and caches data per host
+- Restarts crashed nodes automatically every 5 seconds
+
+
+```python
+from hardware_monitor.hardware_monitor_api import get_hardware_monitor_blueprint
+app.register_blueprint(get_hardware_monitor_blueprint())
+```
+
+### API endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| `GET` | `/api/hardware/hosts` | All known hosts and data availability |
+| `GET` | `/api/hardware/hosts//status` | Latest status for one host |
+| `GET` | `/api/hardware/hosts//inventory` | Latest inventory for one host |
+| `GET` | `/api/hardware/hosts//stream` | SSE live status stream for one host |
+| `GET` | `/api/hardware/stream` | SSE stream for all hosts `{host, data}` |
+| `GET` | `/api/hardware/nodes/status` | Supervisor process health |
+| `GET` | `/api/hardware/cache/status` | Cache freshness per host |
+
+### Standalone web UI
+
+```bash
+./start_web_ui.sh # default port 8889
+HARDWARE_MONITOR_UI_PORT=9000 ./start_web_ui.sh
+./stop_web_ui.sh
+```
+
+The UI is also embedded in ADORe Mission Control as the **Hardware Monitor** tab. It shows a cluster overview grid (one card per host) and per-host detail views for CPU, memory, network, storage, GPU/NPU, temperatures, and the full hardware inventory.
+
+## Package structure
+
+```
+hardware_monitor/
+├── hardware_monitor/
+│ ├── hardware_discovery_node.py # inventory publisher
+│ ├── hardware_status_node.py # runtime metrics publisher
+│ ├── hardware_utils.py # hardware probing (sysfs, psutil, lsblk, lsusb)
+│ └── hardware_monitor_api.py # Flask blueprint + node supervisor
+├── web_ui/
+│ ├── hardware_monitor_web.py # standalone Flask app
+│ ├── static/hardware_monitor_panel.js # self-contained dashboard component
+│ └── templates/hardware_monitor.html # standalone page template
+├── config/hardware_monitor.yaml
+├── launch/hardware_monitor.launch.py
+├── start.sh / stop.sh
+└── start_web_ui.sh / stop_web_ui.sh
+```
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/config/hardware_monitor.yaml b/ros2_workspace/src/adore_interfaces/hardware_monitor/config/hardware_monitor.yaml
new file mode 100644
index 00000000..52a09aa5
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/config/hardware_monitor.yaml
@@ -0,0 +1,21 @@
+hardware_discovery_node:
+ ros__parameters:
+ # Publish rate for /cluster/hardware_inventory.
+ # Hardware is static so 0.1 Hz (every 10 s) is the default.
+ publish_rate_hz: 0.1
+ # Override the hostname used as the node identifier in each message.
+ # Defaults to the system hostname when left unset.
+ # node_name: "my-robot"
+
+hardware_status_node:
+ ros__parameters:
+ # Publish rate for /cluster/hardware_status.
+ # Default: 0.1 Hz (every 10 s). Increase to 1.0 Hz for live monitoring.
+ publish_rate_hz: 0.1
+ # node_name: "my-robot"
+
+ # Threshold parameters - status fields change to "warn"/"error" above these
+ cpu_warn_percent: 85.0
+ ram_warn_percent: 85.0
+ disk_warn_percent: 85.0
+ temp_warn_celsius: 80.0
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/get_hardware_inventory.sh b/ros2_workspace/src/adore_interfaces/hardware_monitor/get_hardware_inventory.sh
new file mode 100644
index 00000000..c3fb3adc
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/get_hardware_inventory.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+ros2 topic echo --field data /cluster/hardware_inventory | grep -v "^---"
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/get_hardware_status.sh b/ros2_workspace/src/adore_interfaces/hardware_monitor/get_hardware_status.sh
new file mode 100644
index 00000000..72d9a9dc
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/get_hardware_status.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+ros2 topic echo --field data /cluster/hardware_status | grep -v "^---"
diff --git a/tools/lichtblick/3d_models/.gitignore b/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/__init__.py
similarity index 100%
rename from tools/lichtblick/3d_models/.gitignore
rename to ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/__init__.py
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_discovery_node.py b/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_discovery_node.py
new file mode 100644
index 00000000..377cbb3a
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_discovery_node.py
@@ -0,0 +1,111 @@
+import json
+import re
+import socket
+import threading
+
+import rclpy
+from rclpy.node import Node
+from rclpy.qos import QoSProfile, DurabilityPolicy, ReliabilityPolicy
+from std_msgs.msg import String
+
+from .hardware_utils import (
+ get_system_info,
+ get_cpu_info,
+ get_ram_info,
+ get_accelerator_info,
+ get_pci_devices,
+ get_usb_devices,
+ get_serial_devices,
+ get_network_interfaces,
+ get_storage_devices,
+ get_sensor_devices,
+ get_audio_devices,
+ get_input_devices,
+ get_power_info,
+)
+
+INVENTORY_TOPIC = '/cluster/hardware_inventory'
+
+
+class HardwareDiscoveryNode(Node):
+ def __init__(self, context=None):
+ super().__init__('hardware_discovery_node', context=context)
+
+ self.declare_parameter('publish_rate_hz', 0.1)
+ self.declare_parameter('node_name', '')
+
+ rate = self.get_parameter('publish_rate_hz').get_parameter_value().double_value
+ param_name = self.get_parameter('node_name').get_parameter_value().string_value.strip()
+ self._node_name = param_name if param_name else socket.gethostname()
+ # ROS 2 topic names only allow [a-zA-Z0-9_~{}] - sanitize for topic use
+ self._topic_host = re.sub(r'[^a-zA-Z0-9_]', '_', self._node_name)
+ self.get_logger().info(f'hardware_id resolved to: {self._node_name} (topic key: {self._topic_host})')
+
+ # Per-host topic: /cluster//hardware_inventory
+ inventory_topic = f'/cluster/{self._topic_host}/hardware_inventory'
+
+ latched_qos = QoSProfile(
+ depth=1,
+ durability=DurabilityPolicy.TRANSIENT_LOCAL,
+ reliability=ReliabilityPolicy.RELIABLE,
+ )
+ self._pub = self.create_publisher(String, inventory_topic, latched_qos)
+
+ self._payload: str | None = None
+ self._lock = threading.Lock()
+
+ threading.Thread(target=self._probe_hardware, daemon=True).start()
+
+ self._timer = self.create_timer(1.0 / rate, self._publish_inventory)
+ self.get_logger().info(f'HardwareDiscoveryNode started on {self._node_name} @ {rate} Hz → {inventory_topic}')
+
+ def _probe_hardware(self):
+ self.get_logger().info('Probing hardware inventory...')
+ try:
+ payload = self._build_inventory()
+ with self._lock:
+ self._payload = json.dumps(payload, indent=2, default=str)
+ self.get_logger().info('Hardware inventory ready')
+ except Exception as e:
+ self.get_logger().error(f'Hardware probe failed: {e}')
+
+ def _build_inventory(self) -> dict:
+ return {
+ 'hostname': self._node_name,
+ 'system': get_system_info(),
+ 'cpu': get_cpu_info(),
+ 'ram': get_ram_info(),
+ 'accelerators': get_accelerator_info(),
+ 'pci': get_pci_devices(),
+ 'usb': get_usb_devices(),
+ 'serial': get_serial_devices(),
+ 'network': get_network_interfaces(),
+ 'storage': get_storage_devices(),
+ 'sensors': get_sensor_devices(),
+ 'audio': get_audio_devices(),
+ 'input': get_input_devices(),
+ 'power': get_power_info(),
+ }
+
+ def _publish_inventory(self):
+ with self._lock:
+ payload = self._payload
+
+ if payload is None:
+ self.get_logger().debug('Inventory not ready yet; skipping publish')
+ return
+
+ self._pub.publish(String(data=payload))
+ self.get_logger().debug('Published hardware inventory')
+
+
+def main(args=None):
+ rclpy.init(args=args)
+ node = HardwareDiscoveryNode()
+ try:
+ rclpy.spin(node)
+ except KeyboardInterrupt:
+ pass
+ finally:
+ node.destroy_node()
+ rclpy.shutdown()
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_monitor_api.py b/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_monitor_api.py
new file mode 100644
index 00000000..134477a6
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_monitor_api.py
@@ -0,0 +1,345 @@
+"""
+hardware_monitor_api.py
+
+Flask blueprint for the hardware monitor cluster API.
+
+Nodes are launched in-process in threads rather than via `ros2 run`, so they
+work regardless of whether `ros2` is on PATH or the workspace is sourced in
+the shell that started the Flask server.
+"""
+
+import json
+import logging
+import os
+import sys
+import threading
+import time
+from datetime import datetime, timezone
+
+from flask import Blueprint, jsonify, Response
+
+logger = logging.getLogger(__name__)
+
+_PKG_DIR = os.path.dirname(os.path.abspath(__file__))
+_PKG_PARENT = os.path.dirname(_PKG_DIR)
+
+# ---------------------------------------------------------------------------
+# Per-host cache
+# ---------------------------------------------------------------------------
+
+_hosts: dict = {}
+_hosts_lock = threading.Lock()
+
+
+def _ts() -> str:
+ return datetime.now(timezone.utc).isoformat(timespec='seconds').replace('+00:00', 'Z')
+
+
+def _store(host: str, kind: str, data: dict):
+ ts = _ts()
+ with _hosts_lock:
+ if host not in _hosts:
+ _hosts[host] = {
+ 'status': None, 'status_ts': None,
+ 'inventory': None, 'inventory_ts': None,
+ }
+ _hosts[host][kind] = data
+ _hosts[host][f'{kind}_ts'] = ts
+
+
+# ---------------------------------------------------------------------------
+# Helpers
+# ---------------------------------------------------------------------------
+
+def _ensure_path():
+ if _PKG_PARENT not in sys.path:
+ sys.path.insert(0, _PKG_PARENT)
+
+
+def _make_executor(ctx):
+ """Return a SingleThreadedExecutor bound to ctx."""
+ from rclpy.executors import SingleThreadedExecutor
+ return SingleThreadedExecutor(context=ctx)
+
+
+def _spin_node(node, ctx):
+ """Spin a node using an executor tied to its context."""
+ executor = _make_executor(ctx)
+ executor.add_node(node)
+ executor.spin()
+
+
+# ---------------------------------------------------------------------------
+# In-process node supervisor
+# ---------------------------------------------------------------------------
+
+_node_threads: dict = {}
+_node_status: dict = {}
+_node_lock = threading.Lock()
+_supervisor_started = False
+
+
+def _run_node_thread(node_name: str):
+ _ensure_path()
+ restarts = 0
+ while True:
+ with _node_lock:
+ _node_status[node_name] = {
+ 'running': False, 'restarts': restarts, 'last_error': None,
+ }
+ ctx = None
+ try:
+ import rclpy
+ from rclpy.context import Context
+
+ ctx = Context()
+ rclpy.init(context=ctx)
+
+ if node_name == 'hardware_discovery_node':
+ from hardware_monitor.hardware_discovery_node import HardwareDiscoveryNode
+ node = HardwareDiscoveryNode(context=ctx)
+ elif node_name == 'hardware_status_node':
+ from hardware_monitor.hardware_status_node import HardwareStatusNode
+ node = HardwareStatusNode(context=ctx)
+ else:
+ raise ValueError(f'Unknown node: {node_name}')
+
+ with _node_lock:
+ _node_status[node_name]['running'] = True
+
+ logger.info(f'hardware_monitor: {node_name} running')
+ _spin_node(node, ctx)
+
+ except Exception as e:
+ err = str(e)
+ logger.error(f'hardware_monitor: {node_name} crashed: {err}', exc_info=True)
+ with _node_lock:
+ _node_status[node_name] = {
+ 'running': False, 'restarts': restarts, 'last_error': err,
+ }
+ finally:
+ if ctx is not None:
+ try:
+ import rclpy
+ rclpy.shutdown(context=ctx)
+ except Exception:
+ pass
+
+ restarts += 1
+ logger.info(f'hardware_monitor: restarting {node_name} in 5s (restart #{restarts})')
+ time.sleep(5.0)
+
+
+def _start_node_supervisor():
+ global _supervisor_started
+ if _supervisor_started:
+ return
+ _supervisor_started = True
+ for node_name in ('hardware_discovery_node', 'hardware_status_node'):
+ t = threading.Thread(
+ target=_run_node_thread, args=(node_name,),
+ daemon=True, name=f'hw-node-{node_name}',
+ )
+ t.start()
+ with _node_lock:
+ _node_threads[node_name] = t
+ logger.info(f'hardware_monitor: supervisor thread started for {node_name}')
+
+
+# ---------------------------------------------------------------------------
+# ROS subscriber thread
+# ---------------------------------------------------------------------------
+
+_ros_subscriber_started = False
+
+
+def _start_ros_subscribers():
+ global _ros_subscriber_started
+ if _ros_subscriber_started:
+ return
+ _ros_subscriber_started = True
+
+ def _spin():
+ _ensure_path()
+ ctx = None
+ try:
+ import rclpy
+ from rclpy.context import Context
+ from rclpy.node import Node
+ from rclpy.qos import QoSProfile, DurabilityPolicy, ReliabilityPolicy
+ from std_msgs.msg import String
+
+ ctx = Context()
+ rclpy.init(context=ctx)
+
+ latched_qos = QoSProfile(
+ depth=1,
+ durability=DurabilityPolicy.TRANSIENT_LOCAL,
+ reliability=ReliabilityPolicy.RELIABLE,
+ )
+
+ class _CacheNode(Node):
+ def __init__(self):
+ super().__init__('hardware_monitor_api', context=ctx)
+ self._subs: dict = {}
+ self._latched = latched_qos
+ self.create_timer(5.0, self._discover)
+ self._discover()
+
+ def _discover(self):
+ for name, types in self.get_topic_names_and_types():
+ if 'std_msgs/msg/String' not in types:
+ continue
+ if name in self._subs:
+ continue
+ parts = name.split('/')
+ # Expect: ['', 'cluster', '', 'hardware_inventory|hardware_status']
+ if len(parts) != 4 or parts[1] != 'cluster':
+ continue
+ kind = parts[3]
+ if kind not in ('hardware_inventory', 'hardware_status'):
+ continue
+ host = parts[2]
+ qos = self._latched if kind == 'hardware_inventory' else 10
+ self._subs[name] = self.create_subscription(
+ String, name,
+ lambda msg, h=host, k=kind: self._on_msg(msg, h, k),
+ qos,
+ )
+ logger.info(f'hardware_monitor: subscribed to {name}')
+
+ def _on_msg(self, msg, host: str, kind: str):
+ try:
+ data = json.loads(msg.data)
+ # Prefer the real hostname from the payload over the
+ # sanitized topic segment (e.g. 'ADORe-CLI' vs 'ADORe_CLI')
+ cache_key = data.get('hostname') or host
+ _store(cache_key, kind.replace('hardware_', ''), data)
+ except Exception as e:
+ logger.warning(f'hardware_monitor parse error ({host}/{kind}): {e}')
+
+ node = _CacheNode()
+ _spin_node(node, ctx)
+
+ except Exception as e:
+ logger.error(f'hardware_monitor: ROS subscriber crashed: {e}', exc_info=True)
+ finally:
+ if ctx is not None:
+ try:
+ import rclpy
+ rclpy.shutdown(context=ctx)
+ except Exception:
+ pass
+
+ threading.Thread(target=_spin, daemon=True, name='hw-monitor-ros').start()
+ logger.info('hardware_monitor: ROS subscriber thread started')
+
+
+# ---------------------------------------------------------------------------
+# Blueprint factory
+# ---------------------------------------------------------------------------
+
+def get_hardware_monitor_blueprint(url_prefix: str = '/api/hardware') -> Blueprint:
+ _start_node_supervisor()
+ _start_ros_subscribers()
+
+ bp = Blueprint('hardware_monitor', __name__, url_prefix=url_prefix)
+
+ @bp.route('/hosts')
+ def hosts():
+ with _hosts_lock:
+ result = {
+ host: {
+ 'status_available': e['status'] is not None,
+ 'status_ts': e['status_ts'],
+ 'inventory_available': e['inventory'] is not None,
+ 'inventory_ts': e['inventory_ts'],
+ }
+ for host, e in _hosts.items()
+ }
+ return jsonify({'hosts': result, 'count': len(result)})
+
+ @bp.route('/hosts//status')
+ def host_status(host):
+ with _hosts_lock:
+ entry = _hosts.get(host)
+ if not entry or entry['status'] is None:
+ return jsonify({'available': False, 'host': host,
+ 'message': f'No status data for {host}'}), 202
+ return jsonify({'available': True, 'host': host,
+ 'received_at': entry['status_ts'],
+ 'data': entry['status']})
+
+ @bp.route('/hosts//inventory')
+ def host_inventory(host):
+ with _hosts_lock:
+ entry = _hosts.get(host)
+ if not entry or entry['inventory'] is None:
+ return jsonify({'available': False, 'host': host,
+ 'message': f'No inventory data for {host}'}), 202
+ return jsonify({'available': True, 'host': host,
+ 'received_at': entry['inventory_ts'],
+ 'data': entry['inventory']})
+
+ @bp.route('/hosts//stream')
+ def host_stream(host):
+ def generate():
+ last_ts = None
+ yield 'retry: 3000\n\n'
+ while True:
+ with _hosts_lock:
+ entry = _hosts.get(host, {})
+ data = entry.get('status')
+ ts = entry.get('status_ts')
+ if data is not None and ts != last_ts:
+ last_ts = ts
+ yield f'data: {json.dumps({"host": host, "received_at": ts, "data": data})}\n\n'
+ else:
+ yield ': keepalive\n\n'
+ time.sleep(1.0)
+ return Response(generate(), mimetype='text/event-stream',
+ headers={'Cache-Control': 'no-cache', 'X-Accel-Buffering': 'no'})
+
+ @bp.route('/stream')
+ def stream_all():
+ def generate():
+ last_seen: dict = {}
+ yield 'retry: 3000\n\n'
+ while True:
+ with _hosts_lock:
+ snapshot = {
+ h: (e['status'], e['status_ts']) for h, e in _hosts.items()
+ }
+ for host, (data, ts) in snapshot.items():
+ if data is not None and ts != last_seen.get(host):
+ last_seen[host] = ts
+ yield f'data: {json.dumps({"host": host, "received_at": ts, "data": data})}\n\n'
+ yield ': keepalive\n\n'
+ time.sleep(1.0)
+ return Response(generate(), mimetype='text/event-stream',
+ headers={'Cache-Control': 'no-cache', 'X-Accel-Buffering': 'no'})
+
+ @bp.route('/nodes/status')
+ def nodes_status():
+ with _node_lock:
+ status = dict(_node_status)
+ threads = {n: t.is_alive() for n, t in _node_threads.items()}
+ return jsonify({'nodes': status, 'threads_alive': threads})
+
+ @bp.route('/cache/status')
+ def cache_status():
+ with _hosts_lock:
+ return jsonify({
+ 'host_count': len(_hosts),
+ 'hosts': {
+ host: {
+ 'inventory_available': e['inventory'] is not None,
+ 'inventory_ts': e['inventory_ts'],
+ 'status_available': e['status'] is not None,
+ 'status_ts': e['status_ts'],
+ }
+ for host, e in _hosts.items()
+ },
+ })
+
+ return bp
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_status_node.py b/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_status_node.py
new file mode 100644
index 00000000..89508b75
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_status_node.py
@@ -0,0 +1,403 @@
+import glob
+import json
+import re
+import socket
+import subprocess
+
+import rclpy
+from rclpy.node import Node
+from std_msgs.msg import String
+
+STATUS_TOPIC = '/cluster/hardware_status'
+
+
+class HardwareStatusNode(Node):
+ def __init__(self, context=None):
+ super().__init__('hardware_status_node', context=context)
+
+ self.declare_parameter('publish_rate_hz', 0.1)
+ self.declare_parameter('node_name', '')
+ self.declare_parameter('cpu_warn_percent', 85.0)
+ self.declare_parameter('ram_warn_percent', 85.0)
+ self.declare_parameter('disk_warn_percent', 85.0)
+ self.declare_parameter('temp_warn_celsius', 80.0)
+
+ rate = self.get_parameter('publish_rate_hz').get_parameter_value().double_value
+ param_name = self.get_parameter('node_name').get_parameter_value().string_value.strip()
+ self._node_name = param_name if param_name else socket.gethostname()
+ self._topic_host = re.sub(r'[^a-zA-Z0-9_]', '_', self._node_name)
+ self.get_logger().info(f'hardware_id resolved to: {self._node_name} (topic key: {self._topic_host})')
+
+ # Per-host topic: /cluster//hardware_status
+ status_topic = f'/cluster/{self._topic_host}/hardware_status'
+
+ self._cpu_warn = self.get_parameter('cpu_warn_percent').get_parameter_value().double_value
+ self._ram_warn = self.get_parameter('ram_warn_percent').get_parameter_value().double_value
+ self._disk_warn = self.get_parameter('disk_warn_percent').get_parameter_value().double_value
+ self._temp_warn = self.get_parameter('temp_warn_celsius').get_parameter_value().double_value
+
+ self._pub = self.create_publisher(String, status_topic, 10)
+ self._timer = self.create_timer(1.0 / rate, self._publish_status)
+
+ try:
+ import psutil
+ self._psutil = psutil
+ psutil.cpu_percent(interval=None, percpu=True)
+ except ImportError:
+ self._psutil = None
+ self.get_logger().warning('psutil not available; some metrics will be missing')
+
+ self.get_logger().info(f'HardwareStatusNode started on {self._node_name} @ {rate} Hz → {status_topic}')
+
+ # ------------------------------------------------------------------
+ # Helpers
+ # ------------------------------------------------------------------
+
+ def _warn_level(self, value: float, warn: float, error: float = 95.0) -> str:
+ if value >= error:
+ return 'error'
+ if value >= warn:
+ return 'warn'
+ return 'ok'
+
+ def _run_cmd(self, cmd: list[str], timeout: float = 2.0) -> str:
+ try:
+ return subprocess.run(cmd, capture_output=True, text=True, timeout=timeout).stdout.strip()
+ except Exception:
+ return ''
+
+ def _read_file(self, path: str) -> str:
+ try:
+ with open(path, 'r') as f:
+ return f.read().strip()
+ except OSError:
+ return ''
+
+ # ------------------------------------------------------------------
+ # Collectors
+ # ------------------------------------------------------------------
+
+ def _collect_cpu(self) -> dict:
+ if not self._psutil:
+ return {'status': 'unavailable'}
+
+ per_cpu = self._psutil.cpu_percent(interval=None, percpu=True)
+ overall = round(sum(per_cpu) / len(per_cpu), 1) if per_cpu else 0.0
+ freq = self._psutil.cpu_freq()
+ load1, load5, load15 = self._psutil.getloadavg()
+
+ result = {
+ 'overall_percent': overall,
+ 'status': self._warn_level(overall, self._cpu_warn),
+ 'load_avg': {'1m': round(load1, 2), '5m': round(load5, 2), '15m': round(load15, 2)},
+ 'per_core_percent': [round(p, 1) for p in per_cpu],
+ }
+ if freq:
+ result['freq_mhz'] = round(freq.current, 1)
+ return result
+
+ def _collect_ram(self) -> dict:
+ if not self._psutil:
+ return {'status': 'unavailable'}
+
+ mem = self._psutil.virtual_memory()
+ swap = self._psutil.swap_memory()
+ return {
+ 'status': self._warn_level(mem.percent, self._ram_warn),
+ 'total_mb': mem.total // (1024 ** 2),
+ 'used_mb': mem.used // (1024 ** 2),
+ 'available_mb': mem.available // (1024 ** 2),
+ 'used_percent': round(mem.percent, 1),
+ 'swap': {
+ 'total_mb': swap.total // (1024 ** 2),
+ 'used_mb': swap.used // (1024 ** 2),
+ 'used_percent': round(swap.percent, 1),
+ },
+ }
+
+ def _collect_gpu(self) -> list[dict]:
+ gpus = []
+
+ nvidia_out = self._run_cmd([
+ 'nvidia-smi',
+ '--query-gpu=name,utilization.gpu,utilization.memory,memory.used,memory.total,temperature.gpu,power.draw',
+ '--format=csv,noheader,nounits',
+ ])
+ for line in nvidia_out.splitlines():
+ parts = [p.strip() for p in line.split(',')]
+ if len(parts) < 7:
+ continue
+ name, gpu_util, mem_util, mem_used, mem_total, temp, power = parts[:7]
+ gpu_pct = float(gpu_util) if gpu_util.replace('.', '').isdigit() else 0.0
+ temp_f = float(temp) if temp.replace('.', '').isdigit() else 0.0
+ gpus.append({
+ 'type': 'GPU',
+ 'vendor': 'NVIDIA',
+ 'name': name,
+ 'status': self._warn_level(max(gpu_pct, temp_f), 85.0),
+ 'utilization_percent': gpu_pct,
+ 'memory_utilization_percent': float(mem_util) if mem_util.replace('.', '').isdigit() else 0.0,
+ 'memory_used_mb': int(mem_used) if mem_used.isdigit() else 0,
+ 'memory_total_mb': int(mem_total) if mem_total.isdigit() else 0,
+ 'temperature_celsius': temp_f,
+ 'power_draw_w': float(power) if power.replace('.', '').isdigit() else 0.0,
+ })
+
+ hailo_out = self._run_cmd(['hailortcli', 'monitor', '--json', '--count', '1'])
+ if hailo_out:
+ try:
+ data = json.loads(hailo_out)
+ for dev in data.get('devices', []):
+ util = float(dev.get('nn_core_utilization', 0))
+ gpus.append({
+ 'type': 'NPU',
+ 'vendor': 'Hailo',
+ 'name': dev.get('device_id', 'hailo'),
+ 'status': self._warn_level(util, 85.0),
+ 'utilization_percent': util,
+ 'temperature_celsius': dev.get('temperature', None),
+ })
+ except Exception:
+ pass
+
+ return gpus
+
+ def _collect_disk(self) -> dict:
+ if not self._psutil:
+ return {'status': 'unavailable'}
+
+ mounts = {}
+ worst = 'ok'
+ for part in self._psutil.disk_partitions(all=False):
+ try:
+ usage = self._psutil.disk_usage(part.mountpoint)
+ lvl = self._warn_level(usage.percent, self._disk_warn)
+ if lvl == 'error' or (lvl == 'warn' and worst == 'ok'):
+ worst = lvl
+ mounts[part.mountpoint] = {
+ 'status': lvl,
+ 'total_gb': round(usage.total / 1e9, 1),
+ 'used_gb': round(usage.used / 1e9, 1),
+ 'free_gb': round(usage.free / 1e9, 1),
+ 'used_percent': round(usage.percent, 1),
+ 'fstype': part.fstype,
+ }
+ except PermissionError:
+ pass
+
+ result: dict = {'status': worst, 'mounts': mounts}
+ io = self._psutil.disk_io_counters()
+ if io:
+ result['io'] = {
+ 'total_read_mb': round(io.read_bytes / 1e6, 1),
+ 'total_write_mb': round(io.write_bytes / 1e6, 1),
+ 'read_count': io.read_count,
+ 'write_count': io.write_count,
+ }
+ return result
+
+ def _collect_temperatures(self) -> dict:
+ sensors: dict = {}
+ worst = 'ok'
+
+ if self._psutil and hasattr(self._psutil, 'sensors_temperatures'):
+ for chip, readings in (self._psutil.sensors_temperatures() or {}).items():
+ chip_data = {}
+ for r in readings:
+ crit = r.critical if r.critical else 100.0
+ lvl = self._warn_level(r.current, self._temp_warn, crit)
+ if lvl == 'error' or (lvl == 'warn' and worst == 'ok'):
+ worst = lvl
+ label = r.label or chip
+ chip_data[label] = {
+ 'celsius': round(r.current, 1),
+ 'high': r.high,
+ 'critical': r.critical,
+ 'status': lvl,
+ }
+ sensors[chip] = chip_data
+ else:
+ for temp_file in glob.glob('/sys/class/hwmon/hwmon*/temp*_input'):
+ raw = self._read_file(temp_file)
+ if raw.isdigit():
+ celsius = int(raw) / 1000.0
+ lvl = self._warn_level(celsius, self._temp_warn)
+ if lvl == 'error' or (lvl == 'warn' and worst == 'ok'):
+ worst = lvl
+ sensors[temp_file] = {'celsius': round(celsius, 1), 'status': lvl}
+
+ return {'status': worst, 'sensors': sensors}
+
+ def _collect_network(self) -> dict:
+ if not self._psutil:
+ return {'status': 'unavailable'}
+
+ import socket as _socket
+ AF_INET = _socket.AF_INET
+ AF_INET6 = _socket.AF_INET6
+ AF_PACKET = getattr(_socket, 'AF_PACKET', 17)
+
+ addrs_map = self._psutil.net_if_addrs()
+ stats_map = self._psutil.net_if_stats()
+ counters_map = self._psutil.net_io_counters(pernic=True)
+
+ interfaces = {}
+ any_up = False
+
+ for name, addrs in addrs_map.items():
+ stats = stats_map.get(name)
+ io = counters_map.get(name)
+ is_up = stats.isup if stats else False
+ if is_up:
+ any_up = True
+
+ mac = ''
+ ipv4 = []
+ ipv6 = []
+ for a in addrs:
+ fam = a.family if isinstance(a.family, int) else a.family.value
+ if fam == AF_PACKET:
+ mac = a.address
+ elif fam == AF_INET:
+ ipv4.append(a.address + (f'/{a.netmask}' if a.netmask else ''))
+ elif fam == AF_INET6:
+ ipv6.append(a.address.split('%')[0])
+
+ iface: dict = {
+ 'is_up': is_up,
+ 'mac': mac,
+ 'ipv4': ipv4,
+ 'ipv6': ipv6,
+ 'speed_mbps': stats.speed if stats else 0,
+ 'mtu': stats.mtu if stats else 0,
+ }
+ if io:
+ iface['io'] = {
+ 'bytes_sent_mb': round(io.bytes_sent / 1e6, 2),
+ 'bytes_recv_mb': round(io.bytes_recv / 1e6, 2),
+ 'packets_sent': io.packets_sent,
+ 'packets_recv': io.packets_recv,
+ 'errors_in': io.errin,
+ 'errors_out': io.errout,
+ 'drops_in': io.dropin,
+ 'drops_out': io.dropout,
+ }
+ interfaces[name] = iface
+
+ return {'status': 'ok' if any_up else 'warn', 'interfaces': interfaces}
+
+ def _collect_ntp(self) -> dict:
+ chrony = self._run_cmd(['chronyc', 'tracking'])
+ if chrony and 'Reference ID' in chrony:
+ data: dict = {'source': 'chrony', 'synchronized': True}
+ for line in chrony.splitlines():
+ if ':' in line:
+ key, _, val = line.partition(':')
+ data[key.strip().lower().replace(' ', '_')] = val.strip()
+ if key.strip() == 'System time':
+ m = re.search(r'([\d.]+)\s+seconds', val)
+ if m and float(m.group(1)) > 1.0:
+ data['synchronized'] = False
+ data['status'] = 'ok' if data['synchronized'] else 'warn'
+ return data
+
+ timedatectl = self._run_cmd(['timedatectl', 'show'])
+ if timedatectl:
+ kv_map = {}
+ for line in timedatectl.splitlines():
+ if '=' in line:
+ k, _, v = line.partition('=')
+ kv_map[k.strip()] = v.strip()
+ synced = kv_map.get('NTPSynchronized', '').lower() == 'yes'
+ return {
+ 'source': 'systemd-timesyncd',
+ 'status': 'ok' if synced else 'warn',
+ 'synchronized': synced,
+ **kv_map,
+ }
+
+ # Kernel adjtimex fallback - STA_UNSYNC bit 0x40
+ timex_raw = self._read_file('/proc/timex')
+ for line in timex_raw.splitlines():
+ if line.startswith('status'):
+ m = re.search(r'(\d+)', line)
+ if m:
+ bits = int(m.group(1))
+ synced = not bool(bits & 0x40)
+ return {
+ 'source': 'kernel',
+ 'status': 'ok' if synced else 'warn',
+ 'synchronized': synced,
+ 'kernel_status_bits': hex(bits),
+ }
+
+ return {'source': 'unknown', 'status': 'warn', 'synchronized': False}
+
+ def _collect_processes(self) -> dict:
+ if not self._psutil:
+ return {'status': 'unavailable'}
+
+ procs = list(self._psutil.process_iter(['status']))
+ total = len(procs)
+ sleeping = sum(1 for p in procs if p.info['status'] == self._psutil.STATUS_SLEEPING)
+ running = sum(1 for p in procs if p.info['status'] == self._psutil.STATUS_RUNNING)
+ zombie = sum(1 for p in procs if p.info['status'] == self._psutil.STATUS_ZOMBIE)
+
+ return {
+ 'status': 'warn' if zombie > 5 else 'ok',
+ 'total': total,
+ 'running': running,
+ 'sleeping': sleeping,
+ 'zombie': zombie,
+ }
+
+ # ------------------------------------------------------------------
+
+ def _publish_status(self):
+ cpu = self._collect_cpu()
+ ram = self._collect_ram()
+ gpu = self._collect_gpu()
+ disk = self._collect_disk()
+ temperatures = self._collect_temperatures()
+ network = self._collect_network()
+ ntp = self._collect_ntp()
+ processes = self._collect_processes()
+
+ subsystem_statuses = [
+ cpu.get('status', 'ok'),
+ ram.get('status', 'ok'),
+ disk.get('status', 'ok'),
+ temperatures.get('status', 'ok'),
+ network.get('status', 'ok'),
+ ntp.get('status', 'ok'),
+ processes.get('status', 'ok'),
+ ]
+ overall = 'error' if 'error' in subsystem_statuses else ('warn' if 'warn' in subsystem_statuses else 'ok')
+
+ payload = {
+ 'hostname': self._node_name,
+ 'status': overall,
+ 'cpu': cpu,
+ 'ram': ram,
+ 'gpu': gpu,
+ 'disk': disk,
+ 'temperatures': temperatures,
+ 'network': network,
+ 'ntp': ntp,
+ 'processes': processes,
+ }
+
+ self._pub.publish(String(data=json.dumps(payload, indent=2)))
+ self.get_logger().debug(f'Published hardware status (overall={overall})')
+
+
+def main(args=None):
+ rclpy.init(args=args)
+ node = HardwareStatusNode()
+ try:
+ rclpy.spin(node)
+ except KeyboardInterrupt:
+ pass
+ finally:
+ node.destroy_node()
+ rclpy.shutdown()
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_utils.py b/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_utils.py
new file mode 100644
index 00000000..8ad326fe
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/hardware_monitor/hardware_utils.py
@@ -0,0 +1,752 @@
+import os
+import re
+import glob
+import socket
+import subprocess
+import platform
+
+
+def _read(path: str, default: str = '') -> str:
+ try:
+ with open(path, 'r') as f:
+ return f.read().strip()
+ except OSError:
+ return default
+
+
+def _readlink_base(path: str) -> str:
+ try:
+ return os.path.basename(os.readlink(path))
+ except OSError:
+ return ''
+
+
+def _run(cmd: list[str], timeout: float = 3.0) -> str:
+ try:
+ return subprocess.run(
+ cmd, capture_output=True, text=True, timeout=timeout,
+ env={**os.environ, 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'},
+ ).stdout.strip()
+ except Exception:
+ return ''
+
+
+def _parse_cache_kb(s: str) -> int:
+ m = re.match(r'(\d+)([KMG]?)', s.upper())
+ if not m:
+ return 0
+ return int(m.group(1)) * {'K': 1, 'M': 1024, 'G': 1048576}.get(m.group(2), 1)
+
+
+# ---------------------------------------------------------------------------
+# PCI class code decoding
+# ---------------------------------------------------------------------------
+
+_PCI_BASE_CLASS = {
+ 0x00: 'Unclassified', 0x01: 'Mass Storage',
+ 0x02: 'Network', 0x03: 'Display',
+ 0x04: 'Multimedia', 0x05: 'Memory Controller',
+ 0x06: 'Bridge', 0x07: 'Communication',
+ 0x08: 'System Peripheral', 0x09: 'Input Device',
+ 0x0A: 'Docking Station', 0x0B: 'Processor',
+ 0x0C: 'Serial Bus', 0x0D: 'Wireless',
+ 0x0E: 'Intelligent I/O', 0x0F: 'Satellite',
+ 0x10: 'Encryption', 0x11: 'Signal Processing',
+ 0x12: 'Processing Accelerator', 0x40: 'Co-Processor',
+ 0xFF: 'Unassigned',
+}
+
+_PCI_SUBCLASS = {
+ (0x01, 0x00): 'SCSI Bus', (0x01, 0x01): 'IDE',
+ (0x01, 0x05): 'ATA', (0x01, 0x06): 'SATA (AHCI)',
+ (0x01, 0x07): 'SAS', (0x01, 0x08): 'NVMe',
+ (0x02, 0x00): 'Ethernet', (0x02, 0x01): 'Token Ring',
+ (0x02, 0x02): 'FDDI', (0x02, 0x80): 'Network (other)',
+ (0x03, 0x00): 'VGA Compatible', (0x03, 0x01): '8514 Compatible',
+ (0x03, 0x02): 'XGA', (0x03, 0x80): 'GPU (other)',
+ (0x04, 0x00): 'Video', (0x04, 0x01): 'Audio',
+ (0x04, 0x03): 'Audio Device', (0x04, 0x80): 'Multimedia (other)',
+ (0x06, 0x00): 'Host Bridge', (0x06, 0x01): 'ISA Bridge',
+ (0x06, 0x04): 'PCI-PCIe Bridge',(0x06, 0x09): 'PCI-PCI Bridge',
+ (0x07, 0x00): 'Serial (UART)', (0x07, 0x01): 'Parallel Port',
+ (0x07, 0x03): 'Modem', (0x07, 0x80): 'Communication (other)',
+ (0x0B, 0x20): 'GPU (co-processor)',
+ (0x0C, 0x00): 'FireWire', (0x0C, 0x03): 'USB Controller',
+ (0x0C, 0x04): 'Fibre Channel', (0x0C, 0x05): 'SMBus',
+ (0x0C, 0x06): 'InfiniBand', (0x0C, 0x07): 'IPMI',
+ (0x0D, 0x00): 'iRDA', (0x0D, 0x11): 'Bluetooth',
+ (0x0D, 0x12): 'Broadband', (0x0D, 0x20): 'Wi-Fi 802.11a',
+ (0x0D, 0x21): 'Wi-Fi 802.11b', (0x0D, 0x80): 'Wireless (other)',
+ (0x12, 0x00): 'Processing Accelerator', (0x12, 0x01): 'AI/ML Accelerator',
+}
+
+
+def _pci_class_label(class_hex: str) -> tuple[str, str]:
+ """Return (base_label, subclass_label) from a 0xCCSSPP hex string."""
+ try:
+ v = int(class_hex, 16)
+ base = (v >> 16) & 0xFF
+ sub = (v >> 8) & 0xFF
+ return (
+ _PCI_BASE_CLASS.get(base, f'class_0x{base:02x}'),
+ _PCI_SUBCLASS.get((base, sub), f'subclass_0x{sub:02x}'),
+ )
+ except (ValueError, TypeError):
+ return ('unknown', 'unknown')
+
+
+# ---------------------------------------------------------------------------
+# System / OS
+# ---------------------------------------------------------------------------
+
+def get_system_info() -> dict:
+ uname = platform.uname()
+ return {
+ 'hostname': socket.gethostname(),
+ 'os': f'{uname.system} {uname.release}',
+ 'kernel': uname.release,
+ 'machine': uname.machine,
+ 'python': platform.python_version(),
+ }
+
+
+# ---------------------------------------------------------------------------
+# CPU
+# ---------------------------------------------------------------------------
+
+def get_cpu_info() -> dict:
+ info: dict = {
+ 'model': 'unknown',
+ 'architecture': platform.machine(),
+ 'byte_order': 'little-endian' if platform.processor() else platform.processor(),
+ 'logical_cores': 0,
+ 'physical_cores': 0,
+ 'base_frequency_mhz': 0.0,
+ 'cache': {},
+ 'numa_nodes': 1,
+ 'flags': [],
+ }
+
+ raw = _read('/proc/cpuinfo')
+ physical_ids: set = set()
+ core_ids: set = set()
+ flags_seen = False
+
+ for line in raw.splitlines():
+ if line.startswith('model name') and info['model'] == 'unknown':
+ info['model'] = line.split(':', 1)[-1].strip()
+ elif line.startswith('Hardware') and info['model'] == 'unknown':
+ info['model'] = line.split(':', 1)[-1].strip()
+ elif line.startswith('physical id'):
+ physical_ids.add(line.split(':', 1)[-1].strip())
+ elif line.startswith('core id'):
+ core_ids.add(line.split(':', 1)[-1].strip())
+ elif line.startswith('flags') and not flags_seen:
+ flags_seen = True
+ important = {'avx', 'avx2', 'avx512f', 'sse4_2', 'aes', 'vmx', 'svm',
+ 'hypervisor', 'lm', 'nx', 'cx16', 'rdrand', 'rdseed'}
+ info['flags'] = sorted(important & set(line.split(':', 1)[-1].split()))
+ elif line.startswith('cpu architecture'):
+ info['architecture'] = line.split(':', 1)[-1].strip()
+
+ info['logical_cores'] = len([l for l in raw.splitlines() if l.startswith('processor')])
+ info['physical_cores'] = (
+ len(core_ids) * max(len(physical_ids), 1) if core_ids else info['logical_cores']
+ )
+
+ freq = _read('/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq')
+ if freq.isdigit():
+ info['base_frequency_mhz'] = round(int(freq) / 1000.0, 1)
+
+ cache: dict = {}
+ for idx_path in glob.glob('/sys/devices/system/cpu/cpu0/cache/index*'):
+ level = _read(os.path.join(idx_path, 'level'))
+ ctype = _read(os.path.join(idx_path, 'type'))
+ kb = _parse_cache_kb(_read(os.path.join(idx_path, 'size')))
+ shared = _read(os.path.join(idx_path, 'shared_cpu_list'))
+ if level == '1' and ctype == 'Data':
+ cache['l1d_kb'] = kb
+ elif level == '1' and ctype == 'Instruction':
+ cache['l1i_kb'] = kb
+ elif level == '2':
+ cache['l2_kb'] = kb
+ elif level == '3':
+ cache['l3_kb'] = kb
+ cache['l3_shared_cpus'] = shared
+ info['cache'] = cache
+
+ numa_dirs = glob.glob('/sys/devices/system/node/node[0-9]*')
+ if numa_dirs:
+ info['numa_nodes'] = len(numa_dirs)
+
+ import struct
+ info['byte_order'] = 'little-endian' if struct.pack('H', 1)[0] == 1 else 'big-endian'
+
+ return info
+
+
+# ---------------------------------------------------------------------------
+# RAM
+# ---------------------------------------------------------------------------
+
+def get_ram_info() -> dict:
+ info: dict = {'total_mb': 0, 'slots': [], 'numa_nodes': []}
+
+ meminfo = _read('/proc/meminfo')
+ for line in meminfo.splitlines():
+ if line.startswith('MemTotal:'):
+ m = re.search(r'(\d+)', line)
+ if m:
+ info['total_mb'] = int(m.group(1)) // 1024
+ break
+
+ # NUMA topology and per-node memory
+ for node_path in sorted(glob.glob('/sys/devices/system/node/node[0-9]*')):
+ node_id = re.search(r'node(\d+)', node_path)
+ node_meminfo = _read(os.path.join(node_path, 'meminfo'))
+ node_total = 0
+ for line in node_meminfo.splitlines():
+ if 'MemTotal' in line:
+ m = re.search(r'(\d+) kB', line)
+ if m:
+ node_total = int(m.group(1)) // 1024
+ if node_id:
+ cpus = _read(os.path.join(node_path, 'cpulist'))
+ info['numa_nodes'].append({
+ 'node': int(node_id.group(1)),
+ 'total_mb': node_total,
+ 'cpus': cpus,
+ })
+
+ return info
+
+
+# ---------------------------------------------------------------------------
+# GPU / NPU / Accelerators
+# ---------------------------------------------------------------------------
+
+def get_accelerator_info() -> list[dict]:
+ devices = []
+
+ # NVIDIA via nvidia-smi
+ out = _run(['nvidia-smi',
+ '--query-gpu=index,name,uuid,memory.total,driver_version,pcie.link.gen.current,pcie.link.width.current',
+ '--format=csv,noheader,nounits'])
+ if out:
+ for line in out.splitlines():
+ parts = [p.strip() for p in line.split(',')]
+ if len(parts) >= 7:
+ devices.append({
+ 'type': 'GPU', 'vendor': 'NVIDIA',
+ 'index': parts[0], 'name': parts[1], 'uuid': parts[2],
+ 'vram_mb': int(parts[3]) if parts[3].isdigit() else 0,
+ 'driver': parts[4],
+ 'pcie_gen': parts[5], 'pcie_width': parts[6],
+ })
+
+ # AMD via rocm-smi
+ if not any(d['vendor'] == 'NVIDIA' for d in devices):
+ out = _run(['rocm-smi', '--showproductname', '--showmeminfo', 'vram', '--csv'])
+ if out:
+ for line in out.splitlines()[1:]:
+ parts = [p.strip() for p in line.split(',')]
+ if parts:
+ devices.append({'type': 'GPU', 'vendor': 'AMD', 'name': parts[-1],
+ 'vram_mb': 0, 'driver': '', 'uuid': ''})
+
+ # Intel GPU via DRM sysfs
+ for vpath in glob.glob('/sys/class/drm/card*/device/vendor'):
+ if _read(vpath) == '0x8086':
+ card_dir = os.path.dirname(os.path.dirname(vpath))
+ uevent = _read(os.path.join(card_dir, 'device/uevent'))
+ driver = _readlink_base(os.path.join(card_dir, 'device/driver'))
+ name = next((l.split('=', 1)[-1] for l in uevent.splitlines() if 'PCI_ID' in l), 'Intel GPU')
+ devices.append({'type': 'GPU', 'vendor': 'Intel', 'name': name,
+ 'driver': driver, 'vram_mb': 0, 'uuid': ''})
+
+ # Hailo NPU
+ for dev in sorted(glob.glob('/dev/hailo*')):
+ devices.append({'type': 'NPU', 'vendor': 'Hailo', 'name': f'Hailo NPU',
+ 'device': dev, 'driver': 'hailo', 'vram_mb': 0})
+
+ # Google Coral TPU
+ for dev in sorted(glob.glob('/dev/apex_*')):
+ devices.append({'type': 'TPU', 'vendor': 'Google', 'name': 'Coral Edge TPU',
+ 'device': dev, 'driver': 'gasket', 'vram_mb': 0})
+
+ # OpenCL devices via clinfo if available
+ clinfo = _run(['clinfo', '--raw'], timeout=5.0)
+ if clinfo and not devices:
+ for line in clinfo.splitlines():
+ if 'CL_DEVICE_NAME' in line:
+ name = line.split('|')[-1].strip()
+ devices.append({'type': 'GPU/OpenCL', 'vendor': 'unknown', 'name': name})
+
+ return devices
+
+
+# ---------------------------------------------------------------------------
+# PCI devices
+# ---------------------------------------------------------------------------
+
+def get_pci_devices() -> list[dict]:
+ devices = []
+ for d in sorted(glob.glob('/sys/bus/pci/devices/*/')):
+ slot = os.path.basename(d.rstrip('/'))
+ vendor = _read(os.path.join(d, 'vendor'))
+ device_id = _read(os.path.join(d, 'device'))
+ class_hex = _read(os.path.join(d, 'class'))
+ sub_vendor = _read(os.path.join(d, 'subsystem_vendor'))
+ sub_device = _read(os.path.join(d, 'subsystem_device'))
+ revision = _read(os.path.join(d, 'revision'))
+ driver = _readlink_base(os.path.join(d, 'driver'))
+ numa = _read(os.path.join(d, 'numa_node'))
+ base_label, sub_label = _pci_class_label(class_hex)
+ devices.append({
+ 'slot': slot,
+ 'vendor_id': vendor,
+ 'device_id': device_id,
+ 'subsystem_vendor_id': sub_vendor,
+ 'subsystem_device_id': sub_device,
+ 'class': class_hex,
+ 'class_label': base_label,
+ 'subclass_label': sub_label,
+ 'revision': revision,
+ 'driver': driver,
+ 'numa_node': int(numa) if numa.lstrip('-').isdigit() else None,
+ })
+ return devices
+
+
+# ---------------------------------------------------------------------------
+# USB devices (sysfs - no lsusb required)
+# ---------------------------------------------------------------------------
+
+_USB_CLASS = {
+ '00': 'Per-Interface', '01': 'Audio', '02': 'CDC/Serial',
+ '03': 'HID', '05': 'Physical', '06': 'Image',
+ '07': 'Printer', '08': 'Mass Storage','09': 'Hub',
+ '0a': 'CDC-Data', '0b': 'Smart Card', '0d': 'Content Security',
+ '0e': 'Video', '0f': 'PHDC', '10': 'AV',
+ 'dc': 'Diagnostic', 'e0': 'Wireless', 'ef': 'Miscellaneous',
+ 'fe': 'App Specific', 'ff': 'Vendor Specific',
+}
+
+
+def get_usb_devices() -> list[dict]:
+ devices = []
+ for d in sorted(glob.glob('/sys/bus/usb/devices/*/')):
+ # Only real devices have idVendor (not hubs/ports that lack it)
+ id_vendor = _read(os.path.join(d, 'idVendor'))
+ id_product = _read(os.path.join(d, 'idProduct'))
+ if not id_vendor:
+ continue
+
+ dev_class = _read(os.path.join(d, 'bDeviceClass')).lower()
+ speed = _read(os.path.join(d, 'speed'))
+ manufacturer = _read(os.path.join(d, 'manufacturer'))
+ product = _read(os.path.join(d, 'product'))
+ serial = _read(os.path.join(d, 'serial'))
+ bus = _read(os.path.join(d, 'busnum'))
+ devnum = _read(os.path.join(d, 'devnum'))
+ version = _read(os.path.join(d, 'version')).strip()
+
+ # Collect bound interface drivers
+ drivers = list({
+ _readlink_base(os.path.join(d, iface, 'driver'))
+ for iface in os.listdir(d)
+ if re.match(r'\d+-[\d.]+:\d+\.\d+', iface)
+ and os.path.exists(os.path.join(d, iface, 'driver'))
+ } - {''})
+
+ devices.append({
+ 'bus': bus,
+ 'device': devnum,
+ 'id': f'{id_vendor}:{id_product}',
+ 'vendor_id': id_vendor,
+ 'product_id': id_product,
+ 'manufacturer': manufacturer,
+ 'product': product,
+ 'serial': serial,
+ 'usb_version': version,
+ 'speed_mbps': speed,
+ 'class': dev_class,
+ 'class_label': _USB_CLASS.get(dev_class, f'0x{dev_class}'),
+ 'drivers': drivers,
+ })
+ return devices
+
+
+# ---------------------------------------------------------------------------
+# Serial / UART devices
+# ---------------------------------------------------------------------------
+
+_UART_TYPES = {
+ '0': 'unknown', '1': '8250', '2': '16450', '3': '16550',
+ '4': '16550A', '5': 'Cirrus', '6': '16650V2','7': '16750',
+ '12': '16950/954', '14': 'RSA',
+}
+
+
+def get_serial_devices() -> list[dict]:
+ devices = []
+
+ # Registered serial drivers from /proc/tty/drivers
+ registered: dict[str, str] = {}
+ for line in _read('/proc/tty/drivers').splitlines():
+ parts = line.split()
+ if len(parts) >= 2:
+ registered[parts[1]] = parts[0] # /dev/ttyX -> driver name
+
+ for d in sorted(glob.glob('/sys/class/tty/*/')):
+ name = os.path.basename(d.rstrip('/'))
+ dev_node = f'/dev/{name}'
+
+ # Must have a real device link (excludes virtual ttys, pts, etc.)
+ dev_link = None
+ try:
+ dev_link = os.readlink(os.path.join(d, 'device'))
+ except OSError:
+ pass
+ if dev_link is None:
+ continue
+
+ driver = _readlink_base(os.path.join(d, 'device', 'driver'))
+ subsystem = _readlink_base(os.path.join(d, 'device', 'subsystem'))
+
+ # Categorise by subsystem/driver
+ if subsystem == 'usb-serial' or 'USB' in name:
+ port_type = 'USB-Serial'
+ elif subsystem == 'usb':
+ port_type = 'USB-Serial'
+ elif 'ACM' in name:
+ port_type = 'USB-CDC-ACM'
+ elif 'AMA' in name or 'serial8250' in driver:
+ port_type = 'UART (SoC/ARM)'
+ elif name.startswith('ttyS'):
+ port_type = 'UART (16550)'
+ else:
+ port_type = 'Serial'
+
+ entry: dict = {
+ 'device': dev_node,
+ 'name': name,
+ 'type': port_type,
+ 'driver': driver,
+ 'subsystem': subsystem,
+ }
+
+ # Extra fields for native UARTs
+ if name.startswith('ttyS'):
+ uart_type_num = _read(os.path.join(d, 'type'))
+ entry['uart_type'] = _UART_TYPES.get(uart_type_num, uart_type_num)
+ entry['port_address'] = _read(os.path.join(d, 'port'))
+ entry['irq'] = _read(os.path.join(d, 'irq'))
+ entry['uartclk_hz'] = _read(os.path.join(d, 'uartclk'))
+ entry['is_console'] = _read(os.path.join(d, 'console')) == 'Y'
+
+ # USB-serial: gather parent USB device info
+ if port_type in ('USB-Serial', 'USB-CDC-ACM'):
+ usb_dir = dev_link
+ for _ in range(4):
+ usb_dir = os.path.join(os.path.dirname(usb_dir), '')
+ mfr = _read(os.path.join('/sys/bus/usb/devices',
+ os.path.normpath(usb_dir), 'manufacturer'))
+ if mfr:
+ entry['usb_manufacturer'] = mfr
+ entry['usb_product'] = _read(os.path.join(
+ '/sys/bus/usb/devices', os.path.normpath(usb_dir), 'product'))
+ entry['usb_serial'] = _read(os.path.join(
+ '/sys/bus/usb/devices', os.path.normpath(usb_dir), 'serial'))
+ break
+
+ devices.append(entry)
+
+ return devices
+
+
+# ---------------------------------------------------------------------------
+# Network interfaces
+# ---------------------------------------------------------------------------
+
+def get_network_interfaces() -> list[dict]:
+ ifaces = []
+ try:
+ import psutil
+ AF_INET = socket.AF_INET
+ AF_INET6 = socket.AF_INET6
+ AF_PACKET = getattr(socket, 'AF_PACKET', 17)
+
+ addrs_map = psutil.net_if_addrs()
+ stats_map = psutil.net_if_stats()
+
+ for name, addrs in addrs_map.items():
+ stats = stats_map.get(name)
+ mac, ipv4, ipv6 = '', [], []
+ for a in addrs:
+ fam = a.family if isinstance(a.family, int) else a.family.value
+ if fam == AF_PACKET:
+ mac = a.address
+ elif fam == AF_INET:
+ ipv4.append(a.address + (f'/{a.netmask}' if a.netmask else ''))
+ elif fam == AF_INET6:
+ ipv6.append(a.address.split('%')[0])
+
+ sys_path = f'/sys/class/net/{name}/'
+ driver = _readlink_base(os.path.join(sys_path, 'device', 'driver'))
+ iface_type_raw = _read(os.path.join(sys_path, 'type'))
+ duplex = _read(os.path.join(sys_path, 'duplex'))
+ operstate = _read(os.path.join(sys_path, 'operstate'))
+ tx_queue = _read(os.path.join(sys_path, 'tx_queue_len'))
+
+ # Ethernet=1, loopback=772, WiFi=801, tunnel/tun=65534
+ iface_type_map = {
+ '1': 'ethernet', '772': 'loopback', '801': 'wifi',
+ '65534': 'tunnel', '65535': 'unknown',
+ }
+ iface_type = iface_type_map.get(iface_type_raw, f'type_{iface_type_raw}')
+
+ # WiFi: check /sys/class/net//wireless or /proc/net/wireless
+ if os.path.isdir(os.path.join(sys_path, 'wireless')):
+ iface_type = 'wifi'
+ phy = _readlink_base(os.path.join(sys_path, 'phy80211'))
+ ssid = _run(['iwgetid', name, '-r'], timeout=1.0)
+ else:
+ phy = ''
+ ssid = ''
+
+ ifaces.append({
+ 'name': name,
+ 'type': iface_type,
+ 'operstate': operstate,
+ 'is_up': stats.isup if stats else False,
+ 'mac': mac,
+ 'ipv4': ipv4,
+ 'ipv6': ipv6,
+ 'speed_mbps': stats.speed if stats else 0,
+ 'mtu': stats.mtu if stats else 0,
+ 'duplex': duplex,
+ 'tx_queue_len': int(tx_queue) if tx_queue.isdigit() else 0,
+ 'driver': driver,
+ **({'phy': phy, 'ssid': ssid} if iface_type == 'wifi' else {}),
+ })
+ except ImportError:
+ pass
+ return ifaces
+
+
+# ---------------------------------------------------------------------------
+# Storage devices
+# ---------------------------------------------------------------------------
+
+def get_storage_devices() -> list[dict]:
+ devices = []
+ out = _run(['lsblk', '-d', '-o', 'NAME,SIZE,MODEL,ROTA,TYPE,TRAN,VENDOR,REV,SERIAL,LOG-SEC,PHY-SEC', '--json'])
+ if not out:
+ out = _run(['lsblk', '-d', '-o', 'NAME,SIZE,MODEL,ROTA,TYPE,TRAN,VENDOR', '--json'])
+ if out:
+ import json
+ try:
+ for dev in json.loads(out).get('blockdevices', []):
+ name = dev.get('name', '')
+ rota = dev.get('rota', '0')
+ tran = dev.get('tran') or ''
+ if tran == 'nvme' or name.startswith('nvme'):
+ storage_type = 'NVMe SSD'
+ elif str(rota) in ('0', 'false', 'False'):
+ storage_type = 'SSD'
+ elif tran in ('usb',):
+ storage_type = 'USB Storage'
+ else:
+ storage_type = 'HDD'
+
+ entry: dict = {
+ 'name': name,
+ 'device': f'/dev/{name}',
+ 'size': dev.get('size', ''),
+ 'model': (dev.get('model') or '').strip(),
+ 'vendor': (dev.get('vendor') or '').strip(),
+ 'revision': (dev.get('rev') or '').strip(),
+ 'serial': (dev.get('serial') or '').strip(),
+ 'type': storage_type,
+ 'transport': tran,
+ 'rotational': str(rota) not in ('0', 'false', 'False'),
+ }
+
+ # Partition count
+ partitions = glob.glob(f'/sys/block/{name}/{name}[0-9]*')
+ entry['partitions'] = len(partitions)
+
+ # Logical/physical sector size
+ for field, sysfs in [('logical_sector_bytes', 'queue/logical_block_size'),
+ ('physical_sector_bytes', 'queue/physical_block_size')]:
+ val = _read(f'/sys/block/{name}/{sysfs}')
+ if val.isdigit():
+ entry[field] = int(val)
+
+ # Rotational speed for HDDs
+ rpm = _read(f'/sys/block/{name}/queue/rotational')
+ if rpm.isdigit() and int(rpm) == 1:
+ entry['rpm'] = 'rotational'
+
+ devices.append(entry)
+ except Exception:
+ pass
+ return devices
+
+
+# ---------------------------------------------------------------------------
+# Sensors (IIO, V4L2, LIDAR patterns)
+# ---------------------------------------------------------------------------
+
+def get_sensor_devices() -> list[dict]:
+ sensors = []
+
+ for dev_path in sorted(glob.glob('/sys/bus/iio/devices/iio:device*')):
+ name = _read(os.path.join(dev_path, 'name'), default='unknown_iio')
+ attrs = set(os.listdir(dev_path))
+ if any('accel' in a for a in attrs):
+ stype = 'IMU/Accelerometer'
+ elif any('anglvel' in a for a in attrs):
+ stype = 'IMU/Gyroscope'
+ elif any('magn' in a for a in attrs):
+ stype = 'Magnetometer'
+ elif any('pressure' in a for a in attrs):
+ stype = 'Barometer'
+ elif any('illuminance' in a for a in attrs):
+ stype = 'Ambient Light'
+ elif any('proximity' in a for a in attrs):
+ stype = 'Proximity'
+ elif any('temp' in a for a in attrs):
+ stype = 'Temperature Sensor'
+ else:
+ stype = 'IIO'
+ dev_node = _read(os.path.join(dev_path, 'dev'))
+ sensors.append({
+ 'name': name, 'type': stype, 'interface': 'IIO',
+ 'sysfs_path': dev_path, 'dev': dev_node,
+ })
+
+ for dev in sorted(glob.glob('/dev/video*')):
+ sys_name = f'/sys/class/video4linux/{os.path.basename(dev)}'
+ name = _read(os.path.join(sys_name, 'name'), default=dev)
+ driver = _readlink_base(os.path.join(sys_name, 'device', 'driver'))
+ sensors.append({
+ 'name': name, 'type': 'Camera/V4L2', 'interface': 'V4L2',
+ 'device': dev, 'driver': driver,
+ })
+
+ return sensors
+
+
+# ---------------------------------------------------------------------------
+# Sound / Audio
+# ---------------------------------------------------------------------------
+
+def get_audio_devices() -> list[dict]:
+ devices = []
+ cards_raw = _read('/proc/asound/cards')
+ for line in cards_raw.splitlines():
+ m = re.match(r'\s*(\d+)\s+\[(\S+)\s*\]:\s+(.+)', line)
+ if m:
+ idx, short_name, description = m.groups()
+ devices.append({
+ 'card_index': int(idx),
+ 'name': short_name,
+ 'description': description.strip(),
+ })
+
+ # Enrich with driver info from sysfs
+ for d in glob.glob('/sys/class/sound/card*/'):
+ card_num = re.search(r'card(\d+)', d)
+ if not card_num:
+ continue
+ driver = _readlink_base(os.path.join(d, 'device', 'driver'))
+ for dev in devices:
+ if dev['card_index'] == int(card_num.group(1)):
+ dev['driver'] = driver
+ break
+
+ return devices
+
+
+# ---------------------------------------------------------------------------
+# Input devices (keyboard, mouse, joystick, etc.)
+# ---------------------------------------------------------------------------
+
+def get_input_devices() -> list[dict]:
+ devices = []
+ for d in sorted(glob.glob('/sys/class/input/input*/')):
+ name = _read(os.path.join(d, 'name'))
+ if not name:
+ continue
+ phys = _read(os.path.join(d, 'phys'))
+ uniq = _read(os.path.join(d, 'uniq'))
+ # Guess type from name/phys
+ name_lower = name.lower()
+ if any(k in name_lower for k in ('keyboard', 'kbd')):
+ itype = 'Keyboard'
+ elif any(k in name_lower for k in ('mouse', 'trackpad', 'touchpad')):
+ itype = 'Mouse/Touchpad'
+ elif any(k in name_lower for k in ('joystick', 'gamepad', 'controller')):
+ itype = 'Gamepad/Joystick'
+ elif 'touch' in name_lower:
+ itype = 'Touchscreen'
+ elif any(k in name_lower for k in ('power', 'button', 'acpi')):
+ itype = 'System Button'
+ else:
+ itype = 'Input Device'
+
+ # Find associated /dev/input/eventX
+ event_nodes = [
+ f'/dev/input/{e}'
+ for e in os.listdir(d)
+ if e.startswith('event')
+ ]
+ devices.append({
+ 'name': name, 'type': itype,
+ 'phys': phys, 'uniq': uniq,
+ 'event_nodes': event_nodes,
+ })
+ return devices
+
+
+# ---------------------------------------------------------------------------
+# Power supply / Battery
+# ---------------------------------------------------------------------------
+
+def get_power_info() -> list[dict]:
+ supplies = []
+ for d in sorted(glob.glob('/sys/class/power_supply/*/')):
+ name = os.path.basename(d.rstrip('/'))
+ ptype = _read(os.path.join(d, 'type'))
+ status = _read(os.path.join(d, 'status'))
+ entry: dict = {'name': name, 'type': ptype, 'status': status}
+ if ptype == 'Battery':
+ for field, sysfs in [
+ ('capacity_percent', 'capacity'),
+ ('capacity_level', 'capacity_level'),
+ ('voltage_mv', 'voltage_now'),
+ ('energy_full_wh', 'energy_full'),
+ ('energy_now_wh', 'energy_now'),
+ ('power_now_w', 'power_now'),
+ ('cycle_count', 'cycle_count'),
+ ('technology', 'technology'),
+ ('manufacturer', 'manufacturer'),
+ ('model', 'model_name'),
+ ]:
+ val = _read(os.path.join(d, sysfs))
+ if val:
+ if field.endswith('_mv') or field.endswith('_wh') or field.endswith('_w'):
+ try:
+ entry[field] = round(int(val) / 1_000_000, 3)
+ except ValueError:
+ entry[field] = val
+ elif field == 'capacity_percent':
+ entry[field] = int(val) if val.isdigit() else val
+ else:
+ entry[field] = val
+ elif ptype == 'Mains':
+ entry['online'] = _read(os.path.join(d, 'online')) == '1'
+ supplies.append(entry)
+ return supplies
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/launch/hardware_monitor.launch.py b/ros2_workspace/src/adore_interfaces/hardware_monitor/launch/hardware_monitor.launch.py
new file mode 100644
index 00000000..51d9048b
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/launch/hardware_monitor.launch.py
@@ -0,0 +1,28 @@
+from launch import LaunchDescription
+from launch_ros.actions import Node
+from ament_index_python.packages import get_package_share_directory
+import os
+
+
+def generate_launch_description():
+ config = os.path.join(
+ get_package_share_directory('hardware_monitor'),
+ 'config',
+ 'hardware_monitor.yaml',
+ )
+ return LaunchDescription([
+ Node(
+ package='hardware_monitor',
+ executable='hardware_discovery_node',
+ name='hardware_discovery_node',
+ parameters=[config],
+ output='screen',
+ ),
+ Node(
+ package='hardware_monitor',
+ executable='hardware_status_node',
+ name='hardware_status_node',
+ parameters=[config],
+ output='screen',
+ ),
+ ])
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/package.xml b/ros2_workspace/src/adore_interfaces/hardware_monitor/package.xml
new file mode 100644
index 00000000..ff92016d
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/package.xml
@@ -0,0 +1,17 @@
+
+
+ hardware_monitor
+ 1.0.0
+ ROS 2 hardware discovery and status monitoring nodes for cluster management
+ maintainer
+ Apache-2.0
+
+ rclpy
+ std_msgs
+
+ python3-psutil
+
+
+ ament_python
+
+
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/requirements.pip3 b/ros2_workspace/src/adore_interfaces/hardware_monitor/requirements.pip3
new file mode 100644
index 00000000..2af14583
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/requirements.pip3
@@ -0,0 +1 @@
+psutil>=5.9.0
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/resource/hardware_monitor b/ros2_workspace/src/adore_interfaces/hardware_monitor/resource/hardware_monitor
new file mode 100644
index 00000000..e69de29b
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/setup.cfg b/ros2_workspace/src/adore_interfaces/hardware_monitor/setup.cfg
new file mode 100644
index 00000000..f505c977
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/setup.cfg
@@ -0,0 +1,8 @@
+[metadata]
+name = hardware_monitor
+
+[develop]
+script_dir=$base/lib/hardware_monitor
+
+[install]
+install_scripts=$base/lib/hardware_monitor
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/setup.py b/ros2_workspace/src/adore_interfaces/hardware_monitor/setup.py
new file mode 100644
index 00000000..29ba1259
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/setup.py
@@ -0,0 +1,26 @@
+from setuptools import setup
+
+package_name = 'hardware_monitor'
+
+setup(
+ name=package_name,
+ version='1.0.0',
+ packages=[package_name],
+ data_files=[
+ ('share/ament_index/resource_index/packages', ['resource/' + package_name]),
+ ('share/' + package_name, ['package.xml']),
+ ('share/' + package_name + '/config', ['config/hardware_monitor.yaml']),
+ ('share/' + package_name + '/launch', ['launch/hardware_monitor.launch.py']),
+ ],
+ install_requires=['setuptools', 'psutil'],
+ zip_safe=True,
+ maintainer='maintainer',
+ description='ROS 2 hardware discovery and status monitoring nodes',
+ license='Apache-2.0',
+ entry_points={
+ 'console_scripts': [
+ 'hardware_discovery_node = hardware_monitor.hardware_discovery_node:main',
+ 'hardware_status_node = hardware_monitor.hardware_status_node:main',
+ ],
+ },
+)
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/start.sh b/ros2_workspace/src/adore_interfaces/hardware_monitor/start.sh
new file mode 100755
index 00000000..9513f707
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/start.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PID_FILE="${SCRIPT_DIR}/.hardware_monitor.pid"
+
+if [[ -f "${PID_FILE}" ]]; then
+ EXISTING_PID=$(cat "${PID_FILE}")
+ if kill -0 "${EXISTING_PID}" 2>/dev/null; then
+ echo "hardware_monitor is already running (PID ${EXISTING_PID})"
+ exit 0
+ else
+ rm -f "${PID_FILE}"
+ fi
+fi
+
+if [[ -z "${ROS_DISTRO:-}" ]]; then
+ echo "ERROR: ROS 2 environment not sourced. Source /opt/ros//setup.bash first."
+ exit 1
+fi
+
+# ROS 2 log directory resolution matches the RCL convention:
+# ROS_LOG_DIR > ROS_HOME/log > ~/.ros/log
+ROS_HOME_DEFAULT="${HOME}/.ros"
+ROS_LOG_BASE="${ROS_LOG_DIR:-${ROS_HOME:-${ROS_HOME_DEFAULT}}/log}"
+mkdir -p "${ROS_LOG_BASE}"
+LAUNCH_LOG="${ROS_LOG_BASE}/hardware_monitor_launch_$(date +%Y%m%d_%H%M%S).log"
+
+echo "Starting hardware_monitor nodes..."
+ros2 launch hardware_monitor hardware_monitor.launch.py \
+ > "${LAUNCH_LOG}" 2>&1 &
+
+LAUNCH_PID=$!
+echo "${LAUNCH_PID}" > "${PID_FILE}"
+echo "hardware_monitor started (PID ${LAUNCH_PID})"
+echo "Launch stdout/stderr: ${LAUNCH_LOG}"
+echo "Node logs: ${ROS_LOG_BASE}/latest/"
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/start_web_ui.sh b/ros2_workspace/src/adore_interfaces/hardware_monitor/start_web_ui.sh
new file mode 100755
index 00000000..5d1edb15
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/start_web_ui.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PID_FILE="${SCRIPT_DIR}/.hardware_monitor_webui.pid"
+PORT="${HARDWARE_MONITOR_UI_PORT:-8889}"
+HOST="${HARDWARE_MONITOR_UI_HOST:-0.0.0.0}"
+
+if [[ -f "${PID_FILE}" ]]; then
+ EXISTING_PID=$(cat "${PID_FILE}")
+ if kill -0 "${EXISTING_PID}" 2>/dev/null; then
+ echo "Hardware Monitor UI already running (PID ${EXISTING_PID}) on port ${PORT}"
+ exit 0
+ else
+ rm -f "${PID_FILE}"
+ fi
+fi
+
+ROS_HOME_DEFAULT="${HOME}/.ros"
+ROS_LOG_BASE="${ROS_LOG_DIR:-${ROS_HOME:-${ROS_HOME_DEFAULT}}/log}"
+mkdir -p "${ROS_LOG_BASE}"
+LOG_FILE="${ROS_LOG_BASE}/hardware_monitor_webui_$(date +%Y%m%d_%H%M%S).log"
+
+echo "Starting Hardware Monitor Web UI on http://${HOST}:${PORT}"
+python3 "${SCRIPT_DIR}/web_ui/hardware_monitor_web.py" \
+ --port "${PORT}" --host "${HOST}" \
+ > "${LOG_FILE}" 2>&1 &
+
+LAUNCH_PID=$!
+echo "${LAUNCH_PID}" > "${PID_FILE}"
+echo "Hardware Monitor UI started (PID ${LAUNCH_PID})"
+echo "Log: ${LOG_FILE}"
+echo "URL: http://localhost:${PORT}"
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/stop.sh b/ros2_workspace/src/adore_interfaces/hardware_monitor/stop.sh
new file mode 100755
index 00000000..1955c3e8
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/stop.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PID_FILE="${SCRIPT_DIR}/.hardware_monitor.pid"
+
+if [[ ! -f "${PID_FILE}" ]]; then
+ echo "No PID file found; hardware_monitor may not be running."
+ exit 0
+fi
+
+PID=$(cat "${PID_FILE}")
+
+if kill -0 "${PID}" 2>/dev/null; then
+ echo "Stopping hardware_monitor (PID ${PID})..."
+ kill -SIGINT "${PID}"
+
+ TIMEOUT=10
+ ELAPSED=0
+ while kill -0 "${PID}" 2>/dev/null && [[ ${ELAPSED} -lt ${TIMEOUT} ]]; do
+ sleep 1
+ ELAPSED=$((ELAPSED + 1))
+ done
+
+ if kill -0 "${PID}" 2>/dev/null; then
+ echo "Process did not exit cleanly; sending SIGKILL..."
+ kill -SIGKILL "${PID}" 2>/dev/null || true
+ fi
+
+ echo "hardware_monitor stopped."
+else
+ echo "Process ${PID} is not running."
+fi
+
+rm -f "${PID_FILE}"
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/stop_web_ui.sh b/ros2_workspace/src/adore_interfaces/hardware_monitor/stop_web_ui.sh
new file mode 100755
index 00000000..4c721fae
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/stop_web_ui.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PID_FILE="${SCRIPT_DIR}/.hardware_monitor_webui.pid"
+
+if [[ ! -f "${PID_FILE}" ]]; then
+ echo "No PID file found; Hardware Monitor UI may not be running."
+ exit 0
+fi
+
+PID=$(cat "${PID_FILE}")
+if kill -0 "${PID}" 2>/dev/null; then
+ echo "Stopping Hardware Monitor UI (PID ${PID})..."
+ kill -SIGINT "${PID}"
+ ELAPSED=0
+ while kill -0 "${PID}" 2>/dev/null && [[ ${ELAPSED} -lt 10 ]]; do
+ sleep 1; ELAPSED=$((ELAPSED + 1))
+ done
+ kill -0 "${PID}" 2>/dev/null && kill -SIGKILL "${PID}" 2>/dev/null || true
+ echo "Hardware Monitor UI stopped."
+else
+ echo "Process ${PID} is not running."
+fi
+rm -f "${PID_FILE}"
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/adore_integration.py b/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/adore_integration.py
new file mode 100644
index 00000000..be109e57
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/adore_integration.py
@@ -0,0 +1,52 @@
+"""
+adore_integration.py
+
+Drop-in integration for adore_api.py.
+
+Add two lines to adore_api.py after the app is created and CORS is applied:
+
+ from hardware_monitor.hardware_monitor_api import get_hardware_monitor_blueprint
+ app.register_blueprint(get_hardware_monitor_blueprint())
+
+Then add the tab and panel to index.html (see adore_integration_snippet.html).
+
+Alternatively, call register_with_adore_app(app) from within adore_api.py:
+
+ try:
+ from hardware_monitor.web_ui.adore_integration import register_with_adore_app
+ register_with_adore_app(app)
+ print("✓ hardware_monitor blueprint registered")
+ except ImportError as e:
+ print(f"⚠ hardware_monitor not available: {e}")
+"""
+
+import os
+import sys
+
+_HERE = os.path.dirname(os.path.abspath(__file__))
+sys.path.insert(0, os.path.dirname(_HERE))
+
+
+def register_with_adore_app(app, url_prefix: str = '/api/hardware'):
+ """
+ Register the hardware_monitor blueprint and hardware monitor UI route
+ into an existing Flask app instance (e.g. adore_api.app).
+
+ Args:
+ app: The Flask application instance.
+ url_prefix: API prefix for hardware endpoints. Default: /api/hardware
+ """
+ from hardware_monitor.hardware_monitor_api import get_hardware_monitor_blueprint
+ from flask import render_template_string, send_from_directory
+
+ bp = get_hardware_monitor_blueprint(url_prefix=url_prefix)
+ app.register_blueprint(bp)
+
+ template_path = os.path.join(_HERE, 'templates', 'hardware_monitor.html')
+
+ @app.route('/hardware-monitor')
+ def hardware_monitor_ui():
+ with open(template_path, 'r') as f:
+ return f.read()
+
+ return bp
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/hardware_monitor_web.py b/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/hardware_monitor_web.py
new file mode 100644
index 00000000..9751fe3a
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/hardware_monitor_web.py
@@ -0,0 +1,54 @@
+"""
+hardware_monitor_web.py
+
+Standalone Flask app for the hardware monitor web UI.
+Can also be imported to attach routes to an existing app.
+
+Usage:
+ python hardware_monitor_web.py [--port 8889] [--host 0.0.0.0]
+"""
+
+import argparse
+import os
+import sys
+
+from flask import Flask, render_template, send_from_directory
+from flask_cors import CORS
+
+_HERE = os.path.dirname(os.path.abspath(__file__))
+
+app = Flask(
+ __name__,
+ template_folder=os.path.join(_HERE, 'templates'),
+ static_folder=os.path.join(_HERE, 'static'),
+)
+CORS(app)
+
+# Register the hardware monitor blueprint
+sys.path.insert(0, os.path.dirname(_HERE))
+from hardware_monitor.hardware_monitor_api import get_hardware_monitor_blueprint
+
+app.register_blueprint(get_hardware_monitor_blueprint())
+
+
+@app.route('/')
+def index():
+ return render_template('hardware_monitor.html')
+
+
+@app.route('/health')
+def health():
+ return {'status': 'ok'}
+
+
+def main():
+ parser = argparse.ArgumentParser(description='Hardware Monitor Web UI')
+ parser.add_argument('--port', type=int, default=8889)
+ parser.add_argument('--host', type=str, default='0.0.0.0')
+ args = parser.parse_args()
+ print(f'\n🖥 Hardware Monitor UI → http://{args.host}:{args.port}')
+ app.run(debug=False, use_reloader=False, host=args.host, port=args.port)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/static/hardware_monitor_panel.js b/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/static/hardware_monitor_panel.js
new file mode 100644
index 00000000..784c055a
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/static/hardware_monitor_panel.js
@@ -0,0 +1,750 @@
+// ── Hardware Monitor Panel ────────────────────────────────────────────────────
+// Self-contained cluster-aware component. Mount into #hardware-monitor.
+// All CSS scoped under #hmp-root. All IDs prefixed hmp-.
+
+(function () {
+ 'use strict';
+
+ // ── Styles ────────────────────────────────────────────────────────────────
+ function injectStyles() {
+ if (document.getElementById('hmp-styles')) return;
+ const s = document.createElement('style');
+ s.id = 'hmp-styles';
+ s.textContent = `
+#hmp-root {
+ display: flex; height: 100%; min-height: 0; overflow: hidden;
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ font-size: 13px; color: #e1e4e8; background: #0f1117;
+}
+/* ── Left nav ──────────────────────────────────── */
+#hmp-nav {
+ width: 164px; min-width: 164px; flex-shrink: 0;
+ background: #0d1117; border-right: 1px solid #30363d;
+ display: flex; flex-direction: column; overflow: hidden;
+}
+#hmp-host-section {
+ border-bottom: 1px solid #30363d; padding: 8px 0 4px;
+ flex-shrink: 0;
+}
+.hmp-nav-section {
+ font-size: 10px; font-weight: 600; color: #484f58;
+ text-transform: uppercase; letter-spacing: 0.6px;
+ padding: 6px 14px 3px; user-select: none;
+}
+.hmp-host-btn {
+ display: flex; align-items: center; gap: 7px;
+ width: 100%; background: none; border: none;
+ border-left: 2px solid transparent;
+ padding: 7px 12px; font-size: 12px; font-weight: 500;
+ color: #8b949e; cursor: pointer; text-align: left;
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
+ transition: color .15s, background .15s, border-color .15s;
+}
+.hmp-host-btn:hover { color: #c9d1d9; background: #161b22; border-left-color: #30363d; }
+.hmp-host-btn.active { color: #58a6ff; background: #161b22; border-left-color: #58a6ff; }
+#hmp-view-section { flex: 1; overflow-y: auto; padding: 6px 0; }
+.hmp-nav-sep { height: 1px; background: #21262d; margin: 4px 10px; }
+.hmp-nav-btn {
+ display: block; width: 100%; background: none; border: none;
+ border-left: 2px solid transparent; color: #8b949e;
+ text-align: left; padding: 7px 12px; font-size: 12px; font-weight: 500;
+ cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
+ transition: color .15s, background .15s, border-color .15s;
+}
+.hmp-nav-btn:hover { color: #c9d1d9; background: #161b22; border-left-color: #30363d; }
+.hmp-nav-btn.active { color: #58a6ff; background: #161b22; border-left-color: #58a6ff; }
+/* ── Body ──────────────────────────────────────── */
+#hmp-body {
+ flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden;
+}
+#hmp-topbar {
+ display: flex; align-items: center; justify-content: space-between;
+ padding: 7px 14px; background: #161b22; border-bottom: 1px solid #30363d;
+ flex-shrink: 0; gap: 10px;
+}
+#hmp-topbar-title { font-size: 11px; font-weight: 600; color: #6e7681;
+ text-transform: uppercase; letter-spacing: 0.5px; }
+#hmp-topbar-right { display: flex; align-items: center; gap: 10px; font-size: 11px; color: #6e7681; }
+.hmp-view { display: none; flex: 1; overflow-y: auto; padding: 14px;
+ flex-direction: column; gap: 14px; }
+.hmp-view.active { display: flex; }
+/* ── Dot ───────────────────────────────────────── */
+.hmp-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%;
+ background: #6e7681; flex-shrink: 0; }
+.hmp-dot.ok { background: #2ea043; box-shadow: 0 0 5px #2ea04388; }
+.hmp-dot.warn { background: #d29922; box-shadow: 0 0 5px #d2992288;
+ animation: hmp-pulse 1.5s infinite; }
+.hmp-dot.error { background: #f85149; box-shadow: 0 0 5px #f8514988;
+ animation: hmp-pulse .8s infinite; }
+.hmp-dot.idle { background: #6e7681; }
+.hmp-dot.connecting { background: #58a6ff; animation: hmp-pulse 1s infinite; }
+@keyframes hmp-pulse { 0%,100%{opacity:1} 50%{opacity:.35} }
+/* ── Cards ─────────────────────────────────────── */
+.hmp-card { background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 14px; }
+.hmp-card-head { display: flex; align-items: center; justify-content: space-between;
+ margin-bottom: 12px; }
+.hmp-card-title { font-size: 11px; font-weight: 600; color: #6e7681;
+ text-transform: uppercase; letter-spacing: 0.5px; }
+.hmp-badge { font-size: 10px; padding: 2px 7px; border-radius: 10px;
+ background: #21262d; color: #8b949e; border: 1px solid #30363d; white-space: nowrap; }
+.hmp-badge.ok { background: #0d2b12; color: #3fb950; border-color: #2ea04340; }
+.hmp-badge.warn { background: #2b1e00; color: #d29922; border-color: #d2992240; }
+.hmp-badge.error { background: #2b0a0a; color: #f85149; border-color: #f8514940; }
+/* ── Grids ─────────────────────────────────────── */
+.hmp-g2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
+.hmp-g3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 14px; }
+.hmp-tiles { display: grid; grid-template-columns: repeat(auto-fill,minmax(145px,1fr)); gap: 10px; }
+@media (max-width:900px) { .hmp-g2,.hmp-g3 { grid-template-columns: 1fr; } }
+/* ── Cluster overview ──────────────────────────── */
+.hmp-cluster-grid {
+ display: grid; grid-template-columns: repeat(auto-fill,minmax(260px,1fr)); gap: 12px;
+}
+.hmp-host-card {
+ background: #161b22; border: 1px solid #30363d; border-radius: 8px;
+ padding: 12px 14px; cursor: pointer; transition: border-color .15s;
+}
+.hmp-host-card:hover { border-color: #58a6ff; }
+.hmp-host-card-head { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
+.hmp-host-card-name { font-size: 13px; font-weight: 600; color: #c9d1d9; }
+.hmp-host-mini-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
+.hmp-mini-stat { background: #0d1117; border-radius: 4px; padding: 6px 8px; }
+.hmp-mini-label { font-size: 10px; color: #6e7681; text-transform: uppercase; letter-spacing: 0.3px; }
+.hmp-mini-val { font-size: 14px; font-weight: 700; color: #e1e4e8; }
+.hmp-mini-val.ok { color: #3fb950; }
+.hmp-mini-val.warn { color: #d29922; }
+.hmp-mini-val.error { color: #f85149; }
+/* ── Metric tile ───────────────────────────────── */
+.hmp-tile { background: #0d1117; border: 1px solid #21262d; border-radius: 6px;
+ padding: 12px 14px; }
+.hmp-tile.warn { border-color: #d29922; }
+.hmp-tile.error { border-color: #f85149; }
+.hmp-tile-lbl { font-size: 10px; color: #6e7681; text-transform: uppercase;
+ letter-spacing: 0.4px; margin-bottom: 4px; }
+.hmp-tile-val { font-size: 20px; font-weight: 700; color: #e1e4e8; line-height: 1.2; }
+.hmp-tile-val.ok { color: #3fb950; }
+.hmp-tile-val.warn { color: #d29922; }
+.hmp-tile-val.error { color: #f85149; }
+.hmp-tile-sub { font-size: 11px; color: #8b949e; margin-top: 3px; }
+/* ── Progress ──────────────────────────────────── */
+.hmp-pr { display: flex; align-items: center; gap: 8px; margin-bottom: 7px; }
+.hmp-pr-lbl { font-size: 11px; color: #8b949e; min-width: 72px; }
+.hmp-pr-wrap { flex: 1; background: #21262d; border-radius: 3px; height: 7px; overflow: hidden; }
+.hmp-pr-bar { height: 100%; border-radius: 3px; transition: width .4s ease; }
+.hmp-pr-bar.ok { background: #2ea043; }
+.hmp-pr-bar.warn { background: #d29922; }
+.hmp-pr-bar.error { background: #f85149; }
+.hmp-pr-pct { font-size: 11px; min-width: 36px; text-align: right; color: #c9d1d9; }
+.hmp-pr-pct.ok { color: #3fb950; }
+.hmp-pr-pct.warn { color: #d29922; }
+.hmp-pr-pct.error { color: #f85149; }
+/* ── KV / Table ────────────────────────────────── */
+.hmp-kv { width: 100%; border-collapse: collapse; font-size: 12px; }
+.hmp-kv td { padding: 5px 8px; border-bottom: 1px solid #1c2128; color: #c9d1d9; }
+.hmp-kv td:first-child { color: #6e7681; width: 46%; }
+.hmp-kv tr:last-child td { border-bottom: none; }
+.hmp-tbl { width: 100%; border-collapse: collapse; font-size: 11px; }
+.hmp-tbl th { text-align: left; color: #6e7681; font-size: 10px; font-weight: 600;
+ text-transform: uppercase; letter-spacing: 0.4px;
+ padding: 5px 8px; border-bottom: 1px solid #21262d; }
+.hmp-tbl td { padding: 6px 8px; border-bottom: 1px solid #161b22; color: #c9d1d9; }
+.hmp-tbl tr:last-child td { border-bottom: none; }
+.hmp-tbl tr:hover td { background: #1c2128; }
+/* ── Tags ──────────────────────────────────────── */
+.hmp-tag { display: inline-block; font-size: 10px; padding: 1px 6px; border-radius: 10px;
+ font-weight: 600; text-transform: uppercase; letter-spacing: 0.3px; white-space: nowrap; }
+.hmp-tag-blue { background: #1f3a5f; color: #58a6ff; }
+.hmp-tag-green { background: #1a3a1f; color: #3fb950; }
+.hmp-tag-yellow { background: #3a2e0a; color: #d29922; }
+.hmp-tag-red { background: #3a1212; color: #f85149; }
+.hmp-tag-gray { background: #21262d; color: #8b949e; }
+.hmp-tag-purple { background: #2a1f3a; color: #a371f7; }
+/* ── Core grid ─────────────────────────────────── */
+.hmp-cores { display: grid; grid-template-columns: repeat(auto-fill,minmax(50px,1fr)); gap: 5px; }
+.hmp-core { background: #0d1117; border: 1px solid #21262d; border-radius: 4px;
+ padding: 5px 4px; text-align: center; }
+.hmp-core-id { font-size: 10px; color: #6e7681; }
+.hmp-core-pct { font-size: 13px; font-weight: 700; }
+/* ── Iface / Device ────────────────────────────── */
+.hmp-iface { background: #0d1117; border: 1px solid #21262d; border-radius: 6px;
+ padding: 11px 13px; margin-bottom: 8px; }
+.hmp-iface-head { display: flex; align-items: center; gap: 7px; margin-bottom: 8px; }
+.hmp-iface-name { font-size: 13px; font-weight: 600; color: #c9d1d9; }
+.hmp-addr { font-size: 11px; color: #8b949e; font-family: monospace; margin-bottom: 2px; }
+.hmp-dev { display: flex; align-items: flex-start; gap: 9px; background: #0d1117;
+ border: 1px solid #21262d; border-radius: 6px; padding: 9px 11px; margin-bottom: 6px; }
+.hmp-dev-icon { font-size: 15px; flex-shrink: 0; margin-top: 1px; }
+.hmp-dev-name { font-size: 12px; font-weight: 600; color: #c9d1d9;
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
+.hmp-dev-detail { font-size: 11px; color: #8b949e; margin-top: 2px; }
+.hmp-dev-tags { margin-top: 4px; display: flex; gap: 4px; flex-wrap: wrap; }
+/* ── Flags / Temps ─────────────────────────────── */
+.hmp-flags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
+.hmp-flag { font-size: 10px; padding: 1px 6px; border-radius: 3px;
+ background: #1f3a5f; color: #58a6ff; font-family: monospace; }
+.hmp-temps { display: grid; grid-template-columns: repeat(auto-fill,minmax(130px,1fr)); gap: 8px; }
+.hmp-temp { background: #0d1117; border: 1px solid #21262d; border-radius: 6px; padding: 10px 12px; }
+.hmp-temp-name { font-size: 11px; color: #8b949e; margin-bottom: 4px;
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
+.hmp-temp-val { font-size: 20px; font-weight: 700; }
+/* ── JSON / Empty ──────────────────────────────── */
+.hmp-json { background: #0d1117; border: 1px solid #21262d; border-radius: 6px;
+ padding: 11px; font-family: monospace; font-size: 11px; color: #8b949e;
+ white-space: pre-wrap; overflow-x: auto; max-height: 500px; overflow-y: auto; }
+.hmp-empty { text-align: center; padding: 28px; color: #6e7681; font-size: 12px; }
+.hmp-empty-icon { font-size: 28px; margin-bottom: 6px; }
+`;
+ document.head.appendChild(s);
+ }
+
+ // ── Skeleton HTML ─────────────────────────────────────────────────────────
+ function buildSkeleton(container) {
+ container.innerHTML = `
+
+
+
+
+
View
+
Cluster Overview
+
+
Overview
+
CPU
+
Memory
+
Network
+
Storage
+
GPU / NPU
+
Temperatures
+
+
System Info
+
PCI Devices
+
USB Devices
+
Serial / UART
+
Block Devices
+
Sensors
+
+
Raw JSON
+
+
+
+
+
+
Hardware Monitor
+
+
+ Waiting for hosts…
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
`;
+ }
+
+ // ── State ─────────────────────────────────────────────────────────────────
+ let _activeHost = null;
+ // {host: {status: obj|null, status_ts: str, inventory: obj|null, inventory_ts: str}}
+ const _data = {};
+
+ // ── Helpers ───────────────────────────────────────────────────────────────
+ const X = s => String(s ?? '').replace(/&/g,'&').replace(//g,'>');
+ function pctCls(p,w=85,e=95){ return p>=e?'error':p>=w?'warn':'ok'; }
+ function levelCls(s){ s=String(s||'').toLowerCase(); return s==='ok'?'ok':s==='warn'||s==='warning'?'warn':s==='error'||s==='critical'?'error':''; }
+ function prog(label,pct,sub=''){
+ const c=pctCls(pct);
+ return `${X(label)} ${pct.toFixed(1)}% ${sub?`${X(sub)}
`:''}`;
+ }
+ function kv(rows){ return `${rows.map(([k,v])=>`${X(k)} ${X(v)} `).join('')}
`; }
+ function tag(t,s='blue'){ return `${X(t)} `; }
+ function empty(icon,msg){ return ``; }
+
+ // ── Nav ───────────────────────────────────────────────────────────────────
+ function showView(viewId) {
+ document.querySelectorAll('#hmp-root .hmp-view').forEach(v => v.classList.remove('active'));
+ document.querySelectorAll('#hmp-root .hmp-nav-btn').forEach(b => b.classList.remove('active'));
+ document.getElementById(viewId)?.classList.add('active');
+ document.querySelector(`.hmp-nav-btn[data-view="${viewId}"]`)?.classList.add('active');
+ }
+
+ function bindNav() {
+ document.querySelectorAll('#hmp-root .hmp-nav-btn[data-view]').forEach(btn => {
+ btn.addEventListener('click', () => {
+ const needsHost = btn.classList.contains('hmp-host-required');
+ if (needsHost && !_activeHost) return;
+ showView(btn.dataset.view);
+ if (_activeHost) refreshHostViews();
+ });
+ });
+ }
+
+ // ── Host list in nav ──────────────────────────────────────────────────────
+ function refreshHostNav() {
+ const el = document.getElementById('hmp-host-list');
+ if (!el) return;
+ const hosts = Object.keys(_data).sort();
+ if (hosts.length === 0) {
+ el.innerHTML = `No hosts yet
`;
+ return;
+ }
+ el.innerHTML = hosts.map(h => {
+ const entry = _data[h];
+ const status = entry.status?.status || 'idle';
+ const cls = levelCls(status);
+ const active = h === _activeHost ? ' active' : '';
+ return `
+
+ ${X(h)}
+ `;
+ }).join('');
+ el.querySelectorAll('.hmp-host-btn').forEach(btn => {
+ btn.addEventListener('click', () => selectHost(btn.dataset.host));
+ });
+ }
+
+ function selectHost(host) {
+ _activeHost = host;
+ refreshHostNav();
+ // Update topbar
+ const entry = _data[host] || {};
+ const s = entry.status;
+ const dot = document.getElementById('hmp-dot');
+ const txt = document.getElementById('hmp-status-txt');
+ const ts = document.getElementById('hmp-ts');
+ if (dot) dot.className = `hmp-dot ${levelCls(s?.status)||'idle'}`;
+ if (txt) txt.textContent = `${host} — ${(s?.status||'—').toUpperCase()}`;
+ if (ts && entry.status_ts) ts.textContent = entry.status_ts.slice(11,19)+' UTC';
+ // Switch to overview if currently on cluster view
+ const activeView = document.querySelector('#hmp-root .hmp-view.active');
+ if (!activeView || activeView.id === 'hmp-v-cluster') showView('hmp-v-overview');
+ refreshHostViews();
+ }
+
+ // ── Cluster overview ──────────────────────────────────────────────────────
+ function renderClusterOverview() {
+ const el = document.getElementById('hmp-cluster-grid');
+ if (!el) return;
+ const hosts = Object.keys(_data).sort();
+ if (hosts.length === 0) {
+ el.innerHTML = empty('🖥', 'No cluster hosts detected yet.\nWaiting for hardware_monitor nodes to publish…');
+ return;
+ }
+ el.innerHTML = hosts.map(h => {
+ const s = _data[h].status || {};
+ const cpu = s.cpu || {};
+ const ram = s.ram || {};
+ const net = s.network || {};
+ const overallCls = levelCls(s.status);
+ const ifaceCount = Object.keys(net.interfaces || {}).length;
+ const firstIface = Object.values(net.interfaces || {})[0];
+ const firstIp = firstIface?.ipv4?.[0] || '—';
+ return `
+
+
+ ${X(h)}
+ ${tag((s.status||'—').toUpperCase(), overallCls||'gray')}
+
+
+
+
CPU
+
${(cpu.overall_percent??0).toFixed(0)}%
+
+
+
RAM
+
${(ram.used_percent??0).toFixed(0)}%
+
+
+
Load
+
${(cpu.load_avg?.['1m']??0).toFixed(2)}
+
+
+
+
`;
+ }).join('');
+ el.querySelectorAll('.hmp-host-card').forEach(c => {
+ c.addEventListener('click', () => selectHost(c.dataset.host));
+ });
+ }
+
+ // ── Per-host status views ─────────────────────────────────────────────────
+ function refreshHostViews() {
+ if (!_activeHost) return;
+ const entry = _data[_activeHost] || {};
+ const s = entry.status;
+ const inv = entry.inventory;
+ if (s) {
+ renderOverview(s);
+ renderCpuView(s.cpu);
+ renderMemoryView(s.ram);
+ renderNetworkView(s.network);
+ renderStorageView(s.disk);
+ renderGpuView(s.gpu);
+ renderTempsView(s.temperatures);
+ document.getElementById('hmp-raw-status').textContent = JSON.stringify(s, null, 2);
+ }
+ if (inv) {
+ renderInventory(inv);
+ document.getElementById('hmp-raw-inv').textContent = JSON.stringify(inv, null, 2);
+ }
+ }
+
+ function renderOverview(s) {
+ const cpu=s.cpu||{}, ram=s.ram||{}, net=s.network||{}, ntp=s.ntp||{}, proc=s.processes||{};
+ document.getElementById('hmp-ov-tiles').innerHTML = [
+ {l:'Hostname', v:X(s.hostname||'—'), sub:'', c:''},
+ {l:'CPU', v:`${(cpu.overall_percent??0).toFixed(1)}%`, sub:`load ${(cpu.load_avg?.['1m']??0).toFixed(2)}`, c:pctCls(cpu.overall_percent??0)},
+ {l:'RAM', v:`${(ram.used_percent??0).toFixed(1)}%`, sub:`${ram.used_mb??0}/${ram.total_mb??0} MB`, c:pctCls(ram.used_percent??0)},
+ {l:'Processes', v:proc.total??'—', sub:`${proc.running??0} running`, c:(proc.zombie??0)>5?'warn':''},
+ {l:'NTP', v:ntp.synchronized===false?'UNSYNC':ntp.synchronized===true?'SYNC':'—', sub:ntp.source||'', c:ntp.synchronized===false?'warn':'ok'},
+ {l:'Status', v:(s.status||'—').toUpperCase(), sub:'', c:levelCls(s.status)},
+ ].map(t=>`${t.l}
${t.v}
${t.sub?`
${t.sub}
`:''}
`).join('');
+
+ const pct=cpu.overall_percent??0;
+ document.getElementById('hmp-cpu-badge').textContent=`${pct.toFixed(1)}%`;
+ document.getElementById('hmp-ov-cpu').innerHTML=
+ prog('Overall',pct)+(cpu.per_core_percent||[]).slice(0,6).map((p,i)=>prog(`Core ${i}`,p)).join('');
+
+ const swap=ram.swap||{};
+ document.getElementById('hmp-ov-ram').innerHTML=
+ prog('Used',ram.used_percent??0,`${ram.used_mb??0}/${ram.total_mb??0} MB`)+
+ (swap.total_mb>0?prog('Swap',swap.used_percent??0,`${swap.used_mb??0}/${swap.total_mb??0} MB`):'');
+
+ document.getElementById('hmp-ov-net').innerHTML=
+ Object.entries(net.interfaces||{}).map(([nm,iface])=>{
+ const up=iface.is_up;
+ return `
+
+ ${X(nm)}
+ ${tag(up?'UP':'DOWN',up?'green':'red')}
+ ${iface.type?tag(iface.type,'blue'):''}
+
+
🌐 ${X((iface.ipv4||[]).join(', ')||'no address')}
+ ${iface.mac?`
⊟ ${X(iface.mac)}
`:''}
+
`;
+ }).join('')||empty('📡','No interfaces');
+
+ document.getElementById('hmp-ov-disk').innerHTML=
+ Object.entries((s.disk||{}).mounts||{}).slice(0,6)
+ .map(([mp,m])=>prog(mp,m.used_percent??0,`${m.used_gb}/${m.total_gb} GB · ${m.fstype||''}`))
+ .join('')||empty('💾','No mounts');
+ }
+
+ function renderCpuView(cpu) {
+ if (!cpu) return;
+ document.getElementById('hmp-cpu-summary').innerHTML=kv([
+ ['Overall %',`${(cpu.overall_percent??0).toFixed(1)}%`],
+ ['Frequency', cpu.freq_mhz?`${cpu.freq_mhz} MHz`:'—'],
+ ['Status', (cpu.status||'—').toUpperCase()],
+ ]);
+ const la=cpu.load_avg||{};
+ document.getElementById('hmp-cpu-load').innerHTML=kv([['1 min',la['1m']??'—'],['5 min',la['5m']??'—'],['15 min',la['15m']??'—']]);
+ const cores=cpu.per_core_percent||[];
+ document.getElementById('hmp-core-count').textContent=`${cores.length} cores`;
+ document.getElementById('hmp-cores').innerHTML=
+ cores.map((p,i)=>``).join('')
+ ||empty('⚙','No data');
+ }
+
+ function renderMemoryView(ram) {
+ if (!ram) return;
+ document.getElementById('hmp-ram-detail').innerHTML=
+ prog('Used',ram.used_percent??0)+kv([['Total',`${ram.total_mb??0} MB`],['Used',`${ram.used_mb??0} MB`],['Available',`${ram.available_mb??0} MB`]]);
+ const swap=ram.swap||{};
+ document.getElementById('hmp-swap-detail').innerHTML=
+ (swap.total_mb>0?prog('Used',swap.used_percent??0):'')+kv([['Total',`${swap.total_mb??0} MB`],['Used',`${swap.used_mb??0} MB`]]);
+ }
+
+ function renderNetworkView(net) {
+ if (!net) return;
+ document.getElementById('hmp-net-cards').innerHTML=
+ Object.entries(net.interfaces||{}).map(([nm,iface])=>{
+ const up=iface.is_up, io=iface.io||{};
+ const addrs=[...(iface.ipv4||[]),...(iface.ipv6||[])];
+ return `
+
+
+
+ ${X(nm)}
+ ${tag(up?'UP':'DOWN',up?'green':'red')}
+ ${iface.type?tag(iface.type,'blue'):''}
+
+ ${iface.driver?`
${X(iface.driver)} `:''}
+
+
+
${kv([['MAC',iface.mac||'—'],['MTU',iface.mtu||'—'],['Speed',iface.speed_mbps?`${iface.speed_mbps} Mbps`:'—'],['Duplex',iface.duplex||'—'],['State',iface.operstate||'—']])}
+
${addrs.map(a=>`
${X(a)}
`).join('')||empty('🌐','No addresses')}
+
+ ${Object.keys(io).length?`
${kv([['Sent',`${io.bytes_sent_mb??0} MB`],['Received',`${io.bytes_recv_mb??0} MB`],['Errors',`${io.errors_in??0} in / ${io.errors_out??0} out`],['Drops',`${io.drops_in??0} in / ${io.drops_out??0} out`]])}
`:''}
+
`;
+ }).join('')||empty('📡','No network data');
+ }
+
+ function renderStorageView(disk) {
+ if (!disk) return;
+ document.getElementById('hmp-mounts').innerHTML=
+ `Mount Type Total Used Free % `+
+ Object.entries(disk.mounts||{}).map(([mp,m])=>`${X(mp)} ${tag(m.fstype||'?','gray')} ${m.total_gb} GB ${m.used_gb} GB ${m.free_gb} GB ${(m.used_percent??0).toFixed(1)}% `).join('')+
+ `
`||empty('💾','No mounts');
+ const io=disk.io, ioCard=document.getElementById('hmp-io-card');
+ if (io) { ioCard.style.display=''; document.getElementById('hmp-io-detail').innerHTML=kv([['Total Read',`${io.total_read_mb} MB`],['Total Write',`${io.total_write_mb} MB`],['Read Count',io.read_count],['Write Count',io.write_count]]); }
+ else ioCard.style.display='none';
+ }
+
+ function renderGpuView(gpuList) {
+ const el=document.getElementById('hmp-gpu-cards');
+ if (!gpuList||!gpuList.length){el.innerHTML=empty('🎮','No GPU / NPU detected');return;}
+ el.innerHTML=gpuList.map(gpu=>`
+
+
+
${X(gpu.name||'GPU')} ${tag(gpu.vendor||'?','purple')} ${tag(gpu.type||'GPU','blue')}
+
${(gpu.status||'—').toUpperCase()}
+
+ ${gpu.utilization_percent!==undefined?prog('GPU',gpu.utilization_percent):''}
+ ${gpu.memory_utilization_percent!==undefined?prog('VRAM',gpu.memory_utilization_percent):''}
+ ${kv([...(gpu.temperature_celsius!==undefined?[['Temperature',`${gpu.temperature_celsius} °C`]]:[]),...(gpu.memory_used_mb?[['VRAM Used',`${gpu.memory_used_mb}/${gpu.memory_total_mb} MB`]]:[]),...(gpu.power_draw_w?[['Power',`${gpu.power_draw_w} W`]]:[])],)}
+
`).join('');
+ }
+
+ function renderTempsView(temps) {
+ const el=document.getElementById('hmp-temp-grid');
+ if (!temps||!temps.sensors||!Object.keys(temps.sensors).length){el.innerHTML=empty('🌡','No data');return;}
+ const cells=[];
+ for (const [chip,readings] of Object.entries(temps.sensors)) {
+ if (readings?.celsius!==undefined) {
+ const c=pctCls(readings.celsius,70,85);
+ cells.push(`${X(chip)}
${readings.celsius}°C
`);
+ } else if (typeof readings==='object') {
+ for (const [label,r] of Object.entries(readings)) {
+ if (r?.celsius!==undefined) {
+ const c=pctCls(r.celsius,70,85);
+ cells.push(`${X(chip)}/${X(label)}
${r.celsius}°C
${r.critical?`
crit ${r.critical}°C
`:''}
`);
+ }
+ }
+ }
+ }
+ el.innerHTML=cells.join('')||empty('🌡','No readings');
+ }
+
+ function renderInventory(inv) {
+ if (!inv) return;
+ const sys=inv.system||{}, cpu=inv.cpu||{}, ram=inv.ram||{};
+ document.getElementById('hmp-inv-sys-kv').innerHTML=kv([['Hostname',inv.hostname||'—'],['OS',sys.os||'—'],['Kernel',sys.kernel||'—'],['Architecture',sys.machine||'—']]);
+ document.getElementById('hmp-inv-cpu-kv').innerHTML=
+ kv([['Model',cpu.model||'—'],['Architecture',cpu.architecture||'—'],['Physical Cores',cpu.physical_cores||'—'],['Logical Cores',cpu.logical_cores||'—'],['Max Freq',cpu.base_frequency_mhz?`${cpu.base_frequency_mhz} MHz`:'—'],['L1d Cache',cpu.cache?.l1d_kb?`${cpu.cache.l1d_kb} KB`:'—'],['L2 Cache',cpu.cache?.l2_kb?`${cpu.cache.l2_kb} KB`:'—'],['L3 Cache',cpu.cache?.l3_kb?`${cpu.cache.l3_kb} KB`:'—']])+
+ (cpu.flags?.length?`${cpu.flags.map(f=>`${X(f)} `).join('')}
`:'');
+ document.getElementById('hmp-inv-ram-kv').innerHTML=
+ kv([['Total',`${ram.total_mb||0} MB`],['NUMA Nodes',(ram.numa_nodes||[]).length]])+
+ (ram.numa_nodes||[]).map(n=>`Node ${n.node}: ${n.total_mb} MB · CPUs ${n.cpus}
`).join('');
+ const pci=inv.pci||[];
+ document.getElementById('hmp-pci-tbl').innerHTML=pci.length
+ ?`Slot Class IDs Driver ${pci.map(d=>`${X(d.slot)} ${tag(d.subclass_label||d.class_label||'?','gray')} ${X(d.vendor_id)}:${X(d.device_id)} ${d.driver?tag(d.driver,'blue'):''} `).join('')}
`
+ :empty('🔌','No PCI devices');
+ const usb=inv.usb||[];
+ document.getElementById('hmp-usb-list').innerHTML=usb.length
+ ?usb.map(d=>`🔌
${X(d.product||d.id||'USB Device')}
${X(d.manufacturer||'')} · ${X(d.id)} · USB ${X(d.usb_version||'?')} · ${X(d.speed_mbps||'?')} Mbps
${tag(d.class_label||'?','gray')}${(d.drivers||[]).map(dr=>tag(dr,'blue')).join('')}${d.serial?`${X(d.serial)} `:''}
`).join('')
+ :empty('🔌','No USB devices');
+ const serial=inv.serial||[];
+ document.getElementById('hmp-serial-list').innerHTML=serial.length
+ ?serial.map(d=>`📡
${X(d.device)}
${X(d.type)} · driver: ${X(d.driver||'—')}
${d.uart_type?`
UART ${X(d.uart_type)} · 0x${X(d.port_address||'?')} · IRQ ${X(d.irq||'?')}
`:''}${d.usb_manufacturer?`
USB: ${X(d.usb_manufacturer)} ${X(d.usb_product||'')}
`:''}${d.is_console?tag('console','yellow'):''}
`).join('')
+ :empty('📡','No serial ports');
+ const stor=inv.storage||[];
+ document.getElementById('hmp-blk-list').innerHTML=stor.length
+ ?stor.map(d=>`💾
${X(d.device)} ${X(d.size)}
${X(d.model||'—')} · ${X(d.vendor||'—')}
${tag(d.type,'blue')} ${d.transport?tag(d.transport,'gray'):''}${d.serial?`${X(d.serial)} `:''}
${d.partitions} partition(s) · ${d.logical_sector_bytes||512}B sectors
`).join('')
+ :empty('💾','No block devices');
+ const sensors=inv.sensors||[];
+ document.getElementById('hmp-sensor-list').innerHTML=sensors.length
+ ?sensors.map(d=>`📷
${X(d.name)}
${tag(d.type,'blue')} ${tag(d.interface,'gray')}
${d.device?`
${X(d.device)}
`:''}
`).join('')
+ :empty('📷','No sensors');
+ const audio=inv.audio||[], inputs=inv.input||[];
+ document.getElementById('hmp-input-list').innerHTML=[
+ ...audio.map(d=>`🔊
${X(d.name||d.description)}
${X(d.description||'')} · card ${d.card_index}
`),
+ ...inputs.map(d=>`⌨
${X(d.name)}
${tag(d.type,'gray')}
${d.phys?`
${X(d.phys)}
`:''}
`),
+ ].join('')||empty('⌨','No input/audio');
+ }
+
+ // ── Data fetching ─────────────────────────────────────────────────────────
+ let _sse = null;
+
+ function connectSSE() {
+ if (_sse) { _sse.close(); _sse = null; }
+ _sse = new EventSource('/api/hardware/stream');
+ _sse.onmessage = e => {
+ try {
+ const p = JSON.parse(e.data);
+ const host = p.host;
+ if (!host) return;
+ if (!_data[host]) _data[host] = {status:null,status_ts:null,inventory:null,inventory_ts:null};
+ _data[host].status = p.data;
+ _data[host].status_ts = p.received_at;
+ refreshHostNav();
+ renderClusterOverview();
+ if (_activeHost === host) {
+ // Update topbar
+ const dot=document.getElementById('hmp-dot');
+ const txt=document.getElementById('hmp-status-txt');
+ const ts =document.getElementById('hmp-ts');
+ if(dot) dot.className=`hmp-dot ${levelCls(p.data?.status)||'idle'}`;
+ if(txt) txt.textContent=`${host} — ${(p.data?.status||'—').toUpperCase()}`;
+ if(ts && p.received_at) ts.textContent=p.received_at.slice(11,19)+' UTC';
+ refreshHostViews();
+ }
+ } catch (_) {}
+ };
+ _sse.onerror = () => {
+ document.getElementById('hmp-dot')?.setAttribute('class','hmp-dot idle');
+ document.getElementById('hmp-status-txt').textContent = 'Reconnecting…';
+ _sse.close(); _sse = null;
+ setTimeout(connectSSE, 4000);
+ };
+ _sse.onopen = () => {
+ document.getElementById('hmp-status-txt').textContent =
+ _activeHost ? `${_activeHost} — connected` : 'Connected — waiting for hosts…';
+ };
+ }
+
+ async function pollHosts() {
+ try {
+ const r = await fetch('/api/hardware/hosts');
+ if (!r.ok) return;
+ const d = await r.json();
+ for (const [host, meta] of Object.entries(d.hosts || {})) {
+ if (!_data[host]) _data[host] = {status:null,status_ts:null,inventory:null,inventory_ts:null};
+ // Fetch inventory for new hosts or stale ones
+ if (meta.inventory_available && !_data[host].inventory) {
+ fetch(`/api/hardware/hosts/${host}/inventory`)
+ .then(r => r.ok ? r.json() : null)
+ .then(d => {
+ if (d?.available) {
+ _data[host].inventory = d.data;
+ _data[host].inventory_ts = d.received_at;
+ if (_activeHost === host) refreshHostViews();
+ }
+ }).catch(() => {});
+ }
+ }
+ refreshHostNav();
+ renderClusterOverview();
+ } catch (_) {}
+ }
+
+ // ── Public API ────────────────────────────────────────────────────────────
+ function init() {
+ const container = document.getElementById('hardware-monitor');
+ if (!container || document.getElementById('hmp-root')) return;
+ injectStyles();
+ buildSkeleton(container);
+ bindNav();
+ connectSSE();
+ pollHosts();
+ setInterval(pollHosts, 10000);
+ }
+
+ window.HardwareMonitorPanel = { init };
+
+ window.addEventListener('tabchange', e => {
+ if (e.detail.tab === 'hardware-monitor') {
+ if (!document.getElementById('hmp-root')) init();
+ }
+ });
+
+ window.addEventListener('DOMContentLoaded', () => {
+ if (document.getElementById('hardware-monitor')?.classList.contains('active')) init();
+ });
+})();
diff --git a/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/templates/hardware_monitor.html b/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/templates/hardware_monitor.html
new file mode 100644
index 00000000..f9e6a808
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/hardware_monitor/web_ui/templates/hardware_monitor.html
@@ -0,0 +1,933 @@
+
+
+
+
+
+ Hardware Monitor
+
+
+
+
+
+
+
+
+
+ Overview
+ CPU
+ Memory
+ Network
+ Storage
+ GPU / NPU
+ Temperatures
+ Hardware Inventory
+ Raw JSON
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ros2_workspace/src/adore_interfaces/sumo_bridge b/ros2_workspace/src/adore_interfaces/sumo_bridge
new file mode 160000
index 00000000..b77ed768
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/sumo_bridge
@@ -0,0 +1 @@
+Subproject commit b77ed7686ce3974931b92978cc3d55fb79d9bfa8
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/config/bridge_config.yaml b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/config/bridge_config.yaml
new file mode 100644
index 00000000..ea3a9908
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/config/bridge_config.yaml
@@ -0,0 +1,9 @@
+ros2_to_zenoh:
+ - ros_topic: "/ros2_chatter"
+ zenoh_key: "0/ros2_chatter/**"
+ msg_type: "std_msgs/msg/String"
+
+zenoh_to_ros2:
+ - zenoh_key: "0/zenoh_chatter/**"
+ ros_topic: "/zenoh_chatter"
+ msg_type: "std_msgs/msg/String"
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/launch/bridge.launch.py b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/launch/bridge.launch.py
new file mode 100644
index 00000000..7f4030bc
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/launch/bridge.launch.py
@@ -0,0 +1,20 @@
+from launch import LaunchDescription
+from launch_ros.actions import Node
+from launch.actions import DeclareLaunchArgument
+from launch.substitutions import LaunchConfiguration
+from ament_index_python.packages import get_package_share_directory
+import os
+
+def generate_launch_description():
+ config = os.path.join(get_package_share_directory('zenoh_message_bridge'), 'config', 'bridge_config.yaml')
+ return LaunchDescription([
+ DeclareLaunchArgument('zenoh_router', default_value='tcp/localhost:7447'),
+ Node(
+ package='zenoh_message_bridge',
+ executable='bridge_node',
+ parameters=[{
+ 'config_path': config,
+ 'zenoh_router': LaunchConfiguration('zenoh_router'),
+ }]
+ )
+ ])
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/package.xml b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/package.xml
new file mode 100644
index 00000000..cf972021
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/package.xml
@@ -0,0 +1,16 @@
+
+
+ zenoh_message_bridge
+ 1.0.0
+ Bridge between ROS 2 and Zenoh
+ Eclipse ADORe
+ Apache-2.0
+ rclpy
+ std_msgs
+ rosidl_runtime_py
+ yq
+ eclipse-zenoh
+
+ ament_python
+
+
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/requirements.pip3 b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/requirements.pip3
new file mode 100644
index 00000000..287f9df2
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/requirements.pip3
@@ -0,0 +1,4 @@
+eclipse-zenoh==1.6.2
+pyyaml
+numpy
+yq
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/resource/zenoh_message_bridge b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/resource/zenoh_message_bridge
new file mode 100644
index 00000000..e69de29b
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/setup.cfg b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/setup.cfg
new file mode 100644
index 00000000..dfdf789f
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/setup.cfg
@@ -0,0 +1,8 @@
+[metadata]
+name = zenoh_message_bridge
+
+[develop]
+script_dir=$base/lib/zenoh_message_bridge
+
+[install]
+install_scripts=$base/lib/zenoh_message_bridge
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/setup.py b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/setup.py
new file mode 100644
index 00000000..bac8fd17
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/setup.py
@@ -0,0 +1,27 @@
+from setuptools import setup
+import os
+
+package_name = 'zenoh_message_bridge'
+
+setup(
+ name=package_name,
+ version='1.0.0',
+ packages=[package_name],
+ data_files=[
+ # This specific line makes 'ros2 pkg list' work
+ ('share/ament_index/resource_index/packages', ['resource/' + package_name]),
+ ('share/' + package_name, ['package.xml']),
+ ('share/' + package_name + '/config', ['config/bridge_config.yaml']),
+ ('share/' + package_name + '/launch', ['launch/bridge.launch.py']),
+ ],
+ install_requires=['setuptools', 'yq', 'eclipse-zenoh'],
+ zip_safe=True,
+ maintainer='akoerner',
+ description='ROS 2 Zenoh Bridge',
+ license='Apache-2.0',
+ entry_points={
+ 'console_scripts': [
+ 'bridge_node = zenoh_message_bridge.bridge_node:main'
+ ],
+ },
+)
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/start_local_zenoh_router.sh b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/start_local_zenoh_router.sh
new file mode 100644
index 00000000..520b2370
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/start_local_zenoh_router.sh
@@ -0,0 +1,5 @@
+docker run --rm -d \
+ --name zenoh-router \
+ -p 7446:7447/tcp \
+ -p 7446:7446/udp \
+ eclipse/zenoh:latest
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/start_zenoh_message_bridge.sh b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/start_zenoh_message_bridge.sh
new file mode 100644
index 00000000..77cfe2e6
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/start_zenoh_message_bridge.sh
@@ -0,0 +1 @@
+RMW_IMPLEMENTATION=rmw_fastrtps_cpp ros2 launch zenoh_message_bridge bridge.launch.py
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/stop_local_zenoh_router.sh b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/stop_local_zenoh_router.sh
new file mode 100644
index 00000000..d020f3e2
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/stop_local_zenoh_router.sh
@@ -0,0 +1 @@
+docker stop zenoh-router
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_bridge_config.json5 b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_bridge_config.json5
new file mode 100644
index 00000000..48efed7c
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_bridge_config.json5
@@ -0,0 +1,57 @@
+{
+ mode: "peer",
+
+ // id: "aabbccdd1122334455667788aabbccdd",
+
+ listen: {
+ endpoints: [
+ //"tcp/0.0.0.0:7447",
+ ],
+ },
+
+ connect: {
+ // Remote bridges or zenoh routers to connect to at startup
+ endpoints: [
+ "tcp/127.0.0.1:7447",
+ ],
+ },
+
+ scouting: {
+ multicast: {
+ enabled: true,
+ autoconnect: { router: ["router"], peer: ["router", "peer"] },
+ },
+ },
+
+ plugins: {
+ ros2dds: {
+ nodename: "zenoh_bridge_ros2dds",
+
+ // namespace: "/adore",
+
+ // DDS domain ID. Defaults to $ROS_DOMAIN_ID or 0.
+ domain: 0,
+
+ ros_localhost_only: false,
+
+ // Matches ROS_AUTOMATIC_DISCOVERY_RANGE=SUBNET in the container env.
+ // Options: localhost, subnet, off
+ ros_automatic_discovery_range: "SUBNET",
+
+ // allow: ".*",
+ // deny: ".*/camera/image_raw",
+
+ // pub_max_frequencies: [
+ // ".*/camera/image_raw=5",
+ // ".*/pointcloud=10",
+ // ],
+
+ // pub_priorities: [
+ // "/emergency_stop=1:express",
+ // "/cmd_vel=2:express",
+ // "/diagnostics=7",
+ // ],
+ },
+ },
+}
+
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_echo.py b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_echo.py
new file mode 100644
index 00000000..40860e17
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_echo.py
@@ -0,0 +1,19 @@
+import zenoh
+import struct
+
+def decode_string(payload: bytes) -> str:
+ # CDR string: 4-byte header + 4-byte length + string bytes (null terminated)
+ length = struct.unpack_from(' QoSProfile:
+ return QoSProfile(
+ depth=mapping.get('qos_depth', 10),
+ durability=_DURABILITY.get(mapping.get('qos_durability', 'volatile'), DurabilityPolicy.VOLATILE),
+ reliability=_RELIABILITY.get(mapping.get('qos_reliability', 'best_effort'), ReliabilityPolicy.BEST_EFFORT),
+ history=HistoryPolicy.KEEP_LAST,
+ )
+
+
+class ROS2ZenohBridge(Node):
+ def __init__(self):
+ super().__init__('zenoh_bridge_node')
+ self.declare_parameter('config_path', '')
+ self.declare_parameter('zenoh_router', 'tcp/localhost:7447')
+
+ config_path = self.get_parameter('config_path').get_parameter_value().string_value
+ if not config_path or not os.path.exists(config_path):
+ self.get_logger().error(f"Config file not found: {config_path}")
+ return
+
+ try:
+ with open(config_path, 'r') as f:
+ self.config = yaml.safe_load(f)
+ except Exception as e:
+ self.get_logger().error(f"Failed to load config: {e}")
+ return
+
+ self.zenoh_session = None
+ self.zenoh_subs = []
+ self.zenoh_pubs = {}
+ self.ros_subs = []
+ self.ros_pubs = {}
+ self._z2r_queue = queue.Queue()
+ self._shutdown_event = threading.Event()
+
+ self._setup_zenoh()
+ self._setup_ros2_to_zenoh()
+ self._setup_zenoh_to_ros2()
+ self.create_timer(0.01, self._drain_z2r_queue)
+
+ def _setup_zenoh(self):
+ endpoint = self.get_parameter('zenoh_router').get_parameter_value().string_value
+ z_config = zenoh.Config()
+ z_config.insert_json5('connect/endpoints', f'["{endpoint}"]')
+ self.zenoh_session = zenoh.open(z_config)
+ self.get_logger().info(f'Connected to Zenoh: {endpoint}')
+
+ def _setup_ros2_to_zenoh(self):
+ for mapping in self.config.get('ros2_to_zenoh', []):
+ ros_topic = mapping['ros_topic']
+ zenoh_key = mapping['zenoh_key']
+ msg_type = load_msg_type(mapping.get('msg_type', 'std_msgs/msg/String'))
+ qos = _qos_from_mapping(mapping)
+ pub = self.zenoh_session.declare_publisher(zenoh_key)
+ self.zenoh_pubs[ros_topic] = pub
+ cb = lambda msg, p=pub, k=zenoh_key: (p.put(msg_to_bytes(msg)), self.get_logger().debug(f'R2Z: {k}'))
+ self.ros_subs.append(self.create_subscription(msg_type, ros_topic, cb, qos))
+
+ def _setup_zenoh_to_ros2(self):
+ for mapping in self.config.get('zenoh_to_ros2', []):
+ z_key = mapping['zenoh_key']
+ ros_topic = mapping['ros_topic']
+ m_type = load_msg_type(mapping.get('msg_type', 'std_msgs/msg/String'))
+ qos = _qos_from_mapping(mapping)
+ pub = self.create_publisher(m_type, ros_topic, qos)
+ self.ros_pubs[z_key] = pub
+ def z_cb(sample, p=pub, mt=m_type, t=ros_topic):
+ if self._shutdown_event.is_set():
+ return
+ try:
+ self._z2r_queue.put((p, bytes_to_msg(sample.payload.to_bytes(), mt)))
+ except Exception as e:
+ self.get_logger().error(f'Deser failed on {t}: {e}')
+ self.zenoh_subs.append(self.zenoh_session.declare_subscriber(z_key, z_cb))
+
+ def _drain_z2r_queue(self):
+ while not self._z2r_queue.empty():
+ pub, msg = self._z2r_queue.get_nowait()
+ pub.publish(msg)
+
+ def shutdown(self):
+ self._shutdown_event.set()
+ for s in self.zenoh_subs:
+ s.undeclare()
+ if self.zenoh_session:
+ self.zenoh_session.close()
+
+
+def main(args=None):
+ rclpy.init(args=args)
+ node = ROS2ZenohBridge()
+ executor = MultiThreadedExecutor()
+ executor.add_node(node)
+ try:
+ executor.spin()
+ except KeyboardInterrupt:
+ pass
+ finally:
+ node.shutdown()
+ executor.shutdown()
+ node.destroy_node()
+ rclpy.shutdown()
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_message_bridge/utils.py b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_message_bridge/utils.py
new file mode 100644
index 00000000..b6c9701a
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_message_bridge/utils.py
@@ -0,0 +1,19 @@
+import importlib
+from rclpy.serialization import serialize_message, deserialize_message
+
+
+def load_msg_type(msg_type_str: str):
+ try:
+ pkg, interface, name = msg_type_str.split('/')
+ except ValueError:
+ raise ValueError(f"Invalid msg_type '{msg_type_str}'. Expected 'pkg/msg/Name'.")
+ module = importlib.import_module(f'{pkg}.{interface}')
+ return getattr(module, name)
+
+
+def msg_to_bytes(msg) -> bytes:
+ return serialize_message(msg)
+
+
+def bytes_to_msg(data: bytes, msg_type):
+ return deserialize_message(data, msg_type)
diff --git a/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_publish.py b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_publish.py
new file mode 100644
index 00000000..781c5ac5
--- /dev/null
+++ b/ros2_workspace/src/adore_interfaces/zenoh_message_bridge/zenoh_publish.py
@@ -0,0 +1,18 @@
+import zenoh
+import json
+import time
+
+conf = zenoh.Config.from_json5('''
+{
+ mode: "client",
+ connect: { endpoints: ["tcp/127.0.0.1:7447"] }
+}
+''')
+
+with zenoh.open(conf) as session:
+ pub = session.declare_publisher("zenoh/chatter")
+ while True:
+ payload = json.dumps({"data": "Hello, Zenoh!"}).encode('utf-8')
+ pub.put(payload)
+ print("Published: Hello, Zenoh!")
+ time.sleep(1)
diff --git a/ros2_workspace/src/adore_libraries/adore_controllers b/ros2_workspace/src/adore_libraries/adore_controllers
new file mode 160000
index 00000000..9cf8779f
--- /dev/null
+++ b/ros2_workspace/src/adore_libraries/adore_controllers
@@ -0,0 +1 @@
+Subproject commit 9cf8779f5c715076b27ecd07fbf947d653fc369a
diff --git a/adore_libraries/adore_dynamics b/ros2_workspace/src/adore_libraries/adore_dynamics
similarity index 100%
rename from adore_libraries/adore_dynamics
rename to ros2_workspace/src/adore_libraries/adore_dynamics
diff --git a/ros2_workspace/src/adore_libraries/adore_map b/ros2_workspace/src/adore_libraries/adore_map
new file mode 160000
index 00000000..2349d3c6
--- /dev/null
+++ b/ros2_workspace/src/adore_libraries/adore_map
@@ -0,0 +1 @@
+Subproject commit 2349d3c6be9328f0652357aba873d0691ec0efb7
diff --git a/ros2_workspace/src/adore_libraries/adore_math b/ros2_workspace/src/adore_libraries/adore_math
new file mode 160000
index 00000000..2944f2a7
--- /dev/null
+++ b/ros2_workspace/src/adore_libraries/adore_math
@@ -0,0 +1 @@
+Subproject commit 2944f2a7257f1eaccec80d38213862d64046f5ea
diff --git a/ros2_workspace/src/adore_libraries/adore_planning b/ros2_workspace/src/adore_libraries/adore_planning
new file mode 160000
index 00000000..4bfd5bbe
--- /dev/null
+++ b/ros2_workspace/src/adore_libraries/adore_planning
@@ -0,0 +1 @@
+Subproject commit 4bfd5bbed858f877fda90a9de539468b727aebbd
diff --git a/ros2_workspace/src/adore_ros2_conversions/adore_dynamics_conversions b/ros2_workspace/src/adore_ros2_conversions/adore_dynamics_conversions
new file mode 160000
index 00000000..ae56ed1e
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_conversions/adore_dynamics_conversions
@@ -0,0 +1 @@
+Subproject commit ae56ed1e51ef714f545445e9268141e5834d6de2
diff --git a/ros2_workspace/src/adore_ros2_conversions/adore_map_conversions b/ros2_workspace/src/adore_ros2_conversions/adore_map_conversions
new file mode 160000
index 00000000..57fea44b
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_conversions/adore_map_conversions
@@ -0,0 +1 @@
+Subproject commit 57fea44bd9c91458add29b3841d8f8e002ecd769
diff --git a/ros2_workspace/src/adore_ros2_conversions/adore_math_conversions b/ros2_workspace/src/adore_ros2_conversions/adore_math_conversions
new file mode 160000
index 00000000..b4bf531b
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_conversions/adore_math_conversions
@@ -0,0 +1 @@
+Subproject commit b4bf531b48c23c9389e54654759abde28153ab51
diff --git a/ros2_workspace/src/adore_ros2_msgs b/ros2_workspace/src/adore_ros2_msgs
new file mode 160000
index 00000000..63f0ed87
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_msgs
@@ -0,0 +1 @@
+Subproject commit 63f0ed87bcb6cdb42dbf0ecc191721b77e838d08
diff --git a/ros2_workspace/src/adore_ros2_nodes/decision_maker b/ros2_workspace/src/adore_ros2_nodes/decision_maker
new file mode 160000
index 00000000..64f5b401
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_nodes/decision_maker
@@ -0,0 +1 @@
+Subproject commit 64f5b4016c5ea645cabf5fc95d15707f20e35c42
diff --git a/ros2_workspace/src/adore_ros2_nodes/decision_maker_infrastructure b/ros2_workspace/src/adore_ros2_nodes/decision_maker_infrastructure
new file mode 160000
index 00000000..2e92b6de
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_nodes/decision_maker_infrastructure
@@ -0,0 +1 @@
+Subproject commit 2e92b6de5af0701675df833419079d05f07d8286
diff --git a/ros2_workspace/src/adore_ros2_nodes/mission_control b/ros2_workspace/src/adore_ros2_nodes/mission_control
new file mode 160000
index 00000000..6714a645
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_nodes/mission_control
@@ -0,0 +1 @@
+Subproject commit 6714a64539cec69aeaafb70608450dfe910d8527
diff --git a/ros2_workspace/src/adore_ros2_nodes/operational_design_domain b/ros2_workspace/src/adore_ros2_nodes/operational_design_domain
new file mode 160000
index 00000000..b351ea36
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_nodes/operational_design_domain
@@ -0,0 +1 @@
+Subproject commit b351ea36796bf29355a5063f65708e6c02e32b4a
diff --git a/ros2_workspace/src/adore_ros2_nodes/simulated_remote_operator b/ros2_workspace/src/adore_ros2_nodes/simulated_remote_operator
new file mode 160000
index 00000000..64f11394
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_nodes/simulated_remote_operator
@@ -0,0 +1 @@
+Subproject commit 64f11394e8b9d60205e9b740884a9287be17b433
diff --git a/ros2_workspace/src/adore_ros2_nodes/simulated_vehicle b/ros2_workspace/src/adore_ros2_nodes/simulated_vehicle
new file mode 160000
index 00000000..8e2ce43f
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_nodes/simulated_vehicle
@@ -0,0 +1 @@
+Subproject commit 8e2ce43f383f53cdcc408367085c482d8fa853f6
diff --git a/ros2_workspace/src/adore_ros2_nodes/trajectory_tracker b/ros2_workspace/src/adore_ros2_nodes/trajectory_tracker
new file mode 160000
index 00000000..dd0fca7c
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_nodes/trajectory_tracker
@@ -0,0 +1 @@
+Subproject commit dd0fca7cfecbab1d38dceca66c8b765ae6613067
diff --git a/ros2_workspace/src/adore_ros2_nodes/visualizer b/ros2_workspace/src/adore_ros2_nodes/visualizer
new file mode 160000
index 00000000..59e24559
--- /dev/null
+++ b/ros2_workspace/src/adore_ros2_nodes/visualizer
@@ -0,0 +1 @@
+Subproject commit 59e2455995d622876b247a18eb7c0ee2419adf04
diff --git a/adore_test_programs/adore_map_downloader_test/CMakeLists.txt b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/CMakeLists.txt
similarity index 100%
rename from adore_test_programs/adore_map_downloader_test/CMakeLists.txt
rename to ros2_workspace/src/adore_test_programs/adore_map_downloader_test/CMakeLists.txt
diff --git a/adore_test_programs/adore_map_downloader_test/basic_map_loading_from_wfs_test.cpp b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/basic_map_loading_from_wfs_test.cpp
similarity index 100%
rename from adore_test_programs/adore_map_downloader_test/basic_map_loading_from_wfs_test.cpp
rename to ros2_workspace/src/adore_test_programs/adore_map_downloader_test/basic_map_loading_from_wfs_test.cpp
diff --git a/adore_test_programs/adore_map_downloader_test/config/r2s_wfs_config_bs.json b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/config/r2s_wfs_config_bs.json
similarity index 100%
rename from adore_test_programs/adore_map_downloader_test/config/r2s_wfs_config_bs.json
rename to ros2_workspace/src/adore_test_programs/adore_map_downloader_test/config/r2s_wfs_config_bs.json
diff --git a/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/csv/de_bs_borders_wfs.r2sl b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/csv/de_bs_borders_wfs.r2sl
new file mode 100644
index 00000000..760332e7
--- /dev/null
+++ b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/csv/de_bs_borders_wfs.r2sl
@@ -0,0 +1,38 @@
+"id","geometry","type","material","datasourcedescription_id","parent_id"
+1345,"LINESTRING (603931.26599 5795117.508608,603954.573672 5795123.521197)","driving","asphalt",0,1031
+1346,"LINESTRING (603952.544042 5795129.849166,603929.67891 5795123.78571)","driving","asphalt",0,1031
+1498,"LINESTRING (603903.914259 5795114.379207,603909.718225 5795114.528986,603923.572853 5795115.839559,603931.26599 5795117.508608)","driving","asphalt",0,1166
+1499,"LINESTRING (603929.67891 5795123.78571,603927.579461 5795123.291102,603924.696201 5795123.815331,603921.663161 5795125.537799,603917.581662 5795129.169958,603915.859195 5795131.753659)","driving","asphalt",0,1167
+1500,"LINESTRING (603903.914259 5795114.379207,603906.797519 5795117.562026,603908.342569 5795117.797143,603909.868005 5795118.685375,603911.852586 5795120.332952,603913.050824 5795121.793305,603914.839479 5795124.124893,603916.12131 5795126.511367,603916.458314 5795128.720619,603916.271089 5795130.293306,603915.859195 5795131.753659)","driving","asphalt",0,1165
+1501,"LINESTRING (603915.859195 5795131.753659,603912.975935 5795143.071392,603908.126815 5795161.25091,603907.93959 5795162.655096,603908.051925 5795166.624259,603907.902145 5795168.683731,603906.217123 5795176.18208,603903.858092 5795185.842875,603900.001263 5795200.614904,603895.826152 5795217.483849,603893.205006 5795227.462926,603892.044213 5795231.525702,603890.696195 5795232.911164,603889.385622 5795234.596187,603887.887825 5795240.212928,603883.693991 5795256.332974,603883.619102 5795256.595089)","driving","asphalt",0,1163
+1502,"LINESTRING (603883.619102 5795256.595089,603882.345974 5795261.500376,603882.308529 5795266.855003,603880.136722 5795276.590687)","driving","asphalt",0,1169
+1503,"LINESTRING (603883.619102 5795256.595089,603879.837163 5795266.855003,603877.777691 5795276.141348)","driving","asphalt",0,1168
+1504,"LINESTRING (603877.777691 5795276.141348,603871.262271 5795301.744326,603867.255663 5795318.463491,603863.792006 5795332.561511)","driving","asphalt",0,1164
+1505,"LINESTRING (603880.136722 5795276.590687,603875.568439 5795295.10721,603871.412051 5795311.639151,603870.382315 5795316.815914,603866.151037 5795333.53508)","driving","asphalt",0,1164
+1506,"LINESTRING (603863.792006 5795332.561511,603862.312931 5795336.062613,603859.055221 5795339.807107,603855.048612 5795341.716799,603851.341563 5795342.353363,603847.709404 5795342.166138)","driving","asphalt",0,1173
+1507,"LINESTRING (603866.151037 5795333.53508,603865.982535 5795335.12649,603866.506764 5795336.886402,603867.929672 5795338.983318,603869.12791 5795339.919442,603869.801919 5795340.181557)","driving","asphalt",0,1174
+1508,"LINESTRING (603869.801919 5795340.181557,603874.332756 5795341.304905)","driving","asphalt",0,1170
+1509,"LINESTRING (603847.709404 5795342.166138,603796.222611 5795332.580234)","driving","asphalt",0,1146
+1510,"LINESTRING (603796.222611 5795332.580234,603784.68957 5795330.361621)","driving","asphalt",0,1175
+1511,"LINESTRING (603784.68957 5795330.361621,603770.011153 5795326.092898,603762.840447 5795324.332986,603748.704982 5795321.599505,603737.752337 5795319.689813,603726.949472 5795319.240474,603716.633391 5795317.583535,603702.348146 5795314.850055,603688.774356 5795310.543886,603682.726998 5795309.158424,603672.036467 5795307.351705,603661.664219 5795305.329679)","driving","asphalt",0,1147
+1512,"LINESTRING (603661.664219 5795305.329679,603657.844835 5795304.571419,603654.736905 5795303.260846,603652.639988 5795301.426044,603649.606948 5795297.344545,603648.521045 5795293.862166,603648.109151 5795291.540579,603647.959371 5795290.267451)","driving","asphalt",0,1178
+1513,"LINESTRING (603643.952762 5795313.595649,603647.959371 5795290.267451)","driving","asphalt",0,1179
+1514,"LINESTRING (603647.959371 5795290.267451,603650.730297 5795272.499827)","driving","asphalt",0,1177
+1515,"LINESTRING (603638.691748 5795344.122636,603643.952762 5795313.595649)","driving","asphalt",0,1176
+1516,"LINESTRING (603650.730297 5795272.499827,603651.385583 5795268.50258,603651.310693 5795266.330773,603650.262235 5795262.51139,603648.914217 5795260.264693,603645.768842 5795257.194208,603644.345934 5795256.14575,603641.500119 5795254.947512,603639.702762 5795254.498172)","driving","asphalt",0,1180
+1517,"LINESTRING (603640.45166 5795249.106101,603643.522146 5795249.330771,603646.293071 5795249.106101,603648.539768 5795248.432092,603650.486904 5795247.308744,603652.284262 5795245.810946,603653.856949 5795243.863809,603655.429637 5795241.167774,603655.429637 5795240.718434)","driving","asphalt",0,1181
+1518,"LINESTRING (603650.730297 5795272.499827,603655.429637 5795240.718434)","driving","asphalt",0,1182
+1519,"LINESTRING (603655.429637 5795240.718434,603656.702764 5795236.131429,603657.788668 5795230.589578,603662.544175 5795205.510829,603664.266642 5795199.660058,603665.98911 5795197.488251,603666.850343 5795193.584616,603668.72259 5795183.015782,603670.931842 5795171.660604,603671.867965 5795166.483841,603671.83052 5795165.472827,603671.418626 5795160.146285)","driving","asphalt",0,1144
+1520,"LINESTRING (603671.418626 5795160.146285,603672.354749 5795153.864896)","driving","asphalt",0,1183
+1521,"LINESTRING (603672.354749 5795153.864896,603673.365763 5795148.454102,603677.241314 5795127.82194)","driving","asphalt",0,1143
+1522,"LINESTRING (603677.241314 5795127.82194,603678.795279 5795120.810375,603681.828319 5795113.546057,603682.165324 5795112.310374)","driving","asphalt",0,1184
+1523,"LINESTRING (603682.165324 5795112.310374,603687.763342 5795082.925457)","driving","asphalt",0,1142
+1524,"LINESTRING (603687.763342 5795082.925457,603688.081624 5795079.714553,603687.632285 5795076.868738,603685.760038 5795072.712349,603683.850346 5795070.465653,603681.15431 5795069.45464)","driving","asphalt",0,1186
+1525,"LINESTRING (603687.763342 5795082.925457,603688.605853 5795079.377549,603689.878981 5795077.767416,603693.136691 5795074.959046,603696.057397 5795073.873143,603700.138895 5795073.386358,603706.504535 5795073.910588,603712.046386 5795075.183715)","driving","asphalt",0,1187
+1526,"LINESTRING (603712.046386 5795075.183715,603725.938459 5795077.804861,603747.188462 5795081.73658,603754.82723 5795083.056514)","driving","asphalt",0,1141
+1527,"LINESTRING (603754.82723 5795083.056514,603768.326131 5795085.350017,603774.841551 5795084.900677,603781.019966 5795086.13636)","driving","asphalt",0,1188
+1528,"LINESTRING (603781.019966 5795086.13636,603809.590455 5795092.090106,603831.327243 5795096.630305)","driving","asphalt",0,1140
+1529,"LINESTRING (603831.327243 5795096.630305,603840.445086 5795100.299909,603844.002355 5795101.460702,603855.872401 5795104.306518)","driving","asphalt",0,1189
+1530,"LINESTRING (603855.872401 5795104.306518,603898.241351 5795114.538348,603903.914259 5795114.379207)","driving","asphalt",0,1139
+1545,"LINESTRING (603590.181828 5795239.69806,603632.906505 5795247.561497,603640.45166 5795249.106101)","driving","asphalt",0,1150
+1546,"LINESTRING (603639.702762 5795254.498172,603619.239102 5795250.791123,603605.403197 5795248.132533,603589.882269 5795245.314801)","driving","asphalt",0,1150
diff --git a/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/csv/de_bs_borders_wfs.r2sr b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/csv/de_bs_borders_wfs.r2sr
new file mode 100644
index 00000000..7230cd89
--- /dev/null
+++ b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/csv/de_bs_borders_wfs.r2sr
@@ -0,0 +1,37 @@
+"id","geometry","linetype","oneway","category","turn","datasourcedescription_id","predecessor_id","successor_id","streetname"
+1031,"LINESTRING (603953.424057 5795126.710615,603930.33002 5795120.779416)","StandardLine","false","town",NULL,0,NULL,NULL,NULL
+1139,"LINESTRING (603855.114141 5795107.627416,603903.642783 5795119.385127)","StandardLine","true","town","straight",NULL,NULL,NULL,NULL
+1140,"LINESTRING (603780.561265 5795089.710012,603791.944527 5795091.806929,603806.997393 5795095.102083,603830.737485 5795100.494155)","StandardLine","true","town","striaght",0,NULL,NULL,NULL
+1141,"LINESTRING (603711.550241 5795078.850979,603754.462142 5795086.564637)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1142,"LINESTRING (603685.788122 5795112.869707,603691.404863 5795083.587764)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1143,"LINESTRING (603675.977547 5795154.452313,603680.920279 5795128.540415)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1144,"LINESTRING (603659.576664 5795241.06246,603664.144946 5795215.97435,603665.867414 5795205.789326,603667.290321 5795201.445713,603669.537018 5795197.25188,603672.083274 5795183.902759,603676.351997 5795161.042623)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1146,"LINESTRING (603848.261717 5795338.363137,603840.697839 5795337.164899,603796.812369 5795328.777232)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1147,"LINESTRING (603785.354217 5795325.088905,603753.975358 5795319.022825,603745.175797 5795317.450138,603737.16258 5795316.10212,603720.200022 5795314.679212,603701.889446 5795310.859828,603698.070062 5795309.137361,603662.197809 5795302.228769)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1150,"LINESTRING (603589.854185 5795242.541535,603640.030405 5795251.60321)","StandardLine","false","town","straight",0,NULL,NULL,NULL
+1165,"LINESTRING (603903.642783 5795119.385127,603906.310735 5795120.332952,603908.519987 5795121.60608,603910.429679 5795123.440882,603911.665362 5795125.612689,603912.301926 5795128.084055,603912.376816 5795129.769077,603912.189591 5795131.098372)","ConnectionLine","true","town","left",0,1139,1163,NULL
+1163,"LINESTRING (603912.189591 5795131.098372,603904.176374 5795163.076351,603902.978136 5795167.888026,603902.903246 5795174.777895,603898.634522 5795191.965122,603889.348177 5795228.080767,603885.978133 5795233.117112,603880.158721 5795255.395336)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1164,"LINESTRING (603875.231435 5795275.486061,603866.394429 5795311.451926,603860.927468 5795332.009198)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1170,"LINESTRING (603868.622403 5795346.022967,603873.303021 5795347.033981)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1171,"LINESTRING (603883.637824 5795349.056007,603889.3669 5795350.179356)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1172,"LINESTRING (603884.274388 5795338.122085,603887.157648 5795325.465695)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1173,"LINESTRING (603860.927468 5795332.009198,603859.410948 5795334.003141,603857.388921 5795335.950278,603854.393326 5795337.710191,603851.173061 5795338.533979,603848.261717 5795338.363137)","ConnectionLine","true","town","left",0,1164,1146,NULL
+1174,"LINESTRING (603863.792006 5795332.561511,603862.949495 5795336.287283,603862.98694 5795338.496534,603864.110288 5795341.679354,603865.608085 5795343.888606,603867.255663 5795345.348958,603868.622403 5795346.022967)","ConnectionLine","true","town","right",0,1164,1170,NULL
+1166,"LINESTRING (603903.642783 5795119.385127,603906.797519 5795117.562026,603908.342569 5795117.797143,603913.687388 5795118.610485,603922.936289 5795119.621498,603930.33002 5795120.779416)","ConnectionLine","true","town","straight",0,1139,1031,NULL
+1167,"LINESTRING (603930.33002 5795120.779416,603922.936289 5795119.621498,603920.015583 5795119.995948,603918.143336 5795120.857181,603915.260076 5795123.253657,603914.839479 5795124.124893,603914.211618 5795125.425464,603912.189591 5795131.098372)","ConnectionLine","true","town","right",0,1031,1163,NULL
+1168,"LINESTRING (603880.158721 5795255.395336,603875.231435 5795275.486061)","ConnectionLine","true","town","straight",0,1163,1164,NULL
+1169,"LINESTRING (603880.158721 5795255.395336,603878.189585 5795266.443108,603877.777691 5795276.141348)","ConnectionLine","true","town","straight",NULL,1163,1164,NULL
+1175,"LINESTRING (603796.812369 5795328.777232,603785.354217 5795325.088905)","ConnectionLine","true","town","straight",0,1146,1147,NULL
+1176,"LINESTRING (603642.230295 5795344.899619,603647.659811 5795314.353909)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1177,"LINESTRING (603652.003424 5795291.006989,603652.302984 5795284.079675,603652.827213 5795279.726701,603654.025451 5795273.173836)","StandardLine","true","town","straight",0,NULL,NULL,NULL
+1178,"LINESTRING (603662.197809 5795302.228769,603657.919725 5795300.752035,603655.635584 5795299.141902,603653.875671 5795296.932651,603652.714878 5795294.910624,603652.040869 5795292.926042,603652.003424 5795291.006989)","ConnectionLine","true","town","left",0,1147,1177,NULL
+1179,"LINESTRING (603647.659811 5795314.353909,603652.003424 5795291.006989)","ConnectionLine","true","town","straight",0,1176,1177,NULL
+1180,"LINESTRING (603654.025451 5795273.173836,603655.055187 5795267.004782,603654.755628 5795263.859407,603652.95827 5795260.189803,603650.112455 5795256.445309,603647.641089 5795254.273503,603643.372366 5795252.251476,603640.030405 5795251.60321)","ConnectionLine","false","town","right",0,1177,1150,NULL
+1181,"LINESTRING (603640.030405 5795251.60321,603643.372366 5795252.251476,603648.015538 5795252.176586,603651.011134 5795250.978348,603654.006729 5795249.031211,603656.777654 5795246.934294,603658.575011 5795244.687598,603659.576664 5795241.06246)","ConnectionLine","true","town","rigth",0,1150,1144,NULL
+1182,"LINESTRING (603654.025451 5795273.173836,603659.576664 5795241.06246)","ConnectionLine","false","town","straight",0,1177,1144,NULL
+1183,"LINESTRING (603676.351997 5795161.042623,603675.977547 5795154.452313)","ConnectionLine","true","town","straight",0,1144,1143,NULL
+1184,"LINESTRING (603680.920279 5795128.540415,603683.588231 5795123.169406,603685.788122 5795112.869707)","ConnectionLine","true","town","straight",0,1143,1142,NULL
+1186,"LINESTRING (603691.404863 5795083.587764,603691.769951 5795080.538342,603691.919731 5795075.44583,603691.283167 5795072.899574,603690.084929 5795070.278428,603687.201668 5795067.956842,603684.056293 5795066.945829,603681.360258 5795066.496489)","ConnectionLine","true","town","left",0,1142,1185,NULL
+1187,"LINESTRING (603691.404863 5795083.587764,603692.575017 5795081.287241,603694.821714 5795079.077989,603696.619071 5795077.992086,603698.865767 5795077.093407,603701.636693 5795077.018518,603711.550241 5795078.850979)","ConnectionLine","true","town","left",0,1142,1141,NULL
+1188,"LINESTRING (603754.462142 5795086.564637,603773.605867 5795089.61874,603780.561265 5795089.710012)","ConnectionLine","true","town","straight",0,1141,1140,NULL
+1189,"LINESTRING (603830.737485 5795100.494155,603837.299711 5795103.520174,603855.114141 5795107.627416)","ConnectionLine","true","town","straight",0,1140,1139,NULL
diff --git a/adore_test_programs/adore_map_downloader_test/helpers.hpp b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/helpers.hpp
similarity index 100%
rename from adore_test_programs/adore_map_downloader_test/helpers.hpp
rename to ros2_workspace/src/adore_test_programs/adore_map_downloader_test/helpers.hpp
diff --git a/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/r2s_loading_from_wfs_test.cpp b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/r2s_loading_from_wfs_test.cpp
new file mode 100644
index 00000000..efc53163
--- /dev/null
+++ b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/r2s_loading_from_wfs_test.cpp
@@ -0,0 +1,96 @@
+/********************************************************************************
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * https://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+#include
+#include
+#include "adore_map/map_loader.hpp"
+#include "adore_map/config.hpp"
+#include "helpers.hpp"
+
+/**
+ * @brief Test program to load R2S map data from WFS and compare with R2S map data loaded from file
+ * @details This program initializes a MapDownloader instance, downloads map data for reference lines and
+ * lane borders from WFS, loads R2S map data from from CSV files created using a Python downloader
+ * and the R2S parser (the legacy methods for loading map data) and compares the two datasets for
+ * equality. These files were created from the same source as the WFS data, so they should match.
+ * It demonstrates the functionality of loading map data from WFS and ensures consistency with
+ * legacy R2S CSV files. The program uses a configuration file to set parameters such as server URL,
+ * project name, layer names, and bounding box.
+ * @return int Exit code indicating success or failure
+ */
+
+// Main function to test loading R2S map data from WFS and comparing with R2S map data loaded from file
+int main( int argc, char* argv[] )
+{
+ if( argc != 1 )
+ {
+ std::cerr << "Usage: " << module_name( argv[0] ) << " (i.e., without parameters)." << std::endl;
+ exit( -1 );
+ }
+
+ // Clean up potential remnants from previous test runs: remove the complete cache directory, which may contain cached map layer data from previous runs.
+ std::filesystem::remove_all( "cache" );
+
+ Config cfg( "../../../../adore_test_programs/adore_map_downloader_test/config/r2s_wfs_config_bs.json" );
+ MapDownloader map_downloader( cfg );
+
+ // Replace above line by the next two lines to enable debug mode:
+ // MapDownloader map_downloader( cfg.server_url, cfg.username, cfg.password, cfg.project_name, cfg.target_srs, cfg.bbox,
+ // "", false, false, true );
+
+ // For this test, disable caching of map layer data in the MapCache instance (caching is already tested in adore_map/test/map_download_cache_test.cpp)
+ map_downloader.turn_off_cache();
+
+ // For testing purposes, curl_global_init, curl_global_cleanup, and debug_mode all set to false here.
+ // This means that the internal curl wrapper will not initialize or cleanup curl globally
+ // and debug mode is off.
+ // Since this is a standalone test program, global curl initialization relies on the fact that the
+ // first call to curl_easy_init() invokes it internally (this works, but is not recommended for production code).
+ // Global curl cleanup relies on the C++ runtime system and the OS to clean up resources upon program
+ // exit. In a real application, the aforementioned flags should be set according to the application's needs.
+
+ std::cout << module_name( argv[0] ) << ": A) Loading r2s map data from file... " << std::endl;
+ std::cout << module_name( argv[0] ) << ": 1. Loading road file..." << std::endl;
+ auto border_data_r2sr_from_file = adore::r2s::load_border_data_from_r2sr_file( "../../../../adore_test_programs/adore_map_downloader_test/csv/de_bs_borders_wfs.r2sr" );
+ std::cout << module_name( argv[0] ) << ": Road file has been loaded, size: " << border_data_r2sr_from_file.size()
+ << std::endl;
+ std::cout << module_name( argv[0] ) << ": 2. Lane file..." << std::endl;
+ // The same path as before is passed to the next method, since the method will change the suffix to .r2sl internally
+ auto border_data_r2sl_from_file = adore::r2s::load_border_data_from_r2sl_file( "../../../../adore_test_programs/adore_map_downloader_test/csv/de_bs_borders_wfs.r2sr" );
+ std::cout << module_name( argv[0] ) << ": Lane file has been loaded, size: " << border_data_r2sl_from_file.size() << std::endl;
+
+ std::cout << module_name( argv[0] ) << ": B) Loading r2s map data from WFS... " << std::endl;
+ std::cout << module_name( argv[0] ) << ": 1. Loading reference lines from WFS... (layer name: "
+ << cfg.layer_name_reference_lines << ")" << std::endl;
+ auto border_data_r2sr_from_wfs = adore::r2s::download_reference_lines( map_downloader, cfg.layer_name_reference_lines );
+ std::cout << module_name( argv[0] ) << ": Reference lines have been loaded from WFS, size: "
+ << border_data_r2sr_from_wfs.size() << std::endl;
+ std::cout << module_name( argv[0] ) << ": 2. Loading lane borders from WFS... (layer name: "
+ << cfg.layer_name_lane_borders << ")" << std::endl;
+ auto border_data_r2sl_from_wfs = adore::r2s::download_lane_borders( map_downloader, cfg.layer_name_lane_borders );
+ std::cout << module_name( argv[0] ) << ": Lane borders have been loaded from WFS, size: "
+ << border_data_r2sl_from_wfs.size() << std::endl;
+
+ std::cout << module_name( argv[0] ) << ": Comparing the border data... " << std::endl;
+ if ( border_data_r2sr_from_file != border_data_r2sr_from_wfs ) {
+ std::cerr << module_name( argv[0] ) << ": R2SR border data from file and WFS differ, test failed." << std::endl;
+ return -2;
+ }
+ if ( border_data_r2sl_from_file != border_data_r2sl_from_wfs ) {
+ std::cerr << module_name( argv[0] ) << ": R2SL border data from file and WFS differ, test failed." << std::endl;
+ return -2;
+ }
+ std::cout << module_name( argv[0] ) << ": Tolerating differences up to 2e-6, border data from file and WFS are identical. Test succeeded."
+ << std::endl;
+ return 0;
+}
diff --git a/adore_test_programs/adore_map_downloader_test/requirements.cmake b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/requirements.cmake
similarity index 100%
rename from adore_test_programs/adore_map_downloader_test/requirements.cmake
rename to ros2_workspace/src/adore_test_programs/adore_map_downloader_test/requirements.cmake
diff --git a/adore_test_programs/adore_map_downloader_test/requirements.pip3 b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/requirements.pip3
similarity index 100%
rename from adore_test_programs/adore_map_downloader_test/requirements.pip3
rename to ros2_workspace/src/adore_test_programs/adore_map_downloader_test/requirements.pip3
diff --git a/adore_test_programs/adore_map_downloader_test/requirements.system b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/requirements.system
similarity index 100%
rename from adore_test_programs/adore_map_downloader_test/requirements.system
rename to ros2_workspace/src/adore_test_programs/adore_map_downloader_test/requirements.system
diff --git a/adore_test_programs/adore_map_downloader_test/tracks/.gitignore b/ros2_workspace/src/adore_test_programs/adore_map_downloader_test/tracks/.gitignore
similarity index 100%
rename from adore_test_programs/adore_map_downloader_test/tracks/.gitignore
rename to ros2_workspace/src/adore_test_programs/adore_map_downloader_test/tracks/.gitignore
diff --git a/ros2_workspace/src/example_nodes/ros2_hello_world/CMakeLists.txt b/ros2_workspace/src/example_nodes/ros2_hello_world/CMakeLists.txt
new file mode 100644
index 00000000..a7e802ec
--- /dev/null
+++ b/ros2_workspace/src/example_nodes/ros2_hello_world/CMakeLists.txt
@@ -0,0 +1,39 @@
+cmake_minimum_required(VERSION 3.8)
+
+get_filename_component(CURRENT_DIR_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
+string(TOLOWER ${CURRENT_DIR_NAME} PROJECT)
+project(${PROJECT})
+
+include(requirements.cmake)
+
+add_executable(${PROJECT} src/${PROJECT}.cpp)
+
+ament_target_dependencies(${PROJECT}
+ rclcpp
+ std_msgs
+ adore_ros2_msgs
+)
+
+target_include_directories(${PROJECT} PRIVATE
+ $
+ $
+)
+
+file(GLOB_RECURSE TEST_SOURCES test/*.cpp)
+if(TEST_SOURCES)
+ ament_add_gtest(${PROJECT}_test ${TEST_SOURCES})
+ if(TARGET ${PROJECT}_test)
+ ament_target_dependencies(${PROJECT}_test
+ rclcpp
+ std_msgs
+ adore_ros2_msgs
+ )
+ endif()
+endif()
+
+install(TARGETS
+ ${PROJECT}
+ DESTINATION lib/${PROJECT}
+)
+
+ament_package()
diff --git a/ros2_workspace/src/example_nodes/ros2_hello_world/Makefile b/ros2_workspace/src/example_nodes/ros2_hello_world/Makefile
new file mode 100644
index 00000000..30a4a918
--- /dev/null
+++ b/ros2_workspace/src/example_nodes/ros2_hello_world/Makefile
@@ -0,0 +1,69 @@
+SHELL:=/bin/bash
+
+.PHONY: help
+help:
+ @printf "Usage: make \033[36m\033[0m\n%s\n" "$$(awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-10s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) }' $(MAKEFILE_LIST) | sort | uniq)"
+
+
+
+SCRIPT_DIRECTORY := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
+ROS2_WORKSPACE := $(shell \
+ current_dir=$(SCRIPT_DIRECTORY); \
+ while [ "$$current_dir" != "/" ]; do \
+ if [ -d "$$current_dir/build" ] && \
+ [ -d "$$current_dir/install" ] && \
+ [ -d "$$current_dir/log" ] && \
+ [ -d "$$current_dir/src" ]; then \
+ echo "$$current_dir"; \
+ exit 0; \
+ fi; \
+ current_dir=$$(dirname "$$current_dir"); \
+ done; \
+ echo "Error: ROS 2 workspace not found." >&2; \
+ exit 1; \
+)
+
+ROS2_PACKAGE := $(shell grep -oP '\K[^<]*' $(SCRIPT_DIRECTORY)/package.xml | tr -d '[:space:]')
+DEPENDENCIES := $(shell grep -oP '<(?:depend|build_depend)>\K[^<]*' $(SCRIPT_DIRECTORY)/package.xml | tr '\n' ' ' | tr -s ' ' | sed 's/ $$//')
+
+
+
+.PHONY: build
+build: build_dependencies ## Build ROS2 Node. Same as running `colcon build --packages-select `
+ @echo "Building: ${ROS2_PACKAGE}"
+ @echo " Using ROS 2 workspace: ${ROS2_WORKSPACE}"
+ cd $(ROS2_WORKSPACE) && colcon build --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo --packages-select ${ROS2_PACKAGE}
+
+.PHONY: build_dependencies
+build_dependencies: ## Build all node dependencies
+ @echo "Building dependencies..."
+ @echo " Using ROS 2 workspace: ${ROS2_WORKSPACE}"
+ @cd $(ROS2_WORKSPACE) && for dependency in $(DEPENDENCIES); do \
+ cd $(ROS2_WORKSPACE) && colcon build --packages-select $$dependency; \
+ done
+
+.PHONY: test
+test: build ## Execute unit tests
+ @echo "Running tests..."
+ @source $(ROS2_WORKSPACE)/install/setup.bash && \
+ if [ -z "$$(ros2 pkg list | grep $(ROS2_PACKAGE))" ]; then \
+ echo "ERROR: ROS2 Package: '$(ROS2_PACKAGE)' not found. Did you build it?" >&2; \
+ exit 1; \
+ fi && \
+ cd $(ROS2_WORKSPACE) && colcon test --packages-select ${ROS2_PACKAGE} --event-handlers console_direct+
+
+.PHONY: run
+run: ## Run the node
+ @echo "Running ROS 2 node: ${ROS2_PACKAGE}..."
+ @echo " Using ROS 2 workspace: ${ROS2_WORKSPACE}"
+ @source $(ROS2_WORKSPACE)/install/setup.bash && \
+ if [ -z "$$(ros2 pkg list | grep $(ROS2_PACKAGE))" ]; then \
+ echo "ERROR: ROS2 Package: '$(ROS2_PACKAGE)' not found. Did you build it?" >&2; \
+ exit 1; \
+ fi && \
+ cd $(ROS2_WORKSPACE) && ros2 run $(ROS2_PACKAGE) $(ROS2_PACKAGE)
+
+.PHONY: clean
+clean: ## Clean build artifacts
+ rm -rf $(ROS2_WORKSPACE)/build/$(ROS2_PACKAGE) $(ROS2_WORKSPACE)/install/$(ROS2_PACKAGE)
+
diff --git a/ros2_workspace/src/example_nodes/ros2_hello_world/README.md b/ros2_workspace/src/example_nodes/ros2_hello_world/README.md
new file mode 100644
index 00000000..a8838eee
--- /dev/null
+++ b/ros2_workspace/src/example_nodes/ros2_hello_world/README.md
@@ -0,0 +1,20 @@
+# ros2_hello_world
+This is a minimal ROS2 Hello, World program incorporating a GNU Makefile and
+unit tests with gunit.
+
+This node/program provides a GNU Makefile for building, testing, and running.
+Use this node as a template for creating new c++ nodes in ADORe.
+
+
+1. Build the package with:
+```bash
+make build
+```
+2. Test the node:
+```bash
+make test
+```
+3. Run the node:
+```bash
+make run
+```
diff --git a/ros2_workspace/src/example_nodes/ros2_hello_world/package.xml b/ros2_workspace/src/example_nodes/ros2_hello_world/package.xml
new file mode 100644
index 00000000..f0669be5
--- /dev/null
+++ b/ros2_workspace/src/example_nodes/ros2_hello_world/package.xml
@@ -0,0 +1,22 @@
+
+
+
+ ros2_hello_world
+ 0.0.0
+ TODO: Package description
+ DLR-TS
+ TODO: License declaration
+
+ ament_cmake
+ rclcpp
+ std_msgs
+ ament_lint_auto
+ ament_lint_common
+
+
+ adore_ros2_msgs
+
+
+ ament_cmake
+
+
diff --git a/ros2_workspace/src/example_nodes/ros2_hello_world/requirements.cmake b/ros2_workspace/src/example_nodes/ros2_hello_world/requirements.cmake
new file mode 100644
index 00000000..fc8a08ed
--- /dev/null
+++ b/ros2_workspace/src/example_nodes/ros2_hello_world/requirements.cmake
@@ -0,0 +1,13 @@
+find_package(ament_cmake REQUIRED)
+find_package(rclcpp REQUIRED)
+find_package(std_msgs REQUIRED)
+find_package(ament_lint_auto REQUIRED)
+find_package(ament_cmake_gtest REQUIRED)
+
+# required for unit testing with gtest
+find_package(ament_cmake_gtest REQUIRED)
+
+
+# required to use ADORe messages
+find_package(adore_ros2_msgs REQUIRED)
+
diff --git a/ros2_workspace/src/example_nodes/ros2_hello_world/requirements.system b/ros2_workspace/src/example_nodes/ros2_hello_world/requirements.system
new file mode 100644
index 00000000..33bf25cb
--- /dev/null
+++ b/ros2_workspace/src/example_nodes/ros2_hello_world/requirements.system
@@ -0,0 +1,11 @@
+## Add all APT system dependencies required to run this node here
+## One requirement/dependency per line.
+# The tool "envsubst" is used to preprocess all requirements files.
+# The environment variable '${ROS_DISTRO}' is provided by the environment.
+# The ADORe CLI docker context must be rebuilt on changes to this file, invoke
+# `make build` on the top level repository directory to apply these changes.
+ros-${ROS_DISTRO}-ament-cmake
+ros-${ROS_DISTRO}-rclcpp
+ros-${ROS_DISTRO}-std-msgs
+ros-${ROS_DISTRO}-ament-lint-auto
+ros-${ROS_DISTRO}-ament-cmake-gtest
diff --git a/ros2_workspace/src/example_nodes/ros2_hello_world/src/ros2_hello_world.cpp b/ros2_workspace/src/example_nodes/ros2_hello_world/src/ros2_hello_world.cpp
new file mode 100644
index 00000000..df0a6883
--- /dev/null
+++ b/ros2_workspace/src/example_nodes/ros2_hello_world/src/ros2_hello_world.cpp
@@ -0,0 +1,68 @@
+/********************************************************************************
+ * Copyright (c) 2025 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * https://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+#include
+#include
+#include
+#include
+#include "rclcpp/rclcpp.hpp"
+#include "std_msgs/msg/string.hpp"
+
+using namespace std::chrono_literals;
+
+class Ros2HelloWorld : public rclcpp::Node
+{
+ private:
+ /******************************* PUBLISHERS RELATED MEMBERS ************************************************************/
+ rclcpp::TimerBase::SharedPtr mainTimer;
+
+ rclcpp::Publisher::SharedPtr publisherString;
+
+ /******************************* SUBSCRIBERS RELATED MEMBERS ************************************************************/
+ rclcpp::Subscription::SharedPtr subscriberString;
+
+ /******************************* OTHER MEMBERS *************************************************************************/
+ std_msgs::msg::String latestRecievedStringMessage;
+
+ public:
+ Ros2HelloWorld() : Node("ros2_hello_world")
+ {
+ mainTimer = this->create_wall_timer(100ms, std::bind(&Ros2HelloWorld::Run, this));
+ publisherString = this->create_publisher("publishing_topic_name", 10);
+
+ subscriberString = this->create_subscription("subscribing_topic_name", 10, std::bind(&Ros2HelloWorld::SubscriberStringCallback, this, std::placeholders::_1));
+ }
+
+ /******************************* PUBLISHER RELATED FUNCTIONS ************************************************************/
+
+ void Run(){
+ std_msgs::msg::String message;
+ message.data = "Hello, World!";
+ RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
+ publisherString->publish(message);
+ rclcpp::sleep_for(std::chrono::seconds(1));
+ }
+
+ /******************************* SUBSCRIBER RELATED FUNCTIONS************************************************************/
+
+ void SubscriberStringCallback(std_msgs::msg::String msg){
+ latestRecievedStringMessage = msg;
+ }
+};
+
+int main(int argc, char * argv[]){
+ rclcpp::init(argc, argv);
+ rclcpp::spin(std::make_shared());
+ rclcpp::shutdown();
+ return 0;
+}
diff --git a/ros2_workspace/src/example_nodes/ros2_hello_world/test/hello_world_test.cpp b/ros2_workspace/src/example_nodes/ros2_hello_world/test/hello_world_test.cpp
new file mode 100644
index 00000000..cd00bb9c
--- /dev/null
+++ b/ros2_workspace/src/example_nodes/ros2_hello_world/test/hello_world_test.cpp
@@ -0,0 +1,27 @@
+/********************************************************************************
+ * Copyright (c) 2025 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * https://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ********************************************************************************/
+
+#include
+
+int add(int a, int b) {
+ return a + b;
+}
+
+TEST(SimpleMathTest, AdditionTest) {
+ EXPECT_EQ(add(1, 1), 2);
+}
+
+int main(int argc, char **argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/vendor/caches b/ros2_workspace/src/vendor/caches
similarity index 100%
rename from vendor/caches
rename to ros2_workspace/src/vendor/caches
diff --git a/vendor/libOpenDRIVE b/ros2_workspace/src/vendor/libOpenDRIVE
similarity index 100%
rename from vendor/libOpenDRIVE
rename to ros2_workspace/src/vendor/libOpenDRIVE
diff --git a/ros2_workspace/src/vendor/multi_agent_solver b/ros2_workspace/src/vendor/multi_agent_solver
new file mode 160000
index 00000000..da3307d6
--- /dev/null
+++ b/ros2_workspace/src/vendor/multi_agent_solver
@@ -0,0 +1 @@
+Subproject commit da3307d6b9f20c791d0356fe7fa97e134f62bd23
diff --git a/ros2_workspace/src/vendor/osqp_build/osqp b/ros2_workspace/src/vendor/osqp_build/osqp
new file mode 160000
index 00000000..1572ae06
--- /dev/null
+++ b/ros2_workspace/src/vendor/osqp_build/osqp
@@ -0,0 +1 @@
+Subproject commit 1572ae068e9ce9ca723cf8223548ade1ff7acc29
diff --git a/ros2_workspace/src/vendor/osqp_eigen b/ros2_workspace/src/vendor/osqp_eigen
new file mode 160000
index 00000000..98269339
--- /dev/null
+++ b/ros2_workspace/src/vendor/osqp_eigen
@@ -0,0 +1 @@
+Subproject commit 98269339b8253484749f583330e3b174c3853aca
diff --git a/ros2_workspace/src/vendor/requirements.system b/ros2_workspace/src/vendor/requirements.system
new file mode 100644
index 00000000..fe82dfd3
--- /dev/null
+++ b/ros2_workspace/src/vendor/requirements.system
@@ -0,0 +1,10 @@
+## Required by osqp
+libeigen3-dev
+
+## Required by libOpenDRIVE
+libpugixml-dev
+
+# required for ros-carla-msgs
+ros-${ROS_DISTRO}-diagnostic-msgs
+ros-${ROS_DISTRO}-geometry-msgs
+ros-${ROS_DISTRO}-std-msgs
diff --git a/vendor/ros-carla-msgs b/ros2_workspace/src/vendor/ros-carla-msgs
similarity index 100%
rename from vendor/ros-carla-msgs
rename to ros2_workspace/src/vendor/ros-carla-msgs
diff --git a/ros2_workspace/tools/requirements.pip3 b/ros2_workspace/tools/requirements.pip3
new file mode 100644
index 00000000..6ae3170a
--- /dev/null
+++ b/ros2_workspace/tools/requirements.pip3
@@ -0,0 +1,2 @@
+# Requirements for ros2_debian_packager.sh
+bloom
diff --git a/ros2_workspace/tools/requirements.system b/ros2_workspace/tools/requirements.system
new file mode 100644
index 00000000..23b6011f
--- /dev/null
+++ b/ros2_workspace/tools/requirements.system
@@ -0,0 +1,10 @@
+# Requirements for ros2_debian_packager.sh
+build-essential
+cmake
+fakeroot
+python3
+python3-pip
+python3-setuptools
+debhelper
+dh-make
+
diff --git a/.docker/scripts/ros2_debian_packager.sh b/ros2_workspace/tools/ros2_debian_packager.sh
old mode 100755
new mode 100644
similarity index 67%
rename from .docker/scripts/ros2_debian_packager.sh
rename to ros2_workspace/tools/ros2_debian_packager.sh
index 8af51176..99a184c1
--- a/.docker/scripts/ros2_debian_packager.sh
+++ b/ros2_workspace/tools/ros2_debian_packager.sh
@@ -12,6 +12,7 @@
# SPDX-License-Identifier: EPL-2.0
# ********************************************************************************
+
set -euo pipefail
echoerr (){ printf "%s" "$@" >&2;}
@@ -25,70 +26,27 @@ usage() {
}
SCRIPT_DIRECTORY="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
+LOG_DIRECTORY=$(realpath "${SCRIPT_DIRECTORY}/../../.log")
+export ROSDEP_PATH=${LOG_DIRECTORY}/.ros/rosdep
+export ROSDEP_DB_PATH=${LOG_DIRECTORY}/.ros/rosdep
-# Script is now in /tools; logs live in /.log
-LOG_DIRECTORY="$(realpath "${SCRIPT_DIRECTORY}/../.log")"
-mkdir -p "${LOG_DIRECTORY}"
-export ROSDEP_PATH="${LOG_DIRECTORY}/.ros/rosdep"
-export ROSDEP_DB_PATH="${LOG_DIRECTORY}/.ros/rosdep"
-
-# --- Environment detection -----------------------------------------------------
-
-[[ -z "${ROS_DISTRO:-}" ]] && exiterr "ERROR: ROS_DISTRO not set (e.g. 'humble', 'jazzy')."
-
-# Try to auto-detect OS_CODE_NAME if not provided
-if [[ -z "${OS_CODE_NAME:-}" ]]; then
- if [[ -r /etc/os-release ]]; then
- # shellcheck source=/dev/null
- . /etc/os-release
- # Prefer VERSION_CODENAME / UBUNTU_CODENAME if present
- OS_CODE_NAME="${OS_CODE_NAME:-${VERSION_CODENAME:-${UBUNTU_CODENAME:-}}}"
- fi
-fi
-
-if [[ -z "${OS_CODE_NAME:-}" ]]; then
- exiterr "ERROR: OS_CODE_NAME not set and could not be detected from /etc/os-release. \
-Please export OS_CODE_NAME (e.g. 'jammy', 'focal')."
-fi
+[[ -z "$ROS_DISTRO" ]] && exiterr "ERROR: ROS_DISTRO not set."
+[[ -z "$OS_CODE_NAME" ]] && exiterr "ERROR: OS_CODE_NAME not set."
TARGET_PACKAGE="${1:-}"
if [[ "$TARGET_PACKAGE" == "-h" ]] || [[ "$TARGET_PACKAGE" == "--help" ]]; then
usage
fi
-# Use /.colcon_workspace as the colcon workspace root
-colcon_workspace="$(realpath "${SCRIPT_DIRECTORY}/../../.colcon_workspace")"
-[[ -d "$colcon_workspace" ]] || exiterr "ERROR: colcon workspace directory '${colcon_workspace}' not found."
-
-# --- Source ROS and local workspace setups ------------------------------------
-
-# Source global ROS distro setup (if available)
-if [[ -f "/opt/ros/${ROS_DISTRO}/setup.sh" ]]; then
- # shellcheck source=/dev/null
- . "/opt/ros/${ROS_DISTRO}/setup.sh"
-else
- echo "WARNING: /opt/ros/${ROS_DISTRO}/setup.sh not found; ROS environment may be incomplete."
-fi
-
-# Source local workspace install setup (if already built)
-if [[ -f "${colcon_workspace}/install/setup.sh" ]]; then
- # shellcheck source=/dev/null
- . "${colcon_workspace}/install/setup.sh"
-else
- echo "WARNING: ${colcon_workspace}/install/setup.sh not found; continuing without sourcing local workspace."
-fi
+ros2_workspace="$(realpath "${SCRIPT_DIRECTORY}/..")"
declare -A package_info
declare -A local_packages
-# --- package.xml parsing helpers ----------------------------------------------
-
parse_package_xml() {
local package_xml="$1"
- local package_dir
- package_dir="$(dirname "$package_xml")"
- local package_name
- package_name="$(basename "$package_dir")"
+ local package_dir="$(dirname "$package_xml")"
+ local package_name="$(basename "$package_dir")"
local name version description maintainer_name maintainer_email
local build_depends exec_depends
@@ -104,7 +62,7 @@ parse_package_xml() {
exec_depends=$(xmllint --xpath "//package/exec_depend/text()" "$package_xml" 2>/dev/null | tr '\n' ' ' || echo "")
package_info["${name}:name"]="$name"
- package_info["${name}:version"]="$version"
+ package_info["${name}:version"]="$version"
package_info["${name}:description"]="$description"
package_info["${name}:maintainer_name"]="$maintainer_name"
package_info["${name}:maintainer_email"]="$maintainer_email"
@@ -139,8 +97,7 @@ get_all_dependencies() {
[[ "${visited[$pkg]:-}" == "1" ]] && return
visited["$pkg"]=1
- local direct_deps
- direct_deps=$(get_local_dependencies "$pkg")
+ local direct_deps=$(get_local_dependencies "$pkg")
for dep in $direct_deps; do
collect_deps "$dep"
deps_list+=("$dep")
@@ -165,8 +122,7 @@ topological_sort() {
in_stack["$node"]=1
- local deps
- deps=$(get_local_dependencies "$node")
+ local deps=$(get_local_dependencies "$node")
for dep in $deps; do
for pkg in "${packages_to_sort[@]}"; do
if [[ "$dep" == "$pkg" ]]; then
@@ -188,8 +144,6 @@ topological_sort() {
printf '%s\n' "${result[@]}"
}
-# --- rosdep setup --------------------------------------------------------------
-
setup_local_rosdep() {
mkdir -p "${ROSDEP_PATH}/sources.list.d"
@@ -200,13 +154,13 @@ setup_local_rosdep() {
export ROSDEP_SOURCE_PATH="${ROSDEP_PATH}/sources.list.d"
export ROSDEP_DATABASE_PATH="${ROSDEP_PATH}/db"
- rosdep update --rosdistro="${ROS_DISTRO}" >/dev/null 2>&1 || true
+ rosdep update --rosdistro=${ROS_DISTRO} >/dev/null 2>&1 || true
}
build_package() {
local package_name="$1"
- cd "$colcon_workspace"
- colcon build --parallel-workers "$(nproc)" --packages-select "$package_name"
+ cd "$ros2_workspace"
+ colcon build --parallel-workers $(nproc) --packages-select "$package_name"
}
resolve_system_dependencies() {
@@ -216,8 +170,7 @@ resolve_system_dependencies() {
for dep in $all_deps; do
if [[ -z "${local_packages[$dep]:-}" ]]; then
- local resolved
- resolved=$(rosdep resolve "$dep" --rosdistro="$ROS_DISTRO" --os="ubuntu:${OS_CODE_NAME}" 2>/dev/null || echo "")
+ local resolved=$(rosdep resolve "$dep" --rosdistro="$ROS_DISTRO" --os="ubuntu:$OS_CODE_NAME" 2>/dev/null || echo "")
[[ -n "$resolved" ]] && system_deps="$system_deps, $resolved"
fi
done
@@ -227,8 +180,7 @@ resolve_system_dependencies() {
generate_debian_control_file() {
local package_directory="$1"
- local package_name
- package_name="$(basename "$package_directory")"
+ local package_name="$(basename "$package_directory")"
local debian_package_name="ros-$ROS_DISTRO-$(echo "$package_name" | sed 's/_/-/g')"
cd "$package_directory"
@@ -237,10 +189,8 @@ generate_debian_control_file() {
mkdir -p debian
- local system_deps
- system_deps=$(resolve_system_dependencies "$package_name")
- local local_deps
- local_deps=$(get_local_dependencies "$package_name")
+ local system_deps=$(resolve_system_dependencies "$package_name")
+ local local_deps=$(get_local_dependencies "$package_name")
local debian_deps="$system_deps"
for local_dep in $local_deps; do
@@ -298,9 +248,9 @@ EOF
generate_debian_package() {
local package_directory="$1"
- local package_name
- package_name="$(basename "$package_directory")"
- local build_dir="$colcon_workspace/build"
+ local package_name="$(basename "$package_directory")"
+ local debian_package_name="ros-$ROS_DISTRO-$(echo "$package_name" | sed 's/_/-/g')"
+ local build_dir="$ros2_workspace/build"
local package_build_dir="$build_dir/debian_packages/$package_name"
mkdir -p "$package_build_dir"
@@ -310,11 +260,10 @@ generate_debian_package() {
[[ ! -f "debian/rules" ]] && exiterr "debian/rules file not found"
- bloom-generate rosdebian --os-name ubuntu --os-version "${OS_CODE_NAME}" --ros-distro "$ROS_DISTRO" >/dev/null 2>&1 || true
+ bloom-generate rosdebian --os-name ubuntu --os-version "$OS_CODE_NAME" --ros-distro "$ROS_DISTRO" >/dev/null 2>&1 || true
fakeroot debian/rules binary
- local parent_dir
- parent_dir="$(dirname "$package_directory")"
+ local parent_dir="$(dirname "$package_directory")"
echo "Moving generated debian packages to build directory..."
@@ -346,32 +295,13 @@ generate_debian_package() {
[[ -f "LICENSE" ]] && [[ ! -s "LICENSE" ]] && rm -f "LICENSE" || true
}
-# --- Main ----------------------------------------------------------------------
-
setup_local_rosdep
-cd "$colcon_workspace"
-
-# Prefer src/ if it exists, otherwise search the whole workspace
-search_root="src"
-if [[ ! -d "$search_root" ]]; then
- echoerr "WARNING: '${colcon_workspace}/src' not found. Scanning entire workspace for package.xml files.\n"
- search_root="."
-fi
-
-# Collect all package.xml files (follow symlinks)
-mapfile -t package_xml_files < <(find -L "$search_root" -type f -name "package.xml")
-
-if [[ ${#package_xml_files[@]} -eq 0 ]]; then
- exiterr "ERROR: No package.xml files found under '${colcon_workspace}/${search_root}'. Is your colcon workspace layout correct?"
-fi
+cd "$ros2_workspace"
-echo "Discovered ${#package_xml_files[@]} ROS packages under '${colcon_workspace}/${search_root}':"
-for pkg_xml in "${package_xml_files[@]}"; do
- echo " - $pkg_xml"
- parse_package_xml "$pkg_xml"
+for package_xml in $(find src -name "package.xml"); do
+ parse_package_xml "$package_xml"
done
-echo
if [[ -n "$TARGET_PACKAGE" ]]; then
if [[ -z "${local_packages[$TARGET_PACKAGE]:-}" ]]; then
@@ -379,17 +309,15 @@ if [[ -n "$TARGET_PACKAGE" ]]; then
fi
echo "Building single package: $TARGET_PACKAGE with its dependencies"
- mapfile -t packages_to_build < <(get_all_dependencies "$TARGET_PACKAGE")
+ packages_to_build=($(get_all_dependencies "$TARGET_PACKAGE"))
else
echo "Building all packages in workspace"
- # Keys of local_packages associative array
packages_to_build=("${!local_packages[@]}")
fi
-mapfile -t build_order < <(topological_sort "${packages_to_build[@]}")
+build_order=($(topological_sort "${packages_to_build[@]}"))
echo "Build order: ${build_order[*]}"
-echo
for package_name in "${build_order[@]}"; do
package_directory="${local_packages[$package_name]}"
@@ -401,7 +329,6 @@ for package_name in "${build_order[@]}"; do
build_package "$package_name"
generate_debian_package "$package_directory"
- echo
done
-echo "All debian packages are available in: $colcon_workspace/build/debian_packages/"
+echo "All debian packages are available in: $ros2_workspace/build/debian_packages/"
diff --git a/setup.sh b/setup.sh
new file mode 100644
index 00000000..a678b3b1
--- /dev/null
+++ b/setup.sh
@@ -0,0 +1,62 @@
+# ********************************************************************************
+# Copyright (c) 2025 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License 2.0 which is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+# ********************************************************************************
+SCRIPT_DIRECTORY="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
+ROS2_WORKSPACE_DIRECTORY="$(realpath "${SCRIPT_DIRECTORY}/ros2_workspace")"
+if [ ! -f /.dockerenv ]; then
+ echo "ERROR: This script must be sourced inside the ADORe CLI context." >&2
+ return 1
+fi
+
+if [ -z "${DISPLAY:-}" ]; then
+ [ -f /tmp/.adore_display ] && source /tmp/.adore_display 2>/dev/null || export DISPLAY=:99
+fi
+
+if [[ "$SHELL" == *"bash"* ]]; then
+ LOCAL_SETUP_SCRIPT="${ROS2_WORKSPACE_DIRECTORY}/install/local_setup.bash"
+ ROS_SETUP_SCRIPT="/opt/ros/${ROS_DISTRO}/setup.bash"
+elif [[ "$SHELL" == *"zsh"* ]]; then
+ LOCAL_SETUP_SCRIPT="${ROS2_WORKSPACE_DIRECTORY}/install/local_setup.zsh"
+ ROS_SETUP_SCRIPT="/opt/ros/${ROS_DISTRO}/setup.zsh"
+else
+ echo shell $SHELL
+ echo "ERROR: Unsupported shell: $SHELL" >&2
+ return 1
+fi
+bash ${SCRIPT_DIRECTORY}/tools/check_adore_binaries.sh
+printf "\n"
+source "$ROS_SETUP_SCRIPT"
+if [[ "${BASH_SOURCE[0]}" != "${0}" ]]; then
+ if [[ -f "${LOCAL_SETUP_SCRIPT}" ]]; then
+ set -a
+ source "${LOCAL_SETUP_SCRIPT}"
+ set +a
+ echo "Sourced ${LOCAL_SETUP_SCRIPT} environment"
+ else
+ echo "WARNING: ${LOCAL_SETUP_SCRIPT} does not exist. Did you build the ROS workspace?"
+ echo " To build the ROS nodes with 'cd ros2_workspace && make build' inside the ADORe CLI." >&2
+ fi
+else
+ echo "ERROR: script designed to be sourced. Call again with 'source setup.sh'" >&2
+ return 1
+fi
+source /opt/adore_venv/bin/activate
+
+source "${SCRIPT_DIRECTORY}/adore.env"
+PYVER=$(python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
+export PYTHONPATH="/opt/adore_venv/lib/python${PYVER}/site-packages:/usr/lib/python3/dist-packages:${PYTHONPATH}"
+
+bash ${SCRIPT_DIRECTORY}/tools/adore_api/adore_api.sh
+
+bash ${SCRIPT_DIRECTORY}/tools/start_zenoh_router.sh
+bash ${SCRIPT_DIRECTORY}/tools/start_zenoh_bridge.sh
+bash ${SCRIPT_DIRECTORY}/tools/start_sumo_bridge.sh
diff --git a/tools/adore_api/adore_api.py b/tools/adore_api/adore_api.py
index ea0a7efa..943c6c2f 100644
--- a/tools/adore_api/adore_api.py
+++ b/tools/adore_api/adore_api.py
@@ -12,13 +12,17 @@
# ********************************************************************************
import os
+import sys
import subprocess
import threading
import time
import json
+import hashlib
+import logging
+import queue
from datetime import datetime, timezone
from collections import deque, defaultdict
-from flask import Flask, render_template, request, jsonify
+from flask import Flask, render_template, request, jsonify, Response
from flask_cors import CORS
import signal
import psutil
@@ -26,6 +30,74 @@
from flask import send_from_directory
+# ── Log broadcaster for the model checker log tab ────────────────────────────
+class _LogBroadcaster:
+ def __init__(self, maxlen=5000):
+ self._lock = threading.Lock()
+ self._clients = []
+ self._buffer = []
+ self._maxlen = maxlen
+
+ def write(self, text, stream='stdout'):
+ msg = json.dumps({
+ 'text': text.rstrip(),
+ 'stream': stream,
+ 'time': datetime.now().strftime('%H:%M:%S'),
+ })
+ with self._lock:
+ self._buffer.append(msg)
+ if len(self._buffer) > self._maxlen:
+ self._buffer.pop(0)
+ for q in list(self._clients):
+ try:
+ q.put_nowait(msg)
+ except Exception:
+ pass
+
+ def subscribe(self):
+ q = queue.Queue(maxsize=500)
+ with self._lock:
+ for line in self._buffer[-200:]:
+ try:
+ q.put_nowait(line)
+ except Exception:
+ pass
+ self._clients.append(q)
+ return q
+
+ def unsubscribe(self, q):
+ with self._lock:
+ try:
+ self._clients.remove(q)
+ except ValueError:
+ pass
+
+
+_adore_log_broadcaster = _LogBroadcaster()
+
+
+class _BroadcastLogHandler(logging.Handler):
+ def emit(self, record):
+ try:
+ msg = self.format(record)
+ stream = 'stderr' if record.levelno >= logging.WARNING else 'stdout'
+ _adore_log_broadcaster.write(msg, stream)
+ except Exception:
+ pass
+
+
+def _install_adore_log_handler():
+ handler = _BroadcastLogHandler()
+ handler.setFormatter(logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s',
+ datefmt='%H:%M:%S'))
+ root = logging.getLogger()
+ if not any(isinstance(h, _BroadcastLogHandler) for h in root.handlers):
+ root.addHandler(handler)
+
+
+_install_adore_log_handler()
+
+
model_check_blueprint = None
ros2_blueprint = None
stop_model_check_worker = None
@@ -34,17 +106,19 @@
from adore_model_checker.model_checker_api import get_model_check_blueprint, stop_model_check_worker as _stop_model_check_worker
stop_model_check_worker = _stop_model_check_worker
print("✓ ADORe Model Checker library found")
-except ImportError as e:
- print(f"⚠ Warning: ADORe Model Checker library not found: {e}")
+except (ImportError, RuntimeError) as e:
+ print(f"⚠ Warning: ADORe Model Checker library not available: {e}")
print("⚠ Model checking functionality will be disabled")
- print("⚠ To enable model checking, please install the adore_model_checker library")
+ print("⚠ Ensure ROS is sourced and adore_model_checker is installed to enable model checking")
try:
from ros2tools.ros2api import *
+ from ros2tools import ROS2Tools
print("✓ ros2tools library found")
except ImportError as e:
print(f"⚠ Warning: ros2tools library not found: {e}")
print("⚠ ros2tools will be disabled")
+ ROS2Tools = None
try:
import sys
@@ -56,9 +130,27 @@
print("⚠ ROS topic functionality will be limited")
ROSMarshaller = None
-app = Flask(__name__)
+_HERE = os.path.dirname(os.path.abspath(__file__))
+app = Flask(__name__,
+ template_folder=os.path.join(_HERE, 'templates'),
+ static_folder=os.path.join(_HERE, 'static'))
CORS(app)
+# Register hardware monitor blueprint
+# adore_api.py lives at tools/adore_api/adore_api.py
+# hardware_monitor lives at ros2_workspace/src/adore_interfaces/hardware_monitor/
+_HW_MONITOR_PATH = os.path.normpath(
+ os.path.join(_HERE, '..', '..', 'ros2_workspace', 'src', 'adore_interfaces', 'hardware_monitor')
+)
+if _HW_MONITOR_PATH not in sys.path:
+ sys.path.insert(0, _HW_MONITOR_PATH)
+try:
+ from hardware_monitor.hardware_monitor_api import get_hardware_monitor_blueprint as _get_hw_bp
+ app.register_blueprint(_get_hw_bp())
+ print(f"✓ Hardware monitor blueprint registered (path: {_HW_MONITOR_PATH})")
+except Exception as _hw_err:
+ print(f"✗ Hardware monitor blueprint not available: {_hw_err}")
+
LOG_DIRECTORY = None
stored_positions = {
@@ -341,6 +433,11 @@ def topic_callback(json_data, topic_name, datatype):
'data': json.loads(json_data) if isinstance(json_data, str) else json_data
}
messages_queue.append(message_data)
+ for listener in self.subscribers.get(topic, {}).get('listeners', []):
+ try:
+ listener(json_data, topic_name, datatype)
+ except Exception:
+ pass
except Exception as e:
print(f"Error processing message for topic {topic}: {e}")
@@ -460,7 +557,7 @@ def save_scenario(self, scenario_name, content):
return {"success": False, "message": f"Error saving scenario: {str(e)}"}
def start_model_check_then_scenario(self, scenario_input, is_file=True, model_check_enabled=True, model_check_config="config/default.yaml"):
- """Start model checking first, then scenario after 5 second delay"""
+ """Start scenario first, wait for ROS nodes to publish, then start model checker"""
if self.current_process and self.current_process.poll() is None:
return {"success": False, "message": "Scenario already running"}
@@ -469,11 +566,21 @@ def start_model_check_then_scenario(self, scenario_input, is_file=True, model_ch
self.waiting_for_model_check = False
self.current_model_check_run_id = None
- # Step 1: Start model checking if enabled
+ # Step 1: Start the scenario
+ print("Starting scenario...")
+ scenario_result = self.start_scenario(scenario_input, is_file)
+ if not scenario_result["success"]:
+ return scenario_result
+
if model_check_enabled and model_check_blueprint is not None:
- print("Starting model checking first...")
- model_check_result = self._start_model_check(
- model_check_config)
+ # Wait for ROS nodes to come up and begin publishing before
+ # the model checker opens its monitoring window
+ print("Waiting 5 seconds for ROS nodes to publish...")
+ time.sleep(5)
+
+ # Step 2: Start model checking
+ print("Starting model checking...")
+ model_check_result = self._start_model_check(model_check_config)
print(f"Model check start result: {model_check_result}")
if model_check_result["success"]:
@@ -482,19 +589,16 @@ def start_model_check_then_scenario(self, scenario_input, is_file=True, model_ch
with self.model_check_lock:
self.current_model_check_run_id = run_id
self.waiting_for_model_check = True
- print(
- f"Model checking started with run ID: {self.current_model_check_run_id}")
+ print(f"Model checking started with run ID: {self.current_model_check_run_id}")
else:
- print(
- "Error: Model check start succeeded but no run ID returned")
+ print("Error: Model check start succeeded but no run ID returned")
return {
"success": False,
"message": "Model check start succeeded but no run ID returned",
"debug_info": model_check_result
}
else:
- error_msg = model_check_result.get(
- 'message', 'Unknown error')
+ error_msg = model_check_result.get('message', 'Unknown error')
print(f"Failed to start model checking: {error_msg}")
return {
"success": False,
@@ -502,19 +606,13 @@ def start_model_check_then_scenario(self, scenario_input, is_file=True, model_ch
"debug_info": model_check_result
}
- # Wait 5 seconds before starting scenario
- print("Waiting 5 seconds before starting scenario...")
- time.sleep(5)
+ scenario_result['model_check_result'] = model_check_result
else:
if not model_check_enabled:
print("Model checking disabled")
if model_check_blueprint is None:
print("Model check blueprint not available")
- # Step 2: Start the scenario
- print("Starting scenario...")
- scenario_result = self.start_scenario(scenario_input, is_file)
- scenario_result['model_check_result'] = model_check_result
return scenario_result
except Exception as e:
@@ -631,17 +729,19 @@ def start_scenario(self, scenario_input, is_file=True):
f"{full_path} (base_directory='{self.base_directory}')"
)
else:
- # Custom launch content passed directly
- temp_file = os.path.join(
- self.base_directory, "temp_custom_scenario.launch.py"
- )
+ # Always write the temp file into simulation_scenarios/ so
+ # that sys.path.append(os.path.dirname(__file__)) inside the
+ # launch file resolves position.py, simulated_vehicle.py etc.
+ scenario_dir = os.path.join(self.base_directory, "simulation_scenarios")
+ os.makedirs(scenario_dir, exist_ok=True)
+ temp_file = os.path.join(scenario_dir, "temp_custom_scenario.launch.py")
full_path = os.path.abspath(temp_file)
with open(full_path, "w") as f:
f.write(scenario_input)
self.current_scenario_content = scenario_input
- self.current_scenario = "temp_custom_scenario.launch.py"
+ self.current_scenario = os.path.relpath(full_path, self.base_directory)
cmd = ["ros2", "launch", full_path]
cwd = None
@@ -650,6 +750,7 @@ def start_scenario(self, scenario_input, is_file=True):
f"[ScenarioManager] Starting custom scenario from temp file: {full_path}"
)
+ scenario_env = _source_workspace_env()
self.current_process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
@@ -657,8 +758,18 @@ def start_scenario(self, scenario_input, is_file=True):
universal_newlines=True,
bufsize=1,
cwd=cwd,
+ env=scenario_env,
)
+ time.sleep(0.5)
+ if self.current_process.poll() is not None:
+ self.status = "failed"
+ output = self.current_process.stdout.read()
+ return {
+ "success": False,
+ "message": f"Scenario process exited immediately (rc={self.current_process.returncode}): {output}",
+ }
+
self.status = "running"
self.scenario_start_time = time.time()
self.output_buffer.clear()
@@ -996,6 +1107,252 @@ def _loop_monitor(self):
time.sleep(1)
+class WorkspaceMonitor:
+ """
+ Watches ros2_workspace/build for changes and re-sources
+ ros2_workspace/install/setup.bash whenever the build directory is mutated.
+
+ The environment snapshot produced by sourcing setup.bash is injected into
+ os.environ so that all subsequent subprocess calls (ros2 launch, ros2 bag,
+ etc.) inherit the updated ROS environment without restarting the API.
+ """
+
+ POLL_INTERVAL = 2.0
+
+ def __init__(self, workspace_root: str):
+ self.workspace_root = workspace_root
+ self.build_dir = os.path.join(workspace_root, "ros2_workspace", "build")
+ self.install_dir = os.path.join(workspace_root, "ros2_workspace", "install")
+ self.setup_script = os.path.join(self.install_dir, "setup.bash")
+
+ self._lock = threading.Lock()
+ self._last_snapshot: str | None = None
+ self._sourced_at: float | None = None
+ self._thread: threading.Thread | None = None
+ self._running = False
+
+ # ------------------------------------------------------------------
+ # Public interface
+ # ------------------------------------------------------------------
+
+ def start(self):
+ self._running = True
+ self._thread = threading.Thread(target=self._poll_loop, daemon=True, name="workspace-monitor")
+ self._thread.start()
+ print(f"✓ Workspace monitor watching: {self.build_dir}")
+
+ def stop(self):
+ self._running = False
+
+ def check_build_ready(self) -> dict | None:
+ """
+ Returns an error dict (suitable for jsonify) when the build directory
+ is absent or empty, or None when everything looks fine.
+ """
+ if not os.path.isdir(self.build_dir):
+ return {
+ "success": False,
+ "error": "workspace_not_built",
+ "message": (
+ f"ROS 2 workspace build directory not found: {self.build_dir}. "
+ "Run `colcon build` inside ros2_workspace to fix this."
+ ),
+ }
+
+ entries = [e for e in os.scandir(self.build_dir) if not e.name.startswith(".")]
+ if not entries:
+ return {
+ "success": False,
+ "error": "workspace_not_built",
+ "message": (
+ f"ROS 2 workspace build directory is empty: {self.build_dir}. "
+ "Run `colcon build` inside ros2_workspace to fix this."
+ ),
+ }
+
+ return None
+
+ def get_status(self) -> dict:
+ with self._lock:
+ return {
+ "build_dir": self.build_dir,
+ "build_dir_exists": os.path.isdir(self.build_dir),
+ "install_dir_exists": os.path.isdir(self.install_dir),
+ "setup_script_exists": os.path.isfile(self.setup_script),
+ "last_sourced_at": self._sourced_at,
+ "monitoring": self._running,
+ }
+
+ # ------------------------------------------------------------------
+ # Internal helpers
+ # ------------------------------------------------------------------
+
+ def _snapshot(self) -> str:
+ """
+ Produce a fingerprint of the build directory based on the mtimes and
+ sizes of all regular files. Lightweight enough to run every few seconds.
+ """
+ if not os.path.isdir(self.build_dir):
+ return ""
+
+ hasher = hashlib.md5()
+ for root, dirs, files in os.walk(self.build_dir):
+ dirs.sort()
+ for fname in sorted(files):
+ path = os.path.join(root, fname)
+ try:
+ st = os.stat(path)
+ hasher.update(f"{path}:{st.st_mtime}:{st.st_size}".encode())
+ except OSError:
+ pass
+ return hasher.hexdigest()
+
+ def _source_setup(self):
+ if not os.path.isfile(self.setup_script):
+ print(f"⚠ Workspace setup script not found: {self.setup_script}")
+ return
+
+ try:
+ result = subprocess.run(
+ ["bash", "-c", f"source '{self.setup_script}' && env -0"],
+ capture_output=True,
+ text=True,
+ timeout=30,
+ )
+ if result.returncode != 0:
+ print(f"⚠ Failed to source workspace setup: {result.stderr.strip()}")
+ return
+
+ new_env = {}
+ for entry in result.stdout.split("\0"):
+ if "=" in entry:
+ k, _, v = entry.partition("=")
+ new_env[k] = v
+
+ os.environ.update(new_env)
+
+ with self._lock:
+ self._sourced_at = time.time()
+
+ print(f"✓ Workspace re-sourced: {self.setup_script}")
+ except subprocess.TimeoutExpired:
+ print("⚠ Timeout sourcing workspace setup script")
+ except Exception as e:
+ print(f"⚠ Error sourcing workspace setup script: {e}")
+
+ def _poll_loop(self):
+ # Source immediately on startup if the workspace already exists
+ initial = self._snapshot()
+ if initial:
+ self._source_setup()
+
+ with self._lock:
+ self._last_snapshot = initial
+
+ while self._running:
+ time.sleep(self.POLL_INTERVAL)
+ try:
+ current = self._snapshot()
+ with self._lock:
+ changed = current != self._last_snapshot
+ self._last_snapshot = current
+
+ if changed and current:
+ print("Workspace build directory changed, re-sourcing install/setup.bash...")
+ self._source_setup()
+ except Exception as e:
+ print(f"⚠ Workspace monitor error: {e}")
+
+
+workspace_monitor: WorkspaceMonitor | None = None
+
+
+def _source_workspace_env() -> dict:
+ """
+ Source ros2_workspace/install/setup.bash (falling back to setup.sh) and
+ return a copy of the environment with the workspace overlaid. Called
+ immediately before every scenario Popen so the child always inherits a
+ current workspace environment regardless of when the monitor last ran.
+ """
+ workspace_root = os.environ.get(
+ 'WORKSPACE_ROOT',
+ os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
+ )
+ install_dir = os.path.join(workspace_root, 'ros2_workspace', 'install')
+
+ for candidate in ('setup.bash', 'setup.sh'):
+ script = os.path.join(install_dir, candidate)
+ if os.path.isfile(script):
+ break
+ else:
+ print('⚠ Workspace setup script not found — launching with current environment')
+ return dict(os.environ)
+
+ try:
+ result = subprocess.run(
+ ['bash', '-c', f"source '{script}' && env -0"],
+ capture_output=True,
+ text=True,
+ timeout=30,
+ )
+ if result.returncode != 0:
+ print(f'⚠ Failed to source workspace setup: {result.stderr.strip()}')
+ return dict(os.environ)
+
+ env = dict(os.environ)
+ for entry in result.stdout.split('\0'):
+ if '=' in entry:
+ k, _, v = entry.partition('=')
+ env[k] = v
+ print(f'✓ Workspace sourced for scenario: {script}')
+ return env
+ except subprocess.TimeoutExpired:
+ print('⚠ Timeout sourcing workspace setup script')
+ return dict(os.environ)
+ except Exception as e:
+ print(f'⚠ Error sourcing workspace setup script: {e}')
+ return dict(os.environ)
+
+
+def _workspace_guard():
+ """
+ Return a 503-ready error dict if the workspace build dir is absent or
+ empty, or None when ready. Works even before WorkspaceMonitor is started
+ by falling back to a direct filesystem check using WORKSPACE_ROOT.
+ """
+ if workspace_monitor is not None:
+ return workspace_monitor.check_build_ready()
+
+ workspace_root = os.environ.get(
+ 'WORKSPACE_ROOT',
+ os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
+ )
+ build_dir = os.path.join(workspace_root, 'ros2_workspace', 'build')
+
+ if not os.path.isdir(build_dir):
+ return {
+ "success": False,
+ "error": "workspace_not_built",
+ "message": (
+ f"ROS 2 workspace build directory not found: {build_dir}. "
+ "Run `colcon build` inside ros2_workspace to fix this."
+ ),
+ }
+
+ entries = [e for e in os.scandir(build_dir) if not e.name.startswith('.')]
+ if not entries:
+ return {
+ "success": False,
+ "error": "workspace_not_built",
+ "message": (
+ f"ROS 2 workspace build directory is empty: {build_dir}. "
+ "Run `colcon build` inside ros2_workspace to fix this."
+ ),
+ }
+
+ return None
+
+
scenario_manager = ScenarioManager()
bag_manager = None
@@ -1005,10 +1362,6 @@ def index():
return render_template('index.html', host=request.host)
-@app.route('/static/')
-def serve_static(filename):
- return send_from_directory('static', filename)
-
@app.route('/api_reference.md')
def serve_api_reference():
@@ -1025,17 +1378,36 @@ def goal_picker():
@app.route('/api/status')
def api_status():
+ ws_status = workspace_monitor.get_status() if workspace_monitor else None
+ build_error = _workspace_guard()
return jsonify({
"adore_api": "running",
"model_checker_available": model_check_blueprint is not None,
"ros_marshaller_available": ROSMarshaller is not None,
- "bag_recording_available": bag_manager is not None
+ "bag_recording_available": bag_manager is not None,
+ "workspace": ws_status,
+ "workspace_ready": build_error is None,
})
+@app.route('/api/workspace/status')
+def workspace_status():
+ if workspace_monitor is None:
+ return jsonify({"monitoring": False, "message": "Workspace monitor not initialised"}), 503
+ status = workspace_monitor.get_status()
+ build_error = workspace_monitor.check_build_ready()
+ status["ready"] = build_error is None
+ if build_error:
+ status["error"] = build_error["message"]
+ return jsonify(status)
+
+
@app.route('/api/scenario/start', methods=['POST'])
def start_scenario_route():
- # Be tolerant if client sends no/invalid JSON
+ err = _workspace_guard()
+ if err:
+ return jsonify(err), 503
+
data = request.get_json(silent=True) or {}
scenario_input = data.get(
@@ -1050,9 +1422,6 @@ def start_scenario_route():
if not scenario_input:
return jsonify({"success": False, "message": "No scenario provided"}), 400
- # Currently you’re explicitly disabling model checking here
- model_check_enabled = False
-
if model_check_enabled:
result = scenario_manager.start_model_check_then_scenario(
scenario_input,
@@ -1074,6 +1443,9 @@ def stop_scenario():
@app.route('/api/scenario/restart', methods=['POST'])
def restart_scenario():
+ err = _workspace_guard()
+ if err:
+ return jsonify(err), 503
result = scenario_manager.restart_scenario()
return jsonify(result)
@@ -1302,24 +1674,51 @@ def publish_to_topic():
return jsonify({"success": False, "message": f"Failed to publish message: {str(e)}"}), 500
+@app.route('/api/ros2/nodes/running')
+def list_running_nodes():
+ try:
+ nodes = ROS2Tools.get_nodes() if ROS2Tools else []
+ return jsonify({"success": True, "running_nodes": nodes, "count": len(nodes)})
+ except Exception as e:
+ return jsonify({"success": False, "running_nodes": [], "count": 0, "message": str(e)}), 500
+
+
@app.route('/api/topic/list')
def list_active_topics():
try:
stats = topic_manager.get_stats()
-
+ topic_datatypes = {}
system_topics = []
- try:
- result = subprocess.run(
- ["ros2", "topic", "list"], capture_output=True, text=True, check=True)
- system_topics = [t.strip()
- for t in result.stdout.split('\n') if t.strip()]
- except:
- pass
-
+ if ROS2Tools:
+ try:
+ topic_datatypes = ROS2Tools.get_topics()
+ system_topics = sorted(topic_datatypes.keys())
+ except Exception as e:
+ logging.warning(f"ROS2Tools.get_topics() failed: {e}")
+ if not system_topics:
+ # Fallback: raw subprocess when ros2tools unavailable or returned nothing
+ try:
+ r = subprocess.run(["ros2", "topic", "list", "-t"],
+ capture_output=True, text=True, timeout=8)
+ for line in r.stdout.splitlines():
+ line = line.strip()
+ if not line:
+ continue
+ if " [" in line:
+ topic, rest = line.split(" [", 1)
+ topic = topic.strip()
+ system_topics.append(topic)
+ topic_datatypes[topic] = rest.rstrip("]").strip()
+ else:
+ system_topics.append(line)
+ system_topics.sort()
+ except Exception:
+ pass
return jsonify({
"success": True,
"managed_topics": stats,
- "system_topics": system_topics
+ "system_topics": system_topics,
+ "topic_datatypes": topic_datatypes
})
except Exception as e:
return jsonify({"success": False, "message": f"Failed to list topics: {str(e)}"}), 500
@@ -1327,14 +1726,15 @@ def list_active_topics():
@app.route('/api/topic/info/')
def get_topic_info(topic_name):
- if not ROSMarshaller:
- return jsonify({"success": False, "message": "ROS functionality not available"}), 500
-
try:
if not topic_name.startswith('/'):
topic_name = '/' + topic_name
- datatype = ROSMarshaller.get_datatype(topic_name)
+ datatype = None
+ if ROS2Tools:
+ datatype = ROS2Tools.get_topic_datatype(topic_name)
+ elif ROSMarshaller:
+ datatype = ROSMarshaller.get_datatype(topic_name)
managed = False
with topic_manager.lock:
@@ -1346,7 +1746,6 @@ def get_topic_info(topic_name):
"datatype": datatype,
"managed": managed
})
-
except Exception as e:
return jsonify({"success": False, "message": f"Failed to get topic info: {str(e)}"}), 500
@@ -1365,7 +1764,7 @@ def start_scenario_model_checked():
Request JSON Parameters:
scenario (str, optional): Name of the launch file to run.
- Default: "adore_simulation_scenarios/simulation_test.launch.py"
+ Default: "adore_scenarios/simulation_scenarios/simulation_test.launch.py"
duration (int|float, optional): How long to run the scenario in seconds.
Must be a positive number. Default: 5
@@ -1412,7 +1811,7 @@ def start_scenario_model_checked():
"""
data = request.json or {}
scenario = data.get(
- 'scenario', 'adore_simulation_scenarios/simulation_test.launch.py')
+ 'scenario', 'simulation_scenarios/simulation_test.launch.py')
duration = data.get('duration', 5)
if not isinstance(duration, (int, float)) or duration <= 0:
@@ -1649,6 +2048,1012 @@ def start_scenario_model_checked():
})
+@app.route('/model-checker/dashboard')
+def model_check_dashboard():
+ here = os.path.dirname(os.path.abspath(__file__))
+ candidates = [
+ # Dev layout: tools/adore_api/../../vendor/adore_model_checker/
+ os.path.normpath(os.path.join(here, '..', '..', 'vendor', 'adore_model_checker', 'adore_model_checker_dashboard.html')),
+ # Dev layout: inside the package subdir
+ os.path.normpath(os.path.join(here, '..', '..', 'vendor', 'adore_model_checker', 'adore_model_checker', 'adore_model_checker_dashboard.html')),
+ os.path.join(here, 'adore_model_checker_dashboard.html'),
+ ]
+ html = None
+ for path in candidates:
+ if os.path.exists(path):
+ with open(path, 'r') as fh:
+ html = fh.read()
+ break
+
+ if html is None:
+ try:
+ from importlib.resources import files
+ resource = files('adore_model_checker').joinpath('adore_model_checker_dashboard.html')
+ if resource.is_file():
+ html = resource.read_text(encoding='utf-8')
+ except Exception:
+ pass
+
+ if html is None:
+ return "Model Checker dashboard not found", 404
+
+ inject = (
+ ""
+ )
+ html = html.replace('', inject + '\n', 1)
+ return Response(html, mimetype='text/html')
+
+
+_mc_continuous_disabled = {'props': set()}
+
+
+@app.route('/api/model_checker/continuous/disabled', methods=['POST'])
+def mc_set_disabled():
+ data = request.get_json(silent=True) or {}
+ _mc_continuous_disabled['props'] = set(data.get('disabled_propositions', []))
+ return jsonify({'ok': True})
+
+
+@app.route('/api/model_checker/continuous/violations/filtered')
+def mc_filtered_violations():
+ from flask import current_app
+ fn = current_app.view_functions.get('model_check_blueprint.continuous_violations')
+ if fn is None:
+ return jsonify({'error': 'Continuous monitoring not available'}), 404
+ try:
+ resp = fn()
+ except Exception as e:
+ return jsonify({'error': str(e)}), 500
+
+ disabled = _mc_continuous_disabled['props']
+ if not disabled:
+ return resp
+
+ import json as _json
+ try:
+ body = _json.loads(resp.get_data(as_text=True))
+ body['violations'] = [v for v in body.get('violations', [])
+ if v.get('proposition') not in disabled]
+ body['count'] = len(body['violations'])
+ return jsonify(body)
+ except Exception:
+ return resp
+
+
+@app.route('/api/model_checker/continuous/', methods=['GET', 'POST', 'OPTIONS'])
+def proxy_continuous(subpath):
+ from flask import current_app
+ parts = subpath.split('/')
+ base = parts[0]
+ endpoint = f'model_check_blueprint.continuous_{base}'
+ fn = current_app.view_functions.get(endpoint)
+ if fn is None:
+ return jsonify({'error': f'Unknown endpoint: /continuous/{subpath}'}), 404
+ try:
+ return fn(*parts[1:]) if len(parts) > 1 else fn()
+ except Exception as e:
+ return jsonify({'error': str(e)}), 500
+
+
+@app.route('/api/model_checker/result/')
+def proxy_result(run_id):
+ from flask import current_app
+ fn = current_app.view_functions.get('model_check_blueprint.get_result')
+ if fn is None:
+ return jsonify({'error': 'Result endpoint not available'}), 404
+ try:
+ return fn(run_id)
+ except Exception as e:
+ return jsonify({'error': str(e)}), 500
+
+
+def _mc_config_dir():
+ candidates = [
+ os.environ.get('ADORE_CONFIG_DIR'),
+ os.path.join(os.path.dirname(os.path.abspath(__file__)),
+ '..', '..', 'vendor', 'adore_model_checker', 'config'),
+ ]
+ for path in candidates:
+ if path:
+ os.makedirs(path, exist_ok=True)
+ _mc_seed_default(path)
+ return path
+ raise RuntimeError("Cannot determine model checker config directory")
+
+
+def _mc_seed_default(config_dir):
+ """Copy the canonical package default.yaml into config_dir if not already present."""
+ dest = os.path.join(config_dir, 'default.yaml')
+ if os.path.exists(dest):
+ return
+
+ content = _mc_load_package_default_yaml()
+ if content:
+ with open(dest, 'w') as f:
+ f.write(content)
+ return
+
+ raise RuntimeError(
+ "Cannot locate adore_model_checker/config/default.yaml — "
+ "ensure the package is installed correctly."
+ )
+
+
+def _mc_load_package_default_yaml():
+ """Return the canonical default.yaml content from the package, or None on failure."""
+ try:
+ from importlib.resources import files
+ resource = files('adore_model_checker').joinpath('config/default.yaml')
+ if resource.is_file():
+ return resource.read_text(encoding='utf-8')
+ except Exception:
+ pass
+
+ here = os.path.dirname(os.path.abspath(__file__))
+ for candidate in [
+ os.path.normpath(os.path.join(here, '..', '..', 'vendor', 'adore_model_checker', 'adore_model_checker', 'config', 'default.yaml')),
+ os.path.normpath(os.path.join(here, '..', '..', 'vendor', 'adore_model_checker', 'config', 'default.yaml')),
+ ]:
+ if os.path.exists(candidate):
+ with open(candidate, 'r') as f:
+ return f.read()
+
+ return None
+
+
+# ── ROS Workspace Build Management ──────────────────────────────────────────
+
+_workspace_build_procs: dict = {}
+_workspace_build_broadcaster = _LogBroadcaster(maxlen=5000)
+
+
+def _get_ros2_workspace_dir():
+ workspace_root = os.environ.get(
+ 'WORKSPACE_ROOT',
+ os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
+ )
+ return os.path.join(workspace_root, 'ros2_workspace')
+
+
+@app.route('/api/ros_workspace/status')
+def ros_workspace_status():
+ ws_dir = _get_ros2_workspace_dir()
+ build_dir = os.path.join(ws_dir, 'build')
+ install_dir = os.path.join(ws_dir, 'install')
+ src_dir = os.path.join(ws_dir, 'src')
+ makefile_exists = os.path.isfile(os.path.join(ws_dir, 'Makefile'))
+ running = {k: (p.poll() is None) for k, p in _workspace_build_procs.items()}
+
+ # Quick package counts without full mtime scan
+ total_pkgs = 0
+ built_pkgs = 0
+ if os.path.isdir(src_dir):
+ for pkg_path in _find_packages(src_dir):
+ total_pkgs += 1
+ if os.path.isdir(os.path.join(build_dir, os.path.basename(pkg_path))):
+ built_pkgs += 1
+
+ return jsonify({
+ 'workspace_dir': ws_dir,
+ 'workspace_exists': os.path.isdir(ws_dir),
+ 'makefile_exists': makefile_exists,
+ 'build_dir_exists': os.path.isdir(build_dir),
+ 'install_dir_exists': os.path.isdir(install_dir),
+ 'running': running,
+ 'total_packages': total_pkgs,
+ 'built_packages': built_pkgs,
+ })
+
+
+# Extensions and directories to skip when scanning source mtimes
+_SRC_SKIP_DIRS = frozenset({'.git', '__pycache__', '.cache', 'node_modules', '.eggs', 'dist', 'build', 'install', 'log'})
+_SRC_SKIP_EXTS = frozenset({'.pyc', '.pyo'})
+
+# Track packages colcon has reported as unknown so we can exclude them from auto-rebuild
+_colcon_unknown_packages: set = set()
+
+
+def _max_mtime(root: str, skip_dirs: frozenset) -> float:
+ best = 0.0
+ try:
+ for dirpath, dirnames, filenames in os.walk(root):
+ dirnames[:] = [d for d in dirnames
+ if d not in skip_dirs and not d.endswith('.egg-info')]
+ for fname in filenames:
+ if os.path.splitext(fname)[1] in _SRC_SKIP_EXTS:
+ continue
+ try:
+ mt = os.stat(os.path.join(dirpath, fname)).st_mtime
+ if mt > best:
+ best = mt
+ except OSError:
+ pass
+ except OSError:
+ pass
+ return best
+
+
+def _find_packages(src_dir: str) -> list:
+ """Recursively find all directories containing package.xml under src_dir."""
+ found = []
+ try:
+ for dirpath, dirnames, filenames in os.walk(src_dir):
+ # Don't descend into hidden dirs or known non-source dirs
+ dirnames[:] = sorted(d for d in dirnames
+ if not d.startswith('.') and d not in ('build', 'install', 'log', '__pycache__'))
+ if 'package.xml' in filenames:
+ found.append(dirpath)
+ # Don't recurse into a package — packages don't nest inside packages
+ dirnames.clear()
+ except OSError:
+ pass
+ return found
+
+
+def _package_info(name: str, src_path: str, build_dir: str) -> dict:
+ pkg_build_dir = os.path.join(build_dir, name)
+ built = os.path.isdir(pkg_build_dir)
+ stale = False
+ if built:
+ src_mtime = _max_mtime(src_path, _SRC_SKIP_DIRS)
+ build_mtime = _max_mtime(pkg_build_dir, frozenset())
+ stale = src_mtime > build_mtime and src_mtime > 0
+ return {
+ 'name': name,
+ 'path': src_path,
+ 'built': built,
+ 'stale': stale,
+ 'colcon_unknown': name in _colcon_unknown_packages,
+ }
+
+
+@app.route('/api/ros_workspace/packages')
+def ros_workspace_packages():
+ ws_dir = _get_ros2_workspace_dir()
+ src_dir = os.path.join(ws_dir, 'src')
+ build_dir = os.path.join(ws_dir, 'build')
+
+ packages = []
+ if os.path.isdir(src_dir):
+ for pkg_path in _find_packages(src_dir):
+ name = os.path.basename(pkg_path)
+ packages.append(_package_info(name, pkg_path, build_dir))
+ packages.sort(key=lambda p: p['name'])
+
+ built_count = sum(1 for p in packages if p['built'])
+ return jsonify({'packages': packages, 'total': len(packages), 'built_count': built_count})
+
+
+@app.route('/api/ros_workspace/build_package', methods=['POST'])
+def ros_workspace_build_package():
+ data = request.get_json(silent=True) or {}
+ package = data.get('package', '').strip()
+ if not package or '/' in package or package.startswith('.'):
+ return jsonify({'success': False, 'message': 'Invalid package name'}), 400
+ return jsonify(_run_workspace_make(f'__pkg__{package}'))
+
+
+def _run_workspace_make(target: str):
+ ws_dir = _get_ros2_workspace_dir()
+ if not os.path.isdir(ws_dir):
+ return {'success': False, 'message': f'Workspace directory not found: {ws_dir}'}
+ existing = _workspace_build_procs.get(target)
+ if existing and existing.poll() is None:
+ return {'success': False, 'message': f'{target} already running'}
+
+ # __pkg__ targets use colcon instead of make
+ if target.startswith('__pkg__'):
+ package = target[len('__pkg__'):]
+ cmd = ['colcon', 'build', '--packages-select', package]
+ label = f'colcon build --packages-select {package}'
+ else:
+ cmd = ['make', target]
+ label = f'make {target}'
+
+ try:
+ proc = subprocess.Popen(
+ cmd,
+ cwd=ws_dir,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ universal_newlines=True,
+ bufsize=1,
+ )
+ _workspace_build_procs[target] = proc
+
+ def _stream():
+ _workspace_build_broadcaster.write(f'=== {label} started ===', 'stdout')
+ unknown_warned = False
+ for line in iter(proc.stdout.readline, ''):
+ if line:
+ stripped = line.rstrip()
+ _workspace_build_broadcaster.write(stripped, 'stdout')
+ # Detect colcon "ignoring unknown package ''" and record it
+ if 'ignoring unknown package' in stripped and target.startswith('__pkg__'):
+ pkg_name = target[len('__pkg__'):]
+ _colcon_unknown_packages.add(pkg_name)
+ unknown_warned = True
+ rc = proc.wait()
+ _workspace_build_broadcaster.write(
+ f'=== {label} exited (rc={rc}) ===',
+ 'stdout' if rc == 0 else 'stderr'
+ )
+
+ threading.Thread(target=_stream, daemon=True).start()
+ return {'success': True, 'message': f'{label} started'}
+ except Exception as e:
+ return {'success': False, 'message': str(e)}
+
+
+@app.route('/api/ros_workspace/clean', methods=['POST'])
+def ros_workspace_clean():
+ return jsonify(_run_workspace_make('clean'))
+
+
+@app.route('/api/ros_workspace/ccache/stats')
+def ccache_stats():
+ try:
+ r = subprocess.run(['ccache', '-s', '-v'], capture_output=True, text=True, timeout=10)
+ if r.returncode != 0:
+ r2 = subprocess.run(['ccache', '-s'], capture_output=True, text=True, timeout=10)
+ raw = r2.stdout.strip() or r2.stderr.strip()
+ return jsonify({'available': True, 'raw': raw, 'verbose': False})
+ return jsonify({'available': True, 'raw': r.stdout.strip(), 'verbose': True})
+ except FileNotFoundError:
+ return jsonify({'available': False, 'message': 'ccache not found'})
+ except Exception as e:
+ return jsonify({'available': False, 'message': str(e)}), 500
+
+
+@app.route('/api/ros_workspace/ccache/clear', methods=['POST'])
+def ccache_clear():
+ try:
+ r = subprocess.run(['ccache', '-C'], capture_output=True, text=True, timeout=30)
+ if r.returncode != 0:
+ return jsonify({'success': False, 'message': r.stderr.strip() or 'ccache -C failed'}), 500
+ return jsonify({'success': True, 'message': r.stdout.strip() or 'Cache cleared'})
+ except FileNotFoundError:
+ return jsonify({'success': False, 'message': 'ccache not found'}), 500
+ except Exception as e:
+ return jsonify({'success': False, 'message': str(e)}), 500
+
+
+@app.route('/api/ros_workspace/build', methods=['POST'])
+def ros_workspace_build():
+ return jsonify(_run_workspace_make('build'))
+
+
+@app.route('/api/ros_workspace/log/stream')
+def ros_workspace_log_stream():
+ def generate():
+ q = _workspace_build_broadcaster.subscribe()
+ try:
+ yield 'retry: 3000\n\n'
+ while True:
+ try:
+ msg = q.get(timeout=20)
+ yield f'data: {msg}\n\n'
+ except queue.Empty:
+ yield ': keepalive\n\n'
+ except GeneratorExit:
+ pass
+ finally:
+ _workspace_build_broadcaster.unsubscribe(q)
+
+ return Response(
+ generate(),
+ mimetype='text/event-stream',
+ headers={'Cache-Control': 'no-cache', 'X-Accel-Buffering': 'no'},
+ )
+
+
+# ── ROS Topics extended API ──────────────────────────────────────────────────
+
+@app.route('/api/topic/hz', methods=['POST'])
+def topic_hz():
+ data = request.get_json(silent=True) or {}
+ topic = data.get('topic', '').strip()
+ if not topic:
+ return jsonify({'success': False, 'message': 'topic required'}), 400
+ if not ROS2Tools:
+ return jsonify({'success': False, 'message': 'ros2tools not available'}), 500
+ try:
+ output = ROS2Tools.topic_hz(topic)
+ return jsonify({'success': True, 'topic': topic, 'output': output})
+ except Exception as e:
+ return jsonify({'success': False, 'message': str(e)}), 500
+
+
+@app.route('/api/topic/echo', methods=['POST'])
+def topic_echo_once():
+ data = request.get_json(silent=True) or {}
+ topic = data.get('topic', '').strip()
+ if not topic:
+ return jsonify({'success': False, 'message': 'topic required'}), 400
+
+ if ROSMarshaller:
+ received = []
+ done = threading.Event()
+
+ def _cb(json_str, _topic, _dtype):
+ if not done.is_set():
+ received.append(json_str)
+ done.set()
+
+ try:
+ sub = ROSMarshaller.subscribe(topic, _cb)
+ done.wait(timeout=10)
+ except Exception as e:
+ return jsonify({'success': False, 'message': str(e)}), 500
+
+ if received:
+ try:
+ msg = json.loads(received[0])
+ msg.pop('topic', None)
+ msg.pop('datatype', None)
+ return jsonify({'success': True, 'topic': topic, 'msg': msg})
+ except Exception:
+ pass
+
+ return jsonify({'success': False, 'message': 'Timeout waiting for message'}), 504
+
+ try:
+ result = subprocess.run(
+ ['ros2', 'topic', 'echo', '--once', topic],
+ capture_output=True, text=True, timeout=10
+ )
+ raw = result.stdout.strip() or result.stderr.strip()
+ return jsonify({'success': True, 'topic': topic, 'raw': raw})
+ except subprocess.TimeoutExpired:
+ return jsonify({'success': False, 'message': 'Timeout waiting for message'}), 504
+ except Exception as e:
+ return jsonify({'success': False, 'message': str(e)}), 500
+
+
+@app.route('/api/topic/empty_message', methods=['POST'])
+def topic_empty_message():
+ data = request.get_json(silent=True) or {}
+ datatype = data.get('datatype', '').strip()
+ if not datatype:
+ return jsonify({'success': False, 'message': 'datatype required'}), 400
+
+ # Try ros2tools first (handles fallback to interface show internally)
+ if ROS2Tools:
+ try:
+ proto = ROS2Tools.get_interface_proto(datatype)
+ if proto and isinstance(proto, dict):
+ return jsonify({'success': True, 'datatype': datatype, 'msg': proto})
+ except Exception as e:
+ logging.warning(f'ROS2Tools.get_interface_proto failed: {e}')
+
+ # Direct subprocess: try ros2 interface proto then fall back to interface show
+ import yaml as _yaml
+
+ def _build_proto_from_show(dtype):
+ r2 = subprocess.run(
+ ['ros2', 'interface', 'show', dtype],
+ capture_output=True, text=True, timeout=20
+ )
+ if r2.returncode != 0 or not r2.stdout.strip():
+ return None
+ return _parse_interface_to_proto(r2.stdout.strip())
+
+ def _parse_interface_to_proto(text):
+ """Build a zero-value dict from ros2 interface show output."""
+ PRIM = {
+ 'bool': False, 'byte': 0, 'char': 0,
+ 'float32': 0.0, 'float64': 0.0,
+ 'int8': 0, 'uint8': 0, 'int16': 0, 'uint16': 0,
+ 'int32': 0, 'uint32': 0, 'int64': 0, 'uint64': 0,
+ 'string': '', 'wstring': '',
+ }
+ result = {}
+ lines = [l for l in text.splitlines() if l.strip() and not l.strip().startswith('#')]
+ for line in lines:
+ if line.startswith(' ') or line.startswith(' '):
+ continue # skip nested lines — handled by ros2tools parse
+ parts = line.strip().split()
+ if len(parts) < 2:
+ continue
+ dtype_part, label = parts[0], parts[1]
+ if '=' in label or '=' in dtype_part:
+ continue # constant
+ is_array = '[]' in dtype_part or (len(parts) > 2 and '[' in parts[0])
+ base_type = dtype_part.replace('[]', '').split('[')[0]
+ if is_array:
+ result[label] = []
+ elif base_type in PRIM:
+ result[label] = PRIM[base_type]
+ else:
+ result[label] = {} # nested object placeholder
+ return result if result else None
+
+ try:
+ r = subprocess.run(
+ ['ros2', 'interface', 'proto', datatype],
+ capture_output=True, text=True, timeout=20
+ )
+ if r.returncode == 0 and r.stdout.strip():
+ parsed = _yaml.safe_load(r.stdout)
+ if parsed and isinstance(parsed, dict):
+ return jsonify({'success': True, 'datatype': datatype, 'msg': parsed})
+ except subprocess.TimeoutExpired:
+ pass
+ except Exception:
+ pass
+
+ # Last resort: build from interface show
+ try:
+ proto = _build_proto_from_show(datatype)
+ if proto:
+ return jsonify({'success': True, 'datatype': datatype, 'msg': proto})
+ err = f'Could not build prototype for {datatype}'
+ return jsonify({'success': False, 'message': err}), 500
+ except subprocess.TimeoutExpired:
+ return jsonify({'success': False, 'message': 'Timeout fetching interface'}), 504
+ except Exception as e:
+ return jsonify({'success': False, 'message': str(e)}), 500
+
+
+# ── Publish session registry ────────────────────────────────────────────────
+# Each entry: {'proc': Popen|None, 'stop': Event, 'datatype': str, 'mode': str}
+_publish_sessions = {}
+_publish_sessions_lock = threading.Lock()
+
+_MSG_STRIP = frozenset(('topic', 'datatype', 'WARNING', 'WARN', 'ERROR', 'INFO', 'DEBUG'))
+
+
+def _clean_msg(msg):
+ if isinstance(msg, dict):
+ return {k: v for k, v in msg.items() if k not in _MSG_STRIP}
+ return msg
+
+
+def _resolve_datatype(topic, datatype):
+ if datatype:
+ return datatype
+ dt = ROSMarshaller.get_datatype(topic) if ROSMarshaller else None
+ if ROS2Tools and not dt:
+ dt = ROS2Tools.get_topic_datatype(topic)
+ return dt
+
+
+def _stop_session(topic):
+ """Stop any active publish session for a topic."""
+ with _publish_sessions_lock:
+ entry = _publish_sessions.pop(topic, None)
+ if not entry:
+ return
+ entry['stop'].set()
+ if entry.get('proc'):
+ ROSMarshaller.stop_persistent(entry['proc'])
+
+
+@app.route('/api/topic/publish_timed', methods=['POST'])
+def publish_timed():
+ if not ROSMarshaller:
+ return jsonify({'success': False, 'message': 'ROS functionality not available'}), 500
+
+ data = request.get_json(silent=True) or {}
+ topic = data.get('topic', '').strip()
+ message_data = data.get('data')
+ datatype = data.get('datatype', '').strip()
+ frequency = data.get('frequency', 0)
+ action = data.get('action', 'publish')
+
+ if action == 'stop':
+ _stop_session(topic)
+ return jsonify({'success': True, 'message': f'Stopped publishing to {topic}'})
+
+ if not topic or message_data is None:
+ return jsonify({'success': False, 'message': 'topic and data required'}), 400
+
+ message_data = _clean_msg(message_data)
+
+ datatype = _resolve_datatype(topic, datatype)
+ if not datatype:
+ return jsonify({'success': False, 'message': f'Could not determine datatype for {topic}'}), 400
+
+ _stop_session(topic)
+
+ if frequency and float(frequency) > 0:
+ hz = float(frequency)
+ stop_event = threading.Event()
+ try:
+ proc = ROSMarshaller.publish_persistent(topic, datatype, message_data, hz)
+ with _publish_sessions_lock:
+ _publish_sessions[topic] = {'proc': proc, 'stop': stop_event,
+ 'datatype': datatype, 'mode': 'persistent'}
+ except Exception as e:
+ return jsonify({'success': False, 'message': str(e)}), 500
+ return jsonify({'success': True, 'message': f'Publishing to {topic} at {hz} Hz',
+ 'topic': topic, 'datatype': datatype})
+
+ try:
+ ROSMarshaller.publish(json.dumps(message_data), topic, datatype)
+ return jsonify({'success': True, 'message': f'Published to {topic}',
+ 'topic': topic, 'datatype': datatype})
+ except Exception as e:
+ return jsonify({'success': False, 'message': str(e)}), 500
+
+
+@app.route('/api/topic/publish_batch', methods=['POST'])
+def publish_batch():
+ """
+ Publish a sequence of messages (batch/replay) with optional looping.
+
+ JSON body:
+ topic str target topic
+ datatype str message type (optional, auto-detected if omitted)
+ messages list[dict] ordered message list
+ frequency float publish rate Hz (default 1.0)
+ loop bool repeat the sequence indefinitely (default false)
+
+ Or send raw JSONL as text/plain body (one JSON object per line).
+ POST /api/topic/publish_batch?topic=...&datatype=...&frequency=1&loop=true
+
+ Returns immediately; the batch runs in a background thread.
+ Use POST /api/topic/publish_timed {action: stop, topic: ...} to cancel.
+ """
+ if not ROSMarshaller:
+ return jsonify({'success': False, 'message': 'ROS functionality not available'}), 500
+
+ ct = request.content_type or ''
+ if 'application/json' in ct:
+ data = request.get_json(silent=True) or {}
+ topic = data.get('topic', request.args.get('topic', '')).strip()
+ datatype = data.get('datatype', request.args.get('datatype', '')).strip()
+ messages = data.get('messages', [])
+ frequency = float(data.get('frequency', request.args.get('frequency', 1)))
+ loop = bool(data.get('loop', request.args.get('loop', 'false').lower() == 'true'))
+ else:
+ # Raw JSONL body
+ topic = request.args.get('topic', '').strip()
+ datatype = request.args.get('datatype', '').strip()
+ frequency = float(request.args.get('frequency', 1))
+ loop = request.args.get('loop', 'false').lower() == 'true'
+ messages = []
+ for line in request.get_data(as_text=True).splitlines():
+ line = line.strip()
+ if not line:
+ continue
+ try:
+ messages.append(json.loads(line))
+ except Exception:
+ pass
+
+ if not topic:
+ return jsonify({'success': False, 'message': 'topic required'}), 400
+ if not messages:
+ return jsonify({'success': False, 'message': 'no messages provided'}), 400
+
+ datatype = _resolve_datatype(topic, datatype)
+ if not datatype:
+ return jsonify({'success': False, 'message': f'Could not determine datatype for {topic}'}), 400
+
+ messages = [_clean_msg(m) for m in messages]
+ interval = 1.0 / frequency if frequency > 0 else 1.0
+ _stop_session(topic)
+
+ stop_event = threading.Event()
+ with _publish_sessions_lock:
+ _publish_sessions[topic] = {'proc': None, 'stop': stop_event,
+ 'datatype': datatype, 'mode': 'batch',
+ 'count': len(messages), 'loop': loop}
+
+ def _batch_loop():
+ iteration = 0
+ while not stop_event.is_set():
+ for msg in messages:
+ if stop_event.is_set():
+ break
+ try:
+ ROSMarshaller.publish(json.dumps(msg), topic, datatype)
+ except Exception as e:
+ logging.error(f'Batch publish error on {topic}: {e}')
+ stop_event.wait(interval)
+ iteration += 1
+ if not loop:
+ break
+ with _publish_sessions_lock:
+ _publish_sessions.pop(topic, None)
+ logging.info(f'Batch publish complete: {topic} ({iteration} iteration(s))')
+
+ t = threading.Thread(target=_batch_loop, daemon=True)
+ t.start()
+
+ return jsonify({
+ 'success': True,
+ 'topic': topic,
+ 'datatype': datatype,
+ 'messages': len(messages),
+ 'frequency': frequency,
+ 'loop': loop,
+ 'message': f'Batch started: {len(messages)} messages at {frequency} Hz{" (looping)" if loop else ""}'
+ })
+
+
+@app.route('/api/topic/publish_status')
+def publish_status():
+ with _publish_sessions_lock:
+ active = {}
+ for t, v in list(_publish_sessions.items()):
+ proc = v.get('proc')
+ alive = (proc is None or proc.poll() is None) and not v['stop'].is_set()
+ if alive:
+ active[t] = {
+ 'datatype': v['datatype'],
+ 'mode': v.get('mode', 'unknown'),
+ 'loop': v.get('loop', False),
+ 'count': v.get('count'),
+ }
+ return jsonify({'active': active})
+
+
+@app.route('/api/topic/interface_types')
+def list_interface_types():
+ """Return all installed ROS message types, merging installed types with active topic datatypes."""
+ types = set()
+
+ # Active topic datatypes — always available, fast
+ try:
+ if ROS2Tools:
+ td = ROS2Tools.get_topics()
+ types.update(v for v in td.values() if v)
+ else:
+ r = subprocess.run(['ros2', 'topic', 'list', '-t'],
+ capture_output=True, text=True, timeout=8)
+ for line in r.stdout.splitlines():
+ if ' [' in line:
+ types.add(line.split(' [', 1)[1].rstrip(']').strip())
+ except Exception:
+ pass
+
+ # All installed message types
+ try:
+ if ROS2Tools:
+ types.update(ROS2Tools.get_message_types())
+ else:
+ r = subprocess.run(['ros2', 'interface', 'list', '--only-msgs'],
+ capture_output=True, text=True, timeout=15)
+ if r.returncode == 0:
+ types.update(t.strip() for t in r.stdout.splitlines() if t.strip())
+ except Exception:
+ pass
+
+ return jsonify({'types': sorted(types)})
+
+
+@app.route('/api/topic/stream')
+def topic_stream():
+ topic = request.args.get('topic', '').strip()
+ try:
+ max_hz = min(float(request.args.get('max_hz', 10)), 20.0)
+ except ValueError:
+ max_hz = 10.0
+ min_interval = 1.0 / max_hz if max_hz > 0 else 0.1
+
+ if not topic:
+ return Response('data: {"error":"topic required"}\n\n', mimetype='text/event-stream')
+
+ if not ROSMarshaller:
+ return Response('data: {"error":"ROSMarshaller not available"}\n\n', mimetype='text/event-stream')
+
+ def generate():
+ # Per-client queue; callback posts here, generator drains and throttles.
+ client_q = queue.Queue(maxsize=200)
+
+ def _callback(json_data, _topic_name, _datatype):
+ try:
+ parsed = json.loads(json_data) if isinstance(json_data, str) else json_data
+ # Drop oldest rather than blocking if client is slow
+ if client_q.full():
+ try:
+ client_q.get_nowait()
+ except queue.Empty:
+ pass
+ client_q.put_nowait(parsed)
+ except Exception:
+ pass
+
+ # Reuse the shared TopicManager subscriber so ROSMarshaller only
+ # spawns one ros2 topic echo process per topic regardless of how
+ # many SSE clients are connected. We register our callback on top
+ # of the existing deque-based subscriber.
+ with topic_manager.lock:
+ topic_manager.get_or_create_subscriber(topic)
+ topic_manager.subscribers[topic]['last_access'] = time.time()
+ listeners = topic_manager.subscribers[topic].setdefault('listeners', [])
+ listeners.append(_callback)
+
+ try:
+ yield 'retry: 3000\n\n'
+
+ pending = None
+ dropped = 0
+ last_emit = 0.0
+
+ while True:
+ # Non-blocking drain — keep only the latest message
+ while True:
+ try:
+ item = client_q.get_nowait()
+ if pending is not None:
+ dropped += 1
+ pending = item
+ except queue.Empty:
+ break
+
+ now = time.monotonic()
+ if pending is not None and now - last_emit >= min_interval:
+ payload = json.dumps({
+ 'msg': pending,
+ 'time': datetime.now().strftime('%H:%M:%S'),
+ 'dropped': dropped,
+ })
+ pending = None
+ dropped = 0
+ last_emit = now
+ yield f'data: {payload}\n\n'
+ else:
+ try:
+ item = client_q.get(timeout=20)
+ if pending is not None:
+ dropped += 1
+ pending = item
+ except queue.Empty:
+ yield ': keepalive\n\n'
+
+ except GeneratorExit:
+ pass
+ finally:
+ with topic_manager.lock:
+ if topic in topic_manager.subscribers:
+ listeners = topic_manager.subscribers[topic].get('listeners', [])
+ try:
+ listeners.remove(_callback)
+ except ValueError:
+ pass
+
+ return Response(
+ generate(),
+ mimetype='text/event-stream',
+ headers={'Cache-Control': 'no-cache', 'X-Accel-Buffering': 'no'},
+ )
+
+
+def _mc_safe_name(name):
+ return (name and os.sep not in name and not name.startswith('.')
+ and name.lower().endswith(('.yaml', '.yml')))
+
+
+@app.route('/api/model_checker/configs', methods=['GET'])
+def mc_configs_list():
+ try:
+ cdir = _mc_config_dir()
+ configs = []
+ for fname in sorted(os.listdir(cdir)):
+ if not fname.lower().endswith(('.yaml', '.yml')):
+ continue
+ fpath = os.path.join(cdir, fname)
+ stat = os.stat(fpath)
+ configs.append({
+ 'name': fname,
+ 'size': stat.st_size,
+ 'modified': datetime.fromtimestamp(stat.st_mtime, tz=timezone.utc).isoformat(),
+ })
+ return jsonify({'configs': configs})
+ except Exception as e:
+ return jsonify({'error': str(e)}), 500
+
+
+@app.route('/api/model_checker/configs/', methods=['GET'])
+def mc_config_get(name):
+ if not _mc_safe_name(name):
+ return jsonify({'error': 'Invalid filename'}), 400
+ path = os.path.join(_mc_config_dir(), name)
+ if not os.path.exists(path):
+ return jsonify({'error': 'Not found'}), 404
+ with open(path) as f:
+ return jsonify({'name': name, 'content': f.read()})
+
+
+@app.route('/api/model_checker/configs', methods=['POST'])
+def mc_config_save():
+ data = request.get_json(silent=True) or {}
+ name = data.get('name', '').strip()
+ content = data.get('content', '')
+ if not _mc_safe_name(name):
+ return jsonify({'error': 'Invalid filename'}), 400
+ with open(os.path.join(_mc_config_dir(), name), 'w') as f:
+ f.write(content)
+ return jsonify({'success': True, 'name': name})
+
+
+@app.route('/api/model_checker/configs/', methods=['DELETE'])
+def mc_config_delete(name):
+ if not _mc_safe_name(name):
+ return jsonify({'error': 'Invalid filename'}), 400
+ path = os.path.join(_mc_config_dir(), name)
+ if not os.path.exists(path):
+ return jsonify({'error': 'Not found'}), 404
+ os.remove(path)
+ return jsonify({'success': True})
+
+
+def _mc_history_dir():
+ candidates = [
+ os.environ.get('ADORE_HISTORY_DIR'),
+ os.path.join(os.path.dirname(os.path.abspath(__file__)),
+ '..', '..', 'vendor', 'adore_model_checker', 'history'),
+ ]
+ for path in candidates:
+ if path:
+ os.makedirs(path, exist_ok=True)
+ return path
+ raise RuntimeError("Cannot determine history directory")
+
+
+@app.route('/api/model_checker/history')
+def mc_history_list():
+ try:
+ hdir = _mc_history_dir()
+ runs = []
+ for fname in sorted(os.listdir(hdir), reverse=True):
+ if not fname.startswith('run_') or not fname.endswith('.json'):
+ continue
+ try:
+ with open(os.path.join(hdir, fname)) as f:
+ d = json.load(f)
+ runs.append({
+ 'run_id': d.get('run_id'),
+ 'status': d.get('status'),
+ 'overall_result': (d.get('results') or {}).get('SUMMARY', {}).get('overall_result'),
+ 'config_file': d.get('config_file'),
+ 'completed_at': d.get('completed_at'),
+ })
+ except Exception:
+ pass
+ return jsonify({'runs': runs})
+ except Exception as e:
+ return jsonify({'error': str(e)}), 500
+
+
+@app.route('/api/model_checker/history//log')
+def mc_history_log(run_id):
+ log_path = os.path.join(_mc_history_dir(), f'run_{run_id}.log')
+ if not os.path.exists(log_path):
+ return jsonify({'log': None})
+ with open(log_path) as f:
+ return jsonify({'log': f.read()})
+
+
+@app.route('/api/model_checker/logs/stream')
+def mc_logs_stream():
+ def generate():
+ q = _adore_log_broadcaster.subscribe()
+ try:
+ yield 'retry: 3000\n\n'
+ while True:
+ try:
+ msg = q.get(timeout=20)
+ yield f'data: {msg}\n\n'
+ except queue.Empty:
+ yield ': keepalive\n\n'
+ except GeneratorExit:
+ pass
+ finally:
+ _adore_log_broadcaster.unsubscribe(q)
+
+ return Response(
+ generate(),
+ mimetype='text/event-stream',
+ headers={'Cache-Control': 'no-cache', 'X-Accel-Buffering': 'no'},
+ )
+
+
@app.route('/api/model_check/debug', methods=['GET'])
def debug_model_check():
"""Debug endpoint to check model checker status"""
@@ -1692,19 +3097,29 @@ def debug_model_check():
def main():
- global LOG_DIRECTORY, bag_manager, model_check_blueprint
+ global LOG_DIRECTORY, bag_manager, model_check_blueprint, workspace_monitor
parser = argparse.ArgumentParser(description='ADORe API Server')
parser.add_argument('--log-directory', type=str,
help='Directory for logs and bag recordings')
parser.add_argument('--port', type=str,
help='TCP listining port. DEFAULT: 8888')
+ parser.add_argument('--workspace-root', type=str,
+ help='Repository root containing ros2_workspace/. Defaults to two levels above this script.')
args = parser.parse_args()
LOG_DIRECTORY = args.log_directory or os.environ.get('LOG_DIRECTORY')
PORT = args.port or 8888
+ workspace_root = (
+ args.workspace_root
+ or os.environ.get('WORKSPACE_ROOT')
+ or os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
+ )
+ workspace_monitor = WorkspaceMonitor(workspace_root)
+ workspace_monitor.start()
+
if LOG_DIRECTORY:
os.makedirs(LOG_DIRECTORY, exist_ok=True)
bag_manager = BagRecordingManager(LOG_DIRECTORY)
@@ -1714,11 +3129,22 @@ def main():
# Register model checker blueprint
try:
- from adore_model_checker.model_checker_api import get_model_check_blueprint
+ from adore_model_checker.model_checker_api import get_model_check_blueprint, _get_api
model_check_blueprint = get_model_check_blueprint()
app.register_blueprint(model_check_blueprint)
print("✓ Model checker API blueprint registered successfully")
+ # Patch the installed model_checker module so ContinuousMonitorEngine
+ # never tries to create a history directory inside the read-only package tree.
+ try:
+ import adore_model_checker.model_checker as _mc_mod
+ _mc_history_path = os.path.join(_get_api().log_directory, 'continuous')
+ os.makedirs(_mc_history_path, exist_ok=True)
+ _mc_mod._history_dir = lambda: _mc_history_path
+ print(f"✓ Model checker history dir set to: {_mc_history_path}")
+ except Exception as _patch_err:
+ print(f"⚠ Could not patch model checker history dir: {_patch_err}")
+
# Test the API is working
with app.test_client() as client:
response = client.get('/api/model_check/status')
@@ -1746,7 +3172,8 @@ def main():
print(f"\n🚀 Starting ADORe API server on http://0.0.0.0:{PORT}")
print(f"📊 API status available at: http://localhost:{PORT}/api/status")
- app.run(debug=True, host='0.0.0.0', port=PORT)
+ print(f"🔧 Workspace status at: http://localhost:{PORT}/api/workspace/status")
+ app.run(debug=False, use_reloader=False, host='0.0.0.0', port=PORT)
if __name__ == '__main__':
diff --git a/tools/adore_api/adore_api.sh b/tools/adore_api/adore_api.sh
index 0ffbb13b..ae7e3290 100755
--- a/tools/adore_api/adore_api.sh
+++ b/tools/adore_api/adore_api.sh
@@ -14,8 +14,19 @@ LOG_DIRECTORY="${LOG_DIRECTORY:-${WORKSPACE_ROOT}/.log}"
# Default API port (can be overridden via env ADORE_API_PORT)
: "${ADORE_API_PORT:=8888}"
+
+
start_adore_api() {
local APP_NAME="adore_api.py"
+
+ # Source ROS environment so rclpy is available when running via `make run`
+ local ros_distro="${ROS_DISTRO:-humble}"
+ local ros_setup="/opt/ros/${ros_distro}/setup.bash"
+ if [ -f "$ros_setup" ] && [ -z "${AMENT_PREFIX_PATH:-}" ]; then
+ set +u
+ source "$ros_setup" 2>/dev/null || true
+ set -u
+ fi
local APP_PORT="${ADORE_API_PORT}"
local LOG_FILE="${LOG_DIRECTORY}/adore_api.log"
local PID_FILE="${LOG_DIRECTORY}/adore_api.pid"
@@ -24,8 +35,7 @@ start_adore_api() {
mkdir -p "${LOG_DIRECTORY}"
if pgrep -f "$APP_NAME" > /dev/null; then
- local old_pid
- old_pid=$(cat "$PID_FILE" 2>/dev/null || echo "unknown")
+ local old_pid; old_pid=$(pgrep -f "$APP_NAME" | head -1)
echo "ADORe API is running (PID: $old_pid), access at: http://localhost:$APP_PORT"
return 0
fi
@@ -34,7 +44,7 @@ start_adore_api() {
echo "ADORe API port $APP_PORT is already in use"
return 0
fi
-
+ whoami > adore_api_log.log
if [ -f "$PID_FILE" ]; then
local old_pid
old_pid=$(cat "$PID_FILE")
@@ -47,8 +57,10 @@ start_adore_api() {
fi
echo "Starting ADORe API with log directory: ${LOG_DIRECTORY}..."
- nohup bash -c "cd '${APP_WORKING_DIRECTORY}' && python3 '$APP_NAME' --log-directory='${LOG_DIRECTORY}'" \
- > "$LOG_FILE" 2>&1 &
+ nohup bash -c "python3 '${APP_WORKING_DIRECTORY}/${APP_NAME}' \
+ --log-directory='${LOG_DIRECTORY}' \
+ --workspace-root='${WORKSPACE_ROOT}' \
+ --port='${APP_PORT}'" > "$LOG_FILE" 2>&1 &
local app_pid=$!
echo "$app_pid" > "$PID_FILE"
@@ -57,7 +69,8 @@ start_adore_api() {
if kill -0 "$app_pid" 2>/dev/null; then
echo "ADORe API started successfully (PID: $app_pid), access at: http://localhost:$APP_PORT"
echo " Logs: $LOG_FILE"
- echo " Bag recordings will be stored in: ${LOG_DIRECTORY}/bag_file_recordings/"
+ echo " Bag recordings directory: ${LOG_DIRECTORY}/bag_file_recordings/"
+ echo " Model checking log directory: ${LOG_DIRECTORY}/model_checker/"
else
echo "Failed to start ADORe API, review the API log for more info: ${LOG_FILE}"
rm -f "$PID_FILE"
@@ -96,16 +109,49 @@ status_adore_api() {
echo "Access at: http://localhost:$APP_PORT"
echo "Log directory: ${LOG_DIRECTORY}"
echo "Bag recordings directory: ${LOG_DIRECTORY}/bag_file_recordings/"
+ echo "Model checking log directory: ${LOG_DIRECTORY}/model_checker/"
lsof -i :"$APP_PORT" 2>/dev/null | grep LISTEN || true
+ echo ""
+ workspace_status_adore_api
else
echo "ADORe API is not running"
fi
}
-alias start_adore_api="start_adore_api"
-alias stop_adore_api="stop_adore_api"
-alias restart_adore_api="restart_adore_api"
-alias status_adore_api="status_adore_api"
+workspace_status_adore_api() {
+ local APP_PORT="${ADORE_API_PORT}"
+ local BUILD_DIR="${WORKSPACE_ROOT}/ros2_workspace/build"
+
+ echo "--- Workspace ---"
+ if command -v curl > /dev/null 2>&1; then
+ curl -sf "http://localhost:${APP_PORT}/api/workspace/status" 2>/dev/null \
+ | python3 -c "
+import sys, json
+try:
+ d = json.load(sys.stdin)
+ print(' ready :', d.get('ready'))
+ print(' build_dir :', d.get('build_dir'))
+ print(' build_exists :', d.get('build_dir_exists'))
+ print(' install_exists :', d.get('install_dir_exists'))
+ print(' setup_exists :', d.get('setup_script_exists'))
+ ts = d.get('last_sourced_at')
+ if ts:
+ import datetime
+ print(' last_sourced :', datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
+ if 'error' in d:
+ print(' error :', d['error'])
+except Exception as e:
+ print(' (could not parse workspace status:', e, ')')
+" 2>/dev/null || echo " (API not reachable on port $APP_PORT)"
+ else
+ if [ -d "${BUILD_DIR}" ] && [ -n "$(ls -A "${BUILD_DIR}" 2>/dev/null)" ]; then
+ echo " build directory: present (${BUILD_DIR})"
+ else
+ echo " build directory: EMPTY or missing -- run colcon build inside ros2_workspace"
+ fi
+ fi
+}
+
if [ "$(printf '%s' "$ENABLE_ADORE_API" | tr '[:upper:]' '[:lower:]')" != "false" ]; then
start_adore_api
diff --git a/tools/adore_api/api_reference.md b/tools/adore_api/api_reference.md
index b169999d..afa8ebb6 100644
--- a/tools/adore_api/api_reference.md
+++ b/tools/adore_api/api_reference.md
@@ -744,3 +744,336 @@ Error responses include a descriptive message:
"message": "Error description"
}
```
+
+## Continuous Monitoring API
+
+The continuous monitoring API enables real-time proposition checking against live ROS2 data streams.
+
+### Start Continuous Monitoring
+
+**POST** `/api/model_checker/continuous/start`
+
+Start a continuous monitoring session.
+
+**Request Body:**
+```json
+{
+ "config_file": "config/default.yaml",
+ "vehicle_id": 0
+}
+```
+
+**Response:**
+```json
+{
+ "session_id": "abc123",
+ "status": "running",
+ "message": "Continuous monitoring started"
+}
+```
+
+### Stop Continuous Monitoring
+
+**POST** `/api/model_checker/continuous/stop`
+
+Stop the active continuous monitoring session.
+
+**Response:**
+```json
+{
+ "status": "stopped",
+ "message": "Monitoring stopped"
+}
+```
+
+### Get Continuous Monitoring Status
+
+**GET** `/api/model_checker/continuous/status`
+
+Get the status of the current continuous monitoring session.
+
+**Response:**
+```json
+{
+ "running": true,
+ "session_id": "abc123",
+ "uptime_s": 42.3,
+ "messages_processed": 1200,
+ "active_propositions": 10
+}
+```
+
+### Get Live Violations
+
+**GET** `/api/model_checker/continuous/violations`
+
+Get current violation events from the running monitoring session.
+
+**Response:**
+```json
+{
+ "violations": [
+ {
+ "proposition": "SAFE_DISTANCE",
+ "timestamp": 1642780800.0,
+ "value": 0.42,
+ "threshold": 0.5,
+ "severity": "warning"
+ }
+ ],
+ "count": 1,
+ "session_id": "abc123"
+}
+```
+
+### Get Filtered Violations (excluding disabled propositions)
+
+**GET** `/api/model_checker/continuous/violations/filtered`
+
+Returns violations excluding any propositions disabled via the `/api/model_checker/continuous/disabled` endpoint.
+
+**Response:** Same shape as `/violations`.
+
+### Set Disabled Propositions
+
+**POST** `/api/model_checker/continuous/disabled`
+
+Suppress specific propositions from violation output.
+
+**Request Body:**
+```json
+{
+ "disabled_propositions": ["PROP_NAME_A", "PROP_NAME_B"]
+}
+```
+
+**Response:**
+```json
+{ "ok": true }
+```
+
+### Get Continuous Results
+
+**GET** `/api/model_checker/continuous/results`
+
+Get the aggregated results from the current or most recently completed continuous session.
+
+**Response:**
+```json
+{
+ "results": {
+ "SUMMARY": {
+ "total_propositions": 10,
+ "passed": 8,
+ "failed": 2,
+ "success_rate": 0.8,
+ "overall_result": "FAIL"
+ },
+ "PROP_NAME": {
+ "status": "fail",
+ "description": { "title": "...", "description": "..." },
+ "formula_description": "...",
+ "result": 0.43,
+ "statistics": {
+ "duration_s": 42.3,
+ "messages_processed": 1200,
+ "violation_count": 3,
+ "safety_grade": "C, 3.0"
+ }
+ }
+ }
+}
+```
+
+## Model Checker Configuration API
+
+### List Configs
+
+**GET** `/api/model_checker/configs`
+
+List all available YAML configuration files.
+
+**Response:**
+```json
+{
+ "configs": [
+ { "name": "default.yaml", "size": 2048, "modified": "2025-07-01T12:00:00Z" }
+ ]
+}
+```
+
+### Get Config
+
+**GET** `/api/model_checker/configs/`
+
+Read a specific configuration file.
+
+**Response:**
+```json
+{ "name": "default.yaml", "content": "# yaml content..." }
+```
+
+### Save Config
+
+**POST** `/api/model_checker/configs`
+
+Create or overwrite a configuration file.
+
+**Request Body:**
+```json
+{ "name": "my_config.yaml", "content": "# yaml content..." }
+```
+
+### Delete Config
+
+**DELETE** `/api/model_checker/configs/`
+
+Delete a configuration file.
+
+## Model Checker History API
+
+### List Run History
+
+**GET** `/api/model_checker/history`
+
+List all completed model checking runs.
+
+**Response:**
+```json
+{
+ "runs": [
+ {
+ "run_id": 1,
+ "status": "completed",
+ "overall_result": "PASS",
+ "config_file": "config/default.yaml",
+ "completed_at": "2025-07-01T12:00:00Z"
+ }
+ ]
+}
+```
+
+### Get Run Log
+
+**GET** `/api/model_checker/history//log`
+
+Retrieve the log output for a specific historical run.
+
+**Response:**
+```json
+{ "log": "full log text..." }
+```
+
+## Model Checker Log Stream
+
+### Stream API Logs
+
+**GET** `/api/model_checker/logs/stream`
+
+Server-Sent Events stream of all API log output. Connect with `EventSource`.
+
+**Event format:**
+```json
+{ "text": "log line", "stream": "stdout", "time": "14:30:00" }
+```
+
+## ROS Topics Extended API
+
+### Measure Topic Rate
+
+**POST** `/api/topic/hz`
+
+Run `ros2 topic hz -w 10` for a topic and return the output (waits up to 12 seconds for window of 10 messages).
+
+**Request Body:**
+```json
+{ "topic": "/your/topic" }
+```
+
+**Response:**
+```json
+{ "success": true, "topic": "/your/topic", "output": "average rate: 10.000\n..." }
+```
+
+### Echo One Message
+
+**POST** `/api/topic/echo`
+
+Receive a single message from a topic (`ros2 topic echo --once`) and return it as raw text.
+
+**Request Body:**
+```json
+{ "topic": "/your/topic" }
+```
+
+**Response:**
+```json
+{ "success": true, "topic": "/your/topic", "raw": "header:\n stamp: ..." }
+```
+
+### Stream Topic (SSE)
+
+**GET** `/api/topic/stream?topic=`
+
+Server-Sent Events stream of `ros2 topic echo` output for continuous observation.
+
+**Query Parameters:**
+- `topic`: the ROS 2 topic name (required)
+
+**Event format:**
+```json
+{ "text": "line from ros2 topic echo", "time": "14:30:00" }
+```
+
+## ROS Workspace API
+
+### Workspace Status
+
+**GET** `/api/ros_workspace/status`
+
+Returns the current state of the `ros2_workspace` directory.
+
+**Response:**
+```json
+{
+ "workspace_dir": "/path/to/ros2_workspace",
+ "workspace_exists": true,
+ "makefile_exists": true,
+ "build_dir_exists": true,
+ "install_dir_exists": true,
+ "running": { "clean": false, "build": false }
+}
+```
+
+### Clean Workspace
+
+**POST** `/api/ros_workspace/clean`
+
+Runs `make clean` inside the `ros2_workspace` directory. Output is streamed via `/api/ros_workspace/log/stream`.
+
+**Response:**
+```json
+{ "success": true, "message": "make clean started" }
+```
+
+### Build Workspace
+
+**POST** `/api/ros_workspace/build`
+
+Runs `make build` inside the `ros2_workspace` directory. Output is streamed via `/api/ros_workspace/log/stream`.
+
+**Response:**
+```json
+{ "success": true, "message": "make build started" }
+```
+
+### Workspace Build Log Stream (SSE)
+
+**GET** `/api/ros_workspace/log/stream`
+
+Server-Sent Events stream of stdout/stderr from `make clean` or `make build` invocations.
+
+**Event format:**
+```json
+{ "text": "log line", "stream": "stdout", "time": "14:30:00" }
+```
diff --git a/tools/adore_api/static/bag_recording.js b/tools/adore_api/static/bag_recording.js
new file mode 100644
index 00000000..45eb89e3
--- /dev/null
+++ b/tools/adore_api/static/bag_recording.js
@@ -0,0 +1,154 @@
+// ── Bag File Recording ────────────────────────────────────────────────────────
+(function () {
+ 'use strict';
+
+ let _bagStatus = 'idle';
+ let _statusInterval = null;
+
+ async function loadTopics() {
+ try {
+ const r = await fetch('/api/topic/list');
+ const d = await r.json();
+ const topics = d.system_topics || [];
+ const container = document.getElementById('topicsContainer');
+ if (!container) return;
+
+ if (topics.length === 0) {
+ container.innerHTML = 'No topics available
';
+ return;
+ }
+ container.innerHTML = topics.map(t => `
+
+ ${t}
+
+ `).join('');
+ } catch (e) { console.error('loadTopics:', e); }
+ }
+
+ function getSelectedTopics() {
+ if (document.getElementById('recordAllTopics')?.checked) return [];
+ return Array.from(
+ document.querySelectorAll('#topicsContainer input[type="checkbox"]:checked')
+ ).map(cb => cb.value);
+ }
+
+ async function startRecording() {
+ const duration = parseInt(document.getElementById('bagDuration')?.value) || null;
+ const topics = getSelectedTopics();
+ try {
+ const r = await fetch('/api/bag/start', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ duration: duration || undefined, topics })
+ });
+ const result = await r.json();
+ if (!result.success) alert('Failed to start recording: ' + result.message);
+ } catch (e) { alert('Failed to start recording'); }
+ }
+
+ async function stopRecording() {
+ try {
+ const r = await fetch('/api/bag/stop', { method: 'POST' });
+ const result = await r.json();
+ if (result.success) {
+ alert(`Recording saved: ${result.relative_path}`);
+ refreshBagList();
+ } else {
+ alert('Failed to stop recording: ' + result.message);
+ }
+ } catch (e) { alert('Failed to stop recording'); }
+ }
+
+ async function updateBagStatus() {
+ try {
+ const r = await fetch('/api/bag/status');
+ const s = await r.json();
+ _bagStatus = s.status || 'idle';
+
+ const ind = document.getElementById('bagStatusIndicator');
+ const txt = document.getElementById('bagStatusText');
+ if (ind) ind.className = `status-indicator status-${_bagStatus}`;
+ if (txt) {
+ let label = _bagStatus.toUpperCase();
+ if (s.bag_name) label += ` — ${s.bag_name}`;
+ if (s.runtime) label += ` (${Math.round(s.runtime)}s)`;
+ txt.textContent = label;
+ }
+
+ const startBtn = document.getElementById('startBagBtn');
+ const stopBtn = document.getElementById('stopBagBtn');
+ const isRec = _bagStatus === 'recording';
+ if (startBtn) startBtn.disabled = isRec;
+ if (stopBtn) stopBtn.disabled = !isRec;
+ } catch (e) { /* network */ }
+ }
+
+ let _lastBagLog = '';
+
+ async function updateBagLog() {
+ try {
+ const r = await fetch('/api/bag/output?lines=80');
+ const d = await r.json();
+ const el = document.getElementById('bagLogContainer');
+ if (!el) return;
+ const text = d.output || '';
+ if (text === _lastBagLog) return;
+ _lastBagLog = text;
+ const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40;
+ el.textContent = text;
+ if (atBottom) el.scrollTop = el.scrollHeight;
+ } catch (e) { /* network */ }
+ }
+
+ async function refreshBagList() {
+ try {
+ const r = await fetch('/api/bag/list');
+ const d = await r.json();
+ const el = document.getElementById('bagRecordingsList');
+ if (!el) return;
+
+ if (!d.success || d.bags.length === 0) {
+ el.innerHTML = 'No recordings found
';
+ return;
+ }
+ el.innerHTML = d.bags.map(b => `
+
+ ${b.name}
+ ${b.created} · ${b.size_mb.toFixed(2)} MB
+ ${b.relative_path}
+
+ `).join('');
+ } catch (e) { console.error('refreshBagList:', e); }
+ }
+
+ function init() {
+ document.getElementById('recordAllTopics')?.addEventListener('change', e => {
+ const sel = document.getElementById('topicsSelectionContainer');
+ if (sel) sel.style.display = e.target.checked ? 'none' : 'block';
+ });
+ document.getElementById('refreshTopicsBtn')?.addEventListener('click', loadTopics);
+ document.getElementById('startBagBtn')?.addEventListener('click', startRecording);
+ document.getElementById('stopBagBtn')?.addEventListener('click', stopRecording);
+ document.getElementById('refreshBagListBtn')?.addEventListener('click', refreshBagList);
+
+ window.addEventListener('tabchange', e => {
+ if (e.detail.tab === 'bag-recording') {
+ loadTopics();
+ refreshBagList();
+ if (!_statusInterval) {
+ updateBagStatus();
+ updateBagLog();
+ _statusInterval = setInterval(() => { updateBagStatus(); updateBagLog(); }, 2000);
+ }
+ } else {
+ if (_statusInterval) { clearInterval(_statusInterval); _statusInterval = null; }
+ }
+ });
+
+ // Always poll status (needed for button states even when tab is inactive)
+ updateBagStatus();
+ setInterval(updateBagStatus, 3000);
+ }
+
+ window.addEventListener('DOMContentLoaded', init);
+})();
diff --git a/tools/adore_api/static/fuzzy.js b/tools/adore_api/static/fuzzy.js
new file mode 100644
index 00000000..fe89c6bf
--- /dev/null
+++ b/tools/adore_api/static/fuzzy.js
@@ -0,0 +1,146 @@
+// ── Fuzzy scenario finder ─────────────────────────────────────────────────────
+(function () {
+ 'use strict';
+
+ let _scenarios = [];
+ let _selected = '';
+
+ function fuzzyScore(query, str) {
+ if (!query) return 1;
+ const q = query.toLowerCase();
+ const s = str.toLowerCase();
+
+ // Exact substring match gets highest priority
+ if (s.includes(q)) return 1000 - s.indexOf(q);
+
+ // Character-order match (fuzzy)
+ let qi = 0;
+ let score = 0;
+ let consecutive = 0;
+ for (let si = 0; si < s.length && qi < q.length; si++) {
+ if (s[si] === q[qi]) {
+ score += 1 + consecutive * 2;
+ consecutive++;
+ qi++;
+ } else {
+ consecutive = 0;
+ }
+ }
+ return qi === q.length ? score : -1;
+ }
+
+ function highlightMatch(query, str) {
+ if (!query) return escapeHtml(str);
+ const q = query.toLowerCase();
+ const s = str.toLowerCase();
+
+ // Try substring highlight first
+ const idx = s.indexOf(q);
+ if (idx >= 0) {
+ return escapeHtml(str.slice(0, idx))
+ + '' + escapeHtml(str.slice(idx, idx + q.length)) + ' '
+ + escapeHtml(str.slice(idx + q.length));
+ }
+
+ // Fuzzy character highlight
+ let result = '';
+ let qi = 0;
+ for (let si = 0; si < str.length; si++) {
+ if (qi < q.length && s[si] === q[qi]) {
+ result += '' + escapeHtml(str[si]) + ' ';
+ qi++;
+ } else {
+ result += escapeHtml(str[si]);
+ }
+ }
+ return result;
+ }
+
+ function escapeHtml(s) {
+ return s.replace(/&/g, '&').replace(//g, '>');
+ }
+
+ function renderList(query) {
+ const list = document.getElementById('fuzzyList');
+ if (!list) return;
+
+ const scored = _scenarios
+ .map(s => ({ s, score: fuzzyScore(query, s) }))
+ .filter(x => x.score > 0)
+ .sort((a, b) => b.score - a.score);
+
+ if (scored.length === 0) {
+ list.innerHTML = 'No scenarios match
';
+ list.style.display = 'block';
+ return;
+ }
+
+ list.innerHTML = scored.slice(0, 80).map(({ s }) => `
+
+ ${highlightMatch(query, s.split('/').pop())}
+ ${escapeHtml(s.includes('/') ? s.slice(0, s.lastIndexOf('/') + 1) : '')}
+
+ `).join('');
+
+ list.querySelectorAll('.fuzzy-item[data-path]').forEach(el => {
+ el.addEventListener('click', () => selectScenario(el.dataset.path));
+ });
+
+ list.style.display = 'block';
+ }
+
+ function selectScenario(path) {
+ _selected = path;
+ const input = document.getElementById('scenarioSearchInput');
+ if (input) input.value = path;
+
+ const display = document.getElementById('selectedScenarioName');
+ if (display) display.textContent = path || '— none —';
+
+ const list = document.getElementById('fuzzyList');
+ if (list) list.style.display = 'none';
+
+ window.dispatchEvent(new CustomEvent('scenarioselected', { detail: { path } }));
+ }
+
+ function getSelectedScenario() { return _selected; }
+
+ function setScenarios(scenarios) {
+ _scenarios = scenarios || [];
+ renderList('');
+ }
+
+ function initFuzzyFinder() {
+ const input = document.getElementById('scenarioSearchInput');
+ const clear = document.getElementById('fuzzySearchClear');
+ const list = document.getElementById('fuzzyList');
+ if (!input || !list) return;
+
+ input.addEventListener('input', () => renderList(input.value.trim()));
+ input.addEventListener('focus', () => {
+ renderList(input.value.trim());
+ list.style.display = 'block';
+ });
+ input.addEventListener('keydown', e => {
+ if (e.key === 'Escape') { list.style.display = 'none'; input.blur(); }
+ });
+
+ if (clear) {
+ clear.addEventListener('click', () => {
+ input.value = '';
+ renderList('');
+ input.focus();
+ });
+ }
+
+ document.addEventListener('click', e => {
+ if (!e.target.closest('#fuzzyFinder')) {
+ if (list) list.style.display = 'none';
+ }
+ });
+ }
+
+ window.FuzzyFinder = { init: initFuzzyFinder, setScenarios, getSelectedScenario, selectScenario };
+ window.addEventListener('DOMContentLoaded', initFuzzyFinder);
+})();
diff --git a/tools/adore_api/static/hardware_monitor_panel.js b/tools/adore_api/static/hardware_monitor_panel.js
new file mode 100644
index 00000000..784c055a
--- /dev/null
+++ b/tools/adore_api/static/hardware_monitor_panel.js
@@ -0,0 +1,750 @@
+// ── Hardware Monitor Panel ────────────────────────────────────────────────────
+// Self-contained cluster-aware component. Mount into #hardware-monitor.
+// All CSS scoped under #hmp-root. All IDs prefixed hmp-.
+
+(function () {
+ 'use strict';
+
+ // ── Styles ────────────────────────────────────────────────────────────────
+ function injectStyles() {
+ if (document.getElementById('hmp-styles')) return;
+ const s = document.createElement('style');
+ s.id = 'hmp-styles';
+ s.textContent = `
+#hmp-root {
+ display: flex; height: 100%; min-height: 0; overflow: hidden;
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ font-size: 13px; color: #e1e4e8; background: #0f1117;
+}
+/* ── Left nav ──────────────────────────────────── */
+#hmp-nav {
+ width: 164px; min-width: 164px; flex-shrink: 0;
+ background: #0d1117; border-right: 1px solid #30363d;
+ display: flex; flex-direction: column; overflow: hidden;
+}
+#hmp-host-section {
+ border-bottom: 1px solid #30363d; padding: 8px 0 4px;
+ flex-shrink: 0;
+}
+.hmp-nav-section {
+ font-size: 10px; font-weight: 600; color: #484f58;
+ text-transform: uppercase; letter-spacing: 0.6px;
+ padding: 6px 14px 3px; user-select: none;
+}
+.hmp-host-btn {
+ display: flex; align-items: center; gap: 7px;
+ width: 100%; background: none; border: none;
+ border-left: 2px solid transparent;
+ padding: 7px 12px; font-size: 12px; font-weight: 500;
+ color: #8b949e; cursor: pointer; text-align: left;
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
+ transition: color .15s, background .15s, border-color .15s;
+}
+.hmp-host-btn:hover { color: #c9d1d9; background: #161b22; border-left-color: #30363d; }
+.hmp-host-btn.active { color: #58a6ff; background: #161b22; border-left-color: #58a6ff; }
+#hmp-view-section { flex: 1; overflow-y: auto; padding: 6px 0; }
+.hmp-nav-sep { height: 1px; background: #21262d; margin: 4px 10px; }
+.hmp-nav-btn {
+ display: block; width: 100%; background: none; border: none;
+ border-left: 2px solid transparent; color: #8b949e;
+ text-align: left; padding: 7px 12px; font-size: 12px; font-weight: 500;
+ cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
+ transition: color .15s, background .15s, border-color .15s;
+}
+.hmp-nav-btn:hover { color: #c9d1d9; background: #161b22; border-left-color: #30363d; }
+.hmp-nav-btn.active { color: #58a6ff; background: #161b22; border-left-color: #58a6ff; }
+/* ── Body ──────────────────────────────────────── */
+#hmp-body {
+ flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden;
+}
+#hmp-topbar {
+ display: flex; align-items: center; justify-content: space-between;
+ padding: 7px 14px; background: #161b22; border-bottom: 1px solid #30363d;
+ flex-shrink: 0; gap: 10px;
+}
+#hmp-topbar-title { font-size: 11px; font-weight: 600; color: #6e7681;
+ text-transform: uppercase; letter-spacing: 0.5px; }
+#hmp-topbar-right { display: flex; align-items: center; gap: 10px; font-size: 11px; color: #6e7681; }
+.hmp-view { display: none; flex: 1; overflow-y: auto; padding: 14px;
+ flex-direction: column; gap: 14px; }
+.hmp-view.active { display: flex; }
+/* ── Dot ───────────────────────────────────────── */
+.hmp-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%;
+ background: #6e7681; flex-shrink: 0; }
+.hmp-dot.ok { background: #2ea043; box-shadow: 0 0 5px #2ea04388; }
+.hmp-dot.warn { background: #d29922; box-shadow: 0 0 5px #d2992288;
+ animation: hmp-pulse 1.5s infinite; }
+.hmp-dot.error { background: #f85149; box-shadow: 0 0 5px #f8514988;
+ animation: hmp-pulse .8s infinite; }
+.hmp-dot.idle { background: #6e7681; }
+.hmp-dot.connecting { background: #58a6ff; animation: hmp-pulse 1s infinite; }
+@keyframes hmp-pulse { 0%,100%{opacity:1} 50%{opacity:.35} }
+/* ── Cards ─────────────────────────────────────── */
+.hmp-card { background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 14px; }
+.hmp-card-head { display: flex; align-items: center; justify-content: space-between;
+ margin-bottom: 12px; }
+.hmp-card-title { font-size: 11px; font-weight: 600; color: #6e7681;
+ text-transform: uppercase; letter-spacing: 0.5px; }
+.hmp-badge { font-size: 10px; padding: 2px 7px; border-radius: 10px;
+ background: #21262d; color: #8b949e; border: 1px solid #30363d; white-space: nowrap; }
+.hmp-badge.ok { background: #0d2b12; color: #3fb950; border-color: #2ea04340; }
+.hmp-badge.warn { background: #2b1e00; color: #d29922; border-color: #d2992240; }
+.hmp-badge.error { background: #2b0a0a; color: #f85149; border-color: #f8514940; }
+/* ── Grids ─────────────────────────────────────── */
+.hmp-g2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
+.hmp-g3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 14px; }
+.hmp-tiles { display: grid; grid-template-columns: repeat(auto-fill,minmax(145px,1fr)); gap: 10px; }
+@media (max-width:900px) { .hmp-g2,.hmp-g3 { grid-template-columns: 1fr; } }
+/* ── Cluster overview ──────────────────────────── */
+.hmp-cluster-grid {
+ display: grid; grid-template-columns: repeat(auto-fill,minmax(260px,1fr)); gap: 12px;
+}
+.hmp-host-card {
+ background: #161b22; border: 1px solid #30363d; border-radius: 8px;
+ padding: 12px 14px; cursor: pointer; transition: border-color .15s;
+}
+.hmp-host-card:hover { border-color: #58a6ff; }
+.hmp-host-card-head { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
+.hmp-host-card-name { font-size: 13px; font-weight: 600; color: #c9d1d9; }
+.hmp-host-mini-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
+.hmp-mini-stat { background: #0d1117; border-radius: 4px; padding: 6px 8px; }
+.hmp-mini-label { font-size: 10px; color: #6e7681; text-transform: uppercase; letter-spacing: 0.3px; }
+.hmp-mini-val { font-size: 14px; font-weight: 700; color: #e1e4e8; }
+.hmp-mini-val.ok { color: #3fb950; }
+.hmp-mini-val.warn { color: #d29922; }
+.hmp-mini-val.error { color: #f85149; }
+/* ── Metric tile ───────────────────────────────── */
+.hmp-tile { background: #0d1117; border: 1px solid #21262d; border-radius: 6px;
+ padding: 12px 14px; }
+.hmp-tile.warn { border-color: #d29922; }
+.hmp-tile.error { border-color: #f85149; }
+.hmp-tile-lbl { font-size: 10px; color: #6e7681; text-transform: uppercase;
+ letter-spacing: 0.4px; margin-bottom: 4px; }
+.hmp-tile-val { font-size: 20px; font-weight: 700; color: #e1e4e8; line-height: 1.2; }
+.hmp-tile-val.ok { color: #3fb950; }
+.hmp-tile-val.warn { color: #d29922; }
+.hmp-tile-val.error { color: #f85149; }
+.hmp-tile-sub { font-size: 11px; color: #8b949e; margin-top: 3px; }
+/* ── Progress ──────────────────────────────────── */
+.hmp-pr { display: flex; align-items: center; gap: 8px; margin-bottom: 7px; }
+.hmp-pr-lbl { font-size: 11px; color: #8b949e; min-width: 72px; }
+.hmp-pr-wrap { flex: 1; background: #21262d; border-radius: 3px; height: 7px; overflow: hidden; }
+.hmp-pr-bar { height: 100%; border-radius: 3px; transition: width .4s ease; }
+.hmp-pr-bar.ok { background: #2ea043; }
+.hmp-pr-bar.warn { background: #d29922; }
+.hmp-pr-bar.error { background: #f85149; }
+.hmp-pr-pct { font-size: 11px; min-width: 36px; text-align: right; color: #c9d1d9; }
+.hmp-pr-pct.ok { color: #3fb950; }
+.hmp-pr-pct.warn { color: #d29922; }
+.hmp-pr-pct.error { color: #f85149; }
+/* ── KV / Table ────────────────────────────────── */
+.hmp-kv { width: 100%; border-collapse: collapse; font-size: 12px; }
+.hmp-kv td { padding: 5px 8px; border-bottom: 1px solid #1c2128; color: #c9d1d9; }
+.hmp-kv td:first-child { color: #6e7681; width: 46%; }
+.hmp-kv tr:last-child td { border-bottom: none; }
+.hmp-tbl { width: 100%; border-collapse: collapse; font-size: 11px; }
+.hmp-tbl th { text-align: left; color: #6e7681; font-size: 10px; font-weight: 600;
+ text-transform: uppercase; letter-spacing: 0.4px;
+ padding: 5px 8px; border-bottom: 1px solid #21262d; }
+.hmp-tbl td { padding: 6px 8px; border-bottom: 1px solid #161b22; color: #c9d1d9; }
+.hmp-tbl tr:last-child td { border-bottom: none; }
+.hmp-tbl tr:hover td { background: #1c2128; }
+/* ── Tags ──────────────────────────────────────── */
+.hmp-tag { display: inline-block; font-size: 10px; padding: 1px 6px; border-radius: 10px;
+ font-weight: 600; text-transform: uppercase; letter-spacing: 0.3px; white-space: nowrap; }
+.hmp-tag-blue { background: #1f3a5f; color: #58a6ff; }
+.hmp-tag-green { background: #1a3a1f; color: #3fb950; }
+.hmp-tag-yellow { background: #3a2e0a; color: #d29922; }
+.hmp-tag-red { background: #3a1212; color: #f85149; }
+.hmp-tag-gray { background: #21262d; color: #8b949e; }
+.hmp-tag-purple { background: #2a1f3a; color: #a371f7; }
+/* ── Core grid ─────────────────────────────────── */
+.hmp-cores { display: grid; grid-template-columns: repeat(auto-fill,minmax(50px,1fr)); gap: 5px; }
+.hmp-core { background: #0d1117; border: 1px solid #21262d; border-radius: 4px;
+ padding: 5px 4px; text-align: center; }
+.hmp-core-id { font-size: 10px; color: #6e7681; }
+.hmp-core-pct { font-size: 13px; font-weight: 700; }
+/* ── Iface / Device ────────────────────────────── */
+.hmp-iface { background: #0d1117; border: 1px solid #21262d; border-radius: 6px;
+ padding: 11px 13px; margin-bottom: 8px; }
+.hmp-iface-head { display: flex; align-items: center; gap: 7px; margin-bottom: 8px; }
+.hmp-iface-name { font-size: 13px; font-weight: 600; color: #c9d1d9; }
+.hmp-addr { font-size: 11px; color: #8b949e; font-family: monospace; margin-bottom: 2px; }
+.hmp-dev { display: flex; align-items: flex-start; gap: 9px; background: #0d1117;
+ border: 1px solid #21262d; border-radius: 6px; padding: 9px 11px; margin-bottom: 6px; }
+.hmp-dev-icon { font-size: 15px; flex-shrink: 0; margin-top: 1px; }
+.hmp-dev-name { font-size: 12px; font-weight: 600; color: #c9d1d9;
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
+.hmp-dev-detail { font-size: 11px; color: #8b949e; margin-top: 2px; }
+.hmp-dev-tags { margin-top: 4px; display: flex; gap: 4px; flex-wrap: wrap; }
+/* ── Flags / Temps ─────────────────────────────── */
+.hmp-flags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
+.hmp-flag { font-size: 10px; padding: 1px 6px; border-radius: 3px;
+ background: #1f3a5f; color: #58a6ff; font-family: monospace; }
+.hmp-temps { display: grid; grid-template-columns: repeat(auto-fill,minmax(130px,1fr)); gap: 8px; }
+.hmp-temp { background: #0d1117; border: 1px solid #21262d; border-radius: 6px; padding: 10px 12px; }
+.hmp-temp-name { font-size: 11px; color: #8b949e; margin-bottom: 4px;
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
+.hmp-temp-val { font-size: 20px; font-weight: 700; }
+/* ── JSON / Empty ──────────────────────────────── */
+.hmp-json { background: #0d1117; border: 1px solid #21262d; border-radius: 6px;
+ padding: 11px; font-family: monospace; font-size: 11px; color: #8b949e;
+ white-space: pre-wrap; overflow-x: auto; max-height: 500px; overflow-y: auto; }
+.hmp-empty { text-align: center; padding: 28px; color: #6e7681; font-size: 12px; }
+.hmp-empty-icon { font-size: 28px; margin-bottom: 6px; }
+`;
+ document.head.appendChild(s);
+ }
+
+ // ── Skeleton HTML ─────────────────────────────────────────────────────────
+ function buildSkeleton(container) {
+ container.innerHTML = `
+
+
+
+
+
View
+
Cluster Overview
+
+
Overview
+
CPU
+
Memory
+
Network
+
Storage
+
GPU / NPU
+
Temperatures
+
+
System Info
+
PCI Devices
+
USB Devices
+
Serial / UART
+
Block Devices
+
Sensors
+
+
Raw JSON
+
+
+
+
+
+
Hardware Monitor
+
+
+ Waiting for hosts…
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
`;
+ }
+
+ // ── State ─────────────────────────────────────────────────────────────────
+ let _activeHost = null;
+ // {host: {status: obj|null, status_ts: str, inventory: obj|null, inventory_ts: str}}
+ const _data = {};
+
+ // ── Helpers ───────────────────────────────────────────────────────────────
+ const X = s => String(s ?? '').replace(/&/g,'&').replace(//g,'>');
+ function pctCls(p,w=85,e=95){ return p>=e?'error':p>=w?'warn':'ok'; }
+ function levelCls(s){ s=String(s||'').toLowerCase(); return s==='ok'?'ok':s==='warn'||s==='warning'?'warn':s==='error'||s==='critical'?'error':''; }
+ function prog(label,pct,sub=''){
+ const c=pctCls(pct);
+ return `${X(label)} ${pct.toFixed(1)}% ${sub?`${X(sub)}
`:''}`;
+ }
+ function kv(rows){ return `${rows.map(([k,v])=>`${X(k)} ${X(v)} `).join('')}
`; }
+ function tag(t,s='blue'){ return `${X(t)} `; }
+ function empty(icon,msg){ return ``; }
+
+ // ── Nav ───────────────────────────────────────────────────────────────────
+ function showView(viewId) {
+ document.querySelectorAll('#hmp-root .hmp-view').forEach(v => v.classList.remove('active'));
+ document.querySelectorAll('#hmp-root .hmp-nav-btn').forEach(b => b.classList.remove('active'));
+ document.getElementById(viewId)?.classList.add('active');
+ document.querySelector(`.hmp-nav-btn[data-view="${viewId}"]`)?.classList.add('active');
+ }
+
+ function bindNav() {
+ document.querySelectorAll('#hmp-root .hmp-nav-btn[data-view]').forEach(btn => {
+ btn.addEventListener('click', () => {
+ const needsHost = btn.classList.contains('hmp-host-required');
+ if (needsHost && !_activeHost) return;
+ showView(btn.dataset.view);
+ if (_activeHost) refreshHostViews();
+ });
+ });
+ }
+
+ // ── Host list in nav ──────────────────────────────────────────────────────
+ function refreshHostNav() {
+ const el = document.getElementById('hmp-host-list');
+ if (!el) return;
+ const hosts = Object.keys(_data).sort();
+ if (hosts.length === 0) {
+ el.innerHTML = `No hosts yet
`;
+ return;
+ }
+ el.innerHTML = hosts.map(h => {
+ const entry = _data[h];
+ const status = entry.status?.status || 'idle';
+ const cls = levelCls(status);
+ const active = h === _activeHost ? ' active' : '';
+ return `
+
+ ${X(h)}
+ `;
+ }).join('');
+ el.querySelectorAll('.hmp-host-btn').forEach(btn => {
+ btn.addEventListener('click', () => selectHost(btn.dataset.host));
+ });
+ }
+
+ function selectHost(host) {
+ _activeHost = host;
+ refreshHostNav();
+ // Update topbar
+ const entry = _data[host] || {};
+ const s = entry.status;
+ const dot = document.getElementById('hmp-dot');
+ const txt = document.getElementById('hmp-status-txt');
+ const ts = document.getElementById('hmp-ts');
+ if (dot) dot.className = `hmp-dot ${levelCls(s?.status)||'idle'}`;
+ if (txt) txt.textContent = `${host} — ${(s?.status||'—').toUpperCase()}`;
+ if (ts && entry.status_ts) ts.textContent = entry.status_ts.slice(11,19)+' UTC';
+ // Switch to overview if currently on cluster view
+ const activeView = document.querySelector('#hmp-root .hmp-view.active');
+ if (!activeView || activeView.id === 'hmp-v-cluster') showView('hmp-v-overview');
+ refreshHostViews();
+ }
+
+ // ── Cluster overview ──────────────────────────────────────────────────────
+ function renderClusterOverview() {
+ const el = document.getElementById('hmp-cluster-grid');
+ if (!el) return;
+ const hosts = Object.keys(_data).sort();
+ if (hosts.length === 0) {
+ el.innerHTML = empty('🖥', 'No cluster hosts detected yet.\nWaiting for hardware_monitor nodes to publish…');
+ return;
+ }
+ el.innerHTML = hosts.map(h => {
+ const s = _data[h].status || {};
+ const cpu = s.cpu || {};
+ const ram = s.ram || {};
+ const net = s.network || {};
+ const overallCls = levelCls(s.status);
+ const ifaceCount = Object.keys(net.interfaces || {}).length;
+ const firstIface = Object.values(net.interfaces || {})[0];
+ const firstIp = firstIface?.ipv4?.[0] || '—';
+ return `
+
+
+ ${X(h)}
+ ${tag((s.status||'—').toUpperCase(), overallCls||'gray')}
+
+
+
+
CPU
+
${(cpu.overall_percent??0).toFixed(0)}%
+
+
+
RAM
+
${(ram.used_percent??0).toFixed(0)}%
+
+
+
Load
+
${(cpu.load_avg?.['1m']??0).toFixed(2)}
+
+
+
+
`;
+ }).join('');
+ el.querySelectorAll('.hmp-host-card').forEach(c => {
+ c.addEventListener('click', () => selectHost(c.dataset.host));
+ });
+ }
+
+ // ── Per-host status views ─────────────────────────────────────────────────
+ function refreshHostViews() {
+ if (!_activeHost) return;
+ const entry = _data[_activeHost] || {};
+ const s = entry.status;
+ const inv = entry.inventory;
+ if (s) {
+ renderOverview(s);
+ renderCpuView(s.cpu);
+ renderMemoryView(s.ram);
+ renderNetworkView(s.network);
+ renderStorageView(s.disk);
+ renderGpuView(s.gpu);
+ renderTempsView(s.temperatures);
+ document.getElementById('hmp-raw-status').textContent = JSON.stringify(s, null, 2);
+ }
+ if (inv) {
+ renderInventory(inv);
+ document.getElementById('hmp-raw-inv').textContent = JSON.stringify(inv, null, 2);
+ }
+ }
+
+ function renderOverview(s) {
+ const cpu=s.cpu||{}, ram=s.ram||{}, net=s.network||{}, ntp=s.ntp||{}, proc=s.processes||{};
+ document.getElementById('hmp-ov-tiles').innerHTML = [
+ {l:'Hostname', v:X(s.hostname||'—'), sub:'', c:''},
+ {l:'CPU', v:`${(cpu.overall_percent??0).toFixed(1)}%`, sub:`load ${(cpu.load_avg?.['1m']??0).toFixed(2)}`, c:pctCls(cpu.overall_percent??0)},
+ {l:'RAM', v:`${(ram.used_percent??0).toFixed(1)}%`, sub:`${ram.used_mb??0}/${ram.total_mb??0} MB`, c:pctCls(ram.used_percent??0)},
+ {l:'Processes', v:proc.total??'—', sub:`${proc.running??0} running`, c:(proc.zombie??0)>5?'warn':''},
+ {l:'NTP', v:ntp.synchronized===false?'UNSYNC':ntp.synchronized===true?'SYNC':'—', sub:ntp.source||'', c:ntp.synchronized===false?'warn':'ok'},
+ {l:'Status', v:(s.status||'—').toUpperCase(), sub:'', c:levelCls(s.status)},
+ ].map(t=>`${t.l}
${t.v}
${t.sub?`
${t.sub}
`:''}
`).join('');
+
+ const pct=cpu.overall_percent??0;
+ document.getElementById('hmp-cpu-badge').textContent=`${pct.toFixed(1)}%`;
+ document.getElementById('hmp-ov-cpu').innerHTML=
+ prog('Overall',pct)+(cpu.per_core_percent||[]).slice(0,6).map((p,i)=>prog(`Core ${i}`,p)).join('');
+
+ const swap=ram.swap||{};
+ document.getElementById('hmp-ov-ram').innerHTML=
+ prog('Used',ram.used_percent??0,`${ram.used_mb??0}/${ram.total_mb??0} MB`)+
+ (swap.total_mb>0?prog('Swap',swap.used_percent??0,`${swap.used_mb??0}/${swap.total_mb??0} MB`):'');
+
+ document.getElementById('hmp-ov-net').innerHTML=
+ Object.entries(net.interfaces||{}).map(([nm,iface])=>{
+ const up=iface.is_up;
+ return `
+
+ ${X(nm)}
+ ${tag(up?'UP':'DOWN',up?'green':'red')}
+ ${iface.type?tag(iface.type,'blue'):''}
+
+
🌐 ${X((iface.ipv4||[]).join(', ')||'no address')}
+ ${iface.mac?`
⊟ ${X(iface.mac)}
`:''}
+
`;
+ }).join('')||empty('📡','No interfaces');
+
+ document.getElementById('hmp-ov-disk').innerHTML=
+ Object.entries((s.disk||{}).mounts||{}).slice(0,6)
+ .map(([mp,m])=>prog(mp,m.used_percent??0,`${m.used_gb}/${m.total_gb} GB · ${m.fstype||''}`))
+ .join('')||empty('💾','No mounts');
+ }
+
+ function renderCpuView(cpu) {
+ if (!cpu) return;
+ document.getElementById('hmp-cpu-summary').innerHTML=kv([
+ ['Overall %',`${(cpu.overall_percent??0).toFixed(1)}%`],
+ ['Frequency', cpu.freq_mhz?`${cpu.freq_mhz} MHz`:'—'],
+ ['Status', (cpu.status||'—').toUpperCase()],
+ ]);
+ const la=cpu.load_avg||{};
+ document.getElementById('hmp-cpu-load').innerHTML=kv([['1 min',la['1m']??'—'],['5 min',la['5m']??'—'],['15 min',la['15m']??'—']]);
+ const cores=cpu.per_core_percent||[];
+ document.getElementById('hmp-core-count').textContent=`${cores.length} cores`;
+ document.getElementById('hmp-cores').innerHTML=
+ cores.map((p,i)=>``).join('')
+ ||empty('⚙','No data');
+ }
+
+ function renderMemoryView(ram) {
+ if (!ram) return;
+ document.getElementById('hmp-ram-detail').innerHTML=
+ prog('Used',ram.used_percent??0)+kv([['Total',`${ram.total_mb??0} MB`],['Used',`${ram.used_mb??0} MB`],['Available',`${ram.available_mb??0} MB`]]);
+ const swap=ram.swap||{};
+ document.getElementById('hmp-swap-detail').innerHTML=
+ (swap.total_mb>0?prog('Used',swap.used_percent??0):'')+kv([['Total',`${swap.total_mb??0} MB`],['Used',`${swap.used_mb??0} MB`]]);
+ }
+
+ function renderNetworkView(net) {
+ if (!net) return;
+ document.getElementById('hmp-net-cards').innerHTML=
+ Object.entries(net.interfaces||{}).map(([nm,iface])=>{
+ const up=iface.is_up, io=iface.io||{};
+ const addrs=[...(iface.ipv4||[]),...(iface.ipv6||[])];
+ return `
+
+
+
+ ${X(nm)}
+ ${tag(up?'UP':'DOWN',up?'green':'red')}
+ ${iface.type?tag(iface.type,'blue'):''}
+
+ ${iface.driver?`
${X(iface.driver)} `:''}
+
+
+
${kv([['MAC',iface.mac||'—'],['MTU',iface.mtu||'—'],['Speed',iface.speed_mbps?`${iface.speed_mbps} Mbps`:'—'],['Duplex',iface.duplex||'—'],['State',iface.operstate||'—']])}
+
${addrs.map(a=>`
${X(a)}
`).join('')||empty('🌐','No addresses')}
+
+ ${Object.keys(io).length?`
${kv([['Sent',`${io.bytes_sent_mb??0} MB`],['Received',`${io.bytes_recv_mb??0} MB`],['Errors',`${io.errors_in??0} in / ${io.errors_out??0} out`],['Drops',`${io.drops_in??0} in / ${io.drops_out??0} out`]])}
`:''}
+
`;
+ }).join('')||empty('📡','No network data');
+ }
+
+ function renderStorageView(disk) {
+ if (!disk) return;
+ document.getElementById('hmp-mounts').innerHTML=
+ `Mount Type Total Used Free % `+
+ Object.entries(disk.mounts||{}).map(([mp,m])=>`${X(mp)} ${tag(m.fstype||'?','gray')} ${m.total_gb} GB ${m.used_gb} GB ${m.free_gb} GB ${(m.used_percent??0).toFixed(1)}% `).join('')+
+ `
`||empty('💾','No mounts');
+ const io=disk.io, ioCard=document.getElementById('hmp-io-card');
+ if (io) { ioCard.style.display=''; document.getElementById('hmp-io-detail').innerHTML=kv([['Total Read',`${io.total_read_mb} MB`],['Total Write',`${io.total_write_mb} MB`],['Read Count',io.read_count],['Write Count',io.write_count]]); }
+ else ioCard.style.display='none';
+ }
+
+ function renderGpuView(gpuList) {
+ const el=document.getElementById('hmp-gpu-cards');
+ if (!gpuList||!gpuList.length){el.innerHTML=empty('🎮','No GPU / NPU detected');return;}
+ el.innerHTML=gpuList.map(gpu=>`
+
+
+
${X(gpu.name||'GPU')} ${tag(gpu.vendor||'?','purple')} ${tag(gpu.type||'GPU','blue')}
+
${(gpu.status||'—').toUpperCase()}
+
+ ${gpu.utilization_percent!==undefined?prog('GPU',gpu.utilization_percent):''}
+ ${gpu.memory_utilization_percent!==undefined?prog('VRAM',gpu.memory_utilization_percent):''}
+ ${kv([...(gpu.temperature_celsius!==undefined?[['Temperature',`${gpu.temperature_celsius} °C`]]:[]),...(gpu.memory_used_mb?[['VRAM Used',`${gpu.memory_used_mb}/${gpu.memory_total_mb} MB`]]:[]),...(gpu.power_draw_w?[['Power',`${gpu.power_draw_w} W`]]:[])],)}
+
`).join('');
+ }
+
+ function renderTempsView(temps) {
+ const el=document.getElementById('hmp-temp-grid');
+ if (!temps||!temps.sensors||!Object.keys(temps.sensors).length){el.innerHTML=empty('🌡','No data');return;}
+ const cells=[];
+ for (const [chip,readings] of Object.entries(temps.sensors)) {
+ if (readings?.celsius!==undefined) {
+ const c=pctCls(readings.celsius,70,85);
+ cells.push(`${X(chip)}
${readings.celsius}°C
`);
+ } else if (typeof readings==='object') {
+ for (const [label,r] of Object.entries(readings)) {
+ if (r?.celsius!==undefined) {
+ const c=pctCls(r.celsius,70,85);
+ cells.push(`${X(chip)}/${X(label)}
${r.celsius}°C
${r.critical?`
crit ${r.critical}°C
`:''}
`);
+ }
+ }
+ }
+ }
+ el.innerHTML=cells.join('')||empty('🌡','No readings');
+ }
+
+ function renderInventory(inv) {
+ if (!inv) return;
+ const sys=inv.system||{}, cpu=inv.cpu||{}, ram=inv.ram||{};
+ document.getElementById('hmp-inv-sys-kv').innerHTML=kv([['Hostname',inv.hostname||'—'],['OS',sys.os||'—'],['Kernel',sys.kernel||'—'],['Architecture',sys.machine||'—']]);
+ document.getElementById('hmp-inv-cpu-kv').innerHTML=
+ kv([['Model',cpu.model||'—'],['Architecture',cpu.architecture||'—'],['Physical Cores',cpu.physical_cores||'—'],['Logical Cores',cpu.logical_cores||'—'],['Max Freq',cpu.base_frequency_mhz?`${cpu.base_frequency_mhz} MHz`:'—'],['L1d Cache',cpu.cache?.l1d_kb?`${cpu.cache.l1d_kb} KB`:'—'],['L2 Cache',cpu.cache?.l2_kb?`${cpu.cache.l2_kb} KB`:'—'],['L3 Cache',cpu.cache?.l3_kb?`${cpu.cache.l3_kb} KB`:'—']])+
+ (cpu.flags?.length?`${cpu.flags.map(f=>`${X(f)} `).join('')}
`:'');
+ document.getElementById('hmp-inv-ram-kv').innerHTML=
+ kv([['Total',`${ram.total_mb||0} MB`],['NUMA Nodes',(ram.numa_nodes||[]).length]])+
+ (ram.numa_nodes||[]).map(n=>`Node ${n.node}: ${n.total_mb} MB · CPUs ${n.cpus}
`).join('');
+ const pci=inv.pci||[];
+ document.getElementById('hmp-pci-tbl').innerHTML=pci.length
+ ?`Slot Class IDs Driver ${pci.map(d=>`${X(d.slot)} ${tag(d.subclass_label||d.class_label||'?','gray')} ${X(d.vendor_id)}:${X(d.device_id)} ${d.driver?tag(d.driver,'blue'):''} `).join('')}
`
+ :empty('🔌','No PCI devices');
+ const usb=inv.usb||[];
+ document.getElementById('hmp-usb-list').innerHTML=usb.length
+ ?usb.map(d=>`🔌
${X(d.product||d.id||'USB Device')}
${X(d.manufacturer||'')} · ${X(d.id)} · USB ${X(d.usb_version||'?')} · ${X(d.speed_mbps||'?')} Mbps
${tag(d.class_label||'?','gray')}${(d.drivers||[]).map(dr=>tag(dr,'blue')).join('')}${d.serial?`${X(d.serial)} `:''}
`).join('')
+ :empty('🔌','No USB devices');
+ const serial=inv.serial||[];
+ document.getElementById('hmp-serial-list').innerHTML=serial.length
+ ?serial.map(d=>`📡
${X(d.device)}
${X(d.type)} · driver: ${X(d.driver||'—')}
${d.uart_type?`
UART ${X(d.uart_type)} · 0x${X(d.port_address||'?')} · IRQ ${X(d.irq||'?')}
`:''}${d.usb_manufacturer?`
USB: ${X(d.usb_manufacturer)} ${X(d.usb_product||'')}
`:''}${d.is_console?tag('console','yellow'):''}
`).join('')
+ :empty('📡','No serial ports');
+ const stor=inv.storage||[];
+ document.getElementById('hmp-blk-list').innerHTML=stor.length
+ ?stor.map(d=>`💾
${X(d.device)} ${X(d.size)}
${X(d.model||'—')} · ${X(d.vendor||'—')}
${tag(d.type,'blue')} ${d.transport?tag(d.transport,'gray'):''}${d.serial?`${X(d.serial)} `:''}
${d.partitions} partition(s) · ${d.logical_sector_bytes||512}B sectors
`).join('')
+ :empty('💾','No block devices');
+ const sensors=inv.sensors||[];
+ document.getElementById('hmp-sensor-list').innerHTML=sensors.length
+ ?sensors.map(d=>`📷
${X(d.name)}
${tag(d.type,'blue')} ${tag(d.interface,'gray')}
${d.device?`
${X(d.device)}
`:''}
`).join('')
+ :empty('📷','No sensors');
+ const audio=inv.audio||[], inputs=inv.input||[];
+ document.getElementById('hmp-input-list').innerHTML=[
+ ...audio.map(d=>`🔊
${X(d.name||d.description)}
${X(d.description||'')} · card ${d.card_index}
`),
+ ...inputs.map(d=>`⌨
${X(d.name)}
${tag(d.type,'gray')}
${d.phys?`
${X(d.phys)}
`:''}
`),
+ ].join('')||empty('⌨','No input/audio');
+ }
+
+ // ── Data fetching ─────────────────────────────────────────────────────────
+ let _sse = null;
+
+ function connectSSE() {
+ if (_sse) { _sse.close(); _sse = null; }
+ _sse = new EventSource('/api/hardware/stream');
+ _sse.onmessage = e => {
+ try {
+ const p = JSON.parse(e.data);
+ const host = p.host;
+ if (!host) return;
+ if (!_data[host]) _data[host] = {status:null,status_ts:null,inventory:null,inventory_ts:null};
+ _data[host].status = p.data;
+ _data[host].status_ts = p.received_at;
+ refreshHostNav();
+ renderClusterOverview();
+ if (_activeHost === host) {
+ // Update topbar
+ const dot=document.getElementById('hmp-dot');
+ const txt=document.getElementById('hmp-status-txt');
+ const ts =document.getElementById('hmp-ts');
+ if(dot) dot.className=`hmp-dot ${levelCls(p.data?.status)||'idle'}`;
+ if(txt) txt.textContent=`${host} — ${(p.data?.status||'—').toUpperCase()}`;
+ if(ts && p.received_at) ts.textContent=p.received_at.slice(11,19)+' UTC';
+ refreshHostViews();
+ }
+ } catch (_) {}
+ };
+ _sse.onerror = () => {
+ document.getElementById('hmp-dot')?.setAttribute('class','hmp-dot idle');
+ document.getElementById('hmp-status-txt').textContent = 'Reconnecting…';
+ _sse.close(); _sse = null;
+ setTimeout(connectSSE, 4000);
+ };
+ _sse.onopen = () => {
+ document.getElementById('hmp-status-txt').textContent =
+ _activeHost ? `${_activeHost} — connected` : 'Connected — waiting for hosts…';
+ };
+ }
+
+ async function pollHosts() {
+ try {
+ const r = await fetch('/api/hardware/hosts');
+ if (!r.ok) return;
+ const d = await r.json();
+ for (const [host, meta] of Object.entries(d.hosts || {})) {
+ if (!_data[host]) _data[host] = {status:null,status_ts:null,inventory:null,inventory_ts:null};
+ // Fetch inventory for new hosts or stale ones
+ if (meta.inventory_available && !_data[host].inventory) {
+ fetch(`/api/hardware/hosts/${host}/inventory`)
+ .then(r => r.ok ? r.json() : null)
+ .then(d => {
+ if (d?.available) {
+ _data[host].inventory = d.data;
+ _data[host].inventory_ts = d.received_at;
+ if (_activeHost === host) refreshHostViews();
+ }
+ }).catch(() => {});
+ }
+ }
+ refreshHostNav();
+ renderClusterOverview();
+ } catch (_) {}
+ }
+
+ // ── Public API ────────────────────────────────────────────────────────────
+ function init() {
+ const container = document.getElementById('hardware-monitor');
+ if (!container || document.getElementById('hmp-root')) return;
+ injectStyles();
+ buildSkeleton(container);
+ bindNav();
+ connectSSE();
+ pollHosts();
+ setInterval(pollHosts, 10000);
+ }
+
+ window.HardwareMonitorPanel = { init };
+
+ window.addEventListener('tabchange', e => {
+ if (e.detail.tab === 'hardware-monitor') {
+ if (!document.getElementById('hmp-root')) init();
+ }
+ });
+
+ window.addEventListener('DOMContentLoaded', () => {
+ if (document.getElementById('hardware-monitor')?.classList.contains('active')) init();
+ });
+})();
diff --git a/tools/adore_api/static/main.js b/tools/adore_api/static/main.js
index c81dfde9..f398fa87 100644
--- a/tools/adore_api/static/main.js
+++ b/tools/adore_api/static/main.js
@@ -1,1305 +1,59 @@
-function showTab(tabName) {
- const tabs = document.querySelectorAll('.tab');
- const contents = document.querySelectorAll('.tab-content');
+// ── Bootstrap ─────────────────────────────────────────────────────────────────
+(function () {
+ 'use strict';
- tabs.forEach(tab => tab.classList.remove('active'));
- contents.forEach(content => content.classList.remove('active'));
-
- document.querySelector(`[onclick="showTab('${tabName}')"]`).classList.add('active');
- document.getElementById(tabName).classList.add('active');
-}
-
-class ScenarioManager {
- constructor() {
- this.currentStatus = 'idle';
- this.currentBagStatus = 'idle';
- this.currentModelCheckStatus = 'idle';
- this.currentModelCheckRunId = null;
- this.logUpdateInterval = null;
- this.statusUpdateInterval = null;
- this.positionsUpdateInterval = null;
- this.bagUpdateInterval = null;
- this.modelCheckUpdateInterval = null;
- this.runningNodesUpdateInterval = null;
- this.isEditingLoop = false;
- this.loopUpdateTimeout = null;
- this.codeEditor = null;
- this.usingTextarea = false;
- this.availableTopics = [];
- this.scenarios = [];
- this.selectedScenario = '';
- this.waitingForModelCheck = false;
- this.initializeElements();
- this.loadApiReference();
- this.initializeCodeEditor();
- this.initializeScenarioSearch();
- this.loadScenarios();
- this.loadTopics();
- this.startUpdateIntervals();
+ function escapeHtml(s) {
+ return String(s)
+ .replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"');
}
- initializeCodeEditor() {
- try {
- const defaultContent = `
-from launch import LaunchDescription
-import os
-import sys
-base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-if base_dir not in sys.path:
- sys.path.insert(0, base_dir)
-from scenario_helpers.simulated_vehicle import create_simulated_vehicle_nodes
-from scenario_helpers.simulated_vehicle import Position
-from scenario_helpers.visualizer import create_visualization_nodes
-
-start_position = Position(lat_long=(52.314562, 10.560474), psi=0.0)
-goal_position = Position(lat_long=(52.313533, 10.560554))
-
-def generate_launch_description():
- launch_file_dir = os.path.dirname(os.path.realpath(__file__))
- map_image_folder = os.path.abspath(os.path.join(launch_file_dir, "../assets/maps/"))
- map_folder = os.path.abspath(os.path.join(launch_file_dir, "../assets/tracks/"))
- vehicle_param = os.path.abspath(os.path.join(launch_file_dir, "../assets/vehicle_params/"))
- map_file = map_folder + "/de_bs_borders_wfs.r2sr"
- vehicle_model_file = vehicle_param + "/NGC.json"
-
- return LaunchDescription([
- *create_visualization_nodes(
- whitelist=["ego_vehicle"],
- asset_folder=map_image_folder,
- use_center_ego=True
- ),
- *create_simulated_vehicle_nodes(
- namespace="ego_vehicle",
- start_position=start_position,
- goal_position=goal_position,
- map_file=map_file,
- model_file=vehicle_model_file,
- controllable=True,
- optinlc_route_following=True,
- v2x_id=0,
- vehicle_id=0,
- controller=1,
- debug=False,
- composable=False
- )
- ])`;
-
- this.codeEditor = CodeMirror(document.getElementById('codeEditor'), {
- mode: 'python',
- theme: 'monokai',
- lineNumbers: true,
- matchBrackets: true,
- autoCloseBrackets: true,
- indentUnit: 4,
- indentWithTabs: false,
- lineWrapping: true,
- tabSize: 4,
- value: defaultContent
- });
-
- setTimeout(() => {
- if (this.codeEditor && this.codeEditor.getValue() === defaultContent) {
- this.codeEditor.refresh();
- this.codeEditor.focus();
- } else {
- throw new Error('CodeMirror validation failed');
- }
- }, 100);
-
- } catch (error) {
- console.error('CodeMirror failed to initialize:', error);
- this.useFallbackTextarea();
- }
- }
-
- useFallbackTextarea() {
- document.querySelector('.code-editor-container').style.display = 'none';
- document.getElementById('scenarioTextarea').style.display = 'block';
- this.usingTextarea = true;
- }
-
- getValue() {
- if (this.usingTextarea) {
- return document.getElementById('scenarioTextarea').value;
- } else if (this.codeEditor) {
- return this.codeEditor.getValue();
- }
- return '';
- }
-
- setValue(content) {
- if (this.usingTextarea) {
- document.getElementById('scenarioTextarea').value = content;
- } else if (this.codeEditor) {
- this.codeEditor.setValue(content);
- }
- }
-
- async loadApiReference() {
- try {
- const response = await fetch('/api_reference.md');
- const markdownText = await response.text();
- const htmlContent = this.simpleMarkdownToHtml(markdownText);
-
- document.getElementById('api-reference-content').innerHTML = htmlContent;
- document.getElementById('api-reference-content').style.display = 'block';
- document.getElementById('api-reference-loading').style.display = 'none';
-
- } catch (error) {
- console.error('Failed to load API reference:', error);
- document.getElementById('api-reference-loading').innerHTML =
- 'Failed to load API reference. Please check if api_reference.md exists.
';
- }
- }
-
- simpleMarkdownToHtml(markdown) {
- return markdown
+ function markdownToHtml(md) {
+ return md
.replace(/^### (.*$)/gm, '$1 ')
.replace(/^## (.*$)/gm, '$1 ')
.replace(/^# (.*$)/gm, '$1 ')
.replace(/\*\*(.*?)\*\*/g, '$1 ')
- .replace(/```json\n([\s\S]*?)```/g, '')
- .replace(/```([\s\S]*?)```/g, '$1 ')
+ .replace(/```json\n([\s\S]*?)```/g, '')
+ .replace(/```([\s\S]*?)```/g, '$1 ')
.replace(/`([^`]+)`/g, '$1')
.replace(/^- (.*$)/gm, '$1 ')
- .replace(/(.*<\/li>)/s, '')
.replace(/\n\n/g, '
')
- .replace(/^(.*)$/gm, '
$1
')
+ .replace(/^(.+)$/gm, (_, line) =>
+ /^(${line}`)
.replace(/<\/p>/g, '')
- .replace(/
(.*<\/h[1-6]>)<\/p>/g, '$1')
- .replace(/(
.*<\/ul>)<\/p>/gs, '$1')
- .replace(/(
)<\/p>/gs, '$1')
.replace(/GET<\/strong>/g, 'GET ')
.replace(/POST<\/strong>/g, 'POST ')
+ .replace(/DELETE<\/strong>/g, 'DELETE ')
.replace(/\/api\/([^<]+)<\/code>/g, '/api/$1 ');
}
- initializeScenarioSearch() {
- const searchInput = document.getElementById('scenarioSearchInput');
- const dropdown = document.getElementById('scenarioDropdown');
-
- searchInput.addEventListener('input', (e) => {
- const query = e.target.value.toLowerCase();
- this.filterScenarios(query);
- });
-
- searchInput.addEventListener('focus', () => {
- this.showDropdown();
- });
-
- document.addEventListener('click', (e) => {
- if (!e.target.closest('.scenario-search')) {
- this.hideDropdown();
- }
- });
- }
-
- filterScenarios(query) {
- const dropdown = document.getElementById('scenarioDropdown');
- dropdown.innerHTML = '';
-
- const filtered = this.scenarios.filter(scenario =>
- scenario.toLowerCase().includes(query)
- );
-
- if (filtered.length === 0) {
- dropdown.innerHTML = 'No scenarios found
';
- } else {
- filtered.forEach(scenario => {
- const option = document.createElement('div');
- option.className = 'scenario-option';
- option.textContent = scenario;
- option.addEventListener('click', () => {
- this.selectScenario(scenario);
- });
- dropdown.appendChild(option);
- });
- }
-
- this.showDropdown();
- }
-
- selectScenario(scenario) {
- this.selectedScenario = scenario;
- document.getElementById('scenarioSearchInput').value = scenario;
- this.hideDropdown();
- }
-
- showDropdown() {
- const dropdown = document.getElementById('scenarioDropdown');
- if (dropdown.children.length > 0) {
- dropdown.style.display = 'block';
+ async function loadApiReference() {
+ const loading = document.getElementById('api-reference-loading');
+ const content = document.getElementById('api-reference-content');
+ try {
+ const r = await fetch('/api_reference.md');
+ const text = await r.text();
+ if (content) { content.innerHTML = markdownToHtml(text); content.style.display = 'block'; }
+ if (loading) loading.style.display = 'none';
+ } catch (e) {
+ if (loading) loading.innerHTML = 'Failed to load API reference.
';
}
}
- hideDropdown() {
- document.getElementById('scenarioDropdown').style.display = 'none';
- }
-
- initializeElements() {
- this.statusIndicator = document.getElementById('statusIndicator');
- this.statusText = document.getElementById('statusText');
- this.bagStatusIndicator = document.getElementById('bagStatusIndicator');
- this.bagStatusText = document.getElementById('bagStatusText');
- this.loopMode = document.getElementById('loopMode');
- this.loopDelay = document.getElementById('loopDelay');
- this.loopRuntime = document.getElementById('loopRuntime');
- this.startBtn = document.getElementById('startBtn');
- this.restartBtn = document.getElementById('restartBtn');
- this.haltBtn = document.getElementById('haltBtn');
- this.runCustomBtn = document.getElementById('runCustomBtn');
- this.haltCustomBtn = document.getElementById('haltCustomBtn');
- this.logContainer = document.getElementById('logContainer');
- this.bagLogContainer = document.getElementById('bagLogContainer');
- this.scenarioContentToggle = document.getElementById('scenarioContentToggle');
- this.scenarioContentDiv = document.getElementById('scenarioContentDiv');
- this.scenarioContent = document.getElementById('scenarioContent');
- this.scenarioName = document.getElementById('scenarioName');
- this.saveBtn = document.getElementById('saveBtn');
- this.copySelectedBtn = document.getElementById('copySelectedBtn');
- this.clearEditorBtn = document.getElementById('clearEditorBtn');
- this.applyPositionsBtn = document.getElementById('applyPositionsBtn');
- this.storedPositionsInfo = document.getElementById('storedPositionsInfo');
- this.clearPositionsBtn = document.getElementById('clearPositionsBtn');
- this.runningNodesInfo = document.getElementById('runningNodesInfo');
- this.runningNodesCount = document.getElementById('runningNodesCount');
-
- this.bagDuration = document.getElementById('bagDuration');
- this.recordAllTopics = document.getElementById('recordAllTopics');
- this.topicsSelectionContainer = document.getElementById('topicsSelectionContainer');
- this.topicsContainer = document.getElementById('topicsContainer');
- this.startBagBtn = document.getElementById('startBagBtn');
- this.stopBagBtn = document.getElementById('stopBagBtn');
- this.refreshTopicsBtn = document.getElementById('refreshTopicsBtn');
- this.bagRecordingsToggle = document.getElementById('bagRecordingsToggle');
- this.bagRecordingsDiv = document.getElementById('bagRecordingsDiv');
- this.bagRecordingsList = document.getElementById('bagRecordingsList');
-
- this.modelCheckEnabled = document.getElementById('modelCheckEnabled');
- this.modelCheckConfig = document.getElementById('modelCheckConfig');
- this.modelCheckStatusIndicator = document.getElementById('modelCheckStatusIndicator');
- this.modelCheckStatusText = document.getElementById('modelCheckStatusText');
- this.modelCheckResultsWidget = document.getElementById('modelCheckResultsWidget');
- this.modelCheckSummary = document.getElementById('modelCheckSummary');
- this.modelCheckPropositions = document.getElementById('modelCheckPropositions');
- this.modelCheckLogContainer = document.getElementById('modelCheckLogContainer');
- this.cancelModelCheckBtn = document.getElementById('cancelModelCheckBtn');
- this.downloadModelCheckBtn = document.getElementById('downloadModelCheckBtn');
-
- this.startBtn.addEventListener('click', () => this.startScenario());
- this.restartBtn.addEventListener('click', () => this.restartScenario());
- this.haltBtn.addEventListener('click', () => this.haltAll());
- this.runCustomBtn.addEventListener('click', () => this.runScenarioFromEditor());
- this.haltCustomBtn.addEventListener('click', () => this.haltAll());
- this.saveBtn.addEventListener('click', () => this.saveScenario());
- this.copySelectedBtn.addEventListener('click', () => this.copySelectedScenario());
- this.clearEditorBtn.addEventListener('click', () => this.clearEditor());
- this.applyPositionsBtn.addEventListener('click', () => this.applyStoredPositions());
- this.clearPositionsBtn.addEventListener('click', () => this.clearStoredPositions());
-
- this.loopMode.addEventListener('change', () => this.toggleLoopMode());
- this.loopDelay.addEventListener('input', () => this.onLoopInputChange());
- this.loopRuntime.addEventListener('input', () => this.onLoopInputChange());
-
- this.loopDelay.addEventListener('focus', () => this.isEditingLoop = true);
- this.loopDelay.addEventListener('blur', () => this.isEditingLoop = false);
- this.loopRuntime.addEventListener('focus', () => this.isEditingLoop = true);
- this.loopRuntime.addEventListener('blur', () => this.isEditingLoop = false);
-
- this.startBagBtn.addEventListener('click', () => this.startBagRecording());
- this.stopBagBtn.addEventListener('click', () => this.stopBagRecording());
- this.refreshTopicsBtn.addEventListener('click', () => this.loadTopics());
- this.recordAllTopics.addEventListener('change', () => this.toggleTopicsSelection());
-
- this.cancelModelCheckBtn.addEventListener('click', () => this.cancelModelCheck());
- this.downloadModelCheckBtn.addEventListener('click', () => this.downloadModelCheckResults());
-
- this.scenarioContentToggle.addEventListener('click', () => {
- this.scenarioContentDiv.style.display =
- this.scenarioContentDiv.style.display === 'block' ? 'none' : 'block';
- });
-
- this.bagRecordingsToggle.addEventListener('click', () => {
- this.bagRecordingsDiv.style.display =
- this.bagRecordingsDiv.style.display === 'block' ? 'none' : 'block';
- if (this.bagRecordingsDiv.style.display === 'block') {
- this.updateBagRecordingsList();
+ function init() {
+ // Wire lichtblick URL enter key
+ document.getElementById('lichtblickUrl')?.addEventListener('keydown', e => {
+ if (e.key === 'Enter') {
+ document.getElementById('lichtblickFrame').src = e.target.value;
}
});
- }
-
- getSafetyGradeInfo(safetyGrade) {
- if (!safetyGrade) return null;
-
- const parts = safetyGrade.split(',').map(p => p.trim());
- if (parts.length !== 2) return null;
-
- return {
- us: parts[0].toUpperCase(),
- eu: parseFloat(parts[1])
- };
- }
-
- createSafetyGradeBadge(grade, type) {
- const badge = document.createElement('div');
- badge.className = 'grade-badge';
-
- if (type === 'us') {
- badge.textContent = grade;
- badge.classList.add(`grade-us-${grade.toLowerCase()}`);
- } else {
- badge.textContent = grade.toString();
- badge.classList.add(`grade-eu-${Math.floor(grade)}`);
- }
-
- return badge;
- }
-
- async loadTopics() {
- try {
- const response = await fetch('/api/topic/list');
- const data = await response.json();
-
- if (data.success) {
- this.availableTopics = data.system_topics || [];
- this.updateTopicsDisplay();
- }
- } catch (error) {
- console.error('Failed to load topics:', error);
- }
- }
- updateTopicsDisplay() {
- const container = this.topicsContainer;
- container.innerHTML = '';
-
- if (this.availableTopics.length === 0) {
- container.innerHTML = 'No topics found
';
- return;
- }
-
- this.availableTopics.forEach(topic => {
- const label = document.createElement('label');
- label.className = 'topic-checkbox';
- label.innerHTML = `
-
- ${topic}
- `;
- container.appendChild(label);
+ // Load API reference lazily
+ window.addEventListener('tabchange', e => {
+ if (e.detail.tab === 'api-reference') loadApiReference();
});
}
- toggleTopicsSelection() {
- const showSelection = !this.recordAllTopics.checked;
- this.topicsSelectionContainer.style.display = showSelection ? 'block' : 'none';
- }
-
- getSelectedTopics() {
- if (this.recordAllTopics.checked) {
- return [];
- }
-
- const checkboxes = this.topicsContainer.querySelectorAll('input[type="checkbox"]:checked');
- return Array.from(checkboxes).map(cb => cb.value);
- }
-
- async startBagRecording() {
- const duration = parseInt(this.bagDuration.value) || null;
- const topics = this.getSelectedTopics();
-
- try {
- const response = await fetch('/api/bag/start', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ duration, topics })
- });
-
- const result = await response.json();
- if (result.success) {
- console.log('Bag recording started successfully');
- } else {
- alert(`Failed to start bag recording: ${result.message}`);
- }
- } catch (error) {
- console.error('Failed to start bag recording:', error);
- alert('Failed to start bag recording');
- }
- }
-
- async stopBagRecording() {
- try {
- const response = await fetch('/api/bag/stop', { method: 'POST' });
- const result = await response.json();
- if (result.success) {
- console.log('Bag recording stopped successfully');
- alert(`Recording saved: ${result.relative_path}`);
- } else {
- alert(`Failed to stop bag recording: ${result.message}`);
- }
- } catch (error) {
- console.error('Failed to stop bag recording:', error);
- alert('Failed to stop bag recording');
- }
- }
-
- async cancelModelCheck() {
- if (!this.currentModelCheckRunId) {
- return;
- }
-
- try {
- const response = await fetch(`/api/model_check/cancel/${this.currentModelCheckRunId}`, {
- method: 'POST'
- });
-
- const result = await response.json();
- if (result.message) {
- console.log('Model checking cancelled');
- }
- } catch (error) {
- console.error('Failed to cancel model checking:', error);
- }
- }
-
- async downloadModelCheckResults() {
- if (!this.currentModelCheckRunId) {
- return;
- }
-
- try {
- const url = `/api/model_check/result/${this.currentModelCheckRunId}/download`;
- const link = document.createElement('a');
- link.href = url;
- link.download = `model_check_results_${this.currentModelCheckRunId}.json`;
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- } catch (error) {
- console.error('Failed to download model check results:', error);
- }
- }
-
- async updateBagStatus() {
- try {
- const response = await fetch('/api/bag/status');
- const status = await response.json();
-
- this.currentBagStatus = status.status;
- this.bagStatusIndicator.className = `status-indicator status-${status.status}`;
-
- let statusText = `Status: ${status.status.toUpperCase()}`;
- if (status.bag_name) {
- statusText += ` - ${status.bag_name}`;
- }
- if (status.runtime) {
- statusText += ` (${Math.round(status.runtime)}s)`;
- }
- this.bagStatusText.textContent = statusText;
-
- this.updateBagButtonStates();
- } catch (error) {
- console.error('Failed to update bag status:', error);
- this.bagStatusText.textContent = 'Status unavailable';
- }
- }
-
- async updateModelCheckStatus() {
- try {
- const statusResponse = await fetch('/api/scenario/status');
- if (!statusResponse.ok) {
- console.error(`Failed to fetch scenario status: ${statusResponse.status}`);
- this.modelCheckStatusText.textContent = 'Status unavailable';
- return;
- }
-
- const scenarioStatus = await statusResponse.json();
-
- if (scenarioStatus.current_model_check_run_id !== undefined &&
- scenarioStatus.current_model_check_run_id !== null) {
- this.currentModelCheckRunId = scenarioStatus.current_model_check_run_id;
- }
-
- if (this.currentModelCheckRunId !== null && this.currentModelCheckRunId !== undefined) {
- const response = await fetch(`/api/model_check/result/${this.currentModelCheckRunId}`);
-
- if (response.ok) {
- const result = await response.json();
-
- this.currentModelCheckStatus = result.status || 'unknown';
- this.modelCheckStatusIndicator.className = `status-indicator status-${this.currentModelCheckStatus}`;
-
- let statusText = `Status: ${this.currentModelCheckStatus.toUpperCase()}`;
- if (result.run_id !== undefined) {
- statusText += ` - Run ${result.run_id}`;
- }
- if (result.mode) {
- statusText += ` (${result.mode})`;
- }
-
- this.modelCheckStatusText.textContent = statusText;
-
- let logContent = '';
- if (this.currentModelCheckStatus === 'running' || this.currentModelCheckStatus === 'pending') {
- try {
- const logResponse = await fetch(`/api/model_check/result/${this.currentModelCheckRunId}/log/current`);
- if (logResponse.ok) {
- const logData = await logResponse.json();
- logContent = logData.log_content || result.stdout || '';
- } else {
- logContent = result.stdout || '';
- }
- } catch (e) {
- logContent = result.stdout || '';
- }
- } else {
- logContent = result.stdout || '';
- }
-
- this.updateModelCheckLog(logContent);
-
- const isCompleted = (this.currentModelCheckStatus.toLowerCase() === 'completed');
- if (result.results && isCompleted) {
- this.updateModelCheckResults(result.results);
- this.modelCheckResultsWidget.style.display = 'block';
- } else if (isCompleted) {
- this.modelCheckResultsWidget.style.display = 'none';
- } else {
- this.modelCheckResultsWidget.style.display = 'none';
- }
-
- this.updateModelCheckButtonStates();
- } else if (response.status === 404) {
- this.currentModelCheckRunId = null;
- this.currentModelCheckStatus = 'idle';
- this.modelCheckStatusIndicator.className = 'status-indicator status-idle';
- this.modelCheckStatusText.textContent = 'Idle';
- this.modelCheckResultsWidget.style.display = 'none';
- this.updateModelCheckButtonStates();
- this.updateModelCheckLog('No model checking output');
- } else {
- console.error(`Model check API error: ${response.status} ${response.statusText}`);
- this.modelCheckStatusText.textContent = `API Error: ${response.status}`;
- this.updateModelCheckLog(`API Error: ${response.status} ${response.statusText}`);
- }
- } else {
- this.currentModelCheckStatus = 'idle';
- this.modelCheckStatusIndicator.className = 'status-indicator status-idle';
- this.modelCheckStatusText.textContent = 'Idle';
- this.modelCheckResultsWidget.style.display = 'none';
- this.updateModelCheckButtonStates();
- this.updateModelCheckLog('No model checking output');
- }
- } catch (error) {
- console.error('Exception in updateModelCheckStatus:', error);
- this.modelCheckStatusText.textContent = 'Error fetching status';
- this.updateModelCheckLog(`Error fetching model check status: ${error.message}`);
- }
- }
-
- updateModelCheckLog(content) {
- if (content && content.trim().length > 0) {
- this.modelCheckLogContainer.textContent = content;
- } else {
- this.modelCheckLogContainer.textContent = 'No model checking output available';
- }
- this.modelCheckLogContainer.scrollTop = this.modelCheckLogContainer.scrollHeight;
- }
-updateModelCheckResults(results) {
- try {
- if (!results) {
- this.modelCheckResultsWidget.style.display = 'none';
- return;
- }
-
- this.modelCheckResultsWidget.style.display = 'block';
-
- const summary = results.SUMMARY || {};
- const summaryHtml = `
-
- ${summary.total_propositions || 0}
- Total
-
-
- ${summary.passed || 0}
- Passed
-
-
- ${summary.failed || 0}
- Failed
-
-
- ${((summary.success_rate || 0) * 100).toFixed(1)}%
- Success Rate
-
-
- ${summary.overall_result || 'N/A'}
- Overall
-
- `;
- this.modelCheckSummary.innerHTML = summaryHtml;
-
- let propositionsHtml = '';
- let propositionCount = 0;
- Object.keys(results).forEach(key => {
- if (key !== 'SUMMARY') {
- const proposition = results[key];
- propositionsHtml += this.createPropositionHtml(key, proposition);
- propositionCount++;
- }
- });
-
- if (propositionCount === 0) {
- propositionsHtml = 'No proposition results found
';
- }
-
- this.modelCheckPropositions.innerHTML = propositionsHtml;
- } catch (error) {
- console.error('Error updating model check results:', error);
- this.modelCheckResultsWidget.style.display = 'none';
- }
- }
-
- createPropositionHtml(key, proposition) {
- const status = proposition.status ? proposition.status.toLowerCase() : 'unknown';
- const cssClass = status === 'pass' ? 'proposition-pass' :
- status === 'fail' ? 'proposition-fail' :
- status === 'no_data' ? 'proposition-no-data' : 'proposition-error';
-
- const statusClass = status === 'pass' ? 'status-pass' :
- status === 'fail' ? 'status-fail' :
- status === 'no_data' ? 'status-no-data' : 'status-error';
-
- const description = proposition.description || {};
- const title = description.title || key.replace(/_/g, ' ');
- const desc = description.description || 'No description available';
- const rationale = description.safety_rationale || 'Safety rationale not provided';
- const formulaDesc = proposition.formula_description || 'Formula description not available';
- const group = proposition.group || 'unknown';
-
- let safetyGradeHtml = '';
- if (proposition.statistics && proposition.statistics.safety_grade) {
- const gradeInfo = this.getSafetyGradeInfo(proposition.statistics.safety_grade);
- if (gradeInfo) {
- safetyGradeHtml = `
-
-
Safety Grade:
-
${gradeInfo.us}
-
${gradeInfo.eu.toFixed(1)}
-
- `;
- }
- }
-
- const technicalDetails = `
-
- Technical ID: ${key}
- Formula Type: ${proposition.formula_type || 'N/A'}
- Threshold: ${proposition.threshold !== undefined ? proposition.threshold : 'N/A'}
- States Analyzed: ${proposition.states_analyzed || 'N/A'}
- Kripke States: ${proposition.kripke_states || 'N/A'}
- Result Value: ${proposition.result !== undefined ? proposition.result : 'N/A'}
- ${proposition.error ? `Error: ${proposition.error}` : ''}
-
- `;
-
- return `
-
-
${group.replace(/_/g, ' ')}
-
-
${desc}
-
- Why this matters: ${rationale}
-
-
- Requirement: ${formulaDesc}
-
- ${safetyGradeHtml}
-
- ${technicalDetails}
-
-
- `;
- }
-
- updateBagButtonStates() {
- const isRecording = this.currentBagStatus === 'recording';
- this.startBagBtn.disabled = isRecording;
- this.stopBagBtn.disabled = !isRecording;
- }
-
- updateModelCheckButtonStates() {
- const isRunning = this.currentModelCheckStatus === 'running' || this.currentModelCheckStatus === 'pending';
- const hasResults = this.currentModelCheckStatus === 'completed' && this.currentModelCheckRunId !== null;
-
- this.cancelModelCheckBtn.disabled = !isRunning;
- this.downloadModelCheckBtn.disabled = !hasResults;
- }
-
- async updateBagLog() {
- try {
- const response = await fetch('/api/bag/output?lines=50');
- const data = await response.json();
-
- this.bagLogContainer.textContent = data.output || 'No bag recording output';
- this.bagLogContainer.scrollTop = this.bagLogContainer.scrollHeight;
- } catch (error) {
- console.error('Failed to update bag log:', error);
- }
- }
-
- async updateBagRecordingsList() {
- try {
- const response = await fetch('/api/bag/list');
- const data = await response.json();
-
- if (data.success && data.bags.length > 0) {
- let html = 'Recorded Bag Files: ';
- data.bags.forEach(bag => {
- html += `
-
- ${bag.name}
- Path: ${bag.relative_path}
- Created: ${bag.created} | Size: ${bag.size_mb.toFixed(2)} MB
-
- `;
- });
- this.bagRecordingsList.innerHTML = html;
- } else {
- this.bagRecordingsList.innerHTML = 'No bag recordings found
';
- }
- } catch (error) {
- console.error('Failed to update bag recordings list:', error);
- this.bagRecordingsList.innerHTML = 'Failed to load bag recordings
';
- }
- }
-
- async updateRunningNodes() {
- try {
- const response = await fetch('/api/ros2/nodes/running');
- const data = await response.json();
-
- if (data.running_nodes && data.running_nodes.length > 0) {
- this.runningNodesCount.textContent = data.count;
-
- let html = '';
- data.running_nodes.forEach(node => {
- html += `${node}
`;
- });
- this.runningNodesInfo.innerHTML = html;
- } else {
- this.runningNodesCount.textContent = '0';
- this.runningNodesInfo.innerHTML = 'No running nodes
';
- }
- } catch (error) {
- console.error('Failed to update running nodes:', error);
- this.runningNodesCount.textContent = '?';
- this.runningNodesInfo.innerHTML = 'Failed to load nodes
';
- }
- }
-
- async runScenarioFromEditor() {
- const content = this.getValue().trim();
- if (!content) {
- alert('Please enter launch file content in the Scenario Editor');
- return;
- }
-
- if (this.currentStatus === 'running') {
- const shouldHalt = confirm(
- 'A scenario is currently running. Do you want to halt the current scenario and run the scenario from the editor?\n\n' +
- 'Click "OK" to halt current scenario and run from editor.\n' +
- 'Click "Cancel" to keep current scenario running.'
- );
-
- if (!shouldHalt) {
- return;
- }
-
- try {
- const haltResponse = await fetch('/api/scenario/halt', { method: 'POST' });
- const haltResult = await haltResponse.json();
-
- if (!haltResult.success) {
- alert(`Failed to halt current scenario: ${haltResult.message}`);
- return;
- }
-
- await new Promise(resolve => setTimeout(resolve, 2000));
-
- } catch (error) {
- console.error('Failed to halt current scenario:', error);
- alert('Failed to halt current scenario. Please try again.');
- return;
- }
- }
-
- try {
- const response = await fetch('/api/scenario/start', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- scenario: content,
- is_file: false,
- model_check_enabled: this.modelCheckEnabled.checked,
- model_check_config: this.modelCheckConfig.value
- })
- });
-
- const result = await response.json();
- if (result.success) {
- const originalText = this.runCustomBtn.textContent;
- this.runCustomBtn.textContent = 'Scenario Started!';
- this.runCustomBtn.style.backgroundColor = '#28a745';
- setTimeout(() => {
- this.runCustomBtn.textContent = originalText;
- this.runCustomBtn.style.backgroundColor = '';
- }, 2000);
- } else {
- alert(`Failed to start scenario from editor: ${result.message}`);
- }
- } catch (error) {
- console.error('Failed to run scenario from editor:', error);
- alert('Failed to run scenario from editor. Please check the content and try again.');
- }
- }
-
- clearEditor() {
- if (confirm('Are you sure you want to clear the Scenario Editor? This action cannot be undone.')) {
- const defaultContent = `# Welcome to the Scenario Editor
-# Write your ROS2 launch file content here...
-
-# Example ROS2 Launch File:
-from launch import LaunchDescription
-from launch_ros.actions import Node
-
-def generate_launch_description():
- return LaunchDescription([
- # Add your nodes here
- ])
-`;
- this.setValue(defaultContent);
- }
- }
-
- onLoopInputChange() {
- this.isEditingLoop = true;
-
- if (this.loopUpdateTimeout) {
- clearTimeout(this.loopUpdateTimeout);
- }
-
- this.loopUpdateTimeout = setTimeout(() => {
- this.isEditingLoop = false;
- this.toggleLoopMode();
- }, 1000);
- }
-
- async loadScenarios() {
- try {
- const response = await fetch('/api/scenario/get');
- const data = await response.json();
-
- this.scenarios = data.scenarios || [];
- this.filterScenarios('');
- } catch (error) {
- console.error('Failed to load scenarios:', error);
- }
- }
-
- async startScenario() {
- const scenario = this.selectedScenario;
- if (!scenario) {
- alert('Please select a scenario');
- return;
- }
-
- if (this.currentStatus === 'running') {
- const shouldHalt = confirm(
- 'A scenario is currently running. Do you want to halt the current scenario and start the selected scenario?\n\n' +
- 'Click "OK" to halt current scenario and start selected scenario.\n' +
- 'Click "Cancel" to keep current scenario running.'
- );
-
- if (!shouldHalt) {
- return;
- }
-
- try {
- await fetch('/api/scenario/halt', { method: 'POST' });
- await new Promise(resolve => setTimeout(resolve, 2000));
- } catch (error) {
- console.error('Failed to halt current scenario:', error);
- alert('Failed to halt current scenario. Please try again.');
- return;
- }
- }
-
- try {
- const response = await fetch('/api/scenario/start', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- scenario,
- is_file: true,
- model_check_enabled: this.modelCheckEnabled.checked,
- model_check_config: this.modelCheckConfig.value
- })
- });
-
- const result = await response.json();
- if (!result.success) {
- alert(result.message);
- }
- } catch (error) {
- console.error('Failed to start scenario:', error);
- }
- }
-
- async restartScenario() {
- try {
- const response = await fetch('/api/scenario/restart', { method: 'POST' });
- const result = await response.json();
- if (!result.success) {
- alert(result.message);
- }
- } catch (error) {
- console.error('Failed to restart scenario:', error);
- }
- }
-
- async haltAll() {
- if (confirm('This will halt all ROS2 processes. Continue?')) {
- try {
- const response = await fetch('/api/scenario/halt', { method: 'POST' });
- const result = await response.json();
- if (!result.success) {
- alert(result.message);
- }
- } catch (error) {
- console.error('Failed to halt scenarios:', error);
- }
- }
- }
-
- async saveScenario() {
- const name = this.scenarioName.value.trim();
- const content = this.getValue().trim();
-
- if (!name || !content) {
- alert('Please enter both scenario name and content');
- return;
- }
-
- try {
- const response = await fetch('/api/scenario/save', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ name, content })
- });
-
- const result = await response.json();
- if (result.success) {
- alert(result.message);
- this.scenarioName.value = '';
- this.loadScenarios();
- } else {
- alert(result.message);
- }
- } catch (error) {
- console.error('Failed to save scenario:', error);
- alert('Failed to save scenario');
- }
- }
-
- async copySelectedScenario() {
- const selectedScenario = this.selectedScenario;
-
- if (!selectedScenario) {
- alert('Please select a scenario first');
- return;
- }
-
- try {
- const response = await fetch(`/api/scenario/content/${encodeURIComponent(selectedScenario)}`);
- const result = await response.json();
-
- if (result.success) {
- this.setValue(result.content);
- alert(`Selected scenario "${selectedScenario}" copied to Scenario Editor`);
- } else {
- alert(result.message || 'Failed to copy selected scenario');
- }
- } catch (error) {
- console.error('Failed to copy selected scenario:', error);
- alert('Failed to copy selected scenario');
- }
- }
-
- async applyStoredPositions() {
- try {
- const response = await fetch('/api/positions/get');
- const positions = await response.json();
-
- if (!positions.start && !positions.goal) {
- alert('No stored positions found. Use the Goal Picker tab to set positions.');
- return;
- }
-
- let content = this.getValue();
- let lines = content.split('\n');
- let modified = false;
-
- if (positions.start) {
- const newStartLine = `start_position = Position(lat_long=(${positions.start.lat.toFixed(6)}, ${positions.start.lng.toFixed(6)}), psi=0.0)`;
-
- let startFound = false;
- for (let i = 0; i < lines.length; i++) {
- if (lines[i].trim().startsWith('start_position = Position(')) {
- lines[i] = newStartLine;
- startFound = true;
- modified = true;
- break;
- }
- }
-
- if (!startFound) {
- lines.unshift(newStartLine);
- modified = true;
- }
- }
-
- if (positions.goal) {
- const newGoalLine = `goal_position = Position(lat_long=(${positions.goal.lat.toFixed(6)}, ${positions.goal.lng.toFixed(6)}))`;
-
- let goalFound = false;
- for (let i = 0; i < lines.length; i++) {
- if (lines[i].trim().startsWith('goal_position = Position(')) {
- lines[i] = newGoalLine;
- goalFound = true;
- modified = true;
- break;
- }
- }
-
- if (!goalFound) {
- lines.push(newGoalLine);
- modified = true;
- }
- }
-
- if (modified) {
- this.setValue(lines.join('\n'));
- alert('Stored positions applied to Scenario Editor');
- }
-
- } catch (error) {
- console.error('Failed to apply stored positions:', error);
- alert('Failed to apply stored positions');
- }
- }
-
- async clearStoredPositions() {
- if (confirm('Clear all stored positions?')) {
- try {
- const response = await fetch('/api/positions/clear', { method: 'POST' });
- const result = await response.json();
- if (result.success) {
- alert('Stored positions cleared!');
- this.updateStoredPositions();
- } else {
- alert('Failed to clear stored positions');
- }
- } catch (error) {
- console.error('Failed to clear stored positions:', error);
- alert('Failed to clear stored positions');
- }
- }
- }
-
- async updateStoredPositions() {
- try {
- const response = await fetch('/api/positions/get');
- const positions = await response.json();
-
- if (!positions.start && !positions.goal) {
- this.storedPositionsInfo.innerHTML = 'No positions stored
';
- return;
- }
-
- let html = '';
-
- if (positions.start) {
- const utm = positions.start.utm;
- html += `
-
- 🟢 Start Position:
- Lat/Long: ${positions.start.lat.toFixed(6)}, ${positions.start.lng.toFixed(6)}
- UTM: ${utm.easting.toLocaleString()}m E, ${utm.northing.toLocaleString()}m N
- Zone: ${utm.zone}${utm.hemisphere}
- Python Code:
-
- start_position = Position(lat_long=(${positions.start.lat.toFixed(6)}, ${positions.start.lng.toFixed(6)}), psi=0.0)
-
-
- start_position = Position(utm=(${utm.easting.toFixed(1)}, ${utm.northing.toFixed(1)}, ${utm.zone}, '${utm.hemisphere}'), psi=0.0)
-
-
- `;
- }
-
- if (positions.goal) {
- const utm = positions.goal.utm;
- html += `
-
- 🔴 Goal Position:
- Lat/Long: ${positions.goal.lat.toFixed(6)}, ${positions.goal.lng.toFixed(6)}
- UTM: ${utm.easting.toLocaleString()}m E, ${utm.northing.toLocaleString()}m N
- Zone: ${utm.zone}${utm.hemisphere}
- Python Code:
-
- goal_position = Position(lat_long=(${positions.goal.lat.toFixed(6)}, ${positions.goal.lng.toFixed(6)}))
-
-
- goal_position = Position(utm=(${utm.easting.toFixed(1)}, ${utm.northing.toFixed(1)}, ${utm.zone}, '${utm.hemisphere}'))
-
-
- `;
- }
-
- html += `
-
- 📘 Note: psi parameter represents vehicle start rotation in radians.
- 0.0 = facing East, π/2 = North, π = West, 3π/2 = South
-
- `;
-
- this.storedPositionsInfo.innerHTML = html;
-
- } catch (error) {
- console.error('Failed to update stored positions:', error);
- }
- }
-
- async toggleLoopMode() {
- const enabled = this.loopMode.checked;
- const delay = parseInt(this.loopDelay.value) || 0;
- const runtime = parseInt(this.loopRuntime.value) || 60;
- const modelCheckEnabled = this.modelCheckEnabled.checked;
- const modelCheckConfig = this.modelCheckConfig.value || 'config/default.yaml';
-
- try {
- const response = await fetch('/api/scenario/loop', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- enabled,
- delay,
- runtime,
- model_check_enabled: modelCheckEnabled,
- model_check_config: modelCheckConfig
- })
- });
-
- const result = await response.json();
- if (!result.success) {
- alert(result.message);
- }
- } catch (error) {
- console.error('Failed to toggle loop mode:', error);
- }
- }
-
- async updateStatus() {
- try {
- const response = await fetch('/api/scenario/status');
- const status = await response.json();
-
- this.currentStatus = status.status;
- this.statusIndicator.className = `status-indicator status-${status.status}`;
- this.waitingForModelCheck = status.waiting_for_model_check || false;
-
- let statusText = `Status: ${status.status.toUpperCase()}`;
- if (status.scenario) {
- statusText += ` - ${status.scenario}`;
- }
- if (status.runtime) {
- statusText += ` (${Math.round(status.runtime)}s)`;
- }
- if (this.waitingForModelCheck) {
- statusText += ' - Waiting for model check completion';
- }
- this.statusText.textContent = statusText;
-
- if (!this.isEditingLoop) {
- this.loopMode.checked = status.loop_mode;
- this.loopDelay.value = status.loop_delay;
- this.loopRuntime.value = status.default_runtime;
- this.modelCheckEnabled.checked = status.model_check_enabled !== false;
- this.modelCheckConfig.value = status.model_check_config || 'config/default.yaml';
- }
-
- if (status.scenario_content) {
- this.scenarioContent.textContent = status.scenario_content;
- }
-
- this.updateButtonStates();
- } catch (error) {
- console.error('Failed to update status:', error);
- }
- }
-
- updateButtonStates() {
- const isRunning = this.currentStatus === 'running';
- this.startBtn.disabled = isRunning;
- this.restartBtn.disabled = !isRunning;
-
- if (isRunning) {
- this.runCustomBtn.textContent = 'Replace Running Scenario';
- this.runCustomBtn.classList.remove('btn-success');
- this.runCustomBtn.classList.add('btn-warning');
- } else {
- this.runCustomBtn.textContent = 'Run Scenario from Editor';
- this.runCustomBtn.classList.remove('btn-warning');
- this.runCustomBtn.classList.add('btn-success');
- }
- }
-
- async updateLog() {
- try {
- const response = await fetch('/api/scenario/output?lines=100');
- const data = await response.json();
-
- this.logContainer.textContent = data.output;
- this.logContainer.scrollTop = this.logContainer.scrollHeight;
- } catch (error) {
- console.error('Failed to update log:', error);
- }
- }
-
- startUpdateIntervals() {
- this.updateStatus();
- this.updateLog();
- this.updateStoredPositions();
- this.updateBagStatus();
- this.updateBagLog();
- this.updateModelCheckStatus();
- this.updateRunningNodes();
-
- this.statusUpdateInterval = setInterval(() => this.updateStatus(), 1000);
- this.logUpdateInterval = setInterval(() => this.updateLog(), 2000);
- this.positionsUpdateInterval = setInterval(() => this.updateStoredPositions(), 5000);
- this.bagUpdateInterval = setInterval(() => {
- this.updateBagStatus();
- this.updateBagLog();
- }, 2000);
- this.modelCheckUpdateInterval = setInterval(() => this.updateModelCheckStatus(), 2000);
- this.runningNodesUpdateInterval = setInterval(() => this.updateRunningNodes(), 60000);
- }
-}
-
-window.addEventListener('DOMContentLoaded', () => {
- new ScenarioManager();
-});
+ window.addEventListener('DOMContentLoaded', init);
+})();
diff --git a/tools/adore_api/static/model_checker_panel.js b/tools/adore_api/static/model_checker_panel.js
new file mode 100644
index 00000000..79e3af04
--- /dev/null
+++ b/tools/adore_api/static/model_checker_panel.js
@@ -0,0 +1,301 @@
+// ── Model Checker Results Side Panel ─────────────────────────────────────────
+(function () {
+ 'use strict';
+
+ let _runId = null;
+ let _status = 'idle';
+ let _panelOpen = false;
+ let _lastCompletedRunId = null;
+ let _disabledProps = new Set();
+ let _allPropKeys = [];
+
+ function setPanelOpen(open) {
+ _panelOpen = open;
+ const panel = document.getElementById('sidePanel');
+ const main = document.getElementById('mainContent');
+ const btn = document.getElementById('sidePanelToggle');
+ if (panel) panel.classList.toggle('side-panel-open', open);
+ if (main) main.classList.toggle('with-side-panel', open);
+ if (btn) btn.textContent = open ? '🗎 Model Checker Results ✕' : '🗎 Model Checker Results';
+ localStorage.setItem('mcPanelOpen', open ? '1' : '0');
+ }
+
+ function getSafetyGradeHtml(grade) {
+ if (!grade) return '';
+ const parts = grade.split(',').map(s => s.trim());
+ if (parts.length !== 2) return '';
+ const us = parts[0].toUpperCase();
+ const eu = parseFloat(parts[1]);
+ return `
+ Safety Grade:
+ ${us}
+ ${eu.toFixed(1)}
+
`;
+ }
+
+ function getDqsHtml(dqs) {
+ if (!dqs || typeof dqs !== 'object') return '';
+ const score = dqs.dqs;
+ const label = (dqs.label || '').toUpperCase();
+ const tq = dqs.temporal_quality;
+ const vq = dqs.value_quality;
+ if (score === undefined && !label) return '';
+
+ const cls = score >= 0.9 ? 'dqs-good'
+ : score >= 0.7 ? 'dqs-acceptable'
+ : score >= 0.5 ? 'dqs-degraded'
+ : score >= 0.3 ? 'dqs-poor'
+ : 'dqs-critical';
+
+ const scoreBadge = score !== undefined
+ ? `${(score * 100).toFixed(0)}% `
+ : '';
+ const labelBadge = label
+ ? `${label} `
+ : '';
+ const tqBadge = tq !== undefined
+ ? `TQ ${(tq * 100).toFixed(0)}% `
+ : '';
+ const vqBadge = vq !== undefined
+ ? `VQ ${(vq * 100).toFixed(0)}% `
+ : '';
+
+ return `
+ Data Quality:
+ ${scoreBadge}${labelBadge}${tqBadge}${vqBadge}
+
`;
+ }
+
+ // Keys whose values are large arrays — skip in the stat grid
+ const ARRAY_SKIP_KEYS = new Set([
+ 'speed_values', 'safety_scores', 'acceleration_errors', 'measured_accelerations',
+ 'commanded_accelerations', 'deceleration_errors', 'measured_decelerations',
+ 'commanded_decelerations', 'lane_values',
+ ]);
+
+ function formatStatValue(v) {
+ if (v === null || v === undefined) return null;
+ if (Array.isArray(v)) return null;
+ if (typeof v === 'object') return null;
+ if (typeof v === 'number') {
+ // Show integers as-is, floats to 4 sig figs
+ return Number.isInteger(v) ? String(v) : v.toPrecision(4);
+ }
+ return String(v);
+ }
+
+ function formatStatKey(k) {
+ return k.replace(/_/g, ' ').replace(/\w/g, c => c.toUpperCase());
+ }
+
+ function renderStatGrid(obj) {
+ if (!obj || typeof obj !== 'object') return '';
+ return Object.entries(obj)
+ .filter(([k, v]) => !ARRAY_SKIP_KEYS.has(k) && formatStatValue(v) !== null)
+ .map(([k, v]) => `${formatStatKey(k)}: ${formatStatValue(v)} `)
+ .join('');
+ }
+
+ function propositionHtml(key, prop) {
+ const status = (prop.status || 'unknown').toLowerCase();
+ const cssClass = { pass: 'proposition-pass', fail: 'proposition-fail', no_data: 'proposition-no-data' }[status] || 'proposition-error';
+ const badgeClass = { pass: 'status-pass', fail: 'status-fail', no_data: 'status-no-data' }[status] || 'status-error';
+ const desc = prop.description || {};
+ const title = desc.title || key.replace(/_/g, ' ');
+ const body = desc.description || '';
+ const rationale = desc.safety_rationale || '';
+ const formulaDesc = prop.formula_description || '';
+ const group = (prop.group || '').replace(/_/g, ' ');
+ const stats = prop.statistics || {};
+ const dqs = prop.dqs || {};
+ const isDisabled = _disabledProps.has(key);
+
+ // Top-level scalar fields shown first
+ const topRows = [
+ ['Formula Type', prop.formula_type],
+ ['Logic Type', prop.logic_type],
+ ['Threshold', prop.threshold],
+ ['States Analyzed', prop.states_analyzed],
+ ['Kripke States', prop.kripke_states],
+ ['Result', prop.result],
+ ].filter(([, v]) => v !== undefined && v !== null)
+ .map(([k, v]) => `${k}: ${formatStatValue(v) ?? String(v)} `)
+ .join('');
+
+ const statRows = renderStatGrid(stats);
+
+ const dqsRows = Object.entries(dqs).length
+ ? `Data Quality
` + renderStatGrid(dqs)
+ : '';
+
+ return `
+
+ ${group ? `
${group}
` : ''}
+
+ ${body ? `
${body}
` : ''}
+ ${rationale ? `
Why this matters: ${rationale}
` : ''}
+ ${formulaDesc ? `
Requirement: ${formulaDesc}
` : ''}
+ ${getSafetyGradeHtml(stats.safety_grade)}
+ ${getDqsHtml(dqs)}
+
+
ID: ${key}
+ ${prop.error ? ` ·
Error: ${prop.error}` : ''}
+ ${topRows ? `
Parameters
${topRows}
` : ''}
+ ${statRows ? `
Statistics
${statRows}
` : ''}
+ ${dqsRows ? `
${dqsRows}
` : ''}
+
+
`;
+ }
+
+ function renderResults(results) {
+ if (!results) { clearResults(); return; }
+
+ const summary = results.SUMMARY || {};
+ const summaryEl = document.getElementById('mcPanelSummary');
+ if (summaryEl) {
+ const rate = ((summary.success_rate || 0) * 100).toFixed(1);
+ summaryEl.innerHTML = `
+
+
${summary.total_propositions || 0} Total
+
${summary.passed || 0} Passed
+
${summary.failed || 0} Failed
+
${rate}% Rate
+
+ ${summary.overall_result || '—'} Overall
+
+
`;
+ }
+
+ const propsEl = document.getElementById('mcPanelPropositions');
+ if (propsEl) {
+ _allPropKeys = Object.keys(results).filter(k => k !== 'SUMMARY');
+ propsEl.innerHTML = _allPropKeys.length
+ ? _allPropKeys.map(k => propositionHtml(k, results[k])).join('')
+ : 'No proposition results
';
+ propsEl.querySelectorAll('.prop-disable-btn').forEach(btn => {
+ btn.addEventListener('click', e => { e.stopPropagation(); toggleDisabledProp(btn.dataset.key); });
+ });
+ renderDisabledSection();
+ }
+ }
+
+ function renderDisabledSection() {
+ let el = document.getElementById('mcDisabledSection');
+ if (!el) {
+ el = document.createElement('div');
+ el.id = 'mcDisabledSection';
+ document.getElementById('sidePanelBody')?.appendChild(el);
+ }
+ if (_disabledProps.size === 0) { el.innerHTML = ''; return; }
+ el.innerHTML = `` +
+ [..._disabledProps].map(k => `
+
+ ${k.replace(/_/g, ' ')}
+ 👁 Show
+
`).join('');
+ el.querySelectorAll('.prop-reenable-btn').forEach(btn => {
+ btn.addEventListener('click', () => toggleDisabledProp(btn.dataset.key));
+ });
+ }
+
+ async function toggleDisabledProp(key) {
+ if (_disabledProps.has(key)) _disabledProps.delete(key);
+ else _disabledProps.add(key);
+ try {
+ await fetch('/api/model_checker/continuous/disabled', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ disabled_propositions: [..._disabledProps] }),
+ });
+ } catch (e) { /* non-fatal */ }
+ document.querySelectorAll('[data-prop-key]').forEach(el => {
+ const k = el.dataset.propKey;
+ el.classList.toggle('proposition-disabled', _disabledProps.has(k));
+ const btn = el.querySelector('.prop-disable-btn');
+ if (btn) {
+ btn.textContent = _disabledProps.has(k) ? '👁' : '🚫';
+ btn.title = _disabledProps.has(k) ? 'Re-enable proposition' : 'Suppress from violations';
+ }
+ });
+ renderDisabledSection();
+ }
+
+ function clearResults() {
+ const s = document.getElementById('mcPanelSummary');
+ const p = document.getElementById('mcPanelPropositions');
+ if (s) s.innerHTML = '';
+ if (p) p.innerHTML = 'No results yet
';
+ }
+
+ async function pollModelCheck() {
+ try {
+ const sr = await fetch('/api/scenario/status');
+ const ss = await sr.json();
+
+ if (ss.current_model_check_run_id !== undefined && ss.current_model_check_run_id !== null) {
+ _runId = ss.current_model_check_run_id;
+ }
+
+ const ind = document.getElementById('mcPanelIndicator');
+ const txt = document.getElementById('mcPanelStatusText');
+
+ if (_runId !== null && _runId !== undefined) {
+ const rr = await fetch(`/api/model_check/result/${_runId}`);
+ if (rr.ok) {
+ const data = await rr.json();
+ _status = data.status || 'unknown';
+ if (ind) ind.className = `status-indicator status-${_status}`;
+ if (txt) {
+ let label = _status.toUpperCase() + ` — Run ${_runId}`;
+ if (data.mode) label += ` (${data.mode})`;
+ txt.textContent = label;
+ }
+ if (_status === 'completed' && data.results) {
+ renderResults(data.results);
+ // Only auto-open once per completed run, and only if user has not manually closed
+ if (!_panelOpen && _runId !== _lastCompletedRunId) {
+ _lastCompletedRunId = _runId;
+ if (localStorage.getItem('mcPanelUserClosed') !== '1') setPanelOpen(true);
+ }
+ }
+ } else if (rr.status === 404) {
+ _runId = null;
+ _status = 'idle';
+ if (ind) ind.className = 'status-indicator status-idle';
+ if (txt) txt.textContent = 'Idle';
+ }
+ } else {
+ _status = 'idle';
+ if (ind) ind.className = 'status-indicator status-idle';
+ if (txt) txt.textContent = 'Idle';
+ }
+ } catch (e) { /* network */ }
+ }
+
+ function init() {
+ document.getElementById('sidePanelClose')?.addEventListener('click', () => {
+ localStorage.setItem('mcPanelUserClosed', '1');
+ setPanelOpen(false);
+ });
+ document.getElementById('sidePanelToggle')?.addEventListener('click', () => {
+ const next = !_panelOpen;
+ if (next) localStorage.removeItem('mcPanelUserClosed');
+ setPanelOpen(next);
+ });
+
+ const savedOpen = localStorage.getItem('mcPanelOpen');
+ if (savedOpen === '1') setPanelOpen(true);
+
+ clearResults();
+ setInterval(pollModelCheck, 2000);
+ }
+
+ window.addEventListener('DOMContentLoaded', init);
+ window.ModelCheckerPanel = { setPanelOpen, renderResults };
+})();
diff --git a/tools/adore_api/static/ros_task_manager.js b/tools/adore_api/static/ros_task_manager.js
new file mode 100644
index 00000000..3b8cd87d
--- /dev/null
+++ b/tools/adore_api/static/ros_task_manager.js
@@ -0,0 +1,100 @@
+// ── ROS Task Manager ──────────────────────────────────────────────────────────
+(function () {
+ 'use strict';
+
+ let _selectedNode = null;
+ let _refreshInterval = null;
+
+ function setSelectedNode(node) {
+ _selectedNode = node;
+ const display = document.getElementById('selectedNodeDisplay');
+ const haltBtn = document.getElementById('haltNodeBtn');
+ if (display) display.value = node || '';
+ if (haltBtn) haltBtn.disabled = !node;
+
+ document.querySelectorAll('.node-list-item').forEach(el => {
+ el.classList.toggle('node-selected', el.dataset.node === node);
+ });
+ }
+
+ async function fetchNodes() {
+ try {
+ const r = await fetch('/api/ros2/nodes/running');
+ const d = await r.json();
+ renderNodes(d.running_nodes || []);
+ const countEl = document.getElementById('ros-node-count');
+ const updateEl = document.getElementById('ros-node-last-update');
+ if (countEl) countEl.textContent = d.count || 0;
+ if (updateEl) updateEl.textContent = 'updated ' + new Date().toLocaleTimeString();
+ } catch (e) {
+ const el = document.getElementById('ros-node-list');
+ if (el) el.innerHTML = 'Failed to load nodes
';
+ }
+ }
+
+ function renderNodes(nodes) {
+ const el = document.getElementById('ros-node-list');
+ if (!el) return;
+
+ if (nodes.length === 0) {
+ el.innerHTML = 'No running nodes
';
+ return;
+ }
+
+ el.innerHTML = nodes.map(n => `
+
+
+ ${n}
+
+ `).join('');
+
+ el.querySelectorAll('.node-list-item').forEach(item => {
+ item.addEventListener('click', () => setSelectedNode(item.dataset.node));
+ });
+ }
+
+ async function haltNode() {
+ if (!_selectedNode) return;
+ if (!confirm(`Kill node: ${_selectedNode}?`)) return;
+
+ try {
+ const r = await fetch('/api/scenario/halt', { method: 'POST' });
+ await fetchNodes();
+ setSelectedNode(null);
+ } catch (e) {
+ alert('Failed to halt node: ' + e.message);
+ }
+ }
+
+ async function killAllNodes() {
+ if (!confirm('Kill all running ROS2 nodes?')) return;
+ try {
+ await fetch('/api/scenario/halt', { method: 'POST' });
+ await delay(500);
+ await fetchNodes();
+ setSelectedNode(null);
+ } catch (e) {
+ alert('Failed to kill nodes: ' + e.message);
+ }
+ }
+
+ function delay(ms) { return new Promise(r => setTimeout(r, ms)); }
+
+ function init() {
+ document.getElementById('refreshNodesBtn')?.addEventListener('click', fetchNodes);
+ document.getElementById('killAllNodesBtn')?.addEventListener('click', killAllNodes);
+ document.getElementById('haltNodeBtn')?.addEventListener('click', haltNode);
+
+ window.addEventListener('tabchange', e => {
+ if (e.detail.tab === 'ros-task-manager') {
+ fetchNodes();
+ if (!_refreshInterval) _refreshInterval = setInterval(fetchNodes, 5000);
+ } else {
+ if (_refreshInterval) { clearInterval(_refreshInterval); _refreshInterval = null; }
+ }
+ });
+ }
+
+ window.addEventListener('DOMContentLoaded', init);
+})();
diff --git a/tools/adore_api/static/ros_topics.js b/tools/adore_api/static/ros_topics.js
new file mode 100644
index 00000000..0190c7f6
--- /dev/null
+++ b/tools/adore_api/static/ros_topics.js
@@ -0,0 +1,681 @@
+// ── ROS Topics Tab ────────────────────────────────────────────────────────────
+(function () {
+ 'use strict';
+
+ let _selectedTopic = null;
+ let _streamSource = null;
+ let _autoScroll = true;
+ let _pendingLines = [];
+ let _rafPending = false;
+ const MAX_LOG_LINES = 500;
+
+ let _topicDatatypes = {};
+ let _capturedMessages = [];
+
+ let _publishLoopActive = false;
+ let _importedMessages = [];
+ let _importIdx = 0;
+
+ function escHtml(s) {
+ return String(s).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"');
+ }
+
+ function syntaxHighlightJson(obj) {
+ const json = JSON.stringify(obj, null, 2);
+ return json.replace(/(\"(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*\"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, match => {
+ if (/^"/.test(match)) {
+ if (/:$/.test(match)) return `${escHtml(match)} `;
+ return `${escHtml(match)} `;
+ }
+ if (/true|false/.test(match)) return `${match} `;
+ if (/null/.test(match)) return `${match} `;
+ return `${match} `;
+ });
+ }
+
+ // ── Observe log ──────────────────────────────────────────────────────────
+
+ function flushLogLines() {
+ _rafPending = false;
+ if (!_pendingLines.length) return;
+ const log = document.getElementById('rosTopicObserveLog');
+ if (!log) { _pendingLines = []; return; }
+
+ const frag = document.createDocumentFragment();
+ for (const { text, isErr } of _pendingLines) {
+ const div = document.createElement('div');
+ if (isErr) div.style.color = '#f85149';
+ div.textContent = text;
+ frag.appendChild(div);
+ }
+ _pendingLines = [];
+ log.appendChild(frag);
+
+ const excess = log.children.length - MAX_LOG_LINES;
+ if (excess > 0) {
+ const range = document.createRange();
+ range.setStartBefore(log.firstChild);
+ range.setEndBefore(log.children[excess]);
+ range.deleteContents();
+ }
+
+ if (_autoScroll) log.scrollTop = log.scrollHeight;
+ }
+
+ function appendToObserveLog(text, isErr) {
+ _pendingLines.push({ text, isErr });
+ if (!_rafPending) {
+ _rafPending = true;
+ requestAnimationFrame(flushLogLines);
+ }
+ }
+
+ // ── Publish log ──────────────────────────────────────────────────────────
+
+ function appendToPublishLog(text, isErr) {
+ const log = document.getElementById('rosPublishLog');
+ if (!log) return;
+ const div = document.createElement('div');
+ div.style.color = isErr ? '#f85149' : '#3fb950';
+ div.textContent = `[${new Date().toLocaleTimeString()}] ${text}`;
+ log.appendChild(div);
+ const excess = log.children.length - MAX_LOG_LINES;
+ if (excess > 0) {
+ const r = document.createRange();
+ r.setStartBefore(log.firstChild);
+ r.setEndBefore(log.children[excess]);
+ r.deleteContents();
+ }
+ log.scrollTop = log.scrollHeight;
+ }
+
+ // ── Topic list ───────────────────────────────────────────────────────────
+
+ let _allTopics = [];
+ let _allDatatypes = [];
+ let _topicFilter = '';
+
+ function fuzzyMatch(str, query) {
+ if (!query) return true;
+ str = str.toLowerCase(); query = query.toLowerCase();
+ let qi = 0;
+ for (let i = 0; i < str.length && qi < query.length; i++) {
+ if (str[i] === query[qi]) qi++;
+ }
+ return qi === query.length;
+ }
+
+ function renderTopicList() {
+ const listEl = document.getElementById('rosTopicList');
+ if (!listEl) return;
+ const filtered = _allTopics.filter(t => fuzzyMatch(t, _topicFilter));
+ document.getElementById('rosTopicCount').textContent =
+ _topicFilter ? `${filtered.length} / ${_allTopics.length}` : _allTopics.length;
+ if (!filtered.length) {
+ listEl.innerHTML = `${_allTopics.length ? 'No matches' : 'No topics found — is ROS running?'}
`;
+ return;
+ }
+ listEl.innerHTML = filtered.map(t => {
+ const dt = _topicDatatypes[t] ? `${escHtml(_topicDatatypes[t])} ` : '';
+ return `${escHtml(t)}${dt}
`;
+ }).join('');
+ listEl.querySelectorAll('.topic-list-item').forEach(el => {
+ el.addEventListener('click', () => selectTopic(el.dataset.topic, el));
+ });
+ }
+
+ async function loadTopicList() {
+ const listEl = document.getElementById('rosTopicList');
+ if (!listEl) return;
+ listEl.innerHTML = 'Loading...
';
+ try {
+ const r = await fetch('/api/topic/list');
+ const d = await r.json();
+ _allTopics = (d.system_topics || []).sort();
+ _topicDatatypes = d.topic_datatypes || {};
+ _allDatatypes = [...new Set(Object.values(_topicDatatypes).filter(Boolean))].sort();
+ renderTopicList();
+ } catch (e) {
+ listEl.innerHTML = `Error: ${escHtml(String(e))}
`;
+ }
+ // Load full type list in background — does not block the topic list render
+ loadInterfaceTypes();
+ }
+
+ async function loadInterfaceTypes() {
+ try {
+ const r = await fetch('/api/topic/interface_types');
+ const d = await r.json();
+ if (d.types && d.types.length) {
+ const merged = new Set([..._allDatatypes, ...d.types]);
+ _allDatatypes = [...merged].sort();
+ }
+ } catch {}
+ }
+
+ function selectTopic(topic, el) {
+ _selectedTopic = topic;
+ document.querySelectorAll('#rosTopicList .topic-list-item').forEach(i => i.classList.remove('topic-selected'));
+ if (el) el.classList.add('topic-selected');
+
+ const selEl = document.getElementById('rosTopicSelected');
+ if (selEl) selEl.value = topic;
+
+ setVal('rosTopicObserveInput', topic);
+ setVal('rosTopicHzInput', topic);
+ setVal('rosTopicEchoInput', topic);
+ setVal('rosPublishTopicInput', topic);
+
+ const dt = _topicDatatypes[topic] || '';
+ if (dt) setVal('rosPublishDatatypeInput', dt);
+ }
+
+ function setVal(id, val) {
+ const el = document.getElementById(id);
+ if (el) el.value = val;
+ }
+
+ // ── Fuzzy dropdown ───────────────────────────────────────────────────────
+
+ function createTopicDropdown(inputId, dropdownId, getItems, onSelect) {
+ const input = document.getElementById(inputId);
+ const dropdown = document.getElementById(dropdownId);
+ if (!input || !dropdown) return;
+
+ function showDropdown() {
+ const query = input.value.trim();
+ const items = getItems().filter(t => fuzzyMatch(t, query));
+ if (!items.length) { dropdown.style.display = 'none'; return; }
+ dropdown.innerHTML = items.slice(0, 50).map(t => {
+ const dt = _topicDatatypes[t];
+ const dtSpan = dt ? `${escHtml(dt)} ` : '';
+ return `${escHtml(t)}${dtSpan}
`;
+ }).join('');
+ dropdown.querySelectorAll('.topic-dropdown-item').forEach(el => {
+ el.addEventListener('mousedown', e => {
+ e.preventDefault();
+ input.value = el.dataset.value;
+ dropdown.style.display = 'none';
+ if (onSelect) onSelect(el.dataset.value);
+ });
+ });
+ dropdown.style.display = 'block';
+ }
+
+ input.addEventListener('input', showDropdown);
+ input.addEventListener('focus', showDropdown);
+ input.addEventListener('blur', () => setTimeout(() => { dropdown.style.display = 'none'; }, 150));
+ input.addEventListener('keydown', e => {
+ if (e.key === 'Escape') { dropdown.style.display = 'none'; input.blur(); }
+ if (e.key === 'Enter') dropdown.style.display = 'none';
+ });
+ }
+
+ function setupDatatypeDropdown() {
+ const input = document.getElementById('rosPublishDatatypeInput');
+ const dropdown = document.getElementById('rosPublishDatatypeDropdown');
+ if (!input || !dropdown) return;
+
+ function show() {
+ const query = input.value.trim();
+ const items = _allDatatypes.filter(dt => fuzzyMatch(dt, query));
+ if (!items.length) { dropdown.style.display = 'none'; return; }
+ dropdown.innerHTML = items.slice(0, 50).map(dt =>
+ `${escHtml(dt)}
`
+ ).join('');
+ dropdown.querySelectorAll('.topic-dropdown-item').forEach(el => {
+ el.addEventListener('mousedown', e => {
+ e.preventDefault();
+ input.value = el.dataset.value;
+ dropdown.style.display = 'none';
+ });
+ });
+ dropdown.style.display = 'block';
+ }
+
+ input.addEventListener('input', show);
+ input.addEventListener('focus', show);
+ input.addEventListener('blur', () => setTimeout(() => { dropdown.style.display = 'none'; }, 150));
+ input.addEventListener('keydown', e => {
+ if (e.key === 'Escape') { dropdown.style.display = 'none'; input.blur(); }
+ });
+ }
+
+ // ── Stream ───────────────────────────────────────────────────────────────
+
+ function getMaxHz() {
+ const el = document.getElementById('rosObserveMaxHz');
+ const v = el ? parseFloat(el.value) : 10;
+ return isFinite(v) && v > 0 ? Math.min(v, 20) : 10;
+ }
+
+ function startStream(topic) {
+ if (_streamSource) { _streamSource.close(); _streamSource = null; }
+ _pendingLines = [];
+ _capturedMessages = [];
+ const log = document.getElementById('rosTopicObserveLog');
+ if (log) log.innerHTML = '';
+ appendToObserveLog(`[streaming] ${topic} @ max ${getMaxHz()} Hz`, false);
+
+ const url = `/api/topic/stream?topic=${encodeURIComponent(topic)}&max_hz=${getMaxHz()}`;
+ _streamSource = new EventSource(url);
+ _streamSource.onmessage = e => {
+ try {
+ const d = JSON.parse(e.data);
+ if (d.error) { appendToObserveLog('[error] ' + d.error, true); return; }
+ const dropped = d.dropped ? ` \u2946${d.dropped}` : '';
+ const header = `[${d.time}]${dropped}`;
+ const body = d.msg !== undefined ? JSON.stringify(d.msg, null, 2) : (d.text || '');
+ appendToObserveLog(header + '\n' + body, false);
+ if (d.msg !== undefined) _capturedMessages.push(d.msg);
+ } catch { appendToObserveLog(e.data, false); }
+ };
+ _streamSource.onerror = () => appendToObserveLog('[stream disconnected]', true);
+ document.getElementById('rosObserveStopBtn').disabled = false;
+ document.getElementById('rosObserveStartBtn').disabled = true;
+ }
+
+ function stopStream() {
+ if (_streamSource) { _streamSource.close(); _streamSource = null; }
+ appendToObserveLog('[stream stopped]', true);
+ document.getElementById('rosObserveStopBtn').disabled = true;
+ document.getElementById('rosObserveStartBtn').disabled = false;
+ }
+
+ function exportJsonl() {
+ const countEl = document.getElementById('rosExportCount');
+ const count = countEl ? Math.max(1, parseInt(countEl.value) || 10) : 10;
+ const msgs = _capturedMessages.slice(-count);
+ if (!msgs.length) { alert('No messages captured yet — start streaming first.'); return; }
+ const topic = (document.getElementById('rosTopicObserveInput').value.trim() || 'topic').replace(/\//g, '_');
+ const blob = new Blob([msgs.map(m => JSON.stringify(m)).join('\n')], { type: 'application/x-ndjson' });
+ const url = URL.createObjectURL(blob);
+ const a = document.createElement('a');
+ a.href = url; a.download = `${topic}_${Date.now()}.jsonl`; a.click();
+ URL.revokeObjectURL(url);
+ }
+
+ // ── Hz ───────────────────────────────────────────────────────────────────
+
+ async function runHz() {
+ const topic = document.getElementById('rosTopicHzInput').value.trim();
+ if (!topic) return;
+ const out = document.getElementById('rosTopicHzOutput');
+ if (out) out.textContent = 'Running ros2 topic hz -w 10 ...';
+ try {
+ const r = await fetch('/api/topic/hz', {
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ topic }),
+ });
+ const d = await r.json();
+ if (out) out.textContent = d.success ? (d.output || '(no output)') : ('Error: ' + d.message);
+ } catch (e) {
+ if (out) out.textContent = 'Request failed: ' + e;
+ }
+ }
+
+ // ── Echo ─────────────────────────────────────────────────────────────────
+
+ async function echoOnce() {
+ const topic = document.getElementById('rosTopicEchoInput').value.trim();
+ if (!topic) return;
+ const viewer = document.getElementById('rosTopicJsonViewer');
+ if (viewer) viewer.innerHTML = 'Waiting for message... ';
+ try {
+ const r = await fetch('/api/topic/echo', {
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ topic }),
+ });
+ const d = await r.json();
+ if (!d.success) {
+ if (viewer) viewer.innerHTML = `Error: ${escHtml(d.message)} `;
+ return;
+ }
+ if (viewer) {
+ if (d.msg !== undefined) {
+ viewer.innerHTML = syntaxHighlightJson(d.msg);
+ } else if (d.raw) {
+ let parsed = null;
+ try { parsed = JSON.parse(d.raw); } catch {}
+ viewer.innerHTML = parsed !== null ? syntaxHighlightJson(parsed) : escHtml(d.raw);
+ }
+ }
+ } catch (e) {
+ if (viewer) viewer.innerHTML = `Request failed: ${escHtml(String(e))} `;
+ }
+ }
+
+ // ── Publish editor (CodeMirror) ──────────────────────────────────────────
+
+ let _publishEditor = null;
+
+ function initPublishEditor() {
+ const container = document.getElementById('rosPublishEditorContainer');
+ if (!container || _publishEditor) return;
+ try {
+ _publishEditor = CodeMirror(container, {
+ mode: { name: 'javascript', json: true },
+ theme: 'monokai',
+ lineNumbers: true,
+ matchBrackets: true,
+ autoCloseBrackets: true,
+ indentUnit: 2,
+ tabSize: 2,
+ lineWrapping: false,
+ value: '{}'
+ });
+ // Resize the CodeMirror wrapper to fill container
+ _publishEditor.setSize('100%', '100%');
+ _publishEditor.on('change', () => {
+ try {
+ JSON.parse(_publishEditor.getValue());
+ setEditorError('');
+ } catch (e) {
+ setEditorError(e.message);
+ }
+ });
+ setTimeout(() => _publishEditor && _publishEditor.refresh(), 200);
+ } catch (e) {
+ console.warn('CodeMirror init failed for publish editor:', e);
+ }
+ }
+
+ function getEditorValue() {
+ return _publishEditor ? _publishEditor.getValue() : (document.getElementById('rosPublishEditorContainer')?.textContent || '{}');
+ }
+
+ function setEditorValue(val) {
+ if (_publishEditor) {
+ _publishEditor.setValue(val);
+ _publishEditor.refresh();
+ }
+ }
+
+ function setEditorError(msg) {
+ const el = document.getElementById('rosPublishEditorError');
+ if (el) el.textContent = msg || '';
+ }
+
+ function parseEditor() {
+ try {
+ const val = JSON.parse(getEditorValue());
+ setEditorError('');
+ return val;
+ } catch (e) {
+ setEditorError('JSON parse error: ' + e.message);
+ return null;
+ }
+ }
+
+ async function loadProtoTemplate() {
+ const datatype = document.getElementById('rosPublishDatatypeInput').value.trim();
+ if (!datatype) { setEditorError('Enter a datatype first'); return; }
+ try {
+ const r = await fetch('/api/topic/empty_message', {
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ datatype }),
+ });
+ const d = await r.json();
+ if (!d.success) { setEditorError(d.message); return; }
+ const msg = d.msg;
+ if (msg === null || msg === undefined || typeof msg !== 'object' || Array.isArray(msg)) {
+ setEditorError('Backend returned unexpected format — check ros2tools installation');
+ appendToPublishLog(`Template load failed for ${datatype}: unexpected response type`, true);
+ return;
+ }
+ setEditorValue(JSON.stringify(msg, null, 2));
+ setEditorError('');
+ appendToPublishLog(`Loaded template for ${datatype}`, false);
+ } catch (e) {
+ setEditorError('Request failed: ' + e);
+ }
+ }
+
+ const _META_KEYS = new Set(['topic', 'datatype', 'WARNING', 'WARN', 'ERROR', 'INFO', 'DEBUG']);
+
+ function stripMessageMeta(msg) {
+ if (!msg || typeof msg !== 'object' || Array.isArray(msg)) return msg;
+ const out = {};
+ for (const [k, v] of Object.entries(msg)) {
+ if (!_META_KEYS.has(k)) out[k] = v;
+ }
+ return out;
+ }
+
+ async function doPublish(data, topic, datatype, frequency) {
+ const r = await fetch('/api/topic/publish_timed', {
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ topic, datatype: datatype || undefined, data: stripMessageMeta(data), frequency: frequency || 0 }),
+ });
+ return r.json();
+ }
+
+ async function publishOnce() {
+ const topic = document.getElementById('rosPublishTopicInput').value.trim();
+ const datatype = document.getElementById('rosPublishDatatypeInput').value.trim();
+ const data = parseEditor();
+ if (!topic) { setEditorError('Topic required'); return; }
+ if (data === null) return;
+ try {
+ const d = await doPublish(data, topic, datatype, 0);
+ appendToPublishLog(d.success ? `Published to ${d.topic} [${d.datatype}]` : `Error: ${d.message}`, !d.success);
+ } catch (e) { appendToPublishLog('Request failed: ' + e, true); }
+ }
+
+ async function startPublishLoop() {
+ const topic = document.getElementById('rosPublishTopicInput').value.trim();
+ const datatype = document.getElementById('rosPublishDatatypeInput').value.trim();
+ const freq = parseFloat(document.getElementById('rosPublishFreqInput').value) || 1;
+ const data = parseEditor();
+ if (!topic) { setEditorError('Topic required'); return; }
+ if (data === null) return;
+ try {
+ const d = await doPublish(data, topic, datatype, freq);
+ if (d.success) {
+ setPublishLoopUI(true);
+ startStatusPoll(topic);
+ appendToPublishLog(`Started persistent publisher on ${d.topic} at ${freq} Hz [${d.datatype}]`, false);
+ } else {
+ appendToPublishLog(`Error: ${d.message}`, true);
+ }
+ } catch (e) { appendToPublishLog('Request failed: ' + e, true); }
+ }
+
+ async function stopPublishLoop() {
+ const topic = document.getElementById('rosPublishTopicInput').value.trim();
+ if (!topic) return;
+ try {
+ await fetch('/api/topic/publish_timed', {
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ topic, action: 'stop', data: {} }),
+ });
+ } catch {}
+ setPublishLoopUI(false);
+ stopStatusPoll();
+ appendToPublishLog(`Stopped loop on ${topic}`, false);
+ }
+
+ function handleImportFile(file) {
+ const reader = new FileReader();
+ reader.onload = e => {
+ const lines = e.target.result.split('\n').filter(l => l.trim());
+ _importedMessages = [];
+ for (const line of lines) {
+ try { _importedMessages.push(JSON.parse(line)); } catch {}
+ }
+ _importIdx = 0;
+ updateImportUI();
+ if (_importedMessages.length) {
+ setEditorValue(JSON.stringify(_importedMessages[0], null, 2));
+ appendToPublishLog(`Imported ${_importedMessages.length} messages from ${file.name}`, false);
+ }
+ };
+ reader.readAsText(file);
+ }
+
+ function updateImportUI() {
+ const container = document.getElementById('rosPublishImportList');
+ if (!container) return;
+ if (_importedMessages.length) {
+ container.style.display = 'block';
+ const cEl = document.getElementById('rosPublishImportCount');
+ const iEl = document.getElementById('rosPublishImportIdx');
+ if (cEl) cEl.textContent = _importedMessages.length;
+ if (iEl) iEl.textContent = _importIdx + 1;
+ } else {
+ container.style.display = 'none';
+ }
+ }
+
+ function navImport(dir) {
+ if (!_importedMessages.length) return;
+ _importIdx = (_importIdx + dir + _importedMessages.length) % _importedMessages.length;
+ updateImportUI();
+ setEditorValue(JSON.stringify(_importedMessages[_importIdx], null, 2));
+ }
+
+ let _statusPollTimer = null;
+
+ function startStatusPoll(topic) {
+ stopStatusPoll();
+ _statusPollTimer = setInterval(async () => {
+ try {
+ const r = await fetch('/api/topic/publish_status');
+ const d = await r.json();
+ if (!d.active || !d.active[topic]) {
+ appendToPublishLog(`[status] Session on ${topic} ended`, false);
+ setPublishLoopUI(false);
+ stopStatusPoll();
+ }
+ } catch {}
+ }, 2000);
+ }
+
+ function stopStatusPoll() {
+ if (_statusPollTimer) { clearInterval(_statusPollTimer); _statusPollTimer = null; }
+ }
+
+ function setPublishLoopUI(active) {
+ _publishLoopActive = active;
+ document.getElementById('rosPublishStartBtn').disabled = active;
+ document.getElementById('rosPublishStopBtn').disabled = !active;
+ const replayBtn = document.getElementById('rosPublishImportReplayBtn');
+ const replayStop = document.getElementById('rosPublishImportStopBtn');
+ if (replayBtn) replayBtn.disabled = active;
+ if (replayStop) replayStop.disabled = !active;
+ }
+
+ async function replayImported() {
+ if (!_importedMessages.length) return;
+ const topic = document.getElementById('rosPublishTopicInput').value.trim();
+ const datatype = document.getElementById('rosPublishDatatypeInput').value.trim();
+ const freq = parseFloat(document.getElementById('rosPublishFreqInput').value) || 1;
+ const loop = document.getElementById('rosPublishLoopReplay')?.checked || false;
+ if (!topic) { setEditorError('Topic required'); return; }
+
+ const messages = _importedMessages.map(stripMessageMeta);
+ try {
+ const r = await fetch('/api/topic/publish_batch', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ topic, datatype: datatype || undefined, messages, frequency: freq, loop }),
+ });
+ const d = await r.json();
+ if (d.success) {
+ appendToPublishLog(`Batch started: ${d.messages} messages @ ${d.frequency} Hz${loop ? ' (looping)' : ''}`, false);
+ setPublishLoopUI(true);
+ startStatusPoll(topic);
+ } else {
+ appendToPublishLog(`Error: ${d.message}`, true);
+ }
+ } catch (e) {
+ appendToPublishLog('Request failed: ' + e, true);
+ }
+ }
+
+ async function stopReplay() {
+ const topic = document.getElementById('rosPublishTopicInput').value.trim();
+ if (!topic) return;
+ await fetch('/api/topic/publish_timed', {
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ topic, action: 'stop', data: {} }),
+ });
+ setPublishLoopUI(false);
+ stopStatusPoll();
+ appendToPublishLog(`Stopped batch on ${topic}`, false);
+ }
+
+ // ── Init ─────────────────────────────────────────────────────────────────
+
+ function init() {
+ document.getElementById('rosTopicRefreshBtn')?.addEventListener('click', loadTopicList);
+ document.getElementById('rosObserveStartBtn')?.addEventListener('click', () => {
+ const t = document.getElementById('rosTopicObserveInput').value.trim();
+ if (t) startStream(t);
+ });
+ document.getElementById('rosObserveStopBtn')?.addEventListener('click', stopStream);
+ document.getElementById('rosTopicHzBtn')?.addEventListener('click', runHz);
+ document.getElementById('rosTopicEchoBtn')?.addEventListener('click', echoOnce);
+ document.getElementById('rosObserveAutoScroll')?.addEventListener('change', e => { _autoScroll = e.target.checked; });
+ document.getElementById('rosExportJsonlBtn')?.addEventListener('click', exportJsonl);
+
+ document.getElementById('rosObserveMaxHz')?.addEventListener('change', () => {
+ if (_streamSource) {
+ const topic = document.getElementById('rosTopicObserveInput').value.trim();
+ if (topic) startStream(topic);
+ }
+ });
+
+ document.getElementById('rosTopicSearch')?.addEventListener('input', e => {
+ _topicFilter = e.target.value;
+ renderTopicList();
+ });
+
+ // Publish
+ document.getElementById('rosPublishLoadProtoBtn')?.addEventListener('click', loadProtoTemplate);
+ document.getElementById('rosPublishOnceBtn')?.addEventListener('click', publishOnce);
+ document.getElementById('rosPublishStartBtn')?.addEventListener('click', startPublishLoop);
+ document.getElementById('rosPublishStopBtn')?.addEventListener('click', stopPublishLoop);
+ document.getElementById('rosPublishClearLogBtn')?.addEventListener('click', () => {
+ const log = document.getElementById('rosPublishLog');
+ if (log) log.innerHTML = '';
+ });
+ document.getElementById('rosPublishImportFile')?.addEventListener('change', e => {
+ if (e.target.files[0]) handleImportFile(e.target.files[0]);
+ e.target.value = '';
+ });
+ document.getElementById('rosPublishImportPrevBtn')?.addEventListener('click', () => navImport(-1));
+ document.getElementById('rosPublishImportNextBtn')?.addEventListener('click', () => navImport(1));
+ document.getElementById('rosPublishImportClearBtn')?.addEventListener('click', () => {
+ _importedMessages = []; _importIdx = 0; updateImportUI();
+ });
+ document.getElementById('rosPublishImportReplayBtn')?.addEventListener('click', replayImported);
+ document.getElementById('rosPublishImportStopBtn')?.addEventListener('click', stopReplay);
+
+ document.getElementById('rosPublishTopicInput')?.addEventListener('change', e => {
+ const dt = _topicDatatypes[e.target.value.trim()];
+ if (dt) setVal('rosPublishDatatypeInput', dt);
+ });
+
+ // Fuzzy dropdowns
+ createTopicDropdown('rosTopicObserveInput', 'rosObserveDropdown', () => _allTopics, null);
+ createTopicDropdown('rosTopicHzInput', 'rosHzDropdown', () => _allTopics, null);
+ createTopicDropdown('rosTopicEchoInput', 'rosEchoDropdown', () => _allTopics, null);
+ createTopicDropdown('rosPublishTopicInput', 'rosPublishTopicDropdown', () => _allTopics, topic => {
+ const dt = _topicDatatypes[topic];
+ if (dt) setVal('rosPublishDatatypeInput', dt);
+ });
+ setupDatatypeDropdown();
+
+ // Init CodeMirror editor when Publish tab is clicked (deferred so container is visible)
+ document.querySelector('[data-logtab="ros-topics-publish"]')?.addEventListener('click', () => {
+ setTimeout(initPublishEditor, 50);
+ });
+
+ window.addEventListener('tabchange', e => {
+ if (e.detail.tab === 'ros-topics') loadTopicList();
+ });
+ }
+
+ window.addEventListener('DOMContentLoaded', init);
+})();
diff --git a/tools/adore_api/static/ros_workspace.js b/tools/adore_api/static/ros_workspace.js
new file mode 100644
index 00000000..2977b194
--- /dev/null
+++ b/tools/adore_api/static/ros_workspace.js
@@ -0,0 +1,323 @@
+// ── ROS Workspace Tab ─────────────────────────────────────────────────────────
+(function () {
+ 'use strict';
+
+ let _logSource = null;
+ let _autoScroll = true;
+ let _packages = [];
+ let _pkgFilter = '';
+ let _autoRebuildEnabled = false; // global toggle
+ let _autoRebuildPkgs = new Set(); // per-package opt-in
+ let _autoRebuildTimer = null;
+ let _rebuilding = new Set(); // currently building via auto-rebuild
+
+ const AUTO_REBUILD_INTERVAL_MS = 5000;
+
+ function escHtml(s) {
+ return String(s).replace(/&/g, '&').replace(//g, '>');
+ }
+
+ function appendLog(text, isErr) {
+ const log = document.getElementById('wsLogContainer');
+ if (!log) return;
+ const line = document.createElement('div');
+ if (isErr) line.style.color = '#f85149';
+ line.textContent = text;
+ log.appendChild(line);
+ if (_autoScroll) log.scrollTop = log.scrollHeight;
+ while (log.children.length > 5000) log.removeChild(log.firstChild);
+ }
+
+ function connectLogStream() {
+ if (_logSource) return;
+ _logSource = new EventSource('/api/ros_workspace/log/stream');
+ _logSource.onmessage = e => {
+ try {
+ const d = JSON.parse(e.data);
+ appendLog(d.text, d.stream === 'stderr');
+ } catch { appendLog(e.data, false); }
+ };
+ }
+
+ async function loadStatus() {
+ const grid = document.getElementById('wsStatusGrid');
+ if (!grid) return;
+ try {
+ const r = await fetch('/api/ros_workspace/status');
+ const d = await r.json();
+ const builtPkgs = d.built_packages ?? '?';
+ const totalPkgs = d.total_packages ?? '?';
+ const pkgOk = typeof d.built_packages === 'number' && d.built_packages === d.total_packages;
+ grid.innerHTML = `
+ Workspace dir ${escHtml(d.workspace_dir)}
+ Workspace exists ${d.workspace_exists ? '✓' : '✗'}
+ Makefile ${d.makefile_exists ? '✓ found' : '✗ not found'}
+ build/ ${d.build_dir_exists ? '✓ exists' : '✗ missing'}
+ install/ ${d.install_dir_exists ? '✓ exists' : '✗ missing'}
+ Packages built ${builtPkgs} / ${totalPkgs}
+ make clean ${d.running?.clean ? '⟳ running' : 'idle'}
+ make build ${d.running?.build ? '⟳ running' : 'idle'}
+ `;
+ const cleanBtn = document.getElementById('wsCleanBtn');
+ const buildBtn = document.getElementById('wsBuildBtn');
+ if (cleanBtn) cleanBtn.disabled = !!(d.running?.clean || d.running?.build);
+ if (buildBtn) buildBtn.disabled = !!(d.running?.clean || d.running?.build);
+ } catch (e) {
+ grid.innerHTML = `Failed to load status: ${escHtml(String(e))} `;
+ }
+ }
+
+ async function loadPackages() {
+ const el = document.getElementById('wsPackageList');
+ if (!el) return;
+ try {
+ const r = await fetch('/api/ros_workspace/packages');
+ const d = await r.json();
+ _packages = d.packages || [];
+ // Remove auto-rebuild for newly discovered unknown packages
+ _packages.filter(p => p.colcon_unknown).forEach(p => _autoRebuildPkgs.delete(p.name));
+ renderPackages();
+ } catch (e) {
+ el.innerHTML = `Error: ${escHtml(String(e))}
`;
+ }
+ }
+
+ function fuzzyMatch(str, query) {
+ if (!query) return true;
+ str = str.toLowerCase(); query = query.toLowerCase();
+ let qi = 0;
+ for (let i = 0; i < str.length && qi < query.length; i++) {
+ if (str[i] === query[qi]) qi++;
+ }
+ return qi === query.length;
+ }
+
+ function renderPackages() {
+ const el = document.getElementById('wsPackageList');
+ if (!el) return;
+ const q = _pkgFilter.toLowerCase();
+ const filtered = _packages.filter(p => fuzzyMatch(p.name, q));
+ const total = document.getElementById('wsPkgCount');
+ if (total) total.textContent = _pkgFilter ? `${filtered.length} / ${_packages.length}` : _packages.length;
+ if (!filtered.length) {
+ el.innerHTML = `${_packages.length ? 'No matches' : 'No packages found in src/'}
`;
+ return;
+ }
+ el.innerHTML = filtered.map(p => {
+ const indClass = !p.built ? 'pkg-not-built' : p.stale ? 'pkg-stale' : 'pkg-built';
+ const indTitle = !p.built ? 'Not built' : p.stale ? 'Built but source has changed' : 'Built and up to date';
+ const unknown = p.colcon_unknown;
+ const autoChecked = _autoRebuildPkgs.has(p.name) && !unknown ? 'checked' : '';
+ const autoDisabled = unknown ? 'disabled title="colcon cannot find this package"' : '';
+ const rebuildingClass = _rebuilding.has(p.name) ? ' pkg-rebuilding' : '';
+ return `
+
+ ${escHtml(p.name)}
+
+
+ Auto
+
+ Build
+
`;
+ }).join('');
+ el.querySelectorAll('.pkg-build-btn').forEach(btn => {
+ btn.addEventListener('click', () => buildPackage(btn.dataset.pkg));
+ });
+ el.querySelectorAll('.pkg-auto-cb').forEach(cb => {
+ cb.addEventListener('change', e => {
+ const pkg = e.target.dataset.pkg;
+ if (e.target.checked) _autoRebuildPkgs.add(pkg);
+ else _autoRebuildPkgs.delete(pkg);
+ });
+ });
+ }
+
+ async function buildPackage(pkg, isAuto = false) {
+ if (_rebuilding.has(pkg)) return;
+ _rebuilding.add(pkg);
+ if (isAuto) appendLog(`[auto-rebuild] ${pkg}`, false);
+ try {
+ const r = await fetch('/api/ros_workspace/build_package', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ package: pkg }),
+ });
+ const d = await r.json();
+ if (!d.success) {
+ appendLog(`Error: ${d.message}`, true);
+ _rebuilding.delete(pkg);
+ return;
+ }
+ const key = `__pkg__${pkg}`;
+ const poll = setInterval(async () => {
+ try {
+ const sr = await fetch('/api/ros_workspace/status').then(r => r.json());
+ if (!sr.running?.[key]) {
+ clearInterval(poll);
+ _rebuilding.delete(pkg);
+ loadPackages();
+ renderPackages();
+ }
+ } catch { clearInterval(poll); _rebuilding.delete(pkg); }
+ }, 2000);
+ } catch (e) {
+ appendLog(`Request failed: ${e}`, true);
+ _rebuilding.delete(pkg);
+ }
+ renderPackages();
+ }
+
+ function runAutoRebuildCheck() {
+ if (!_autoRebuildEnabled) return;
+ _packages.forEach(p => {
+ if (p.stale && !p.colcon_unknown && _autoRebuildPkgs.has(p.name) && !_rebuilding.has(p.name)) {
+ buildPackage(p.name, true);
+ }
+ });
+ }
+
+ function setAutoRebuild(enabled) {
+ _autoRebuildEnabled = enabled;
+ if (enabled) {
+ // Refresh package list immediately then start polling
+ loadPackages();
+ _autoRebuildTimer = setInterval(async () => {
+ await loadPackages();
+ runAutoRebuildCheck();
+ }, AUTO_REBUILD_INTERVAL_MS);
+ } else {
+ if (_autoRebuildTimer) { clearInterval(_autoRebuildTimer); _autoRebuildTimer = null; }
+ }
+ }
+
+ async function runMake(target) {
+ const r = await fetch(`/api/ros_workspace/${target}`, { method: 'POST' });
+ const d = await r.json();
+ appendLog(d.success ? `[${target}] started` : `[${target}] error: ${d.message}`, !d.success);
+ setTimeout(loadStatus, 500);
+ const poll = setInterval(() => {
+ loadStatus();
+ fetch('/api/ros_workspace/status').then(r => r.json()).then(d => {
+ if (!d.running?.[target]) { clearInterval(poll); loadPackages(); }
+ }).catch(() => clearInterval(poll));
+ }, 2000);
+ }
+
+ // ── CCache ───────────────────────────────────────────────────────────────
+
+ function escHtml(s) {
+ return String(s).replace(/&/g, '&').replace(//g, '>');
+ }
+
+ function renderCcacheStats(raw) {
+ const el = document.getElementById('ccacheStats');
+ if (!el) return;
+
+ const lines = raw.split('\n');
+ let html = '';
+
+ const BAR_KEYS = ['Cacheable calls', 'Hits', 'Direct', 'Preprocessed', 'Misses',
+ 'Uncacheable calls', 'Cache size'];
+
+ for (const line of lines) {
+ if (!line.trim()) continue;
+ const isHeader = line.match(/^[A-Z]/) && !line.includes(':');
+ const isSection = line.trim().match(/^[A-Za-z]/) && !line.includes('%') && line.endsWith(':');
+
+ if (isSection) {
+ html += `${escHtml(line)} `;
+ continue;
+ }
+
+ const m = line.match(/^(.*?):\s+(.*)$/);
+ if (!m) continue;
+ const [, key, val] = m;
+ const keyTrimmed = key.trim();
+
+ // Extract percentage for progress bar
+ const pct = val.match(/\((\d+(?:\.\d+)?)%\)/);
+ const showBar = pct && BAR_KEYS.some(k => keyTrimmed.includes(k));
+ const pctVal = pct ? parseFloat(pct[1]) : 0;
+
+ const indent = key.match(/^(\s+)/) ? key.match(/^(\s+)/)[1].length * 2 : 0;
+
+ let valHtml = `${escHtml(val)} `;
+ if (showBar) {
+ const barColor = pctVal > 70 ? '#3fb950' : pctVal > 40 ? '#d29922' : '#f85149';
+ valHtml = ``;
+ }
+
+ html += `
+ ${escHtml(keyTrimmed)}
+ ${valHtml}
+ `;
+ }
+ html += '
';
+ el.innerHTML = html;
+ }
+
+ async function loadCcacheStats() {
+ const status = document.getElementById('ccacheStatus');
+ const statsEl = document.getElementById('ccacheStats');
+ if (status) status.textContent = 'Loading…';
+ if (statsEl) statsEl.innerHTML = '';
+ try {
+ const r = await fetch('/api/ros_workspace/ccache/stats');
+ const d = await r.json();
+ if (!d.available) {
+ if (status) status.textContent = d.message || 'ccache not available';
+ return;
+ }
+ if (status) status.textContent = '';
+ renderCcacheStats(d.raw);
+ } catch (e) {
+ if (status) status.textContent = 'Error: ' + e;
+ }
+ }
+
+ async function clearCcache() {
+ const btn = document.getElementById('ccacheClearBtn');
+ if (btn) { btn.disabled = true; btn.textContent = 'Clearing…'; }
+ try {
+ const r = await fetch('/api/ros_workspace/ccache/clear', { method: 'POST' });
+ const d = await r.json();
+ const status = document.getElementById('ccacheStatus');
+ if (status) status.textContent = d.success ? (d.message || 'Cache cleared') : ('Error: ' + d.message);
+ if (d.success) await loadCcacheStats();
+ } catch (e) {
+ const status = document.getElementById('ccacheStatus');
+ if (status) status.textContent = 'Error: ' + e;
+ } finally {
+ if (btn) { btn.disabled = false; btn.textContent = '🗑 Clear Cache'; }
+ }
+ }
+
+ function init() {
+ document.getElementById('wsRefreshBtn')?.addEventListener('click', () => { loadStatus(); loadPackages(); });
+ document.getElementById('wsCleanBtn')?.addEventListener('click', () => runMake('clean'));
+ document.getElementById('wsBuildBtn')?.addEventListener('click', () => runMake('build'));
+ document.getElementById('wsClearLogBtn')?.addEventListener('click', () => {
+ const log = document.getElementById('wsLogContainer');
+ if (log) log.innerHTML = '';
+ });
+ document.getElementById('wsAutoScroll')?.addEventListener('change', e => { _autoScroll = e.target.checked; });
+ document.getElementById('wsPkgSearch')?.addEventListener('input', e => { _pkgFilter = e.target.value; renderPackages(); });
+ document.getElementById('wsAutoRebuildToggle')?.addEventListener('change', e => setAutoRebuild(e.target.checked));
+ document.getElementById('ccacheRefreshBtn')?.addEventListener('click', loadCcacheStats);
+ document.getElementById('ccacheClearBtn')?.addEventListener('click', clearCcache);
+
+ // Load ccache stats when tab is clicked
+ document.querySelector('[data-logtab="ws-ccache-panel"]')?.addEventListener('click', loadCcacheStats);
+
+ window.addEventListener('tabchange', e => {
+ if (e.detail.tab === 'ros-workspace') { loadStatus(); loadPackages(); connectLogStream(); }
+ });
+ }
+
+ window.addEventListener('DOMContentLoaded', init);
+})();
diff --git a/tools/adore_api/static/scenario_manager.js b/tools/adore_api/static/scenario_manager.js
new file mode 100644
index 00000000..fb6c545b
--- /dev/null
+++ b/tools/adore_api/static/scenario_manager.js
@@ -0,0 +1,367 @@
+// ── Scenario Manager ──────────────────────────────────────────────────────────
+(function () {
+ 'use strict';
+
+ let _codeEditor = null;
+ let _usingTextarea = false;
+ let _currentStatus = 'idle';
+ let _isEditingLoop = false;
+ let _loopDebounce = null;
+
+ const DEFAULT_LAUNCH = `from launch import LaunchDescription
+import os, sys
+base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+if base_dir not in sys.path:
+ sys.path.insert(0, base_dir)
+from scenario_helpers.simulated_vehicle import create_simulated_vehicle_nodes, Position
+from scenario_helpers.visualizer import create_visualization_nodes
+
+start_position = Position(lat_long=(52.314562, 10.560474), psi=0.0)
+goal_position = Position(lat_long=(52.313533, 10.560554))
+
+def generate_launch_description():
+ launch_file_dir = os.path.dirname(os.path.realpath(__file__))
+ map_image_folder = os.path.abspath(os.path.join(launch_file_dir, "../assets/maps/"))
+ map_folder = os.path.abspath(os.path.join(launch_file_dir, "../assets/tracks/"))
+ vehicle_param = os.path.abspath(os.path.join(launch_file_dir, "../assets/vehicle_params/"))
+ map_file = map_folder + "/de_bs_borders_wfs.r2sr"
+ vehicle_model_file = vehicle_param + "/NGC.json"
+
+ return LaunchDescription([
+ *create_visualization_nodes(
+ whitelist=["ego_vehicle"],
+ asset_folder=map_image_folder,
+ use_center_ego=True
+ ),
+ *create_simulated_vehicle_nodes(
+ namespace="ego_vehicle",
+ start_position=start_position,
+ goal_position=goal_position,
+ map_file=map_file,
+ model_file=vehicle_model_file,
+ controllable=True,
+ optinlc_route_following=True,
+ v2x_id=0, vehicle_id=0,
+ controller=1, debug=False, composable=False
+ )
+ ])
+`;
+
+ function editorValue() {
+ if (_usingTextarea) return document.getElementById('scenarioTextarea').value;
+ return _codeEditor ? _codeEditor.getValue() : '';
+ }
+
+ function setEditorValue(v) {
+ if (_usingTextarea) { document.getElementById('scenarioTextarea').value = v; return; }
+ if (_codeEditor) _codeEditor.setValue(v);
+ }
+
+ function initEditor() {
+ try {
+ _codeEditor = CodeMirror(document.getElementById('codeEditor'), {
+ mode: 'python',
+ theme: 'monokai',
+ lineNumbers: true,
+ matchBrackets: true,
+ autoCloseBrackets: true,
+ indentUnit: 4,
+ indentWithTabs: false,
+ lineWrapping: true,
+ tabSize: 4,
+ value: DEFAULT_LAUNCH
+ });
+ setTimeout(() => _codeEditor && _codeEditor.refresh(), 150);
+ } catch (e) {
+ console.warn('CodeMirror init failed, falling back to textarea', e);
+ document.querySelector('.code-editor-container').style.display = 'none';
+ const ta = document.getElementById('scenarioTextarea');
+ ta.style.display = 'block';
+ ta.value = DEFAULT_LAUNCH;
+ _usingTextarea = true;
+ }
+ }
+
+ async function loadScenarios() {
+ try {
+ const r = await fetch('/api/scenario/get');
+ const d = await r.json();
+ window.FuzzyFinder.setScenarios(d.scenarios || []);
+ } catch (e) {
+ console.error('loadScenarios:', e);
+ }
+ }
+
+ async function startScenario() {
+ const scenario = window.FuzzyFinder.getSelectedScenario();
+ if (!scenario) { alert('Select a scenario first.'); return; }
+
+ if (_currentStatus === 'running') {
+ if (!confirm('A scenario is running. Halt it and start the selected one?')) return;
+ await fetch('/api/scenario/halt', { method: 'POST' });
+ await delay(2000);
+ }
+
+ const r = await fetch('/api/scenario/start', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ scenario,
+ is_file: true,
+ model_check_enabled: document.getElementById('modelCheckEnabled').checked,
+ model_check_config: document.getElementById('modelCheckConfig').value
+ })
+ });
+ const result = await r.json();
+ if (!result.success) alert(result.message);
+ }
+
+ async function restartScenario() {
+ const r = await fetch('/api/scenario/restart', { method: 'POST' });
+ const result = await r.json();
+ if (!result.success) alert(result.message);
+ }
+
+ async function haltAll() {
+ if (!confirm('Halt all ROS2 processes?')) return;
+ const r = await fetch('/api/scenario/halt', { method: 'POST' });
+ const result = await r.json();
+ if (!result.success) alert(result.message);
+ }
+
+ async function runFromEditor() {
+ const content = editorValue().trim();
+ if (!content) { alert('Editor is empty.'); return; }
+
+ if (_currentStatus === 'running') {
+ if (!confirm('A scenario is running. Replace it with the editor content?')) return;
+ await fetch('/api/scenario/halt', { method: 'POST' });
+ await delay(2000);
+ }
+
+ const r = await fetch('/api/scenario/start', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ scenario: content,
+ is_file: false,
+ model_check_enabled: document.getElementById('modelCheckEnabled').checked,
+ model_check_config: document.getElementById('modelCheckConfig').value
+ })
+ });
+ const result = await r.json();
+ if (!result.success) alert(result.message);
+ }
+
+ async function saveScenario() {
+ const name = document.getElementById('scenarioName').value.trim();
+ const content = editorValue().trim();
+ if (!name || !content) { alert('Enter scenario name and editor content.'); return; }
+
+ const r = await fetch('/api/scenario/save', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ name, content })
+ });
+ const result = await r.json();
+ alert(result.message);
+ if (result.success) { document.getElementById('scenarioName').value = ''; loadScenarios(); }
+ }
+
+ async function copySelected() {
+ const scenario = window.FuzzyFinder.getSelectedScenario();
+ if (!scenario) { alert('Select a scenario first.'); return; }
+
+ const r = await fetch(`/api/scenario/content/${encodeURIComponent(scenario)}`);
+ const result = await r.json();
+ if (result.success) {
+ setEditorValue(result.content);
+ } else {
+ alert(result.message || 'Failed to copy scenario.');
+ }
+ }
+
+ async function toggleLoopMode() {
+ if (_isEditingLoop) return;
+ await fetch('/api/scenario/loop', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ enabled: document.getElementById('loopMode').checked,
+ delay: parseInt(document.getElementById('loopDelay').value) || 0,
+ runtime: parseInt(document.getElementById('loopRuntime').value) || 60,
+ model_check_enabled: document.getElementById('modelCheckEnabled').checked,
+ model_check_config: document.getElementById('modelCheckConfig').value
+ })
+ });
+ }
+
+ async function updateStatus() {
+ try {
+ const r = await fetch('/api/scenario/status');
+ const s = await r.json();
+ _currentStatus = s.status;
+
+ const ind = document.getElementById('globalStatusIndicator');
+ const txt = document.getElementById('globalStatusText');
+ if (ind) ind.className = `status-indicator status-${s.status}`;
+ let label = s.status.toUpperCase();
+ if (s.scenario) label += ` — ${s.scenario}`;
+ if (s.runtime) label += ` (${Math.round(s.runtime)}s)`;
+ if (s.waiting_for_model_check) label += ' · awaiting model check';
+ if (txt) txt.textContent = label;
+
+ if (!_isEditingLoop) {
+ document.getElementById('loopMode').checked = s.loop_mode;
+ document.getElementById('loopDelay').value = s.loop_delay;
+ document.getElementById('loopRuntime').value = s.default_runtime;
+ document.getElementById('modelCheckEnabled').checked = s.model_check_enabled !== false;
+ document.getElementById('modelCheckConfig').value = s.model_check_config || 'config/default.yaml';
+ }
+
+ const startBtn = document.getElementById('startBtn');
+ const restartBtn = document.getElementById('restartBtn');
+ const runCustomBtn = document.getElementById('runCustomBtn');
+ const isRunning = s.status === 'running';
+ if (startBtn) startBtn.disabled = isRunning;
+ if (restartBtn) restartBtn.disabled = !isRunning;
+ if (runCustomBtn) {
+ runCustomBtn.textContent = isRunning ? '▶ Replace Running' : '▶ Run from Editor';
+ runCustomBtn.className = isRunning ? 'btn-warning' : 'btn-success';
+ }
+ } catch (e) { /* network */ }
+ }
+
+ let _lastLogContent = '';
+
+ async function updateLog() {
+ try {
+ const r = await fetch('/api/scenario/output?lines=200');
+ const d = await r.json();
+ const el = document.getElementById('scenarioLogContainer');
+ if (!el) return;
+ const text = d.output || '';
+ if (text === _lastLogContent) return;
+ _lastLogContent = text;
+ // Only update DOM content if autoscroll is on, or user is already
+ // at the bottom — avoids yanking the viewport during copy/select.
+ const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40;
+ const shouldScroll = document.getElementById('autoScrollScenario')?.checked;
+ if (shouldScroll || atBottom) {
+ el.textContent = text;
+ if (shouldScroll) el.scrollTop = el.scrollHeight;
+ } else {
+ // Append only new lines so existing selection is not destroyed
+ const newText = text.slice(_lastRenderedLength ?? 0);
+ if (newText) el.textContent += newText;
+ }
+ _lastRenderedLength = text.length;
+ } catch (e) { /* network */ }
+ }
+
+ async function updateStoredPositions() {
+ try {
+ const r = await fetch('/api/positions/get');
+ const positions = await r.json();
+ const el = document.getElementById('storedPositionsInfo');
+ if (!el) return;
+
+ if (!positions.start && !positions.goal) {
+ el.innerHTML = 'No positions stored
';
+ return;
+ }
+
+ let html = '';
+ if (positions.start) {
+ const { lat, lng, psi, utm } = positions.start;
+ html += `
+ 🟢 Start
+ ${lat.toFixed(6)}, ${lng.toFixed(6)} | ψ=${(psi||0).toFixed(3)} rad
+ Position(lat_long=(${lat.toFixed(6)}, ${lng.toFixed(6)}), psi=${(psi||0).toFixed(3)})
+
`;
+ }
+ if (positions.goal) {
+ const { lat, lng, utm } = positions.goal;
+ html += `
+ 🔴 Goal
+ ${lat.toFixed(6)}, ${lng.toFixed(6)}
+ Position(lat_long=(${lat.toFixed(6)}, ${lng.toFixed(6)}))
+
`;
+ }
+ el.innerHTML = html;
+ } catch (e) { /* network */ }
+ }
+
+ async function applyPositions() {
+ const r = await fetch('/api/positions/get');
+ const positions = await r.json();
+ if (!positions.start && !positions.goal) {
+ alert('No stored positions. Use Goal Picker first.');
+ return;
+ }
+ let lines = editorValue().split('\n');
+ if (positions.start) {
+ const line = `start_position = Position(lat_long=(${positions.start.lat.toFixed(6)}, ${positions.start.lng.toFixed(6)}), psi=${(positions.start.psi||0).toFixed(3)})`;
+ const idx = lines.findIndex(l => l.trim().startsWith('start_position = Position('));
+ if (idx >= 0) lines[idx] = line; else lines.unshift(line);
+ }
+ if (positions.goal) {
+ const line = `goal_position = Position(lat_long=(${positions.goal.lat.toFixed(6)}, ${positions.goal.lng.toFixed(6)}))`;
+ const idx = lines.findIndex(l => l.trim().startsWith('goal_position = Position('));
+ if (idx >= 0) lines[idx] = line; else lines.push(line);
+ }
+ setEditorValue(lines.join('\n'));
+ }
+
+ async function clearPositions() {
+ if (!confirm('Clear stored positions?')) return;
+ const r = await fetch('/api/positions/clear', { method: 'POST' });
+ const result = await r.json();
+ if (result.success) updateStoredPositions();
+ }
+
+ function delay(ms) { return new Promise(r => setTimeout(r, ms)); }
+
+ function init() {
+ initEditor();
+ loadScenarios();
+ updateStatus();
+ updateLog();
+ updateStoredPositions();
+
+ document.getElementById('startBtn')?.addEventListener('click', startScenario);
+ document.getElementById('restartBtn')?.addEventListener('click', restartScenario);
+ document.getElementById('haltBtn')?.addEventListener('click', haltAll);
+ document.getElementById('runCustomBtn')?.addEventListener('click', runFromEditor);
+ document.getElementById('saveBtn')?.addEventListener('click', saveScenario);
+ document.getElementById('copySelectedBtn')?.addEventListener('click', copySelected);
+ document.getElementById('clearEditorBtn')?.addEventListener('click', () => {
+ if (confirm('Clear editor?')) setEditorValue(DEFAULT_LAUNCH);
+ });
+ document.getElementById('applyPositionsBtn')?.addEventListener('click', applyPositions);
+ document.getElementById('clearPositionsBtn')?.addEventListener('click', clearPositions);
+
+ const loopInputs = ['loopMode', 'loopDelay', 'loopRuntime', 'modelCheckEnabled', 'modelCheckConfig'];
+ loopInputs.forEach(id => {
+ const el = document.getElementById(id);
+ if (!el) return;
+ el.addEventListener('focus', () => { _isEditingLoop = true; });
+ el.addEventListener('blur', () => { _isEditingLoop = false; });
+ el.addEventListener('change', () => {
+ clearTimeout(_loopDebounce);
+ _loopDebounce = setTimeout(toggleLoopMode, 600);
+ });
+ el.addEventListener('input', () => {
+ clearTimeout(_loopDebounce);
+ _loopDebounce = setTimeout(toggleLoopMode, 1000);
+ });
+ });
+
+ setInterval(updateStatus, 1000);
+ setInterval(updateLog, 2000);
+ setInterval(updateStoredPositions, 5000);
+ }
+
+ window.addEventListener('DOMContentLoaded', init);
+ window.ScenarioMgr = { editorValue, setEditorValue };
+})();
diff --git a/tools/adore_api/static/style.css b/tools/adore_api/static/style.css
index a49d0bc1..ef2b1803 100644
--- a/tools/adore_api/static/style.css
+++ b/tools/adore_api/static/style.css
@@ -1,757 +1,989 @@
+/* ── Reset / Base ─────────────────────────────────────────────────────────── */
+*, *::before, *::after { box-sizing: border-box; }
+
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- margin: 0;
- padding: 0;
- background-color: #f5f5f5;
+ margin: 0; padding: 0;
+ background: #0f1117;
+ color: #e1e4e8;
+ height: 100vh;
+ overflow: hidden;
}
-.container {
- max-width: 1400px;
- margin: 0 auto;
- background: white;
- min-height: 100vh;
+/* ── App layout with side panel ────────────────────────────────────────────── */
+.app-layout {
+ display: flex;
+ height: 100vh;
+ overflow: hidden;
}
-.header {
- background: #007bff;
- color: white;
- padding: 20px;
- text-align: center;
+/* Side panel */
+.side-panel {
+ width: 0;
+ min-width: 0;
+ background: #161b22;
+ border-left: 1px solid #30363d;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ transition: width 0.25s ease, min-width 0.25s ease;
+ flex-shrink: 0;
}
-.tabs {
+.side-panel.side-panel-open {
+ width: 400px;
+ min-width: 320px;
+}
+
+.side-panel-header {
display: flex;
- background: #e9ecef;
- border-bottom: 2px solid #dee2e6;
+ justify-content: space-between;
+ align-items: center;
+ padding: 12px 16px;
+ background: #1c2128;
+ border-bottom: 1px solid #30363d;
+ font-weight: 600;
+ font-size: 13px;
+ color: #8b949e;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ flex-shrink: 0;
}
-.tab {
- padding: 15px 30px;
- background: #f8f9fa;
+.side-panel-close {
+ background: none;
border: none;
+ color: #6e7681;
cursor: pointer;
- transition: background-color 0.3s;
- font-size: 16px;
- border-right: 1px solid #dee2e6;
- color: #495057;
-}
-
-.tab.active {
- background: white;
- border-bottom: 2px solid #007bff;
- color: #007bff;
+ padding: 2px 6px;
+ font-size: 14px;
+ width: auto;
+ margin: 0;
+ border-radius: 4px;
}
+.side-panel-close:hover { color: #e1e4e8; background: #30363d; }
-.tab:hover {
- background: #e9ecef;
- color: #495057;
+.side-panel-body {
+ flex: 1;
+ overflow-y: auto;
+ padding: 12px;
}
-.tab-content {
- display: none;
- padding: 20px;
+.mc-panel-status {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 12px;
+ font-size: 13px;
+ font-weight: 500;
}
-.tab-content.active {
- display: block;
+/* Main content */
+.main-content {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ transition: flex 0.25s ease;
}
-.status-indicator {
- width: 20px;
- height: 20px;
- border-radius: 50%;
- display: inline-block;
- margin-right: 10px;
+/* ── Header ─────────────────────────────────────────────────────────────────── */
+.header {
+ background: linear-gradient(135deg, #0d1117 0%, #161b22 100%);
+ border-bottom: 1px solid #30363d;
+ padding: 12px 20px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ flex-shrink: 0;
}
-.status-running { background-color: #28a745; }
-.status-failed { background-color: #dc3545; }
-.status-idle { background-color: #ffc107; }
-.status-recording { background-color: #dc3545; }
-.status-stopped { background-color: #6c757d; }
-.status-completed { background-color: #28a745; }
-.status-pending { background-color: #17a2b8; }
-.status-cancelled { background-color: #6c757d; }
-
-.status-display {
- margin-bottom: 20px;
+.header h1 {
+ margin: 0;
font-size: 18px;
- font-weight: bold;
+ font-weight: 700;
+ color: #58a6ff;
+ letter-spacing: 0.3px;
}
-.controls {
- display: grid;
- grid-template-columns: 1fr 2fr;
- gap: 20px;
- margin-bottom: 30px;
-}
-
-.three-column {
- display: grid;
- grid-template-columns: 1fr 1fr 1fr;
- gap: 20px;
- margin-bottom: 30px;
-}
-
-.two-column {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 20px;
- margin-bottom: 30px;
-}
-
-.control-panel {
- background: #f8f9fa;
- padding: 20px;
- border-radius: 8px;
- border: 1px solid #dee2e6;
- box-sizing: border-box;
- overflow: hidden;
+.header-right {
+ display: flex;
+ align-items: center;
+ gap: 16px;
}
-.control-panel h3 {
- margin-top: 0;
- color: #495057;
+.header-status {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 12px;
+ color: #8b949e;
}
-.control-panel h4 {
- margin: 15px 0 10px 0;
- color: #495057;
- border-bottom: 1px solid #dee2e6;
- padding-bottom: 5px;
+.mc-panel-toggle-btn {
+ background: #21262d;
+ border: 1px solid #30363d;
+ color: #8b949e;
+ padding: 5px 12px;
+ border-radius: 6px;
+ cursor: pointer;
+ font-size: 12px;
+ width: auto;
+ margin: 0;
+ transition: all 0.2s;
}
+.mc-panel-toggle-btn:hover { background: #30363d; color: #e1e4e8; }
-select, button, input {
- width: 100%;
- padding: 10px;
- margin: 5px 0;
- border: 1px solid #ced4da;
- border-radius: 4px;
- font-size: 14px;
- box-sizing: border-box;
+/* ── Tabs ───────────────────────────────────────────────────────────────────── */
+.tabs {
+ display: flex;
+ background: #0d1117;
+ border-bottom: 1px solid #30363d;
+ overflow-x: auto;
+ flex-shrink: 0;
}
-button {
- background-color: #007bff;
- color: white;
+.tab {
+ padding: 10px 18px;
+ background: none;
border: none;
+ border-bottom: 2px solid transparent;
cursor: pointer;
- transition: background-color 0.3s;
+ font-size: 13px;
+ font-weight: 500;
+ color: #8b949e;
+ white-space: nowrap;
+ width: auto;
+ margin: 0;
+ border-radius: 0;
+ transition: color 0.2s, border-color 0.2s;
}
+.tab:hover { color: #c9d1d9; background: none; }
+.tab.active { color: #58a6ff; border-bottom-color: #58a6ff; }
-button:hover { background-color: #0056b3; }
-
-button:disabled {
- background-color: #6c757d;
- cursor: not-allowed;
+/* ── Tab content ────────────────────────────────────────────────────────────── */
+.tab-content {
+ display: none;
+ padding: 16px;
+ flex: 1;
+ overflow-y: auto;
+ overflow-x: visible;
+ min-height: 0;
}
+.tab-content.active { display: flex; flex-direction: column; }
-.btn-danger { background-color: #dc3545; }
-.btn-danger:hover { background-color: #c82333; }
-.btn-warning { background-color: #ffc107; color: #212529; }
-.btn-warning:hover { background-color: #e0a800; }
-.btn-success { background-color: #28a745; }
-.btn-success:hover { background-color: #218838; }
-.btn-info { background-color: #17a2b8; }
-.btn-info:hover { background-color: #138496; }
-
-.log-container {
- background: #000;
- color: #00ff00;
- padding: 20px;
- border-radius: 8px;
- height: 400px;
- overflow-y: auto;
- font-family: 'Courier New', monospace;
- font-size: 12px;
- line-height: 1.4;
- white-space: pre-wrap;
- word-wrap: break-word;
+/* ── Layout helpers ─────────────────────────────────────────────────────────── */
+.split-layout {
+ display: grid;
+ grid-template-columns: 300px 1fr;
+ gap: 16px;
+ flex: 1;
+ min-height: 0;
+ align-items: start;
}
-.loop-controls {
+.split-left {
display: flex;
- gap: 10px;
- align-items: center;
- margin: 10px 0;
+ flex-direction: column;
+ gap: 12px;
+ overflow-y: auto;
+ max-height: calc(100vh - 130px);
}
-.loop-controls input[type="number"] {
- width: 80px;
- background-color: white;
- cursor: text;
+.split-right {
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ min-height: 0;
+ overflow: visible;
}
-.loop-controls input[type="number"]:focus {
- outline: 2px solid #007bff;
- background-color: #fff;
-}
+.log-tab-content { display: none; }
+.log-tab-content.active { display: flex; flex-direction: column; }
-.loop-controls input[type="number"]:hover {
- background-color: #f8f9fa;
+/* ── Control Panel ──────────────────────────────────────────────────────────── */
+.control-panel {
+ background: #161b22;
+ border: 1px solid #30363d;
+ border-radius: 8px;
+ padding: 16px;
}
-.loop-controls input[type="checkbox"] {
- width: auto;
+.control-panel h3 {
+ margin: 0 0 14px 0;
+ color: #c9d1d9;
+ font-size: 14px;
+ font-weight: 600;
+ border-bottom: 1px solid #30363d;
+ padding-bottom: 8px;
}
-.loop-info {
- background: #e3f2fd;
- border: 1px solid #2196f3;
- border-radius: 4px;
- padding: 10px;
- margin: 10px 0;
+.control-panel h4 {
+ margin: 12px 0 8px 0;
+ color: #8b949e;
font-size: 12px;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.4px;
}
-.modelcheck-controls {
- display: flex;
- gap: 10px;
- align-items: center;
- margin: 10px 0;
+/* ── Forms ──────────────────────────────────────────────────────────────────── */
+input, select, textarea {
+ width: 100%;
+ padding: 7px 10px;
+ background: #0d1117;
+ border: 1px solid #30363d;
+ border-radius: 6px;
+ color: #c9d1d9;
+ font-size: 13px;
+ margin: 3px 0;
+ transition: border-color 0.2s;
+ box-sizing: border-box;
}
-
-.modelcheck-controls input[type="checkbox"] {
- width: auto;
+input:focus, select:focus, textarea:focus {
+ outline: none;
+ border-color: #58a6ff;
}
-
-.modelcheck-controls input[type="text"] {
- width: 200px;
+input[type="checkbox"] {
+ width: auto;
+ margin: 0;
+ accent-color: #58a6ff;
}
+input[readonly] { color: #6e7681; cursor: default; }
-.modelcheck-info {
- background: #e8f5e8;
- border: 1px solid #28a745;
- border-radius: 4px;
- padding: 10px;
- margin: 10px 0;
- font-size: 12px;
+.field-group {
+ margin: 8px 0;
}
-
-.modelcheck-status-display {
- margin-bottom: 15px;
- font-size: 16px;
- font-weight: bold;
+.field-group label {
+ display: block;
+ font-size: 11px;
+ color: #8b949e;
+ margin-bottom: 3px;
+ text-transform: uppercase;
+ letter-spacing: 0.3px;
}
-.modelcheck-results-widget {
- background: #f8f9fa;
- border: 1px solid #dee2e6;
- border-radius: 8px;
- padding: 15px;
- margin: 15px 0;
+.inline-fields {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 8px;
}
-.modelcheck-results-widget h4 {
- margin: 0 0 10px 0;
- color: #495057;
+.options-row {
+ display: flex;
+ gap: 16px;
+ align-items: center;
+ margin: 8px 0;
+ flex-wrap: wrap;
}
-.proposition-item {
- background: white;
- padding: 15px;
- margin: 10px 0;
- border-radius: 8px;
- border-left: 4px solid #dee2e6;
- box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+.toggle-label {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ cursor: pointer;
+ font-size: 13px;
+ color: #c9d1d9;
+ user-select: none;
}
+.toggle-label.small { font-size: 11px; color: #8b949e; }
-.proposition-pass {
- border-left-color: #28a745;
- background-color: #d4edda;
+/* ── Buttons ────────────────────────────────────────────────────────────────── */
+button {
+ display: inline-block;
+ padding: 7px 14px;
+ background: #21262d;
+ border: 1px solid #30363d;
+ border-radius: 6px;
+ color: #c9d1d9;
+ font-size: 13px;
+ cursor: pointer;
+ transition: all 0.2s;
+ width: auto;
+ margin: 2px 0;
}
+button:hover { background: #30363d; border-color: #8b949e; }
+button:disabled { opacity: 0.4; cursor: not-allowed; }
-.proposition-fail {
- border-left-color: #dc3545;
- background-color: #f8d7da;
+.action-buttons {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin: 10px 0 4px 0;
+}
+.action-buttons button { flex: 1; min-width: 80px; }
+
+.btn-success { background: #1a4731; border-color: #2ea043; color: #3fb950; }
+.btn-success:hover { background: #2ea043; color: #fff; }
+.btn-danger { background: #4c1c24; border-color: #da3633; color: #f85149; }
+.btn-danger:hover { background: #da3633; color: #fff; }
+.btn-warning { background: #3d2b00; border-color: #9e6a03; color: #e3b341; }
+.btn-warning:hover { background: #9e6a03; color: #fff; }
+.btn-info { background: #0c2d4a; border-color: #1f6feb; color: #58a6ff; }
+.btn-info:hover { background: #1f6feb; color: #fff; }
+.btn-sm { padding: 3px 8px; font-size: 11px; }
+
+/* ── Status indicators ──────────────────────────────────────────────────────── */
+.status-indicator {
+ width: 10px; height: 10px;
+ border-radius: 50%;
+ display: inline-block;
+ flex-shrink: 0;
+ background: #6e7681;
}
+.status-running { background: #3fb950; box-shadow: 0 0 6px #3fb95060; animation: pulse 1.5s infinite; }
+.status-failed { background: #f85149; }
+.status-idle { background: #e3b341; }
+.status-recording{ background: #f85149; animation: pulse 1s infinite; }
+.status-stopped { background: #6e7681; }
+.status-completed{ background: #3fb950; }
+.status-pending { background: #58a6ff; }
+.status-cancelled{ background: #6e7681; }
+.status-unknown { background: #6e7681; }
-.proposition-error {
- border-left-color: #ffc107;
- background-color: #fff3cd;
+@keyframes pulse {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.4; }
}
-.proposition-no-data {
- border-left-color: #6c757d;
- background-color: #e9ecef;
-}
+/* ── Fuzzy Finder ───────────────────────────────────────────────────────────── */
+.fuzzy-finder { position: relative; margin-bottom: 6px; }
-.proposition-header {
+.fuzzy-input-wrap {
display: flex;
- justify-content: space-between;
- align-items: flex-start;
- margin-bottom: 10px;
-}
-
-.proposition-title {
- font-size: 16px;
- font-weight: bold;
- color: #495057;
- margin: 0;
-}
-
-.proposition-status {
- font-size: 14px;
- font-weight: bold;
- padding: 4px 8px;
- border-radius: 4px;
- color: white;
+ align-items: center;
+ background: #0d1117;
+ border: 1px solid #30363d;
+ border-radius: 6px;
+ padding: 0 8px;
+ transition: border-color 0.2s;
}
+.fuzzy-input-wrap:focus-within { border-color: #58a6ff; }
-.status-pass { background-color: #28a745; }
-.status-fail { background-color: #dc3545; }
-.status-error { background-color: #ffc107; color: #212529; }
-.status-no-data { background-color: #6c757d; }
+.fuzzy-icon { color: #8b949e; font-size: 15px; flex-shrink: 0; margin-right: 4px; }
-.proposition-description {
- font-size: 14px;
- color: #666;
- margin-bottom: 8px;
- line-height: 1.4;
-}
-
-.proposition-rationale {
- background: #f8f9fa;
- border: 1px solid #dee2e6;
- border-radius: 4px;
- padding: 8px;
- margin: 8px 0;
- font-size: 13px;
- color: #495057;
+.fuzzy-input-wrap input {
+ flex: 1; border: none; background: transparent;
+ padding: 8px 4px; margin: 0; font-size: 13px;
}
+.fuzzy-input-wrap input:focus { outline: none; border: none; }
-.proposition-rationale strong {
- color: #dc3545;
+.fuzzy-clear {
+ color: #6e7681; cursor: pointer; padding: 2px 4px;
+ font-size: 12px; border-radius: 3px;
+ visibility: hidden;
}
+.fuzzy-input-wrap:focus-within .fuzzy-clear,
+.fuzzy-input-wrap input:not(:placeholder-shown) ~ .fuzzy-clear { visibility: visible; }
+.fuzzy-clear:hover { color: #e1e4e8; background: #30363d; }
-.proposition-formula {
- background: #e3f2fd;
- border: 1px solid #2196f3;
- border-radius: 4px;
- padding: 8px;
- margin: 8px 0;
- font-size: 13px;
- color: #1976d2;
+.fuzzy-list {
+ position: absolute;
+ top: calc(100% + 3px);
+ left: 0; right: 0;
+ background: #1c2128;
+ border: 1px solid #30363d;
+ border-radius: 6px;
+ max-height: 260px;
+ overflow-y: auto;
+ z-index: 1000;
+ display: none;
+ box-shadow: 0 8px 24px rgba(0,0,0,0.5);
}
-.proposition-technical {
- background: #f1f3f4;
- border-radius: 4px;
- padding: 8px;
- margin-top: 10px;
+.fuzzy-item {
+ padding: 7px 10px;
+ cursor: pointer;
+ border-bottom: 1px solid #21262d;
+ display: flex;
+ flex-direction: column;
+ gap: 1px;
font-size: 12px;
- color: #666;
-}
-
-.proposition-technical-toggle {
- display: none;
-}
-
-.proposition-technical-content {
- display: block;
- margin-top: 8px;
+ transition: background 0.15s;
}
+.fuzzy-item:last-child { border-bottom: none; }
+.fuzzy-item:hover, .fuzzy-item.fuzzy-selected { background: #21262d; }
+.fuzzy-item.fuzzy-empty { color: #6e7681; font-style: italic; cursor: default; }
-.proposition-technical-content.show {
- display: block;
-}
+.fuzzy-item-name { color: #c9d1d9; font-size: 12px; }
+.fuzzy-item-dir { color: #6e7681; font-size: 10px; }
+.fuzzy-item mark { background: transparent; color: #58a6ff; font-weight: 700; }
-.group-indicator {
+.selected-scenario-display {
font-size: 11px;
- color: #6c757d;
- text-transform: uppercase;
- letter-spacing: 0.5px;
- margin-bottom: 5px;
-}
-
-.modelcheck-summary {
+ color: #8b949e;
+ margin: 4px 0 8px 0;
display: flex;
- gap: 15px;
- margin: 10px 0;
- flex-wrap: wrap;
-}
-
-.summary-stat {
- background: white;
- padding: 8px 12px;
- border-radius: 4px;
- border: 1px solid #dee2e6;
- min-width: 80px;
- text-align: center;
-}
-
-.summary-stat .value {
- font-size: 18px;
- font-weight: bold;
- display: block;
+ gap: 4px;
+ min-height: 14px;
}
+.sel-label { color: #6e7681; }
+#selectedScenarioName { color: #c9d1d9; word-break: break-all; }
-.summary-stat .label {
+/* ── Info boxes ─────────────────────────────────────────────────────────────── */
+.info-box {
+ border-radius: 6px;
+ padding: 8px 10px;
font-size: 11px;
- color: #6c757d;
- text-transform: uppercase;
+ line-height: 1.5;
+ margin: 8px 0;
+ color: #8b949e;
}
+.info-box-loop { background: #0c2d4a; border: 1px solid #1f6feb40; }
+.info-box-mc { background: #1a4731; border: 1px solid #2ea04340; }
-.bag-controls {
+/* ── Log / Editor tabs ──────────────────────────────────────────────────────── */
+.log-editor-tabs {
display: flex;
- gap: 10px;
- align-items: center;
- margin: 10px 0;
-}
-
-.bag-controls input[type="number"] {
- width: 80px;
- background-color: white;
- cursor: text;
-}
-
-.bag-controls input[type="checkbox"] {
- width: auto;
+ background: #0d1117;
+ border: 1px solid #30363d;
+ border-bottom: none;
+ border-radius: 8px 8px 0 0;
}
-
-.bag-info {
- background: #fff3cd;
- border: 1px solid #ffc107;
- border-radius: 4px;
- padding: 10px;
- margin: 10px 0;
+.log-tab {
+ padding: 8px 16px;
+ background: none;
+ border: none;
+ border-bottom: 2px solid transparent;
+ border-radius: 0;
+ color: #8b949e;
font-size: 12px;
+ font-weight: 500;
+ cursor: pointer;
+ width: auto;
+ margin: 0;
}
+.log-tab:hover { color: #c9d1d9; background: none; }
+.log-tab.active { color: #58a6ff; border-bottom-color: #58a6ff; }
-.bag-status-display {
- margin-bottom: 15px;
- font-size: 16px;
- font-weight: bold;
-}
-
-.topics-container {
- max-height: 200px;
- overflow-y: auto;
- border: 1px solid #ced4da;
- border-radius: 4px;
- padding: 10px;
- margin: 10px 0;
- background: white;
-}
-
-.topic-checkbox {
- display: block;
- margin: 5px 0;
- font-size: 12px;
-}
-.topic-checkbox input {
- width: auto;
- margin-right: 8px;
+/* ── Code editor ────────────────────────────────────────────────────────────── */
+.editor-panel {
+ border-radius: 0 8px 8px 8px;
}
.code-editor-container {
- border: 1px solid #ced4da;
- border-radius: 4px;
- margin: 5px 0;
- box-sizing: border-box;
- min-height: 500px;
+ border: 1px solid #30363d;
+ border-radius: 6px;
+ overflow: hidden;
+ min-height: 460px;
}
-
.CodeMirror {
- height: 500px;
- font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
- font-size: 14px;
- border-radius: 4px;
+ height: 460px;
+ font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
+ font-size: 13px;
}
.scenario-textarea {
width: 100%;
- height: 500px;
+ height: 460px;
+ background: #0d1117;
+ color: #c9d1d9;
+ font-family: 'JetBrains Mono', 'Consolas', monospace;
+ font-size: 13px;
+ border: 1px solid #30363d;
+ border-radius: 6px;
padding: 10px;
- margin: 5px 0;
- border: 1px solid #ced4da;
- border-radius: 4px;
- font-size: 14px;
- box-sizing: border-box;
- font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
- background-color: #272822;
- color: #f8f8f2;
resize: vertical;
- display: none;
}
-.scenario-search {
- position: relative;
- margin-bottom: 10px;
+.editor-footer {
+ display: flex;
+ gap: 8px;
+ align-items: center;
+ margin-top: 10px;
+ flex-wrap: wrap;
}
+.editor-footer input { flex: 1; min-width: 140px; }
+.editor-footer button { white-space: nowrap; }
-.scenario-search input {
- width: 100%;
- padding: 10px;
- border: 1px solid #ced4da;
- border-radius: 4px;
- font-size: 14px;
+/* ── Log container ──────────────────────────────────────────────────────────── */
+.log-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-size: 12px;
+ color: #8b949e;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.3px;
+ margin-bottom: 8px;
}
-.scenario-dropdown {
- position: absolute;
- top: 100%;
- left: 0;
- right: 0;
- background: white;
- border: 1px solid #ced4da;
- border-top: none;
- border-radius: 0 0 4px 4px;
- max-height: 200px;
+.log-container {
+ background: #0d1117;
+ color: #3fb950;
+ padding: 12px;
+ border-radius: 6px;
+ border: 1px solid #30363d;
+ height: calc(100vh - 280px);
overflow-y: auto;
- z-index: 1000;
- display: none;
-}
-
-.scenario-option {
- padding: 10px;
- cursor: pointer;
- border-bottom: 1px solid #e9ecef;
-}
-
-.scenario-option:hover {
- background-color: #f8f9fa;
-}
-
-.scenario-option:last-child {
- border-bottom: none;
+ font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
+ font-size: 11px;
+ line-height: 1.5;
+ white-space: pre-wrap;
+ word-break: break-all;
}
+.log-panel-full .log-container { height: calc(100vh - 220px); }
-iframe {
- width: 100%;
- height: 80vh;
- border: none;
- border-radius: 8px;
+/* ── ROS Node list ──────────────────────────────────────────────────────────── */
+.node-list-container {
+ background: #0d1117;
+ border: 1px solid #30363d;
+ border-radius: 6px;
+ height: calc(100vh - 260px);
+ overflow-y: auto;
}
-.collapsible {
- background-color: #f1f1f1;
- color: #444;
+.node-list-item {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 7px 12px;
cursor: pointer;
- padding: 18px;
- width: 100%;
- border: none;
- text-align: left;
- outline: none;
- font-size: 15px;
- margin: 10px 0;
- border-radius: 4px;
-}
-
-.collapsible:hover {
- background-color: #ddd;
+ border-bottom: 1px solid #21262d;
+ font-size: 12px;
+ font-family: 'JetBrains Mono', 'Consolas', monospace;
+ transition: background 0.15s;
+ color: #c9d1d9;
}
-
-.collapsible-content {
- padding: 0 18px;
- display: none;
- overflow: hidden;
- background-color: #f9f9f9;
- border-radius: 0 0 4px 4px;
+.node-list-item:last-child { border-bottom: none; }
+.node-list-item:hover { background: #21262d; }
+.node-list-item.node-selected { background: #0c2d4a; border-left: 3px solid #58a6ff; }
+.node-dot {
+ width: 7px; height: 7px; border-radius: 50%;
+ background: #3fb950; flex-shrink: 0;
+ box-shadow: 0 0 4px #3fb95060;
}
-.collapsible-content pre {
- background: #f4f4f4;
- padding: 15px;
- border-radius: 4px;
- overflow-x: auto;
+.no-running-nodes {
+ padding: 20px;
+ text-align: center;
+ color: #6e7681;
+ font-style: italic;
font-size: 12px;
}
-.api-endpoint {
- background: #f8f9fa;
- border: 1px solid #dee2e6;
- border-radius: 8px;
- padding: 20px;
- margin: 15px 0;
+/* ── Bag file list ──────────────────────────────────────────────────────────── */
+.bag-list-container {
+ background: #0d1117;
+ border: 1px solid #30363d;
+ border-radius: 6px;
+ max-height: 300px;
+ overflow-y: auto;
}
-
-.api-method {
- display: inline-block;
- padding: 4px 8px;
- border-radius: 4px;
- font-weight: bold;
- margin-right: 10px;
+.bag-item {
+ padding: 10px 12px;
+ border-bottom: 1px solid #21262d;
+ font-size: 12px;
}
+.bag-item:last-child { border-bottom: none; }
+.bag-item strong { color: #c9d1d9; display: block; margin-bottom: 2px; }
+.bag-meta { color: #8b949e; font-size: 11px; }
+.bag-path { display: block; color: #6e7681; font-size: 10px; margin-top: 2px; word-break: break-all; }
-.method-get { background: #28a745; color: white; }
-.method-post { background: #007bff; color: white; }
+.bag-status-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 13px;
+ font-weight: 500;
+ margin-bottom: 12px;
+}
-.api-url {
- font-family: 'Courier New', monospace;
- background: #e9ecef;
+/* ── Topics ─────────────────────────────────────────────────────────────────── */
+.topics-container {
+ background: #0d1117;
+ border: 1px solid #30363d;
+ border-radius: 6px;
+ max-height: 200px;
+ overflow-y: auto;
padding: 8px;
- border-radius: 4px;
- display: inline-block;
}
-
-.api-description {
- margin-top: 10px;
- color: #666;
+.topic-checkbox {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 12px;
+ color: #c9d1d9;
+ padding: 3px 0;
+ cursor: pointer;
}
+.topic-checkbox input { width: auto; }
-.api-params {
- margin-top: 10px;
+/* ── Stored positions ───────────────────────────────────────────────────────── */
+.stored-positions-panel .position-item {
+ background: #0d1117;
+ border: 1px solid #30363d;
+ border-radius: 4px;
+ padding: 8px;
+ margin: 5px 0;
+ font-size: 11px;
+ line-height: 1.5;
}
-
-.api-params h4 {
- margin: 10px 0 5px 0;
- color: #495057;
+.stored-positions-panel .position-item strong { color: #c9d1d9; }
+.stored-positions-panel .position-item code {
+ display: block;
+ margin-top: 4px;
+ font-family: 'JetBrains Mono', 'Consolas', monospace;
+ font-size: 10px;
+ color: #8b949e;
+ background: #161b22;
+ padding: 3px 5px;
+ border-radius: 3px;
+ word-break: break-all;
}
-
-.param-list {
- background: #f4f4f4;
- padding: 10px;
- border-radius: 4px;
- font-family: 'Courier New', monospace;
- font-size: 13px;
+.no-stored-positions {
+ color: #6e7681; font-style: italic; font-size: 12px; padding: 8px 0;
}
-.save-controls {
+/* ── Model check results (side panel) ───────────────────────────────────────── */
+.modelcheck-summary {
display: flex;
- gap: 10px;
- align-items: center;
- margin: 10px 0;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin: 8px 0 12px 0;
}
-
-.save-controls input[type="text"] {
+.summary-stat {
+ background: #21262d;
+ border: 1px solid #30363d;
+ border-radius: 6px;
+ padding: 7px 12px;
+ text-align: center;
+ min-width: 60px;
flex: 1;
}
-
-.save-controls button {
- width: auto;
- min-width: 100px;
+.summary-stat .value {
+ display: block;
+ font-size: 18px;
+ font-weight: 700;
+ color: #c9d1d9;
}
-
-.utility-buttons {
- display: flex;
- gap: 10px;
- margin: 10px 0;
+.summary-stat .label {
+ font-size: 9px;
+ color: #6e7681;
+ text-transform: uppercase;
+ letter-spacing: 0.3px;
}
+.rate-stat { min-width: 70px; }
+.rate-value { font-size: 13px !important; font-weight: 700; }
+.summary-stat.stat-pass .value { color: #3fb950; }
+.summary-stat.stat-fail .value { color: #f85149; }
-.utility-buttons button {
- flex: 1;
- padding: 8px;
+.proposition-item {
+ background: #1c2128;
+ border: 1px solid #30363d;
+ border-left: 4px solid #30363d;
+ border-radius: 6px;
+ padding: 12px;
+ margin: 8px 0;
font-size: 12px;
}
+.proposition-pass { border-left-color: #3fb950; background: #091d11; }
+.proposition-fail { border-left-color: #f85149; background: #1e0a0a; }
+.proposition-error { border-left-color: #e3b341; background: #1a1500; }
+.proposition-no-data { border-left-color: #6e7681; background: #161b22; }
-.stored-positions-display {
- background: #e8f5e8;
- border: 1px solid #28a745;
- border-radius: 6px;
- padding: 8px;
- margin-bottom: 15px;
- max-width: 100%;
- box-sizing: border-box;
+.proposition-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ margin-bottom: 6px;
+ gap: 8px;
}
-
-.stored-positions-display h3 {
- margin: 0 0 6px 0;
- color: #155724;
+.proposition-title {
font-size: 13px;
+ font-weight: 600;
+ color: #c9d1d9;
+ margin: 0;
+ line-height: 1.3;
}
-
-.position-item {
- background: #f8f9fa;
- padding: 6px 8px;
- margin: 3px 0;
- border-radius: 3px;
- font-family: 'Courier New', monospace;
+.proposition-status {
font-size: 10px;
- line-height: 1.3;
+ font-weight: 700;
+ padding: 3px 7px;
+ border-radius: 4px;
+ white-space: nowrap;
+ flex-shrink: 0;
}
+.status-pass { background: #2ea04320; color: #3fb950; border: 1px solid #2ea04340; }
+.status-fail { background: #da363320; color: #f85149; border: 1px solid #da363340; }
+.status-error { background: #9e6a0320; color: #e3b341; border: 1px solid #9e6a0340; }
+.status-no-data { background: #30363d; color: #8b949e; border: 1px solid #30363d; }
-.position-item strong {
- color: #495057;
+.proposition-description {
+ color: #8b949e;
font-size: 11px;
+ margin-bottom: 6px;
+ line-height: 1.5;
}
-
-.no-stored-positions {
- color: #6c757d;
- font-style: italic;
- text-align: center;
- padding: 6px;
+.proposition-rationale {
+ background: #0d1117;
+ border: 1px solid #30363d;
+ border-radius: 4px;
+ padding: 6px 8px;
font-size: 11px;
+ color: #8b949e;
+ margin: 5px 0;
}
-
-.clear-positions-btn {
- width: 100%;
- margin-top: 6px;
- padding: 4px;
+.proposition-rationale strong { color: #f85149; }
+.proposition-formula {
+ background: #0c2d4a;
+ border: 1px solid #1f6feb40;
+ border-radius: 4px;
+ padding: 6px 8px;
font-size: 11px;
+ color: #58a6ff;
+ margin: 5px 0;
}
-
-.running-nodes-display {
- background: #e3f2fd;
- border: 1px solid #2196f3;
- border-radius: 6px;
- padding: 8px;
- margin-bottom: 15px;
- max-width: 100%;
- box-sizing: border-box;
+.proposition-technical {
+ background: #0d1117;
+ border-radius: 4px;
+ padding: 6px 8px;
+ margin-top: 8px;
+ font-size: 11px;
+ color: #6e7681;
}
-
-.running-nodes-display h4 {
- margin: 0 0 6px 0;
- color: #0d47a1;
- font-size: 13px;
+.prop-stat-grid {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 4px 12px;
+ margin-top: 4px;
}
-
-.node-item {
- background: #f8f9fa;
- padding: 4px 6px;
- margin: 2px 0;
- border-radius: 3px;
- font-family: 'Courier New', monospace;
- font-size: 10px;
- line-height: 1.2;
- color: #495057;
+.prop-stat-grid span { color: #8b949e; font-size: 10px; }
+.prop-stat-section-label {
+ font-size: 9px;
+ color: #484f58;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ margin-top: 6px;
+ margin-bottom: 1px;
}
+.group-indicator {
+ font-size: 9px;
+ color: #6e7681;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ margin-bottom: 4px;
+}
+
+/* ── Safety grade badges ────────────────────────────────────────────────────── */
+.safety-grade { display: flex; align-items: center; gap: 6px; margin: 6px 0; flex-wrap: wrap; }
+.grade-label { font-size: 10px; color: #6e7681; text-transform: uppercase; }
+.grade-badge { padding: 2px 8px; border-radius: 4px; font-weight: 700; font-size: 11px; }
+.grade-us-a, .grade-eu-1 { background: #1a4731; color: #3fb950; border: 1px solid #2ea04360; }
+.grade-us-b, .grade-eu-2 { background: #30363d; color: #8b949e; }
+.grade-us-c, .grade-eu-3 { background: #3d2b00; color: #e3b341; border: 1px solid #9e6a0360; }
+.grade-us-d, .grade-eu-4 { background: #3d1a00; color: #f0883e; border: 1px solid #f0883e60; }
+.grade-us-f, .grade-eu-5, .grade-eu-6 { background: #4c1c24; color: #f85149; border: 1px solid #da363360; }
+
+.dqs-good { background: #1a4731; color: #3fb950; border: 1px solid #2ea04360; }
+.dqs-acceptable { background: #0c2d4a; color: #58a6ff; border: 1px solid #1f6feb60; }
+.dqs-degraded { background: #3d2b00; color: #e3b341; border: 1px solid #9e6a0360; }
+.dqs-poor { background: #3d1a00; color: #f0883e; border: 1px solid #f0883e60; }
+.dqs-critical { background: #4c1c24; color: #f85149; border: 1px solid #da363360; }
+.dqs-sub-badge { padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600; background: #21262d; color: #8b949e; border: 1px solid #30363d; }
+
+.proposition-disabled { opacity: 0.45; }
+.prop-disable-btn {
+ background: none; border: none; cursor: pointer; padding: 2px 4px;
+ font-size: 12px; color: #6e7681; width: auto; margin: 0; border-radius: 3px;
+ line-height: 1;
+}
+.prop-disable-btn:hover { background: #30363d; }
+
+.mc-disabled-header {
+ font-size: 10px; color: #6e7681; text-transform: uppercase;
+ letter-spacing: 0.4px; padding: 10px 0 4px 0; font-weight: 600;
+ border-top: 1px solid #30363d; margin-top: 8px;
+}
+.mc-disabled-item {
+ display: flex; align-items: center; justify-content: space-between;
+ padding: 4px 0; font-size: 11px; color: #6e7681;
+}
+.prop-reenable-btn {
+ background: none; border: 1px solid #30363d; cursor: pointer; padding: 2px 6px;
+ font-size: 10px; color: #8b949e; width: auto; margin: 0; border-radius: 3px;
+}
+.prop-reenable-btn:hover { background: #21262d; color: #c9d1d9; }
+
+/* ── ROS Topics Tab ─────────────────────────────────────────────────────────── */
+.topic-list-container {
+ background: #0d1117; border: 1px solid #30363d; border-radius: 6px;
+ height: calc(100vh - 280px); overflow-y: auto;
+}
+.topic-list-item {
+ display: flex; align-items: center; justify-content: space-between;
+ padding: 6px 12px; cursor: pointer;
+ border-bottom: 1px solid #21262d; font-size: 11px;
+ font-family: 'JetBrains Mono', 'Consolas', monospace;
+ transition: background 0.15s; color: #c9d1d9;
+}
+.topic-list-item:last-child { border-bottom: none; }
+.topic-list-item:hover { background: #21262d; }
+.topic-list-item.topic-selected { background: #0c2d4a; border-left: 3px solid #58a6ff; }
+
+.topic-datatype {
+ font-size: 10px; color: #6e7681; font-family: 'JetBrains Mono','Consolas',monospace;
+ margin-left: 8px; flex-shrink: 0; max-width: 160px;
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
+}
+
+.topic-dropdown {
+ display: none; position: absolute; top: 100%; left: 0; right: 0; z-index: 100;
+ background: #161b22; border: 1px solid #30363d; border-radius: 0 0 6px 6px;
+ max-height: 220px; overflow-y: auto;
+ box-shadow: 0 8px 24px rgba(0,0,0,0.4);
+}
+.topic-dropdown-item {
+ display: flex; justify-content: space-between; align-items: center;
+ padding: 5px 12px; cursor: pointer; font-size: 11px;
+ font-family: 'JetBrains Mono','Consolas',monospace; color: #c9d1d9;
+ border-bottom: 1px solid #21262d;
+}
+.topic-dropdown-item:last-child { border-bottom: none; }
+.topic-dropdown-item:hover { background: #21262d; color: #58a6ff; }
+.topic-dropdown-dt {
+ font-size: 10px; color: #6e7681; margin-left: 8px; flex-shrink: 0;
+ max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
+}
+
+.json-viewer {
+ background: #0d1117; border: 1px solid #30363d; border-radius: 6px;
+ padding: 12px; overflow: auto; font-family: 'JetBrains Mono','Consolas',monospace;
+ font-size: 11px; line-height: 1.6; color: #c9d1d9; white-space: pre;
+ max-height: calc(100vh - 280px);
+}
+.json-key { color: #79c0ff; }
+.json-str { color: #a5d6ff; }
+.json-num { color: #79c0ff; }
+.json-bool { color: #ff7b72; }
+.json-null { color: #6e7681; }
+
+/* ── ROS Workspace Tab ──────────────────────────────────────────────────────── */
+.pkg-list-item {
+ display: flex; align-items: center; gap: 8px;
+ padding: 5px 10px; border-bottom: 1px solid #21262d;
+ font-size: 11px; font-family: 'JetBrains Mono','Consolas',monospace;
+}
+.pkg-list-item:last-child { border-bottom: none; }
+.pkg-indicator {
+ width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
+}
+.pkg-built { background: #3fb950; box-shadow: 0 0 4px #3fb95060; }
+.pkg-stale { background: #e3b341; box-shadow: 0 0 4px #e3b34160; }
+.pkg-not-built { background: #f85149; box-shadow: 0 0 4px #f8514960; }
+.pkg-name { flex: 1; color: #c9d1d9; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+.pkg-name.pkg-unknown { color: #6e7681; font-style: italic; }
+.pkg-auto-label { display: flex; align-items: center; gap: 3px; font-size: 10px; color: #6e7681; flex-shrink: 0; cursor: pointer; white-space: nowrap; }
+.pkg-auto-label input { width: auto; margin: 0; }
+.pkg-build-btn { padding: 2px 8px; font-size: 10px; margin: 0; flex-shrink: 0; }
+.pkg-rebuilding { opacity: 0.6; }
+.pkg-rebuilding .pkg-indicator { animation: pkg-pulse 1s ease-in-out infinite; }
+@keyframes pkg-pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.3; } }
+.workspace-status-grid {
+ display: grid; grid-template-columns: auto 1fr; gap: 4px 12px;
+ font-size: 12px; margin: 8px 0;
+}
+.ws-key { color: #6e7681; font-size: 11px; }
+.ws-val { color: #c9d1d9; font-family: 'JetBrains Mono','Consolas',monospace; font-size: 11px; }
+.ws-val.ok { color: #3fb950; }
+.ws-val.err { color: #f85149; }
+
+/* ── mc-panel-summary alias ─────────────────────────────────────────────────── */
+.mc-panel-summary .modelcheck-summary { margin: 0; }
+
+/* ── Visualization / iframes ────────────────────────────────────────────────── */
+.viz-toolbar {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 10px;
+ flex-shrink: 0;
+}
+.viz-toolbar input { flex: 1; }
+.viz-toolbar button { white-space: nowrap; }
-.no-running-nodes {
- color: #6c757d;
- font-style: italic;
- text-align: center;
- padding: 6px;
- font-size: 11px;
+.full-iframe {
+ flex: 1;
+ width: 100%;
+ border: 1px solid #30363d;
+ border-radius: 8px;
+ min-height: 0;
+ height: calc(100vh - 160px);
+ display: block;
}
-.timing-warning {
- background: #fff3cd;
- border: 1px solid #ffc107;
+/* ── API Reference ──────────────────────────────────────────────────────────── */
+.api-loading { text-align: center; padding: 40px; color: #6e7681; }
+.api-reference-content { max-width: 900px; }
+.api-reference-content h1 { color: #58a6ff; font-size: 20px; }
+.api-reference-content h2 { color: #c9d1d9; font-size: 16px; border-bottom: 1px solid #30363d; padding-bottom: 6px; }
+.api-reference-content h3 { color: #8b949e; font-size: 14px; }
+.api-reference-content p { color: #8b949e; font-size: 13px; line-height: 1.6; }
+.api-reference-content code {
+ background: #161b22;
+ border: 1px solid #30363d;
border-radius: 4px;
- padding: 10px;
- margin: 10px 0;
+ padding: 1px 5px;
font-size: 12px;
- color: #856404;
+ color: #f85149;
+ font-family: 'JetBrains Mono', 'Consolas', monospace;
}
-
-.safety-grade {
- display: inline-flex;
- gap: 8px;
- margin: 8px 0;
- align-items: center;
+.api-reference-content pre {
+ background: #0d1117;
+ border: 1px solid #30363d;
+ border-radius: 6px;
+ padding: 12px;
+ overflow-x: auto;
}
-
-.grade-badge {
+.api-reference-content pre code {
+ background: none;
+ border: none;
+ padding: 0;
+ color: #3fb950;
+ font-size: 12px;
+}
+.api-endpoint {
+ background: #161b22;
+ border: 1px solid #30363d;
+ border-radius: 8px;
+ padding: 16px;
+ margin: 12px 0;
+}
+.api-method {
+ display: inline-block;
+ padding: 2px 8px;
+ border-radius: 4px;
+ font-weight: 700;
+ font-size: 11px;
+ margin-right: 8px;
+}
+.method-get { background: #1a4731; color: #3fb950; }
+.method-post { background: #0c2d4a; color: #58a6ff; }
+.method-delete { background: #4c1c24; color: #f85149; }
+.api-url {
+ font-family: 'JetBrains Mono', 'Consolas', monospace;
+ background: #21262d;
padding: 4px 8px;
border-radius: 4px;
- font-weight: bold;
font-size: 12px;
- min-width: 40px;
- text-align: center;
+ color: #c9d1d9;
}
-.grade-us-a, .grade-eu-1 { background-color: #28a745; color: white; }
-.grade-us-b, .grade-eu-2 { background-color: #6c757d; color: white; }
-.grade-us-c, .grade-eu-3 { background-color: #ffc107; color: #212529; }
-.grade-us-d, .grade-eu-4 { background-color: #fd7e14; color: white; }
-.grade-us-f, .grade-eu-5, .grade-eu-6 { background-color: #dc3545; color: white; }
+/* ── Scrollbars ─────────────────────────────────────────────────────────────── */
+::-webkit-scrollbar { width: 6px; height: 6px; }
+::-webkit-scrollbar-track { background: #0d1117; }
+::-webkit-scrollbar-thumb { background: #30363d; border-radius: 3px; }
+::-webkit-scrollbar-thumb:hover { background: #484f58; }
-.grade-label {
- font-size: 11px;
- color: #6c757d;
- text-transform: uppercase;
- letter-spacing: 0.5px;
+/* ── Publish CodeMirror editor ──────────────────────────────────────────── */
+#rosPublishEditorContainer { height: 260px; }
+#rosPublishEditorContainer .CodeMirror {
+ height: 100%;
+ font-size: 12px;
+ font-family: 'JetBrains Mono', 'Consolas', monospace;
+ background: #0d1117;
}
+#rosPublishEditorContainer .CodeMirror-scroll { height: 100%; }
diff --git a/tools/adore_api/static/tabs.js b/tools/adore_api/static/tabs.js
new file mode 100644
index 00000000..3b4e5fb6
--- /dev/null
+++ b/tools/adore_api/static/tabs.js
@@ -0,0 +1,75 @@
+// ── Tab management ────────────────────────────────────────────────────────────
+(function () {
+ 'use strict';
+
+ let _mcFrameLoaded = false;
+ let _vizFrameLoaded = false;
+ let _hwMonitorInited = false;
+
+ function showTab(name) {
+ document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
+ document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
+
+ const btn = document.querySelector(`.tab[data-tab="${name}"]`);
+ const panel = document.getElementById(name);
+ if (btn) btn.classList.add('active');
+ if (panel) panel.classList.add('active');
+
+ if (name === 'model-checker' && !_mcFrameLoaded) {
+ const frame = document.getElementById('modelCheckerFrame');
+ if (frame && frame.dataset.src) {
+ frame.src = frame.dataset.src;
+ _mcFrameLoaded = true;
+ }
+ }
+
+ if (name === 'visualization' && !_vizFrameLoaded) {
+ const frame = document.getElementById('lichtblickFrame');
+ if (frame && frame.dataset.src) {
+ frame.src = frame.dataset.src;
+ _vizFrameLoaded = true;
+ }
+ }
+
+ if (name === 'hardware-monitor' && !_hwMonitorInited) {
+ _hwMonitorInited = true;
+ if (window.HardwareMonitorPanel) {
+ window.HardwareMonitorPanel.init();
+ }
+ }
+
+ window.dispatchEvent(new CustomEvent('tabchange', { detail: { tab: name } }));
+ }
+
+ function initTabs() {
+ document.querySelectorAll('.tab[data-tab]').forEach(btn => {
+ btn.addEventListener('click', () => showTab(btn.dataset.tab));
+ });
+
+ document.querySelectorAll('.log-tab[data-logtab]').forEach(btn => {
+ btn.addEventListener('click', () => {
+ const parent = btn.closest('.split-right, .control-panel, .tab-content');
+ parent.querySelectorAll('.log-tab').forEach(t => t.classList.remove('active'));
+ parent.querySelectorAll('.log-tab-content').forEach(c => c.classList.remove('active'));
+ btn.classList.add('active');
+ const target = document.getElementById(btn.dataset.logtab);
+ if (target) target.classList.add('active');
+ });
+ });
+
+ // ── URL Parameter Check ────────────────────────────────────────────────
+ const urlParams = new URLSearchParams(window.location.search);
+ const activeTab = urlParams.get('tab'); // Looks for ?tab=value
+
+ if (activeTab) {
+ // Verify the tab actually exists before trying to switch to it
+ const tabExists = document.querySelector(`.tab[data-tab="${activeTab}"]`);
+ if (tabExists) {
+ showTab(activeTab);
+ }
+ }
+ }
+
+ window.showTab = showTab;
+ window.addEventListener('DOMContentLoaded', initTabs);
+})();
diff --git a/tools/adore_api/templates/goal_picker.html b/tools/adore_api/templates/goal_picker.html
index dc4d3454..69e826ea 100644
--- a/tools/adore_api/templates/goal_picker.html
+++ b/tools/adore_api/templates/goal_picker.html
@@ -8,213 +8,51 @@
-
Map Marker Planner
-
+
-
+
Settings
@@ -222,469 +60,406 @@
Settings
Draw route between markers
-
+
Start Point
Goal Point
-
+
- Auto-Switch: When you place a start point, the mode automatically switches to "Goal Point" for faster workflow.
+ Auto-Switch: Placing a start point switches to Goal mode automatically.
+ Drag the blue handle around the start marker to set heading.
-
+
Stored Positions
-
+
- Store Positions
- Load Positions
- Clear Stored
+ Store
+ Load
+ Clear
-
+
-
🟢 Start Position
-
-
Click map to place start marker
+
🟢 Start Position
+
Click map to place start marker
+
+ Heading (psi):
+
+ rad | 0.0 °
-
+
-
🔴 Goal Position
-
-
Click map to place goal marker
-
+
🔴 Goal Position
+
Click map to place goal marker
-
+
Clear All Markers
+
+
+
+ Lat/Long Code
+ Copy
+
+
+
+
+
+
+ UTM Code
+ Copy
+
+
+