diff --git a/.gitignore b/.gitignore index 067c81d3..2bcbb107 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,9 @@ msg/_*.py build_isolated/ devel_isolated/ +__pycache__/ +.ipynb_checkpoints/ + # Generated by dynamic reconfigure *.cfgc /cfg/cpp/ @@ -55,4 +58,4 @@ frames_*.pdf nucleus_token.txt -docker/extras/px \ No newline at end of file +docker/extras/px diff --git a/.gitmodules b/.gitmodules index 4b1aaa26..3da2d0c6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,8 +10,8 @@ url = git@github.com:PX4/px4_msgs.git branch = main [submodule "ros_ws/src/robot/autonomy/world_model/mapping/vdb_mapping"] - path = ros_ws/src/robot/autonomy/world_model/mapping/vdb_mapping + path = ros_ws/src/robot/autonomy/4_global/a_world_models/vdb_mapping url = https://github.com/fzi-forschungszentrum-informatik/vdb_mapping [submodule "ros_ws/src/robot/autonomy/world_model/mapping/vdb_mapping_ros2"] - path = ros_ws/src/robot/autonomy/world_model/mapping/vdb_mapping_ros2 + path = ros_ws/src/robot/autonomy/4_global/a_world_models/vdb_mapping_ros2 url = https://github.com/fzi-forschungszentrum-informatik/vdb_mapping_ros2 diff --git a/.vscode/settings.json b/.vscode/settings.json index 9d4ba0ef..15a7ef36 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -805,8 +805,23 @@ "__locale": "cpp", "codecvt": "cpp", "any": "cpp", - "future": "cpp" + "future": "cpp", + "csignal": "cpp", + "strstream": "cpp", + "compare": "cpp", + "concepts": "cpp", + "forward_list": "cpp", + "unordered_set": "cpp", + "regex": "cpp", + "numbers": "cpp", + "ranges": "cpp", + "semaphore": "cpp", + "shared_mutex": "cpp", + "stop_token": "cpp", + "cfenv": "cpp", + "typeindex": "cpp", + "valarray": "cpp" }, "C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: Google, IndentWidth: 4, ColumnLimit: 100 }", "editor.formatOnSave": true -} \ No newline at end of file +} diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index 69a4c128..00000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,92 +0,0 @@ -FROM nvcr.io/nvidia/isaac-sim:4.1.0 - -# setup timezone -RUN echo 'Etc/UTC' > /etc/timezone && \ - ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime && \ - apt-get update && \ - apt-get install -q -y --no-install-recommends tzdata && \ - rm -rf /var/lib/apt/lists/* - -# install packages -RUN apt-get update && apt-get install -q -y --no-install-recommends \ - dirmngr \ - gnupg2 \ - && rm -rf /var/lib/apt/lists/* - -# setup keys -RUN set -eux; \ - key='C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654'; \ - export GNUPGHOME="$(mktemp -d)"; \ - gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \ - mkdir -p /usr/share/keyrings; \ - gpg --batch --export "$key" > /usr/share/keyrings/ros2-latest-archive-keyring.gpg; \ - gpgconf --kill all; \ - rm -rf "$GNUPGHOME" - -# setup sources.list -RUN echo "deb [ signed-by=/usr/share/keyrings/ros2-latest-archive-keyring.gpg ] http://packages.ros.org/ros2/ubuntu jammy main" > /etc/apt/sources.list.d/ros2-latest.list - -# setup environment -ENV LANG C.UTF-8 -ENV LC_ALL C.UTF-8 -ENV ROS_DISTRO humble - -# install ros2 packages -RUN apt-get update && apt-get install -y --no-install-recommends \ - ros-humble-desktop ros-dev-tools emacs nano vim curl net-tools wget vim tmux less htop \ - ca-certificates gnupg lsb-core sudo wget \ - astyle build-essential cmake cppcheck file g++ gcc gdb git lcov libfuse2 libxml2-dev libxml2-utils \ - make ninja-build python3 python3-dev python3-pip python3-setuptools python3-wheel rsync shellcheck unzip zip \ - automake binutils-dev bison build-essential flex g++-multilib gcc-multilib gdb-multiarch genromfs gettext gperf \ - libelf-dev libexpat-dev libgmp-dev libisl-dev libmpc-dev libmpfr-dev libncurses5 libncurses5-dev libncursesw5-dev \ - libtool pkg-config screen texinfo u-boot-tools util-linux vim-common bc openjdk-11-jre openjdk-11-jdk libvecmath-java \ - dmidecode gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-plugins-good \ - gstreamer1.0-plugins-ugly gstreamer1.0-libav libeigen3-dev libgstreamer-plugins-base1.0-dev libgstreamer-gl1.0-0 \ - libimage-exiftool-perl libopencv-dev libxml2-utils pkg-config protobuf-compiler lsb-release libasio-dev ros-humble-mavros \ - kmod lsof libfuse-dev iproute2 tcpdump xterm \ - python3-dev python3-opencv python3-wxgtk4.0 python3-pip python3-matplotlib python3-lxml python3-pygame \ - && rm -rf /var/lib/apt/lists/* - -# fix warning deprecated easy_install: https://answers.ros.org/question/396439/setuptoolsdeprecationwarning-setuppy-install-is-deprecated-use-build-and-pip-and-other-standards-based-tools/ -RUN pip install setuptools==58.2.0 -# Package dependencies -# perform ROS dependency installation for our workspace. -COPY ros_ws/src /tmp/ros_ws/src -RUN rosdep init && rosdep update && rosdep install --from-paths /tmp/ros_ws/src --ignore-src -r -y && rm -rf /tmp/ros_ws || echo "Some ROS dependencies installation failed" - -# Install Gazebo Harmonic -RUN apt-get update && apt-get install -y lsb-release gnupg -RUN curl https://packages.osrfoundation.org/gazebo.gpg --output /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg -RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null -RUN apt-get update -RUN apt-get install -y gz-harmonic - -# package vdb_mapping -# Build and install patched version of OpenVDB (see https://github.com/SteveMacenski/spatio_temporal_voxel_layer/issues/232). Hopefully this gets fixed in the future. -RUN apt-get remove -y libopenvdb*; apt-get update && apt-get install -y libboost-system-dev libboost-iostreams-dev libtbb-dev libblosc-dev; \ - git clone --recurse --branch v8.2.0-debian https://github.com/wyca-robotics/openvdb.git /opt/openvdb && \ - mkdir /opt/openvdb/build && cd /opt/openvdb/build && \ - cmake .. && \ - make -j8 && make install && \ - cd ..; rm -rf /opt/openvdb/build - -RUN /opt/ros/humble/lib/mavros/install_geographiclib_datasets.sh -# Install ROS2 packages -RUN apt install ros-humble-tf2* ros-humble-perception-pcl libpcl-dev -y - -RUN wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg -RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null -RUN apt update -RUN apt-get update && apt-get install -y --no-install-recommends gz-garden \ - && rm -rf /var/lib/apt/lists/* - -RUN pip3 install argcomplete argparse>=1.2 cerberus coverage empy==3.3.4 future jinja2>=2.8 jsonschema kconfiglib lxml matplotlib>=3.0.* numpy>=1.13 nunavut>=1.1.0 packaging pandas>=0.21 pkgconfig psutil pygments wheel>=0.31.1 pymavlink pyros-genmsg pyserial pyulog>=0.5.0 pyyaml requests setuptools>=39.2.0 six>=1.12.0 toml>=0.9 sympy>=1.10.1 scipy mkdocs-material - -#ADD dronekit-python /docker_build/dronekit-python -#RUN /isaac-sim/kit/python.sh -m pip install /docker_build/dronekit-python - -RUN /isaac-sim/python.sh -m pip install git+https://github.com/dronekit/dronekit-python#egg=dronekit - -RUN pip3 install PyYAML mavproxy tmuxp - -WORKDIR /root/AirStack diff --git a/docker/README.md b/docker/README.md deleted file mode 100644 index f780df57..00000000 --- a/docker/README.md +++ /dev/null @@ -1,25 +0,0 @@ -``` -# make sure in this directory -# build the image, it is named airlab-autonomy-dev:latest -docker compose --profile build build - -# start docker compose service -docker compose up -d - -# enter a bash session -docker compose exec airstack_dev bash - -# launch the isaacsim with two drones -cd ~/Airstack/ros_ws -source install/setup.bash -ros2 launch central ascent_isaac_two_drones.xml -# wait until you see the odometry appear in rviz then do the following in the RQT GUI -Click the "Auto Takeoff" button in the RQT GUI -# After a few seconds the drone should takeoff -Click publish on the fixed trajectory part of the GUI to send different trajectory patterns that the drone will follow -# After killing the ros2 launch, run the following to kill the SITL, mavproxy, and mavros that is running in the background, this will be handled automatically in the future -tmux kill-server - -# stop service -docker compose stop -``` \ No newline at end of file diff --git a/docker/airstack-dev.dockerfile b/docker/airstack-dev.dockerfile new file mode 100644 index 00000000..f3e6eff0 --- /dev/null +++ b/docker/airstack-dev.dockerfile @@ -0,0 +1,83 @@ +# expects context to be the root of the repository, i.e. AirStack/. this is so we can access AirStack/ros_ws/ +FROM osrf/ros:humble-desktop-full + +WORKDIR /root/AirStack + +RUN apt update +# Install dev tools +RUN apt install -y \ + vim nano wget curl tree \ + cmake build-essential \ + less htop jq \ + python3-pip + +# Install ROS2 packages + +# Package dependencies +# perform ROS dependency installation for our workspace. +COPY ros_ws/src /tmp/ros_ws/src +RUN rosdep init && rosdep update && \ + rosdep install --from-paths /tmp/ros_ws/src --ignore-src -r -y && \ + rm -rf /tmp/ros_ws || echo "Some ROS dependencies installation failed" + +# Install any additional ROS2 packages +RUN apt update -y && apt install -y \ + ros-dev-tools \ + ros-humble-mavros \ + ros-humble-tf2* \ + ros-humble-stereo-image-proc \ + ros-humble-image-view \ + ros-humble-topic-tools \ + ros-humble-grid-map + +RUN /opt/ros/humble/lib/mavros/install_geographiclib_datasets.sh + + +# Install Python dependencies +RUN pip3 install \ + empy \ + future \ + lxml \ + matplotlib \ + numpy \ + pkgconfig \ + psutil \ + pygments \ + wheel \ + pymavlink \ + pyyaml \ + requests \ + setuptools \ + six \ + toml \ + scipy + + +# Override install newer openvdb 8.2.0 for compatibility with Ubuntu 22.04 https://bugs.launchpad.net/bugs/1970108 +RUN apt remove -y libopenvdb*; \ + git clone --recurse --branch v8.2.0-debian https://github.com/wyca-robotics/openvdb.git /opt/openvdb && \ + mkdir /opt/openvdb/build && cd /opt/openvdb/build && \ + cmake .. && \ + make -j8 && make install && \ + cd ..; rm -rf /opt/openvdb/build + +# Add ability to SSH +RUN apt-get update && apt-get install -y openssh-server +RUN mkdir /var/run/sshd + +# Password is airstack +RUN echo 'root:airstack' | chpasswd +RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config +RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config +RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd + +EXPOSE 22 + + + +# Cleanup. Prevent people accidentally doing git commits as root in Docker +RUN apt purge git -y \ + && apt autoremove -y \ + && apt clean -y \ + && rm -rf /var/lib/apt/lists/* + diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 7a398147..f7b83cf8 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -1,37 +1,33 @@ # docker compose file services: - build: - profiles: ["build"] - image: theairlab.org/airstack-dev + # ============================================================================== + isaac-sim: build: context: ../ - dockerfile: docker/Dockerfile + dockerfile: docker/isaac-sim/Dockerfile tags: - - theairlab.org/airstack-dev:latest - - theairlab.org/airstack-dev:0.3.0 - - # main dev container - airstack_dev: - image: theairlab.org/airstack-dev:latest - container_name: airstack_dev + - airlab-storage.andrew.cmu.edu:5001/shared/isaac-sim-4.1.0_ros-humble:latest + image: airlab-storage.andrew.cmu.edu:5001/shared/isaac-sim-4.1.0_ros-humble:latest + container_name: isaac-sim entrypoint: bash # Interactive shell stdin_open: true # docker run -i tty: true # docker run -t - # Networking and IPC for ROS 2 - network_mode: host ipc: host - # Needed to display graphical applications privileged: true + networks: + airstack_network: + ipv4_address: 172.31.0.200 + env_file: ./isaac-sim/omni_pass.env environment: # NVIDIA stuff - ACCEPT_EULA=Y - DISPLAY - QT_X11_NO_MITSHM=1 - # Omniverse Nucleus stuff - # - OMNI_USER="$$omni-api-token" # need a double dollar sign here so docker compose doesn't try to interpret it https://stackoverflow.com/a/40621373 - # - OMNI_PASS=$(cat ./../nucleus_token.txt) # this didn't work, used ~/.bashrc instead. echo 'export OMNI_PASS=$(cat ~/AirStack/nucleus_token.txt)' >> ~/.bashrc - deploy: + # ROS2 stuff + - RMW_IMPLEMENTATION=rmw_fastrtps_cpp + - FASTRTPS_DEFAULT_PROFILES_FILE=/isaac-sim/fastdds.xml + deploy: # let it use the GPU resources: reservations: devices: @@ -39,8 +35,9 @@ services: count: 1 capabilities: [gpu] volumes: - # display stuff + # display - $HOME/.Xauthority:/root/.Xauthority + - /tmp/.X11-unix:/tmp/.X11-unix # isaac sim stuff - ~/docker/isaac-sim/cache/kit:/isaac-sim/kit/cache:rw - ~/docker/isaac-sim/cache/ov:/root/.cache/ov:rw @@ -50,28 +47,108 @@ services: - ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw - ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw - ~/docker/isaac-sim/documents:/root/Documents:rw - # autonomy stack stuff - - ./..:/root/AirStack:rw + # developer stuff + - ./isaac-sim/.bashrc:/root/.bashrc:rw # bash config + - ~/.bash_history:/root/.bash_history:rw # save cmdline history + # code - ./extras/kit-app-template/source/extensions/:/root/Documents/Kit/shared/exts/ - ./extras:/extras:rw - ./extras/inputrc:/etc/inputrc - - ../ros_ws:/extras/ros_ws - - ./../simulation/AscentAeroSystems/AscentAeroSystemsSITLPackage:/extras/drag_and_drop/AscentAeroSystemsSITLPackage + + # ============================================================================== + ground-control-station: + image: airlab-storage.andrew.cmu.edu:5001/shared/airstack-dev:latest + container_name: ground-control-station + entrypoint: bash -c "service ssh restart && bash" + # Interactive shell + stdin_open: true # docker run -i + tty: true # docker run -t + # Needed to display graphical applications + ipc: host + privileged: true + environment: + - DISPLAY + - QT_X11_NO_MITSHM=1 + deploy: # let it use the GPU + resources: + reservations: + devices: + - driver: nvidia # https://stackoverflow.com/a/70761193 + count: 1 + capabilities: [gpu] + ports: # for ssh + - 2222:22 + volumes: + # display stuff + - $HOME/.Xauthority:/root/.Xauthority + - /tmp/.X11-unix:/tmp/.X11-unix # developer stuff - #- ../simulation/extension_docker/extras/.bashrc:/root/.bashrc - - .bashrc:/root/.bashrc:rw # bash config + - ./ground_control_station/.bashrc:/root/.bashrc:rw # bash config - ~/.bash_history:/root/.bash_history:rw # save cmdline history + - /var/run/docker.sock:/var/run/docker.sock # access docker API for container name + # autonomy stack stuff + - ./..:/root/AirStack:rw - restart: unless-stopped + # ============================================================================== + robot: + build: + context: ../ + dockerfile: docker/airstack-dev.dockerfile + tags: + - airlab-storage.andrew.cmu.edu:5001/shared/airstack-dev:latest + - airlab-storage.andrew.cmu.edu:5001/shared/airstack-dev:0.3.0 + image: airlab-storage.andrew.cmu.edu:5001/shared/airstack-dev:latest + # container_name: robot-1 + entrypoint: bash -c "service ssh restart && bash" + # Interactive shell + stdin_open: true # docker run -i + tty: true # docker run -t + # Needed to display graphical applications + privileged: true + networks: + - airstack_network + environment: + - DISPLAY + - QT_X11_NO_MITSHM=1 + deploy: # let it use the GPU + resources: + reservations: + devices: + - driver: nvidia # https://stackoverflow.com/a/70761193 + count: 1 + capabilities: [gpu] + ports: # for ssh, starting from 2223-2243 on the host port all map to 22 in the container. Assumes no more than 21 robots + - "2223-2243:22" + volumes: + # display stuff + - $HOME/.Xauthority:/root/.Xauthority + - /tmp/.X11-unix:/tmp/.X11-unix + # developer stuff + - ./robot/.bashrc:/root/.bashrc:rw # bash config + - ~/.bash_history:/root/.bash_history:rw # save cmdline history + - /var/run/docker.sock:/var/run/docker.sock # access docker API for container name + # autonomy stack stuff + - ./..:/root/AirStack:rw + # ============================================================================== # live mkdocs container - airlab_mkdocs: - image: theairlab.org/airstack-dev:latest - container_name: airstack_mkdocs - entrypoint: mkdocs serve - tty: true - network_mode: "host" + docs: + image: squidfunk/mkdocs-material + container_name: docs + # Interactive shell + stdin_open: true # docker run -i + tty: true # docker run -t + # network_mode: host + ports: + - "8000:8000" volumes: # autonomy stack stuff - - ./..:/root/AirStack:rw - restart: unless-stopped + - ../:/docs:rw + +networks: + airstack_network: + driver: bridge + ipam: + driver: default + config: + - subnet: 172.31.0.0/24 \ No newline at end of file diff --git a/docker/extras/.bash_history b/docker/extras/.bash_history deleted file mode 100644 index d71352ce..00000000 --- a/docker/extras/.bash_history +++ /dev/null @@ -1,742 +0,0 @@ -emacs -cat /root/.bash_hiq -cat /root/.bash_history -cd .. -find . -name .bash_history -emacs /root/.bashrc -nw -emacs /root/.bashrc -emas -emacs -cd /extras/ -ls -cd kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/ -ls -emacs extension.py -/isaac-sim/runapp.sh -fg -cd AscentAeroSystems/ -ls -chmod a+x ascent_sitl_tmux.sh -./ascent_sitl_tmux.sh -ls -fg -mv ascent_sitl.yaml AscentAeroSystemsSITLPackage/ -./ascent_sitl_tmux.sh -cd .. -/isaac-sim/runapp.sh -fg -cd AscentAeroSystems/ -mv ascent_sitl_tmux.sh ascent_sitl_tmux.bash -cd - -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -ps -e -tput reset -ps -e -fg -/isaac-sim/runapp.sh -tput reset -fg -cd AscentAeroSystems/ -./ascent_sitl_tmux.sh -./ascent_sitl_tmux.bash -fg -tmuxp laod -tmuxp load -fg -ls -cd AscentAeroSystemsSITLPackage/ -ls -tmuxp load -d ascent_sitl.yaml -tmux a -fg -ls -cd .. -./ascent_sitl_tmux.bash -fg -ls -rm *~ -ls -ls AscentAeroSystemsSITLPackage/ -/isaac-sim/runapp.sh -fg -clear -fg -/r -/isaac-sim/runapp.sh -fg -cd ../.. -ls -cd spawn_prims/ -cd ../../../../../../ -ls -./repo.sh template new -ls source/extensions/omni.example.spawn_prims/ -fg -emacs source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/extension.py -./repo.sh template new -./repo.sh build -/isaac-sim/runapp.sh -ls -cd /extras/kit-app-template/source/extensions/airlab.tmux_manager/ -ls -cd airlab/ -ls -cd tmux_manager/ -ls -emacs extension.py -tmux -tmux -tmux a -tmux ls -tmux -tmux -ls -/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_tmux.bash -fg -tmux a -fg -adsf -tmux a -ls -/isaac-sim/runapp.sh -cd /extras/kit-app-template/source/extensions/airlab.tmux_manager/airlab/tmux_manager/ -ls -emacs extension.py -apt update -apt install xterm -xterm -tmux -tmux a -tmux ls -tmux a -tmux -tmux ls -tmux a 0 -tmux a -t 0 -tmux a -t 1 -tmux a -tmux -xterm -e "echo hi" -xterm -e "echo hi; sleep 5" -xterm -e "tmux a -t 0" -tmux kill-session -tmux a -tmux -tmux kill-session --help -tmux kill-session -t 0 -tmux ls -tmux a -python -python3 -tmux k -tmux --help -tmux -tmux k -tmux a -tmux -tmux -tmux ls -tmux kill-server -tmux -tmux -python -python3 -tmux -tmux -tmux -tmux ls -tmux a -t "Ascent Spirit" -tmux a -ps -e -lsof | grep spirit -lsof | grep ascent -lsof | grep spirit -lsof | grep ascent -lsof | grep spirit -ps -e -/isaac-sim/runapp.sh -ls -cd /extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/ -ls -rm *~ -ls -emacs extension.py -fg -emacs extension.py -ros2 launch mavros apm.launch fcu_url:="udp://127.0.0.1:14554@14555" -cd /extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/ -ls -cd AscentAeroSystems/ -ls -./ascent_sitl_tmux.bash -tmux a -emacs ascent_sitl_tmux. -emacs ascent_sitl_tmux.bash -ls -cd AscentAeroSystemsSITLPackage/ -s -ls -fg -./spirit_sitl --help -fg -cd .. -ls -./ascent_sitl_tmux.bash -tmux a -fg -./ascent_sitl_tmux.bash -tmux a -fg -tmux a -fg -tmuxp load -fg -tmux a -fg -tmux a -fg -tmux a -./ascent_sitl_tmux.bash -tmux a -/isaac-sim/runapp.sh -ls /extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_tmux.bash -/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_tmux.bash 5760 14552 14553 14554 -tmux a -tmux ls -/isaac-sim/runapp.sh -tmux a -lsof | grep spirit -/isaac-sim/runapp.sh -tmux -tmux a -tmux ls -/isaac-sim/runapp.sh -./ascent_sitl_tmux.bash -tmux a -ros2 topic echo /mavros/state -/isaac-sim/runapp.sh -cd /extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/ -ls -cd AscentAeroSystems/ -ls -cd AscentAeroSystemsSITLPackage/ -ls -ks -ls -cd .. -ls -cd .. -ls -find . -name inject.so -cd - -cd -find . -name inject.so -cd / -find . -name inject.so -cd ./extras/AirLab-Autonomy-Stack/simulation/AscentAeroSystems/AscentAeroSystemsSITLPackage/ -ls -/isaac-sim/runapp.sh -ls -cat test.gdb -cd .. -ls -emacs launch_ascent_sitl.bash -fg -cd AscentAeroSystemsSITLPackage/ -g++ client_test.cpp -o client_test -./client_test -./client_test & ./client_test & ./client_test & ./client_test -fg -g++ client_test.cpp -o client_test -./client_test -fg -g++ inject.cpp -fPIC -shared inject.so -fg -g++ inject.cpp -fPIC -shared inject.so -fg -g++ inject.cpp -fPIC -shared inject.so -fg -g++ inject.cpp -fPIC -shared inject.so -ls -cd .. -ls -./launch_ascent_sitl.bash -lsof | grep spirit -fg -./launch_ascent_sitl.bash -fg -ggdb ./spirit_sitl --command=test.gdb -ex "r -S --model coaxial -I0" -fg -ggdb ./spirit_sitl --command=test.gdb -ex "r -S --model coaxial -I0" -./launch_ascent_sitl.bash -ls -cd AscentAeroSystemsSITLPackage/ -ls -rm a.out -g++ inject.cpp -fPIC -shared inject.so -ls -g++ inject.cpp -fPIC -shared -o inject.so -rm a.out -ls -g++ inject.cpp -fPIC -shared -o inject.so -ls -cd - -./launch_ascent_sitl.bash -fg -./launch_ascent_sitl.bash -fg -./launch_ascent_sitl.bash -ls -cat ascent_sitl.yaml -cd /extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ -ls -emacs ascent_sitl_tmux. -emacs ascent_sitl_tmux.bash -ls AscentAeroSystemsSITLPackage/ -cd /extras/AirLab-Autonomy-Stack/simulation/AscentAeroSystems/ -ls -cd AscentAeroSystemsSITLPackage/ -ls -emacs ../launch_ascent_sitl.bash -emacs test.gdb -./launch_ascent_sitl.bash -cd .. -./launch_ascent_sitl.bash -fg -./launch_ascent_sitl.bash -fg -./launch_ascent_sitl.bash -lsof | grep spirit -kill -9 -kill -9 482 -lsof | grep spirit -./launch_ascent_sitl.bash -fg -lsof | grep spirit -./launch_ascent_sitl.bash -fg -./launch_ascent_sitl.bash -ls -ls AscentAeroSystemsSITLPackage/ -./launch_ascent_sitl.bash -fg -ls -./launch_ascent_sitl.bash -emacs launch_ascent_sitl.bash -fg -./launch_ascent_sitl.bash -clear -./launch_ascent_sitl.bash -clear -./launch_ascent_sitl.bash -clear -./launch_ascent_sitl.bash -clear -./launch_ascent_sitl.bash -cd /extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/ -ls -emacs extension.py -cd AscentAeroSystems/AscentAeroSystemsSITLPackage/ -ls -cp /extras/AirLab-Autonomy-Stack/simulation/AscentAeroSystems/AscentAeroSystemsSITLPackage/inject.cpp . -cp /extras/AirLab-Autonomy-Stack/simulation/AscentAeroSystems/AscentAeroSystemsSITLPackage/test.gdb . -emacs Makefile -make -fg -cp /extras/AirLab-Autonomy-Stack/simulation/AscentAeroSystems/AscentAeroSystemsSITLPackage/server_test.py . -fg -/isaac-sim/runapp.sh -tmux a -tmux kill-server -tmux a -fg -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -fg -clear -fg -clear -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -lsof | grep spirit -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -ls -g++ inject.cpp -fPIC -shared -o inject.so -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -tmux ls -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -fg -clear -/isaac-sim/runapp.sh -lsof | grep spirit -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -cd .. -ls -cd .. -ls -ls AscentAeroSystems/ -ls -emacs __init__.py -emacs __pycache__/ -ls -emacs extension.py -/isaac-sim/runapp.sh -ls -cd ../../.. -cd .. -ls -cp -r * /root/Documents/Kit/shared/exts/ -/isaac-sim/runapp.sh -fg -cd /extras/kit-app-template/source/extensions/ -ls -cd omni.example.spawn_prims/ -ls -cd omni/example/spawn_prims/ -ls -cd AscentAeroSystems/ -ls -cd AscentAeroSystemsSITLPackage/ -ls -/isaac-sim/runapp.sh -emacs /root/Documents/Kit/shared/exts/omni.example.spawn_prims/omni/example/spawn_prims/extension.py -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -ros2 -ros2 topic list -ros2 topic echo /laser_scan -ros2 run rviz -ros2 run rviz2 rviz3 -ros2 run rviz2 rviz2 -tmux kill-server -/isaac-sim/runapp.sh -fg -/isaac-sim/runapp.sh -runapp -ls -cd /extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/ -ls -ls AscentAeroSystems/ -ls /extras/ -ls /sim -ls -cd /extras/ -ls -ls /root/AirStack/ -ls /root/AirStack/ros_ws/ -bws && sws -runapp -ls -ls /extras/drag_and_drop/ -ls /extras/drag_and_drop/AscentAeroSystemsSITLPackage/ -ps -e -runapp -emacs -bws && sws -ros2 launch robot_bringup launch_robot.yaml -ls -bws && sws -ros2 launch robot_bringup launch_robot.yaml -ls sim -cd /root/AirStack/ -ls -ISAACSIM_PYTHON simulation/launch_sim.py -ros2 topic info /mavros/local_position/odom -export ROS_DOMAIN_ID=109 -ros2 topic info /mavros/local_position/odom -ros2 topic info /mavros/local_position/odom --verbose -ros2 topic info --verbose /mavros/local_position/odom -ros2 topic echo /trajectory_track -ros2 topic echo /mavros/local_position/odom -ros2 topic echo /tracking_point -ros2 topic info /tracking_point -ros2 topic info --verbose /tracking_point -sws -ros2 topic echo /tracking_point -ros2 topic echo /odometry -ros2 topic list -ros2 node list -ros2 node info /odom_repub -ros2 topic echo /mavros/local_position/odom -ros2 topic info --verbose /mavros/local_position/odom -ros2 topic echo /odometry -fg -cd /extras/ros_ws/ -ls -cd -cd /root/AirStack/ros_ws/ -ls -sis -ros2 launch central px4_gazebo.xml -FG -emacs src/robot/autonomy/planning/global/central/launch/px4_gazebo.xml -ros2 launch central px4_gazebo.xml -ros2 topic list -export ROS_DOMAIN_ID=109 -ros2 topic list -ros2 launch central px4_gazebo.xml -fg -ros2 launch central px4_gazebo.xml -fg -ros2 launch central px4_gazebo.xml -colcon build --symlink-install -sis -ros2 run airstack_common odom_repub.py -colcon build --symlink-install -which python3 -ros2 run airstack_common odom_repub.py -ros2 launch central px4_gazebo.xml -colcon build --symlink-install -ros2 launch central px4_gazebo.xml -colcon build --symlink-install -ros2 launch central px4_gazebo.xml -colcon build --symlink-install -rm -rf build/ install/ log/ -ls -colcon build --symlink-install -rm -rf build/ install/ log/ -colcon build --symlink-install -fg -rm -rf build/ install/ log/ -source /opt/ros/humble/setup.bash -colcon build --symlink-install -rm -rf build/ install/ log/ -ros2 topic info --verbose /mavros/local_position/odom -ros2 topic echo /odometry -ros2 topic echo /mavros/local_position/odom -ros2 topic info --verbose /mavros/local_position/odom -ros2 topic echo /mavros/local_position/odom -ros2 topic echo /trajectory_track -ros2 topic echo /tracking_point -ros2 topic echo /trajectory_track -ros2 topic echo /odometry -ros2 topic echo /trac -ros2 topic echo /tracking_point -ros2 topic echo /trajectory_track -ros2 topic echo /trajectory_vis -ros2 topic list | grep setpoint -ros2 topic info /mavros/setpoint_raw/target_local -ros2 interface show mavros_msgs/msg/PositionTarget -ros2 topic info /mavros/setpoint_position/local -ros2 topic echo /mavros/setpoint_position/local -ros2 interface show airstack_msgs/msg/Odometry -ros2 run mavros_interface position_setpoint_pub.py -runapp -ros2 topic echo /mavros/setpoint_position/local -export ROS_DOMAIN_ID=1 -ros2 topic echo /mavros/setpoint_position/local -runapp -tmux kill-server -runapp -tmux ls -mavproxy.py --master tcp:127.0.0.1:5760 --out udp:127.0.0.1:14552 -runapp -tmux kill-server -runapp -tmux kill-server -runapp -tmux kill-server -runapp -cd ~/AirStack/ros_ws/ -ls -colcon build --symlink-install -ls -colcon build --symlink-install -sis -ros2 launch central px4_gazebo.xml -ros2 topic list -ros2 launch central px4_gazebo.xml -rm -rf build/ install/ log/ -ls -colcon build --symlink-install -ros2 launch central px4_gazebo.xml -colcon build --symlink-install -ros2 launch central px4_gazebo.xml -colcon build --symlink-install -ros2 launch central px4_gazebo.xml -ps -e -ls /proc/183185/cmdline -cat /proc/183185/cmdline -ros2 launch central px4_gazebo.xml -cat /proc/183185/cmdline -colcon build --symlink-install -ros2 launch central px4_gazebo.xml -colcon build --symlink-install -ros2 launch central px4_gazebo.xml -colcon build --symlink-install -ros2 launch central px4_gazebo.xml -ros2 topic list -cd /extras/drag_and_drop/AscentAeroSystemsSITLPackage# -ls -ls /extras/drag_and_drop/ -ls /extras/drag_and_drop/AscentAeroSystemsSITLPackage/ -ls /extras/drag_and_drop/ -ros2 topic list -export ROS_DOMAIN_ID=109 -ros2 topic list -export ROS_DOMAIN_ID=100 -ros2 topic list -export ROS_DOMAIN_ID=101` -export ROS_DOMAIN_ID=101 -ros2 topic list -export ROS_DOMAIN_ID=1 -ros2 topic list -emacs /extras/drag_and_drop/ascent_sitl.yaml -ros2 topic list -ros2 topic info /tf -ros2 topic info --verbose /tf -ros2 launch central ascent_isaac.xml -fg -ros2 launch central ascent_isaac.xml namespace:=robot1 -ros2 launch central ascent_isaac.xml __ns:=robot1 -cd /extras/drag_and_drop/AscentAeroSystemsSITLPackage# -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -clear -ros2 launch central ascent_isaac.xml __ns:=robot1 -ros2 launch central px4_gazebo.xml -colcon build --symlink-install -ros2 launch central px4_gazebo.xml -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -fg -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -rqt --force-discover -sis -rqt --force-discover -rqt -ls /root/AirStack/ros_ws/install/rqt_fixed_trajectory_generator/share/rqt_fixed_trajectory_generator/config/ -colcon build --symlink-install -rqt -ls /root/AirStack/ros_ws/install/rqt_fixed_trajectory_generator/share/rqt_fixed_trajectory_generator/config/ -colcon build --symlink-install -ls /root/AirStack/ros_ws/install/rqt_fixed_trajectory_generator/share/rqt_fixed_trajectory_generator/config/ -colcon build --symlink-install -rqt -ros2 launch central ascent_isaac.xml __ns:=robot1 -cd /extras/drag_and_drop/ -make -cd - -ls -cat ascent_sitl.yaml -cd AscentAeroSystemsSITLPackage/ -./spirit_sitl r -S --model coaxial -I0 -./spirit_sitl -S --model coaxial -I0 -echo $LD_PRELOAD -./spirit_sitl -S --model coaxial -I0 -fg -cat ascent_sitl.yaml -cat ../ascent_sitl.yaml -strace ./spirit_sitl -S --model coaxial -I0 -./spirit_sitl -S --model coaxial -I0 & mavproxy.py --master tcp:127.0.0.1:5760 --out udp:127.0.0.1:14552 -./spirit_sitl -S --model coaxial -I0 -lsof | grep spirit -kill -9 436107 -lsof | grep spirit -strace ./spirit_sitl -S --model coaxial -I0 -sudo apt install strace -apt update -apt install strace -strace ./spirit_sitl -S --model coaxial -I0 -cd .. -ls -make -emacs inject.cpp -fg -pwd -fg -cat ../ascent_sitl.yaml -cd - -cat ../ascent_sitl.yaml -fg -emacs ../test.gdb -cd .. -ls -emacs test.cpp -g++ test.cpp -o test -./test -LD_PRELOAD=/extras/drag_and_drop/inject.so ./test -fg -make -fg -make -fg -make -ls -ld AscentAeroSystemsSITLPackage/spirit_sitl -ldd AscentAeroSystemsSITLPackage/spirit_sitl -nm AscentAeroSystemsSITLPackage/spirit_sitl -nm AscentAeroSystemsSITLPackage/spirit_sitl | grep sleep -make -ls -make -fg -make -grep SIGALRM * -r -make -maek -make -cd /extras/ros_ws/ -cd - -cd ~/AirStack/ros_ws/ -sis -ros2 launch central ascent_isaac.xml __ns:=robot1 -make -cd - -make -cd - -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -colcon build --symlink-install -ros2 launch central ascent_isaac.xml __ns:=robot1 -emacs /extras/drag_and_drop/behavior_script.py -ros2 launch central ascent_isaac.xml __ns:=robot1 diff --git a/docker/extras/.thumbs/256x256/construction.usd.png b/docker/extras/.thumbs/256x256/construction.usd.png new file mode 100644 index 00000000..f62e82b0 Binary files /dev/null and b/docker/extras/.thumbs/256x256/construction.usd.png differ diff --git a/docker/extras/.thumbs/256x256/spirit_drone.usd.png b/docker/extras/.thumbs/256x256/spirit_drone.usd.png index 05f84e26..10289ced 100644 Binary files a/docker/extras/.thumbs/256x256/spirit_drone.usd.png and b/docker/extras/.thumbs/256x256/spirit_drone.usd.png differ diff --git a/docker/extras/drag_and_drop/.gitignore b/docker/extras/drag_and_drop/.gitignore index 6459da6e..585adb56 100644 --- a/docker/extras/drag_and_drop/.gitignore +++ b/docker/extras/drag_and_drop/.gitignore @@ -1,8 +1,9 @@ AscentAeroSystemsSITLPackage/ *~ +*.parm mav.parm mav.tlog mav.tlog.raw eeprom.bin logs -terrain \ No newline at end of file +terrain diff --git a/docker/extras/drag_and_drop/ascent_sitl.yaml b/docker/extras/drag_and_drop/ascent_sitl.yaml index eb4df386..a4235fe2 100644 --- a/docker/extras/drag_and_drop/ascent_sitl.yaml +++ b/docker/extras/drag_and_drop/ascent_sitl.yaml @@ -4,8 +4,8 @@ windows: layout: tiled panes: - shell_command: - - cd AscentAeroSystemsSITLPackage - - gdb spirit_sitl -q --command=../test.gdb -ex "r -S --model coaxial -I0 --base-port $BASE_PORT" + - cd /AscentAeroSystemsSITLPackage + - gdb spirit_sitl -q --command=/extras/drag_and_drop/test.gdb -ex "r -S --model coaxial -I0 --base-port $BASE_PORT" - shell_command: - echo $ASCENT_SITL_PORT - echo $ISAAC_SIM_PORT @@ -13,5 +13,9 @@ windows: - mavproxy.py --streamrate=100 --master tcp:127.0.0.1:$BASE_PORT --out udp:127.0.0.1:$ASCENT_SITL_PORT --out udp:127.0.0.1:$ISAAC_SIM_PORT --out udp:127.0.0.1:$AUTONOMY_STACK_PORT - shell_command: - sleep 5 - - export ROS_DOMAIN_ID=$ROBOT_NUM - - ros2 launch mavros apm.launch fcu_url:="udp://127.0.0.1:$AUTONOMY_STACK_PORT@$MAVROS_LAUNCH_PORT" namespace:=robot$ROBOT_NUM/mavros + - export ROS_DOMAIN_ID=$DOMAIN_ID + - ros2 launch mavros apm.launch fcu_url:="udp://127.0.0.1:$AUTONOMY_STACK_PORT@$MAVROS_LAUNCH_PORT" namespace:=$NAMESPACE/interface/mavros + - shell_command: + - sleep 7 + - export ROS_DOMAIN_ID=$DOMAIN_ID + - ros2 param set $NAMESPACE/interface/mavros/mavros use_sim_time true diff --git a/docker/extras/drag_and_drop/ascent_sitl_tmux.bash b/docker/extras/drag_and_drop/ascent_sitl_tmux.bash index c2a6db57..e3e66d37 100755 --- a/docker/extras/drag_and_drop/ascent_sitl_tmux.bash +++ b/docker/extras/drag_and_drop/ascent_sitl_tmux.bash @@ -13,7 +13,8 @@ export ASCENT_SITL_PORT=$2 # port to talk to QGC export ISAAC_SIM_PORT=$3 # port for Isaac Sim export AUTONOMY_STACK_PORT=$4 # port for our autonomy stack export MAVROS_LAUNCH_PORT=$5 -export ROBOT_NUM=$6 -export SESSION_NAME=ascent$6 +export SESSION_NAME=$6 +export DOMAIN_ID=$7 +export NAMESPACE=$8 tmuxp load -d ascent_sitl.yaml -s $SESSION_NAME diff --git a/docker/extras/drag_and_drop/behavior_script.py b/docker/extras/drag_and_drop/behavior_script.py index b93b9f01..cdac5d86 100644 --- a/docker/extras/drag_and_drop/behavior_script.py +++ b/docker/extras/drag_and_drop/behavior_script.py @@ -102,15 +102,16 @@ def f(): class TestScript(BehaviorScript): def on_init(self): - print('PRIM PATH', self.prim_path) + print('on init') + #print('PRIM PATH', self.prim_path) self.p = self.stage.GetPrimAtPath(self.prim_path) self.prop_prim = self.stage.GetPrimAtPath(str(self.prim_path) + '/spirit_uav/meshes/mesh_17') #print('YOOOOOOOOOOOO', str(self.prim_path) + '/spirit_uav/meshes/mesh_17', self.prop_prim) - print(self.p.GetAttributes()) + #print(self.p.GetAttributes()) self.p.GetAttribute('xformOp:translate').Set((0,0, 0)) self.q_type = type(self.p.GetAttribute("xformOp:orient").Get()) self.p.GetAttribute('xformOp:orient').Set(self.p.GetAttribute("xformOp:orient").Get()) - print(self.p.GetAttribute("xformOp:translate").Get()) + #print(self.p.GetAttribute("xformOp:translate").Get()) self.dronekit_connection = None self.initialized = False self.drone_count = 0 @@ -118,10 +119,11 @@ def on_init(self): self.prop_rotation_q = Quatf(0.9999619, 0, 0.0087265, 0) # 1 degree for i in range(7): self.prop_rotation_q *= self.prop_rotation_q - print(self.prop_prim.GetAttribute('xformOp:orient')) + #print(self.prop_prim.GetAttribute('xformOp:orient')) self.prop_prim.GetAttribute('xformOp:orient').Set(self.prop_prim.GetAttribute("xformOp:orient").Get()* self.prop_rotation_q) #''' + print('on init done') def on_update(self, current_time, delta_time): #print('update', current_time, delta_time) @@ -168,7 +170,8 @@ def f(): self.prop_rotation_q) #''' else: - print("Drone location from dronekit is None") + #print("Drone location from dronekit is None") + pass def on_destroy(self): print('destroy') diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/dependencies/PIP-packages-LICENSES.txt b/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/dependencies/PIP-packages-LICENSES.txt new file mode 100644 index 00000000..a6a1052a --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/dependencies/PIP-packages-LICENSES.txt @@ -0,0 +1,43 @@ +pathtools-0.1.2 +--------------- +Copyright (C) 2010 by Yesudeep Mangalapilly + +MIT License +----------- +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +watchdog-0.10.4 +--------------- +Copyright 2011 Yesudeep Mangalapilly +Copyright 2012 Google, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/dependencies/kit-omnigraph-LICENSES.txt b/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/dependencies/kit-omnigraph-LICENSES.txt new file mode 100644 index 00000000..a0fb53c5 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/dependencies/kit-omnigraph-LICENSES.txt @@ -0,0 +1,25 @@ +alembic-LICENSE.txt +boost-LICENSE.md +doctest-LICENSE.txt +doxygen-LICENSE.txt +draco-LICENSE.md +fmt-LICENSE.txt +glew-LICENSE.md +IlmBase-LICENSE.md +kit-omnigraph-LICENSE.txt +libzip-LICENSE.txt +lua-LICENSE.txt +materialx-LICENSE.txt +nv-usd-license.txt +nvindex-license.txt +omniverse client library-LICENSES.txt +openexr-LICENSE.md +opensubdiv-LICENSE.md +premake-LICENSE.txt +pybind11-LICENSE.txt +python-LICENSES.txt +tbb-LICENSE.txt +usd-LICENSE.md +usd_ext_omnigraph-LICENSE.md +zlib-LICENSE.md +zlib-LICENSE.txt diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/dependencies/kit-omnigraph-LICENSES.zip b/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/dependencies/kit-omnigraph-LICENSES.zip new file mode 100644 index 00000000..8c006b6c Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/dependencies/kit-omnigraph-LICENSES.zip differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/omni.graph.ascentnode-LICENSE.md b/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/omni.graph.ascentnode-LICENSE.md new file mode 100644 index 00000000..97494f39 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/PACKAGE-LICENSES/omni.graph.ascentnode-LICENSE.md @@ -0,0 +1,7 @@ +Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + +NVIDIA CORPORATION and its licensors retain all intellectual property +and proprietary rights in and to this software, related documentation +and any modifications thereto. Any use, reproduction, disclosure or +distribution of this software and related documentation without an express +license agreement from NVIDIA CORPORATION is strictly prohibited. \ No newline at end of file diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/__init__.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/__init__.py new file mode 100644 index 00000000..5291c25d --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/__init__.py @@ -0,0 +1,5 @@ +"""The public API """ + +__all__ = [] + +from .impl.extension import _PublicExtension # noqa: F401 diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/ascentnode_example_scripts.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/ascentnode_example_scripts.py new file mode 100644 index 00000000..83ac5ec6 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/ascentnode_example_scripts.py @@ -0,0 +1,224 @@ +# This file contains the set of example scripts for the script node. +# User can click on the Code Snippets button in the UI to display these scripts. +# To add new example scripts to the script node, +# simply add the delimiter to the bottom of this file, followed by the new script. + +# Declare og to suppress linter warnings about undefined variables +og = None + + +# # # DELIMITER # # # +Title = "Default Script" +# This script is executed the first time the script node computes, or the next time +# it computes after this script is modified or the 'Reset' button is pressed. +# +# The following callback functions may be defined in this script: +# setup(db): Called immediately after this script is executed +# compute(db): Called every time the node computes (should always be defined) +# cleanup(db): Called when the node is deleted or the reset button is pressed +# Available variables: +# db: og.Database The node interface - attributes are exposed in a namespace like db.inputs.foo and db.outputs.bar. +# Use db.log_error, db.log_warning to report problems in the compute function. +# og: The omni.graph.core module + + +def setup(db: og.Database): + pass + + +def cleanup(db: og.Database): + pass + + +def compute(db: og.Database): + return True + + +# # # DELIMITER # # # +Title = "Compute Count" + + +# In this example, we retrieve the number of times this script node has been computed +# and assign it to Output Data so that downstream nodes can use this information. +# Add these attributes first: +# outputs:my_output_attribute(int) Number of times the compute function was executed. +def compute(db): + compute_count = db.node.get_compute_count() + db.outputs.my_output_attribute = compute_count + + +# # # DELIMITER # # # +Title = "Fibonacci" +# In this example, we produce the Fibonacci sequence 0, 1, 1, 2, 3, 5, 8, 13, 21... +# Each time this node is evaluated, the next Fibonacci number will be set as the output value. +# This illustrates how variables declared in the setup script can be used to keep persistent information. +# Add these attributes first: +# outputs:my_output_attribute(int) The current number in the Fibonacci sequence. +# state:last(int) The most recent Fibonacci number. +# state:previous(int) The second-most recent Fibonacci number. + + +def compute(db): + # Bootstrap the first call + if db.state.previous == 0: + db.state.last = 0 + db.state.previous = 1 + total = db.state.last + db.state.previous + db.state.last = db.state.previous + db.state.previous = total + + db.outputs.my_output_attribute = db.state.last + + +# # # DELIMITER # # # +Title = "Controller" +# In this example, we use omni.graph.core.Controller to create cube prims. +# Each time this node is evaluated, it will create a new cube prim on the scene. +# When the 'Reset' button is pressed or the node is deleted, the created cube prims will be deleted. + +import omni.kit.commands + + +def setup(db): + state = db.per_instance_state + state.cube_count = 0 + + +def compute(db): + state = db.per_instance_state + state.cube_count += 1 + og.Controller.edit( + db.node.get_graph(), {og.Controller.Keys.CREATE_PRIMS: [(f"/World/Cube{state.cube_count}", "Cube")]} + ) + + +def cleanup(db): + import omni.usd + from pxr import Usd + + for prim in Usd.PrimRange(omni.usd.get_context().get_stage().GetPrimAtPath("/World")): + print(f"Deleting prim {prim.GetPrimPath()}", flush=True) + + state = db.per_instance_state + omni.kit.commands.execute("DeletePrims", paths=[f"/World/Cube{i}" for i in range(1, state.cube_count + 1)]) + + +# # # DELIMITER # # # +Title = "Sine Deformer With Warp" +# In this example, we deform input points using a Warp kernel, varying the deformation based on a time sequence +# Add these attributes first: +# inputs:points(pointf[3][]) Points to be deformed +# inputs:time(float) Point in time at which the deformation is to be computed +# outputs:points(pointf[3][]) Deformed positions of the points at the given time + +import omni.warp +import warp as wp + + +@wp.kernel +def deform(points_in: wp.array(dtype=wp.vec3), points_out: wp.array(dtype=wp.vec3), time: float): + tid = wp.tid() + points_out[tid] = points_in[tid] + wp.vec3(0.0, wp.sin(time + points_in[tid][0] * 0.1) * 10.0, 0.0) + + +def compute(db): + # Indicate that inputs:points and outputs:points should be stored in cuda memory. + # outputs:points can be connected to a similarly configured input to avoid + # that attribute being copied from the device + db.set_dynamic_attribute_memory_location( + on_gpu=True, + gpu_ptr_kind=og.PtrToPtrKind.CPU, + ) + with wp.ScopedDevice(f"cuda:{og.get_compute_cuda_device()}"): + points_in = omni.warp.from_omni_graph(db.inputs.points, dtype=wp.vec3) + n = db.inputs.points.shape[0] + if not n: + return + out_points = wp.zeros_like(points_in) + # launch kernel + wp.launch(kernel=deform, dim=n, inputs=[points_in, out_points, db.inputs.time]) + + # allocate output array + db.outputs.points_size = n + # copy points + points_out = omni.warp.from_omni_graph(db.outputs.points, dtype=wp.vec3) + wp.copy(points_out, out_points) + + +# # # DELIMITER # # # +Title = "Value Changed Callbacks" +# In this example, we register a value changed callback function for inputs:my_input_attribute. +# The callback is called when the value of inputs:my_input_attribute is changed from the property panel. +# Add these attributes first: +# inputs:my_input_attribute(int) The attribute triggering the callback. + + +def on_my_input_attribute_changed(attr): + print(f"inputs:my_input_attribute = {attr.get_attribute_data().get()}", flush=True) + + +def setup(db): + print("Setting up the value changed callback", flush=True) + attr = db.node.get_attribute("inputs:my_input_attribute") + attr.register_value_changed_callback(on_my_input_attribute_changed) + + +def cleanup(db): + print("Removing the value changed callback", flush=True) + attr = db.node.get_attribute("inputs:my_input_attribute") + attr.register_value_changed_callback(None) + + +def compute(db): + pass + + +# # # DELIMITER # # # +Title = "Compute Timer" +# The setup() and cleanup() functions can be used to manage resources required by the node that correspond to the +# lifetime of the node. The management of state attributes is something that would commonly be done at these times +# since such attributes persist for the life of the node and remember their values throughout. +# +# Here is an example of how you might add state information and use the `setup()` and `cleanup()` functions to create an +# accumulated execution time for a node. +# +# For this example you will not create an Action Graph. Instead, create a `Generic Graph` and add a script node to it. +# Copy and paste the snippet below into your script node's script field. No attributes are required for this example. +# +# Since the node is in a push graph it will evaluate continuously. You can periodically hit the ``Reset`` button and it +# will report the total amount of time it spent in the `compute()` function since the last time you reset it. +# +# You can see how this simple mechanism could generalize to include per-compute averages, min and max times, etc. +# If you wish to accumulate all of the data you could even add a file descriptor to your internal state information, +# opening the file in the `setup()` function, printing to it in the `compute()` function, and closing it in the +# `cleanup()` function to create a journal of every computation time. --> + + +import time + + +def setup(db: og.Database): + """Initialize the timing information to start at 0.0""" + db.per_instance_state.elapsed = 0.0 + print("Initialize the elapsed time", flush=True) + + +def cleanup(db: og.Database): + """Report the final timing information""" + print(f"Total time spent in the script compute = {db.per_instance_state.elapsed}", flush=True) + + +def compute(db: og.Database): + """Accumulate the timing information for each compute. + For the `compute()` a simple delay will serve to illustrate how the time accumulates as the node executes. As with any + other node, the database has a member called `per_instance_state` in which you can store any data that belongs to the node + which will persist for the lifetime of that node. + """ + + start_time = time.perf_counter() + time.sleep(0.1) # Normally this would be your actual computation + end_time = time.perf_counter() + + db.per_instance_state.elapsed = db.per_instance_state.elapsed + (end_time - start_time) + + return True diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/extension.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/extension.py new file mode 100644 index 00000000..32a7a280 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/extension.py @@ -0,0 +1,300 @@ +"""Support required by the Carbonite extension loader""" + +import asyncio +from contextlib import suppress +from typing import List +import threading +import socket +import struct +import time + +import carb +import carb.dictionary +import omni +import omni.ext +import omni.graph.core as og +from omni.kit.app import get_app +from omni.isaac.core.world import World + +ASCENTNODE_OPT_IN_SETTING = "/app/airlab.airstack/opt_in" +ASCENTNODE_ENABLE_OPT_IN_SETTING = "/app/airlab.airstack/enable_opt_in" +OMNIGRAPH_STAGEUPDATE_ORDER = 100 # We want our attach() to run after OG so that nodes have been instantiated + + +# ============================================================================================================== +def set_all_graphs_enabled(enable: bool): + """Set the enabled state of all OmniGraphs""" + graphs = og.get_all_graphs() + if graphs and not isinstance(graphs, list): + graphs = [graphs] + for graph in graphs: + graph.set_disabled(not enable) + + +# ============================================================================================================== +def is_check_enabled(): + """Returns True if ascentnode opt-in is enabled""" + settings = carb.settings.get_settings() + if not settings.is_accessible_as(carb.dictionary.ItemType.BOOL, ASCENTNODE_ENABLE_OPT_IN_SETTING): + # The enable-setting is not present, we enable the check + return True + + if not settings.get(ASCENTNODE_ENABLE_OPT_IN_SETTING): + # The enable-setting is present and False, disable the check + return False + # the enable-setting is present and True, enable the check + return True + + +# ============================================================================================================== +def on_opt_in_change(item: carb.dictionary.Item, change_type: carb.settings.ChangeEventType): + """Update the local cache of the setting value""" + if change_type != carb.settings.ChangeEventType.CHANGED: + return + settings = carb.settings.get_settings() + should_run = bool(settings.get(ASCENTNODE_OPT_IN_SETTING)) + if should_run: + set_all_graphs_enabled(True) + + +# ============================================================================================================== +def verify_ascentnode_load(script_nodes: List[og.Node]): + """ + Get verification from the user that they want to run ascentnodes. + This opt-in applies to the current session only. + + Args: + script_nodes: The list of script nodes on the stage that have + been disabled. + """ + from omni.kit.window.popup_dialog import MessageDialog + + def on_cancel(dialog: MessageDialog): + settings = carb.settings.get_settings() + settings.set(ASCENTNODE_OPT_IN_SETTING, False) + dialog.hide() + + def on_ok(dialog: MessageDialog): + settings = carb.settings.get_settings() + settings.set(ASCENTNODE_OPT_IN_SETTING, True) + dialog.hide() + + message = """ +This stage contains ascentnodes. + +There is currently no limitation on what code can be executed by this node. This means that graphs that contain these nodes should only be used when the author of the graph is trusted. + +Do you want to enable the ascentnode functionality for this session? +""" + + dialog = MessageDialog( + title="Warning", + width=400, + message=message, + cancel_handler=on_cancel, + ok_handler=on_ok, + ok_label="Yes", + cancel_label="No", + ) + + async def show_async(): + # wait a few frames to allow the app ui to finish loading + await omni.kit.app.get_app().next_update_async() + await omni.kit.app.get_app().next_update_async() + dialog.show() + + asyncio.ensure_future(show_async()) + + +# ============================================================================================================== +def check_for_ascentnodes(): + """ + Check for presence of airlab.airstack instances and confirm user wants to enable them. + """ + # If the check is not enabled then we are good + if not is_check_enabled(): + return + + # Check is enabled - see if they already opted-in + settings = carb.settings.get_settings() + ascentnode_opt_in = settings.get(ASCENTNODE_OPT_IN_SETTING) + if ascentnode_opt_in: + # The check is enabled, and they opted-in + return + + # The check is enabled but they opted out, or haven't been prompted yet + + try: + import omni.kit.window.popup_dialog # noqa + except ImportError: # pragma: no cover + # Don't prompt in headless mode + return + script_nodes = [] + graphs = og.get_all_graphs() + if graphs and not isinstance(graphs, list): + graphs = [graphs] + for graph in graphs: + for node in graph.get_nodes(): + node_type = node.get_node_type() + if node_type.get_node_type() == "airlab.airstack.AscentNode": + # Found one + script_nodes.append(node) + if not script_nodes: + # No script nodes means we can leave them enabled + return + + # Disable them until we get the opt-in via the async dialog + set_all_graphs_enabled(False) + verify_ascentnode_load(script_nodes) + + +def on_attach(ext_id: int, _): + """Called when USD stage is attached""" + check_for_ascentnodes() + + +# ============================================================================================================== +class TimeSyncServer: + def __init__(self, host='127.0.0.1', port=65432): + self.mutex = threading.Lock() + self.client_count = 1 + self.current_sim_time = 0. + + try: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind((host, port)) + s.listen() + print(f'Server listening on {host}:{port}') + def f(): + while True: + conn, addr = s.accept() + client_thread = threading.Thread(target=self.handle_client, args=(conn, addr)) + client_thread.start() + threading.Thread(target=f).start() + except: + client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + client.connect((host, port)) + message = struct.pack('cQ', b'n', 0) + client.sendall(message) + drone_count = struct.unpack('i', client.recv(4))[0] + + def get_sim_time(self): + return self.current_sim_time + + def handle_client(self, conn, addr): + print(f'Connected by {addr}') + + initial_sitl_time = -1. + initial_sim_time = -1. + + with conn: + while True: + data = conn.recv(16) + if not data: + break + + #print('data', len(data), data) + message_type, t = struct.unpack('cQ', data) + #print('message type', message_type, t) + if message_type == b't': + s = self.get_sim_time() + + if initial_sitl_time < 0: + initial_sitl_time = t + initial_sim_time = s + + sitl_time = t - initial_sitl_time + sim_time = (s - initial_sim_time)*1000000 + time_to_sleep = int(sitl_time - sim_time) + #print('sitl, sim, sleep', sitl_time, sim_time, time_to_sleep, self.get_sim_time(), self.current_sim_time, initial_sim_time) + + conn.sendall(struct.pack('i', time_to_sleep)) + elif message_type == b'n': + print('message type', message_type, t) + with self.mutex: + self.client_count += 1 + conn.sendall(struct.pack('i', self.client_count)) + + def set_current_sim_time(self, current_sim_time): + self.current_sim_time = current_sim_time + + +# ============================================================================================================== +class _PublicExtension(omni.ext.IExt): + """Object that tracks the lifetime of the Python part of the extension loading""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.__stage_subscription = None + self.__opt_in_setting_sub = None + + with suppress(ImportError): + manager = get_app().get_extension_manager() + # This is a bit of a hack to make the template directory visible to the OmniGraph UI extension + # if it happens to already be enabled. The "hack" part is that this logic really should be in + # omni.graph.ui, but it would be much more complicated there, requiring management of extensions + # that both do and do not have dependencies on omni.graph.ui. + if manager.is_extension_enabled("omni.graph.ui"): + import omni.graph.ui as ogui # noqa: PLW0621 + + ogui.ComputeNodeWidget.get_instance().add_template_path(__file__) + + def on_startup(self): + stage_update = omni.stageupdate.get_stage_update_interface() + self.__stage_subscription = stage_update.create_stage_update_node("OmniGraphAttach", on_attach_fn=on_attach) + assert self.__stage_subscription + nodes = stage_update.get_stage_update_nodes() + stage_update.set_stage_update_node_order(len(nodes) - 1, OMNIGRAPH_STAGEUPDATE_ORDER + 1) + self.__opt_in_setting_sub = omni.kit.app.SettingChangeSubscription(ASCENTNODE_OPT_IN_SETTING, on_opt_in_change) + assert self.__opt_in_setting_sub + + # init variables + self.current_sim_time = 0. + self.time_sync_server = TimeSyncServer() + + # init timeline callback + self.timeline = omni.timeline.get_timeline_interface() + self.play_listener = self.timeline.get_timeline_event_stream().create_subscription_to_pop_by_type( + int(omni.timeline.TimelineEventType.PLAY), self.timeline_callback) + self.pause_listener = self.timeline.get_timeline_event_stream().create_subscription_to_pop_by_type( + int(omni.timeline.TimelineEventType.PAUSE), self.timeline_callback) + self.stop_listener = self.timeline.get_timeline_event_stream().create_subscription_to_pop_by_type( + int(omni.timeline.TimelineEventType.STOP), self.timeline_callback) + + # init physics callback + self.init_physics() + + def init_physics(self, was_playing=False): + self.world = World() + if self.world._physics_context != None: + print('physics already initialized') + return + async def init_physics(): + if self.world._physics_context == None: + await self.world.initialize_simulation_context_async() + if was_playing: + self.world.play() + self.world.add_physics_callback('airstack_physics_callback', self.physics_callback) + print('added physics callback', self.world._physics_context) + asyncio.ensure_future(init_physics()) + + def timeline_callback(self, event): + print('timeline callback', event, event.type, dir(event)) + + if event.type == int(omni.timeline.TimelineEventType.PLAY): + self.init_physics(True) + elif event.type == int(omni.timeline.TimelineEventType.PAUSE): + self.init_physics() + elif event.type == int(omni.timeline.TimelineEventType.STOP): + self.current_sim_time = 0. + + def physics_callback(self, sim_time_delta): + self.current_sim_time += sim_time_delta + #print('setting time', self.current_sim_time) + self.time_sync_server.set_current_sim_time(self.current_sim_time) + + def on_shutdown(self): + print('SHUTDOWN') + self.__stage_subscription = None + self.__opt_in_setting_sub = None + self.world.remove_physics_callback('airstack_physics_callback') diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/parse_examples.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/parse_examples.py new file mode 100644 index 00000000..4930d02e --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/parse_examples.py @@ -0,0 +1,26 @@ +"""Helper to parse the snippets out of the example file""" + +from pathlib import Path + + +# ============================================================================================================== +def extract_snippets() -> list[tuple[str, str]]: + """Read the sample file containing the script node snippets in a standard form and parse out the scripts. + Returns: + List of (title, script) strings for each snippet in the file. + Raises: + IOError if the script node sample file could not be read + """ + snippets = [] + example_scripts_path = Path(__file__).parent / "ascentnode_example_scripts.py" + with open(example_scripts_path, "r", encoding="utf-8") as file: + file_contents = file.read().split("# # # DELIMITER # # #") + for script in file_contents[1:]: + script = script.strip() + script_lines = script.splitlines(keepends=True) + script_title_line = script_lines[0] + script_title = script_title_line.strip()[9:-1] + script_content = "".join(script_lines[1:]) + snippets.append((script_title, script_content)) + + return snippets diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/templates/template_omni.graph.ascentnode.AscentNode.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/templates/template_omni.graph.ascentnode.AscentNode.py new file mode 100644 index 00000000..c3e4a73b --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/impl/templates/template_omni.graph.ascentnode.AscentNode.py @@ -0,0 +1,807 @@ +"""Custom property panel layout for airlab.airstack""" + +import asyncio +import os +import shutil +import subprocess +import weakref +from functools import partial + +import carb.settings +import omni.client +import omni.graph.core as og +import omni.graph.tools as ogt +import omni.graph.tools.ogn as ogn +import omni.ui as ui +from airlab.airstack.ogn.OgnAscentNodeDatabase import OgnAscentNodeDatabase +from omni.graph.ui import OmniGraphAttributeModel, OmniGraphPropertiesWidgetBuilder +from omni.kit.property.usd.custom_layout_helper import CustomLayoutFrame, CustomLayoutGroup, CustomLayoutProperty +from omni.kit.property.usd.usd_attribute_widget import UsdPropertyUiEntry +from omni.kit.property.usd.usd_property_widget import UsdPropertiesWidgetBuilder +from omni.kit.widget.text_editor import TextEditor +from pxr import Sdf, Usd + +EXT_PATH = omni.kit.app.get_app().get_extension_manager().get_extension_path_by_module("airlab.airstack") +ICONS_PATH = f"{EXT_PATH}/icons" +FONTS_PATH = f"{EXT_PATH}/fonts" +ATTRIB_LABEL_STYLE = {"alignment": ui.Alignment.LEFT_TOP} + + +# ========================================================================================== +# Destroy a window after a delay. Useful for having a widget callback destroy its own +# window without crashing Kit. +# +# One drawback to this approach is that this embeds a reference to the window which may keep it +# alive if it is closed by other means (e.g. using its close icon). This can usually be overcome +# by giving the window a visibility_changed_fn which also calls this. +def _delayed_destroy_window(window: ui.Window, num_ticks=1): + async def do_destroy(window, num_ticks): + # The window might be destroyed by other means while we're waiting. Get a weak reference to it. + window_ref = weakref.ref(window) + for _ in range(num_ticks): + await omni.kit.app.get_app().next_update_async() + window = window_ref() + if window is not None: + window.destroy() + + asyncio.ensure_future(do_destroy(window, num_ticks)) + + +class ComboBoxOption(ui.AbstractItem): + """Provide a conversion from simple text to a StringModel to be used in ComboBox options""" + + def __init__(self, text: str): + super().__init__() + self.model = ui.SimpleStringModel(text) + + def destroy(self): + self.model = None + + +class ComboBoxModel(ui.AbstractItemModel): + """The underlying model of a combo box""" + + def __init__(self, option_names, option_values, current_value, on_value_changed_callback): + super().__init__() + self.option_names = option_names + self.option_values = option_values + self.on_value_changed_callback = on_value_changed_callback + self._current_index = ui.SimpleIntModel(self.option_values.index(current_value)) + self._current_index.add_value_changed_fn(self._on_index_changed) + self._items = [ComboBoxOption(option) for option in self.option_names] + + def destroy(self): + ogt.destroy_property(self, "_current_index") + ogt.destroy_property(self, "_items") + + def get_item_children(self, item): + return self._items + + def get_item_value_model(self, item, column_id: int): + if item is None: + return self._current_index # combo box expects index model on item == None + return item.model + + def _on_index_changed(self, new_index: ui.SimpleIntModel): + new_value = self.option_values[new_index.as_int] + self.on_value_changed_callback(new_value) + self._item_changed(None) + + +class CreateAttributePopupDialog: + """The popup dialog for creating new dynamic attribute on the script node""" + + def __init__(self, create_new_attribute_callback, **kwargs): + self.create_new_attribute_callback = create_new_attribute_callback + self.all_supported_types = [] + self.all_displayed_types = [] + self.all_sdf_types = [] + self.window = None + self.attribute_name_field = None + self.port_type_radio_collection = None + self.input_port_button = None + self.output_port_button = None + self.state_port_button = None + self.scrolling_frame = None + self.selected_type_button = None + self.selected_memory_type = None + self.selected_cuda_pointers = None + self.error_message_label = None + + self.get_all_supported_types() + self.build_popup_dialog() + + def get_all_supported_types(self): + """Get a list of types that can be added to the script node""" + # "any" types need to be manually resolved by script writers, + # "transform" types are marked for deprecation in USD, so we don't want to support them + self.all_supported_types = [ + attr_type + for attr_type in ogn.supported_attribute_type_names() + if attr_type != "any" and attr_type[:9] != "transform" + ] + self.all_displayed_types = self.all_supported_types + self.all_sdf_types = [ + og.AttributeType.sdf_type_name_from_type(og.AttributeType.type_from_ogn_type_name(attr_type)) or "" + for attr_type in self.all_supported_types + ] + + def build_scrolling_frame(self): + """Build the scrolling frame underneath the search bar""" + + def _on_type_selected(button): + if self.selected_type_button is not None: + self.selected_type_button.checked = False + self.selected_type_button = button + self.selected_type_button.checked = True + + self.scrolling_frame.clear() + with self.scrolling_frame: + with ui.VStack(): + for displayed_type in self.all_displayed_types: + button = ui.Button(displayed_type, height=20) + button.set_clicked_fn(partial(_on_type_selected, button)) + + def build_popup_dialog(self): + def filter_types_by_prefix(text): + """Callback executed when the user presses enter in the search bar""" + if text is None: + self.all_displayed_types = self.all_supported_types + else: + text = text[0] + self.all_displayed_types = [ + displayed_type + for i, displayed_type in enumerate(self.all_supported_types) + if (displayed_type.startswith(text) or self.all_sdf_types[i].startswith(text)) + ] + self.build_scrolling_frame() + self.selected_type_button = None + + def on_create_new_attribute(weak_self): + """Callback executed when the user creates a new dynamic attribute""" + ref_self = weak_self() + if not ref_self.attribute_name_field.model.get_value_as_string(): + ref_self.error_message_label.text = "Error: Attribute name cannot be empty!" + return + + if not ref_self.attribute_name_field.model.get_value_as_string()[0].isalpha(): + ref_self.error_message_label.text = "Error: The first character of attribute name must be a letter!" + return + + if ( + not ref_self.input_port_button.checked + and not ref_self.output_port_button.checked + and not ref_self.state_port_button.checked + ): + ref_self.error_message_label.text = "Error: You must select a port type!" + return + + if ref_self.selected_type_button is None: + ref_self.error_message_label.text = "Error: You must select a type for the new attribute!" + return + + attrib_name = ref_self.attribute_name_field.model.get_value_as_string() + attrib_port_type = og.AttributePortType.ATTRIBUTE_PORT_TYPE_INPUT + if ref_self.output_port_button.checked: + attrib_port_type = og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT + elif ref_self.state_port_button.checked: + attrib_port_type = og.AttributePortType.ATTRIBUTE_PORT_TYPE_STATE + attrib_type_name = ref_self.selected_type_button.text + attrib_type = og.AttributeType.type_from_ogn_type_name(attrib_type_name) + ref_self.create_new_attribute_callback( + attrib_name, + attrib_port_type, + attrib_type, + ref_self.selected_memory_type, + ref_self.selected_cuda_pointers, + ) + + ref_self.window.visible = False + + def on_cancel_clicked(weak_self): + ref_self = weak_self() + ref_self.window.visible = False + + window_flags = ui.WINDOW_FLAGS_NO_RESIZE | ui.WINDOW_FLAGS_MODAL + self.window = ui.Window( + "Add Attribute", + width=400, + height=0, + padding_x=15, + padding_y=15, + flags=window_flags, + ) + input_field_width = ui.Percent(80) + + with self.window.frame: + with ui.VStack(spacing=10): + # Attribute name string field + with ui.HStack(height=0): + ui.Label("Name") + self.attribute_name_field = ui.StringField( + width=input_field_width, height=20, identifier="_ascentnode_name" + ) + + # Attribute port type radio button + with ui.HStack(height=0): + ui.Label("Port Type") + self.port_type_radio_collection = ui.RadioCollection() + with ui.HStack(width=input_field_width, height=20): + self.input_port_button = ui.RadioButton( + text="input", radio_collection=self.port_type_radio_collection + ) + self.output_port_button = ui.RadioButton( + text="output", radio_collection=self.port_type_radio_collection + ) + self.state_port_button = ui.RadioButton( + text="state", radio_collection=self.port_type_radio_collection + ) + + # Attribute type search bar + with ui.HStack(height=0): + ui.Label("Data Type", alignment=ui.Alignment.LEFT_TOP) + with ui.VStack(width=input_field_width): + # Search bar + try: + from omni.kit.widget.searchfield import SearchField + + SearchField( + show_tokens=False, on_search_fn=filter_types_by_prefix, subscribe_edit_changed=True + ) + except ImportError: + # skip the search bar if the module cannot be imported + pass + # List of attribute types + self.scrolling_frame = ui.ScrollingFrame( + height=150, + horizontal_scrollbar_policy=ui.ScrollBarPolicy.SCROLLBAR_ALWAYS_OFF, + vertical_scrollbar_policy=ui.ScrollBarPolicy.SCROLLBAR_AS_NEEDED, + style_type_name_override="TreeView", + ) + self.build_scrolling_frame() + + # TODO: Uncomment this block when dynamic attributes support memory types + # # Attribute memory type combo box + # with ui.HStack(height=0): + # ui.Label("Attribute Memory Type: ") + # memory_type_option_names = ["CPU", "CUDA", "Any"] + # memory_type_option_values = [ogn.MemoryTypeValues.CPU, + # ogn.MemoryTypeValues.CUDA, ogn.MemoryTypeValues.ANY] + # self.selected_memory_type = ogn.MemoryTypeValues.CPU + # def _on_memory_type_selected(new_memory_type): + # self.selected_memory_type = new_memory_type + # ui.ComboBox( + # ComboBoxModel( + # memory_type_option_names, + # memory_type_option_values, + # self.selected_memory_type, + # _on_memory_type_selected, + # ), + # width=input_field_width, + # ) + + # # CUDA pointers combo box + # with ui.HStack(height=0): + # ui.Label("CUDA Pointers: ") + # cuda_pointers_option_names = ["CUDA", "CPU"] + # cuda_pointers_option_values = [ogn.CudaPointerValues.CUDA, ogn.CudaPointerValues.CPU] + # self.selected_cuda_pointers = ogn.CudaPointerValues.CUDA + # def _on_cuda_pointers_selected(new_cuda_pointers): + # self.selected_cuda_pointers = new_cuda_pointers + # ui.ComboBox( + # ComboBoxModel( + # cuda_pointers_option_names, + # cuda_pointers_option_values, + # self.selected_cuda_pointers, + # _on_cuda_pointers_selected, + # ), + # width=input_field_width, + # ) + + # OK button to confirm selection + with ui.HStack(height=0): + ui.Spacer() + with ui.HStack(width=input_field_width, height=20): + ui.Button( + "OK", + clicked_fn=lambda weak_self=weakref.ref(self): on_create_new_attribute(weak_self), + identifier="_ascentnode_add_ok", + ) + ui.Button( + "Cancel", + clicked_fn=lambda weak_self=weakref.ref(self): on_cancel_clicked(weak_self), + identifier="_ascentnode_add_cancel", + ) + + # Some empty space to display error messages if needed + self.error_message_label = ui.Label( + " ", height=20, alignment=ui.Alignment.H_CENTER, style={"color": 0xFF0000FF} + ) + + +class ScriptTextbox(TextEditor): + def __init__(self, script_model: OmniGraphAttributeModel): + super().__init__( + syntax=TextEditor.Syntax.PYTHON, + style={"font": f"{FONTS_PATH}/DejaVuSansMono.ttf"}, + text=script_model.get_value_as_string(), + ) + self.script_model = script_model + self.script_model_callback_id = self.script_model.add_value_changed_fn(self._on_script_model_changed) + + self.set_edited_fn(self._on_script_edited) + + def _on_script_edited(self, text_changed: bool): + if text_changed: + # Don't trigger the model changed callback when script is edited + self.script_model.remove_value_changed_fn(self.script_model_callback_id) + # Remove the newline that TextEditor adds or else it will accumulate + self.script_model.set_value(self.text[:-1]) + self.script_model_callback_id = self.script_model.add_value_changed_fn(self._on_script_model_changed) + + def _on_script_model_changed(self, script_model): + self.text = script_model.get_value_as_string() # noqa: PLW0201 + + +class CustomLayout: + def __init__(self, compute_node_widget): + self.remove_attribute_menu = None + self.code_snippets_menu = None + self.enable = True + self.compute_node_widget = compute_node_widget + self.node_prim_path = self.compute_node_widget._payload[-1] + self.node = og.Controller.node(self.node_prim_path) + self.script_textbox_widget = None + self.script_textbox_model = None + self.script_textbox_resizer = None + self.script_path_model = None + self.script_selector_window = None + self.external_script_editor = None + self.external_script_editor_ui_name = None + self.DEFAULT_SCRIPT = "" + self.EXAMPLE_SCRIPTS = [] + self.EXAMPLE_SCRIPTS_TITLE = [] + self.add_attribute_button = None + self.remove_attribute_button = None + self.code_snippets_button = None + self.use_path_model = None + self.EXISTING_ATTRIBUTES = [ + "inputs:script", + "inputs:scriptPath", + "inputs:usePath", + "inputs:execIn", + "outputs:execOut", + "state:omni_initialized", + "node:type", + "node:typeVersion", + ] + + # Retrieve the example scripts + cur_file_path = os.path.abspath(os.path.dirname(__file__)) + example_scripts_path = os.path.join(cur_file_path, "..", "ascentnode_example_scripts.py") + + with open(example_scripts_path, "r", encoding="utf-8") as file: + file_contents = file.read().split("# # # DELIMITER # # #") + for script in file_contents[1:]: + script = script.strip() + script_lines = script.splitlines(keepends=True) + script_title_line = script_lines[0] + script_title = script_title_line.strip()[9:-1] + script_content = "".join(script_lines[1:]) + + if script_title == "Default Script": + self.DEFAULT_SCRIPT = script_content + else: + self.EXAMPLE_SCRIPTS.append(script_content) + self.EXAMPLE_SCRIPTS_TITLE.append(script_title) + + # Determine the external script editor + # Check the settings + editor = carb.settings.get_settings().get("/app/editor") + if not editor: + # Check the environment variable EDITOR + editor = os.environ.get("EDITOR", None) + if not editor: + # Default to VSCode + editor = "code" + + # Remove quotes from the editor name if present + if editor[0] == '"' and editor[-1] == '"': + editor = editor[1:-1] + + # Get the user-friendly editor name + editor_ui_name = editor + if editor == "code": + editor_ui_name = "VSCode" + elif editor == "notepad": + editor_ui_name = "Notepad" + + # Check that the editor exists and is executable + if not (os.path.isfile(editor) and os.access(editor, os.X_OK)): + try: + editor = shutil.which(editor) + except shutil.Error: + editor = None + + if not editor: + # Resort to notepad on windows and gedit on linux + if os.name == "nt": + editor = "notepad" + editor_ui_name = "Notepad" + else: + editor = "gedit" + editor_ui_name = "gedit" + + self.external_script_editor = editor + self.external_script_editor_ui_name = editor_ui_name + + def retrieve_existing_attributes(self): + """Retrieve the dynamic attributes that already exist on the node""" + all_attributes = self.node.get_attributes() + inputs = [ + attrib + for attrib in all_attributes + if attrib.get_port_type() == og.AttributePortType.ATTRIBUTE_PORT_TYPE_INPUT + ] + outputs = [ + attrib + for attrib in all_attributes + if attrib.get_port_type() == og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT + ] + states = [ + attrib + for attrib in all_attributes + if attrib.get_port_type() == og.AttributePortType.ATTRIBUTE_PORT_TYPE_STATE + ] + return (all_attributes, inputs, outputs, states) + + def _on_script_textbox_resizer_dragged(self, offset_y: ui.Length): + self.script_textbox_resizer.offset_y = max(offset_y.value, 50) + + def _script_textbox_build_fn(self, ui_prop: UsdPropertyUiEntry, *args): + """Build the textbox used to input custom scripts""" + self.script_textbox_model = OmniGraphAttributeModel( + self.compute_node_widget.stage, [self.node_prim_path.AppendProperty("inputs:script")], False, {} + ) + if self.script_textbox_model.get_value_as_string() == "": + self.script_textbox_model.set_value(self.DEFAULT_SCRIPT) + + with ui.ZStack(): + with ui.VStack(): + self.script_textbox_widget = ScriptTextbox(self.script_textbox_model) + # Disable editing if the script value comes from an upstream connection + if og.Controller.attribute("inputs:script", self.node).get_upstream_connection_count() > 0: + self.script_textbox_widget.read_only = True # noqa: PLW0201 + ui.Spacer(height=12) + # Add a draggable bar below the script textbox to resize it + self.script_textbox_resizer = ui.Placer(offset_y=200, draggable=True, drag_axis=ui.Axis.Y) + self.script_textbox_resizer.set_offset_y_changed_fn(self._on_script_textbox_resizer_dragged) + with self.script_textbox_resizer: + script_textbox_resizer_style = { + ":hovered": {"background_color": 0xFFB0703B}, + ":pressed": {"background_color": 0xFFB0703B}, + } + with ui.ZStack(height=12): + ui.Rectangle(style=script_textbox_resizer_style) + with ui.HStack(height=12): + ui.Label( + "V", alignment=ui.Alignment.CENTER, tooltip="Drag this handle to resize the script editor" + ) + + def _reset_button_build_fn(self, *args): + """Build button that calls the cleanup script and forces the setup script to be called on next compute""" + + def do_reset(): + """Call the user-defined cleanup function and set state:omni_initialized to false""" + OgnAscentNodeDatabase.NODE_TYPE_CLASS.try_cleanup(self.node) + + ui.Button( + "Reload Script", + identifier="_ascentnode_reset", + clicked_fn=do_reset, + tooltip="Execute the setup script again on the next compute and recompile if necessary", + ) + + def _add_attribute_button_build_fn(self, *args): + def create_dynamic_attribute( + weak_self, attrib_name, attrib_port_type, attrib_type, attrib_memory_type, cuda_pointers + ): + self_ref = weak_self() + if ( + attrib_name == "execOut" + and attrib_port_type == og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT + and attrib_type.get_ogn_type_name() == "execution" + ): + # Unhide outputs:execOut instead of creating it + self_ref.node.get_attribute("outputs:execOut").set_metadata(ogn.MetadataKeys.HIDDEN, None) + return + + new_attribute = og.Controller.create_attribute(self_ref.node, attrib_name, attrib_type, attrib_port_type) + if new_attribute is None: + return + + if attrib_type.get_type_name() == "prim" and attrib_port_type in ( + og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT, + og.AttributePortType.ATTRIBUTE_PORT_TYPE_STATE, + ): + # For bundle output/state attribs, the default UI name contains the port type, so we set it here instead + def make_ui_name(attrib_name: str): + parts_out = [] + words = attrib_name.replace("_", " ").split(" ") + for word in words: # noqa: PLR1702 + if word.islower() or word.isupper(): + parts_out += [word] + else: + # Mixed case. + # Lower-case followed by upper-case breaks between them. E.g. 'usdPrim' -> 'usd Prim' + # Upper-case followed by lower-case breaks before them. E.g: 'USDPrim' -> 'USD Prim' + # Combined example: abcDEFgHi -> abc DE Fg Hi + sub_word = "" + uppers = "" + for c in word: + if c.isupper(): + if not uppers: # noqa: SIM102 + if sub_word: + parts_out += [sub_word] + sub_word = "" + uppers += c + else: + if len(uppers) > 1: + parts_out += [uppers[:-1]] + sub_word += uppers[-1:] + c + uppers = "" + + if sub_word: + parts_out += [sub_word] + elif uppers: + parts_out += [uppers] + + # Title-case any words which are all lower case. + parts_out = [part.title() if part.islower() else part for part in parts_out] + return " ".join(parts_out) + + new_attribute.set_metadata(ogn.MetadataKeys.UI_NAME, make_ui_name(attrib_name)) + + # TODO: Uncomment this when dynamic attributes support memory types + # new_attribute.set_metadata(ogn.MetadataKeys.MEMORY_TYPE, attrib_memory_type) + # new_attribute.set_metadata(ogn.MetadataKeys.CUDA_POINTERS, cuda_pointers) + self_ref.compute_node_widget.rebuild_window() + + def on_click_add(weak_self): + """Post the "Add Attribute" window""" + dialog = CreateAttributePopupDialog(partial(create_dynamic_attribute, weak_self)) + + def close_window(): + window = dialog.window + dialog.window = None # ensure we aren't still holding on to the window going in to GC + _delayed_destroy_window(window) + + # Called when the window is hidden by the dialog buttons or the close icon + def visibility_changed(is_visible: bool): + if not is_visible: + close_window() + + dialog.window.set_visibility_changed_fn(visibility_changed) + + self.add_attribute_button = ui.Button( + "Add Attribute...", + identifier="_ascentnode_add_attribute", + clicked_fn=partial(on_click_add, weakref.ref(self)), + ) + + def _remove_attribute_button_build_fn(self, *args): + def remove_dynamic_attribute(weak_self, attrib): + ref_self = weak_self() + if attrib.get_name() == "outputs:execOut": + # Hide outputs:execOut instead of removing it + og.Controller.disconnect_all(("outputs:execOut", ref_self.node)) + attrib.set_metadata(ogn.MetadataKeys.HIDDEN, "1") + return + + success = og.Controller.remove_attribute(attrib) + if not success: + return + self.compute_node_widget.rebuild_window() + + def _remove_attribute_menu_build_fn(weak_self): + ref_self = weak_self() + ref_self.remove_attribute_menu = ui.Menu("Remove Attribute") + (all_attributes, _, _, _) = ref_self.retrieve_existing_attributes() + with ref_self.remove_attribute_menu: + for attrib in all_attributes: + name = attrib.get_name() + # These attributes were not created by user so they are not deletable, + # except for outputs:execOut, which can be hidden if not already hidden + if not attrib.is_dynamic() and not ( + name == "outputs:execOut" and attrib.get_metadata(ogn.MetadataKeys.HIDDEN) != "1" + ): + continue + # Any attribute without the inputs:/outputs:/state: prefix were not created by user so they are + # not deletable, except for bundle output and state attributes, which are delimited with '_' + if ( + name[:7] != "inputs:" + and name[:8] != "outputs:" + and name[:6] != "state:" + and not ( + attrib.get_type_name() == "bundle" and (name[:8] == "outputs_" or name[:6] == "state_") + ) + ): + continue + # Otherwise we should allow user to delete this attribute + ui.MenuItem(name, triggered_fn=partial(remove_dynamic_attribute, weak_self, attrib)) + self.remove_attribute_menu.show() + + self.remove_attribute_button = ui.Button( + "Remove Attribute...", + identifier="_ascentnode_remove_attribute", + clicked_fn=lambda weak_self=weakref.ref(self): _remove_attribute_menu_build_fn(weak_self), + ) + + def _special_control_build_fn(self, *args): + with ui.HStack(): + UsdPropertiesWidgetBuilder._create_label("") # noqa: PLW0212 + ui.Spacer(width=7) + self._add_attribute_button_build_fn() + ui.Spacer(width=8) + self._remove_attribute_button_build_fn() + + def _get_absolute_script_path(self): + """Get the possibly relative path in inputs:scriptPath as an absolute path""" + script_path = og.Controller.get(og.Controller.attribute("inputs:scriptPath", self.node)) + + edit_layer = self.compute_node_widget.stage.GetEditTarget().GetLayer() + if not edit_layer.anonymous: + script_path = omni.client.combine_urls(edit_layer.realPath, script_path).replace("\\", "/") + + return script_path + + def _show_script_selector_window(self): + """Create and show the file browser window which is used to select the script for inputs:scriptPath""" + try: + from omni.kit.window.filepicker import FilePickerDialog + except ImportError: + # Do nothing if the module cannot be imported + return + + def _on_click_okay(filename: str, dirname: str): + # Get the relative path relative to the edit layer + chosen_file = omni.client.combine_urls(dirname, filename) + edit_layer = self.compute_node_widget.stage.GetEditTarget().GetLayer() + if not edit_layer.anonymous: + chosen_file = omni.client.make_relative_url(edit_layer.realPath, chosen_file) + chosen_file = chosen_file.replace("\\", "/") + + # Set the value of inputs:scriptPath + self.script_path_model.set_value(chosen_file) + self.script_selector_window.hide() + + def _on_click_cancel(filename: str, dirname: str): + self.script_selector_window.hide() + + self.script_selector_window = FilePickerDialog( + "Select a Python script", + click_apply_handler=_on_click_okay, + click_cancel_handler=_on_click_cancel, + allow_multi_selection=False, + file_extension_options=[("*.py", "Python scripts (*.py)")], + ) + + self.script_selector_window.show(self._get_absolute_script_path()) + + def _launch_external_script_editor(self): + """Launch an external editor targeting the path specified in inputs:scriptPath""" + # Use cmd in case the editor is a bat or cmd file + call_command = ["cmd", "/c"] if os.name == "nt" else [] + call_command.append(self.external_script_editor) + call_command.append(self._get_absolute_script_path()) + + subprocess.Popen(call_command) # noqa: PLR1732 + + def _script_path_build_fn(self, ui_prop: UsdPropertyUiEntry, *args): + """Build the asset attribute widget for inputs:scriptPath""" + with ui.HStack(): + self.script_path_model = OmniGraphPropertiesWidgetBuilder.build( + self.compute_node_widget.stage, + ui_prop.prop_name, + ui_prop.metadata, + ui_prop.property_type, + [self.node_prim_path], + {"style": ATTRIB_LABEL_STYLE}, + ) + + def get_use_path(self, stage: Usd.Stage, node_prim_path: Sdf.Path) -> bool: + # Gets the value of the usePath input attribute + return og.Controller.get(og.Controller.attribute("inputs:usePath", og.get_node_by_path(str(node_prim_path)))) + + def _use_path_build_fn(self, ui_prop: UsdPropertyUiEntry, *args): + # Build the boolean toggle for inputs:usePath + ui_prop.override_display_name("Use Path") + self.use_path_model = OmniGraphPropertiesWidgetBuilder.build( + self.compute_node_widget.stage, + ui_prop.prop_name, + ui_prop.metadata, + ui_prop.property_type, + [self.node_prim_path], + {"style": ATTRIB_LABEL_STYLE}, + ) + return self.use_path_model + + def apply(self, props): + """Called by compute_node_widget to apply UI when selection changes""" + + def find_prop(name): + try: + return next((p for p in props if p.prop_name == name)) + except StopIteration: + return None + + frame = CustomLayoutFrame(hide_extra=True) + (_, inputs, outputs, states) = self.retrieve_existing_attributes() + + def _build_reset(self, *args): + def _code_snippets_menu_build_fn(weak_self): + """Build the code snippets popup menu""" + self_ref = weak_self() + self_ref.code_snippets_menu = ui.Menu("Code Snippets") + with self_ref.code_snippets_menu: + for example_script_title, example_script in zip( + self_ref.EXAMPLE_SCRIPTS_TITLE, self_ref.EXAMPLE_SCRIPTS + ): + ui.MenuItem( + example_script_title, + triggered_fn=partial(self_ref.script_textbox_model.set_value, example_script), + ) + self.code_snippets_menu.show() + + with ui.HStack(): + UsdPropertiesWidgetBuilder._create_label("") # noqa: PLW0212 + ui.Spacer(width=7) + self._reset_button_build_fn() + ui.Spacer(width=8) + self.code_snippets_button = ui.Button( + "Code Snippets...", + identifier="_ascentnode_snippets", + clicked_fn=lambda weak_self=weakref.ref(self): _code_snippets_menu_build_fn(weak_self), + ) + + with frame: + with CustomLayoutGroup("Add and Remove Attributes"): + CustomLayoutProperty(None, None, self._special_control_build_fn) + + with CustomLayoutGroup("Script"): + prop = find_prop("inputs:script") + CustomLayoutProperty(prop.prop_name, build_fn=partial(self._script_textbox_build_fn, prop)) + + CustomLayoutProperty(None, None, partial(_build_reset, self)) + + prop = find_prop("inputs:usePath") + CustomLayoutProperty(prop.prop_name, build_fn=partial(self._use_path_build_fn, prop)) + + prop = find_prop("inputs:scriptPath") + CustomLayoutProperty(prop.prop_name, build_fn=partial(self._script_path_build_fn, prop)) + + with CustomLayoutGroup("Inputs"): + for input_attrib in inputs: + attrib_name = input_attrib.get_name() + if input_attrib.is_dynamic(): + prop = find_prop(attrib_name) + if prop is not None: + CustomLayoutProperty(prop.prop_name, attrib_name[7:]) + + with CustomLayoutGroup("Outputs"): + for output_attrib in outputs: + attrib_name = output_attrib.get_name() + if output_attrib.is_dynamic(): + prop = find_prop(attrib_name) + if prop is not None: + CustomLayoutProperty(prop.prop_name, attrib_name[8:]) + + with CustomLayoutGroup("State"): + for state_attrib in states: + attrib_name = state_attrib.get_name() + if state_attrib.is_dynamic(): + prop = find_prop(attrib_name) + if prop is not None: + CustomLayoutProperty(prop.prop_name, attrib_name) + + return frame.apply(props) diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/OgnAscentNodeDatabase.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/OgnAscentNodeDatabase.py new file mode 100644 index 00000000..e3d02f96 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/OgnAscentNodeDatabase.py @@ -0,0 +1,699 @@ +"""Support for simplified access to data on nodes of type airlab.airstack.AscentNode + + __ ___ . . ___ __ ___ ___ __ __ __ __ ___ +/ _` |__ |\ | |__ |__) /\ | |__ | \ / ` / \ | \ |__ +\__| |___ | \| |___ | \ /--\ | |___ |__/ \__, \__/ |__/ |___ + + __ __ . . __ ___ . . __ __ ___ +| \ / \ |\ | / \ | |\/| / \ | \ | |__ \ / +|__/ \__/ | \| \__/ | | | \__/ |__/ | | | + +This script node allows you to execute arbitrary Python code inside an OmniGraph. +The compute function is defined by you +at runtime and can be unique in every instance of a script node +that you create. Inside that function you can access the +database for the node, which is used for +getting and setting all attribute values that you define. + +""" + +import carb +import sys +import traceback + +import omni.graph.core as og +import omni.graph.core._omni_graph_core as _og +import omni.graph.tools.ogn as ogn + +import omni.ext +import omni.ui as ui +import omni.kit.commands + +from omni.isaac.core.utils.stage import get_current_stage +from omni.isaac.core.utils.prims import define_prim, get_prim_at_path + +import sys +import dronekit +import os +import numpy as np +from scipy.spatial.transform import Rotation +import carb +import omni +import omni.graph.core as og +import omni.replicator.core as rep +import omni.timeline +import usdrt.Sdf +from omni.isaac.core.prims import GeometryPrim, RigidPrim +from omni.isaac.core.utils import extensions, stage +from omni.isaac.core.world import World +from pxr import Gf, Usd, UsdGeom +from .ascent_sitl_launch_tool import AscentSitlLaunchTool +import time +import threading +import struct +import socket + +import asyncio + +drone_sim_dict = {} +initialized_timeline_callback = False + + +def timeline_callback(event): + global drone_sim_dict + print("ascent node timeline callback", event, event.type, dir(event)) + + if event.type == int(omni.timeline.TimelineEventType.PLAY): + pass + elif event.type == int(omni.timeline.TimelineEventType.PAUSE): + pass + elif event.type == int(omni.timeline.TimelineEventType.STOP): + AscentSitlLaunchTool.kill_all_ascent_sessions() + + # reset orientation and position of the drone + for k, v in drone_sim_dict.items(): + prim = v["prim"] + if prim.GetAttribute("xformOp:orient").Get() is not None: + prim.GetAttribute("xformOp:orient").Set(Gf.Quatf(1, 0, 0, 0)) + prim.GetAttribute("xformOp:translate").Set((0, 0, 0)) + + drone_sim_dict = {} + + +def incremental_rotate(prim): + rot = Gf.Quatf(0.9702957272529602, 0, 0.2419208437204361, 0) # 7 degrees + o = prim.GetAttribute("xformOp:orient") + if o.Get() != None: + o.Set(o.Get() * rot) + else: + o = prim.GetAttribute("xformOp:rotateXYZ") + if o.Get() != None: + o.Set(o.Get() + Gf.Vec3d(0.0, 27, 0.0)) + + +class OgnAscentNodeDatabase(og.Database): + """Helper class providing simplified access to data on nodes of type airlab.airstack.AscentNode + + Class Members: + node: Node being evaluated + + Attribute Value Properties: + Inputs: + inputs.execIn + inputs.script + inputs.scriptPath + inputs.usePath + Outputs: + outputs.execOut + State: + state.omni_initialized + """ + + # Imprint the generator and target ABI versions in the file for JIT generation + GENERATOR_VERSION = (1, 76, 0) + TARGET_VERSION = (2, 170, 0) + + # This is an internal object that provides per-class storage of a per-node data dictionary + PER_NODE_DATA = {} + + # This is an internal object that describes unchanging attributes in a generic way + # The values in this list are in no particular order, as a per-attribute tuple + # Name, Type, ExtendedTypeIndex, UiName, Description, Metadata, + # Is_Required, DefaultValue, Is_Deprecated, DeprecationMsg + # You should not need to access any of this data directly, use the defined database interfaces + INTERFACE = og.Database._get_interface( + [ + ( + "inputs:execIn", + "execution", + 0, + None, + "Signal to the graph that this node is ready to be executed.", + {}, + True, + None, + False, + "", + ), + ( + "inputs:deltaSimulationTime", + "double", + 0, + "Simulation Delta Time", + "Description.", + {}, + True, + 0.0, + False, + "", + ), + ( + "inputs:deltaSystemTime", + "double", + 0, + "System Delta Time", + "Description.", + {}, + True, + 0.0, + False, + "", + ), + ( + "inputs:dronePrim", + "target", + 0, + "Drone Prim", + "Description.", + {}, + True, + None, + False, + "", + ), + ( + "outputs:execOut", + "execution", + 0, + None, + "Signal to the graph that execution can continue downstream.", + {}, + True, + None, + False, + "", + ), + ( + "inputs:domain_id", + "uchar", + 0, + "Domain ID", + "Description.", + {}, + True, + 0, + False, + "", + ), + ( + "inputs:nodeNamespace", + "string", + 0, + "Node Namespace", + "Description.", + {}, + True, + None, + False, + "", + ), + ( + "state:omni_initialized", + "bool", + 0, + None, + "State attribute used to control when the script should be reloaded.\nThis should be set to false to trigger a reload of the script.", + {}, + True, + None, + False, + "", + ), + ] + ) + + @classmethod + def _populate_role_data(cls): + """Populate a role structure with the non-default roles on this node type""" + role_data = super()._populate_role_data() + role_data.inputs.execIn = og.AttributeRole.EXECUTION + # role_data.inputs.script = og.AttributeRole.TEXT + role_data.outputs.execOut = og.AttributeRole.EXECUTION + return role_data + + class ValuesForInputs(og.DynamicAttributeAccess): + LOCAL_PROPERTY_NAMES = { + "execIn", + "deltaSimulationTime", + "deltaSystemTime", + "dronePrim", + "domain_id", + "nodeNamespace", + "_setting_locked", + "_batchedReadAttributes", + "_batchedReadValues", + } + """Helper class that creates natural hierarchical access to input attributes""" + + def __init__( + self, + node: og.Node, + attributes, + dynamic_attributes: og.DynamicAttributeInterface, + ): + """Initialize simplified access for the attribute data""" + print("init 1") + context = node.get_graph().get_default_graph_context() + print("init 2") + super().__init__(context, node, attributes, dynamic_attributes) + print("init 3") + self._batchedReadAttributes = [ + self._attributes.execIn, + self._attributes.deltaSimulationTime, + self._attributes.deltaSystemTime, + self._attributes.dronePrim, + self._attributes.domain_id, + self._attributes.nodeNamespace, + ] + print("init 4") + self._batchedReadValues = [None, None, None, False] + print("init 5") + + @property + def execIn(self): + print("execIn 1") + return self._batchedReadValues[0] + + @execIn.setter + def execIn(self, value): + print("execIn 2") + self._batchedReadValues[0] = value + + @property + def deltaSimulationTime(self): + return self._batchedReadValues[1] + + @deltaSimulationTime.setter + def deltaSimulationTime(self, value): + self._batchedReadValues[1] = value + + @property + def deltaSystemTime(self): + return self._batchedReadValues[2] + + @deltaSystemTime.setter + def deltaSystemTime(self, value): + self._batchedReadValues[2] = value + + @property + def dronePrim(self): + return self._batchedReadValues[3] + + @dronePrim.setter + def dronePrim(self, value): + self._batchedReadValues[3] = value + + @property + def domain_id(self): + return self._batchedReadValues[4] + + @domain_id.setter + def domain_id(self, value): + self._batchedReadValues[4] = value + + @property + def nodeNamespace(self): + return self._batchedReadValues[5] + + @nodeNamespace.setter + def nodeNamespace(self, value): + self._batchedReadValues[5] = value + + def __getattr__(self, item: str): + if item in self.LOCAL_PROPERTY_NAMES: + return object.__getattribute__(self, item) + else: + return super().__getattr__(item) + + def __setattr__(self, item: str, new_value): + if item in self.LOCAL_PROPERTY_NAMES: + object.__setattr__(self, item, new_value) + else: + super().__setattr__(item, new_value) + + def _prefetch(self): + readAttributes = self._batchedReadAttributes + newValues = _og._prefetch_input_attributes_data(readAttributes) + if len(readAttributes) == len(newValues): + self._batchedReadValues = newValues + + class ValuesForOutputs(og.DynamicAttributeAccess): + LOCAL_PROPERTY_NAMES = {"execOut", "_batchedWriteValues"} + """Helper class that creates natural hierarchical access to output attributes""" + + def __init__( + self, + node: og.Node, + attributes, + dynamic_attributes: og.DynamicAttributeInterface, + ): + """Initialize simplified access for the attribute data""" + context = node.get_graph().get_default_graph_context() + super().__init__(context, node, attributes, dynamic_attributes) + self._batchedWriteValues = {} + + @property + def execOut(self): + value = self._batchedWriteValues.get(self._attributes.execOut) + if value: + return value + else: + data_view = og.AttributeValueHelper(self._attributes.execOut) + return data_view.get() + + @execOut.setter + def execOut(self, value): + self._batchedWriteValues[self._attributes.execOut] = value + + def __getattr__(self, item: str): + if item in self.LOCAL_PROPERTY_NAMES: + return object.__getattribute__(self, item) + else: + return super().__getattr__(item) + + def __setattr__(self, item: str, new_value): + if item in self.LOCAL_PROPERTY_NAMES: + object.__setattr__(self, item, new_value) + else: + super().__setattr__(item, new_value) + + def _commit(self): + _og._commit_output_attributes_data(self._batchedWriteValues) + self._batchedWriteValues = {} + + class ValuesForState(og.DynamicAttributeAccess): + """Helper class that creates natural hierarchical access to state attributes""" + + def __init__( + self, + node: og.Node, + attributes, + dynamic_attributes: og.DynamicAttributeInterface, + ): + """Initialize simplified access for the attribute data""" + context = node.get_graph().get_default_graph_context() + super().__init__(context, node, attributes, dynamic_attributes) + + @property + def omni_initialized(self): + data_view = og.AttributeValueHelper(self._attributes.omni_initialized) + return data_view.get() + + @omni_initialized.setter + def omni_initialized(self, value): + data_view = og.AttributeValueHelper(self._attributes.omni_initialized) + data_view.set(value) + + def __init__(self, node): + super().__init__(node) + dynamic_attributes = self.dynamic_attribute_data( + node, og.AttributePortType.ATTRIBUTE_PORT_TYPE_INPUT + ) + self.inputs = OgnAscentNodeDatabase.ValuesForInputs( + node, self.attributes.inputs, dynamic_attributes + ) + dynamic_attributes = self.dynamic_attribute_data( + node, og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT + ) + self.outputs = OgnAscentNodeDatabase.ValuesForOutputs( + node, self.attributes.outputs, dynamic_attributes + ) + dynamic_attributes = self.dynamic_attribute_data( + node, og.AttributePortType.ATTRIBUTE_PORT_TYPE_STATE + ) + self.state = OgnAscentNodeDatabase.ValuesForState( + node, self.attributes.state, dynamic_attributes + ) + + # init timeline callback + global initialized_timeline_callback + if not initialized_timeline_callback: + initialized_timeline_callback = True + self.timeline = omni.timeline.get_timeline_interface() + self.play_listener = self.timeline.get_timeline_event_stream().create_subscription_to_pop_by_type( + int(omni.timeline.TimelineEventType.PLAY), timeline_callback + ) + self.pause_listener = self.timeline.get_timeline_event_stream().create_subscription_to_pop_by_type( + int(omni.timeline.TimelineEventType.PAUSE), timeline_callback + ) + self.stop_listener = self.timeline.get_timeline_event_stream().create_subscription_to_pop_by_type( + int(omni.timeline.TimelineEventType.STOP), timeline_callback + ) + + class abi: + """Class defining the ABI interface for the node type""" + + @staticmethod + def get_node_type(): + get_node_type_function = getattr( + OgnAscentNodeDatabase.NODE_TYPE_CLASS, "get_node_type", None + ) + if callable(get_node_type_function): # pragma: no cover + return get_node_type_function() + return "airlab.airstack.AscentNode" + + @staticmethod + def compute(context, node): + # print('compute 1') + def database_valid(): + return True + + try: + per_node_data = OgnAscentNodeDatabase.PER_NODE_DATA[node.node_id()] + db = per_node_data.get("_db") + if db is None: + db = OgnAscentNodeDatabase(node) + per_node_data["_db"] = db + if not database_valid(): + per_node_data["_db"] = None + return False + except: + db = OgnAscentNodeDatabase(node) + # print('input test', dir(db.inputs)) + # print('delta sim time', db.inputs.deltaSimulationTime) + # print('prim', db.inputs.dronePrim, type(db.inputs.dronePrim)) + + try: + if db.inputs.dronePrim: + global drone_sim_dict + node_id = node.node_id() + + if node_id not in drone_sim_dict.keys(): + world = World() + print("INPUT", db.inputs.domain_id, db.inputs.nodeNamespace) + drone_sim_dict[node_id] = { + "initialized": False, + "prim": world.stage.GetPrimAtPath( + str(db.inputs.dronePrim[0]) + ), + "prop": world.stage.GetPrimAtPath( + str(db.inputs.dronePrim[0]) + + "/base_link/meshes/mesh_17" + ), + "sitl_tool": AscentSitlLaunchTool( + "/extras/drag_and_drop/", + int(db.inputs.domain_id), + db.inputs.domain_id, + db.inputs.nodeNamespace, + ), + "dronekit_connection": None, + } + initialized = drone_sim_dict[node_id]["initialized"] + prim = drone_sim_dict[node_id]["prim"] + prop = drone_sim_dict[node_id]["prop"] + sitl_tool = drone_sim_dict[node_id]["sitl_tool"] + dronekit_connection = drone_sim_dict[node_id]["dronekit_connection"] + + if dronekit_connection == None: + if not initialized: + drone_sim_dict[node_id]["initialized"] = True + sitl_tool.launch() + + def f(): + drone_sim_dict[node_id]["dronekit_connection"] = ( + dronekit.connect( + sitl_tool.get_dronekit_address(), + wait_ready=True, + timeout=999999, + rate=120, + ) + ) + + threading.Thread(target=f).start() + else: + r = dronekit_connection._roll # + np.pi / 2 + p = dronekit_connection._pitch + y = dronekit_connection._yaw + + rot = Rotation.from_euler("xyz", [r, p, y], degrees=False) + # quaternion: xyzw + q = rot.as_quat() + + o = Gf.Quatf(q[3], q[0], q[1], q[2]) + + north, east, down = ( + dronekit_connection.location.local_frame.north, + dronekit_connection.location.local_frame.east, + dronekit_connection.location.local_frame.down, + ) + # print('ned', n, e, d, prim) + if down is not None: + if prim.GetAttribute("xformOp:orient").Get() == None: + prim.GetAttribute("xformOp:rotateXYZ").Set( + Gf.Vec3f(r, p, y) + ) + else: + prim.GetAttribute("xformOp:orient").Set(o) + + forward, left, up = north, -east, -down + p = (forward, left, up) # FLU + prim.GetAttribute("xformOp:translate").Set(p) + if prop: + incremental_rotate(prop) + else: + # print("Drone location from dronekit is None") + pass + except Exception as e: + print(f"error: {e}") + + # Set outputs:execOut if not hidden + if ( + db.node.get_attribute("outputs:execOut").get_metadata( + ogn.MetadataKeys.HIDDEN + ) + != "1" + ): + db.outputs.execOut = og.ExecutionAttributeState.ENABLED + + try: + compute_function = getattr( + OgnAscentNodeDatabase.NODE_TYPE_CLASS, "compute", None + ) + if ( + callable(compute_function) + and compute_function.__code__.co_argcount > 1 + ): # pragma: no cover + return compute_function(context, node) + + db.inputs._prefetch() + db.inputs._setting_locked = True + with og.in_compute(): + return OgnAscentNodeDatabase.NODE_TYPE_CLASS.compute(db) + except Exception as error: # pragma: no cover + stack_trace = "".join(traceback.format_tb(sys.exc_info()[2].tb_next)) + db.log_error( + f"Assertion raised in compute - {error}\n{stack_trace}", + add_context=False, + ) + finally: + db.inputs._setting_locked = False + db.outputs._commit() + return False + + @staticmethod + def initialize(context, node): + OgnAscentNodeDatabase._initialize_per_node_data(node) + initialize_function = getattr( + OgnAscentNodeDatabase.NODE_TYPE_CLASS, "initialize", None + ) + if callable(initialize_function): # pragma: no cover + initialize_function(context, node) + + per_node_data = OgnAscentNodeDatabase.PER_NODE_DATA[node.node_id()] + + def on_connection_or_disconnection(*args): + per_node_data["_db"] = None + + node.register_on_connected_callback(on_connection_or_disconnection) + node.register_on_disconnected_callback(on_connection_or_disconnection) + + @staticmethod + def release(node): + release_function = getattr( + OgnAscentNodeDatabase.NODE_TYPE_CLASS, "release", None + ) + if callable(release_function): # pragma: no cover + release_function(node) + OgnAscentNodeDatabase._release_per_node_data(node) + + @staticmethod + def init_instance(node, graph_instance_id): + init_instance_function = getattr( + OgnAscentNodeDatabase.NODE_TYPE_CLASS, "init_instance", None + ) + if callable(init_instance_function): # pragma: no cover + init_instance_function(node, graph_instance_id) + + @staticmethod + def release_instance(node, graph_instance_id): + release_instance_function = getattr( + OgnAscentNodeDatabase.NODE_TYPE_CLASS, "release_instance", None + ) + if callable(release_instance_function): # pragma: no cover + release_instance_function(node, graph_instance_id) + OgnAscentNodeDatabase._release_per_node_instance_data( + node, graph_instance_id + ) + + @staticmethod + def update_node_version(context, node, old_version, new_version): + update_node_version_function = getattr( + OgnAscentNodeDatabase.NODE_TYPE_CLASS, "update_node_version", None + ) + if callable(update_node_version_function): # pragma: no cover + return update_node_version_function( + context, node, old_version, new_version + ) + return False + + @staticmethod + def initialize_type(node_type): + initialize_type_function = getattr( + OgnAscentNodeDatabase.NODE_TYPE_CLASS, "initialize_type", None + ) + needs_initializing = True + if callable(initialize_type_function): # pragma: no cover + needs_initializing = initialize_type_function(node_type) + if needs_initializing: + node_type.set_metadata(ogn.MetadataKeys.EXTENSION, "airlab.airstack") + node_type.set_metadata(ogn.MetadataKeys.UI_NAME, "Ascent Node") + node_type.set_metadata(ogn.MetadataKeys.CATEGORIES, "airstack") + node_type.set_metadata( + ogn.MetadataKeys.DESCRIPTION, + "Runs the Ascent Spirit SITL, mavproxy and mavros.", + ) + node_type.set_metadata(ogn.MetadataKeys.LANGUAGE, "Python") + icon_path = carb.tokens.get_tokens_interface().resolve( + "${airlab.airstack}" + ) + icon_path = icon_path + "/" + "ogn/icons/airlab.airstack.AscentNode.svg" + node_type.set_metadata(ogn.MetadataKeys.ICON_PATH, icon_path) + __hints = node_type.get_scheduling_hints() + if __hints is not None: + __hints.set_data_access( + og.eAccessLocation.E_USD, og.eAccessType.E_WRITE + ) + OgnAscentNodeDatabase.INTERFACE.add_to_node_type(node_type) + node_type.set_has_state(True) + + @staticmethod + def on_connection_type_resolve(node): + on_connection_type_resolve_function = getattr( + OgnAscentNodeDatabase.NODE_TYPE_CLASS, + "on_connection_type_resolve", + None, + ) + if callable(on_connection_type_resolve_function): # pragma: no cover + on_connection_type_resolve_function(node) + + NODE_TYPE_CLASS = None + + @staticmethod + def register(node_type_class): + print("node type class", node_type_class, type(node_type_class)) + OgnAscentNodeDatabase.NODE_TYPE_CLASS = node_type_class + og.register_node_type(OgnAscentNodeDatabase.abi, 2) + + @staticmethod + def deregister(): + og.deregister_node_type("airlab.airstack.AscentNode") diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/__ogn_files_prebuilt b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/__ogn_files_prebuilt new file mode 100644 index 00000000..b91189c9 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/__ogn_files_prebuilt @@ -0,0 +1 @@ +The presence of this file ensures the directory will not regenerate at runtime \ No newline at end of file diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_launch_tool.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/ascent_sitl_launch_tool.py similarity index 78% rename from docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_launch_tool.py rename to docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/ascent_sitl_launch_tool.py index 10931406..e5be4b7d 100644 --- a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_launch_tool.py +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/ascent_sitl_launch_tool.py @@ -13,7 +13,7 @@ class AscentSitlLaunchTool: sitl was already built with 'make sitl_sitl_default none'), the vehicle id and the vehicle model. """ - def __init__(self, sitl_dir, vehicle_id: int = 0): + def __init__(self, sitl_dir, vehicle_id, domain_id, node_namespace): """Construct the sitlLaunchTool object Args: @@ -34,6 +34,9 @@ def __init__(self, sitl_dir, vehicle_id: int = 0): self.isaac_sim_port = 14553 + self.vehicle_id*10 self.autonomy_stack_port = 14554 + self.vehicle_id*10 self.mavros_launch_port = 14555 + self.vehicle_id*10 + self.domain_id = int(domain_id) + self.node_namespace = str(node_namespace) + self.session_name = AscentSitlLaunchTool.get_tmux_session_prefix() + str(self.domain_id) # Configurations to whether autostart sitl (SITL) automatically or have the user launch it manually on another # terminal @@ -42,7 +45,7 @@ def __init__(self, sitl_dir, vehicle_id: int = 0): self.sitl_script = '/usr/bin/bash ' + self.sitl_dir + '/ascent_sitl_tmux.bash ' + \ str(self.base_port) + ' ' + str(self.ascent_sitl_port) + ' ' + \ str(self.isaac_sim_port) + ' ' + str(self.autonomy_stack_port) + ' ' + str(self.mavros_launch_port) + \ - ' ' + str(self.vehicle_id) + ' ' + str(self.session_name) + ' ' + str(self.domain_id) + ' ' + self.node_namespace # Create a temporary filesystem for sitl to write data to/from (and modify the origin rcS files) self.root_fs = tempfile.TemporaryDirectory() @@ -51,6 +54,25 @@ def __init__(self, sitl_dir, vehicle_id: int = 0): self.environment = os.environ # self.environment["sitl_SIM_MODEL"] = sitl_model + @staticmethod + def get_tmux_session_prefix(): + return 'ascent_sitl_' + + @staticmethod + def kill_all_ascent_sessions(): + process = subprocess.Popen('tmux ls', shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = process.communicate() + lines = out.decode().split('\n') + sessions = [] + for line in lines: + if ':' in line: + sessions.append(line.split(':')[0]) + + for session in sessions: + subprocess.call('tmux kill-session -t ' + session, shell=True) + def get_dronekit_address(self): return '127.0.0.1:' + str(self.isaac_sim_port) diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.ogn b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.ogn new file mode 100644 index 00000000..b6957362 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.ogn @@ -0,0 +1,67 @@ +{ + "AscentNode": { + "version": 2, + "description": [ + "This script node allows you to execute arbitrary Python code inside an OmniGraph.\n", + "The compute function is defined by you at runtime and can be unique in every instance of a script node\n", + "that you create. Inside that function you can access the database for the node, which is used for\n", + "getting and setting all attribute values that you define.\n" + ], + "language": "Python", + "uiName": "Script Node", + "categories": ["script"], + "scheduling": ["usd-write"], + "inputs": { + "execIn": { + "type": "execution", + "description": "Signal to the graph that this node is ready to be executed." + }, + "script": { + "type": "string", + "description": [ + "A string containing a Python script that may define code to be executed when the script node computes.", + "See the default and example scripts for more information." + ], + "uiName": "Inline Script", + "optional": true + }, + "usePath": { + "type": "bool", + "default": false, + "description": [ + "When true, the python script is read from the file specified in 'Script File Path' (*inputs:scriptPath*),", + "instead of the string in 'Inline Script' (*inputs:script*)." + ], + "uiName": "Use Script File" + }, + "scriptPath": { + "type": "token", + "description": [ + "The path of a file containing a Python script that may define code to be executed when the script node computes.", + "See the default and example scripts for more info." + ], + "uiName": "Script File Path", + "optional": true, + "metadata": { + "uiType": "filePath", + "fileExts": "Python Scripts (*.py)" + } + } + }, + "outputs": { + "execOut": { + "type": "execution", + "description": "Signal to the graph that execution can continue downstream." + } + }, + "state": { + "omni_initialized": { + "type": "bool", + "description": [ + "State attribute used to control when the script should be reloaded.", + "This should be set to false to trigger a reload of the script." + ] + } + } + } +} diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.post.rst b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.post.rst new file mode 100644 index 00000000..73d2b56e --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.post.rst @@ -0,0 +1,9 @@ +Related Extensions +------------------ + +The Python database implementation comes from the :ref:`omni.graph` extension. + +The database definition is generated using the :ref:`omni.graph.tools` extension. + +The graph editors described above for visual addition of dynamic attributes to the script node can be found in +:ref:`omni.graph.window.action`. diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.pre.rst b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.pre.rst new file mode 100644 index 00000000..91921c83 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.pre.rst @@ -0,0 +1,378 @@ +.. contents:: Exploring The Script Node + :backlinks: entry + :local: + :depth: 1 + +What Is A Script Node? +---------------------- + +A script node is an implementation of a single node type for |omnigraph| that can be used to create many different +behaviors at runtime. Unlike most node types, whose behavior is hardcoded, each instantiation of a script node type +can have its own custom behavior, implemented as a Python script on the node. + +Some of the best uses of a script node are, to make quick prototypes of functionality to validate concepts you are +trying out, and to write one-off nodes that are so simple that it is easier to write them yourself rather than to +try to find an equivalent node (e.g. write a node that computes the hexadecimal string equivalent of an integer). + +Using The Script Node +--------------------- + +These are the three steps you need to add a customized script node to your |omnigraph|: + +- Create a script node. +- Add the Python code required to implement the runtime behavior of the node. +- Add necessary attributes for its operation. + +In practice steps 2 and 3 can be done in either order, though we think you will find it easier to first define your +function and then from that decide the list of attributes to be added. + +.. important:: + + The script node will not be operational until you have added the extra attributes required. In the graph editor + this execution failure shows up as a red coloring on the node. Once you have added the attributes normal execution + will resume. + +The script node can be used either directly from the UI via the graph editor and property panel, or indirectly through +Python scripting, either in the script editor or in external files. The instructions below show both approaches - +choose the one that you feel most comfortable with. + +Creation +++++++++ + +To start using the script node you must first create an |omnigraph| in which it can live, and then create an instance +of the script node in that graph. + +.. tab-set:: + + .. tab-item:: Graph Editor + + Open the :ref:`Action Graph Editor` using the *Visual Scripting* menu + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeGraphMenu.png + :alt: The graph being created + + Create a new |actiongraph| to hold the script node + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeGraphCreate.png + :alt: The graph being created + + Drag the script node icon from the navigation bar on the left onto the newly created graph + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeCreate.png + :alt: The Script Node being added to a graph + + Once you have created a script node it will look something like this in your graph editor. The script node is + suitable for use in any type of graph. In an |actiongraph| the node will have an *execIn* pin to trigger its + execution and an *execOut* pin to trigger other nodes when its compute completes. + + .. tab-item:: Python Code + + The |controller| is the main class through which you can manipulate an |omnigraph| using a script file or + the script editor. This script will create an |actiongraph| and add a script node to it. + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :start-after: begin-script-node-boilerplate + :end-before: end-script-node-boilerplate + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :dedent: 8 + :start-after: begin-script-node-creation + :end-before: end-script-node-creation + +Writing A Compute Function +++++++++++++++++++++++++++ + +The actual input from the script node can come from one of two sources - a string set directly on the node, or an +external file containing the script. These are defined using shared attributes, present in all script nodes. The +extra attributes you will use as part of your computation will be added later. + +Contents Of The Script +~~~~~~~~~~~~~~~~~~~~~~ + +The script node creates a limited override of the API accessible from :py:class:`omni.graph.core.NodeType`. +The following callback functions can be defined in the script, and will be used as the runtime implementations of +the equivalent functions on the node type API. + +- ``compute(db)``: called every time the node computes (should always be defined). +- ``setup(db)``: called before compute the first time, or after the reset attribute value is set. +- ``cleanup(db)``: called when the node is deleted or the reset attribute value is set. + +*db:* :py:class:`omni.graph.core.Database` is the node interface where attributes are exposed like ``db.inputs.foo``. +This includes the predefined attributes used by the script node as described below, as well as any dynamic attributes +added to a script node instance by the user. The predefined functions ``db.log_error`` or ``db.log_warning`` should be +used to report problems in the node's computation. + +In addition, for convenience the :py:mod:`omni.graph.core` module is imported under the variable named ``og``. + +`import` statements, function/class definitions, and global variables may be placed, +outside of the callbacks, as you would in any other Python module definition. + +Variables may be added to the ``db.per_instance_state`` state object for persistence across nodes that are instanced +in more than one graph. See how the +:ref:`sample snippet for the Fibonacci function ` makes use of this feature to +walk through the values in the Fibonacci sequence on each successive evaluation. + +Overriding the ``db.setup(db)`` and ``db.cleanup(db)`` functions can be used to let your script node define values +that will be used through multiple evaluations, but which you do not wish to persist when the script node itself is +deleted. See how the +:ref:`sample snippet for the Controller function ` makes use of this feature to +initialize and clean up the USD stage for a script node that is responsible for creating cubes. + +.. note:: + + The `setup` function corresponds to the :py:meth:`omni.graph.core.NodeType.initialize` function on the node type + and the `cleanup` function corresponds to the :py:meth:`omni.graph.core.NodeType.release` function. The reason they + are different is that they will also be called when the script node is reset whereas the API functions only get + called when the node is created and destroyed. + +All of the attribute values you get back from calling the ``db.inputs`` or ``db.outputs`` properties have a specific +data type based on their attribute type. +You can find a description of all of the data types returned from the database for the supported attribute types +by looking through the :ref:`data type descriptions`. + +.. _omni_graph_script_node_as_text: + +Setting The Script With Text +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The attribute `inputs:script` is a simple text string which will be later translated into Python. + +.. tab-set:: + + .. tab-item:: Graph Editor + + After creation of the script node it should be selected and its properties should be visible in the + property panel. If you don't have the property panel visible you can turn it on with this menu + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodePropertyPanelMenu.png + :alt: The menu entry to turn on the property panel + + This is what the property panel for your script node will look like on creation. Notice how the script + field has been pre-populated with some placeholders for the functions you are allowed to write as well as some + instructions on what the script can contain. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodePropertyPanel.png + :alt: The graph being created + + Here is the full text of the instructions: + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Default Script" + :end-before: # # # DELIMITER # # # + + Ignoring the `setup(db)` and `cleanup(db)` functions for now copy-paste this simple node type definition string + and replace the **Script** text field with it. + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :dedent: 8 + :start-after: begin-script-node-script + :end-before: end-script-node-script + + .. tab-item:: Python Code + + The attribute values required to point the script node at a file can be set through the |controller|. + Here is an example of a simple script that defines a script node that will output a boolean indicating + whether the first input is greater than the second input. + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :dedent: 8 + :start-after: begin-script-node-set-to-script + :end-before: end-script-node-set-to-script + +.. tip:: + + As script nodes do not have unique node type definitions it is always a good idea to add Python docstrings as + documentation as a reminder of exactly what the node does. + +Now that you have a script defined you can skip ahead to :ref:`omni_graph_script_node_adding_attributes`. + +Setting The Script With A File +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you want to use an external file then you set the *Use Path* attribute to **True** and set the *Script Path* +attribute to be a string containing the path to the script file on disk. It can be an absolute path name, which will be +highly reliant on your file system configuration, or it can be relative to the USD edit layer so that the script can +be passed along with your USD file as a "sidecar" file. + +.. tab-set:: + + .. tab-item:: Graph Editor + + After creation of the script node it should be selected and its properties should be visible in the + property panel. If you don't have the property panel visible you can turn it on with this menu + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodePropertyPanelMenu.png + :alt: The menu entry to turn on the property panel + + This is what the property panel for your script node will look like on creation. Notice how the script + field has been pre-populated with some placeholders for the functions you are allowed to write as well as some + instructions on what the script can contain. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodePropertyPanel.png + :alt: The graph being created + + Now check the *Use Path* checkbox to tell the script node that it is getting its input from a file rather than + the *Script* value above. Next set the *Script File Path* value to point to a file in which you have put your + script. (See the :ref:`omni_graph_script_node_as_text` script section above for an example of what you + might put into your file.) When you are done your property panel should look something like this. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeAsFile.png + :alt: The property panel with a file script specified + + .. tab-item:: Python Code + + The attribute values required to point the script node at a file can be set through the |controller|. + This example creates a temporary file with the same script as the example above and accesses it. + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :dedent: 8 + :start-after: begin-script-node-set-to-file + :end-before: end-script-node-set-to-file + +.. _omni_graph_script_node_adding_attributes: + +Adding Attributes ++++++++++++++++++ + +Since there is no .ogn description of the node your script node will rely on |dynamicattributes| to define the inputs +and outputs of the node. A dynamic attribute is just one that is not predefined by the node type. In the script +you have written above these appear as anything in your `compute()` functions accessed as **db.inputs.X** for input +attributes and **db.outputs.Y** for output attributes. + +As the intent of your code is unknown (e.g. did you mean to add two integers or two arrays of points when you typed +*db.inputs.a + db.inputs.b*) you must manually add each of the attributes with the types you intend to use. + +.. tab-set:: + + .. tab-item:: Graph Editor + + In the script node property panel you will see a button labeled **Add Attribute...**. You will click on it + once for each attribute that your `compute()` function requires; in this case it will be two inputs and one + output. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeAddingAttributes.png + :alt: Property panel for adding attributes + + This brings up a dialog where you can define your attributes. Here is what you will enter in order to define the + first attribute as an integer value. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeAddInput.png + :alt: An input being added to a script node in the property panel + + Repeat this for the other input *second_input* and then once again for the output attribute. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeAddOutput.png + :alt: An output being added to a script node in the property panel + + Notice here that you must also click the **output** button to specify that the new attribute will be an output. + As a rule of thumb, inputs are values that you read and outputs are values that you write. + + Once you have created a script node it will look something like this in your graph editor. The script node is + suitable for use in any type of graph. In an |actiongraph| the node will have an *execIn* pin to trigger its + execution and an *execOut* pin to trigger other nodes when its compute completes. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeFinalNode.png + :alt: The Script Node in the editor after adding attributes + + .. tab-item:: Python Code + + The |controller| can also be used to add attributes to a node. This example makes our two inputs *integer* + types and the output a *boolean* type. Note that this is a continuation of the previous script as it must + appear inside the *TemporaryDirectory* context to work properly. + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :dedent: 8 + :start-after: begin-script-node-add-attributes + :end-before: end-script-node-add-attributes + +.. note:: + + You may have seen references to another type of attribute port beyond input and output. The *state* attribute port + is just like an *output* port except that it is guaranteed to retain its value between executions of the + `compute()` function. Use state attributes for temporarily caching information. + +Tradeoffs: Script Node vs. Python Node +-------------------------------------- + +The script node, accessible when you load the extension :ref:`airlab.airstack`, +provides a generic node type inside |omnigraph|. It includes an input attribute that holds a Python script +encoded as a string. This string acts as the implementation of this node. + +Although the syntax is slightly different from what you might find in a normal Python node +the benefit of the script node is that you do not have to write any external files, including any +.ogn definitions to implement the new node. + +The downside is that, since the script node you write is not on disk, it is more difficult to share the implementation +with other users. + +.. note:: + + This is an important distinction. In simple terms, a **node type** is like a blueprint for making nodes. The + blueprint can be used by scripts or by the graph editor to create as many nodes of the same type as you wish. + A **node** is the actual thing created based on that blueprint. Think of it like a cookie cutter (node type) + used to make cookies (nodes). + + The **script node type** then is a general template for creating nodes that run scripts. A **script node** is a + specific cookie made using that template, having its unique attributes and a Python script to run. While everyone + can use the same cookie cutter (script node type) to make cookies (nodes) using standard tools, to create a new, + specific cookie (script node), you'd have to duplicate an existing one. + +.. _omni_graph_script_node_samples: + +Code Snippets: Pre-Packaged Code Samples +---------------------------------------- + +If you have been using the property panel for editing you may have noticed a button labeled **Code Snippets**. This +button accesses a drop-down menu that will populate your `compute()` function with working examples. You may have to +enable extra extensions to make them work (e.g. **omni.warp**), and you will definitely have to inspect the snippets +to see what types of attributes they are expecting as those must still be added manually by you. + +.. tab-set:: + + .. tab-item:: Compute Count + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Compute Count" + :end-before: # # # DELIMITER # # # + + .. tab-item:: Fibonacci + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Fibonacci" + :end-before: # # # DELIMITER # # # + + .. tab-item:: Controller + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Controller" + :end-before: # # # DELIMITER # # # + + .. tab-item:: Warp + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Sine Deformer With Warp" + :end-before: # # # DELIMITER # # # + + .. tab-item:: Callbacks + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Value Changed Callbacks" + :end-before: # # # DELIMITER # # # + + .. tab-item:: Timer + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Compute Timer" diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.py new file mode 100644 index 00000000..5cf07d1b --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.py @@ -0,0 +1,259 @@ +import inspect +import os +import tempfile +import traceback + +import omni.client +import omni.graph.core as og +import omni.graph.tools.ogn as ogn +import omni.usd +from airlab.airstack.ogn.OgnAscentNodeDatabase import OgnAscentNodeDatabase + + +# A hacky context manager that captures local variable name declarations and saves them in a dict +class ScriptContextSaver: + def __init__(self, script_context: dict): + self.script_context = script_context + self.local_names = None + + def __enter__(self): + caller_frame = inspect.currentframe().f_back + self.local_names = set(caller_frame.f_locals) + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + caller_frame = inspect.currentframe().f_back + caller_locals = caller_frame.f_locals + for name in caller_locals: + if name not in self.local_names: + self.script_context[name] = caller_locals[name] + + +class UserCode: + """The cached data associated with a user script""" + + def __init__(self): + self.code_object = None # The compiled code object + self.setup_fn = None # setup() + self.cleanup_fn = None # cleanup() + self.compute_fn = None # compute() + self.script_context = {} # namespace for the executed code + + +class OgnAscentNodeState: + def __init__(self): + self.code = UserCode() # The cached code data + self.tempfile_path: str = None # Name of the temporary file for storing the script + self.script_path: str = None # The last value of inputs:scriptPath + self.script: str = None # The last value of inputs:script + self.use_path: bool = None # The last value of inputs:usePath + self.node_initialized: bool = False # Flag used to check if the per-instance node state is initialized. + + +class OgnAscentNode: + @staticmethod + def internal_state(): + return OgnAscentNodeState() + + @staticmethod + def _is_initialized(node: og.Node) -> bool: + return og.Controller.get(node.get_attribute("state:omni_initialized")) + + @staticmethod + def _set_initialized(node: og.Node, init: bool): + return og.Controller.set(node.get_attribute("state:omni_initialized"), init) + + @staticmethod + def initialize(context, node: og.Node): + state = OgnAscentNodeDatabase.shared_internal_state(node) + state.node_initialized = True + + # Create a temporary file for storing the script + with tempfile.NamedTemporaryFile(suffix=".py", delete=False) as tf: + state.tempfile_path = tf.name + + OgnAscentNode._set_initialized(node, False) + + @staticmethod + def release(node: og.Node): + state = OgnAscentNodeDatabase.shared_internal_state(node) + + # Same logic as when the reset button is pressed + OgnAscentNode.try_cleanup(node) + + # Delete the temporary file for storing the script + if state.tempfile_path is not None and os.path.exists(state.tempfile_path): + os.remove(state.tempfile_path) + + @staticmethod + def release_instance(node, graph_instance_id): + """Overrides the release_instance method so that any per-script cleanup can happen before the per-node data + is deleted. + """ + # Same logic as when the reset button is pressed + OgnAscentNode.try_cleanup(node) + + @staticmethod + def try_cleanup(node: og.Node): + # Skip if not setup in the fist place or already cleaned up + if not OgnAscentNode._is_initialized(node): + return + + state = OgnAscentNodeDatabase.shared_internal_state(node) + + # Call the user-defined cleanup function + if state.code.cleanup_fn is not None: + # Get the database object + per_node_data = OgnAscentNodeDatabase.PER_NODE_DATA[node.node_id()] + db = per_node_data.get("_db") + + try: + db.inputs._setting_locked = True # noqa: PLW0212 + state.code.cleanup_fn(db) + except Exception: # pylint: disable=broad-except + OgnAscentNode._print_stacktrace(db) + finally: + db.inputs._setting_locked = False # noqa: PLW0212 + OgnAscentNode._set_initialized(node, False) + + @staticmethod + def _print_stacktrace(db: OgnAscentNodeDatabase): + stacktrace = traceback.format_exc().splitlines(keepends=True) + stacktrace_iter = iter(stacktrace) + stacktrace_output = "" + + for stacktrace_line in stacktrace_iter: + if "OgnAscentNode.py" in stacktrace_line: + # The stack trace shows that the exception originates from this file + # Removing this useless information from the stack trace + next(stacktrace_iter, None) + else: + stacktrace_output += stacktrace_line + + db.log_error(stacktrace_output) + + @staticmethod + def _read_script_file(file_path: str) -> str: + """Reads the given file and returns the contents""" + # Get the absolute path from the possibly relative path in inputs:scriptPath with the edit layer + edit_layer = omni.usd.get_context().get_stage().GetEditTarget().GetLayer() + if not edit_layer.anonymous: + file_path = omni.client.combine_urls(edit_layer.realPath, file_path).replace("\\", "/") + del edit_layer + + # Try to read the script at the specified path + result, _, content = omni.client.read_file(file_path) + + if result != omni.client.Result.OK: + raise RuntimeError(f"Could not open/read the script at '{file_path}': error code: {result}") + + script_bytes = memoryview(content).tobytes() + if len(script_bytes) < 2: + return "" + cur_script = script_bytes.decode("utf-8") + return cur_script + + @staticmethod + def _legacy_compute(db: OgnAscentNodeDatabase): + # Legacy compute we just exec the whole script every compute + with ScriptContextSaver(db.shared_state.code.script_context): + exec(db.shared_state.code.code_object) # noqa: PLW0122 + + @staticmethod + def compute(db) -> bool: + #print('compute 2') + return True + # Note that we initialize this node's OgnAscentNodeState in the OgnAscentNode initialize + # method. While this works for non-instanced workflows, if we try to instance an OmniGraph + # that contains a AscentNode we run into issues, mainly because the instanced AscentNode + # will NOT have an initialized OgnAscentNodeState (since the instanced node's initialize() + # method was never actually executed). To account for this, in the compute method we'll + # simply call the OgnAscentNode initialize() if said method was never called. + if not db.shared_state.node_initialized: + OgnAscentNode.initialize(db.abi_context, db.abi_node) + + use_path = db.inputs.usePath + cur_script: str = "" # The script contents + tempfile_path = db.shared_state.tempfile_path # The path to the script file to be compiled/executed + initialized = db.state.omni_initialized + if use_path: + script_path = db.inputs.scriptPath + if not script_path: + return True + else: + # Use inputs:script for the script and the temporary file for the script path + cur_script = db.inputs.script + if not cur_script: + return True + if use_path != db.shared_state.use_path: + initialized = False + db.shared_state.use_path = use_path + try: + # Compile / Execute the script if necessary + if not initialized: + db.state.omni_initialized = True + db.shared_state.code = UserCode() + db.shared_state.script = None + try: + if use_path: + cur_script = OgnAscentNode._read_script_file(script_path) + db.shared_state.script_path = script_path + # If the script content has changed we need to re-compile + if db.shared_state.script != cur_script: + with open(tempfile_path, "w", encoding="utf-8") as tf: + tf.write(cur_script) + db.shared_state.code.code_object = compile(cur_script, tempfile_path, "exec") + db.shared_state.script = cur_script + except Exception as ex: # pylint: disable=broad-except + # No need for a callstack for an i/o or compilation error + db.log_error(str(ex)) + return False + # Execute the script inside a context manager that captures the names defined in it + with ScriptContextSaver(db.shared_state.code.script_context): + exec(db.shared_state.code.code_object) # noqa: PLW0122 + + # Extract the user-defined setup, compute, and cleanup functions + db.shared_state.code.compute_fn = db.shared_state.code.script_context.get("compute") + if not callable(db.shared_state.code.compute_fn): + db.shared_state.code.compute_fn = None + + if db.shared_state.code.compute_fn is None: + # Assume the script is legacy, so execute on every compute + db.log_warning("compute(db) not defined in user script, running in legacy mode") + db.shared_state.code.compute_fn = OgnAscentNode._legacy_compute + return True + + db.shared_state.code.setup_fn = db.shared_state.code.script_context.get("setup") + if not callable(db.shared_state.code.setup_fn): + db.shared_state.code.setup_fn = None + + db.shared_state.code.cleanup_fn = db.shared_state.code.script_context.get("cleanup") + if not callable(db.shared_state.code.cleanup_fn): + db.shared_state.code.cleanup_fn = None + + # Inject script-global names into the function globals + if db.shared_state.code.compute_fn is not None: + db.shared_state.code.compute_fn.__globals__.update(db.shared_state.code.script_context) + + if db.shared_state.code.setup_fn is not None: + db.shared_state.code.setup_fn.__globals__.update(db.shared_state.code.script_context) + + if db.shared_state.code.cleanup_fn is not None: + db.shared_state.code.cleanup_fn.__globals__.update(db.shared_state.code.script_context) + + # Call the user-defined setup function + if db.shared_state.code.setup_fn is not None: + db.shared_state.code.setup_fn(db) + + # ------------------------------------------------------------------------------------ + # Call the user-defined compute function + if db.shared_state.code.compute_fn is not None: + db.shared_state.code.compute_fn(db) + + # Set outputs:execOut if not hidden + if db.node.get_attribute("outputs:execOut").get_metadata(ogn.MetadataKeys.HIDDEN) != "1": + db.outputs.execOut = og.ExecutionAttributeState.ENABLED + except Exception: # pylint: disable=broad-except + OgnAscentNode._print_stacktrace(db) + return False + return True diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.svg b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.svg new file mode 100644 index 00000000..71a4d86d --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/OgnAscentNode.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAddInput.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAddInput.png new file mode 100644 index 00000000..74e6f81f Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAddInput.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAddOutput.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAddOutput.png new file mode 100644 index 00000000..e6f77995 Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAddOutput.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAddingAttributes.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAddingAttributes.png new file mode 100644 index 00000000..caa5a86f Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAddingAttributes.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAsFile.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAsFile.png new file mode 100644 index 00000000..deb12dc5 Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeAsFile.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeCreate.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeCreate.png new file mode 100644 index 00000000..e8265e4c Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeCreate.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeFinal.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeFinal.png new file mode 100644 index 00000000..575cd7fa Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeFinal.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeFinalNode.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeFinalNode.png new file mode 100644 index 00000000..0659a567 Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeFinalNode.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeGraphCreate.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeGraphCreate.png new file mode 100644 index 00000000..61eb6ba1 Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeGraphCreate.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeGraphMenu.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeGraphMenu.png new file mode 100644 index 00000000..e75463bb Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeGraphMenu.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodePropertyPanel.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodePropertyPanel.png new file mode 100644 index 00000000..a6323734 Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodePropertyPanel.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodePropertyPanelMenu.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodePropertyPanelMenu.png new file mode 100644 index 00000000..0714da39 Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodePropertyPanelMenu.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeScriptPanel.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeScriptPanel.png new file mode 100644 index 00000000..5c973c2f Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeScriptPanel.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeSnippets.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeSnippets.png new file mode 100644 index 00000000..ce6ceaad Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/python/nodes/images/AscentNodeSnippets.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/tests/TestOgnAscentNode.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/tests/TestOgnAscentNode.py new file mode 100644 index 00000000..e6f9b69f --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/tests/TestOgnAscentNode.py @@ -0,0 +1,64 @@ +import os +import omni.kit.test +import omni.graph.core as og +import omni.graph.core.tests as ogts +from omni.graph.core.tests.omnigraph_test_utils import _TestGraphAndNode +from omni.graph.core.tests.omnigraph_test_utils import _test_clear_scene +from omni.graph.core.tests.omnigraph_test_utils import _test_setup_scene +from omni.graph.core.tests.omnigraph_test_utils import _test_verify_scene + + +class TestOgn(ogts.OmniGraphTestCase): + + async def test_data_access(self): + from airlab.airstack.ogn.OgnAscentNodeDatabase import OgnAscentNodeDatabase + test_file_name = "OgnAscentNodeTemplate.usda" + usd_path = os.path.join(os.path.dirname(__file__), "usd", test_file_name) + if not os.path.exists(usd_path): # pragma: no cover + self.assertTrue(False, f"{usd_path} not found for loading test") + (result, error) = await ogts.load_test_file(usd_path) + self.assertTrue(result, f'{error} on {usd_path}') + test_node = og.Controller.node("/TestGraph/Template_airlab.airstack_AscentNode") + database = OgnAscentNodeDatabase(test_node) + self.assertTrue(test_node.is_valid()) + node_type_name = test_node.get_type_name() + self.assertEqual(og.GraphRegistry().get_node_type_version(node_type_name), 2) + + def _attr_error(attribute: og.Attribute, usd_test: bool) -> str: # pragma no cover + test_type = "USD Load" if usd_test else "Database Access" + return f"{node_type_name} {test_type} Test - {attribute.get_name()} value error" + + + self.assertTrue(test_node.get_attribute_exists("inputs:execIn")) + attribute = test_node.get_attribute("inputs:execIn") + self.assertTrue(attribute.is_valid()) + db_value = database.inputs.execIn + database.inputs.execIn = db_value + + self.assertTrue(test_node.get_attribute_exists("inputs:usePath")) + attribute = test_node.get_attribute("inputs:usePath") + self.assertTrue(attribute.is_valid()) + db_value = database.inputs.usePath + database.inputs.usePath = db_value + expected_value = False + actual_value = og.Controller.get(attribute) + ogts.verify_values(expected_value, actual_value, _attr_error(attribute, True)) + ogts.verify_values(expected_value, db_value, _attr_error(attribute, False)) + + self.assertTrue(test_node.get_attribute_exists("outputs:execOut")) + attribute = test_node.get_attribute("outputs:execOut") + self.assertTrue(attribute.is_valid()) + db_value = database.outputs.execOut + database.outputs.execOut = db_value + + self.assertTrue(test_node.get_attribute_exists("state:omni_initialized")) + attribute = test_node.get_attribute("state:omni_initialized") + self.assertTrue(attribute.is_valid()) + db_value = database.state.omni_initialized + database.state.omni_initialized = db_value + temp_setting = database.inputs._setting_locked + database.inputs._testing_sample_value = True + database.outputs._testing_sample_value = True + database.inputs._setting_locked = temp_setting + self.assertTrue(database.inputs._testing_sample_value) + self.assertTrue(database.outputs._testing_sample_value) diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/tests/__init__.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/tests/__init__.py new file mode 100644 index 00000000..2cb22e56 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/tests/__init__.py @@ -0,0 +1,3 @@ +"""====== GENERATED BY omni.graph.tools - DO NOT EDIT ======""" +import omni.graph.tools._internal as ogi +ogi.import_tests_in_directory(__file__, __name__) diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/tests/usd/OgnAscentNodeTemplate.usda b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/tests/usd/OgnAscentNodeTemplate.usda new file mode 100644 index 00000000..75986342 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/ogn/tests/usd/OgnAscentNodeTemplate.usda @@ -0,0 +1,53 @@ +#usda 1.0 +( + doc ="""Generated from node description file OgnAscentNode.ogn +Contains templates for node types found in that file.""" +) + +def OmniGraph "TestGraph" +{ + token evaluator:type = "push" + int2 fileFormatVersion = (1, 3) + token flatCacheBacking = "Shared" + token pipelineStage = "pipelineStageSimulation" + + def OmniGraphNode "Template_airlab.airstack_AscentNode" ( + docs="""This script node allows you to execute arbitrary Python code inside an OmniGraph. +The compute function is defined by you at runtime and can be unique in every instance of a script node +that you create. Inside that function you can access the database for the node, which is used for +getting and setting all attribute values that you define. +""" + ) + { + token node:type = "airlab.airstack.AscentNode" + int node:typeVersion = 2 + + # 4 attributes + custom uint inputs:execIn ( + docs="""Signal to the graph that this node is ready to be executed.""" + ) + custom string inputs:script ( + docs="""A string containing a Python script that may define code to be executed when the script node computes. + See the default and example scripts for more information.""" + ) + custom token inputs:scriptPath ( + docs="""The path of a file containing a Python script that may define code to be executed when the script node computes. + See the default and example scripts for more info.""" + ) + custom bool inputs:usePath = false ( + docs="""When true, the python script is read from the file specified in 'Script File Path' (*inputs:scriptPath*), + instead of the string in 'Inline Script' (*inputs:script*).""" + ) + + # 1 attribute + custom uint outputs:execOut ( + docs="""Signal to the graph that execution can continue downstream.""" + ) + + # 1 attribute + custom bool state:omni_initialized ( + docs="""State attribute used to control when the script should be reloaded. + This should be set to false to trigger a reload of the script.""" + ) + } +} diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/__init__.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/__init__.py new file mode 100644 index 00000000..a096a99d --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/__init__.py @@ -0,0 +1,6 @@ +"""There is no public API to this module.""" + +__all__ = [] + +scan_for_test_modules = True +"""The presence of this object causes the test runner to automatically scan the directory for unit test cases""" diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/data/TestAscentNode.usda b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/data/TestAscentNode.usda new file mode 100644 index 00000000..f005d334 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/data/TestAscentNode.usda @@ -0,0 +1,55 @@ +#usda 1.0 +def Xform "World" +{ + def OmniGraph "ActionGraph" + { + token evaluator:type = "execution" + token fabricCacheBacking = "Shared" + int2 fileFormatVersion = (1, 6) + token pipelineStage = "pipelineStageSimulation" + + def ComputeGraphSettings "computegraphSettings" ( + active = false + ) + { + custom token evaluator:type = "execution" + custom int2 fileFormatVersion = (1, 2) + custom token flatCacheBacking = "Shared" + custom token pipelineStage = "pipelineStageSimulation" + } + + def OmniGraphNode "script_node" + { + custom double inputs:data = 42 + custom uint inputs:execIn + prepend uint inputs:execIn.connect = + custom double inputs:multiplier = 2 + custom string inputs:script = '''""" +Test Script +""" +# output is multiplied by dynamic attrib defined in the USD +db.outputs.data = db.inputs.data * db.inputs.multiplier +db.outputs.asInt = int(db.outputs.data) +db.state.asFloat = float(db.outputs.asInt) +''' + custom token inputs:scriptPath + custom bool inputs:usePath + token node:type = "airlab.airstack.AscentNode" + int node:typeVersion = 1 + custom int outputs:asInt = 0 + custom double outputs:data + custom uint outputs:execOut + custom float state:asFloat = 0 + custom bool state:omni_initialized + } + + def OmniGraphNode "on_impulse_event" + { + custom bool inputs:onlyPlayback = 0 + token node:type = "omni.graph.action.OnImpulseEvent" + int node:typeVersion = 2 + custom uint outputs:execOut + custom bool state:enableImpulse + } + } +} diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_api.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_api.py new file mode 100644 index 00000000..3378ff9f --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_api.py @@ -0,0 +1,18 @@ +"""Testing the stability of the API in this module""" + +import omni.graph.core.tests as ogts +import airlab.airstack as ogs +from omni.graph.tools.tests.internal_utils import _check_module_api_consistency, _check_public_api_contents + + +# ====================================================================== +class _TestOmniGraphAscentNodeApi(ogts.OmniGraphTestCase): + _UNPUBLISHED = ["bindings", "ogn", "tests"] + + async def test_api(self): + _check_module_api_consistency(ogs, self._UNPUBLISHED) # noqa: PLW0212 + _check_module_api_consistency(ogs.tests, is_test_module=True) # noqa: PLW0212 + + async def test_api_features(self): + """Test that the known public API features continue to exist""" + _check_public_api_contents(ogs.tests, [], [], only_expected_allowed=True) # noqa: PLW0212 diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_ascentnode.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_ascentnode.py new file mode 100644 index 00000000..e1e81598 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_ascentnode.py @@ -0,0 +1,678 @@ +"""Basic tests of the script node""" + +# begin-script-node-file-boilerplate +from pathlib import Path +from tempfile import TemporaryDirectory + +# end-script-node-file-boilerplate +# begin-script-node-boilerplate +from textwrap import dedent # Just to make the documentation look better + +import omni.graph.core as og + +# end-script-node-boilerplate +import omni.graph.core.tests as ogts +import omni.usd +from pxr import OmniGraphSchemaTools + + +# ====================================================================== +class TestAscentNode(ogts.OmniGraphTestCase): + """Tests for Script Node""" + + # ---------------------------------------------------------------------- + async def test_script_node_instancing(self): + """Test that the script node works in instanced graphs""" + # Test with multiple graph evaluator types. + evaluator_names = ["push", "dirty_push", "execution"] + for evaluator_name in evaluator_names: + # Create the graph with the AscentNode. + graph_path = "/World/Graph" + (_, (_, script_node), _, _) = og.Controller.edit( + {"graph_path": graph_path, "evaluator_name": evaluator_name}, + { + og.Controller.Keys.CREATE_NODES: [ + ("OnTick", "omni.graph.action.OnTick"), + ("Script", "airlab.airstack.AscentNode"), + ], + og.Controller.Keys.CONNECT: ("OnTick.outputs:tick", "Script.inputs:execIn"), + og.Controller.Keys.SET_VALUES: ("OnTick.inputs:onlyPlayback", False), + }, + ) + + # Add some attributes to the script node. + og.Controller.create_attribute( + script_node, + "inputs:step", + og.Type(og.BaseDataType.INT, 1, 0, og.AttributeRole.NONE), + og.AttributePortType.ATTRIBUTE_PORT_TYPE_INPUT, + ) + og.Controller.create_attribute( + script_node, + "outputs:counter", + og.Type(og.BaseDataType.INT, 1, 0, og.AttributeRole.NONE), + og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT, + ) + og.Controller.create_attribute( + script_node, + "outputs:graph_target_name", + og.Type(og.BaseDataType.TOKEN, 1, 0, og.AttributeRole.NONE), + og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT, + ) + script_node.get_attribute("inputs:step").set(2) + + # Simple script inside AscentNode that increments a counter and writes out + # the graph target name. + script_string = "def compute(db):\n" + script_string += " db.outputs.counter += db.inputs.step\n" + script_string += " db.outputs.graph_target_name = db.abi_context.get_graph_target()\n" + + # Instance the graph 5 times. + num_prims = 5 + prim_paths = [None] * num_prims + stage = omni.usd.get_context().get_stage() + for i in range(num_prims): + prim_paths[i] = f"/World/Prim_{i}" + stage.DefinePrim(prim_paths[i]) + OmniGraphSchemaTools.applyOmniGraphAPI(stage, prim_paths[i], graph_path) + + # Set the script attribute on the script node in the instanced graph. + script_node.get_attribute("inputs:script").set(script_string) + + # Evaluate and validate results. + await omni.kit.app.get_app().next_update_async() + await omni.kit.app.get_app().next_update_async() + await omni.kit.app.get_app().next_update_async() + for i in range(num_prims): + if evaluator_name == "dirty_push": + self.assertEqual(script_node.get_attribute("outputs:counter").get(instance=i), 2) + else: + self.assertEqual(script_node.get_attribute("outputs:counter").get(instance=i), 6) + self.assertEqual(script_node.get_attribute("outputs:graph_target_name").get(instance=i), prim_paths[i]) + + # Delete the graph and prims. + for i in range(num_prims): + stage.RemovePrim(prim_paths[i]) + stage.RemovePrim(graph_path) + await omni.kit.app.get_app().next_update_async() + + # ---------------------------------------------------------------------- + async def test_compute_creates_dynamic_attrib_legacy(self): + """Test that the script node can create dynamic attribs within its compute""" + controller = og.Controller() + keys = og.Controller.Keys + + script = """ +attribute_exists = db.node.get_attribute_exists("inputs:multiplier") +if attribute_exists != True: + db.node.create_attribute("inputs:multiplier", og.Type(og.BaseDataType.DOUBLE)) +db.outputs.data = db.inputs.data * db.inputs.multiplier""" + + ( + graph, + (on_impulse_node, script_node), + _, + _, + ) = controller.edit( + {"graph_path": "/TestGraph", "evaluator_name": "execution"}, + { + keys.CREATE_NODES: [ + ("OnImpulse", "omni.graph.action.OnImpulseEvent"), + ("Script", "airlab.airstack.AscentNode"), + ], + keys.CONNECT: ("OnImpulse.outputs:execOut", "Script.inputs:execIn"), + keys.SET_VALUES: [ + ("OnImpulse.inputs:onlyPlayback", False), + ("Script.inputs:script", script), + ], + }, + ) + + script_node.create_attribute( + "inputs:data", og.Type(og.BaseDataType.DOUBLE), og.AttributePortType.ATTRIBUTE_PORT_TYPE_INPUT + ) + script_node.create_attribute( + "outputs:data", og.Type(og.BaseDataType.DOUBLE), og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT + ) + controller.edit( + "/TestGraph", + { + keys.SET_VALUES: [ + ("Script.inputs:data", 42), + ("Script.outputs:data", 0), + ], + }, + ) + await controller.evaluate(graph) + + # trigger graph evaluation once so the compute runs + og.Controller.set(controller.attribute("state:enableImpulse", on_impulse_node), True) + await controller.evaluate(graph) + val = og.Controller.get(controller.attribute("outputs:data", script_node)) + self.assertEqual(val, 0) + + # set value on the dynamic attrib and check compute + og.Controller.set(controller.attribute("inputs:multiplier", script_node), 2.0) + og.Controller.set(controller.attribute("state:enableImpulse", on_impulse_node), True) + await controller.evaluate(graph) + val = og.Controller.get(controller.attribute("outputs:data", script_node)) + self.assertEqual(val, 84) + + # ---------------------------------------------------------------------- + async def test_use_loaded_dynamic_attrib(self): + """Test that the script node can use a dynamic attrib loaded from USD""" + await ogts.load_test_file("TestAscentNode.usda", use_caller_subdirectory=True) + + controller = og.Controller() + val = og.Controller.get(controller.attribute("outputs:data", "/World/ActionGraph/script_node")) + self.assertEqual(val, 0) + # trigger graph evaluation once so the compute runs + og.Controller.set(controller.attribute("state:enableImpulse", "/World/ActionGraph/on_impulse_event"), True) + await controller.evaluate() + val = og.Controller.get(controller.attribute("outputs:data", "/World/ActionGraph/script_node")) + self.assertEqual(val, 84) + as_int = og.Controller.get(controller.attribute("outputs:asInt", "/World/ActionGraph/script_node")) + as_float = og.Controller.get(controller.attribute("state:asFloat", "/World/ActionGraph/script_node")) + self.assertEqual(as_int, 84) + self.assertEqual(as_float, 84.0) + + # ---------------------------------------------------------------------- + async def test_simple_scripts_legacy(self): + """Test that some simple scripts work as intended""" + controller = og.Controller() + keys = og.Controller.Keys + + ( + graph, + (script_node,), + _, + _, + ) = controller.edit( + "/TestGraph", + { + keys.CREATE_NODES: ("Script", "airlab.airstack.AscentNode"), + }, + ) + + script_node.create_attribute( + "inputs:my_input_attribute", og.Type(og.BaseDataType.INT), og.AttributePortType.ATTRIBUTE_PORT_TYPE_INPUT + ) + script_node.create_attribute( + "outputs:my_output_attribute", og.Type(og.BaseDataType.INT), og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT + ) + output_controller = og.Controller(og.Controller.attribute("outputs:my_output_attribute", script_node)) + + controller.edit( + "/TestGraph", + { + keys.SET_VALUES: ("Script.inputs:script", "db.outputs.my_output_attribute = 123"), + }, + ) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 123) + + controller.edit( + "/TestGraph", + { + keys.SET_VALUES: [ + ("Script.inputs:script", "db.outputs.my_output_attribute = -db.inputs.my_input_attribute"), + ("Script.inputs:my_input_attribute", 1234), + ("Script.state:omni_initialized", False), + ] + }, + ) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), -1234) + + controller.edit( + "/TestGraph", + { + keys.SET_VALUES: [ + ( + "Script.inputs:script", + "db.outputs.my_output_attribute = db.inputs.my_input_attribute * db.inputs.my_input_attribute", + ), + ("Script.inputs:my_input_attribute", -12), + ("Script.state:omni_initialized", False), + ] + }, + ) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 144) + + # ---------------------------------------------------------------------- + async def test_internal_state_keeps_persistent_info_legacy(self): + """Test that the script node can keep persistent information using internal state""" + + script = """ +if (not hasattr(db.per_instance_state, 'num1')): + db.per_instance_state.num1 = 0 + db.per_instance_state.num2 = 1 +else: + sum = db.per_instance_state.num1 + db.per_instance_state.num2 + db.per_instance_state.num1 = db.per_instance_state.num2 + db.per_instance_state.num2 = sum +db.outputs.data = db.per_instance_state.num1""" + + controller = og.Controller() + keys = og.Controller.Keys + + ( + graph, + (_, script_node), + _, + _, + ) = controller.edit( + {"graph_path": "/TestGraph", "evaluator_name": "execution"}, + { + keys.CREATE_NODES: [ + ("OnTick", "omni.graph.action.OnTick"), + ("Script", "airlab.airstack.AscentNode"), + ], + keys.CONNECT: ("OnTick.outputs:tick", "Script.inputs:execIn"), + keys.SET_VALUES: [ + ("OnTick.inputs:onlyPlayback", False), + ("Script.inputs:script", script), + ], + }, + ) + + script_node.create_attribute( + "outputs:data", og.Type(og.BaseDataType.INT), og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT + ) + output_controller = og.Controller(og.Controller.attribute("outputs:data", script_node)) + + # Check that the script node produces the Fibonacci numbers + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 0) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 1) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 1) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 2) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 3) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 5) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 8) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 13) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 21) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 34) + await controller.evaluate(graph) + self.assertEqual(output_controller.get(), 55) + + # ---------------------------------------------------------------------- + async def test_script_global_scope(self): + """Test that variables, functions, and classes defined outside of the user-defined callbacks are visible""" + + controller = og.Controller() + keys = og.Controller.Keys + + ( + graph, + (script_node,), + _, + _, + ) = controller.edit( + "/TestGraph", + { + keys.CREATE_NODES: ("Script", "airlab.airstack.AscentNode"), + }, + ) + + script_node.create_attribute( + "outputs:output_a", og.Type(og.BaseDataType.INT), og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT + ) + script_node.create_attribute( + "outputs:output_b", og.Type(og.BaseDataType.TOKEN), og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT + ) + output_a_controller = og.Controller(og.Controller.attribute("outputs:output_a", script_node)) + output_b_controller = og.Controller(og.Controller.attribute("outputs:output_b", script_node)) + + script_test_constants = """ +MY_CONSTANT_A = 123 +MY_CONSTANT_B = 'foo' + +def setup(db): + db.outputs.output_a = MY_CONSTANT_A + +def compute(db): + db.outputs.output_b = MY_CONSTANT_B""" + + controller.edit( + "/TestGraph", + { + keys.SET_VALUES: ("Script.inputs:script", script_test_constants), + }, + ) + await controller.evaluate(graph) + self.assertEqual(output_a_controller.get(), 123) + self.assertEqual(output_b_controller.get(), "foo") + await controller.evaluate(graph) + self.assertEqual(output_b_controller.get(), "foo") + + script_test_variables = """ +my_variable = 123 + +def setup(db): + global my_variable + my_variable = 234 + db.outputs.output_a = my_variable + +def compute(db): + global my_variable + db.outputs.output_b = f'{my_variable}' + my_variable += 1""" + + controller.edit( + "/TestGraph", + { + keys.SET_VALUES: [ + ("Script.inputs:script", script_test_variables), + ("Script.state:omni_initialized", False), + ], + }, + ) + await controller.evaluate(graph) + self.assertEqual(output_a_controller.get(), 234) + self.assertEqual(output_b_controller.get(), "234") + await controller.evaluate(graph) + self.assertEqual(output_b_controller.get(), "235") + + script_test_functions = """ +def my_function_a(): + return 123 + +my_variable_b = 'foo' + +def my_function_b(): + return my_variable_b + +def setup(db): + db.outputs.output_a = my_function_a() + +def compute(db): + db.outputs.output_b = my_function_b() + global my_variable_b + my_variable_b = 'bar'""" + + controller.edit( + "/TestGraph", + { + keys.SET_VALUES: [ + ("Script.inputs:script", script_test_functions), + ("Script.state:omni_initialized", False), + ] + }, + ) + await controller.evaluate(graph) + self.assertEqual(output_a_controller.get(), 123) + self.assertEqual(output_b_controller.get(), "foo") + await controller.evaluate(graph) + self.assertEqual(output_b_controller.get(), "bar") + + script_test_imports = """ +import inspect +import math + +my_lambda = lambda x: x +code_len = len(inspect.getsource(my_lambda)) + +def setup(db): + db.outputs.output_a = code_len + +def compute(db): + db.outputs.output_b = f'{math.pi:.2f}'""" + + controller.edit( + "/TestGraph", + { + keys.SET_VALUES: [ + ("Script.inputs:script", script_test_imports), + ("Script.state:omni_initialized", False), + ] + }, + ) + await controller.evaluate(graph) + self.assertEqual(output_a_controller.get(), 24) + self.assertEqual(output_b_controller.get(), "3.14") + await controller.evaluate(graph) + self.assertEqual(output_b_controller.get(), "3.14") + + script_test_classes = """ +class MyClass: + def __init__(self, value): + self.value = value + + def get_value(self): + return self.value + + @staticmethod + def get_num(): + return 123 + +my_variable = MyClass('foo') + +def setup(db): + db.outputs.output_a = MyClass.get_num() + +def compute(db): + db.outputs.output_b = my_variable.get_value() + my_variable.value = 'bar'""" + + controller.edit( + "/TestGraph", + { + keys.SET_VALUES: [ + ("Script.inputs:script", script_test_classes), + ("Script.state:omni_initialized", False), + ] + }, + ) + await controller.evaluate(graph) + self.assertEqual(output_a_controller.get(), 123) + self.assertEqual(output_b_controller.get(), "foo") + await controller.evaluate(graph) + self.assertEqual(output_b_controller.get(), "bar") + + # -------------------------------------------------------------------------------------------------------------- + async def test_script_node_cleanup_failure(self): + """Check the exception handling when the cleanup fails""" + controller = og.Controller() + keys = og.Controller.Keys + + ( + graph, + (script_node,), + _, + _, + ) = controller.edit( + "/TestGraph", + { + keys.CREATE_NODES: ("Script", "airlab.airstack.AscentNode"), + }, + ) + + script_test_exception = """ +def cleanup(db): + raise AttributeError + +def compute(db): + pass""" + + controller.edit( + "/TestGraph", + { + keys.SET_VALUES: ("Script.inputs:script", script_test_exception), + }, + ) + await controller.evaluate(graph) + controller.set(script_node.get_attribute("state:omni_initialized"), False) + await controller.evaluate(graph) + + # -------------------------------------------------------------------------------------------------------------- + async def test_script_node_edge_cases(self): + """Check the parts of the code that are handling rare or uncommon error conditions""" + controller = og.Controller() + keys = og.Controller.Keys + + ( + graph, + (script_node,), + _, + _, + ) = controller.edit( + "/TestGraph", + { + keys.CREATE_NODES: ("Script", "airlab.airstack.AscentNode"), + }, + ) + use_path_attr = script_node.get_attribute("inputs:usePath") + script_path_attr = script_node.get_attribute("inputs:scriptPath") + controller.set(use_path_attr, True) + + # Test when path script is empty + await controller.evaluate() + + script_raise = """ +def compute(db): + raise og.OmniGraphError""" + + with TemporaryDirectory() as test_directory: + tmp_file_path = Path(test_directory) / "sample_ascentnode_script.py" + + # Test when script file not found + controller.set(script_path_attr, str(tmp_file_path)) + await controller.evaluate(graph) + + # Test when compute raises an exception + with open(tmp_file_path, "w", encoding="utf-8") as script_fd: + script_fd.write(script_raise) + + controller.set(script_path_attr, str(tmp_file_path)) + await controller.evaluate(graph) + + # Test when compute script is empty + with open(tmp_file_path, "w", encoding="utf-8") as script_fd: + script_fd.write("") + await controller.evaluate(graph) + + # -------------------------------------------------------------------------------------------------------------- + async def test_script_node_documentation(self): + '''This test is set up to be code that runs independently as a test itself, and is also formatted so that + the script node documentation can extract the code for literal inclusion. Using this approach we can + guarantee that the code we show in our documentation is always functional. + + The example script used is as follows (repeated a few times so that each section of the documentation will have + a unique instance of it so that it can be self-contained). + + # begin-script-node-script + """Set the output to True if the first input is larger than the second input""" + + def compute(db: og.Database): + db.outputs.greater = db.inputs.first_input > db.inputs.second_input + # You always return True to indicate that the compute succeeded + return True + """ + # end-script-node-script + ''' + # begin-script-node-creation + # Note the extra parameter to the graph to ensure it is an action graph. + (_, (script_node,), _, _) = og.Controller.edit( + {"graph_path": "/TestGraph", "evaluator_name": "execution"}, + {og.Controller.Keys.CREATE_NODES: ("AscentNode", "airlab.airstack.AscentNode")}, + ) + # After this call "script_node" contains the og.Node that was created in a brand new OmniGraph. + # end-script-node-creation + + # Helper to add a tick event so that the script node can be tested in operation + _ = og.Controller.edit( + "/TestGraph", + { + og.Controller.Keys.CREATE_NODES: [("OnTick", "omni.graph.action.OnTick")], + og.Controller.Keys.SET_VALUES: [("OnTick.inputs:onlyPlayback", False)], + og.Controller.Keys.CONNECT: [("OnTick.outputs:tick", "/TestGraph/AscentNode.inputs:execIn")], + }, + ) + + # begin-script-node-set-to-file + script_text = ''' + """Set the output to True if the first input is larger than the second input""" + + def compute(db: og.Database): + db.outputs.greater = db.inputs.first_input > db.inputs.second_input + # You always return True to indicate that the compute succeeded + return True + ''' + with TemporaryDirectory() as test_directory: + tmp_file_path = Path(test_directory) / "sample_ascentnode_script.py" + with open(tmp_file_path, "w", encoding="utf-8") as script_fd: + script_fd.write(dedent(script_text)) + use_path_attr = script_node.get_attribute("inputs:usePath") + script_path_attr = script_node.get_attribute("inputs:scriptPath") + og.Controller.set(use_path_attr, True) + og.Controller.set(script_path_attr, str(tmp_file_path)) + # end-script-node-set-to-file + self.assertEqual(og.Controller.get(script_path_attr), str(tmp_file_path)) + + # Since there is only one node this attribute addition only needs to happen once. In the docs it will + # be inserted in multiple locations to ensure that each section is complete unto itself. + # begin-script-node-add-attributes + # In the script you have accessed the database variables "db.inputs.first_input", "db.inputs.second_input", + # and "db.outputs.greater". These all correspond to attributes of the named port type (input or output) + # that must now be added to the node in order for it to function correctly. + first_input = og.Controller.create_attribute(script_node, "first_input", "int", og.AttributePortType.INPUT) + second_input = og.Controller.create_attribute( + script_node, "second_input", "int", og.AttributePortType.INPUT + ) + output = og.Controller.create_attribute(script_node, "greater", "bool", og.AttributePortType.OUTPUT) + # end-script-node-add-attributes + + # Do some basic validity checks to make sure the script node is working correctly. + self.assertTrue(first_input.is_valid()) + self.assertTrue(second_input.is_valid()) + self.assertTrue(output.is_valid()) + og.Controller.set(first_input, 3) + og.Controller.set(second_input, 4) + await og.Controller.evaluate() + self.assertFalse(og.Controller.get(output)) + + og.Controller.set(first_input, 4) + og.Controller.set(second_input, 3) + await og.Controller.evaluate() + self.assertTrue(og.Controller.get(output)) + + # For the next test + og.Controller.set(use_path_attr, False) + + # The text is duplicated because it is included in two different sections of the documentation so in the + # interests of having everything in one place the complete script is put into both locations. + # begin-script-node-set-to-script + script_text = ''' + """Set the output to True if the first input is larger than the second input""" + + def compute(db: og.Database): + db.outputs.greater = db.inputs.first_input > db.inputs.second_input + # You always return True to indicate that the compute succeeded + return True + ''' + script_attr = script_node.get_attribute("inputs:script") + og.Controller.set(script_attr, dedent(script_text)) + # end-script-node-set-to-script + + # Do some basic validity checks to make sure the script node is working correctly. + self.assertEqual(og.Controller.get(script_path_attr), str(tmp_file_path)) + og.Controller.set(first_input, 3) + og.Controller.set(second_input, 4) + await og.Controller.evaluate() + self.assertFalse(og.Controller.get(output)) + + og.Controller.set(first_input, 4) + og.Controller.set(second_input, 3) + await og.Controller.evaluate() + self.assertTrue(og.Controller.get(output)) diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_ascentnode_ui.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_ascentnode_ui.py new file mode 100644 index 00000000..b6818150 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_ascentnode_ui.py @@ -0,0 +1,258 @@ +"""Tests for ascentnode which exercise the UI""" + +import os +import tempfile + +import carb +import omni.graph.core as og +import omni.graph.ui._impl.omnigraph_attribute_base as ogab +import omni.kit.app +import omni.kit.commands +import omni.kit.test +import omni.ui as ui +import omni.usd +from airlab.airstack._impl.extension import ( + ASCENTNODE_ENABLE_OPT_IN_SETTING, + ASCENTNODE_OPT_IN_SETTING, + check_for_ascentnodes, + is_check_enabled, + verify_ascentnode_load, +) +from omni.kit import ui_test +from omni.kit.test_suite.helpers import wait_for_window +from omni.ui.tests.test_base import OmniUiTest + + +class TestAscentNodeUI(OmniUiTest): + """ + Tests for ascentnode which exercise the UI + """ + + TEST_GRAPH_PATH = "/World/TestGraph" + + # Before running each test + async def setUp(self): + await super().setUp() + + # Ensure we have a clean stage for the test + await omni.usd.get_context().new_stage_async() + # Give OG a chance to set up on the first stage update + await omni.kit.app.get_app().next_update_async() + self._temp_file_path = None # A temporary file we need to clean up + import omni.kit.window.property as p + + self._w = p.get_window() + + # The OG attribute-base UI should refresh every frame + ogab.AUTO_REFRESH_PERIOD = 0 + + async def tearDown(self): + if (self._temp_file_path is not None) and os.path.isfile(self._temp_file_path): + os.remove(self._temp_file_path) + # Close the stage to avoid dangling references to the graph. (OM-84680) + await omni.usd.get_context().close_stage_async() + await super().tearDown() + + async def test_interaction(self): + """ + Exercise the controls on the custom template + """ + usd_context = omni.usd.get_context() + + keys = og.Controller.Keys + controller = og.Controller() + + (_, (script_node,), _, _) = controller.edit( + self.TEST_GRAPH_PATH, + { + keys.CREATE_NODES: [ + ("AscentNode", "airlab.airstack.AscentNode"), + ], + keys.SET_VALUES: [("AscentNode.inputs:usePath", False), ("AscentNode.inputs:scriptPath", "")], + }, + ) + ok = script_node.create_attribute( + "outputs:out", og.Type(og.BaseDataType.INT), og.AttributePortType.ATTRIBUTE_PORT_TYPE_OUTPUT + ) + self.assertTrue(ok) + + attr_out = script_node.get_attribute("outputs:out") + attr_script = script_node.get_attribute("inputs:script") + + # Select the node. + usd_context.get_selection().set_selected_prim_paths([script_node.get_prim_path()], True) + + # Wait for property panel to converge + await ui_test.human_delay(5) + # Set the inline script back to empty + attr_script.set("") + reset_button = ui_test.find("Property//Frame/**/Button[*].identifier=='_ascentnode_reset'") + script_path_model = ui_test.find("Property//Frame/**/.identifier=='sdf_asset_inputs:scriptPath'") + use_path_toggle = ui_test.find("Property//Frame/**/.identifier=='bool_inputs:usePath'") + snippets_button = ui_test.find("Property//Frame/**/Button[*].identifier=='_ascentnode_snippets'") + + # write out a script and change the file path + await use_path_toggle.click() + await ui_test.human_delay(5) + + # NamedTemporaryFile is not very nice on Windows, need to ensure we close before node tries to read + with tempfile.NamedTemporaryFile(mode="w+t", encoding="utf-8", delete=False) as tf: + self._temp_file_path = tf.name + tf.write( + """ +def compute(db: og.Database): + db.outputs.out = 42 + return True""" + ) + + await script_path_model.input(self._temp_file_path) + await omni.kit.app.get_app().next_update_async() + + # verify it has now computed, because `input` above will trigger the widget `end_edit` + self.assertEqual(attr_out.get(), 42) + + # change the script, verify it doesn't take effect until reset is pressed + with open(self._temp_file_path, mode="w+t", encoding="utf-8") as tf: + tf.write( + """ +def compute(db: og.Database): + db.outputs.out = 1000 + return True""" + ) + + await omni.kit.app.get_app().next_update_async() + # verify it has now computed + self.assertEqual(attr_out.get(), 42) + + await reset_button.click() + await ui_test.human_delay(1) + # Verify the script now computed with the new script + self.assertEqual(attr_out.get(), 1000) + + # Switch it back to inline script + attr_script.set( + """ +def compute(db): + db.outputs.out = 1 +""" + ) + await ui_test.human_delay(1) + await use_path_toggle.click() + await reset_button.click() + await ui_test.human_delay(1) + self.assertEqual(attr_out.get(), 1) + + # Switch it back to external script + await use_path_toggle.click() + await ui_test.human_delay(1) + self.assertEqual(attr_out.get(), 1000) + + # Now add an attribute using the dialog + await ui_test.find("Property//Frame/**/Button[*].identifier=='_ascentnode_add_attribute'").click() + await wait_for_window("Add Attribute") + await ui_test.find("Add Attribute//Frame/**/StringField[*].identifier=='_ascentnode_name'").input("test_attrib") + # Find the only string field without an identifier, that is the search field + await ui_test.find("Add Attribute//Frame/**/StringField[*].identifier!='_ascentnode_name'").input("int64") + await ui_test.find("Add Attribute//Frame/**/Button[*].text=='int64'").click() + + await ui_test.human_delay(1) + + await ui_test.find("Add Attribute//Frame/**/Button[*].identifier=='_ascentnode_add_ok'").click() + await ui_test.human_delay(3) + + # Check the attribute was actually added + attr_test = script_node.get_attribute("inputs:test_attrib") + self.assertEqual(attr_test.get_resolved_type(), og.Type(og.BaseDataType.INT64, 1, 0)) + + # Show the remove menu, remove the item we added + + await ui_test.find("Property//Frame/**/Button[*].identifier=='_ascentnode_remove_attribute'").click() + await ui_test.human_delay(1) + menu = ui.Menu.get_current() + test_item = next((item for item in ui.Inspector.get_children(menu) if item.text == "inputs:test_attrib")) + test_item.call_triggered_fn() + await ui_test.human_delay(1) + self.assertFalse(script_node.get_attribute_exists("inputs:test_attrib")) + menu.hide() + + # Clear the current script + attr_script.set("") + await ui_test.human_delay(1) + + # Show the snippets menu + await snippets_button.click() + await ui_test.human_delay(1) + menu = ui.Menu.get_current() + # select the first one, verify the script was changed + ui.Inspector.get_children(menu)[0].call_triggered_fn() + await ui_test.human_delay(1) + self.assertTrue("def compute(db)" in attr_script.get()) + + # -------------------------------------------------------------------------------------------------------------- + async def test_setting_interaction(self): + """Test interactions with the user regarding the setting to enable the script nodes""" + settings = carb.settings.get_settings() + + def _get_settings() -> tuple[bool, bool]: + return ( + bool(settings.get(ASCENTNODE_ENABLE_OPT_IN_SETTING)), + bool(settings.get(ASCENTNODE_OPT_IN_SETTING)), + ) + + def _set_settings(enable_opt_in: bool, opt_in: bool): + settings.set(ASCENTNODE_ENABLE_OPT_IN_SETTING, enable_opt_in) + settings.set(ASCENTNODE_OPT_IN_SETTING, opt_in) + + (orig_enable_opt_in, orig_opt_in) = _get_settings() + + try: + # Check the combinations of settings to see if the "check_enabled" state is correct for each one + settings.destroy_item(ASCENTNODE_ENABLE_OPT_IN_SETTING) + self.assertTrue(is_check_enabled()) + settings.set(ASCENTNODE_ENABLE_OPT_IN_SETTING, False) + self.assertFalse(is_check_enabled()) + settings.set(ASCENTNODE_ENABLE_OPT_IN_SETTING, True) + self.assertTrue(is_check_enabled()) + + verify_ascentnode_load([]) + no_button_ref = ui_test.find('Warning//Frame/**/Button[*].text=="No"') + yes_button_ref = ui_test.find('Warning//Frame/**/Button[*].text=="Yes"') + if no_button_ref: + button = no_button_ref.widget + button.call_clicked_fn() + (no_enable_opt_in, no_opt_in) = _get_settings() + self.assertTrue(no_enable_opt_in) + self.assertFalse(no_opt_in) + + if yes_button_ref: + button = yes_button_ref.widget + button.call_clicked_fn() + (yes_enable_opt_in, yes_opt_in) = _get_settings() + self.assertTrue(yes_enable_opt_in) + self.assertTrue(yes_opt_in) + + # Check with no graph first to catch simple cases + check_for_ascentnodes() + + # Turn the opt-in off to check for the dialog + _set_settings(True, False) + check_for_ascentnodes() + if yes_button_ref: + button = yes_button_ref.widget + button.call_clicked_fn() + + # Final case is correct enabling when a graph with script nodes is present + _set_settings(True, False) + _ = og.Controller.edit( + "/TestGraph", + { + og.Controller.Keys.CREATE_NODES: ("Script", "airlab.airstack.AscentNode"), + }, + ) + check_for_ascentnodes() + if yes_button_ref: + button = yes_button_ref.widget + button.call_clicked_fn() + + finally: + _set_settings(orig_enable_opt_in, orig_opt_in) diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_snippets.py b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_snippets.py new file mode 100644 index 00000000..44927b24 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/airlab/airstack/tests/test_snippets.py @@ -0,0 +1,219 @@ +"""Basic tests of the hardcoded snippets delivered to the user""" + +import ast +import re +import sys +from io import StringIO + +import omni.graph.core as og +import omni.graph.core.tests as ogts +import omni.usd +from airlab.airstack._impl.parse_examples import extract_snippets +from airlab.airstack.ogn.OgnAscentNodeDatabase import OgnAscentNodeDatabase +from pxr import Usd + + +# ============================================================================================================== +class TestAscentNodeSnippets(ogts.OmniGraphTestCase): + + # The leading underscore methods are tests for individual code snippets. Each requires a different configuration + # and setup so its easiest to keep them separated like this, and makes it easier to add new snippets. + # -------------------------------------------------------------------------------------------------------------- + async def _test_default_script(self, graph: og.Graph, script_node: og.Node): + """Test the snippet with the title 'Default Script'. Only need to check that it set the output execution state. + Args: + graph: The graph in which the node lives + script_node: The node based on the snippet to be tested + """ + await og.Controller.evaluate(graph) + exec_out = script_node.get_attribute("outputs:execOut") + self.assertTrue(exec_out.is_valid()) + self.assertEqual(og.ExecutionAttributeState.ENABLED, og.Controller.get(exec_out)) + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + async def _test_compute_count(self, graph: og.Graph, script_node: og.Node): + """Test the snippet with the title 'Compute Count' by evaluating a few times and checking the count. + Args: + graph: The graph in which the node lives + script_node: The node based on the snippet to be tested + """ + for _ in range(3): + await og.Controller.evaluate(graph) + out_attr = script_node.get_attribute("outputs:my_output_attribute") + self.assertTrue(out_attr.is_valid()) + self.assertLessEqual(3, og.Controller.get(out_attr)) + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + async def _test_fibonacci(self, graph: og.Graph, script_node: og.Node): + """Test the snippet with the title 'Fibonacci'. + Args: + graph: The graph in which the node lives + script_node: The node based on the snippet to be tested + """ + for _ in range(6): + await og.Controller.evaluate(graph) + out_attr = script_node.get_attribute("outputs:my_output_attribute") + self.assertTrue(out_attr.is_valid()) + # The sixth Fibonacci number is 8, corresponding to six evaluations + self.assertEqual(8, og.Controller.get(out_attr)) + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + async def _test_controller(self, graph: og.Graph): + """Test the snippet with the title 'Controller'. + Args: + graph: The graph in which the node lives + script_node: The node based on the snippet to be tested + """ + await og.Controller.evaluate(graph) + await og.Controller.evaluate(graph) + cube_count = 0 + for prim in Usd.PrimRange(omni.usd.get_context().get_stage().GetPrimAtPath("/World")): + if str(prim.GetPrimPath()).startswith("Cube"): + cube_count += 1 + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + async def _test_warp_deformer(self, graph: og.Graph, script_node: og.Node): + """Test the snippet with the title 'Sine Deformer With Warp'. + Args: + graph: The graph in which the node lives + script_node: The node based on the snippet to be tested + """ + in_points_attr = script_node.get_attribute("inputs:points") + time_attr = script_node.get_attribute("inputs:time") + out_points_attr = script_node.get_attribute("outputs:points") + og.Controller.set(in_points_attr, [[1.0, 1.0, 1.0], [2.0, 2.0, 2.0]]) + og.Controller.set(time_attr, 2.0) + await og.Controller.evaluate() + result = og.Controller.get(out_points_attr) + self.assertEqual(1.0, result[0][0]) + self.assertAlmostEqual(9.632094, result[0][1], places=5) + self.assertEqual(1.0, result[0][2]) + self.assertEqual(2.0, result[1][0]) + self.assertAlmostEqual(10.084964, result[1][1], places=5) + self.assertEqual(2.0, result[1][2]) + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + async def _test_callbacks(self, graph: og.Graph, script_node: og.Node): + """Test the snippet with the title 'Value Changed Callbacks'. + Args: + graph: The graph in which the node lives + script_node: The node based on the snippet to be tested + """ + # Capture printed messages so that execution of the callback can be tested + output = StringIO() + sys.stdout = output + # Set the value twice to ensure the callback is triggered + og.Controller.set(script_node.get_attribute("inputs:my_input_attribute"), 3) + await omni.kit.app.get_app().next_update_async() + og.Controller.set(script_node.get_attribute("inputs:my_input_attribute"), 4) + await omni.kit.app.get_app().next_update_async() + # Wait a tick so that the callback gets a chance to be processed + await omni.kit.app.get_app().next_update_async() + sys.stdout = sys.__stdout__ + + self.assertTrue("Setting up the value changed callback" in output.getvalue()) + self.assertTrue("inputs:my_input_attribute" in output.getvalue()) + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + async def _test_compute_timer(self, graph: og.Graph, script_node: og.Node): + """Test the snippet with the title 'Compute Timer'. + Args: + graph: The graph in which the node lives + script_node: The node based on the snippet to be tested + """ + await og.Controller.evaluate(graph) + state_info = OgnAscentNodeDatabase.get_internal_state(script_node, script_node.get_graph_instance_id()) + self.assertTrue(state_info.elapsed > 0.09) + + # -------------------------------------------------------------------------------------------------------------- + async def test_extracted_snippets(self): + """Extract the snippets from the example scripts and make script nodes from them to ensure they are legal""" + + # Expressions to extract attribute descriptions from the code strings + re_inputs = re.compile(r"\s*#\s*(inputs:[^\(]+)\(([^\)]+)\)\s*(.*)") + re_outputs = re.compile(r"\s*#\s*(outputs:[^\(]+)\(([^\)]+)\)\s*(.*)") + re_state = re.compile(r"\s*#\s*(state:[^\(]+)\(([^\)]+)\)\s*(.*)") + + # Read the snippet file and extract all of the individual strings + snippets = extract_snippets() + + controller = og.Controller() + (graph, _, _, _) = controller.edit("/TestGraph", {}) + + for index, (title, content) in enumerate(snippets, 1): + # For the Warp sample first check to make sure that omni.warp is accessible before running the test + if ( + title == "Sine Deformer With Warp" + and not omni.kit.app.get_app_interface().get_extension_manager().is_extension_enabled("omni.warp") + ): # pragma: no cover Warp should always be present + continue + script_node = controller.create_node((f"AscentNode{index}", graph), "airlab.airstack.AscentNode") + self.assertIsNotNone(script_node) + self.assertTrue(script_node.is_valid()) + + # Empty titles indicate parsing failure + self.assertTrue(title, f"No title in snippet {index}") + self.assertTrue(content, f"No content in snippet {index}") + + # The first thing that can be confirmed is that the string is valid Python by using the AST to parse it. + try: + ast.parse(content) + except SyntaxError as error: # pragma: no cover Firewall + self.fail(f"Failed to parse content in snippet {index} with '{error}'") + + # The attribute descriptions can be extracted from the string and added to the script node to confirm + # that they are legal. + for code_line in content.split("\n"): + input_match = re_inputs.match(code_line) + if input_match: + (name, attr_type, description) = input_match.groups() + self.assertTrue(description, f"Found empty description on attribute {name} at snippet {index}") + input_attr = controller.create_attribute(script_node, name, attr_type, og.AttributePortType.INPUT) + self.assertIsNotNone(input_attr) + self.assertTrue(input_attr.is_valid()) + continue + + output_match = re_outputs.match(code_line) + if output_match: + (name, attr_type, description) = output_match.groups() + self.assertTrue(description, f"Found empty description on attribute {name} at snippet {index}") + output_attr = controller.create_attribute(script_node, name, attr_type, og.AttributePortType.OUTPUT) + self.assertIsNotNone(output_attr) + self.assertTrue(output_attr.is_valid()) + continue + + state_match = re_state.match(code_line) + if state_match: + (name, attr_type, description) = state_match.groups() + self.assertTrue(description, f"Found empty description on attribute {name} at snippet {index}") + state_attr = controller.create_attribute(script_node, name, attr_type, og.AttributePortType.STATE) + self.assertIsNotNone(state_attr) + self.assertTrue(state_attr.is_valid()) + continue + + # Now that the attributes are present, apply the script to the node + script_attr = script_node.get_attribute("inputs:script") + og.Controller.set(script_attr, content) + + # Resetting the node ensures everything starts in a stable state + OgnAscentNodeDatabase.NODE_TYPE_CLASS.try_cleanup(script_node) + + # Snippet-specific testing. This relies on knowledge of how the specific snippet works. If any new + # snippets are added without tests this will fail and a new test should be added for it. + match title: + case "Default Script": + await self._test_default_script(graph, script_node) + case "Compute Count": + await self._test_compute_count(graph, script_node) + case "Fibonacci": + await self._test_fibonacci(graph, script_node) + case "Controller": + await self._test_controller(graph) + case "Sine Deformer With Warp": + await self._test_warp_deformer(graph, script_node) + case "Value Changed Callbacks": + await self._test_callbacks(graph, script_node) + case "Compute Timer": + await self._test_compute_timer(graph, script_node) + case _: + self.fail(f"Test needs to be written for snippet '{title}'") diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/config/extension.gen.toml b/docker/extras/kit-app-template/source/extensions/airlab.airstack/config/extension.gen.toml new file mode 100644 index 00000000..1013c1ac --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/config/extension.gen.toml @@ -0,0 +1,15 @@ + +[package] + archivePath = "https://d4i3qtqj3r0z5.cloudfront.net/airlab.airstack-1.19.1%2B106.0.0.zip" + + [package.target] + + [package.target.kit] + 0 = "106.0.0" + + [package.publish] + kitVersion = "106.0.0+release.150297.117a1e58.tc" + date = 1717154098 + buildNumber = "23-06+release.6045.50ffb622.gl" + repoName = "kit-omnigraph" + signed = 1 diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/config/extension.toml b/docker/extras/kit-app-template/source/extensions/airlab.airstack/config/extension.toml new file mode 100644 index 00000000..ef508f60 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/config/extension.toml @@ -0,0 +1,84 @@ + +[package] +# Semantic Versioning is used: https://semver.org/ +version = "1.19.1" +authors = ["NVIDIA"] +title = "Airstack" +description="Python Node for OmniGraph" +readme = "docs/README.md" +repository = "" +category = "graph" +keywords = ["script"] +changelog="docs/CHANGELOG.md" +feature = true +preview_image = "data/preview.png" +icon = "data/icon.png" +writeTarget.kit = true +support_level = "Core" + +# Watch the .ogn files for hot reloading (only works for Python files) +[fswatcher.patterns] +include = ["*.ogn", "*.py"] +exclude = ["Ogn*Database.py"] + +[dependencies] +"omni.graph.core" = { version = "2.168.1" } +"omni.graph" = { version = "1.134.1" } +"omni.graph.tools" = { version = "1.76.0" } +"omni.kit.widget.text_editor" = { optional = true } # Note: omni.kit.widget.text_editor is brought in by omni.graph.ui +"omni.graph.ui" = { optional = true } +"omni.kit.widget.searchfield" = { optional = true } +"omni.kit.property.usd" = { optional = true } +"omni.kit.window.popup_dialog" = { optional = true } +"omni.kit.window.property" = { optional = true } + +# Main python module this extension provides, it will be publicly available as "import airlab.airstack". +[[python.module]] +name = "airlab.airstack" + +[documentation] +pages = [ + "docs/Overview.md", + "docs/CHANGELOG.md", +] +deps = [ + # Internal docs from other extension in this repo + ["omni.graph.action", "_build/docs/omni.graph.action/latest"], + ["omni.graph.window.action", "_build/docs/omni.graph.window.action/latest"], + # External docs from Kit + ["omni.graph", "https://docs.omniverse.nvidia.com/kit/docs/omni.graph/latest"], + ["omni.graph.tools", "https://docs.omniverse.nvidia.com/kit/docs/omni.graph.tools/latest"], +] +terms = [ + "../../../_build/_docSrcLinks/exts/omni.graph.tools/docs/TERMS", + "../omni.graph.action/docs/TERMS", +] + +[[test]] +dependencies = [ + "omni.warp-1.0.1", + "omni.graph.action", + "omni.graph.ui", + "omni.kit.test_suite.helpers", + "omni.kit.ui_test", + "omni.kit.window.property", + "omni.kit.widget.searchfield" +] + +args = [ + "--/renderer/enabled=pxr", + "--/renderer/active=pxr", + "--/renderer/multiGpu/enabled=false", + "--/renderer/multiGpu/autoEnable=false", # Disable mGPU with PXR due to OM-51026, OM-53611 + "--/renderer/multiGpu/maxGpuCount=1", + "--/app/asyncRendering=false", + "--/app/airlab.airstack/enable_opt_in=false", # Disable script-node opt-in + "--/app/window/dpiScaleOverride=1.0", + "--/app/window/scaleToMonitor=false", + "--/app/file/ignoreUnsavedOnExit=true", + "--no-window" +] + +stdoutFailPatterns.exclude = [ + "*[Error]*[/TestGraph] OmniGraph Error*", +] diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/data/example.usda b/docker/extras/kit-app-template/source/extensions/airlab.airstack/data/example.usda new file mode 100644 index 00000000..ff050ea7 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/data/example.usda @@ -0,0 +1,134 @@ +#usda 1.0 +( + customLayerData = { + dictionary cameraSettings = { + dictionary Front = { + double radius = 500 + double3 target = (0, 0, 0) + } + dictionary Perspective = { + double3 position = (804.005735367578, 410.68477877274694, 232.53810304227943) + double3 target = (138.90081019028202, -10.182299211163947, -128.71851097912065) + } + dictionary Right = { + double radius = 500 + double3 target = (0, 0, 0) + } + dictionary Top = { + double radius = 500 + double3 target = (0, 0, 0) + } + string boundCamera = "/OmniverseKit_Persp" + } + dictionary omni_layer = { + dictionary muteness = { + } + } + int refinementOverrideImplVersion = 0 + dictionary renderSettings = { + } + } + defaultPrim = "World" + endTimeCode = 100 + metersPerUnit = 0.009999999776482582 + startTimeCode = 0 + timeCodesPerSecond = 24 + upAxis = "Y" +) + +def Xform "World" +{ + def DistantLight "defaultLight" ( + prepend apiSchemas = ["ShapingAPI"] + ) + { + float angle = 1 + float intensity = 3000 + float shaping:cone:angle = 180 + float shaping:cone:softness + float shaping:focus + color3f shaping:focusTint + asset shaping:ies:file + double3 xformOp:rotateXYZ = (315, 0, 0) + double3 xformOp:scale = (1, 1, 1) + double3 xformOp:translate = (0, 0, 0) + uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ", "xformOp:scale"] + } + + def ComputeGraphSettings "computegraphSettings" + { + custom token evaluator:type = "push" + custom int2 fileFormatVersion = (1, 1) + } + + def Mesh "Sphere" + { + int[] faceVertexCounts = [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + int[] faceVertexIndices = [0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 6, 0, 6, 7, 0, 7, 8, 0, 8, 9, 0, 9, 10, 0, 10, 11, 0, 11, 12, 0, 12, 13, 0, 13, 14, 0, 14, 15, 0, 15, 16, 0, 16, 17, 0, 17, 18, 0, 18, 19, 0, 19, 20, 0, 20, 21, 0, 21, 22, 0, 22, 23, 0, 23, 24, 0, 24, 25, 0, 25, 26, 0, 26, 27, 0, 27, 28, 0, 28, 29, 0, 29, 30, 0, 30, 31, 0, 31, 32, 0, 32, 33, 0, 33, 34, 0, 34, 35, 0, 35, 36, 0, 36, 37, 0, 37, 38, 0, 38, 39, 0, 39, 40, 0, 40, 41, 0, 41, 42, 0, 42, 43, 0, 43, 44, 0, 44, 45, 0, 45, 46, 0, 46, 47, 0, 47, 48, 0, 48, 49, 0, 49, 50, 0, 50, 51, 0, 51, 52, 0, 52, 53, 0, 53, 54, 0, 54, 55, 0, 55, 56, 0, 56, 57, 0, 57, 58, 0, 58, 59, 0, 59, 60, 0, 60, 61, 0, 61, 62, 0, 62, 63, 0, 63, 64, 0, 64, 65, 0, 65, 66, 0, 66, 67, 0, 67, 68, 0, 68, 69, 0, 69, 70, 0, 70, 71, 0, 71, 72, 0, 72, 73, 0, 73, 74, 0, 74, 75, 0, 75, 76, 0, 76, 77, 0, 77, 78, 0, 78, 79, 0, 79, 80, 0, 80, 81, 0, 81, 82, 0, 82, 83, 0, 83, 84, 0, 84, 85, 0, 85, 86, 0, 86, 87, 0, 87, 88, 0, 88, 89, 0, 89, 90, 0, 90, 91, 0, 91, 92, 0, 92, 93, 0, 93, 94, 0, 94, 95, 0, 95, 96, 0, 96, 97, 0, 97, 98, 0, 98, 99, 0, 99, 100, 0, 100, 101, 0, 101, 102, 0, 102, 103, 0, 103, 104, 0, 104, 105, 0, 105, 106, 0, 106, 107, 0, 107, 108, 0, 108, 109, 0, 109, 110, 0, 110, 111, 0, 111, 112, 0, 112, 113, 0, 113, 114, 0, 114, 115, 0, 115, 116, 0, 116, 117, 0, 117, 118, 0, 118, 119, 0, 119, 120, 0, 120, 1, 1, 121, 122, 2, 2, 122, 123, 3, 3, 123, 124, 4, 4, 124, 125, 5, 5, 125, 126, 6, 6, 126, 127, 7, 7, 127, 128, 8, 8, 128, 129, 9, 9, 129, 130, 10, 10, 130, 131, 11, 11, 131, 132, 12, 12, 132, 133, 13, 13, 133, 134, 14, 14, 134, 135, 15, 15, 135, 136, 16, 16, 136, 137, 17, 17, 137, 138, 18, 18, 138, 139, 19, 19, 139, 140, 20, 20, 140, 141, 21, 21, 141, 142, 22, 22, 142, 143, 23, 23, 143, 144, 24, 24, 144, 145, 25, 25, 145, 146, 26, 26, 146, 147, 27, 27, 147, 148, 28, 28, 148, 149, 29, 29, 149, 150, 30, 30, 150, 151, 31, 31, 151, 152, 32, 32, 152, 153, 33, 33, 153, 154, 34, 34, 154, 155, 35, 35, 155, 156, 36, 36, 156, 157, 37, 37, 157, 158, 38, 38, 158, 159, 39, 39, 159, 160, 40, 40, 160, 161, 41, 41, 161, 162, 42, 42, 162, 163, 43, 43, 163, 164, 44, 44, 164, 165, 45, 45, 165, 166, 46, 46, 166, 167, 47, 47, 167, 168, 48, 48, 168, 169, 49, 49, 169, 170, 50, 50, 170, 171, 51, 51, 171, 172, 52, 52, 172, 173, 53, 53, 173, 174, 54, 54, 174, 175, 55, 55, 175, 176, 56, 56, 176, 177, 57, 57, 177, 178, 58, 58, 178, 179, 59, 59, 179, 180, 60, 60, 180, 181, 61, 61, 181, 182, 62, 62, 182, 183, 63, 63, 183, 184, 64, 64, 184, 185, 65, 65, 185, 186, 66, 66, 186, 187, 67, 67, 187, 188, 68, 68, 188, 189, 69, 69, 189, 190, 70, 70, 190, 191, 71, 71, 191, 192, 72, 72, 192, 193, 73, 73, 193, 194, 74, 74, 194, 195, 75, 75, 195, 196, 76, 76, 196, 197, 77, 77, 197, 198, 78, 78, 198, 199, 79, 79, 199, 200, 80, 80, 200, 201, 81, 81, 201, 202, 82, 82, 202, 203, 83, 83, 203, 204, 84, 84, 204, 205, 85, 85, 205, 206, 86, 86, 206, 207, 87, 87, 207, 208, 88, 88, 208, 209, 89, 89, 209, 210, 90, 90, 210, 211, 91, 91, 211, 212, 92, 92, 212, 213, 93, 93, 213, 214, 94, 94, 214, 215, 95, 95, 215, 216, 96, 96, 216, 217, 97, 97, 217, 218, 98, 98, 218, 219, 99, 99, 219, 220, 100, 100, 220, 221, 101, 101, 221, 222, 102, 102, 222, 223, 103, 103, 223, 224, 104, 104, 224, 225, 105, 105, 225, 226, 106, 106, 226, 227, 107, 107, 227, 228, 108, 108, 228, 229, 109, 109, 229, 230, 110, 110, 230, 231, 111, 111, 231, 232, 112, 112, 232, 233, 113, 113, 233, 234, 114, 114, 234, 235, 115, 115, 235, 236, 116, 116, 236, 237, 117, 117, 237, 238, 118, 118, 238, 239, 119, 119, 239, 240, 120, 120, 240, 121, 1, 121, 241, 242, 122, 122, 242, 243, 123, 123, 243, 244, 124, 124, 244, 245, 125, 125, 245, 246, 126, 126, 246, 247, 127, 127, 247, 248, 128, 128, 248, 249, 129, 129, 249, 250, 130, 130, 250, 251, 131, 131, 251, 252, 132, 132, 252, 253, 133, 133, 253, 254, 134, 134, 254, 255, 135, 135, 255, 256, 136, 136, 256, 257, 137, 137, 257, 258, 138, 138, 258, 259, 139, 139, 259, 260, 140, 140, 260, 261, 141, 141, 261, 262, 142, 142, 262, 263, 143, 143, 263, 264, 144, 144, 264, 265, 145, 145, 265, 266, 146, 146, 266, 267, 147, 147, 267, 268, 148, 148, 268, 269, 149, 149, 269, 270, 150, 150, 270, 271, 151, 151, 271, 272, 152, 152, 272, 273, 153, 153, 273, 274, 154, 154, 274, 275, 155, 155, 275, 276, 156, 156, 276, 277, 157, 157, 277, 278, 158, 158, 278, 279, 159, 159, 279, 280, 160, 160, 280, 281, 161, 161, 281, 282, 162, 162, 282, 283, 163, 163, 283, 284, 164, 164, 284, 285, 165, 165, 285, 286, 166, 166, 286, 287, 167, 167, 287, 288, 168, 168, 288, 289, 169, 169, 289, 290, 170, 170, 290, 291, 171, 171, 291, 292, 172, 172, 292, 293, 173, 173, 293, 294, 174, 174, 294, 295, 175, 175, 295, 296, 176, 176, 296, 297, 177, 177, 297, 298, 178, 178, 298, 299, 179, 179, 299, 300, 180, 180, 300, 301, 181, 181, 301, 302, 182, 182, 302, 303, 183, 183, 303, 304, 184, 184, 304, 305, 185, 185, 305, 306, 186, 186, 306, 307, 187, 187, 307, 308, 188, 188, 308, 309, 189, 189, 309, 310, 190, 190, 310, 311, 191, 191, 311, 312, 192, 192, 312, 313, 193, 193, 313, 314, 194, 194, 314, 315, 195, 195, 315, 316, 196, 196, 316, 317, 197, 197, 317, 318, 198, 198, 318, 319, 199, 199, 319, 320, 200, 200, 320, 321, 201, 201, 321, 322, 202, 202, 322, 323, 203, 203, 323, 324, 204, 204, 324, 325, 205, 205, 325, 326, 206, 206, 326, 327, 207, 207, 327, 328, 208, 208, 328, 329, 209, 209, 329, 330, 210, 210, 330, 331, 211, 211, 331, 332, 212, 212, 332, 333, 213, 213, 333, 334, 214, 214, 334, 335, 215, 215, 335, 336, 216, 216, 336, 337, 217, 217, 337, 338, 218, 218, 338, 339, 219, 219, 339, 340, 220, 220, 340, 341, 221, 221, 341, 342, 222, 222, 342, 343, 223, 223, 343, 344, 224, 224, 344, 345, 225, 225, 345, 346, 226, 226, 346, 347, 227, 227, 347, 348, 228, 228, 348, 349, 229, 229, 349, 350, 230, 230, 350, 351, 231, 231, 351, 352, 232, 232, 352, 353, 233, 233, 353, 354, 234, 234, 354, 355, 235, 235, 355, 356, 236, 236, 356, 357, 237, 237, 357, 358, 238, 238, 358, 359, 239, 239, 359, 360, 240, 240, 360, 241, 121, 241, 361, 362, 242, 242, 362, 363, 243, 243, 363, 364, 244, 244, 364, 365, 245, 245, 365, 366, 246, 246, 366, 367, 247, 247, 367, 368, 248, 248, 368, 369, 249, 249, 369, 370, 250, 250, 370, 371, 251, 251, 371, 372, 252, 252, 372, 373, 253, 253, 373, 374, 254, 254, 374, 375, 255, 255, 375, 376, 256, 256, 376, 377, 257, 257, 377, 378, 258, 258, 378, 379, 259, 259, 379, 380, 260, 260, 380, 381, 261, 261, 381, 382, 262, 262, 382, 383, 263, 263, 383, 384, 264, 264, 384, 385, 265, 265, 385, 386, 266, 266, 386, 387, 267, 267, 387, 388, 268, 268, 388, 389, 269, 269, 389, 390, 270, 270, 390, 391, 271, 271, 391, 392, 272, 272, 392, 393, 273, 273, 393, 394, 274, 274, 394, 395, 275, 275, 395, 396, 276, 276, 396, 397, 277, 277, 397, 398, 278, 278, 398, 399, 279, 279, 399, 400, 280, 280, 400, 401, 281, 281, 401, 402, 282, 282, 402, 403, 283, 283, 403, 404, 284, 284, 404, 405, 285, 285, 405, 406, 286, 286, 406, 407, 287, 287, 407, 408, 288, 288, 408, 409, 289, 289, 409, 410, 290, 290, 410, 411, 291, 291, 411, 412, 292, 292, 412, 413, 293, 293, 413, 414, 294, 294, 414, 415, 295, 295, 415, 416, 296, 296, 416, 417, 297, 297, 417, 418, 298, 298, 418, 419, 299, 299, 419, 420, 300, 300, 420, 421, 301, 301, 421, 422, 302, 302, 422, 423, 303, 303, 423, 424, 304, 304, 424, 425, 305, 305, 425, 426, 306, 306, 426, 427, 307, 307, 427, 428, 308, 308, 428, 429, 309, 309, 429, 430, 310, 310, 430, 431, 311, 311, 431, 432, 312, 312, 432, 433, 313, 313, 433, 434, 314, 314, 434, 435, 315, 315, 435, 436, 316, 316, 436, 437, 317, 317, 437, 438, 318, 318, 438, 439, 319, 319, 439, 440, 320, 320, 440, 441, 321, 321, 441, 442, 322, 322, 442, 443, 323, 323, 443, 444, 324, 324, 444, 445, 325, 325, 445, 446, 326, 326, 446, 447, 327, 327, 447, 448, 328, 328, 448, 449, 329, 329, 449, 450, 330, 330, 450, 451, 331, 331, 451, 452, 332, 332, 452, 453, 333, 333, 453, 454, 334, 334, 454, 455, 335, 335, 455, 456, 336, 336, 456, 457, 337, 337, 457, 458, 338, 338, 458, 459, 339, 339, 459, 460, 340, 340, 460, 461, 341, 341, 461, 462, 342, 342, 462, 463, 343, 343, 463, 464, 344, 344, 464, 465, 345, 345, 465, 466, 346, 346, 466, 467, 347, 347, 467, 468, 348, 348, 468, 469, 349, 349, 469, 470, 350, 350, 470, 471, 351, 351, 471, 472, 352, 352, 472, 473, 353, 353, 473, 474, 354, 354, 474, 475, 355, 355, 475, 476, 356, 356, 476, 477, 357, 357, 477, 478, 358, 358, 478, 479, 359, 359, 479, 480, 360, 360, 480, 361, 241, 361, 481, 482, 362, 362, 482, 483, 363, 363, 483, 484, 364, 364, 484, 485, 365, 365, 485, 486, 366, 366, 486, 487, 367, 367, 487, 488, 368, 368, 488, 489, 369, 369, 489, 490, 370, 370, 490, 491, 371, 371, 491, 492, 372, 372, 492, 493, 373, 373, 493, 494, 374, 374, 494, 495, 375, 375, 495, 496, 376, 376, 496, 497, 377, 377, 497, 498, 378, 378, 498, 499, 379, 379, 499, 500, 380, 380, 500, 501, 381, 381, 501, 502, 382, 382, 502, 503, 383, 383, 503, 504, 384, 384, 504, 505, 385, 385, 505, 506, 386, 386, 506, 507, 387, 387, 507, 508, 388, 388, 508, 509, 389, 389, 509, 510, 390, 390, 510, 511, 391, 391, 511, 512, 392, 392, 512, 513, 393, 393, 513, 514, 394, 394, 514, 515, 395, 395, 515, 516, 396, 396, 516, 517, 397, 397, 517, 518, 398, 398, 518, 519, 399, 399, 519, 520, 400, 400, 520, 521, 401, 401, 521, 522, 402, 402, 522, 523, 403, 403, 523, 524, 404, 404, 524, 525, 405, 405, 525, 526, 406, 406, 526, 527, 407, 407, 527, 528, 408, 408, 528, 529, 409, 409, 529, 530, 410, 410, 530, 531, 411, 411, 531, 532, 412, 412, 532, 533, 413, 413, 533, 534, 414, 414, 534, 535, 415, 415, 535, 536, 416, 416, 536, 537, 417, 417, 537, 538, 418, 418, 538, 539, 419, 419, 539, 540, 420, 420, 540, 541, 421, 421, 541, 542, 422, 422, 542, 543, 423, 423, 543, 544, 424, 424, 544, 545, 425, 425, 545, 546, 426, 426, 546, 547, 427, 427, 547, 548, 428, 428, 548, 549, 429, 429, 549, 550, 430, 430, 550, 551, 431, 431, 551, 552, 432, 432, 552, 553, 433, 433, 553, 554, 434, 434, 554, 555, 435, 435, 555, 556, 436, 436, 556, 557, 437, 437, 557, 558, 438, 438, 558, 559, 439, 439, 559, 560, 440, 440, 560, 561, 441, 441, 561, 562, 442, 442, 562, 563, 443, 443, 563, 564, 444, 444, 564, 565, 445, 445, 565, 566, 446, 446, 566, 567, 447, 447, 567, 568, 448, 448, 568, 569, 449, 449, 569, 570, 450, 450, 570, 571, 451, 451, 571, 572, 452, 452, 572, 573, 453, 453, 573, 574, 454, 454, 574, 575, 455, 455, 575, 576, 456, 456, 576, 577, 457, 457, 577, 578, 458, 458, 578, 579, 459, 459, 579, 580, 460, 460, 580, 581, 461, 461, 581, 582, 462, 462, 582, 583, 463, 463, 583, 584, 464, 464, 584, 585, 465, 465, 585, 586, 466, 466, 586, 587, 467, 467, 587, 588, 468, 468, 588, 589, 469, 469, 589, 590, 470, 470, 590, 591, 471, 471, 591, 592, 472, 472, 592, 593, 473, 473, 593, 594, 474, 474, 594, 595, 475, 475, 595, 596, 476, 476, 596, 597, 477, 477, 597, 598, 478, 478, 598, 599, 479, 479, 599, 600, 480, 480, 600, 481, 361, 481, 601, 602, 482, 482, 602, 603, 483, 483, 603, 604, 484, 484, 604, 605, 485, 485, 605, 606, 486, 486, 606, 607, 487, 487, 607, 608, 488, 488, 608, 609, 489, 489, 609, 610, 490, 490, 610, 611, 491, 491, 611, 612, 492, 492, 612, 613, 493, 493, 613, 614, 494, 494, 614, 615, 495, 495, 615, 616, 496, 496, 616, 617, 497, 497, 617, 618, 498, 498, 618, 619, 499, 499, 619, 620, 500, 500, 620, 621, 501, 501, 621, 622, 502, 502, 622, 623, 503, 503, 623, 624, 504, 504, 624, 625, 505, 505, 625, 626, 506, 506, 626, 627, 507, 507, 627, 628, 508, 508, 628, 629, 509, 509, 629, 630, 510, 510, 630, 631, 511, 511, 631, 632, 512, 512, 632, 633, 513, 513, 633, 634, 514, 514, 634, 635, 515, 515, 635, 636, 516, 516, 636, 637, 517, 517, 637, 638, 518, 518, 638, 639, 519, 519, 639, 640, 520, 520, 640, 641, 521, 521, 641, 642, 522, 522, 642, 643, 523, 523, 643, 644, 524, 524, 644, 645, 525, 525, 645, 646, 526, 526, 646, 647, 527, 527, 647, 648, 528, 528, 648, 649, 529, 529, 649, 650, 530, 530, 650, 651, 531, 531, 651, 652, 532, 532, 652, 653, 533, 533, 653, 654, 534, 534, 654, 655, 535, 535, 655, 656, 536, 536, 656, 657, 537, 537, 657, 658, 538, 538, 658, 659, 539, 539, 659, 660, 540, 540, 660, 661, 541, 541, 661, 662, 542, 542, 662, 663, 543, 543, 663, 664, 544, 544, 664, 665, 545, 545, 665, 666, 546, 546, 666, 667, 547, 547, 667, 668, 548, 548, 668, 669, 549, 549, 669, 670, 550, 550, 670, 671, 551, 551, 671, 672, 552, 552, 672, 673, 553, 553, 673, 674, 554, 554, 674, 675, 555, 555, 675, 676, 556, 556, 676, 677, 557, 557, 677, 678, 558, 558, 678, 679, 559, 559, 679, 680, 560, 560, 680, 681, 561, 561, 681, 682, 562, 562, 682, 683, 563, 563, 683, 684, 564, 564, 684, 685, 565, 565, 685, 686, 566, 566, 686, 687, 567, 567, 687, 688, 568, 568, 688, 689, 569, 569, 689, 690, 570, 570, 690, 691, 571, 571, 691, 692, 572, 572, 692, 693, 573, 573, 693, 694, 574, 574, 694, 695, 575, 575, 695, 696, 576, 576, 696, 697, 577, 577, 697, 698, 578, 578, 698, 699, 579, 579, 699, 700, 580, 580, 700, 701, 581, 581, 701, 702, 582, 582, 702, 703, 583, 583, 703, 704, 584, 584, 704, 705, 585, 585, 705, 706, 586, 586, 706, 707, 587, 587, 707, 708, 588, 588, 708, 709, 589, 589, 709, 710, 590, 590, 710, 711, 591, 591, 711, 712, 592, 592, 712, 713, 593, 593, 713, 714, 594, 594, 714, 715, 595, 595, 715, 716, 596, 596, 716, 717, 597, 597, 717, 718, 598, 598, 718, 719, 599, 599, 719, 720, 600, 600, 720, 601, 481, 601, 721, 722, 602, 602, 722, 723, 603, 603, 723, 724, 604, 604, 724, 725, 605, 605, 725, 726, 606, 606, 726, 727, 607, 607, 727, 728, 608, 608, 728, 729, 609, 609, 729, 730, 610, 610, 730, 731, 611, 611, 731, 732, 612, 612, 732, 733, 613, 613, 733, 734, 614, 614, 734, 735, 615, 615, 735, 736, 616, 616, 736, 737, 617, 617, 737, 738, 618, 618, 738, 739, 619, 619, 739, 740, 620, 620, 740, 741, 621, 621, 741, 742, 622, 622, 742, 743, 623, 623, 743, 744, 624, 624, 744, 745, 625, 625, 745, 746, 626, 626, 746, 747, 627, 627, 747, 748, 628, 628, 748, 749, 629, 629, 749, 750, 630, 630, 750, 751, 631, 631, 751, 752, 632, 632, 752, 753, 633, 633, 753, 754, 634, 634, 754, 755, 635, 635, 755, 756, 636, 636, 756, 757, 637, 637, 757, 758, 638, 638, 758, 759, 639, 639, 759, 760, 640, 640, 760, 761, 641, 641, 761, 762, 642, 642, 762, 763, 643, 643, 763, 764, 644, 644, 764, 765, 645, 645, 765, 766, 646, 646, 766, 767, 647, 647, 767, 768, 648, 648, 768, 769, 649, 649, 769, 770, 650, 650, 770, 771, 651, 651, 771, 772, 652, 652, 772, 773, 653, 653, 773, 774, 654, 654, 774, 775, 655, 655, 775, 776, 656, 656, 776, 777, 657, 657, 777, 778, 658, 658, 778, 779, 659, 659, 779, 780, 660, 660, 780, 781, 661, 661, 781, 782, 662, 662, 782, 783, 663, 663, 783, 784, 664, 664, 784, 785, 665, 665, 785, 786, 666, 666, 786, 787, 667, 667, 787, 788, 668, 668, 788, 789, 669, 669, 789, 790, 670, 670, 790, 791, 671, 671, 791, 792, 672, 672, 792, 793, 673, 673, 793, 794, 674, 674, 794, 795, 675, 675, 795, 796, 676, 676, 796, 797, 677, 677, 797, 798, 678, 678, 798, 799, 679, 679, 799, 800, 680, 680, 800, 801, 681, 681, 801, 802, 682, 682, 802, 803, 683, 683, 803, 804, 684, 684, 804, 805, 685, 685, 805, 806, 686, 686, 806, 807, 687, 687, 807, 808, 688, 688, 808, 809, 689, 689, 809, 810, 690, 690, 810, 811, 691, 691, 811, 812, 692, 692, 812, 813, 693, 693, 813, 814, 694, 694, 814, 815, 695, 695, 815, 816, 696, 696, 816, 817, 697, 697, 817, 818, 698, 698, 818, 819, 699, 699, 819, 820, 700, 700, 820, 821, 701, 701, 821, 822, 702, 702, 822, 823, 703, 703, 823, 824, 704, 704, 824, 825, 705, 705, 825, 826, 706, 706, 826, 827, 707, 707, 827, 828, 708, 708, 828, 829, 709, 709, 829, 830, 710, 710, 830, 831, 711, 711, 831, 832, 712, 712, 832, 833, 713, 713, 833, 834, 714, 714, 834, 835, 715, 715, 835, 836, 716, 716, 836, 837, 717, 717, 837, 838, 718, 718, 838, 839, 719, 719, 839, 840, 720, 720, 840, 721, 601, 721, 841, 842, 722, 722, 842, 843, 723, 723, 843, 844, 724, 724, 844, 845, 725, 725, 845, 846, 726, 726, 846, 847, 727, 727, 847, 848, 728, 728, 848, 849, 729, 729, 849, 850, 730, 730, 850, 851, 731, 731, 851, 852, 732, 732, 852, 853, 733, 733, 853, 854, 734, 734, 854, 855, 735, 735, 855, 856, 736, 736, 856, 857, 737, 737, 857, 858, 738, 738, 858, 859, 739, 739, 859, 860, 740, 740, 860, 861, 741, 741, 861, 862, 742, 742, 862, 863, 743, 743, 863, 864, 744, 744, 864, 865, 745, 745, 865, 866, 746, 746, 866, 867, 747, 747, 867, 868, 748, 748, 868, 869, 749, 749, 869, 870, 750, 750, 870, 871, 751, 751, 871, 872, 752, 752, 872, 873, 753, 753, 873, 874, 754, 754, 874, 875, 755, 755, 875, 876, 756, 756, 876, 877, 757, 757, 877, 878, 758, 758, 878, 879, 759, 759, 879, 880, 760, 760, 880, 881, 761, 761, 881, 882, 762, 762, 882, 883, 763, 763, 883, 884, 764, 764, 884, 885, 765, 765, 885, 886, 766, 766, 886, 887, 767, 767, 887, 888, 768, 768, 888, 889, 769, 769, 889, 890, 770, 770, 890, 891, 771, 771, 891, 892, 772, 772, 892, 893, 773, 773, 893, 894, 774, 774, 894, 895, 775, 775, 895, 896, 776, 776, 896, 897, 777, 777, 897, 898, 778, 778, 898, 899, 779, 779, 899, 900, 780, 780, 900, 901, 781, 781, 901, 902, 782, 782, 902, 903, 783, 783, 903, 904, 784, 784, 904, 905, 785, 785, 905, 906, 786, 786, 906, 907, 787, 787, 907, 908, 788, 788, 908, 909, 789, 789, 909, 910, 790, 790, 910, 911, 791, 791, 911, 912, 792, 792, 912, 913, 793, 793, 913, 914, 794, 794, 914, 915, 795, 795, 915, 916, 796, 796, 916, 917, 797, 797, 917, 918, 798, 798, 918, 919, 799, 799, 919, 920, 800, 800, 920, 921, 801, 801, 921, 922, 802, 802, 922, 923, 803, 803, 923, 924, 804, 804, 924, 925, 805, 805, 925, 926, 806, 806, 926, 927, 807, 807, 927, 928, 808, 808, 928, 929, 809, 809, 929, 930, 810, 810, 930, 931, 811, 811, 931, 932, 812, 812, 932, 933, 813, 813, 933, 934, 814, 814, 934, 935, 815, 815, 935, 936, 816, 816, 936, 937, 817, 817, 937, 938, 818, 818, 938, 939, 819, 819, 939, 940, 820, 820, 940, 941, 821, 821, 941, 942, 822, 822, 942, 943, 823, 823, 943, 944, 824, 824, 944, 945, 825, 825, 945, 946, 826, 826, 946, 947, 827, 827, 947, 948, 828, 828, 948, 949, 829, 829, 949, 950, 830, 830, 950, 951, 831, 831, 951, 952, 832, 832, 952, 953, 833, 833, 953, 954, 834, 834, 954, 955, 835, 835, 955, 956, 836, 836, 956, 957, 837, 837, 957, 958, 838, 838, 958, 959, 839, 839, 959, 960, 840, 840, 960, 841, 721, 841, 961, 962, 842, 842, 962, 963, 843, 843, 963, 964, 844, 844, 964, 965, 845, 845, 965, 966, 846, 846, 966, 967, 847, 847, 967, 968, 848, 848, 968, 969, 849, 849, 969, 970, 850, 850, 970, 971, 851, 851, 971, 972, 852, 852, 972, 973, 853, 853, 973, 974, 854, 854, 974, 975, 855, 855, 975, 976, 856, 856, 976, 977, 857, 857, 977, 978, 858, 858, 978, 979, 859, 859, 979, 980, 860, 860, 980, 981, 861, 861, 981, 982, 862, 862, 982, 983, 863, 863, 983, 984, 864, 864, 984, 985, 865, 865, 985, 986, 866, 866, 986, 987, 867, 867, 987, 988, 868, 868, 988, 989, 869, 869, 989, 990, 870, 870, 990, 991, 871, 871, 991, 992, 872, 872, 992, 993, 873, 873, 993, 994, 874, 874, 994, 995, 875, 875, 995, 996, 876, 876, 996, 997, 877, 877, 997, 998, 878, 878, 998, 999, 879, 879, 999, 1000, 880, 880, 1000, 1001, 881, 881, 1001, 1002, 882, 882, 1002, 1003, 883, 883, 1003, 1004, 884, 884, 1004, 1005, 885, 885, 1005, 1006, 886, 886, 1006, 1007, 887, 887, 1007, 1008, 888, 888, 1008, 1009, 889, 889, 1009, 1010, 890, 890, 1010, 1011, 891, 891, 1011, 1012, 892, 892, 1012, 1013, 893, 893, 1013, 1014, 894, 894, 1014, 1015, 895, 895, 1015, 1016, 896, 896, 1016, 1017, 897, 897, 1017, 1018, 898, 898, 1018, 1019, 899, 899, 1019, 1020, 900, 900, 1020, 1021, 901, 901, 1021, 1022, 902, 902, 1022, 1023, 903, 903, 1023, 1024, 904, 904, 1024, 1025, 905, 905, 1025, 1026, 906, 906, 1026, 1027, 907, 907, 1027, 1028, 908, 908, 1028, 1029, 909, 909, 1029, 1030, 910, 910, 1030, 1031, 911, 911, 1031, 1032, 912, 912, 1032, 1033, 913, 913, 1033, 1034, 914, 914, 1034, 1035, 915, 915, 1035, 1036, 916, 916, 1036, 1037, 917, 917, 1037, 1038, 918, 918, 1038, 1039, 919, 919, 1039, 1040, 920, 920, 1040, 1041, 921, 921, 1041, 1042, 922, 922, 1042, 1043, 923, 923, 1043, 1044, 924, 924, 1044, 1045, 925, 925, 1045, 1046, 926, 926, 1046, 1047, 927, 927, 1047, 1048, 928, 928, 1048, 1049, 929, 929, 1049, 1050, 930, 930, 1050, 1051, 931, 931, 1051, 1052, 932, 932, 1052, 1053, 933, 933, 1053, 1054, 934, 934, 1054, 1055, 935, 935, 1055, 1056, 936, 936, 1056, 1057, 937, 937, 1057, 1058, 938, 938, 1058, 1059, 939, 939, 1059, 1060, 940, 940, 1060, 1061, 941, 941, 1061, 1062, 942, 942, 1062, 1063, 943, 943, 1063, 1064, 944, 944, 1064, 1065, 945, 945, 1065, 1066, 946, 946, 1066, 1067, 947, 947, 1067, 1068, 948, 948, 1068, 1069, 949, 949, 1069, 1070, 950, 950, 1070, 1071, 951, 951, 1071, 1072, 952, 952, 1072, 1073, 953, 953, 1073, 1074, 954, 954, 1074, 1075, 955, 955, 1075, 1076, 956, 956, 1076, 1077, 957, 957, 1077, 1078, 958, 958, 1078, 1079, 959, 959, 1079, 1080, 960, 960, 1080, 961, 841, 961, 1081, 1082, 962, 962, 1082, 1083, 963, 963, 1083, 1084, 964, 964, 1084, 1085, 965, 965, 1085, 1086, 966, 966, 1086, 1087, 967, 967, 1087, 1088, 968, 968, 1088, 1089, 969, 969, 1089, 1090, 970, 970, 1090, 1091, 971, 971, 1091, 1092, 972, 972, 1092, 1093, 973, 973, 1093, 1094, 974, 974, 1094, 1095, 975, 975, 1095, 1096, 976, 976, 1096, 1097, 977, 977, 1097, 1098, 978, 978, 1098, 1099, 979, 979, 1099, 1100, 980, 980, 1100, 1101, 981, 981, 1101, 1102, 982, 982, 1102, 1103, 983, 983, 1103, 1104, 984, 984, 1104, 1105, 985, 985, 1105, 1106, 986, 986, 1106, 1107, 987, 987, 1107, 1108, 988, 988, 1108, 1109, 989, 989, 1109, 1110, 990, 990, 1110, 1111, 991, 991, 1111, 1112, 992, 992, 1112, 1113, 993, 993, 1113, 1114, 994, 994, 1114, 1115, 995, 995, 1115, 1116, 996, 996, 1116, 1117, 997, 997, 1117, 1118, 998, 998, 1118, 1119, 999, 999, 1119, 1120, 1000, 1000, 1120, 1121, 1001, 1001, 1121, 1122, 1002, 1002, 1122, 1123, 1003, 1003, 1123, 1124, 1004, 1004, 1124, 1125, 1005, 1005, 1125, 1126, 1006, 1006, 1126, 1127, 1007, 1007, 1127, 1128, 1008, 1008, 1128, 1129, 1009, 1009, 1129, 1130, 1010, 1010, 1130, 1131, 1011, 1011, 1131, 1132, 1012, 1012, 1132, 1133, 1013, 1013, 1133, 1134, 1014, 1014, 1134, 1135, 1015, 1015, 1135, 1136, 1016, 1016, 1136, 1137, 1017, 1017, 1137, 1138, 1018, 1018, 1138, 1139, 1019, 1019, 1139, 1140, 1020, 1020, 1140, 1141, 1021, 1021, 1141, 1142, 1022, 1022, 1142, 1143, 1023, 1023, 1143, 1144, 1024, 1024, 1144, 1145, 1025, 1025, 1145, 1146, 1026, 1026, 1146, 1147, 1027, 1027, 1147, 1148, 1028, 1028, 1148, 1149, 1029, 1029, 1149, 1150, 1030, 1030, 1150, 1151, 1031, 1031, 1151, 1152, 1032, 1032, 1152, 1153, 1033, 1033, 1153, 1154, 1034, 1034, 1154, 1155, 1035, 1035, 1155, 1156, 1036, 1036, 1156, 1157, 1037, 1037, 1157, 1158, 1038, 1038, 1158, 1159, 1039, 1039, 1159, 1160, 1040, 1040, 1160, 1161, 1041, 1041, 1161, 1162, 1042, 1042, 1162, 1163, 1043, 1043, 1163, 1164, 1044, 1044, 1164, 1165, 1045, 1045, 1165, 1166, 1046, 1046, 1166, 1167, 1047, 1047, 1167, 1168, 1048, 1048, 1168, 1169, 1049, 1049, 1169, 1170, 1050, 1050, 1170, 1171, 1051, 1051, 1171, 1172, 1052, 1052, 1172, 1173, 1053, 1053, 1173, 1174, 1054, 1054, 1174, 1175, 1055, 1055, 1175, 1176, 1056, 1056, 1176, 1177, 1057, 1057, 1177, 1178, 1058, 1058, 1178, 1179, 1059, 1059, 1179, 1180, 1060, 1060, 1180, 1181, 1061, 1061, 1181, 1182, 1062, 1062, 1182, 1183, 1063, 1063, 1183, 1184, 1064, 1064, 1184, 1185, 1065, 1065, 1185, 1186, 1066, 1066, 1186, 1187, 1067, 1067, 1187, 1188, 1068, 1068, 1188, 1189, 1069, 1069, 1189, 1190, 1070, 1070, 1190, 1191, 1071, 1071, 1191, 1192, 1072, 1072, 1192, 1193, 1073, 1073, 1193, 1194, 1074, 1074, 1194, 1195, 1075, 1075, 1195, 1196, 1076, 1076, 1196, 1197, 1077, 1077, 1197, 1198, 1078, 1078, 1198, 1199, 1079, 1079, 1199, 1200, 1080, 1080, 1200, 1081, 961, 1081, 1201, 1202, 1082, 1082, 1202, 1203, 1083, 1083, 1203, 1204, 1084, 1084, 1204, 1205, 1085, 1085, 1205, 1206, 1086, 1086, 1206, 1207, 1087, 1087, 1207, 1208, 1088, 1088, 1208, 1209, 1089, 1089, 1209, 1210, 1090, 1090, 1210, 1211, 1091, 1091, 1211, 1212, 1092, 1092, 1212, 1213, 1093, 1093, 1213, 1214, 1094, 1094, 1214, 1215, 1095, 1095, 1215, 1216, 1096, 1096, 1216, 1217, 1097, 1097, 1217, 1218, 1098, 1098, 1218, 1219, 1099, 1099, 1219, 1220, 1100, 1100, 1220, 1221, 1101, 1101, 1221, 1222, 1102, 1102, 1222, 1223, 1103, 1103, 1223, 1224, 1104, 1104, 1224, 1225, 1105, 1105, 1225, 1226, 1106, 1106, 1226, 1227, 1107, 1107, 1227, 1228, 1108, 1108, 1228, 1229, 1109, 1109, 1229, 1230, 1110, 1110, 1230, 1231, 1111, 1111, 1231, 1232, 1112, 1112, 1232, 1233, 1113, 1113, 1233, 1234, 1114, 1114, 1234, 1235, 1115, 1115, 1235, 1236, 1116, 1116, 1236, 1237, 1117, 1117, 1237, 1238, 1118, 1118, 1238, 1239, 1119, 1119, 1239, 1240, 1120, 1120, 1240, 1241, 1121, 1121, 1241, 1242, 1122, 1122, 1242, 1243, 1123, 1123, 1243, 1244, 1124, 1124, 1244, 1245, 1125, 1125, 1245, 1246, 1126, 1126, 1246, 1247, 1127, 1127, 1247, 1248, 1128, 1128, 1248, 1249, 1129, 1129, 1249, 1250, 1130, 1130, 1250, 1251, 1131, 1131, 1251, 1252, 1132, 1132, 1252, 1253, 1133, 1133, 1253, 1254, 1134, 1134, 1254, 1255, 1135, 1135, 1255, 1256, 1136, 1136, 1256, 1257, 1137, 1137, 1257, 1258, 1138, 1138, 1258, 1259, 1139, 1139, 1259, 1260, 1140, 1140, 1260, 1261, 1141, 1141, 1261, 1262, 1142, 1142, 1262, 1263, 1143, 1143, 1263, 1264, 1144, 1144, 1264, 1265, 1145, 1145, 1265, 1266, 1146, 1146, 1266, 1267, 1147, 1147, 1267, 1268, 1148, 1148, 1268, 1269, 1149, 1149, 1269, 1270, 1150, 1150, 1270, 1271, 1151, 1151, 1271, 1272, 1152, 1152, 1272, 1273, 1153, 1153, 1273, 1274, 1154, 1154, 1274, 1275, 1155, 1155, 1275, 1276, 1156, 1156, 1276, 1277, 1157, 1157, 1277, 1278, 1158, 1158, 1278, 1279, 1159, 1159, 1279, 1280, 1160, 1160, 1280, 1281, 1161, 1161, 1281, 1282, 1162, 1162, 1282, 1283, 1163, 1163, 1283, 1284, 1164, 1164, 1284, 1285, 1165, 1165, 1285, 1286, 1166, 1166, 1286, 1287, 1167, 1167, 1287, 1288, 1168, 1168, 1288, 1289, 1169, 1169, 1289, 1290, 1170, 1170, 1290, 1291, 1171, 1171, 1291, 1292, 1172, 1172, 1292, 1293, 1173, 1173, 1293, 1294, 1174, 1174, 1294, 1295, 1175, 1175, 1295, 1296, 1176, 1176, 1296, 1297, 1177, 1177, 1297, 1298, 1178, 1178, 1298, 1299, 1179, 1179, 1299, 1300, 1180, 1180, 1300, 1301, 1181, 1181, 1301, 1302, 1182, 1182, 1302, 1303, 1183, 1183, 1303, 1304, 1184, 1184, 1304, 1305, 1185, 1185, 1305, 1306, 1186, 1186, 1306, 1307, 1187, 1187, 1307, 1308, 1188, 1188, 1308, 1309, 1189, 1189, 1309, 1310, 1190, 1190, 1310, 1311, 1191, 1191, 1311, 1312, 1192, 1192, 1312, 1313, 1193, 1193, 1313, 1314, 1194, 1194, 1314, 1315, 1195, 1195, 1315, 1316, 1196, 1196, 1316, 1317, 1197, 1197, 1317, 1318, 1198, 1198, 1318, 1319, 1199, 1199, 1319, 1320, 1200, 1200, 1320, 1201, 1081, 1201, 1321, 1322, 1202, 1202, 1322, 1323, 1203, 1203, 1323, 1324, 1204, 1204, 1324, 1325, 1205, 1205, 1325, 1326, 1206, 1206, 1326, 1327, 1207, 1207, 1327, 1328, 1208, 1208, 1328, 1329, 1209, 1209, 1329, 1330, 1210, 1210, 1330, 1331, 1211, 1211, 1331, 1332, 1212, 1212, 1332, 1333, 1213, 1213, 1333, 1334, 1214, 1214, 1334, 1335, 1215, 1215, 1335, 1336, 1216, 1216, 1336, 1337, 1217, 1217, 1337, 1338, 1218, 1218, 1338, 1339, 1219, 1219, 1339, 1340, 1220, 1220, 1340, 1341, 1221, 1221, 1341, 1342, 1222, 1222, 1342, 1343, 1223, 1223, 1343, 1344, 1224, 1224, 1344, 1345, 1225, 1225, 1345, 1346, 1226, 1226, 1346, 1347, 1227, 1227, 1347, 1348, 1228, 1228, 1348, 1349, 1229, 1229, 1349, 1350, 1230, 1230, 1350, 1351, 1231, 1231, 1351, 1352, 1232, 1232, 1352, 1353, 1233, 1233, 1353, 1354, 1234, 1234, 1354, 1355, 1235, 1235, 1355, 1356, 1236, 1236, 1356, 1357, 1237, 1237, 1357, 1358, 1238, 1238, 1358, 1359, 1239, 1239, 1359, 1360, 1240, 1240, 1360, 1361, 1241, 1241, 1361, 1362, 1242, 1242, 1362, 1363, 1243, 1243, 1363, 1364, 1244, 1244, 1364, 1365, 1245, 1245, 1365, 1366, 1246, 1246, 1366, 1367, 1247, 1247, 1367, 1368, 1248, 1248, 1368, 1369, 1249, 1249, 1369, 1370, 1250, 1250, 1370, 1371, 1251, 1251, 1371, 1372, 1252, 1252, 1372, 1373, 1253, 1253, 1373, 1374, 1254, 1254, 1374, 1375, 1255, 1255, 1375, 1376, 1256, 1256, 1376, 1377, 1257, 1257, 1377, 1378, 1258, 1258, 1378, 1379, 1259, 1259, 1379, 1380, 1260, 1260, 1380, 1381, 1261, 1261, 1381, 1382, 1262, 1262, 1382, 1383, 1263, 1263, 1383, 1384, 1264, 1264, 1384, 1385, 1265, 1265, 1385, 1386, 1266, 1266, 1386, 1387, 1267, 1267, 1387, 1388, 1268, 1268, 1388, 1389, 1269, 1269, 1389, 1390, 1270, 1270, 1390, 1391, 1271, 1271, 1391, 1392, 1272, 1272, 1392, 1393, 1273, 1273, 1393, 1394, 1274, 1274, 1394, 1395, 1275, 1275, 1395, 1396, 1276, 1276, 1396, 1397, 1277, 1277, 1397, 1398, 1278, 1278, 1398, 1399, 1279, 1279, 1399, 1400, 1280, 1280, 1400, 1401, 1281, 1281, 1401, 1402, 1282, 1282, 1402, 1403, 1283, 1283, 1403, 1404, 1284, 1284, 1404, 1405, 1285, 1285, 1405, 1406, 1286, 1286, 1406, 1407, 1287, 1287, 1407, 1408, 1288, 1288, 1408, 1409, 1289, 1289, 1409, 1410, 1290, 1290, 1410, 1411, 1291, 1291, 1411, 1412, 1292, 1292, 1412, 1413, 1293, 1293, 1413, 1414, 1294, 1294, 1414, 1415, 1295, 1295, 1415, 1416, 1296, 1296, 1416, 1417, 1297, 1297, 1417, 1418, 1298, 1298, 1418, 1419, 1299, 1299, 1419, 1420, 1300, 1300, 1420, 1421, 1301, 1301, 1421, 1422, 1302, 1302, 1422, 1423, 1303, 1303, 1423, 1424, 1304, 1304, 1424, 1425, 1305, 1305, 1425, 1426, 1306, 1306, 1426, 1427, 1307, 1307, 1427, 1428, 1308, 1308, 1428, 1429, 1309, 1309, 1429, 1430, 1310, 1310, 1430, 1431, 1311, 1311, 1431, 1432, 1312, 1312, 1432, 1433, 1313, 1313, 1433, 1434, 1314, 1314, 1434, 1435, 1315, 1315, 1435, 1436, 1316, 1316, 1436, 1437, 1317, 1317, 1437, 1438, 1318, 1318, 1438, 1439, 1319, 1319, 1439, 1440, 1320, 1320, 1440, 1321, 1201, 1321, 1441, 1442, 1322, 1322, 1442, 1443, 1323, 1323, 1443, 1444, 1324, 1324, 1444, 1445, 1325, 1325, 1445, 1446, 1326, 1326, 1446, 1447, 1327, 1327, 1447, 1448, 1328, 1328, 1448, 1449, 1329, 1329, 1449, 1450, 1330, 1330, 1450, 1451, 1331, 1331, 1451, 1452, 1332, 1332, 1452, 1453, 1333, 1333, 1453, 1454, 1334, 1334, 1454, 1455, 1335, 1335, 1455, 1456, 1336, 1336, 1456, 1457, 1337, 1337, 1457, 1458, 1338, 1338, 1458, 1459, 1339, 1339, 1459, 1460, 1340, 1340, 1460, 1461, 1341, 1341, 1461, 1462, 1342, 1342, 1462, 1463, 1343, 1343, 1463, 1464, 1344, 1344, 1464, 1465, 1345, 1345, 1465, 1466, 1346, 1346, 1466, 1467, 1347, 1347, 1467, 1468, 1348, 1348, 1468, 1469, 1349, 1349, 1469, 1470, 1350, 1350, 1470, 1471, 1351, 1351, 1471, 1472, 1352, 1352, 1472, 1473, 1353, 1353, 1473, 1474, 1354, 1354, 1474, 1475, 1355, 1355, 1475, 1476, 1356, 1356, 1476, 1477, 1357, 1357, 1477, 1478, 1358, 1358, 1478, 1479, 1359, 1359, 1479, 1480, 1360, 1360, 1480, 1481, 1361, 1361, 1481, 1482, 1362, 1362, 1482, 1483, 1363, 1363, 1483, 1484, 1364, 1364, 1484, 1485, 1365, 1365, 1485, 1486, 1366, 1366, 1486, 1487, 1367, 1367, 1487, 1488, 1368, 1368, 1488, 1489, 1369, 1369, 1489, 1490, 1370, 1370, 1490, 1491, 1371, 1371, 1491, 1492, 1372, 1372, 1492, 1493, 1373, 1373, 1493, 1494, 1374, 1374, 1494, 1495, 1375, 1375, 1495, 1496, 1376, 1376, 1496, 1497, 1377, 1377, 1497, 1498, 1378, 1378, 1498, 1499, 1379, 1379, 1499, 1500, 1380, 1380, 1500, 1501, 1381, 1381, 1501, 1502, 1382, 1382, 1502, 1503, 1383, 1383, 1503, 1504, 1384, 1384, 1504, 1505, 1385, 1385, 1505, 1506, 1386, 1386, 1506, 1507, 1387, 1387, 1507, 1508, 1388, 1388, 1508, 1509, 1389, 1389, 1509, 1510, 1390, 1390, 1510, 1511, 1391, 1391, 1511, 1512, 1392, 1392, 1512, 1513, 1393, 1393, 1513, 1514, 1394, 1394, 1514, 1515, 1395, 1395, 1515, 1516, 1396, 1396, 1516, 1517, 1397, 1397, 1517, 1518, 1398, 1398, 1518, 1519, 1399, 1399, 1519, 1520, 1400, 1400, 1520, 1521, 1401, 1401, 1521, 1522, 1402, 1402, 1522, 1523, 1403, 1403, 1523, 1524, 1404, 1404, 1524, 1525, 1405, 1405, 1525, 1526, 1406, 1406, 1526, 1527, 1407, 1407, 1527, 1528, 1408, 1408, 1528, 1529, 1409, 1409, 1529, 1530, 1410, 1410, 1530, 1531, 1411, 1411, 1531, 1532, 1412, 1412, 1532, 1533, 1413, 1413, 1533, 1534, 1414, 1414, 1534, 1535, 1415, 1415, 1535, 1536, 1416, 1416, 1536, 1537, 1417, 1417, 1537, 1538, 1418, 1418, 1538, 1539, 1419, 1419, 1539, 1540, 1420, 1420, 1540, 1541, 1421, 1421, 1541, 1542, 1422, 1422, 1542, 1543, 1423, 1423, 1543, 1544, 1424, 1424, 1544, 1545, 1425, 1425, 1545, 1546, 1426, 1426, 1546, 1547, 1427, 1427, 1547, 1548, 1428, 1428, 1548, 1549, 1429, 1429, 1549, 1550, 1430, 1430, 1550, 1551, 1431, 1431, 1551, 1552, 1432, 1432, 1552, 1553, 1433, 1433, 1553, 1554, 1434, 1434, 1554, 1555, 1435, 1435, 1555, 1556, 1436, 1436, 1556, 1557, 1437, 1437, 1557, 1558, 1438, 1438, 1558, 1559, 1439, 1439, 1559, 1560, 1440, 1440, 1560, 1441, 1321, 1441, 1561, 1562, 1442, 1442, 1562, 1563, 1443, 1443, 1563, 1564, 1444, 1444, 1564, 1565, 1445, 1445, 1565, 1566, 1446, 1446, 1566, 1567, 1447, 1447, 1567, 1568, 1448, 1448, 1568, 1569, 1449, 1449, 1569, 1570, 1450, 1450, 1570, 1571, 1451, 1451, 1571, 1572, 1452, 1452, 1572, 1573, 1453, 1453, 1573, 1574, 1454, 1454, 1574, 1575, 1455, 1455, 1575, 1576, 1456, 1456, 1576, 1577, 1457, 1457, 1577, 1578, 1458, 1458, 1578, 1579, 1459, 1459, 1579, 1580, 1460, 1460, 1580, 1581, 1461, 1461, 1581, 1582, 1462, 1462, 1582, 1583, 1463, 1463, 1583, 1584, 1464, 1464, 1584, 1585, 1465, 1465, 1585, 1586, 1466, 1466, 1586, 1587, 1467, 1467, 1587, 1588, 1468, 1468, 1588, 1589, 1469, 1469, 1589, 1590, 1470, 1470, 1590, 1591, 1471, 1471, 1591, 1592, 1472, 1472, 1592, 1593, 1473, 1473, 1593, 1594, 1474, 1474, 1594, 1595, 1475, 1475, 1595, 1596, 1476, 1476, 1596, 1597, 1477, 1477, 1597, 1598, 1478, 1478, 1598, 1599, 1479, 1479, 1599, 1600, 1480, 1480, 1600, 1601, 1481, 1481, 1601, 1602, 1482, 1482, 1602, 1603, 1483, 1483, 1603, 1604, 1484, 1484, 1604, 1605, 1485, 1485, 1605, 1606, 1486, 1486, 1606, 1607, 1487, 1487, 1607, 1608, 1488, 1488, 1608, 1609, 1489, 1489, 1609, 1610, 1490, 1490, 1610, 1611, 1491, 1491, 1611, 1612, 1492, 1492, 1612, 1613, 1493, 1493, 1613, 1614, 1494, 1494, 1614, 1615, 1495, 1495, 1615, 1616, 1496, 1496, 1616, 1617, 1497, 1497, 1617, 1618, 1498, 1498, 1618, 1619, 1499, 1499, 1619, 1620, 1500, 1500, 1620, 1621, 1501, 1501, 1621, 1622, 1502, 1502, 1622, 1623, 1503, 1503, 1623, 1624, 1504, 1504, 1624, 1625, 1505, 1505, 1625, 1626, 1506, 1506, 1626, 1627, 1507, 1507, 1627, 1628, 1508, 1508, 1628, 1629, 1509, 1509, 1629, 1630, 1510, 1510, 1630, 1631, 1511, 1511, 1631, 1632, 1512, 1512, 1632, 1633, 1513, 1513, 1633, 1634, 1514, 1514, 1634, 1635, 1515, 1515, 1635, 1636, 1516, 1516, 1636, 1637, 1517, 1517, 1637, 1638, 1518, 1518, 1638, 1639, 1519, 1519, 1639, 1640, 1520, 1520, 1640, 1641, 1521, 1521, 1641, 1642, 1522, 1522, 1642, 1643, 1523, 1523, 1643, 1644, 1524, 1524, 1644, 1645, 1525, 1525, 1645, 1646, 1526, 1526, 1646, 1647, 1527, 1527, 1647, 1648, 1528, 1528, 1648, 1649, 1529, 1529, 1649, 1650, 1530, 1530, 1650, 1651, 1531, 1531, 1651, 1652, 1532, 1532, 1652, 1653, 1533, 1533, 1653, 1654, 1534, 1534, 1654, 1655, 1535, 1535, 1655, 1656, 1536, 1536, 1656, 1657, 1537, 1537, 1657, 1658, 1538, 1538, 1658, 1659, 1539, 1539, 1659, 1660, 1540, 1540, 1660, 1661, 1541, 1541, 1661, 1662, 1542, 1542, 1662, 1663, 1543, 1543, 1663, 1664, 1544, 1544, 1664, 1665, 1545, 1545, 1665, 1666, 1546, 1546, 1666, 1667, 1547, 1547, 1667, 1668, 1548, 1548, 1668, 1669, 1549, 1549, 1669, 1670, 1550, 1550, 1670, 1671, 1551, 1551, 1671, 1672, 1552, 1552, 1672, 1673, 1553, 1553, 1673, 1674, 1554, 1554, 1674, 1675, 1555, 1555, 1675, 1676, 1556, 1556, 1676, 1677, 1557, 1557, 1677, 1678, 1558, 1558, 1678, 1679, 1559, 1559, 1679, 1680, 1560, 1560, 1680, 1561, 1441, 1561, 1681, 1682, 1562, 1562, 1682, 1683, 1563, 1563, 1683, 1684, 1564, 1564, 1684, 1685, 1565, 1565, 1685, 1686, 1566, 1566, 1686, 1687, 1567, 1567, 1687, 1688, 1568, 1568, 1688, 1689, 1569, 1569, 1689, 1690, 1570, 1570, 1690, 1691, 1571, 1571, 1691, 1692, 1572, 1572, 1692, 1693, 1573, 1573, 1693, 1694, 1574, 1574, 1694, 1695, 1575, 1575, 1695, 1696, 1576, 1576, 1696, 1697, 1577, 1577, 1697, 1698, 1578, 1578, 1698, 1699, 1579, 1579, 1699, 1700, 1580, 1580, 1700, 1701, 1581, 1581, 1701, 1702, 1582, 1582, 1702, 1703, 1583, 1583, 1703, 1704, 1584, 1584, 1704, 1705, 1585, 1585, 1705, 1706, 1586, 1586, 1706, 1707, 1587, 1587, 1707, 1708, 1588, 1588, 1708, 1709, 1589, 1589, 1709, 1710, 1590, 1590, 1710, 1711, 1591, 1591, 1711, 1712, 1592, 1592, 1712, 1713, 1593, 1593, 1713, 1714, 1594, 1594, 1714, 1715, 1595, 1595, 1715, 1716, 1596, 1596, 1716, 1717, 1597, 1597, 1717, 1718, 1598, 1598, 1718, 1719, 1599, 1599, 1719, 1720, 1600, 1600, 1720, 1721, 1601, 1601, 1721, 1722, 1602, 1602, 1722, 1723, 1603, 1603, 1723, 1724, 1604, 1604, 1724, 1725, 1605, 1605, 1725, 1726, 1606, 1606, 1726, 1727, 1607, 1607, 1727, 1728, 1608, 1608, 1728, 1729, 1609, 1609, 1729, 1730, 1610, 1610, 1730, 1731, 1611, 1611, 1731, 1732, 1612, 1612, 1732, 1733, 1613, 1613, 1733, 1734, 1614, 1614, 1734, 1735, 1615, 1615, 1735, 1736, 1616, 1616, 1736, 1737, 1617, 1617, 1737, 1738, 1618, 1618, 1738, 1739, 1619, 1619, 1739, 1740, 1620, 1620, 1740, 1741, 1621, 1621, 1741, 1742, 1622, 1622, 1742, 1743, 1623, 1623, 1743, 1744, 1624, 1624, 1744, 1745, 1625, 1625, 1745, 1746, 1626, 1626, 1746, 1747, 1627, 1627, 1747, 1748, 1628, 1628, 1748, 1749, 1629, 1629, 1749, 1750, 1630, 1630, 1750, 1751, 1631, 1631, 1751, 1752, 1632, 1632, 1752, 1753, 1633, 1633, 1753, 1754, 1634, 1634, 1754, 1755, 1635, 1635, 1755, 1756, 1636, 1636, 1756, 1757, 1637, 1637, 1757, 1758, 1638, 1638, 1758, 1759, 1639, 1639, 1759, 1760, 1640, 1640, 1760, 1761, 1641, 1641, 1761, 1762, 1642, 1642, 1762, 1763, 1643, 1643, 1763, 1764, 1644, 1644, 1764, 1765, 1645, 1645, 1765, 1766, 1646, 1646, 1766, 1767, 1647, 1647, 1767, 1768, 1648, 1648, 1768, 1769, 1649, 1649, 1769, 1770, 1650, 1650, 1770, 1771, 1651, 1651, 1771, 1772, 1652, 1652, 1772, 1773, 1653, 1653, 1773, 1774, 1654, 1654, 1774, 1775, 1655, 1655, 1775, 1776, 1656, 1656, 1776, 1777, 1657, 1657, 1777, 1778, 1658, 1658, 1778, 1779, 1659, 1659, 1779, 1780, 1660, 1660, 1780, 1781, 1661, 1661, 1781, 1782, 1662, 1662, 1782, 1783, 1663, 1663, 1783, 1784, 1664, 1664, 1784, 1785, 1665, 1665, 1785, 1786, 1666, 1666, 1786, 1787, 1667, 1667, 1787, 1788, 1668, 1668, 1788, 1789, 1669, 1669, 1789, 1790, 1670, 1670, 1790, 1791, 1671, 1671, 1791, 1792, 1672, 1672, 1792, 1793, 1673, 1673, 1793, 1794, 1674, 1674, 1794, 1795, 1675, 1675, 1795, 1796, 1676, 1676, 1796, 1797, 1677, 1677, 1797, 1798, 1678, 1678, 1798, 1799, 1679, 1679, 1799, 1800, 1680, 1680, 1800, 1681, 1561, 1681, 1801, 1802, 1682, 1682, 1802, 1803, 1683, 1683, 1803, 1804, 1684, 1684, 1804, 1805, 1685, 1685, 1805, 1806, 1686, 1686, 1806, 1807, 1687, 1687, 1807, 1808, 1688, 1688, 1808, 1809, 1689, 1689, 1809, 1810, 1690, 1690, 1810, 1811, 1691, 1691, 1811, 1812, 1692, 1692, 1812, 1813, 1693, 1693, 1813, 1814, 1694, 1694, 1814, 1815, 1695, 1695, 1815, 1816, 1696, 1696, 1816, 1817, 1697, 1697, 1817, 1818, 1698, 1698, 1818, 1819, 1699, 1699, 1819, 1820, 1700, 1700, 1820, 1821, 1701, 1701, 1821, 1822, 1702, 1702, 1822, 1823, 1703, 1703, 1823, 1824, 1704, 1704, 1824, 1825, 1705, 1705, 1825, 1826, 1706, 1706, 1826, 1827, 1707, 1707, 1827, 1828, 1708, 1708, 1828, 1829, 1709, 1709, 1829, 1830, 1710, 1710, 1830, 1831, 1711, 1711, 1831, 1832, 1712, 1712, 1832, 1833, 1713, 1713, 1833, 1834, 1714, 1714, 1834, 1835, 1715, 1715, 1835, 1836, 1716, 1716, 1836, 1837, 1717, 1717, 1837, 1838, 1718, 1718, 1838, 1839, 1719, 1719, 1839, 1840, 1720, 1720, 1840, 1841, 1721, 1721, 1841, 1842, 1722, 1722, 1842, 1843, 1723, 1723, 1843, 1844, 1724, 1724, 1844, 1845, 1725, 1725, 1845, 1846, 1726, 1726, 1846, 1847, 1727, 1727, 1847, 1848, 1728, 1728, 1848, 1849, 1729, 1729, 1849, 1850, 1730, 1730, 1850, 1851, 1731, 1731, 1851, 1852, 1732, 1732, 1852, 1853, 1733, 1733, 1853, 1854, 1734, 1734, 1854, 1855, 1735, 1735, 1855, 1856, 1736, 1736, 1856, 1857, 1737, 1737, 1857, 1858, 1738, 1738, 1858, 1859, 1739, 1739, 1859, 1860, 1740, 1740, 1860, 1861, 1741, 1741, 1861, 1862, 1742, 1742, 1862, 1863, 1743, 1743, 1863, 1864, 1744, 1744, 1864, 1865, 1745, 1745, 1865, 1866, 1746, 1746, 1866, 1867, 1747, 1747, 1867, 1868, 1748, 1748, 1868, 1869, 1749, 1749, 1869, 1870, 1750, 1750, 1870, 1871, 1751, 1751, 1871, 1872, 1752, 1752, 1872, 1873, 1753, 1753, 1873, 1874, 1754, 1754, 1874, 1875, 1755, 1755, 1875, 1876, 1756, 1756, 1876, 1877, 1757, 1757, 1877, 1878, 1758, 1758, 1878, 1879, 1759, 1759, 1879, 1880, 1760, 1760, 1880, 1881, 1761, 1761, 1881, 1882, 1762, 1762, 1882, 1883, 1763, 1763, 1883, 1884, 1764, 1764, 1884, 1885, 1765, 1765, 1885, 1886, 1766, 1766, 1886, 1887, 1767, 1767, 1887, 1888, 1768, 1768, 1888, 1889, 1769, 1769, 1889, 1890, 1770, 1770, 1890, 1891, 1771, 1771, 1891, 1892, 1772, 1772, 1892, 1893, 1773, 1773, 1893, 1894, 1774, 1774, 1894, 1895, 1775, 1775, 1895, 1896, 1776, 1776, 1896, 1897, 1777, 1777, 1897, 1898, 1778, 1778, 1898, 1899, 1779, 1779, 1899, 1900, 1780, 1780, 1900, 1901, 1781, 1781, 1901, 1902, 1782, 1782, 1902, 1903, 1783, 1783, 1903, 1904, 1784, 1784, 1904, 1905, 1785, 1785, 1905, 1906, 1786, 1786, 1906, 1907, 1787, 1787, 1907, 1908, 1788, 1788, 1908, 1909, 1789, 1789, 1909, 1910, 1790, 1790, 1910, 1911, 1791, 1791, 1911, 1912, 1792, 1792, 1912, 1913, 1793, 1793, 1913, 1914, 1794, 1794, 1914, 1915, 1795, 1795, 1915, 1916, 1796, 1796, 1916, 1917, 1797, 1797, 1917, 1918, 1798, 1798, 1918, 1919, 1799, 1799, 1919, 1920, 1800, 1800, 1920, 1801, 1681, 1801, 1921, 1922, 1802, 1802, 1922, 1923, 1803, 1803, 1923, 1924, 1804, 1804, 1924, 1925, 1805, 1805, 1925, 1926, 1806, 1806, 1926, 1927, 1807, 1807, 1927, 1928, 1808, 1808, 1928, 1929, 1809, 1809, 1929, 1930, 1810, 1810, 1930, 1931, 1811, 1811, 1931, 1932, 1812, 1812, 1932, 1933, 1813, 1813, 1933, 1934, 1814, 1814, 1934, 1935, 1815, 1815, 1935, 1936, 1816, 1816, 1936, 1937, 1817, 1817, 1937, 1938, 1818, 1818, 1938, 1939, 1819, 1819, 1939, 1940, 1820, 1820, 1940, 1941, 1821, 1821, 1941, 1942, 1822, 1822, 1942, 1943, 1823, 1823, 1943, 1944, 1824, 1824, 1944, 1945, 1825, 1825, 1945, 1946, 1826, 1826, 1946, 1947, 1827, 1827, 1947, 1948, 1828, 1828, 1948, 1949, 1829, 1829, 1949, 1950, 1830, 1830, 1950, 1951, 1831, 1831, 1951, 1952, 1832, 1832, 1952, 1953, 1833, 1833, 1953, 1954, 1834, 1834, 1954, 1955, 1835, 1835, 1955, 1956, 1836, 1836, 1956, 1957, 1837, 1837, 1957, 1958, 1838, 1838, 1958, 1959, 1839, 1839, 1959, 1960, 1840, 1840, 1960, 1961, 1841, 1841, 1961, 1962, 1842, 1842, 1962, 1963, 1843, 1843, 1963, 1964, 1844, 1844, 1964, 1965, 1845, 1845, 1965, 1966, 1846, 1846, 1966, 1967, 1847, 1847, 1967, 1968, 1848, 1848, 1968, 1969, 1849, 1849, 1969, 1970, 1850, 1850, 1970, 1971, 1851, 1851, 1971, 1972, 1852, 1852, 1972, 1973, 1853, 1853, 1973, 1974, 1854, 1854, 1974, 1975, 1855, 1855, 1975, 1976, 1856, 1856, 1976, 1977, 1857, 1857, 1977, 1978, 1858, 1858, 1978, 1979, 1859, 1859, 1979, 1980, 1860, 1860, 1980, 1981, 1861, 1861, 1981, 1982, 1862, 1862, 1982, 1983, 1863, 1863, 1983, 1984, 1864, 1864, 1984, 1985, 1865, 1865, 1985, 1986, 1866, 1866, 1986, 1987, 1867, 1867, 1987, 1988, 1868, 1868, 1988, 1989, 1869, 1869, 1989, 1990, 1870, 1870, 1990, 1991, 1871, 1871, 1991, 1992, 1872, 1872, 1992, 1993, 1873, 1873, 1993, 1994, 1874, 1874, 1994, 1995, 1875, 1875, 1995, 1996, 1876, 1876, 1996, 1997, 1877, 1877, 1997, 1998, 1878, 1878, 1998, 1999, 1879, 1879, 1999, 2000, 1880, 1880, 2000, 2001, 1881, 1881, 2001, 2002, 1882, 1882, 2002, 2003, 1883, 1883, 2003, 2004, 1884, 1884, 2004, 2005, 1885, 1885, 2005, 2006, 1886, 1886, 2006, 2007, 1887, 1887, 2007, 2008, 1888, 1888, 2008, 2009, 1889, 1889, 2009, 2010, 1890, 1890, 2010, 2011, 1891, 1891, 2011, 2012, 1892, 1892, 2012, 2013, 1893, 1893, 2013, 2014, 1894, 1894, 2014, 2015, 1895, 1895, 2015, 2016, 1896, 1896, 2016, 2017, 1897, 1897, 2017, 2018, 1898, 1898, 2018, 2019, 1899, 1899, 2019, 2020, 1900, 1900, 2020, 2021, 1901, 1901, 2021, 2022, 1902, 1902, 2022, 2023, 1903, 1903, 2023, 2024, 1904, 1904, 2024, 2025, 1905, 1905, 2025, 2026, 1906, 1906, 2026, 2027, 1907, 1907, 2027, 2028, 1908, 1908, 2028, 2029, 1909, 1909, 2029, 2030, 1910, 1910, 2030, 2031, 1911, 1911, 2031, 2032, 1912, 1912, 2032, 2033, 1913, 1913, 2033, 2034, 1914, 1914, 2034, 2035, 1915, 1915, 2035, 2036, 1916, 1916, 2036, 2037, 1917, 1917, 2037, 2038, 1918, 1918, 2038, 2039, 1919, 1919, 2039, 2040, 1920, 1920, 2040, 1921, 1801, 1921, 2041, 2042, 1922, 1922, 2042, 2043, 1923, 1923, 2043, 2044, 1924, 1924, 2044, 2045, 1925, 1925, 2045, 2046, 1926, 1926, 2046, 2047, 1927, 1927, 2047, 2048, 1928, 1928, 2048, 2049, 1929, 1929, 2049, 2050, 1930, 1930, 2050, 2051, 1931, 1931, 2051, 2052, 1932, 1932, 2052, 2053, 1933, 1933, 2053, 2054, 1934, 1934, 2054, 2055, 1935, 1935, 2055, 2056, 1936, 1936, 2056, 2057, 1937, 1937, 2057, 2058, 1938, 1938, 2058, 2059, 1939, 1939, 2059, 2060, 1940, 1940, 2060, 2061, 1941, 1941, 2061, 2062, 1942, 1942, 2062, 2063, 1943, 1943, 2063, 2064, 1944, 1944, 2064, 2065, 1945, 1945, 2065, 2066, 1946, 1946, 2066, 2067, 1947, 1947, 2067, 2068, 1948, 1948, 2068, 2069, 1949, 1949, 2069, 2070, 1950, 1950, 2070, 2071, 1951, 1951, 2071, 2072, 1952, 1952, 2072, 2073, 1953, 1953, 2073, 2074, 1954, 1954, 2074, 2075, 1955, 1955, 2075, 2076, 1956, 1956, 2076, 2077, 1957, 1957, 2077, 2078, 1958, 1958, 2078, 2079, 1959, 1959, 2079, 2080, 1960, 1960, 2080, 2081, 1961, 1961, 2081, 2082, 1962, 1962, 2082, 2083, 1963, 1963, 2083, 2084, 1964, 1964, 2084, 2085, 1965, 1965, 2085, 2086, 1966, 1966, 2086, 2087, 1967, 1967, 2087, 2088, 1968, 1968, 2088, 2089, 1969, 1969, 2089, 2090, 1970, 1970, 2090, 2091, 1971, 1971, 2091, 2092, 1972, 1972, 2092, 2093, 1973, 1973, 2093, 2094, 1974, 1974, 2094, 2095, 1975, 1975, 2095, 2096, 1976, 1976, 2096, 2097, 1977, 1977, 2097, 2098, 1978, 1978, 2098, 2099, 1979, 1979, 2099, 2100, 1980, 1980, 2100, 2101, 1981, 1981, 2101, 2102, 1982, 1982, 2102, 2103, 1983, 1983, 2103, 2104, 1984, 1984, 2104, 2105, 1985, 1985, 2105, 2106, 1986, 1986, 2106, 2107, 1987, 1987, 2107, 2108, 1988, 1988, 2108, 2109, 1989, 1989, 2109, 2110, 1990, 1990, 2110, 2111, 1991, 1991, 2111, 2112, 1992, 1992, 2112, 2113, 1993, 1993, 2113, 2114, 1994, 1994, 2114, 2115, 1995, 1995, 2115, 2116, 1996, 1996, 2116, 2117, 1997, 1997, 2117, 2118, 1998, 1998, 2118, 2119, 1999, 1999, 2119, 2120, 2000, 2000, 2120, 2121, 2001, 2001, 2121, 2122, 2002, 2002, 2122, 2123, 2003, 2003, 2123, 2124, 2004, 2004, 2124, 2125, 2005, 2005, 2125, 2126, 2006, 2006, 2126, 2127, 2007, 2007, 2127, 2128, 2008, 2008, 2128, 2129, 2009, 2009, 2129, 2130, 2010, 2010, 2130, 2131, 2011, 2011, 2131, 2132, 2012, 2012, 2132, 2133, 2013, 2013, 2133, 2134, 2014, 2014, 2134, 2135, 2015, 2015, 2135, 2136, 2016, 2016, 2136, 2137, 2017, 2017, 2137, 2138, 2018, 2018, 2138, 2139, 2019, 2019, 2139, 2140, 2020, 2020, 2140, 2141, 2021, 2021, 2141, 2142, 2022, 2022, 2142, 2143, 2023, 2023, 2143, 2144, 2024, 2024, 2144, 2145, 2025, 2025, 2145, 2146, 2026, 2026, 2146, 2147, 2027, 2027, 2147, 2148, 2028, 2028, 2148, 2149, 2029, 2029, 2149, 2150, 2030, 2030, 2150, 2151, 2031, 2031, 2151, 2152, 2032, 2032, 2152, 2153, 2033, 2033, 2153, 2154, 2034, 2034, 2154, 2155, 2035, 2035, 2155, 2156, 2036, 2036, 2156, 2157, 2037, 2037, 2157, 2158, 2038, 2038, 2158, 2159, 2039, 2039, 2159, 2160, 2040, 2040, 2160, 2041, 1921, 2041, 2161, 2162, 2042, 2042, 2162, 2163, 2043, 2043, 2163, 2164, 2044, 2044, 2164, 2165, 2045, 2045, 2165, 2166, 2046, 2046, 2166, 2167, 2047, 2047, 2167, 2168, 2048, 2048, 2168, 2169, 2049, 2049, 2169, 2170, 2050, 2050, 2170, 2171, 2051, 2051, 2171, 2172, 2052, 2052, 2172, 2173, 2053, 2053, 2173, 2174, 2054, 2054, 2174, 2175, 2055, 2055, 2175, 2176, 2056, 2056, 2176, 2177, 2057, 2057, 2177, 2178, 2058, 2058, 2178, 2179, 2059, 2059, 2179, 2180, 2060, 2060, 2180, 2181, 2061, 2061, 2181, 2182, 2062, 2062, 2182, 2183, 2063, 2063, 2183, 2184, 2064, 2064, 2184, 2185, 2065, 2065, 2185, 2186, 2066, 2066, 2186, 2187, 2067, 2067, 2187, 2188, 2068, 2068, 2188, 2189, 2069, 2069, 2189, 2190, 2070, 2070, 2190, 2191, 2071, 2071, 2191, 2192, 2072, 2072, 2192, 2193, 2073, 2073, 2193, 2194, 2074, 2074, 2194, 2195, 2075, 2075, 2195, 2196, 2076, 2076, 2196, 2197, 2077, 2077, 2197, 2198, 2078, 2078, 2198, 2199, 2079, 2079, 2199, 2200, 2080, 2080, 2200, 2201, 2081, 2081, 2201, 2202, 2082, 2082, 2202, 2203, 2083, 2083, 2203, 2204, 2084, 2084, 2204, 2205, 2085, 2085, 2205, 2206, 2086, 2086, 2206, 2207, 2087, 2087, 2207, 2208, 2088, 2088, 2208, 2209, 2089, 2089, 2209, 2210, 2090, 2090, 2210, 2211, 2091, 2091, 2211, 2212, 2092, 2092, 2212, 2213, 2093, 2093, 2213, 2214, 2094, 2094, 2214, 2215, 2095, 2095, 2215, 2216, 2096, 2096, 2216, 2217, 2097, 2097, 2217, 2218, 2098, 2098, 2218, 2219, 2099, 2099, 2219, 2220, 2100, 2100, 2220, 2221, 2101, 2101, 2221, 2222, 2102, 2102, 2222, 2223, 2103, 2103, 2223, 2224, 2104, 2104, 2224, 2225, 2105, 2105, 2225, 2226, 2106, 2106, 2226, 2227, 2107, 2107, 2227, 2228, 2108, 2108, 2228, 2229, 2109, 2109, 2229, 2230, 2110, 2110, 2230, 2231, 2111, 2111, 2231, 2232, 2112, 2112, 2232, 2233, 2113, 2113, 2233, 2234, 2114, 2114, 2234, 2235, 2115, 2115, 2235, 2236, 2116, 2116, 2236, 2237, 2117, 2117, 2237, 2238, 2118, 2118, 2238, 2239, 2119, 2119, 2239, 2240, 2120, 2120, 2240, 2241, 2121, 2121, 2241, 2242, 2122, 2122, 2242, 2243, 2123, 2123, 2243, 2244, 2124, 2124, 2244, 2245, 2125, 2125, 2245, 2246, 2126, 2126, 2246, 2247, 2127, 2127, 2247, 2248, 2128, 2128, 2248, 2249, 2129, 2129, 2249, 2250, 2130, 2130, 2250, 2251, 2131, 2131, 2251, 2252, 2132, 2132, 2252, 2253, 2133, 2133, 2253, 2254, 2134, 2134, 2254, 2255, 2135, 2135, 2255, 2256, 2136, 2136, 2256, 2257, 2137, 2137, 2257, 2258, 2138, 2138, 2258, 2259, 2139, 2139, 2259, 2260, 2140, 2140, 2260, 2261, 2141, 2141, 2261, 2262, 2142, 2142, 2262, 2263, 2143, 2143, 2263, 2264, 2144, 2144, 2264, 2265, 2145, 2145, 2265, 2266, 2146, 2146, 2266, 2267, 2147, 2147, 2267, 2268, 2148, 2148, 2268, 2269, 2149, 2149, 2269, 2270, 2150, 2150, 2270, 2271, 2151, 2151, 2271, 2272, 2152, 2152, 2272, 2273, 2153, 2153, 2273, 2274, 2154, 2154, 2274, 2275, 2155, 2155, 2275, 2276, 2156, 2156, 2276, 2277, 2157, 2157, 2277, 2278, 2158, 2158, 2278, 2279, 2159, 2159, 2279, 2280, 2160, 2160, 2280, 2161, 2041, 2161, 2281, 2282, 2162, 2162, 2282, 2283, 2163, 2163, 2283, 2284, 2164, 2164, 2284, 2285, 2165, 2165, 2285, 2286, 2166, 2166, 2286, 2287, 2167, 2167, 2287, 2288, 2168, 2168, 2288, 2289, 2169, 2169, 2289, 2290, 2170, 2170, 2290, 2291, 2171, 2171, 2291, 2292, 2172, 2172, 2292, 2293, 2173, 2173, 2293, 2294, 2174, 2174, 2294, 2295, 2175, 2175, 2295, 2296, 2176, 2176, 2296, 2297, 2177, 2177, 2297, 2298, 2178, 2178, 2298, 2299, 2179, 2179, 2299, 2300, 2180, 2180, 2300, 2301, 2181, 2181, 2301, 2302, 2182, 2182, 2302, 2303, 2183, 2183, 2303, 2304, 2184, 2184, 2304, 2305, 2185, 2185, 2305, 2306, 2186, 2186, 2306, 2307, 2187, 2187, 2307, 2308, 2188, 2188, 2308, 2309, 2189, 2189, 2309, 2310, 2190, 2190, 2310, 2311, 2191, 2191, 2311, 2312, 2192, 2192, 2312, 2313, 2193, 2193, 2313, 2314, 2194, 2194, 2314, 2315, 2195, 2195, 2315, 2316, 2196, 2196, 2316, 2317, 2197, 2197, 2317, 2318, 2198, 2198, 2318, 2319, 2199, 2199, 2319, 2320, 2200, 2200, 2320, 2321, 2201, 2201, 2321, 2322, 2202, 2202, 2322, 2323, 2203, 2203, 2323, 2324, 2204, 2204, 2324, 2325, 2205, 2205, 2325, 2326, 2206, 2206, 2326, 2327, 2207, 2207, 2327, 2328, 2208, 2208, 2328, 2329, 2209, 2209, 2329, 2330, 2210, 2210, 2330, 2331, 2211, 2211, 2331, 2332, 2212, 2212, 2332, 2333, 2213, 2213, 2333, 2334, 2214, 2214, 2334, 2335, 2215, 2215, 2335, 2336, 2216, 2216, 2336, 2337, 2217, 2217, 2337, 2338, 2218, 2218, 2338, 2339, 2219, 2219, 2339, 2340, 2220, 2220, 2340, 2341, 2221, 2221, 2341, 2342, 2222, 2222, 2342, 2343, 2223, 2223, 2343, 2344, 2224, 2224, 2344, 2345, 2225, 2225, 2345, 2346, 2226, 2226, 2346, 2347, 2227, 2227, 2347, 2348, 2228, 2228, 2348, 2349, 2229, 2229, 2349, 2350, 2230, 2230, 2350, 2351, 2231, 2231, 2351, 2352, 2232, 2232, 2352, 2353, 2233, 2233, 2353, 2354, 2234, 2234, 2354, 2355, 2235, 2235, 2355, 2356, 2236, 2236, 2356, 2357, 2237, 2237, 2357, 2358, 2238, 2238, 2358, 2359, 2239, 2239, 2359, 2360, 2240, 2240, 2360, 2361, 2241, 2241, 2361, 2362, 2242, 2242, 2362, 2363, 2243, 2243, 2363, 2364, 2244, 2244, 2364, 2365, 2245, 2245, 2365, 2366, 2246, 2246, 2366, 2367, 2247, 2247, 2367, 2368, 2248, 2248, 2368, 2369, 2249, 2249, 2369, 2370, 2250, 2250, 2370, 2371, 2251, 2251, 2371, 2372, 2252, 2252, 2372, 2373, 2253, 2253, 2373, 2374, 2254, 2254, 2374, 2375, 2255, 2255, 2375, 2376, 2256, 2256, 2376, 2377, 2257, 2257, 2377, 2378, 2258, 2258, 2378, 2379, 2259, 2259, 2379, 2380, 2260, 2260, 2380, 2381, 2261, 2261, 2381, 2382, 2262, 2262, 2382, 2383, 2263, 2263, 2383, 2384, 2264, 2264, 2384, 2385, 2265, 2265, 2385, 2386, 2266, 2266, 2386, 2387, 2267, 2267, 2387, 2388, 2268, 2268, 2388, 2389, 2269, 2269, 2389, 2390, 2270, 2270, 2390, 2391, 2271, 2271, 2391, 2392, 2272, 2272, 2392, 2393, 2273, 2273, 2393, 2394, 2274, 2274, 2394, 2395, 2275, 2275, 2395, 2396, 2276, 2276, 2396, 2397, 2277, 2277, 2397, 2398, 2278, 2278, 2398, 2399, 2279, 2279, 2399, 2400, 2280, 2280, 2400, 2281, 2161, 2281, 2401, 2402, 2282, 2282, 2402, 2403, 2283, 2283, 2403, 2404, 2284, 2284, 2404, 2405, 2285, 2285, 2405, 2406, 2286, 2286, 2406, 2407, 2287, 2287, 2407, 2408, 2288, 2288, 2408, 2409, 2289, 2289, 2409, 2410, 2290, 2290, 2410, 2411, 2291, 2291, 2411, 2412, 2292, 2292, 2412, 2413, 2293, 2293, 2413, 2414, 2294, 2294, 2414, 2415, 2295, 2295, 2415, 2416, 2296, 2296, 2416, 2417, 2297, 2297, 2417, 2418, 2298, 2298, 2418, 2419, 2299, 2299, 2419, 2420, 2300, 2300, 2420, 2421, 2301, 2301, 2421, 2422, 2302, 2302, 2422, 2423, 2303, 2303, 2423, 2424, 2304, 2304, 2424, 2425, 2305, 2305, 2425, 2426, 2306, 2306, 2426, 2427, 2307, 2307, 2427, 2428, 2308, 2308, 2428, 2429, 2309, 2309, 2429, 2430, 2310, 2310, 2430, 2431, 2311, 2311, 2431, 2432, 2312, 2312, 2432, 2433, 2313, 2313, 2433, 2434, 2314, 2314, 2434, 2435, 2315, 2315, 2435, 2436, 2316, 2316, 2436, 2437, 2317, 2317, 2437, 2438, 2318, 2318, 2438, 2439, 2319, 2319, 2439, 2440, 2320, 2320, 2440, 2441, 2321, 2321, 2441, 2442, 2322, 2322, 2442, 2443, 2323, 2323, 2443, 2444, 2324, 2324, 2444, 2445, 2325, 2325, 2445, 2446, 2326, 2326, 2446, 2447, 2327, 2327, 2447, 2448, 2328, 2328, 2448, 2449, 2329, 2329, 2449, 2450, 2330, 2330, 2450, 2451, 2331, 2331, 2451, 2452, 2332, 2332, 2452, 2453, 2333, 2333, 2453, 2454, 2334, 2334, 2454, 2455, 2335, 2335, 2455, 2456, 2336, 2336, 2456, 2457, 2337, 2337, 2457, 2458, 2338, 2338, 2458, 2459, 2339, 2339, 2459, 2460, 2340, 2340, 2460, 2461, 2341, 2341, 2461, 2462, 2342, 2342, 2462, 2463, 2343, 2343, 2463, 2464, 2344, 2344, 2464, 2465, 2345, 2345, 2465, 2466, 2346, 2346, 2466, 2467, 2347, 2347, 2467, 2468, 2348, 2348, 2468, 2469, 2349, 2349, 2469, 2470, 2350, 2350, 2470, 2471, 2351, 2351, 2471, 2472, 2352, 2352, 2472, 2473, 2353, 2353, 2473, 2474, 2354, 2354, 2474, 2475, 2355, 2355, 2475, 2476, 2356, 2356, 2476, 2477, 2357, 2357, 2477, 2478, 2358, 2358, 2478, 2479, 2359, 2359, 2479, 2480, 2360, 2360, 2480, 2481, 2361, 2361, 2481, 2482, 2362, 2362, 2482, 2483, 2363, 2363, 2483, 2484, 2364, 2364, 2484, 2485, 2365, 2365, 2485, 2486, 2366, 2366, 2486, 2487, 2367, 2367, 2487, 2488, 2368, 2368, 2488, 2489, 2369, 2369, 2489, 2490, 2370, 2370, 2490, 2491, 2371, 2371, 2491, 2492, 2372, 2372, 2492, 2493, 2373, 2373, 2493, 2494, 2374, 2374, 2494, 2495, 2375, 2375, 2495, 2496, 2376, 2376, 2496, 2497, 2377, 2377, 2497, 2498, 2378, 2378, 2498, 2499, 2379, 2379, 2499, 2500, 2380, 2380, 2500, 2501, 2381, 2381, 2501, 2502, 2382, 2382, 2502, 2503, 2383, 2383, 2503, 2504, 2384, 2384, 2504, 2505, 2385, 2385, 2505, 2506, 2386, 2386, 2506, 2507, 2387, 2387, 2507, 2508, 2388, 2388, 2508, 2509, 2389, 2389, 2509, 2510, 2390, 2390, 2510, 2511, 2391, 2391, 2511, 2512, 2392, 2392, 2512, 2513, 2393, 2393, 2513, 2514, 2394, 2394, 2514, 2515, 2395, 2395, 2515, 2516, 2396, 2396, 2516, 2517, 2397, 2397, 2517, 2518, 2398, 2398, 2518, 2519, 2399, 2399, 2519, 2520, 2400, 2400, 2520, 2401, 2281, 2401, 2521, 2522, 2402, 2402, 2522, 2523, 2403, 2403, 2523, 2524, 2404, 2404, 2524, 2525, 2405, 2405, 2525, 2526, 2406, 2406, 2526, 2527, 2407, 2407, 2527, 2528, 2408, 2408, 2528, 2529, 2409, 2409, 2529, 2530, 2410, 2410, 2530, 2531, 2411, 2411, 2531, 2532, 2412, 2412, 2532, 2533, 2413, 2413, 2533, 2534, 2414, 2414, 2534, 2535, 2415, 2415, 2535, 2536, 2416, 2416, 2536, 2537, 2417, 2417, 2537, 2538, 2418, 2418, 2538, 2539, 2419, 2419, 2539, 2540, 2420, 2420, 2540, 2541, 2421, 2421, 2541, 2542, 2422, 2422, 2542, 2543, 2423, 2423, 2543, 2544, 2424, 2424, 2544, 2545, 2425, 2425, 2545, 2546, 2426, 2426, 2546, 2547, 2427, 2427, 2547, 2548, 2428, 2428, 2548, 2549, 2429, 2429, 2549, 2550, 2430, 2430, 2550, 2551, 2431, 2431, 2551, 2552, 2432, 2432, 2552, 2553, 2433, 2433, 2553, 2554, 2434, 2434, 2554, 2555, 2435, 2435, 2555, 2556, 2436, 2436, 2556, 2557, 2437, 2437, 2557, 2558, 2438, 2438, 2558, 2559, 2439, 2439, 2559, 2560, 2440, 2440, 2560, 2561, 2441, 2441, 2561, 2562, 2442, 2442, 2562, 2563, 2443, 2443, 2563, 2564, 2444, 2444, 2564, 2565, 2445, 2445, 2565, 2566, 2446, 2446, 2566, 2567, 2447, 2447, 2567, 2568, 2448, 2448, 2568, 2569, 2449, 2449, 2569, 2570, 2450, 2450, 2570, 2571, 2451, 2451, 2571, 2572, 2452, 2452, 2572, 2573, 2453, 2453, 2573, 2574, 2454, 2454, 2574, 2575, 2455, 2455, 2575, 2576, 2456, 2456, 2576, 2577, 2457, 2457, 2577, 2578, 2458, 2458, 2578, 2579, 2459, 2459, 2579, 2580, 2460, 2460, 2580, 2581, 2461, 2461, 2581, 2582, 2462, 2462, 2582, 2583, 2463, 2463, 2583, 2584, 2464, 2464, 2584, 2585, 2465, 2465, 2585, 2586, 2466, 2466, 2586, 2587, 2467, 2467, 2587, 2588, 2468, 2468, 2588, 2589, 2469, 2469, 2589, 2590, 2470, 2470, 2590, 2591, 2471, 2471, 2591, 2592, 2472, 2472, 2592, 2593, 2473, 2473, 2593, 2594, 2474, 2474, 2594, 2595, 2475, 2475, 2595, 2596, 2476, 2476, 2596, 2597, 2477, 2477, 2597, 2598, 2478, 2478, 2598, 2599, 2479, 2479, 2599, 2600, 2480, 2480, 2600, 2601, 2481, 2481, 2601, 2602, 2482, 2482, 2602, 2603, 2483, 2483, 2603, 2604, 2484, 2484, 2604, 2605, 2485, 2485, 2605, 2606, 2486, 2486, 2606, 2607, 2487, 2487, 2607, 2608, 2488, 2488, 2608, 2609, 2489, 2489, 2609, 2610, 2490, 2490, 2610, 2611, 2491, 2491, 2611, 2612, 2492, 2492, 2612, 2613, 2493, 2493, 2613, 2614, 2494, 2494, 2614, 2615, 2495, 2495, 2615, 2616, 2496, 2496, 2616, 2617, 2497, 2497, 2617, 2618, 2498, 2498, 2618, 2619, 2499, 2499, 2619, 2620, 2500, 2500, 2620, 2621, 2501, 2501, 2621, 2622, 2502, 2502, 2622, 2623, 2503, 2503, 2623, 2624, 2504, 2504, 2624, 2625, 2505, 2505, 2625, 2626, 2506, 2506, 2626, 2627, 2507, 2507, 2627, 2628, 2508, 2508, 2628, 2629, 2509, 2509, 2629, 2630, 2510, 2510, 2630, 2631, 2511, 2511, 2631, 2632, 2512, 2512, 2632, 2633, 2513, 2513, 2633, 2634, 2514, 2514, 2634, 2635, 2515, 2515, 2635, 2636, 2516, 2516, 2636, 2637, 2517, 2517, 2637, 2638, 2518, 2518, 2638, 2639, 2519, 2519, 2639, 2640, 2520, 2520, 2640, 2521, 2401, 2521, 2641, 2642, 2522, 2522, 2642, 2643, 2523, 2523, 2643, 2644, 2524, 2524, 2644, 2645, 2525, 2525, 2645, 2646, 2526, 2526, 2646, 2647, 2527, 2527, 2647, 2648, 2528, 2528, 2648, 2649, 2529, 2529, 2649, 2650, 2530, 2530, 2650, 2651, 2531, 2531, 2651, 2652, 2532, 2532, 2652, 2653, 2533, 2533, 2653, 2654, 2534, 2534, 2654, 2655, 2535, 2535, 2655, 2656, 2536, 2536, 2656, 2657, 2537, 2537, 2657, 2658, 2538, 2538, 2658, 2659, 2539, 2539, 2659, 2660, 2540, 2540, 2660, 2661, 2541, 2541, 2661, 2662, 2542, 2542, 2662, 2663, 2543, 2543, 2663, 2664, 2544, 2544, 2664, 2665, 2545, 2545, 2665, 2666, 2546, 2546, 2666, 2667, 2547, 2547, 2667, 2668, 2548, 2548, 2668, 2669, 2549, 2549, 2669, 2670, 2550, 2550, 2670, 2671, 2551, 2551, 2671, 2672, 2552, 2552, 2672, 2673, 2553, 2553, 2673, 2674, 2554, 2554, 2674, 2675, 2555, 2555, 2675, 2676, 2556, 2556, 2676, 2677, 2557, 2557, 2677, 2678, 2558, 2558, 2678, 2679, 2559, 2559, 2679, 2680, 2560, 2560, 2680, 2681, 2561, 2561, 2681, 2682, 2562, 2562, 2682, 2683, 2563, 2563, 2683, 2684, 2564, 2564, 2684, 2685, 2565, 2565, 2685, 2686, 2566, 2566, 2686, 2687, 2567, 2567, 2687, 2688, 2568, 2568, 2688, 2689, 2569, 2569, 2689, 2690, 2570, 2570, 2690, 2691, 2571, 2571, 2691, 2692, 2572, 2572, 2692, 2693, 2573, 2573, 2693, 2694, 2574, 2574, 2694, 2695, 2575, 2575, 2695, 2696, 2576, 2576, 2696, 2697, 2577, 2577, 2697, 2698, 2578, 2578, 2698, 2699, 2579, 2579, 2699, 2700, 2580, 2580, 2700, 2701, 2581, 2581, 2701, 2702, 2582, 2582, 2702, 2703, 2583, 2583, 2703, 2704, 2584, 2584, 2704, 2705, 2585, 2585, 2705, 2706, 2586, 2586, 2706, 2707, 2587, 2587, 2707, 2708, 2588, 2588, 2708, 2709, 2589, 2589, 2709, 2710, 2590, 2590, 2710, 2711, 2591, 2591, 2711, 2712, 2592, 2592, 2712, 2713, 2593, 2593, 2713, 2714, 2594, 2594, 2714, 2715, 2595, 2595, 2715, 2716, 2596, 2596, 2716, 2717, 2597, 2597, 2717, 2718, 2598, 2598, 2718, 2719, 2599, 2599, 2719, 2720, 2600, 2600, 2720, 2721, 2601, 2601, 2721, 2722, 2602, 2602, 2722, 2723, 2603, 2603, 2723, 2724, 2604, 2604, 2724, 2725, 2605, 2605, 2725, 2726, 2606, 2606, 2726, 2727, 2607, 2607, 2727, 2728, 2608, 2608, 2728, 2729, 2609, 2609, 2729, 2730, 2610, 2610, 2730, 2731, 2611, 2611, 2731, 2732, 2612, 2612, 2732, 2733, 2613, 2613, 2733, 2734, 2614, 2614, 2734, 2735, 2615, 2615, 2735, 2736, 2616, 2616, 2736, 2737, 2617, 2617, 2737, 2738, 2618, 2618, 2738, 2739, 2619, 2619, 2739, 2740, 2620, 2620, 2740, 2741, 2621, 2621, 2741, 2742, 2622, 2622, 2742, 2743, 2623, 2623, 2743, 2744, 2624, 2624, 2744, 2745, 2625, 2625, 2745, 2746, 2626, 2626, 2746, 2747, 2627, 2627, 2747, 2748, 2628, 2628, 2748, 2749, 2629, 2629, 2749, 2750, 2630, 2630, 2750, 2751, 2631, 2631, 2751, 2752, 2632, 2632, 2752, 2753, 2633, 2633, 2753, 2754, 2634, 2634, 2754, 2755, 2635, 2635, 2755, 2756, 2636, 2636, 2756, 2757, 2637, 2637, 2757, 2758, 2638, 2638, 2758, 2759, 2639, 2639, 2759, 2760, 2640, 2640, 2760, 2641, 2521, 2641, 2761, 2762, 2642, 2642, 2762, 2763, 2643, 2643, 2763, 2764, 2644, 2644, 2764, 2765, 2645, 2645, 2765, 2766, 2646, 2646, 2766, 2767, 2647, 2647, 2767, 2768, 2648, 2648, 2768, 2769, 2649, 2649, 2769, 2770, 2650, 2650, 2770, 2771, 2651, 2651, 2771, 2772, 2652, 2652, 2772, 2773, 2653, 2653, 2773, 2774, 2654, 2654, 2774, 2775, 2655, 2655, 2775, 2776, 2656, 2656, 2776, 2777, 2657, 2657, 2777, 2778, 2658, 2658, 2778, 2779, 2659, 2659, 2779, 2780, 2660, 2660, 2780, 2781, 2661, 2661, 2781, 2782, 2662, 2662, 2782, 2783, 2663, 2663, 2783, 2784, 2664, 2664, 2784, 2785, 2665, 2665, 2785, 2786, 2666, 2666, 2786, 2787, 2667, 2667, 2787, 2788, 2668, 2668, 2788, 2789, 2669, 2669, 2789, 2790, 2670, 2670, 2790, 2791, 2671, 2671, 2791, 2792, 2672, 2672, 2792, 2793, 2673, 2673, 2793, 2794, 2674, 2674, 2794, 2795, 2675, 2675, 2795, 2796, 2676, 2676, 2796, 2797, 2677, 2677, 2797, 2798, 2678, 2678, 2798, 2799, 2679, 2679, 2799, 2800, 2680, 2680, 2800, 2801, 2681, 2681, 2801, 2802, 2682, 2682, 2802, 2803, 2683, 2683, 2803, 2804, 2684, 2684, 2804, 2805, 2685, 2685, 2805, 2806, 2686, 2686, 2806, 2807, 2687, 2687, 2807, 2808, 2688, 2688, 2808, 2809, 2689, 2689, 2809, 2810, 2690, 2690, 2810, 2811, 2691, 2691, 2811, 2812, 2692, 2692, 2812, 2813, 2693, 2693, 2813, 2814, 2694, 2694, 2814, 2815, 2695, 2695, 2815, 2816, 2696, 2696, 2816, 2817, 2697, 2697, 2817, 2818, 2698, 2698, 2818, 2819, 2699, 2699, 2819, 2820, 2700, 2700, 2820, 2821, 2701, 2701, 2821, 2822, 2702, 2702, 2822, 2823, 2703, 2703, 2823, 2824, 2704, 2704, 2824, 2825, 2705, 2705, 2825, 2826, 2706, 2706, 2826, 2827, 2707, 2707, 2827, 2828, 2708, 2708, 2828, 2829, 2709, 2709, 2829, 2830, 2710, 2710, 2830, 2831, 2711, 2711, 2831, 2832, 2712, 2712, 2832, 2833, 2713, 2713, 2833, 2834, 2714, 2714, 2834, 2835, 2715, 2715, 2835, 2836, 2716, 2716, 2836, 2837, 2717, 2717, 2837, 2838, 2718, 2718, 2838, 2839, 2719, 2719, 2839, 2840, 2720, 2720, 2840, 2841, 2721, 2721, 2841, 2842, 2722, 2722, 2842, 2843, 2723, 2723, 2843, 2844, 2724, 2724, 2844, 2845, 2725, 2725, 2845, 2846, 2726, 2726, 2846, 2847, 2727, 2727, 2847, 2848, 2728, 2728, 2848, 2849, 2729, 2729, 2849, 2850, 2730, 2730, 2850, 2851, 2731, 2731, 2851, 2852, 2732, 2732, 2852, 2853, 2733, 2733, 2853, 2854, 2734, 2734, 2854, 2855, 2735, 2735, 2855, 2856, 2736, 2736, 2856, 2857, 2737, 2737, 2857, 2858, 2738, 2738, 2858, 2859, 2739, 2739, 2859, 2860, 2740, 2740, 2860, 2861, 2741, 2741, 2861, 2862, 2742, 2742, 2862, 2863, 2743, 2743, 2863, 2864, 2744, 2744, 2864, 2865, 2745, 2745, 2865, 2866, 2746, 2746, 2866, 2867, 2747, 2747, 2867, 2868, 2748, 2748, 2868, 2869, 2749, 2749, 2869, 2870, 2750, 2750, 2870, 2871, 2751, 2751, 2871, 2872, 2752, 2752, 2872, 2873, 2753, 2753, 2873, 2874, 2754, 2754, 2874, 2875, 2755, 2755, 2875, 2876, 2756, 2756, 2876, 2877, 2757, 2757, 2877, 2878, 2758, 2758, 2878, 2879, 2759, 2759, 2879, 2880, 2760, 2760, 2880, 2761, 2641, 2761, 2881, 2882, 2762, 2762, 2882, 2883, 2763, 2763, 2883, 2884, 2764, 2764, 2884, 2885, 2765, 2765, 2885, 2886, 2766, 2766, 2886, 2887, 2767, 2767, 2887, 2888, 2768, 2768, 2888, 2889, 2769, 2769, 2889, 2890, 2770, 2770, 2890, 2891, 2771, 2771, 2891, 2892, 2772, 2772, 2892, 2893, 2773, 2773, 2893, 2894, 2774, 2774, 2894, 2895, 2775, 2775, 2895, 2896, 2776, 2776, 2896, 2897, 2777, 2777, 2897, 2898, 2778, 2778, 2898, 2899, 2779, 2779, 2899, 2900, 2780, 2780, 2900, 2901, 2781, 2781, 2901, 2902, 2782, 2782, 2902, 2903, 2783, 2783, 2903, 2904, 2784, 2784, 2904, 2905, 2785, 2785, 2905, 2906, 2786, 2786, 2906, 2907, 2787, 2787, 2907, 2908, 2788, 2788, 2908, 2909, 2789, 2789, 2909, 2910, 2790, 2790, 2910, 2911, 2791, 2791, 2911, 2912, 2792, 2792, 2912, 2913, 2793, 2793, 2913, 2914, 2794, 2794, 2914, 2915, 2795, 2795, 2915, 2916, 2796, 2796, 2916, 2917, 2797, 2797, 2917, 2918, 2798, 2798, 2918, 2919, 2799, 2799, 2919, 2920, 2800, 2800, 2920, 2921, 2801, 2801, 2921, 2922, 2802, 2802, 2922, 2923, 2803, 2803, 2923, 2924, 2804, 2804, 2924, 2925, 2805, 2805, 2925, 2926, 2806, 2806, 2926, 2927, 2807, 2807, 2927, 2928, 2808, 2808, 2928, 2929, 2809, 2809, 2929, 2930, 2810, 2810, 2930, 2931, 2811, 2811, 2931, 2932, 2812, 2812, 2932, 2933, 2813, 2813, 2933, 2934, 2814, 2814, 2934, 2935, 2815, 2815, 2935, 2936, 2816, 2816, 2936, 2937, 2817, 2817, 2937, 2938, 2818, 2818, 2938, 2939, 2819, 2819, 2939, 2940, 2820, 2820, 2940, 2941, 2821, 2821, 2941, 2942, 2822, 2822, 2942, 2943, 2823, 2823, 2943, 2944, 2824, 2824, 2944, 2945, 2825, 2825, 2945, 2946, 2826, 2826, 2946, 2947, 2827, 2827, 2947, 2948, 2828, 2828, 2948, 2949, 2829, 2829, 2949, 2950, 2830, 2830, 2950, 2951, 2831, 2831, 2951, 2952, 2832, 2832, 2952, 2953, 2833, 2833, 2953, 2954, 2834, 2834, 2954, 2955, 2835, 2835, 2955, 2956, 2836, 2836, 2956, 2957, 2837, 2837, 2957, 2958, 2838, 2838, 2958, 2959, 2839, 2839, 2959, 2960, 2840, 2840, 2960, 2961, 2841, 2841, 2961, 2962, 2842, 2842, 2962, 2963, 2843, 2843, 2963, 2964, 2844, 2844, 2964, 2965, 2845, 2845, 2965, 2966, 2846, 2846, 2966, 2967, 2847, 2847, 2967, 2968, 2848, 2848, 2968, 2969, 2849, 2849, 2969, 2970, 2850, 2850, 2970, 2971, 2851, 2851, 2971, 2972, 2852, 2852, 2972, 2973, 2853, 2853, 2973, 2974, 2854, 2854, 2974, 2975, 2855, 2855, 2975, 2976, 2856, 2856, 2976, 2977, 2857, 2857, 2977, 2978, 2858, 2858, 2978, 2979, 2859, 2859, 2979, 2980, 2860, 2860, 2980, 2981, 2861, 2861, 2981, 2982, 2862, 2862, 2982, 2983, 2863, 2863, 2983, 2984, 2864, 2864, 2984, 2985, 2865, 2865, 2985, 2986, 2866, 2866, 2986, 2987, 2867, 2867, 2987, 2988, 2868, 2868, 2988, 2989, 2869, 2869, 2989, 2990, 2870, 2870, 2990, 2991, 2871, 2871, 2991, 2992, 2872, 2872, 2992, 2993, 2873, 2873, 2993, 2994, 2874, 2874, 2994, 2995, 2875, 2875, 2995, 2996, 2876, 2876, 2996, 2997, 2877, 2877, 2997, 2998, 2878, 2878, 2998, 2999, 2879, 2879, 2999, 3000, 2880, 2880, 3000, 2881, 2761, 2881, 3001, 3002, 2882, 2882, 3002, 3003, 2883, 2883, 3003, 3004, 2884, 2884, 3004, 3005, 2885, 2885, 3005, 3006, 2886, 2886, 3006, 3007, 2887, 2887, 3007, 3008, 2888, 2888, 3008, 3009, 2889, 2889, 3009, 3010, 2890, 2890, 3010, 3011, 2891, 2891, 3011, 3012, 2892, 2892, 3012, 3013, 2893, 2893, 3013, 3014, 2894, 2894, 3014, 3015, 2895, 2895, 3015, 3016, 2896, 2896, 3016, 3017, 2897, 2897, 3017, 3018, 2898, 2898, 3018, 3019, 2899, 2899, 3019, 3020, 2900, 2900, 3020, 3021, 2901, 2901, 3021, 3022, 2902, 2902, 3022, 3023, 2903, 2903, 3023, 3024, 2904, 2904, 3024, 3025, 2905, 2905, 3025, 3026, 2906, 2906, 3026, 3027, 2907, 2907, 3027, 3028, 2908, 2908, 3028, 3029, 2909, 2909, 3029, 3030, 2910, 2910, 3030, 3031, 2911, 2911, 3031, 3032, 2912, 2912, 3032, 3033, 2913, 2913, 3033, 3034, 2914, 2914, 3034, 3035, 2915, 2915, 3035, 3036, 2916, 2916, 3036, 3037, 2917, 2917, 3037, 3038, 2918, 2918, 3038, 3039, 2919, 2919, 3039, 3040, 2920, 2920, 3040, 3041, 2921, 2921, 3041, 3042, 2922, 2922, 3042, 3043, 2923, 2923, 3043, 3044, 2924, 2924, 3044, 3045, 2925, 2925, 3045, 3046, 2926, 2926, 3046, 3047, 2927, 2927, 3047, 3048, 2928, 2928, 3048, 3049, 2929, 2929, 3049, 3050, 2930, 2930, 3050, 3051, 2931, 2931, 3051, 3052, 2932, 2932, 3052, 3053, 2933, 2933, 3053, 3054, 2934, 2934, 3054, 3055, 2935, 2935, 3055, 3056, 2936, 2936, 3056, 3057, 2937, 2937, 3057, 3058, 2938, 2938, 3058, 3059, 2939, 2939, 3059, 3060, 2940, 2940, 3060, 3061, 2941, 2941, 3061, 3062, 2942, 2942, 3062, 3063, 2943, 2943, 3063, 3064, 2944, 2944, 3064, 3065, 2945, 2945, 3065, 3066, 2946, 2946, 3066, 3067, 2947, 2947, 3067, 3068, 2948, 2948, 3068, 3069, 2949, 2949, 3069, 3070, 2950, 2950, 3070, 3071, 2951, 2951, 3071, 3072, 2952, 2952, 3072, 3073, 2953, 2953, 3073, 3074, 2954, 2954, 3074, 3075, 2955, 2955, 3075, 3076, 2956, 2956, 3076, 3077, 2957, 2957, 3077, 3078, 2958, 2958, 3078, 3079, 2959, 2959, 3079, 3080, 2960, 2960, 3080, 3081, 2961, 2961, 3081, 3082, 2962, 2962, 3082, 3083, 2963, 2963, 3083, 3084, 2964, 2964, 3084, 3085, 2965, 2965, 3085, 3086, 2966, 2966, 3086, 3087, 2967, 2967, 3087, 3088, 2968, 2968, 3088, 3089, 2969, 2969, 3089, 3090, 2970, 2970, 3090, 3091, 2971, 2971, 3091, 3092, 2972, 2972, 3092, 3093, 2973, 2973, 3093, 3094, 2974, 2974, 3094, 3095, 2975, 2975, 3095, 3096, 2976, 2976, 3096, 3097, 2977, 2977, 3097, 3098, 2978, 2978, 3098, 3099, 2979, 2979, 3099, 3100, 2980, 2980, 3100, 3101, 2981, 2981, 3101, 3102, 2982, 2982, 3102, 3103, 2983, 2983, 3103, 3104, 2984, 2984, 3104, 3105, 2985, 2985, 3105, 3106, 2986, 2986, 3106, 3107, 2987, 2987, 3107, 3108, 2988, 2988, 3108, 3109, 2989, 2989, 3109, 3110, 2990, 2990, 3110, 3111, 2991, 2991, 3111, 3112, 2992, 2992, 3112, 3113, 2993, 2993, 3113, 3114, 2994, 2994, 3114, 3115, 2995, 2995, 3115, 3116, 2996, 2996, 3116, 3117, 2997, 2997, 3117, 3118, 2998, 2998, 3118, 3119, 2999, 2999, 3119, 3120, 3000, 3000, 3120, 3001, 2881, 3001, 3121, 3122, 3002, 3002, 3122, 3123, 3003, 3003, 3123, 3124, 3004, 3004, 3124, 3125, 3005, 3005, 3125, 3126, 3006, 3006, 3126, 3127, 3007, 3007, 3127, 3128, 3008, 3008, 3128, 3129, 3009, 3009, 3129, 3130, 3010, 3010, 3130, 3131, 3011, 3011, 3131, 3132, 3012, 3012, 3132, 3133, 3013, 3013, 3133, 3134, 3014, 3014, 3134, 3135, 3015, 3015, 3135, 3136, 3016, 3016, 3136, 3137, 3017, 3017, 3137, 3138, 3018, 3018, 3138, 3139, 3019, 3019, 3139, 3140, 3020, 3020, 3140, 3141, 3021, 3021, 3141, 3142, 3022, 3022, 3142, 3143, 3023, 3023, 3143, 3144, 3024, 3024, 3144, 3145, 3025, 3025, 3145, 3146, 3026, 3026, 3146, 3147, 3027, 3027, 3147, 3148, 3028, 3028, 3148, 3149, 3029, 3029, 3149, 3150, 3030, 3030, 3150, 3151, 3031, 3031, 3151, 3152, 3032, 3032, 3152, 3153, 3033, 3033, 3153, 3154, 3034, 3034, 3154, 3155, 3035, 3035, 3155, 3156, 3036, 3036, 3156, 3157, 3037, 3037, 3157, 3158, 3038, 3038, 3158, 3159, 3039, 3039, 3159, 3160, 3040, 3040, 3160, 3161, 3041, 3041, 3161, 3162, 3042, 3042, 3162, 3163, 3043, 3043, 3163, 3164, 3044, 3044, 3164, 3165, 3045, 3045, 3165, 3166, 3046, 3046, 3166, 3167, 3047, 3047, 3167, 3168, 3048, 3048, 3168, 3169, 3049, 3049, 3169, 3170, 3050, 3050, 3170, 3171, 3051, 3051, 3171, 3172, 3052, 3052, 3172, 3173, 3053, 3053, 3173, 3174, 3054, 3054, 3174, 3175, 3055, 3055, 3175, 3176, 3056, 3056, 3176, 3177, 3057, 3057, 3177, 3178, 3058, 3058, 3178, 3179, 3059, 3059, 3179, 3180, 3060, 3060, 3180, 3181, 3061, 3061, 3181, 3182, 3062, 3062, 3182, 3183, 3063, 3063, 3183, 3184, 3064, 3064, 3184, 3185, 3065, 3065, 3185, 3186, 3066, 3066, 3186, 3187, 3067, 3067, 3187, 3188, 3068, 3068, 3188, 3189, 3069, 3069, 3189, 3190, 3070, 3070, 3190, 3191, 3071, 3071, 3191, 3192, 3072, 3072, 3192, 3193, 3073, 3073, 3193, 3194, 3074, 3074, 3194, 3195, 3075, 3075, 3195, 3196, 3076, 3076, 3196, 3197, 3077, 3077, 3197, 3198, 3078, 3078, 3198, 3199, 3079, 3079, 3199, 3200, 3080, 3080, 3200, 3201, 3081, 3081, 3201, 3202, 3082, 3082, 3202, 3203, 3083, 3083, 3203, 3204, 3084, 3084, 3204, 3205, 3085, 3085, 3205, 3206, 3086, 3086, 3206, 3207, 3087, 3087, 3207, 3208, 3088, 3088, 3208, 3209, 3089, 3089, 3209, 3210, 3090, 3090, 3210, 3211, 3091, 3091, 3211, 3212, 3092, 3092, 3212, 3213, 3093, 3093, 3213, 3214, 3094, 3094, 3214, 3215, 3095, 3095, 3215, 3216, 3096, 3096, 3216, 3217, 3097, 3097, 3217, 3218, 3098, 3098, 3218, 3219, 3099, 3099, 3219, 3220, 3100, 3100, 3220, 3221, 3101, 3101, 3221, 3222, 3102, 3102, 3222, 3223, 3103, 3103, 3223, 3224, 3104, 3104, 3224, 3225, 3105, 3105, 3225, 3226, 3106, 3106, 3226, 3227, 3107, 3107, 3227, 3228, 3108, 3108, 3228, 3229, 3109, 3109, 3229, 3230, 3110, 3110, 3230, 3231, 3111, 3111, 3231, 3232, 3112, 3112, 3232, 3233, 3113, 3113, 3233, 3234, 3114, 3114, 3234, 3235, 3115, 3115, 3235, 3236, 3116, 3116, 3236, 3237, 3117, 3117, 3237, 3238, 3118, 3118, 3238, 3239, 3119, 3119, 3239, 3240, 3120, 3120, 3240, 3121, 3001, 3121, 3241, 3242, 3122, 3122, 3242, 3243, 3123, 3123, 3243, 3244, 3124, 3124, 3244, 3245, 3125, 3125, 3245, 3246, 3126, 3126, 3246, 3247, 3127, 3127, 3247, 3248, 3128, 3128, 3248, 3249, 3129, 3129, 3249, 3250, 3130, 3130, 3250, 3251, 3131, 3131, 3251, 3252, 3132, 3132, 3252, 3253, 3133, 3133, 3253, 3254, 3134, 3134, 3254, 3255, 3135, 3135, 3255, 3256, 3136, 3136, 3256, 3257, 3137, 3137, 3257, 3258, 3138, 3138, 3258, 3259, 3139, 3139, 3259, 3260, 3140, 3140, 3260, 3261, 3141, 3141, 3261, 3262, 3142, 3142, 3262, 3263, 3143, 3143, 3263, 3264, 3144, 3144, 3264, 3265, 3145, 3145, 3265, 3266, 3146, 3146, 3266, 3267, 3147, 3147, 3267, 3268, 3148, 3148, 3268, 3269, 3149, 3149, 3269, 3270, 3150, 3150, 3270, 3271, 3151, 3151, 3271, 3272, 3152, 3152, 3272, 3273, 3153, 3153, 3273, 3274, 3154, 3154, 3274, 3275, 3155, 3155, 3275, 3276, 3156, 3156, 3276, 3277, 3157, 3157, 3277, 3278, 3158, 3158, 3278, 3279, 3159, 3159, 3279, 3280, 3160, 3160, 3280, 3281, 3161, 3161, 3281, 3282, 3162, 3162, 3282, 3283, 3163, 3163, 3283, 3284, 3164, 3164, 3284, 3285, 3165, 3165, 3285, 3286, 3166, 3166, 3286, 3287, 3167, 3167, 3287, 3288, 3168, 3168, 3288, 3289, 3169, 3169, 3289, 3290, 3170, 3170, 3290, 3291, 3171, 3171, 3291, 3292, 3172, 3172, 3292, 3293, 3173, 3173, 3293, 3294, 3174, 3174, 3294, 3295, 3175, 3175, 3295, 3296, 3176, 3176, 3296, 3297, 3177, 3177, 3297, 3298, 3178, 3178, 3298, 3299, 3179, 3179, 3299, 3300, 3180, 3180, 3300, 3301, 3181, 3181, 3301, 3302, 3182, 3182, 3302, 3303, 3183, 3183, 3303, 3304, 3184, 3184, 3304, 3305, 3185, 3185, 3305, 3306, 3186, 3186, 3306, 3307, 3187, 3187, 3307, 3308, 3188, 3188, 3308, 3309, 3189, 3189, 3309, 3310, 3190, 3190, 3310, 3311, 3191, 3191, 3311, 3312, 3192, 3192, 3312, 3313, 3193, 3193, 3313, 3314, 3194, 3194, 3314, 3315, 3195, 3195, 3315, 3316, 3196, 3196, 3316, 3317, 3197, 3197, 3317, 3318, 3198, 3198, 3318, 3319, 3199, 3199, 3319, 3320, 3200, 3200, 3320, 3321, 3201, 3201, 3321, 3322, 3202, 3202, 3322, 3323, 3203, 3203, 3323, 3324, 3204, 3204, 3324, 3325, 3205, 3205, 3325, 3326, 3206, 3206, 3326, 3327, 3207, 3207, 3327, 3328, 3208, 3208, 3328, 3329, 3209, 3209, 3329, 3330, 3210, 3210, 3330, 3331, 3211, 3211, 3331, 3332, 3212, 3212, 3332, 3333, 3213, 3213, 3333, 3334, 3214, 3214, 3334, 3335, 3215, 3215, 3335, 3336, 3216, 3216, 3336, 3337, 3217, 3217, 3337, 3338, 3218, 3218, 3338, 3339, 3219, 3219, 3339, 3340, 3220, 3220, 3340, 3341, 3221, 3221, 3341, 3342, 3222, 3222, 3342, 3343, 3223, 3223, 3343, 3344, 3224, 3224, 3344, 3345, 3225, 3225, 3345, 3346, 3226, 3226, 3346, 3347, 3227, 3227, 3347, 3348, 3228, 3228, 3348, 3349, 3229, 3229, 3349, 3350, 3230, 3230, 3350, 3351, 3231, 3231, 3351, 3352, 3232, 3232, 3352, 3353, 3233, 3233, 3353, 3354, 3234, 3234, 3354, 3355, 3235, 3235, 3355, 3356, 3236, 3236, 3356, 3357, 3237, 3237, 3357, 3358, 3238, 3238, 3358, 3359, 3239, 3239, 3359, 3360, 3240, 3240, 3360, 3241, 3121, 3241, 3361, 3362, 3242, 3242, 3362, 3363, 3243, 3243, 3363, 3364, 3244, 3244, 3364, 3365, 3245, 3245, 3365, 3366, 3246, 3246, 3366, 3367, 3247, 3247, 3367, 3368, 3248, 3248, 3368, 3369, 3249, 3249, 3369, 3370, 3250, 3250, 3370, 3371, 3251, 3251, 3371, 3372, 3252, 3252, 3372, 3373, 3253, 3253, 3373, 3374, 3254, 3254, 3374, 3375, 3255, 3255, 3375, 3376, 3256, 3256, 3376, 3377, 3257, 3257, 3377, 3378, 3258, 3258, 3378, 3379, 3259, 3259, 3379, 3380, 3260, 3260, 3380, 3381, 3261, 3261, 3381, 3382, 3262, 3262, 3382, 3383, 3263, 3263, 3383, 3384, 3264, 3264, 3384, 3385, 3265, 3265, 3385, 3386, 3266, 3266, 3386, 3387, 3267, 3267, 3387, 3388, 3268, 3268, 3388, 3389, 3269, 3269, 3389, 3390, 3270, 3270, 3390, 3391, 3271, 3271, 3391, 3392, 3272, 3272, 3392, 3393, 3273, 3273, 3393, 3394, 3274, 3274, 3394, 3395, 3275, 3275, 3395, 3396, 3276, 3276, 3396, 3397, 3277, 3277, 3397, 3398, 3278, 3278, 3398, 3399, 3279, 3279, 3399, 3400, 3280, 3280, 3400, 3401, 3281, 3281, 3401, 3402, 3282, 3282, 3402, 3403, 3283, 3283, 3403, 3404, 3284, 3284, 3404, 3405, 3285, 3285, 3405, 3406, 3286, 3286, 3406, 3407, 3287, 3287, 3407, 3408, 3288, 3288, 3408, 3409, 3289, 3289, 3409, 3410, 3290, 3290, 3410, 3411, 3291, 3291, 3411, 3412, 3292, 3292, 3412, 3413, 3293, 3293, 3413, 3414, 3294, 3294, 3414, 3415, 3295, 3295, 3415, 3416, 3296, 3296, 3416, 3417, 3297, 3297, 3417, 3418, 3298, 3298, 3418, 3419, 3299, 3299, 3419, 3420, 3300, 3300, 3420, 3421, 3301, 3301, 3421, 3422, 3302, 3302, 3422, 3423, 3303, 3303, 3423, 3424, 3304, 3304, 3424, 3425, 3305, 3305, 3425, 3426, 3306, 3306, 3426, 3427, 3307, 3307, 3427, 3428, 3308, 3308, 3428, 3429, 3309, 3309, 3429, 3430, 3310, 3310, 3430, 3431, 3311, 3311, 3431, 3432, 3312, 3312, 3432, 3433, 3313, 3313, 3433, 3434, 3314, 3314, 3434, 3435, 3315, 3315, 3435, 3436, 3316, 3316, 3436, 3437, 3317, 3317, 3437, 3438, 3318, 3318, 3438, 3439, 3319, 3319, 3439, 3440, 3320, 3320, 3440, 3441, 3321, 3321, 3441, 3442, 3322, 3322, 3442, 3443, 3323, 3323, 3443, 3444, 3324, 3324, 3444, 3445, 3325, 3325, 3445, 3446, 3326, 3326, 3446, 3447, 3327, 3327, 3447, 3448, 3328, 3328, 3448, 3449, 3329, 3329, 3449, 3450, 3330, 3330, 3450, 3451, 3331, 3331, 3451, 3452, 3332, 3332, 3452, 3453, 3333, 3333, 3453, 3454, 3334, 3334, 3454, 3455, 3335, 3335, 3455, 3456, 3336, 3336, 3456, 3457, 3337, 3337, 3457, 3458, 3338, 3338, 3458, 3459, 3339, 3339, 3459, 3460, 3340, 3340, 3460, 3461, 3341, 3341, 3461, 3462, 3342, 3342, 3462, 3463, 3343, 3343, 3463, 3464, 3344, 3344, 3464, 3465, 3345, 3345, 3465, 3466, 3346, 3346, 3466, 3467, 3347, 3347, 3467, 3468, 3348, 3348, 3468, 3469, 3349, 3349, 3469, 3470, 3350, 3350, 3470, 3471, 3351, 3351, 3471, 3472, 3352, 3352, 3472, 3473, 3353, 3353, 3473, 3474, 3354, 3354, 3474, 3475, 3355, 3355, 3475, 3476, 3356, 3356, 3476, 3477, 3357, 3357, 3477, 3478, 3358, 3358, 3478, 3479, 3359, 3359, 3479, 3480, 3360, 3360, 3480, 3361, 3241, 3361, 3481, 3482, 3362, 3362, 3482, 3483, 3363, 3363, 3483, 3484, 3364, 3364, 3484, 3485, 3365, 3365, 3485, 3486, 3366, 3366, 3486, 3487, 3367, 3367, 3487, 3488, 3368, 3368, 3488, 3489, 3369, 3369, 3489, 3490, 3370, 3370, 3490, 3491, 3371, 3371, 3491, 3492, 3372, 3372, 3492, 3493, 3373, 3373, 3493, 3494, 3374, 3374, 3494, 3495, 3375, 3375, 3495, 3496, 3376, 3376, 3496, 3497, 3377, 3377, 3497, 3498, 3378, 3378, 3498, 3499, 3379, 3379, 3499, 3500, 3380, 3380, 3500, 3501, 3381, 3381, 3501, 3502, 3382, 3382, 3502, 3503, 3383, 3383, 3503, 3504, 3384, 3384, 3504, 3505, 3385, 3385, 3505, 3506, 3386, 3386, 3506, 3507, 3387, 3387, 3507, 3508, 3388, 3388, 3508, 3509, 3389, 3389, 3509, 3510, 3390, 3390, 3510, 3511, 3391, 3391, 3511, 3512, 3392, 3392, 3512, 3513, 3393, 3393, 3513, 3514, 3394, 3394, 3514, 3515, 3395, 3395, 3515, 3516, 3396, 3396, 3516, 3517, 3397, 3397, 3517, 3518, 3398, 3398, 3518, 3519, 3399, 3399, 3519, 3520, 3400, 3400, 3520, 3521, 3401, 3401, 3521, 3522, 3402, 3402, 3522, 3523, 3403, 3403, 3523, 3524, 3404, 3404, 3524, 3525, 3405, 3405, 3525, 3526, 3406, 3406, 3526, 3527, 3407, 3407, 3527, 3528, 3408, 3408, 3528, 3529, 3409, 3409, 3529, 3530, 3410, 3410, 3530, 3531, 3411, 3411, 3531, 3532, 3412, 3412, 3532, 3533, 3413, 3413, 3533, 3534, 3414, 3414, 3534, 3535, 3415, 3415, 3535, 3536, 3416, 3416, 3536, 3537, 3417, 3417, 3537, 3538, 3418, 3418, 3538, 3539, 3419, 3419, 3539, 3540, 3420, 3420, 3540, 3541, 3421, 3421, 3541, 3542, 3422, 3422, 3542, 3543, 3423, 3423, 3543, 3544, 3424, 3424, 3544, 3545, 3425, 3425, 3545, 3546, 3426, 3426, 3546, 3547, 3427, 3427, 3547, 3548, 3428, 3428, 3548, 3549, 3429, 3429, 3549, 3550, 3430, 3430, 3550, 3551, 3431, 3431, 3551, 3552, 3432, 3432, 3552, 3553, 3433, 3433, 3553, 3554, 3434, 3434, 3554, 3555, 3435, 3435, 3555, 3556, 3436, 3436, 3556, 3557, 3437, 3437, 3557, 3558, 3438, 3438, 3558, 3559, 3439, 3439, 3559, 3560, 3440, 3440, 3560, 3561, 3441, 3441, 3561, 3562, 3442, 3442, 3562, 3563, 3443, 3443, 3563, 3564, 3444, 3444, 3564, 3565, 3445, 3445, 3565, 3566, 3446, 3446, 3566, 3567, 3447, 3447, 3567, 3568, 3448, 3448, 3568, 3569, 3449, 3449, 3569, 3570, 3450, 3450, 3570, 3571, 3451, 3451, 3571, 3572, 3452, 3452, 3572, 3573, 3453, 3453, 3573, 3574, 3454, 3454, 3574, 3575, 3455, 3455, 3575, 3576, 3456, 3456, 3576, 3577, 3457, 3457, 3577, 3578, 3458, 3458, 3578, 3579, 3459, 3459, 3579, 3580, 3460, 3460, 3580, 3581, 3461, 3461, 3581, 3582, 3462, 3462, 3582, 3583, 3463, 3463, 3583, 3584, 3464, 3464, 3584, 3585, 3465, 3465, 3585, 3586, 3466, 3466, 3586, 3587, 3467, 3467, 3587, 3588, 3468, 3468, 3588, 3589, 3469, 3469, 3589, 3590, 3470, 3470, 3590, 3591, 3471, 3471, 3591, 3592, 3472, 3472, 3592, 3593, 3473, 3473, 3593, 3594, 3474, 3474, 3594, 3595, 3475, 3475, 3595, 3596, 3476, 3476, 3596, 3597, 3477, 3477, 3597, 3598, 3478, 3478, 3598, 3599, 3479, 3479, 3599, 3600, 3480, 3480, 3600, 3481, 3361, 3481, 3601, 3602, 3482, 3482, 3602, 3603, 3483, 3483, 3603, 3604, 3484, 3484, 3604, 3605, 3485, 3485, 3605, 3606, 3486, 3486, 3606, 3607, 3487, 3487, 3607, 3608, 3488, 3488, 3608, 3609, 3489, 3489, 3609, 3610, 3490, 3490, 3610, 3611, 3491, 3491, 3611, 3612, 3492, 3492, 3612, 3613, 3493, 3493, 3613, 3614, 3494, 3494, 3614, 3615, 3495, 3495, 3615, 3616, 3496, 3496, 3616, 3617, 3497, 3497, 3617, 3618, 3498, 3498, 3618, 3619, 3499, 3499, 3619, 3620, 3500, 3500, 3620, 3621, 3501, 3501, 3621, 3622, 3502, 3502, 3622, 3623, 3503, 3503, 3623, 3624, 3504, 3504, 3624, 3625, 3505, 3505, 3625, 3626, 3506, 3506, 3626, 3627, 3507, 3507, 3627, 3628, 3508, 3508, 3628, 3629, 3509, 3509, 3629, 3630, 3510, 3510, 3630, 3631, 3511, 3511, 3631, 3632, 3512, 3512, 3632, 3633, 3513, 3513, 3633, 3634, 3514, 3514, 3634, 3635, 3515, 3515, 3635, 3636, 3516, 3516, 3636, 3637, 3517, 3517, 3637, 3638, 3518, 3518, 3638, 3639, 3519, 3519, 3639, 3640, 3520, 3520, 3640, 3641, 3521, 3521, 3641, 3642, 3522, 3522, 3642, 3643, 3523, 3523, 3643, 3644, 3524, 3524, 3644, 3645, 3525, 3525, 3645, 3646, 3526, 3526, 3646, 3647, 3527, 3527, 3647, 3648, 3528, 3528, 3648, 3649, 3529, 3529, 3649, 3650, 3530, 3530, 3650, 3651, 3531, 3531, 3651, 3652, 3532, 3532, 3652, 3653, 3533, 3533, 3653, 3654, 3534, 3534, 3654, 3655, 3535, 3535, 3655, 3656, 3536, 3536, 3656, 3657, 3537, 3537, 3657, 3658, 3538, 3538, 3658, 3659, 3539, 3539, 3659, 3660, 3540, 3540, 3660, 3661, 3541, 3541, 3661, 3662, 3542, 3542, 3662, 3663, 3543, 3543, 3663, 3664, 3544, 3544, 3664, 3665, 3545, 3545, 3665, 3666, 3546, 3546, 3666, 3667, 3547, 3547, 3667, 3668, 3548, 3548, 3668, 3669, 3549, 3549, 3669, 3670, 3550, 3550, 3670, 3671, 3551, 3551, 3671, 3672, 3552, 3552, 3672, 3673, 3553, 3553, 3673, 3674, 3554, 3554, 3674, 3675, 3555, 3555, 3675, 3676, 3556, 3556, 3676, 3677, 3557, 3557, 3677, 3678, 3558, 3558, 3678, 3679, 3559, 3559, 3679, 3680, 3560, 3560, 3680, 3681, 3561, 3561, 3681, 3682, 3562, 3562, 3682, 3683, 3563, 3563, 3683, 3684, 3564, 3564, 3684, 3685, 3565, 3565, 3685, 3686, 3566, 3566, 3686, 3687, 3567, 3567, 3687, 3688, 3568, 3568, 3688, 3689, 3569, 3569, 3689, 3690, 3570, 3570, 3690, 3691, 3571, 3571, 3691, 3692, 3572, 3572, 3692, 3693, 3573, 3573, 3693, 3694, 3574, 3574, 3694, 3695, 3575, 3575, 3695, 3696, 3576, 3576, 3696, 3697, 3577, 3577, 3697, 3698, 3578, 3578, 3698, 3699, 3579, 3579, 3699, 3700, 3580, 3580, 3700, 3701, 3581, 3581, 3701, 3702, 3582, 3582, 3702, 3703, 3583, 3583, 3703, 3704, 3584, 3584, 3704, 3705, 3585, 3585, 3705, 3706, 3586, 3586, 3706, 3707, 3587, 3587, 3707, 3708, 3588, 3588, 3708, 3709, 3589, 3589, 3709, 3710, 3590, 3590, 3710, 3711, 3591, 3591, 3711, 3712, 3592, 3592, 3712, 3713, 3593, 3593, 3713, 3714, 3594, 3594, 3714, 3715, 3595, 3595, 3715, 3716, 3596, 3596, 3716, 3717, 3597, 3597, 3717, 3718, 3598, 3598, 3718, 3719, 3599, 3599, 3719, 3720, 3600, 3600, 3720, 3601, 3481, 3601, 3721, 3722, 3602, 3602, 3722, 3723, 3603, 3603, 3723, 3724, 3604, 3604, 3724, 3725, 3605, 3605, 3725, 3726, 3606, 3606, 3726, 3727, 3607, 3607, 3727, 3728, 3608, 3608, 3728, 3729, 3609, 3609, 3729, 3730, 3610, 3610, 3730, 3731, 3611, 3611, 3731, 3732, 3612, 3612, 3732, 3733, 3613, 3613, 3733, 3734, 3614, 3614, 3734, 3735, 3615, 3615, 3735, 3736, 3616, 3616, 3736, 3737, 3617, 3617, 3737, 3738, 3618, 3618, 3738, 3739, 3619, 3619, 3739, 3740, 3620, 3620, 3740, 3741, 3621, 3621, 3741, 3742, 3622, 3622, 3742, 3743, 3623, 3623, 3743, 3744, 3624, 3624, 3744, 3745, 3625, 3625, 3745, 3746, 3626, 3626, 3746, 3747, 3627, 3627, 3747, 3748, 3628, 3628, 3748, 3749, 3629, 3629, 3749, 3750, 3630, 3630, 3750, 3751, 3631, 3631, 3751, 3752, 3632, 3632, 3752, 3753, 3633, 3633, 3753, 3754, 3634, 3634, 3754, 3755, 3635, 3635, 3755, 3756, 3636, 3636, 3756, 3757, 3637, 3637, 3757, 3758, 3638, 3638, 3758, 3759, 3639, 3639, 3759, 3760, 3640, 3640, 3760, 3761, 3641, 3641, 3761, 3762, 3642, 3642, 3762, 3763, 3643, 3643, 3763, 3764, 3644, 3644, 3764, 3765, 3645, 3645, 3765, 3766, 3646, 3646, 3766, 3767, 3647, 3647, 3767, 3768, 3648, 3648, 3768, 3769, 3649, 3649, 3769, 3770, 3650, 3650, 3770, 3771, 3651, 3651, 3771, 3772, 3652, 3652, 3772, 3773, 3653, 3653, 3773, 3774, 3654, 3654, 3774, 3775, 3655, 3655, 3775, 3776, 3656, 3656, 3776, 3777, 3657, 3657, 3777, 3778, 3658, 3658, 3778, 3779, 3659, 3659, 3779, 3780, 3660, 3660, 3780, 3781, 3661, 3661, 3781, 3782, 3662, 3662, 3782, 3783, 3663, 3663, 3783, 3784, 3664, 3664, 3784, 3785, 3665, 3665, 3785, 3786, 3666, 3666, 3786, 3787, 3667, 3667, 3787, 3788, 3668, 3668, 3788, 3789, 3669, 3669, 3789, 3790, 3670, 3670, 3790, 3791, 3671, 3671, 3791, 3792, 3672, 3672, 3792, 3793, 3673, 3673, 3793, 3794, 3674, 3674, 3794, 3795, 3675, 3675, 3795, 3796, 3676, 3676, 3796, 3797, 3677, 3677, 3797, 3798, 3678, 3678, 3798, 3799, 3679, 3679, 3799, 3800, 3680, 3680, 3800, 3801, 3681, 3681, 3801, 3802, 3682, 3682, 3802, 3803, 3683, 3683, 3803, 3804, 3684, 3684, 3804, 3805, 3685, 3685, 3805, 3806, 3686, 3686, 3806, 3807, 3687, 3687, 3807, 3808, 3688, 3688, 3808, 3809, 3689, 3689, 3809, 3810, 3690, 3690, 3810, 3811, 3691, 3691, 3811, 3812, 3692, 3692, 3812, 3813, 3693, 3693, 3813, 3814, 3694, 3694, 3814, 3815, 3695, 3695, 3815, 3816, 3696, 3696, 3816, 3817, 3697, 3697, 3817, 3818, 3698, 3698, 3818, 3819, 3699, 3699, 3819, 3820, 3700, 3700, 3820, 3821, 3701, 3701, 3821, 3822, 3702, 3702, 3822, 3823, 3703, 3703, 3823, 3824, 3704, 3704, 3824, 3825, 3705, 3705, 3825, 3826, 3706, 3706, 3826, 3827, 3707, 3707, 3827, 3828, 3708, 3708, 3828, 3829, 3709, 3709, 3829, 3830, 3710, 3710, 3830, 3831, 3711, 3711, 3831, 3832, 3712, 3712, 3832, 3833, 3713, 3713, 3833, 3834, 3714, 3714, 3834, 3835, 3715, 3715, 3835, 3836, 3716, 3716, 3836, 3837, 3717, 3717, 3837, 3838, 3718, 3718, 3838, 3839, 3719, 3719, 3839, 3840, 3720, 3720, 3840, 3721, 3601, 3721, 3841, 3842, 3722, 3722, 3842, 3843, 3723, 3723, 3843, 3844, 3724, 3724, 3844, 3845, 3725, 3725, 3845, 3846, 3726, 3726, 3846, 3847, 3727, 3727, 3847, 3848, 3728, 3728, 3848, 3849, 3729, 3729, 3849, 3850, 3730, 3730, 3850, 3851, 3731, 3731, 3851, 3852, 3732, 3732, 3852, 3853, 3733, 3733, 3853, 3854, 3734, 3734, 3854, 3855, 3735, 3735, 3855, 3856, 3736, 3736, 3856, 3857, 3737, 3737, 3857, 3858, 3738, 3738, 3858, 3859, 3739, 3739, 3859, 3860, 3740, 3740, 3860, 3861, 3741, 3741, 3861, 3862, 3742, 3742, 3862, 3863, 3743, 3743, 3863, 3864, 3744, 3744, 3864, 3865, 3745, 3745, 3865, 3866, 3746, 3746, 3866, 3867, 3747, 3747, 3867, 3868, 3748, 3748, 3868, 3869, 3749, 3749, 3869, 3870, 3750, 3750, 3870, 3871, 3751, 3751, 3871, 3872, 3752, 3752, 3872, 3873, 3753, 3753, 3873, 3874, 3754, 3754, 3874, 3875, 3755, 3755, 3875, 3876, 3756, 3756, 3876, 3877, 3757, 3757, 3877, 3878, 3758, 3758, 3878, 3879, 3759, 3759, 3879, 3880, 3760, 3760, 3880, 3881, 3761, 3761, 3881, 3882, 3762, 3762, 3882, 3883, 3763, 3763, 3883, 3884, 3764, 3764, 3884, 3885, 3765, 3765, 3885, 3886, 3766, 3766, 3886, 3887, 3767, 3767, 3887, 3888, 3768, 3768, 3888, 3889, 3769, 3769, 3889, 3890, 3770, 3770, 3890, 3891, 3771, 3771, 3891, 3892, 3772, 3772, 3892, 3893, 3773, 3773, 3893, 3894, 3774, 3774, 3894, 3895, 3775, 3775, 3895, 3896, 3776, 3776, 3896, 3897, 3777, 3777, 3897, 3898, 3778, 3778, 3898, 3899, 3779, 3779, 3899, 3900, 3780, 3780, 3900, 3901, 3781, 3781, 3901, 3902, 3782, 3782, 3902, 3903, 3783, 3783, 3903, 3904, 3784, 3784, 3904, 3905, 3785, 3785, 3905, 3906, 3786, 3786, 3906, 3907, 3787, 3787, 3907, 3908, 3788, 3788, 3908, 3909, 3789, 3789, 3909, 3910, 3790, 3790, 3910, 3911, 3791, 3791, 3911, 3912, 3792, 3792, 3912, 3913, 3793, 3793, 3913, 3914, 3794, 3794, 3914, 3915, 3795, 3795, 3915, 3916, 3796, 3796, 3916, 3917, 3797, 3797, 3917, 3918, 3798, 3798, 3918, 3919, 3799, 3799, 3919, 3920, 3800, 3800, 3920, 3921, 3801, 3801, 3921, 3922, 3802, 3802, 3922, 3923, 3803, 3803, 3923, 3924, 3804, 3804, 3924, 3925, 3805, 3805, 3925, 3926, 3806, 3806, 3926, 3927, 3807, 3807, 3927, 3928, 3808, 3808, 3928, 3929, 3809, 3809, 3929, 3930, 3810, 3810, 3930, 3931, 3811, 3811, 3931, 3932, 3812, 3812, 3932, 3933, 3813, 3813, 3933, 3934, 3814, 3814, 3934, 3935, 3815, 3815, 3935, 3936, 3816, 3816, 3936, 3937, 3817, 3817, 3937, 3938, 3818, 3818, 3938, 3939, 3819, 3819, 3939, 3940, 3820, 3820, 3940, 3941, 3821, 3821, 3941, 3942, 3822, 3822, 3942, 3943, 3823, 3823, 3943, 3944, 3824, 3824, 3944, 3945, 3825, 3825, 3945, 3946, 3826, 3826, 3946, 3947, 3827, 3827, 3947, 3948, 3828, 3828, 3948, 3949, 3829, 3829, 3949, 3950, 3830, 3830, 3950, 3951, 3831, 3831, 3951, 3952, 3832, 3832, 3952, 3953, 3833, 3833, 3953, 3954, 3834, 3834, 3954, 3955, 3835, 3835, 3955, 3956, 3836, 3836, 3956, 3957, 3837, 3837, 3957, 3958, 3838, 3838, 3958, 3959, 3839, 3839, 3959, 3960, 3840, 3840, 3960, 3841, 3721, 3841, 3961, 3962, 3842, 3842, 3962, 3963, 3843, 3843, 3963, 3964, 3844, 3844, 3964, 3965, 3845, 3845, 3965, 3966, 3846, 3846, 3966, 3967, 3847, 3847, 3967, 3968, 3848, 3848, 3968, 3969, 3849, 3849, 3969, 3970, 3850, 3850, 3970, 3971, 3851, 3851, 3971, 3972, 3852, 3852, 3972, 3973, 3853, 3853, 3973, 3974, 3854, 3854, 3974, 3975, 3855, 3855, 3975, 3976, 3856, 3856, 3976, 3977, 3857, 3857, 3977, 3978, 3858, 3858, 3978, 3979, 3859, 3859, 3979, 3980, 3860, 3860, 3980, 3981, 3861, 3861, 3981, 3982, 3862, 3862, 3982, 3983, 3863, 3863, 3983, 3984, 3864, 3864, 3984, 3985, 3865, 3865, 3985, 3986, 3866, 3866, 3986, 3987, 3867, 3867, 3987, 3988, 3868, 3868, 3988, 3989, 3869, 3869, 3989, 3990, 3870, 3870, 3990, 3991, 3871, 3871, 3991, 3992, 3872, 3872, 3992, 3993, 3873, 3873, 3993, 3994, 3874, 3874, 3994, 3995, 3875, 3875, 3995, 3996, 3876, 3876, 3996, 3997, 3877, 3877, 3997, 3998, 3878, 3878, 3998, 3999, 3879, 3879, 3999, 4000, 3880, 3880, 4000, 4001, 3881, 3881, 4001, 4002, 3882, 3882, 4002, 4003, 3883, 3883, 4003, 4004, 3884, 3884, 4004, 4005, 3885, 3885, 4005, 4006, 3886, 3886, 4006, 4007, 3887, 3887, 4007, 4008, 3888, 3888, 4008, 4009, 3889, 3889, 4009, 4010, 3890, 3890, 4010, 4011, 3891, 3891, 4011, 4012, 3892, 3892, 4012, 4013, 3893, 3893, 4013, 4014, 3894, 3894, 4014, 4015, 3895, 3895, 4015, 4016, 3896, 3896, 4016, 4017, 3897, 3897, 4017, 4018, 3898, 3898, 4018, 4019, 3899, 3899, 4019, 4020, 3900, 3900, 4020, 4021, 3901, 3901, 4021, 4022, 3902, 3902, 4022, 4023, 3903, 3903, 4023, 4024, 3904, 3904, 4024, 4025, 3905, 3905, 4025, 4026, 3906, 3906, 4026, 4027, 3907, 3907, 4027, 4028, 3908, 3908, 4028, 4029, 3909, 3909, 4029, 4030, 3910, 3910, 4030, 4031, 3911, 3911, 4031, 4032, 3912, 3912, 4032, 4033, 3913, 3913, 4033, 4034, 3914, 3914, 4034, 4035, 3915, 3915, 4035, 4036, 3916, 3916, 4036, 4037, 3917, 3917, 4037, 4038, 3918, 3918, 4038, 4039, 3919, 3919, 4039, 4040, 3920, 3920, 4040, 4041, 3921, 3921, 4041, 4042, 3922, 3922, 4042, 4043, 3923, 3923, 4043, 4044, 3924, 3924, 4044, 4045, 3925, 3925, 4045, 4046, 3926, 3926, 4046, 4047, 3927, 3927, 4047, 4048, 3928, 3928, 4048, 4049, 3929, 3929, 4049, 4050, 3930, 3930, 4050, 4051, 3931, 3931, 4051, 4052, 3932, 3932, 4052, 4053, 3933, 3933, 4053, 4054, 3934, 3934, 4054, 4055, 3935, 3935, 4055, 4056, 3936, 3936, 4056, 4057, 3937, 3937, 4057, 4058, 3938, 3938, 4058, 4059, 3939, 3939, 4059, 4060, 3940, 3940, 4060, 4061, 3941, 3941, 4061, 4062, 3942, 3942, 4062, 4063, 3943, 3943, 4063, 4064, 3944, 3944, 4064, 4065, 3945, 3945, 4065, 4066, 3946, 3946, 4066, 4067, 3947, 3947, 4067, 4068, 3948, 3948, 4068, 4069, 3949, 3949, 4069, 4070, 3950, 3950, 4070, 4071, 3951, 3951, 4071, 4072, 3952, 3952, 4072, 4073, 3953, 3953, 4073, 4074, 3954, 3954, 4074, 4075, 3955, 3955, 4075, 4076, 3956, 3956, 4076, 4077, 3957, 3957, 4077, 4078, 3958, 3958, 4078, 4079, 3959, 3959, 4079, 4080, 3960, 3960, 4080, 3961, 3841, 3961, 4081, 4082, 3962, 3962, 4082, 4083, 3963, 3963, 4083, 4084, 3964, 3964, 4084, 4085, 3965, 3965, 4085, 4086, 3966, 3966, 4086, 4087, 3967, 3967, 4087, 4088, 3968, 3968, 4088, 4089, 3969, 3969, 4089, 4090, 3970, 3970, 4090, 4091, 3971, 3971, 4091, 4092, 3972, 3972, 4092, 4093, 3973, 3973, 4093, 4094, 3974, 3974, 4094, 4095, 3975, 3975, 4095, 4096, 3976, 3976, 4096, 4097, 3977, 3977, 4097, 4098, 3978, 3978, 4098, 4099, 3979, 3979, 4099, 4100, 3980, 3980, 4100, 4101, 3981, 3981, 4101, 4102, 3982, 3982, 4102, 4103, 3983, 3983, 4103, 4104, 3984, 3984, 4104, 4105, 3985, 3985, 4105, 4106, 3986, 3986, 4106, 4107, 3987, 3987, 4107, 4108, 3988, 3988, 4108, 4109, 3989, 3989, 4109, 4110, 3990, 3990, 4110, 4111, 3991, 3991, 4111, 4112, 3992, 3992, 4112, 4113, 3993, 3993, 4113, 4114, 3994, 3994, 4114, 4115, 3995, 3995, 4115, 4116, 3996, 3996, 4116, 4117, 3997, 3997, 4117, 4118, 3998, 3998, 4118, 4119, 3999, 3999, 4119, 4120, 4000, 4000, 4120, 4121, 4001, 4001, 4121, 4122, 4002, 4002, 4122, 4123, 4003, 4003, 4123, 4124, 4004, 4004, 4124, 4125, 4005, 4005, 4125, 4126, 4006, 4006, 4126, 4127, 4007, 4007, 4127, 4128, 4008, 4008, 4128, 4129, 4009, 4009, 4129, 4130, 4010, 4010, 4130, 4131, 4011, 4011, 4131, 4132, 4012, 4012, 4132, 4133, 4013, 4013, 4133, 4134, 4014, 4014, 4134, 4135, 4015, 4015, 4135, 4136, 4016, 4016, 4136, 4137, 4017, 4017, 4137, 4138, 4018, 4018, 4138, 4139, 4019, 4019, 4139, 4140, 4020, 4020, 4140, 4141, 4021, 4021, 4141, 4142, 4022, 4022, 4142, 4143, 4023, 4023, 4143, 4144, 4024, 4024, 4144, 4145, 4025, 4025, 4145, 4146, 4026, 4026, 4146, 4147, 4027, 4027, 4147, 4148, 4028, 4028, 4148, 4149, 4029, 4029, 4149, 4150, 4030, 4030, 4150, 4151, 4031, 4031, 4151, 4152, 4032, 4032, 4152, 4153, 4033, 4033, 4153, 4154, 4034, 4034, 4154, 4155, 4035, 4035, 4155, 4156, 4036, 4036, 4156, 4157, 4037, 4037, 4157, 4158, 4038, 4038, 4158, 4159, 4039, 4039, 4159, 4160, 4040, 4040, 4160, 4161, 4041, 4041, 4161, 4162, 4042, 4042, 4162, 4163, 4043, 4043, 4163, 4164, 4044, 4044, 4164, 4165, 4045, 4045, 4165, 4166, 4046, 4046, 4166, 4167, 4047, 4047, 4167, 4168, 4048, 4048, 4168, 4169, 4049, 4049, 4169, 4170, 4050, 4050, 4170, 4171, 4051, 4051, 4171, 4172, 4052, 4052, 4172, 4173, 4053, 4053, 4173, 4174, 4054, 4054, 4174, 4175, 4055, 4055, 4175, 4176, 4056, 4056, 4176, 4177, 4057, 4057, 4177, 4178, 4058, 4058, 4178, 4179, 4059, 4059, 4179, 4180, 4060, 4060, 4180, 4181, 4061, 4061, 4181, 4182, 4062, 4062, 4182, 4183, 4063, 4063, 4183, 4184, 4064, 4064, 4184, 4185, 4065, 4065, 4185, 4186, 4066, 4066, 4186, 4187, 4067, 4067, 4187, 4188, 4068, 4068, 4188, 4189, 4069, 4069, 4189, 4190, 4070, 4070, 4190, 4191, 4071, 4071, 4191, 4192, 4072, 4072, 4192, 4193, 4073, 4073, 4193, 4194, 4074, 4074, 4194, 4195, 4075, 4075, 4195, 4196, 4076, 4076, 4196, 4197, 4077, 4077, 4197, 4198, 4078, 4078, 4198, 4199, 4079, 4079, 4199, 4200, 4080, 4080, 4200, 4081, 3961, 4081, 4201, 4202, 4082, 4082, 4202, 4203, 4083, 4083, 4203, 4204, 4084, 4084, 4204, 4205, 4085, 4085, 4205, 4206, 4086, 4086, 4206, 4207, 4087, 4087, 4207, 4208, 4088, 4088, 4208, 4209, 4089, 4089, 4209, 4210, 4090, 4090, 4210, 4211, 4091, 4091, 4211, 4212, 4092, 4092, 4212, 4213, 4093, 4093, 4213, 4214, 4094, 4094, 4214, 4215, 4095, 4095, 4215, 4216, 4096, 4096, 4216, 4217, 4097, 4097, 4217, 4218, 4098, 4098, 4218, 4219, 4099, 4099, 4219, 4220, 4100, 4100, 4220, 4221, 4101, 4101, 4221, 4222, 4102, 4102, 4222, 4223, 4103, 4103, 4223, 4224, 4104, 4104, 4224, 4225, 4105, 4105, 4225, 4226, 4106, 4106, 4226, 4227, 4107, 4107, 4227, 4228, 4108, 4108, 4228, 4229, 4109, 4109, 4229, 4230, 4110, 4110, 4230, 4231, 4111, 4111, 4231, 4232, 4112, 4112, 4232, 4233, 4113, 4113, 4233, 4234, 4114, 4114, 4234, 4235, 4115, 4115, 4235, 4236, 4116, 4116, 4236, 4237, 4117, 4117, 4237, 4238, 4118, 4118, 4238, 4239, 4119, 4119, 4239, 4240, 4120, 4120, 4240, 4241, 4121, 4121, 4241, 4242, 4122, 4122, 4242, 4243, 4123, 4123, 4243, 4244, 4124, 4124, 4244, 4245, 4125, 4125, 4245, 4246, 4126, 4126, 4246, 4247, 4127, 4127, 4247, 4248, 4128, 4128, 4248, 4249, 4129, 4129, 4249, 4250, 4130, 4130, 4250, 4251, 4131, 4131, 4251, 4252, 4132, 4132, 4252, 4253, 4133, 4133, 4253, 4254, 4134, 4134, 4254, 4255, 4135, 4135, 4255, 4256, 4136, 4136, 4256, 4257, 4137, 4137, 4257, 4258, 4138, 4138, 4258, 4259, 4139, 4139, 4259, 4260, 4140, 4140, 4260, 4261, 4141, 4141, 4261, 4262, 4142, 4142, 4262, 4263, 4143, 4143, 4263, 4264, 4144, 4144, 4264, 4265, 4145, 4145, 4265, 4266, 4146, 4146, 4266, 4267, 4147, 4147, 4267, 4268, 4148, 4148, 4268, 4269, 4149, 4149, 4269, 4270, 4150, 4150, 4270, 4271, 4151, 4151, 4271, 4272, 4152, 4152, 4272, 4273, 4153, 4153, 4273, 4274, 4154, 4154, 4274, 4275, 4155, 4155, 4275, 4276, 4156, 4156, 4276, 4277, 4157, 4157, 4277, 4278, 4158, 4158, 4278, 4279, 4159, 4159, 4279, 4280, 4160, 4160, 4280, 4281, 4161, 4161, 4281, 4282, 4162, 4162, 4282, 4283, 4163, 4163, 4283, 4284, 4164, 4164, 4284, 4285, 4165, 4165, 4285, 4286, 4166, 4166, 4286, 4287, 4167, 4167, 4287, 4288, 4168, 4168, 4288, 4289, 4169, 4169, 4289, 4290, 4170, 4170, 4290, 4291, 4171, 4171, 4291, 4292, 4172, 4172, 4292, 4293, 4173, 4173, 4293, 4294, 4174, 4174, 4294, 4295, 4175, 4175, 4295, 4296, 4176, 4176, 4296, 4297, 4177, 4177, 4297, 4298, 4178, 4178, 4298, 4299, 4179, 4179, 4299, 4300, 4180, 4180, 4300, 4301, 4181, 4181, 4301, 4302, 4182, 4182, 4302, 4303, 4183, 4183, 4303, 4304, 4184, 4184, 4304, 4305, 4185, 4185, 4305, 4306, 4186, 4186, 4306, 4307, 4187, 4187, 4307, 4308, 4188, 4188, 4308, 4309, 4189, 4189, 4309, 4310, 4190, 4190, 4310, 4311, 4191, 4191, 4311, 4312, 4192, 4192, 4312, 4313, 4193, 4193, 4313, 4314, 4194, 4194, 4314, 4315, 4195, 4195, 4315, 4316, 4196, 4196, 4316, 4317, 4197, 4197, 4317, 4318, 4198, 4198, 4318, 4319, 4199, 4199, 4319, 4320, 4200, 4200, 4320, 4201, 4081, 4201, 4321, 4322, 4202, 4202, 4322, 4323, 4203, 4203, 4323, 4324, 4204, 4204, 4324, 4325, 4205, 4205, 4325, 4326, 4206, 4206, 4326, 4327, 4207, 4207, 4327, 4328, 4208, 4208, 4328, 4329, 4209, 4209, 4329, 4330, 4210, 4210, 4330, 4331, 4211, 4211, 4331, 4332, 4212, 4212, 4332, 4333, 4213, 4213, 4333, 4334, 4214, 4214, 4334, 4335, 4215, 4215, 4335, 4336, 4216, 4216, 4336, 4337, 4217, 4217, 4337, 4338, 4218, 4218, 4338, 4339, 4219, 4219, 4339, 4340, 4220, 4220, 4340, 4341, 4221, 4221, 4341, 4342, 4222, 4222, 4342, 4343, 4223, 4223, 4343, 4344, 4224, 4224, 4344, 4345, 4225, 4225, 4345, 4346, 4226, 4226, 4346, 4347, 4227, 4227, 4347, 4348, 4228, 4228, 4348, 4349, 4229, 4229, 4349, 4350, 4230, 4230, 4350, 4351, 4231, 4231, 4351, 4352, 4232, 4232, 4352, 4353, 4233, 4233, 4353, 4354, 4234, 4234, 4354, 4355, 4235, 4235, 4355, 4356, 4236, 4236, 4356, 4357, 4237, 4237, 4357, 4358, 4238, 4238, 4358, 4359, 4239, 4239, 4359, 4360, 4240, 4240, 4360, 4361, 4241, 4241, 4361, 4362, 4242, 4242, 4362, 4363, 4243, 4243, 4363, 4364, 4244, 4244, 4364, 4365, 4245, 4245, 4365, 4366, 4246, 4246, 4366, 4367, 4247, 4247, 4367, 4368, 4248, 4248, 4368, 4369, 4249, 4249, 4369, 4370, 4250, 4250, 4370, 4371, 4251, 4251, 4371, 4372, 4252, 4252, 4372, 4373, 4253, 4253, 4373, 4374, 4254, 4254, 4374, 4375, 4255, 4255, 4375, 4376, 4256, 4256, 4376, 4377, 4257, 4257, 4377, 4378, 4258, 4258, 4378, 4379, 4259, 4259, 4379, 4380, 4260, 4260, 4380, 4381, 4261, 4261, 4381, 4382, 4262, 4262, 4382, 4383, 4263, 4263, 4383, 4384, 4264, 4264, 4384, 4385, 4265, 4265, 4385, 4386, 4266, 4266, 4386, 4387, 4267, 4267, 4387, 4388, 4268, 4268, 4388, 4389, 4269, 4269, 4389, 4390, 4270, 4270, 4390, 4391, 4271, 4271, 4391, 4392, 4272, 4272, 4392, 4393, 4273, 4273, 4393, 4394, 4274, 4274, 4394, 4395, 4275, 4275, 4395, 4396, 4276, 4276, 4396, 4397, 4277, 4277, 4397, 4398, 4278, 4278, 4398, 4399, 4279, 4279, 4399, 4400, 4280, 4280, 4400, 4401, 4281, 4281, 4401, 4402, 4282, 4282, 4402, 4403, 4283, 4283, 4403, 4404, 4284, 4284, 4404, 4405, 4285, 4285, 4405, 4406, 4286, 4286, 4406, 4407, 4287, 4287, 4407, 4408, 4288, 4288, 4408, 4409, 4289, 4289, 4409, 4410, 4290, 4290, 4410, 4411, 4291, 4291, 4411, 4412, 4292, 4292, 4412, 4413, 4293, 4293, 4413, 4414, 4294, 4294, 4414, 4415, 4295, 4295, 4415, 4416, 4296, 4296, 4416, 4417, 4297, 4297, 4417, 4418, 4298, 4298, 4418, 4419, 4299, 4299, 4419, 4420, 4300, 4300, 4420, 4421, 4301, 4301, 4421, 4422, 4302, 4302, 4422, 4423, 4303, 4303, 4423, 4424, 4304, 4304, 4424, 4425, 4305, 4305, 4425, 4426, 4306, 4306, 4426, 4427, 4307, 4307, 4427, 4428, 4308, 4308, 4428, 4429, 4309, 4309, 4429, 4430, 4310, 4310, 4430, 4431, 4311, 4311, 4431, 4432, 4312, 4312, 4432, 4433, 4313, 4313, 4433, 4434, 4314, 4314, 4434, 4435, 4315, 4315, 4435, 4436, 4316, 4316, 4436, 4437, 4317, 4317, 4437, 4438, 4318, 4318, 4438, 4439, 4319, 4319, 4439, 4440, 4320, 4320, 4440, 4321, 4201, 4321, 4441, 4442, 4322, 4322, 4442, 4443, 4323, 4323, 4443, 4444, 4324, 4324, 4444, 4445, 4325, 4325, 4445, 4446, 4326, 4326, 4446, 4447, 4327, 4327, 4447, 4448, 4328, 4328, 4448, 4449, 4329, 4329, 4449, 4450, 4330, 4330, 4450, 4451, 4331, 4331, 4451, 4452, 4332, 4332, 4452, 4453, 4333, 4333, 4453, 4454, 4334, 4334, 4454, 4455, 4335, 4335, 4455, 4456, 4336, 4336, 4456, 4457, 4337, 4337, 4457, 4458, 4338, 4338, 4458, 4459, 4339, 4339, 4459, 4460, 4340, 4340, 4460, 4461, 4341, 4341, 4461, 4462, 4342, 4342, 4462, 4463, 4343, 4343, 4463, 4464, 4344, 4344, 4464, 4465, 4345, 4345, 4465, 4466, 4346, 4346, 4466, 4467, 4347, 4347, 4467, 4468, 4348, 4348, 4468, 4469, 4349, 4349, 4469, 4470, 4350, 4350, 4470, 4471, 4351, 4351, 4471, 4472, 4352, 4352, 4472, 4473, 4353, 4353, 4473, 4474, 4354, 4354, 4474, 4475, 4355, 4355, 4475, 4476, 4356, 4356, 4476, 4477, 4357, 4357, 4477, 4478, 4358, 4358, 4478, 4479, 4359, 4359, 4479, 4480, 4360, 4360, 4480, 4481, 4361, 4361, 4481, 4482, 4362, 4362, 4482, 4483, 4363, 4363, 4483, 4484, 4364, 4364, 4484, 4485, 4365, 4365, 4485, 4486, 4366, 4366, 4486, 4487, 4367, 4367, 4487, 4488, 4368, 4368, 4488, 4489, 4369, 4369, 4489, 4490, 4370, 4370, 4490, 4491, 4371, 4371, 4491, 4492, 4372, 4372, 4492, 4493, 4373, 4373, 4493, 4494, 4374, 4374, 4494, 4495, 4375, 4375, 4495, 4496, 4376, 4376, 4496, 4497, 4377, 4377, 4497, 4498, 4378, 4378, 4498, 4499, 4379, 4379, 4499, 4500, 4380, 4380, 4500, 4501, 4381, 4381, 4501, 4502, 4382, 4382, 4502, 4503, 4383, 4383, 4503, 4504, 4384, 4384, 4504, 4505, 4385, 4385, 4505, 4506, 4386, 4386, 4506, 4507, 4387, 4387, 4507, 4508, 4388, 4388, 4508, 4509, 4389, 4389, 4509, 4510, 4390, 4390, 4510, 4511, 4391, 4391, 4511, 4512, 4392, 4392, 4512, 4513, 4393, 4393, 4513, 4514, 4394, 4394, 4514, 4515, 4395, 4395, 4515, 4516, 4396, 4396, 4516, 4517, 4397, 4397, 4517, 4518, 4398, 4398, 4518, 4519, 4399, 4399, 4519, 4520, 4400, 4400, 4520, 4521, 4401, 4401, 4521, 4522, 4402, 4402, 4522, 4523, 4403, 4403, 4523, 4524, 4404, 4404, 4524, 4525, 4405, 4405, 4525, 4526, 4406, 4406, 4526, 4527, 4407, 4407, 4527, 4528, 4408, 4408, 4528, 4529, 4409, 4409, 4529, 4530, 4410, 4410, 4530, 4531, 4411, 4411, 4531, 4532, 4412, 4412, 4532, 4533, 4413, 4413, 4533, 4534, 4414, 4414, 4534, 4535, 4415, 4415, 4535, 4536, 4416, 4416, 4536, 4537, 4417, 4417, 4537, 4538, 4418, 4418, 4538, 4539, 4419, 4419, 4539, 4540, 4420, 4420, 4540, 4541, 4421, 4421, 4541, 4542, 4422, 4422, 4542, 4543, 4423, 4423, 4543, 4544, 4424, 4424, 4544, 4545, 4425, 4425, 4545, 4546, 4426, 4426, 4546, 4547, 4427, 4427, 4547, 4548, 4428, 4428, 4548, 4549, 4429, 4429, 4549, 4550, 4430, 4430, 4550, 4551, 4431, 4431, 4551, 4552, 4432, 4432, 4552, 4553, 4433, 4433, 4553, 4554, 4434, 4434, 4554, 4555, 4435, 4435, 4555, 4556, 4436, 4436, 4556, 4557, 4437, 4437, 4557, 4558, 4438, 4438, 4558, 4559, 4439, 4439, 4559, 4560, 4440, 4440, 4560, 4441, 4321, 4441, 4561, 4562, 4442, 4442, 4562, 4563, 4443, 4443, 4563, 4564, 4444, 4444, 4564, 4565, 4445, 4445, 4565, 4566, 4446, 4446, 4566, 4567, 4447, 4447, 4567, 4568, 4448, 4448, 4568, 4569, 4449, 4449, 4569, 4570, 4450, 4450, 4570, 4571, 4451, 4451, 4571, 4572, 4452, 4452, 4572, 4573, 4453, 4453, 4573, 4574, 4454, 4454, 4574, 4575, 4455, 4455, 4575, 4576, 4456, 4456, 4576, 4577, 4457, 4457, 4577, 4578, 4458, 4458, 4578, 4579, 4459, 4459, 4579, 4580, 4460, 4460, 4580, 4581, 4461, 4461, 4581, 4582, 4462, 4462, 4582, 4583, 4463, 4463, 4583, 4584, 4464, 4464, 4584, 4585, 4465, 4465, 4585, 4586, 4466, 4466, 4586, 4587, 4467, 4467, 4587, 4588, 4468, 4468, 4588, 4589, 4469, 4469, 4589, 4590, 4470, 4470, 4590, 4591, 4471, 4471, 4591, 4592, 4472, 4472, 4592, 4593, 4473, 4473, 4593, 4594, 4474, 4474, 4594, 4595, 4475, 4475, 4595, 4596, 4476, 4476, 4596, 4597, 4477, 4477, 4597, 4598, 4478, 4478, 4598, 4599, 4479, 4479, 4599, 4600, 4480, 4480, 4600, 4601, 4481, 4481, 4601, 4602, 4482, 4482, 4602, 4603, 4483, 4483, 4603, 4604, 4484, 4484, 4604, 4605, 4485, 4485, 4605, 4606, 4486, 4486, 4606, 4607, 4487, 4487, 4607, 4608, 4488, 4488, 4608, 4609, 4489, 4489, 4609, 4610, 4490, 4490, 4610, 4611, 4491, 4491, 4611, 4612, 4492, 4492, 4612, 4613, 4493, 4493, 4613, 4614, 4494, 4494, 4614, 4615, 4495, 4495, 4615, 4616, 4496, 4496, 4616, 4617, 4497, 4497, 4617, 4618, 4498, 4498, 4618, 4619, 4499, 4499, 4619, 4620, 4500, 4500, 4620, 4621, 4501, 4501, 4621, 4622, 4502, 4502, 4622, 4623, 4503, 4503, 4623, 4624, 4504, 4504, 4624, 4625, 4505, 4505, 4625, 4626, 4506, 4506, 4626, 4627, 4507, 4507, 4627, 4628, 4508, 4508, 4628, 4629, 4509, 4509, 4629, 4630, 4510, 4510, 4630, 4631, 4511, 4511, 4631, 4632, 4512, 4512, 4632, 4633, 4513, 4513, 4633, 4634, 4514, 4514, 4634, 4635, 4515, 4515, 4635, 4636, 4516, 4516, 4636, 4637, 4517, 4517, 4637, 4638, 4518, 4518, 4638, 4639, 4519, 4519, 4639, 4640, 4520, 4520, 4640, 4641, 4521, 4521, 4641, 4642, 4522, 4522, 4642, 4643, 4523, 4523, 4643, 4644, 4524, 4524, 4644, 4645, 4525, 4525, 4645, 4646, 4526, 4526, 4646, 4647, 4527, 4527, 4647, 4648, 4528, 4528, 4648, 4649, 4529, 4529, 4649, 4650, 4530, 4530, 4650, 4651, 4531, 4531, 4651, 4652, 4532, 4532, 4652, 4653, 4533, 4533, 4653, 4654, 4534, 4534, 4654, 4655, 4535, 4535, 4655, 4656, 4536, 4536, 4656, 4657, 4537, 4537, 4657, 4658, 4538, 4538, 4658, 4659, 4539, 4539, 4659, 4660, 4540, 4540, 4660, 4661, 4541, 4541, 4661, 4662, 4542, 4542, 4662, 4663, 4543, 4543, 4663, 4664, 4544, 4544, 4664, 4665, 4545, 4545, 4665, 4666, 4546, 4546, 4666, 4667, 4547, 4547, 4667, 4668, 4548, 4548, 4668, 4669, 4549, 4549, 4669, 4670, 4550, 4550, 4670, 4671, 4551, 4551, 4671, 4672, 4552, 4552, 4672, 4673, 4553, 4553, 4673, 4674, 4554, 4554, 4674, 4675, 4555, 4555, 4675, 4676, 4556, 4556, 4676, 4677, 4557, 4557, 4677, 4678, 4558, 4558, 4678, 4679, 4559, 4559, 4679, 4680, 4560, 4560, 4680, 4561, 4441, 4561, 4681, 4682, 4562, 4562, 4682, 4683, 4563, 4563, 4683, 4684, 4564, 4564, 4684, 4685, 4565, 4565, 4685, 4686, 4566, 4566, 4686, 4687, 4567, 4567, 4687, 4688, 4568, 4568, 4688, 4689, 4569, 4569, 4689, 4690, 4570, 4570, 4690, 4691, 4571, 4571, 4691, 4692, 4572, 4572, 4692, 4693, 4573, 4573, 4693, 4694, 4574, 4574, 4694, 4695, 4575, 4575, 4695, 4696, 4576, 4576, 4696, 4697, 4577, 4577, 4697, 4698, 4578, 4578, 4698, 4699, 4579, 4579, 4699, 4700, 4580, 4580, 4700, 4701, 4581, 4581, 4701, 4702, 4582, 4582, 4702, 4703, 4583, 4583, 4703, 4704, 4584, 4584, 4704, 4705, 4585, 4585, 4705, 4706, 4586, 4586, 4706, 4707, 4587, 4587, 4707, 4708, 4588, 4588, 4708, 4709, 4589, 4589, 4709, 4710, 4590, 4590, 4710, 4711, 4591, 4591, 4711, 4712, 4592, 4592, 4712, 4713, 4593, 4593, 4713, 4714, 4594, 4594, 4714, 4715, 4595, 4595, 4715, 4716, 4596, 4596, 4716, 4717, 4597, 4597, 4717, 4718, 4598, 4598, 4718, 4719, 4599, 4599, 4719, 4720, 4600, 4600, 4720, 4721, 4601, 4601, 4721, 4722, 4602, 4602, 4722, 4723, 4603, 4603, 4723, 4724, 4604, 4604, 4724, 4725, 4605, 4605, 4725, 4726, 4606, 4606, 4726, 4727, 4607, 4607, 4727, 4728, 4608, 4608, 4728, 4729, 4609, 4609, 4729, 4730, 4610, 4610, 4730, 4731, 4611, 4611, 4731, 4732, 4612, 4612, 4732, 4733, 4613, 4613, 4733, 4734, 4614, 4614, 4734, 4735, 4615, 4615, 4735, 4736, 4616, 4616, 4736, 4737, 4617, 4617, 4737, 4738, 4618, 4618, 4738, 4739, 4619, 4619, 4739, 4740, 4620, 4620, 4740, 4741, 4621, 4621, 4741, 4742, 4622, 4622, 4742, 4743, 4623, 4623, 4743, 4744, 4624, 4624, 4744, 4745, 4625, 4625, 4745, 4746, 4626, 4626, 4746, 4747, 4627, 4627, 4747, 4748, 4628, 4628, 4748, 4749, 4629, 4629, 4749, 4750, 4630, 4630, 4750, 4751, 4631, 4631, 4751, 4752, 4632, 4632, 4752, 4753, 4633, 4633, 4753, 4754, 4634, 4634, 4754, 4755, 4635, 4635, 4755, 4756, 4636, 4636, 4756, 4757, 4637, 4637, 4757, 4758, 4638, 4638, 4758, 4759, 4639, 4639, 4759, 4760, 4640, 4640, 4760, 4761, 4641, 4641, 4761, 4762, 4642, 4642, 4762, 4763, 4643, 4643, 4763, 4764, 4644, 4644, 4764, 4765, 4645, 4645, 4765, 4766, 4646, 4646, 4766, 4767, 4647, 4647, 4767, 4768, 4648, 4648, 4768, 4769, 4649, 4649, 4769, 4770, 4650, 4650, 4770, 4771, 4651, 4651, 4771, 4772, 4652, 4652, 4772, 4773, 4653, 4653, 4773, 4774, 4654, 4654, 4774, 4775, 4655, 4655, 4775, 4776, 4656, 4656, 4776, 4777, 4657, 4657, 4777, 4778, 4658, 4658, 4778, 4779, 4659, 4659, 4779, 4780, 4660, 4660, 4780, 4781, 4661, 4661, 4781, 4782, 4662, 4662, 4782, 4783, 4663, 4663, 4783, 4784, 4664, 4664, 4784, 4785, 4665, 4665, 4785, 4786, 4666, 4666, 4786, 4787, 4667, 4667, 4787, 4788, 4668, 4668, 4788, 4789, 4669, 4669, 4789, 4790, 4670, 4670, 4790, 4791, 4671, 4671, 4791, 4792, 4672, 4672, 4792, 4793, 4673, 4673, 4793, 4794, 4674, 4674, 4794, 4795, 4675, 4675, 4795, 4796, 4676, 4676, 4796, 4797, 4677, 4677, 4797, 4798, 4678, 4678, 4798, 4799, 4679, 4679, 4799, 4800, 4680, 4680, 4800, 4681, 4561, 4681, 4801, 4802, 4682, 4682, 4802, 4803, 4683, 4683, 4803, 4804, 4684, 4684, 4804, 4805, 4685, 4685, 4805, 4806, 4686, 4686, 4806, 4807, 4687, 4687, 4807, 4808, 4688, 4688, 4808, 4809, 4689, 4689, 4809, 4810, 4690, 4690, 4810, 4811, 4691, 4691, 4811, 4812, 4692, 4692, 4812, 4813, 4693, 4693, 4813, 4814, 4694, 4694, 4814, 4815, 4695, 4695, 4815, 4816, 4696, 4696, 4816, 4817, 4697, 4697, 4817, 4818, 4698, 4698, 4818, 4819, 4699, 4699, 4819, 4820, 4700, 4700, 4820, 4821, 4701, 4701, 4821, 4822, 4702, 4702, 4822, 4823, 4703, 4703, 4823, 4824, 4704, 4704, 4824, 4825, 4705, 4705, 4825, 4826, 4706, 4706, 4826, 4827, 4707, 4707, 4827, 4828, 4708, 4708, 4828, 4829, 4709, 4709, 4829, 4830, 4710, 4710, 4830, 4831, 4711, 4711, 4831, 4832, 4712, 4712, 4832, 4833, 4713, 4713, 4833, 4834, 4714, 4714, 4834, 4835, 4715, 4715, 4835, 4836, 4716, 4716, 4836, 4837, 4717, 4717, 4837, 4838, 4718, 4718, 4838, 4839, 4719, 4719, 4839, 4840, 4720, 4720, 4840, 4841, 4721, 4721, 4841, 4842, 4722, 4722, 4842, 4843, 4723, 4723, 4843, 4844, 4724, 4724, 4844, 4845, 4725, 4725, 4845, 4846, 4726, 4726, 4846, 4847, 4727, 4727, 4847, 4848, 4728, 4728, 4848, 4849, 4729, 4729, 4849, 4850, 4730, 4730, 4850, 4851, 4731, 4731, 4851, 4852, 4732, 4732, 4852, 4853, 4733, 4733, 4853, 4854, 4734, 4734, 4854, 4855, 4735, 4735, 4855, 4856, 4736, 4736, 4856, 4857, 4737, 4737, 4857, 4858, 4738, 4738, 4858, 4859, 4739, 4739, 4859, 4860, 4740, 4740, 4860, 4861, 4741, 4741, 4861, 4862, 4742, 4742, 4862, 4863, 4743, 4743, 4863, 4864, 4744, 4744, 4864, 4865, 4745, 4745, 4865, 4866, 4746, 4746, 4866, 4867, 4747, 4747, 4867, 4868, 4748, 4748, 4868, 4869, 4749, 4749, 4869, 4870, 4750, 4750, 4870, 4871, 4751, 4751, 4871, 4872, 4752, 4752, 4872, 4873, 4753, 4753, 4873, 4874, 4754, 4754, 4874, 4875, 4755, 4755, 4875, 4876, 4756, 4756, 4876, 4877, 4757, 4757, 4877, 4878, 4758, 4758, 4878, 4879, 4759, 4759, 4879, 4880, 4760, 4760, 4880, 4881, 4761, 4761, 4881, 4882, 4762, 4762, 4882, 4883, 4763, 4763, 4883, 4884, 4764, 4764, 4884, 4885, 4765, 4765, 4885, 4886, 4766, 4766, 4886, 4887, 4767, 4767, 4887, 4888, 4768, 4768, 4888, 4889, 4769, 4769, 4889, 4890, 4770, 4770, 4890, 4891, 4771, 4771, 4891, 4892, 4772, 4772, 4892, 4893, 4773, 4773, 4893, 4894, 4774, 4774, 4894, 4895, 4775, 4775, 4895, 4896, 4776, 4776, 4896, 4897, 4777, 4777, 4897, 4898, 4778, 4778, 4898, 4899, 4779, 4779, 4899, 4900, 4780, 4780, 4900, 4901, 4781, 4781, 4901, 4902, 4782, 4782, 4902, 4903, 4783, 4783, 4903, 4904, 4784, 4784, 4904, 4905, 4785, 4785, 4905, 4906, 4786, 4786, 4906, 4907, 4787, 4787, 4907, 4908, 4788, 4788, 4908, 4909, 4789, 4789, 4909, 4910, 4790, 4790, 4910, 4911, 4791, 4791, 4911, 4912, 4792, 4792, 4912, 4913, 4793, 4793, 4913, 4914, 4794, 4794, 4914, 4915, 4795, 4795, 4915, 4916, 4796, 4796, 4916, 4917, 4797, 4797, 4917, 4918, 4798, 4798, 4918, 4919, 4799, 4799, 4919, 4920, 4800, 4800, 4920, 4801, 4681, 4801, 4921, 4922, 4802, 4802, 4922, 4923, 4803, 4803, 4923, 4924, 4804, 4804, 4924, 4925, 4805, 4805, 4925, 4926, 4806, 4806, 4926, 4927, 4807, 4807, 4927, 4928, 4808, 4808, 4928, 4929, 4809, 4809, 4929, 4930, 4810, 4810, 4930, 4931, 4811, 4811, 4931, 4932, 4812, 4812, 4932, 4933, 4813, 4813, 4933, 4934, 4814, 4814, 4934, 4935, 4815, 4815, 4935, 4936, 4816, 4816, 4936, 4937, 4817, 4817, 4937, 4938, 4818, 4818, 4938, 4939, 4819, 4819, 4939, 4940, 4820, 4820, 4940, 4941, 4821, 4821, 4941, 4942, 4822, 4822, 4942, 4943, 4823, 4823, 4943, 4944, 4824, 4824, 4944, 4945, 4825, 4825, 4945, 4946, 4826, 4826, 4946, 4947, 4827, 4827, 4947, 4948, 4828, 4828, 4948, 4949, 4829, 4829, 4949, 4950, 4830, 4830, 4950, 4951, 4831, 4831, 4951, 4952, 4832, 4832, 4952, 4953, 4833, 4833, 4953, 4954, 4834, 4834, 4954, 4955, 4835, 4835, 4955, 4956, 4836, 4836, 4956, 4957, 4837, 4837, 4957, 4958, 4838, 4838, 4958, 4959, 4839, 4839, 4959, 4960, 4840, 4840, 4960, 4961, 4841, 4841, 4961, 4962, 4842, 4842, 4962, 4963, 4843, 4843, 4963, 4964, 4844, 4844, 4964, 4965, 4845, 4845, 4965, 4966, 4846, 4846, 4966, 4967, 4847, 4847, 4967, 4968, 4848, 4848, 4968, 4969, 4849, 4849, 4969, 4970, 4850, 4850, 4970, 4971, 4851, 4851, 4971, 4972, 4852, 4852, 4972, 4973, 4853, 4853, 4973, 4974, 4854, 4854, 4974, 4975, 4855, 4855, 4975, 4976, 4856, 4856, 4976, 4977, 4857, 4857, 4977, 4978, 4858, 4858, 4978, 4979, 4859, 4859, 4979, 4980, 4860, 4860, 4980, 4981, 4861, 4861, 4981, 4982, 4862, 4862, 4982, 4983, 4863, 4863, 4983, 4984, 4864, 4864, 4984, 4985, 4865, 4865, 4985, 4986, 4866, 4866, 4986, 4987, 4867, 4867, 4987, 4988, 4868, 4868, 4988, 4989, 4869, 4869, 4989, 4990, 4870, 4870, 4990, 4991, 4871, 4871, 4991, 4992, 4872, 4872, 4992, 4993, 4873, 4873, 4993, 4994, 4874, 4874, 4994, 4995, 4875, 4875, 4995, 4996, 4876, 4876, 4996, 4997, 4877, 4877, 4997, 4998, 4878, 4878, 4998, 4999, 4879, 4879, 4999, 5000, 4880, 4880, 5000, 5001, 4881, 4881, 5001, 5002, 4882, 4882, 5002, 5003, 4883, 4883, 5003, 5004, 4884, 4884, 5004, 5005, 4885, 4885, 5005, 5006, 4886, 4886, 5006, 5007, 4887, 4887, 5007, 5008, 4888, 4888, 5008, 5009, 4889, 4889, 5009, 5010, 4890, 4890, 5010, 5011, 4891, 4891, 5011, 5012, 4892, 4892, 5012, 5013, 4893, 4893, 5013, 5014, 4894, 4894, 5014, 5015, 4895, 4895, 5015, 5016, 4896, 4896, 5016, 5017, 4897, 4897, 5017, 5018, 4898, 4898, 5018, 5019, 4899, 4899, 5019, 5020, 4900, 4900, 5020, 5021, 4901, 4901, 5021, 5022, 4902, 4902, 5022, 5023, 4903, 4903, 5023, 5024, 4904, 4904, 5024, 5025, 4905, 4905, 5025, 5026, 4906, 4906, 5026, 5027, 4907, 4907, 5027, 5028, 4908, 4908, 5028, 5029, 4909, 4909, 5029, 5030, 4910, 4910, 5030, 5031, 4911, 4911, 5031, 5032, 4912, 4912, 5032, 5033, 4913, 4913, 5033, 5034, 4914, 4914, 5034, 5035, 4915, 4915, 5035, 5036, 4916, 4916, 5036, 5037, 4917, 4917, 5037, 5038, 4918, 4918, 5038, 5039, 4919, 4919, 5039, 5040, 4920, 4920, 5040, 4921, 4801, 4921, 5041, 5042, 4922, 4922, 5042, 5043, 4923, 4923, 5043, 5044, 4924, 4924, 5044, 5045, 4925, 4925, 5045, 5046, 4926, 4926, 5046, 5047, 4927, 4927, 5047, 5048, 4928, 4928, 5048, 5049, 4929, 4929, 5049, 5050, 4930, 4930, 5050, 5051, 4931, 4931, 5051, 5052, 4932, 4932, 5052, 5053, 4933, 4933, 5053, 5054, 4934, 4934, 5054, 5055, 4935, 4935, 5055, 5056, 4936, 4936, 5056, 5057, 4937, 4937, 5057, 5058, 4938, 4938, 5058, 5059, 4939, 4939, 5059, 5060, 4940, 4940, 5060, 5061, 4941, 4941, 5061, 5062, 4942, 4942, 5062, 5063, 4943, 4943, 5063, 5064, 4944, 4944, 5064, 5065, 4945, 4945, 5065, 5066, 4946, 4946, 5066, 5067, 4947, 4947, 5067, 5068, 4948, 4948, 5068, 5069, 4949, 4949, 5069, 5070, 4950, 4950, 5070, 5071, 4951, 4951, 5071, 5072, 4952, 4952, 5072, 5073, 4953, 4953, 5073, 5074, 4954, 4954, 5074, 5075, 4955, 4955, 5075, 5076, 4956, 4956, 5076, 5077, 4957, 4957, 5077, 5078, 4958, 4958, 5078, 5079, 4959, 4959, 5079, 5080, 4960, 4960, 5080, 5081, 4961, 4961, 5081, 5082, 4962, 4962, 5082, 5083, 4963, 4963, 5083, 5084, 4964, 4964, 5084, 5085, 4965, 4965, 5085, 5086, 4966, 4966, 5086, 5087, 4967, 4967, 5087, 5088, 4968, 4968, 5088, 5089, 4969, 4969, 5089, 5090, 4970, 4970, 5090, 5091, 4971, 4971, 5091, 5092, 4972, 4972, 5092, 5093, 4973, 4973, 5093, 5094, 4974, 4974, 5094, 5095, 4975, 4975, 5095, 5096, 4976, 4976, 5096, 5097, 4977, 4977, 5097, 5098, 4978, 4978, 5098, 5099, 4979, 4979, 5099, 5100, 4980, 4980, 5100, 5101, 4981, 4981, 5101, 5102, 4982, 4982, 5102, 5103, 4983, 4983, 5103, 5104, 4984, 4984, 5104, 5105, 4985, 4985, 5105, 5106, 4986, 4986, 5106, 5107, 4987, 4987, 5107, 5108, 4988, 4988, 5108, 5109, 4989, 4989, 5109, 5110, 4990, 4990, 5110, 5111, 4991, 4991, 5111, 5112, 4992, 4992, 5112, 5113, 4993, 4993, 5113, 5114, 4994, 4994, 5114, 5115, 4995, 4995, 5115, 5116, 4996, 4996, 5116, 5117, 4997, 4997, 5117, 5118, 4998, 4998, 5118, 5119, 4999, 4999, 5119, 5120, 5000, 5000, 5120, 5121, 5001, 5001, 5121, 5122, 5002, 5002, 5122, 5123, 5003, 5003, 5123, 5124, 5004, 5004, 5124, 5125, 5005, 5005, 5125, 5126, 5006, 5006, 5126, 5127, 5007, 5007, 5127, 5128, 5008, 5008, 5128, 5129, 5009, 5009, 5129, 5130, 5010, 5010, 5130, 5131, 5011, 5011, 5131, 5132, 5012, 5012, 5132, 5133, 5013, 5013, 5133, 5134, 5014, 5014, 5134, 5135, 5015, 5015, 5135, 5136, 5016, 5016, 5136, 5137, 5017, 5017, 5137, 5138, 5018, 5018, 5138, 5139, 5019, 5019, 5139, 5140, 5020, 5020, 5140, 5141, 5021, 5021, 5141, 5142, 5022, 5022, 5142, 5143, 5023, 5023, 5143, 5144, 5024, 5024, 5144, 5145, 5025, 5025, 5145, 5146, 5026, 5026, 5146, 5147, 5027, 5027, 5147, 5148, 5028, 5028, 5148, 5149, 5029, 5029, 5149, 5150, 5030, 5030, 5150, 5151, 5031, 5031, 5151, 5152, 5032, 5032, 5152, 5153, 5033, 5033, 5153, 5154, 5034, 5034, 5154, 5155, 5035, 5035, 5155, 5156, 5036, 5036, 5156, 5157, 5037, 5037, 5157, 5158, 5038, 5038, 5158, 5159, 5039, 5039, 5159, 5160, 5040, 5040, 5160, 5041, 4921, 5041, 5161, 5162, 5042, 5042, 5162, 5163, 5043, 5043, 5163, 5164, 5044, 5044, 5164, 5165, 5045, 5045, 5165, 5166, 5046, 5046, 5166, 5167, 5047, 5047, 5167, 5168, 5048, 5048, 5168, 5169, 5049, 5049, 5169, 5170, 5050, 5050, 5170, 5171, 5051, 5051, 5171, 5172, 5052, 5052, 5172, 5173, 5053, 5053, 5173, 5174, 5054, 5054, 5174, 5175, 5055, 5055, 5175, 5176, 5056, 5056, 5176, 5177, 5057, 5057, 5177, 5178, 5058, 5058, 5178, 5179, 5059, 5059, 5179, 5180, 5060, 5060, 5180, 5181, 5061, 5061, 5181, 5182, 5062, 5062, 5182, 5183, 5063, 5063, 5183, 5184, 5064, 5064, 5184, 5185, 5065, 5065, 5185, 5186, 5066, 5066, 5186, 5187, 5067, 5067, 5187, 5188, 5068, 5068, 5188, 5189, 5069, 5069, 5189, 5190, 5070, 5070, 5190, 5191, 5071, 5071, 5191, 5192, 5072, 5072, 5192, 5193, 5073, 5073, 5193, 5194, 5074, 5074, 5194, 5195, 5075, 5075, 5195, 5196, 5076, 5076, 5196, 5197, 5077, 5077, 5197, 5198, 5078, 5078, 5198, 5199, 5079, 5079, 5199, 5200, 5080, 5080, 5200, 5201, 5081, 5081, 5201, 5202, 5082, 5082, 5202, 5203, 5083, 5083, 5203, 5204, 5084, 5084, 5204, 5205, 5085, 5085, 5205, 5206, 5086, 5086, 5206, 5207, 5087, 5087, 5207, 5208, 5088, 5088, 5208, 5209, 5089, 5089, 5209, 5210, 5090, 5090, 5210, 5211, 5091, 5091, 5211, 5212, 5092, 5092, 5212, 5213, 5093, 5093, 5213, 5214, 5094, 5094, 5214, 5215, 5095, 5095, 5215, 5216, 5096, 5096, 5216, 5217, 5097, 5097, 5217, 5218, 5098, 5098, 5218, 5219, 5099, 5099, 5219, 5220, 5100, 5100, 5220, 5221, 5101, 5101, 5221, 5222, 5102, 5102, 5222, 5223, 5103, 5103, 5223, 5224, 5104, 5104, 5224, 5225, 5105, 5105, 5225, 5226, 5106, 5106, 5226, 5227, 5107, 5107, 5227, 5228, 5108, 5108, 5228, 5229, 5109, 5109, 5229, 5230, 5110, 5110, 5230, 5231, 5111, 5111, 5231, 5232, 5112, 5112, 5232, 5233, 5113, 5113, 5233, 5234, 5114, 5114, 5234, 5235, 5115, 5115, 5235, 5236, 5116, 5116, 5236, 5237, 5117, 5117, 5237, 5238, 5118, 5118, 5238, 5239, 5119, 5119, 5239, 5240, 5120, 5120, 5240, 5241, 5121, 5121, 5241, 5242, 5122, 5122, 5242, 5243, 5123, 5123, 5243, 5244, 5124, 5124, 5244, 5245, 5125, 5125, 5245, 5246, 5126, 5126, 5246, 5247, 5127, 5127, 5247, 5248, 5128, 5128, 5248, 5249, 5129, 5129, 5249, 5250, 5130, 5130, 5250, 5251, 5131, 5131, 5251, 5252, 5132, 5132, 5252, 5253, 5133, 5133, 5253, 5254, 5134, 5134, 5254, 5255, 5135, 5135, 5255, 5256, 5136, 5136, 5256, 5257, 5137, 5137, 5257, 5258, 5138, 5138, 5258, 5259, 5139, 5139, 5259, 5260, 5140, 5140, 5260, 5261, 5141, 5141, 5261, 5262, 5142, 5142, 5262, 5263, 5143, 5143, 5263, 5264, 5144, 5144, 5264, 5265, 5145, 5145, 5265, 5266, 5146, 5146, 5266, 5267, 5147, 5147, 5267, 5268, 5148, 5148, 5268, 5269, 5149, 5149, 5269, 5270, 5150, 5150, 5270, 5271, 5151, 5151, 5271, 5272, 5152, 5152, 5272, 5273, 5153, 5153, 5273, 5274, 5154, 5154, 5274, 5275, 5155, 5155, 5275, 5276, 5156, 5156, 5276, 5277, 5157, 5157, 5277, 5278, 5158, 5158, 5278, 5279, 5159, 5159, 5279, 5280, 5160, 5160, 5280, 5161, 5041, 5161, 5281, 5282, 5162, 5162, 5282, 5283, 5163, 5163, 5283, 5284, 5164, 5164, 5284, 5285, 5165, 5165, 5285, 5286, 5166, 5166, 5286, 5287, 5167, 5167, 5287, 5288, 5168, 5168, 5288, 5289, 5169, 5169, 5289, 5290, 5170, 5170, 5290, 5291, 5171, 5171, 5291, 5292, 5172, 5172, 5292, 5293, 5173, 5173, 5293, 5294, 5174, 5174, 5294, 5295, 5175, 5175, 5295, 5296, 5176, 5176, 5296, 5297, 5177, 5177, 5297, 5298, 5178, 5178, 5298, 5299, 5179, 5179, 5299, 5300, 5180, 5180, 5300, 5301, 5181, 5181, 5301, 5302, 5182, 5182, 5302, 5303, 5183, 5183, 5303, 5304, 5184, 5184, 5304, 5305, 5185, 5185, 5305, 5306, 5186, 5186, 5306, 5307, 5187, 5187, 5307, 5308, 5188, 5188, 5308, 5309, 5189, 5189, 5309, 5310, 5190, 5190, 5310, 5311, 5191, 5191, 5311, 5312, 5192, 5192, 5312, 5313, 5193, 5193, 5313, 5314, 5194, 5194, 5314, 5315, 5195, 5195, 5315, 5316, 5196, 5196, 5316, 5317, 5197, 5197, 5317, 5318, 5198, 5198, 5318, 5319, 5199, 5199, 5319, 5320, 5200, 5200, 5320, 5321, 5201, 5201, 5321, 5322, 5202, 5202, 5322, 5323, 5203, 5203, 5323, 5324, 5204, 5204, 5324, 5325, 5205, 5205, 5325, 5326, 5206, 5206, 5326, 5327, 5207, 5207, 5327, 5328, 5208, 5208, 5328, 5329, 5209, 5209, 5329, 5330, 5210, 5210, 5330, 5331, 5211, 5211, 5331, 5332, 5212, 5212, 5332, 5333, 5213, 5213, 5333, 5334, 5214, 5214, 5334, 5335, 5215, 5215, 5335, 5336, 5216, 5216, 5336, 5337, 5217, 5217, 5337, 5338, 5218, 5218, 5338, 5339, 5219, 5219, 5339, 5340, 5220, 5220, 5340, 5341, 5221, 5221, 5341, 5342, 5222, 5222, 5342, 5343, 5223, 5223, 5343, 5344, 5224, 5224, 5344, 5345, 5225, 5225, 5345, 5346, 5226, 5226, 5346, 5347, 5227, 5227, 5347, 5348, 5228, 5228, 5348, 5349, 5229, 5229, 5349, 5350, 5230, 5230, 5350, 5351, 5231, 5231, 5351, 5352, 5232, 5232, 5352, 5353, 5233, 5233, 5353, 5354, 5234, 5234, 5354, 5355, 5235, 5235, 5355, 5356, 5236, 5236, 5356, 5357, 5237, 5237, 5357, 5358, 5238, 5238, 5358, 5359, 5239, 5239, 5359, 5360, 5240, 5240, 5360, 5361, 5241, 5241, 5361, 5362, 5242, 5242, 5362, 5363, 5243, 5243, 5363, 5364, 5244, 5244, 5364, 5365, 5245, 5245, 5365, 5366, 5246, 5246, 5366, 5367, 5247, 5247, 5367, 5368, 5248, 5248, 5368, 5369, 5249, 5249, 5369, 5370, 5250, 5250, 5370, 5371, 5251, 5251, 5371, 5372, 5252, 5252, 5372, 5373, 5253, 5253, 5373, 5374, 5254, 5254, 5374, 5375, 5255, 5255, 5375, 5376, 5256, 5256, 5376, 5377, 5257, 5257, 5377, 5378, 5258, 5258, 5378, 5379, 5259, 5259, 5379, 5380, 5260, 5260, 5380, 5381, 5261, 5261, 5381, 5382, 5262, 5262, 5382, 5383, 5263, 5263, 5383, 5384, 5264, 5264, 5384, 5385, 5265, 5265, 5385, 5386, 5266, 5266, 5386, 5387, 5267, 5267, 5387, 5388, 5268, 5268, 5388, 5389, 5269, 5269, 5389, 5390, 5270, 5270, 5390, 5391, 5271, 5271, 5391, 5392, 5272, 5272, 5392, 5393, 5273, 5273, 5393, 5394, 5274, 5274, 5394, 5395, 5275, 5275, 5395, 5396, 5276, 5276, 5396, 5397, 5277, 5277, 5397, 5398, 5278, 5278, 5398, 5399, 5279, 5279, 5399, 5400, 5280, 5280, 5400, 5281, 5161, 5281, 5401, 5402, 5282, 5282, 5402, 5403, 5283, 5283, 5403, 5404, 5284, 5284, 5404, 5405, 5285, 5285, 5405, 5406, 5286, 5286, 5406, 5407, 5287, 5287, 5407, 5408, 5288, 5288, 5408, 5409, 5289, 5289, 5409, 5410, 5290, 5290, 5410, 5411, 5291, 5291, 5411, 5412, 5292, 5292, 5412, 5413, 5293, 5293, 5413, 5414, 5294, 5294, 5414, 5415, 5295, 5295, 5415, 5416, 5296, 5296, 5416, 5417, 5297, 5297, 5417, 5418, 5298, 5298, 5418, 5419, 5299, 5299, 5419, 5420, 5300, 5300, 5420, 5421, 5301, 5301, 5421, 5422, 5302, 5302, 5422, 5423, 5303, 5303, 5423, 5424, 5304, 5304, 5424, 5425, 5305, 5305, 5425, 5426, 5306, 5306, 5426, 5427, 5307, 5307, 5427, 5428, 5308, 5308, 5428, 5429, 5309, 5309, 5429, 5430, 5310, 5310, 5430, 5431, 5311, 5311, 5431, 5432, 5312, 5312, 5432, 5433, 5313, 5313, 5433, 5434, 5314, 5314, 5434, 5435, 5315, 5315, 5435, 5436, 5316, 5316, 5436, 5437, 5317, 5317, 5437, 5438, 5318, 5318, 5438, 5439, 5319, 5319, 5439, 5440, 5320, 5320, 5440, 5441, 5321, 5321, 5441, 5442, 5322, 5322, 5442, 5443, 5323, 5323, 5443, 5444, 5324, 5324, 5444, 5445, 5325, 5325, 5445, 5446, 5326, 5326, 5446, 5447, 5327, 5327, 5447, 5448, 5328, 5328, 5448, 5449, 5329, 5329, 5449, 5450, 5330, 5330, 5450, 5451, 5331, 5331, 5451, 5452, 5332, 5332, 5452, 5453, 5333, 5333, 5453, 5454, 5334, 5334, 5454, 5455, 5335, 5335, 5455, 5456, 5336, 5336, 5456, 5457, 5337, 5337, 5457, 5458, 5338, 5338, 5458, 5459, 5339, 5339, 5459, 5460, 5340, 5340, 5460, 5461, 5341, 5341, 5461, 5462, 5342, 5342, 5462, 5463, 5343, 5343, 5463, 5464, 5344, 5344, 5464, 5465, 5345, 5345, 5465, 5466, 5346, 5346, 5466, 5467, 5347, 5347, 5467, 5468, 5348, 5348, 5468, 5469, 5349, 5349, 5469, 5470, 5350, 5350, 5470, 5471, 5351, 5351, 5471, 5472, 5352, 5352, 5472, 5473, 5353, 5353, 5473, 5474, 5354, 5354, 5474, 5475, 5355, 5355, 5475, 5476, 5356, 5356, 5476, 5477, 5357, 5357, 5477, 5478, 5358, 5358, 5478, 5479, 5359, 5359, 5479, 5480, 5360, 5360, 5480, 5481, 5361, 5361, 5481, 5482, 5362, 5362, 5482, 5483, 5363, 5363, 5483, 5484, 5364, 5364, 5484, 5485, 5365, 5365, 5485, 5486, 5366, 5366, 5486, 5487, 5367, 5367, 5487, 5488, 5368, 5368, 5488, 5489, 5369, 5369, 5489, 5490, 5370, 5370, 5490, 5491, 5371, 5371, 5491, 5492, 5372, 5372, 5492, 5493, 5373, 5373, 5493, 5494, 5374, 5374, 5494, 5495, 5375, 5375, 5495, 5496, 5376, 5376, 5496, 5497, 5377, 5377, 5497, 5498, 5378, 5378, 5498, 5499, 5379, 5379, 5499, 5500, 5380, 5380, 5500, 5501, 5381, 5381, 5501, 5502, 5382, 5382, 5502, 5503, 5383, 5383, 5503, 5504, 5384, 5384, 5504, 5505, 5385, 5385, 5505, 5506, 5386, 5386, 5506, 5507, 5387, 5387, 5507, 5508, 5388, 5388, 5508, 5509, 5389, 5389, 5509, 5510, 5390, 5390, 5510, 5511, 5391, 5391, 5511, 5512, 5392, 5392, 5512, 5513, 5393, 5393, 5513, 5514, 5394, 5394, 5514, 5515, 5395, 5395, 5515, 5516, 5396, 5396, 5516, 5517, 5397, 5397, 5517, 5518, 5398, 5398, 5518, 5519, 5399, 5399, 5519, 5520, 5400, 5400, 5520, 5401, 5281, 5401, 5521, 5522, 5402, 5402, 5522, 5523, 5403, 5403, 5523, 5524, 5404, 5404, 5524, 5525, 5405, 5405, 5525, 5526, 5406, 5406, 5526, 5527, 5407, 5407, 5527, 5528, 5408, 5408, 5528, 5529, 5409, 5409, 5529, 5530, 5410, 5410, 5530, 5531, 5411, 5411, 5531, 5532, 5412, 5412, 5532, 5533, 5413, 5413, 5533, 5534, 5414, 5414, 5534, 5535, 5415, 5415, 5535, 5536, 5416, 5416, 5536, 5537, 5417, 5417, 5537, 5538, 5418, 5418, 5538, 5539, 5419, 5419, 5539, 5540, 5420, 5420, 5540, 5541, 5421, 5421, 5541, 5542, 5422, 5422, 5542, 5543, 5423, 5423, 5543, 5544, 5424, 5424, 5544, 5545, 5425, 5425, 5545, 5546, 5426, 5426, 5546, 5547, 5427, 5427, 5547, 5548, 5428, 5428, 5548, 5549, 5429, 5429, 5549, 5550, 5430, 5430, 5550, 5551, 5431, 5431, 5551, 5552, 5432, 5432, 5552, 5553, 5433, 5433, 5553, 5554, 5434, 5434, 5554, 5555, 5435, 5435, 5555, 5556, 5436, 5436, 5556, 5557, 5437, 5437, 5557, 5558, 5438, 5438, 5558, 5559, 5439, 5439, 5559, 5560, 5440, 5440, 5560, 5561, 5441, 5441, 5561, 5562, 5442, 5442, 5562, 5563, 5443, 5443, 5563, 5564, 5444, 5444, 5564, 5565, 5445, 5445, 5565, 5566, 5446, 5446, 5566, 5567, 5447, 5447, 5567, 5568, 5448, 5448, 5568, 5569, 5449, 5449, 5569, 5570, 5450, 5450, 5570, 5571, 5451, 5451, 5571, 5572, 5452, 5452, 5572, 5573, 5453, 5453, 5573, 5574, 5454, 5454, 5574, 5575, 5455, 5455, 5575, 5576, 5456, 5456, 5576, 5577, 5457, 5457, 5577, 5578, 5458, 5458, 5578, 5579, 5459, 5459, 5579, 5580, 5460, 5460, 5580, 5581, 5461, 5461, 5581, 5582, 5462, 5462, 5582, 5583, 5463, 5463, 5583, 5584, 5464, 5464, 5584, 5585, 5465, 5465, 5585, 5586, 5466, 5466, 5586, 5587, 5467, 5467, 5587, 5588, 5468, 5468, 5588, 5589, 5469, 5469, 5589, 5590, 5470, 5470, 5590, 5591, 5471, 5471, 5591, 5592, 5472, 5472, 5592, 5593, 5473, 5473, 5593, 5594, 5474, 5474, 5594, 5595, 5475, 5475, 5595, 5596, 5476, 5476, 5596, 5597, 5477, 5477, 5597, 5598, 5478, 5478, 5598, 5599, 5479, 5479, 5599, 5600, 5480, 5480, 5600, 5601, 5481, 5481, 5601, 5602, 5482, 5482, 5602, 5603, 5483, 5483, 5603, 5604, 5484, 5484, 5604, 5605, 5485, 5485, 5605, 5606, 5486, 5486, 5606, 5607, 5487, 5487, 5607, 5608, 5488, 5488, 5608, 5609, 5489, 5489, 5609, 5610, 5490, 5490, 5610, 5611, 5491, 5491, 5611, 5612, 5492, 5492, 5612, 5613, 5493, 5493, 5613, 5614, 5494, 5494, 5614, 5615, 5495, 5495, 5615, 5616, 5496, 5496, 5616, 5617, 5497, 5497, 5617, 5618, 5498, 5498, 5618, 5619, 5499, 5499, 5619, 5620, 5500, 5500, 5620, 5621, 5501, 5501, 5621, 5622, 5502, 5502, 5622, 5623, 5503, 5503, 5623, 5624, 5504, 5504, 5624, 5625, 5505, 5505, 5625, 5626, 5506, 5506, 5626, 5627, 5507, 5507, 5627, 5628, 5508, 5508, 5628, 5629, 5509, 5509, 5629, 5630, 5510, 5510, 5630, 5631, 5511, 5511, 5631, 5632, 5512, 5512, 5632, 5633, 5513, 5513, 5633, 5634, 5514, 5514, 5634, 5635, 5515, 5515, 5635, 5636, 5516, 5516, 5636, 5637, 5517, 5517, 5637, 5638, 5518, 5518, 5638, 5639, 5519, 5519, 5639, 5640, 5520, 5520, 5640, 5521, 5401, 5521, 5641, 5642, 5522, 5522, 5642, 5643, 5523, 5523, 5643, 5644, 5524, 5524, 5644, 5645, 5525, 5525, 5645, 5646, 5526, 5526, 5646, 5647, 5527, 5527, 5647, 5648, 5528, 5528, 5648, 5649, 5529, 5529, 5649, 5650, 5530, 5530, 5650, 5651, 5531, 5531, 5651, 5652, 5532, 5532, 5652, 5653, 5533, 5533, 5653, 5654, 5534, 5534, 5654, 5655, 5535, 5535, 5655, 5656, 5536, 5536, 5656, 5657, 5537, 5537, 5657, 5658, 5538, 5538, 5658, 5659, 5539, 5539, 5659, 5660, 5540, 5540, 5660, 5661, 5541, 5541, 5661, 5662, 5542, 5542, 5662, 5663, 5543, 5543, 5663, 5664, 5544, 5544, 5664, 5665, 5545, 5545, 5665, 5666, 5546, 5546, 5666, 5667, 5547, 5547, 5667, 5668, 5548, 5548, 5668, 5669, 5549, 5549, 5669, 5670, 5550, 5550, 5670, 5671, 5551, 5551, 5671, 5672, 5552, 5552, 5672, 5673, 5553, 5553, 5673, 5674, 5554, 5554, 5674, 5675, 5555, 5555, 5675, 5676, 5556, 5556, 5676, 5677, 5557, 5557, 5677, 5678, 5558, 5558, 5678, 5679, 5559, 5559, 5679, 5680, 5560, 5560, 5680, 5681, 5561, 5561, 5681, 5682, 5562, 5562, 5682, 5683, 5563, 5563, 5683, 5684, 5564, 5564, 5684, 5685, 5565, 5565, 5685, 5686, 5566, 5566, 5686, 5687, 5567, 5567, 5687, 5688, 5568, 5568, 5688, 5689, 5569, 5569, 5689, 5690, 5570, 5570, 5690, 5691, 5571, 5571, 5691, 5692, 5572, 5572, 5692, 5693, 5573, 5573, 5693, 5694, 5574, 5574, 5694, 5695, 5575, 5575, 5695, 5696, 5576, 5576, 5696, 5697, 5577, 5577, 5697, 5698, 5578, 5578, 5698, 5699, 5579, 5579, 5699, 5700, 5580, 5580, 5700, 5701, 5581, 5581, 5701, 5702, 5582, 5582, 5702, 5703, 5583, 5583, 5703, 5704, 5584, 5584, 5704, 5705, 5585, 5585, 5705, 5706, 5586, 5586, 5706, 5707, 5587, 5587, 5707, 5708, 5588, 5588, 5708, 5709, 5589, 5589, 5709, 5710, 5590, 5590, 5710, 5711, 5591, 5591, 5711, 5712, 5592, 5592, 5712, 5713, 5593, 5593, 5713, 5714, 5594, 5594, 5714, 5715, 5595, 5595, 5715, 5716, 5596, 5596, 5716, 5717, 5597, 5597, 5717, 5718, 5598, 5598, 5718, 5719, 5599, 5599, 5719, 5720, 5600, 5600, 5720, 5721, 5601, 5601, 5721, 5722, 5602, 5602, 5722, 5723, 5603, 5603, 5723, 5724, 5604, 5604, 5724, 5725, 5605, 5605, 5725, 5726, 5606, 5606, 5726, 5727, 5607, 5607, 5727, 5728, 5608, 5608, 5728, 5729, 5609, 5609, 5729, 5730, 5610, 5610, 5730, 5731, 5611, 5611, 5731, 5732, 5612, 5612, 5732, 5733, 5613, 5613, 5733, 5734, 5614, 5614, 5734, 5735, 5615, 5615, 5735, 5736, 5616, 5616, 5736, 5737, 5617, 5617, 5737, 5738, 5618, 5618, 5738, 5739, 5619, 5619, 5739, 5740, 5620, 5620, 5740, 5741, 5621, 5621, 5741, 5742, 5622, 5622, 5742, 5743, 5623, 5623, 5743, 5744, 5624, 5624, 5744, 5745, 5625, 5625, 5745, 5746, 5626, 5626, 5746, 5747, 5627, 5627, 5747, 5748, 5628, 5628, 5748, 5749, 5629, 5629, 5749, 5750, 5630, 5630, 5750, 5751, 5631, 5631, 5751, 5752, 5632, 5632, 5752, 5753, 5633, 5633, 5753, 5754, 5634, 5634, 5754, 5755, 5635, 5635, 5755, 5756, 5636, 5636, 5756, 5757, 5637, 5637, 5757, 5758, 5638, 5638, 5758, 5759, 5639, 5639, 5759, 5760, 5640, 5640, 5760, 5641, 5521, 5641, 5761, 5762, 5642, 5642, 5762, 5763, 5643, 5643, 5763, 5764, 5644, 5644, 5764, 5765, 5645, 5645, 5765, 5766, 5646, 5646, 5766, 5767, 5647, 5647, 5767, 5768, 5648, 5648, 5768, 5769, 5649, 5649, 5769, 5770, 5650, 5650, 5770, 5771, 5651, 5651, 5771, 5772, 5652, 5652, 5772, 5773, 5653, 5653, 5773, 5774, 5654, 5654, 5774, 5775, 5655, 5655, 5775, 5776, 5656, 5656, 5776, 5777, 5657, 5657, 5777, 5778, 5658, 5658, 5778, 5779, 5659, 5659, 5779, 5780, 5660, 5660, 5780, 5781, 5661, 5661, 5781, 5782, 5662, 5662, 5782, 5783, 5663, 5663, 5783, 5784, 5664, 5664, 5784, 5785, 5665, 5665, 5785, 5786, 5666, 5666, 5786, 5787, 5667, 5667, 5787, 5788, 5668, 5668, 5788, 5789, 5669, 5669, 5789, 5790, 5670, 5670, 5790, 5791, 5671, 5671, 5791, 5792, 5672, 5672, 5792, 5793, 5673, 5673, 5793, 5794, 5674, 5674, 5794, 5795, 5675, 5675, 5795, 5796, 5676, 5676, 5796, 5797, 5677, 5677, 5797, 5798, 5678, 5678, 5798, 5799, 5679, 5679, 5799, 5800, 5680, 5680, 5800, 5801, 5681, 5681, 5801, 5802, 5682, 5682, 5802, 5803, 5683, 5683, 5803, 5804, 5684, 5684, 5804, 5805, 5685, 5685, 5805, 5806, 5686, 5686, 5806, 5807, 5687, 5687, 5807, 5808, 5688, 5688, 5808, 5809, 5689, 5689, 5809, 5810, 5690, 5690, 5810, 5811, 5691, 5691, 5811, 5812, 5692, 5692, 5812, 5813, 5693, 5693, 5813, 5814, 5694, 5694, 5814, 5815, 5695, 5695, 5815, 5816, 5696, 5696, 5816, 5817, 5697, 5697, 5817, 5818, 5698, 5698, 5818, 5819, 5699, 5699, 5819, 5820, 5700, 5700, 5820, 5821, 5701, 5701, 5821, 5822, 5702, 5702, 5822, 5823, 5703, 5703, 5823, 5824, 5704, 5704, 5824, 5825, 5705, 5705, 5825, 5826, 5706, 5706, 5826, 5827, 5707, 5707, 5827, 5828, 5708, 5708, 5828, 5829, 5709, 5709, 5829, 5830, 5710, 5710, 5830, 5831, 5711, 5711, 5831, 5832, 5712, 5712, 5832, 5833, 5713, 5713, 5833, 5834, 5714, 5714, 5834, 5835, 5715, 5715, 5835, 5836, 5716, 5716, 5836, 5837, 5717, 5717, 5837, 5838, 5718, 5718, 5838, 5839, 5719, 5719, 5839, 5840, 5720, 5720, 5840, 5841, 5721, 5721, 5841, 5842, 5722, 5722, 5842, 5843, 5723, 5723, 5843, 5844, 5724, 5724, 5844, 5845, 5725, 5725, 5845, 5846, 5726, 5726, 5846, 5847, 5727, 5727, 5847, 5848, 5728, 5728, 5848, 5849, 5729, 5729, 5849, 5850, 5730, 5730, 5850, 5851, 5731, 5731, 5851, 5852, 5732, 5732, 5852, 5853, 5733, 5733, 5853, 5854, 5734, 5734, 5854, 5855, 5735, 5735, 5855, 5856, 5736, 5736, 5856, 5857, 5737, 5737, 5857, 5858, 5738, 5738, 5858, 5859, 5739, 5739, 5859, 5860, 5740, 5740, 5860, 5861, 5741, 5741, 5861, 5862, 5742, 5742, 5862, 5863, 5743, 5743, 5863, 5864, 5744, 5744, 5864, 5865, 5745, 5745, 5865, 5866, 5746, 5746, 5866, 5867, 5747, 5747, 5867, 5868, 5748, 5748, 5868, 5869, 5749, 5749, 5869, 5870, 5750, 5750, 5870, 5871, 5751, 5751, 5871, 5872, 5752, 5752, 5872, 5873, 5753, 5753, 5873, 5874, 5754, 5754, 5874, 5875, 5755, 5755, 5875, 5876, 5756, 5756, 5876, 5877, 5757, 5757, 5877, 5878, 5758, 5758, 5878, 5879, 5759, 5759, 5879, 5880, 5760, 5760, 5880, 5761, 5641, 5761, 5881, 5882, 5762, 5762, 5882, 5883, 5763, 5763, 5883, 5884, 5764, 5764, 5884, 5885, 5765, 5765, 5885, 5886, 5766, 5766, 5886, 5887, 5767, 5767, 5887, 5888, 5768, 5768, 5888, 5889, 5769, 5769, 5889, 5890, 5770, 5770, 5890, 5891, 5771, 5771, 5891, 5892, 5772, 5772, 5892, 5893, 5773, 5773, 5893, 5894, 5774, 5774, 5894, 5895, 5775, 5775, 5895, 5896, 5776, 5776, 5896, 5897, 5777, 5777, 5897, 5898, 5778, 5778, 5898, 5899, 5779, 5779, 5899, 5900, 5780, 5780, 5900, 5901, 5781, 5781, 5901, 5902, 5782, 5782, 5902, 5903, 5783, 5783, 5903, 5904, 5784, 5784, 5904, 5905, 5785, 5785, 5905, 5906, 5786, 5786, 5906, 5907, 5787, 5787, 5907, 5908, 5788, 5788, 5908, 5909, 5789, 5789, 5909, 5910, 5790, 5790, 5910, 5911, 5791, 5791, 5911, 5912, 5792, 5792, 5912, 5913, 5793, 5793, 5913, 5914, 5794, 5794, 5914, 5915, 5795, 5795, 5915, 5916, 5796, 5796, 5916, 5917, 5797, 5797, 5917, 5918, 5798, 5798, 5918, 5919, 5799, 5799, 5919, 5920, 5800, 5800, 5920, 5921, 5801, 5801, 5921, 5922, 5802, 5802, 5922, 5923, 5803, 5803, 5923, 5924, 5804, 5804, 5924, 5925, 5805, 5805, 5925, 5926, 5806, 5806, 5926, 5927, 5807, 5807, 5927, 5928, 5808, 5808, 5928, 5929, 5809, 5809, 5929, 5930, 5810, 5810, 5930, 5931, 5811, 5811, 5931, 5932, 5812, 5812, 5932, 5933, 5813, 5813, 5933, 5934, 5814, 5814, 5934, 5935, 5815, 5815, 5935, 5936, 5816, 5816, 5936, 5937, 5817, 5817, 5937, 5938, 5818, 5818, 5938, 5939, 5819, 5819, 5939, 5940, 5820, 5820, 5940, 5941, 5821, 5821, 5941, 5942, 5822, 5822, 5942, 5943, 5823, 5823, 5943, 5944, 5824, 5824, 5944, 5945, 5825, 5825, 5945, 5946, 5826, 5826, 5946, 5947, 5827, 5827, 5947, 5948, 5828, 5828, 5948, 5949, 5829, 5829, 5949, 5950, 5830, 5830, 5950, 5951, 5831, 5831, 5951, 5952, 5832, 5832, 5952, 5953, 5833, 5833, 5953, 5954, 5834, 5834, 5954, 5955, 5835, 5835, 5955, 5956, 5836, 5836, 5956, 5957, 5837, 5837, 5957, 5958, 5838, 5838, 5958, 5959, 5839, 5839, 5959, 5960, 5840, 5840, 5960, 5961, 5841, 5841, 5961, 5962, 5842, 5842, 5962, 5963, 5843, 5843, 5963, 5964, 5844, 5844, 5964, 5965, 5845, 5845, 5965, 5966, 5846, 5846, 5966, 5967, 5847, 5847, 5967, 5968, 5848, 5848, 5968, 5969, 5849, 5849, 5969, 5970, 5850, 5850, 5970, 5971, 5851, 5851, 5971, 5972, 5852, 5852, 5972, 5973, 5853, 5853, 5973, 5974, 5854, 5854, 5974, 5975, 5855, 5855, 5975, 5976, 5856, 5856, 5976, 5977, 5857, 5857, 5977, 5978, 5858, 5858, 5978, 5979, 5859, 5859, 5979, 5980, 5860, 5860, 5980, 5981, 5861, 5861, 5981, 5982, 5862, 5862, 5982, 5983, 5863, 5863, 5983, 5984, 5864, 5864, 5984, 5985, 5865, 5865, 5985, 5986, 5866, 5866, 5986, 5987, 5867, 5867, 5987, 5988, 5868, 5868, 5988, 5989, 5869, 5869, 5989, 5990, 5870, 5870, 5990, 5991, 5871, 5871, 5991, 5992, 5872, 5872, 5992, 5993, 5873, 5873, 5993, 5994, 5874, 5874, 5994, 5995, 5875, 5875, 5995, 5996, 5876, 5876, 5996, 5997, 5877, 5877, 5997, 5998, 5878, 5878, 5998, 5999, 5879, 5879, 5999, 6000, 5880, 5880, 6000, 5881, 5761, 5881, 6001, 6002, 5882, 5882, 6002, 6003, 5883, 5883, 6003, 6004, 5884, 5884, 6004, 6005, 5885, 5885, 6005, 6006, 5886, 5886, 6006, 6007, 5887, 5887, 6007, 6008, 5888, 5888, 6008, 6009, 5889, 5889, 6009, 6010, 5890, 5890, 6010, 6011, 5891, 5891, 6011, 6012, 5892, 5892, 6012, 6013, 5893, 5893, 6013, 6014, 5894, 5894, 6014, 6015, 5895, 5895, 6015, 6016, 5896, 5896, 6016, 6017, 5897, 5897, 6017, 6018, 5898, 5898, 6018, 6019, 5899, 5899, 6019, 6020, 5900, 5900, 6020, 6021, 5901, 5901, 6021, 6022, 5902, 5902, 6022, 6023, 5903, 5903, 6023, 6024, 5904, 5904, 6024, 6025, 5905, 5905, 6025, 6026, 5906, 5906, 6026, 6027, 5907, 5907, 6027, 6028, 5908, 5908, 6028, 6029, 5909, 5909, 6029, 6030, 5910, 5910, 6030, 6031, 5911, 5911, 6031, 6032, 5912, 5912, 6032, 6033, 5913, 5913, 6033, 6034, 5914, 5914, 6034, 6035, 5915, 5915, 6035, 6036, 5916, 5916, 6036, 6037, 5917, 5917, 6037, 6038, 5918, 5918, 6038, 6039, 5919, 5919, 6039, 6040, 5920, 5920, 6040, 6041, 5921, 5921, 6041, 6042, 5922, 5922, 6042, 6043, 5923, 5923, 6043, 6044, 5924, 5924, 6044, 6045, 5925, 5925, 6045, 6046, 5926, 5926, 6046, 6047, 5927, 5927, 6047, 6048, 5928, 5928, 6048, 6049, 5929, 5929, 6049, 6050, 5930, 5930, 6050, 6051, 5931, 5931, 6051, 6052, 5932, 5932, 6052, 6053, 5933, 5933, 6053, 6054, 5934, 5934, 6054, 6055, 5935, 5935, 6055, 6056, 5936, 5936, 6056, 6057, 5937, 5937, 6057, 6058, 5938, 5938, 6058, 6059, 5939, 5939, 6059, 6060, 5940, 5940, 6060, 6061, 5941, 5941, 6061, 6062, 5942, 5942, 6062, 6063, 5943, 5943, 6063, 6064, 5944, 5944, 6064, 6065, 5945, 5945, 6065, 6066, 5946, 5946, 6066, 6067, 5947, 5947, 6067, 6068, 5948, 5948, 6068, 6069, 5949, 5949, 6069, 6070, 5950, 5950, 6070, 6071, 5951, 5951, 6071, 6072, 5952, 5952, 6072, 6073, 5953, 5953, 6073, 6074, 5954, 5954, 6074, 6075, 5955, 5955, 6075, 6076, 5956, 5956, 6076, 6077, 5957, 5957, 6077, 6078, 5958, 5958, 6078, 6079, 5959, 5959, 6079, 6080, 5960, 5960, 6080, 6081, 5961, 5961, 6081, 6082, 5962, 5962, 6082, 6083, 5963, 5963, 6083, 6084, 5964, 5964, 6084, 6085, 5965, 5965, 6085, 6086, 5966, 5966, 6086, 6087, 5967, 5967, 6087, 6088, 5968, 5968, 6088, 6089, 5969, 5969, 6089, 6090, 5970, 5970, 6090, 6091, 5971, 5971, 6091, 6092, 5972, 5972, 6092, 6093, 5973, 5973, 6093, 6094, 5974, 5974, 6094, 6095, 5975, 5975, 6095, 6096, 5976, 5976, 6096, 6097, 5977, 5977, 6097, 6098, 5978, 5978, 6098, 6099, 5979, 5979, 6099, 6100, 5980, 5980, 6100, 6101, 5981, 5981, 6101, 6102, 5982, 5982, 6102, 6103, 5983, 5983, 6103, 6104, 5984, 5984, 6104, 6105, 5985, 5985, 6105, 6106, 5986, 5986, 6106, 6107, 5987, 5987, 6107, 6108, 5988, 5988, 6108, 6109, 5989, 5989, 6109, 6110, 5990, 5990, 6110, 6111, 5991, 5991, 6111, 6112, 5992, 5992, 6112, 6113, 5993, 5993, 6113, 6114, 5994, 5994, 6114, 6115, 5995, 5995, 6115, 6116, 5996, 5996, 6116, 6117, 5997, 5997, 6117, 6118, 5998, 5998, 6118, 6119, 5999, 5999, 6119, 6120, 6000, 6000, 6120, 6001, 5881, 6001, 6121, 6122, 6002, 6002, 6122, 6123, 6003, 6003, 6123, 6124, 6004, 6004, 6124, 6125, 6005, 6005, 6125, 6126, 6006, 6006, 6126, 6127, 6007, 6007, 6127, 6128, 6008, 6008, 6128, 6129, 6009, 6009, 6129, 6130, 6010, 6010, 6130, 6131, 6011, 6011, 6131, 6132, 6012, 6012, 6132, 6133, 6013, 6013, 6133, 6134, 6014, 6014, 6134, 6135, 6015, 6015, 6135, 6136, 6016, 6016, 6136, 6137, 6017, 6017, 6137, 6138, 6018, 6018, 6138, 6139, 6019, 6019, 6139, 6140, 6020, 6020, 6140, 6141, 6021, 6021, 6141, 6142, 6022, 6022, 6142, 6143, 6023, 6023, 6143, 6144, 6024, 6024, 6144, 6145, 6025, 6025, 6145, 6146, 6026, 6026, 6146, 6147, 6027, 6027, 6147, 6148, 6028, 6028, 6148, 6149, 6029, 6029, 6149, 6150, 6030, 6030, 6150, 6151, 6031, 6031, 6151, 6152, 6032, 6032, 6152, 6153, 6033, 6033, 6153, 6154, 6034, 6034, 6154, 6155, 6035, 6035, 6155, 6156, 6036, 6036, 6156, 6157, 6037, 6037, 6157, 6158, 6038, 6038, 6158, 6159, 6039, 6039, 6159, 6160, 6040, 6040, 6160, 6161, 6041, 6041, 6161, 6162, 6042, 6042, 6162, 6163, 6043, 6043, 6163, 6164, 6044, 6044, 6164, 6165, 6045, 6045, 6165, 6166, 6046, 6046, 6166, 6167, 6047, 6047, 6167, 6168, 6048, 6048, 6168, 6169, 6049, 6049, 6169, 6170, 6050, 6050, 6170, 6171, 6051, 6051, 6171, 6172, 6052, 6052, 6172, 6173, 6053, 6053, 6173, 6174, 6054, 6054, 6174, 6175, 6055, 6055, 6175, 6176, 6056, 6056, 6176, 6177, 6057, 6057, 6177, 6178, 6058, 6058, 6178, 6179, 6059, 6059, 6179, 6180, 6060, 6060, 6180, 6181, 6061, 6061, 6181, 6182, 6062, 6062, 6182, 6183, 6063, 6063, 6183, 6184, 6064, 6064, 6184, 6185, 6065, 6065, 6185, 6186, 6066, 6066, 6186, 6187, 6067, 6067, 6187, 6188, 6068, 6068, 6188, 6189, 6069, 6069, 6189, 6190, 6070, 6070, 6190, 6191, 6071, 6071, 6191, 6192, 6072, 6072, 6192, 6193, 6073, 6073, 6193, 6194, 6074, 6074, 6194, 6195, 6075, 6075, 6195, 6196, 6076, 6076, 6196, 6197, 6077, 6077, 6197, 6198, 6078, 6078, 6198, 6199, 6079, 6079, 6199, 6200, 6080, 6080, 6200, 6201, 6081, 6081, 6201, 6202, 6082, 6082, 6202, 6203, 6083, 6083, 6203, 6204, 6084, 6084, 6204, 6205, 6085, 6085, 6205, 6206, 6086, 6086, 6206, 6207, 6087, 6087, 6207, 6208, 6088, 6088, 6208, 6209, 6089, 6089, 6209, 6210, 6090, 6090, 6210, 6211, 6091, 6091, 6211, 6212, 6092, 6092, 6212, 6213, 6093, 6093, 6213, 6214, 6094, 6094, 6214, 6215, 6095, 6095, 6215, 6216, 6096, 6096, 6216, 6217, 6097, 6097, 6217, 6218, 6098, 6098, 6218, 6219, 6099, 6099, 6219, 6220, 6100, 6100, 6220, 6221, 6101, 6101, 6221, 6222, 6102, 6102, 6222, 6223, 6103, 6103, 6223, 6224, 6104, 6104, 6224, 6225, 6105, 6105, 6225, 6226, 6106, 6106, 6226, 6227, 6107, 6107, 6227, 6228, 6108, 6108, 6228, 6229, 6109, 6109, 6229, 6230, 6110, 6110, 6230, 6231, 6111, 6111, 6231, 6232, 6112, 6112, 6232, 6233, 6113, 6113, 6233, 6234, 6114, 6114, 6234, 6235, 6115, 6115, 6235, 6236, 6116, 6116, 6236, 6237, 6117, 6117, 6237, 6238, 6118, 6118, 6238, 6239, 6119, 6119, 6239, 6240, 6120, 6120, 6240, 6121, 6001, 6121, 6241, 6242, 6122, 6122, 6242, 6243, 6123, 6123, 6243, 6244, 6124, 6124, 6244, 6245, 6125, 6125, 6245, 6246, 6126, 6126, 6246, 6247, 6127, 6127, 6247, 6248, 6128, 6128, 6248, 6249, 6129, 6129, 6249, 6250, 6130, 6130, 6250, 6251, 6131, 6131, 6251, 6252, 6132, 6132, 6252, 6253, 6133, 6133, 6253, 6254, 6134, 6134, 6254, 6255, 6135, 6135, 6255, 6256, 6136, 6136, 6256, 6257, 6137, 6137, 6257, 6258, 6138, 6138, 6258, 6259, 6139, 6139, 6259, 6260, 6140, 6140, 6260, 6261, 6141, 6141, 6261, 6262, 6142, 6142, 6262, 6263, 6143, 6143, 6263, 6264, 6144, 6144, 6264, 6265, 6145, 6145, 6265, 6266, 6146, 6146, 6266, 6267, 6147, 6147, 6267, 6268, 6148, 6148, 6268, 6269, 6149, 6149, 6269, 6270, 6150, 6150, 6270, 6271, 6151, 6151, 6271, 6272, 6152, 6152, 6272, 6273, 6153, 6153, 6273, 6274, 6154, 6154, 6274, 6275, 6155, 6155, 6275, 6276, 6156, 6156, 6276, 6277, 6157, 6157, 6277, 6278, 6158, 6158, 6278, 6279, 6159, 6159, 6279, 6280, 6160, 6160, 6280, 6281, 6161, 6161, 6281, 6282, 6162, 6162, 6282, 6283, 6163, 6163, 6283, 6284, 6164, 6164, 6284, 6285, 6165, 6165, 6285, 6286, 6166, 6166, 6286, 6287, 6167, 6167, 6287, 6288, 6168, 6168, 6288, 6289, 6169, 6169, 6289, 6290, 6170, 6170, 6290, 6291, 6171, 6171, 6291, 6292, 6172, 6172, 6292, 6293, 6173, 6173, 6293, 6294, 6174, 6174, 6294, 6295, 6175, 6175, 6295, 6296, 6176, 6176, 6296, 6297, 6177, 6177, 6297, 6298, 6178, 6178, 6298, 6299, 6179, 6179, 6299, 6300, 6180, 6180, 6300, 6301, 6181, 6181, 6301, 6302, 6182, 6182, 6302, 6303, 6183, 6183, 6303, 6304, 6184, 6184, 6304, 6305, 6185, 6185, 6305, 6306, 6186, 6186, 6306, 6307, 6187, 6187, 6307, 6308, 6188, 6188, 6308, 6309, 6189, 6189, 6309, 6310, 6190, 6190, 6310, 6311, 6191, 6191, 6311, 6312, 6192, 6192, 6312, 6313, 6193, 6193, 6313, 6314, 6194, 6194, 6314, 6315, 6195, 6195, 6315, 6316, 6196, 6196, 6316, 6317, 6197, 6197, 6317, 6318, 6198, 6198, 6318, 6319, 6199, 6199, 6319, 6320, 6200, 6200, 6320, 6321, 6201, 6201, 6321, 6322, 6202, 6202, 6322, 6323, 6203, 6203, 6323, 6324, 6204, 6204, 6324, 6325, 6205, 6205, 6325, 6326, 6206, 6206, 6326, 6327, 6207, 6207, 6327, 6328, 6208, 6208, 6328, 6329, 6209, 6209, 6329, 6330, 6210, 6210, 6330, 6331, 6211, 6211, 6331, 6332, 6212, 6212, 6332, 6333, 6213, 6213, 6333, 6334, 6214, 6214, 6334, 6335, 6215, 6215, 6335, 6336, 6216, 6216, 6336, 6337, 6217, 6217, 6337, 6338, 6218, 6218, 6338, 6339, 6219, 6219, 6339, 6340, 6220, 6220, 6340, 6341, 6221, 6221, 6341, 6342, 6222, 6222, 6342, 6343, 6223, 6223, 6343, 6344, 6224, 6224, 6344, 6345, 6225, 6225, 6345, 6346, 6226, 6226, 6346, 6347, 6227, 6227, 6347, 6348, 6228, 6228, 6348, 6349, 6229, 6229, 6349, 6350, 6230, 6230, 6350, 6351, 6231, 6231, 6351, 6352, 6232, 6232, 6352, 6353, 6233, 6233, 6353, 6354, 6234, 6234, 6354, 6355, 6235, 6235, 6355, 6356, 6236, 6236, 6356, 6357, 6237, 6237, 6357, 6358, 6238, 6238, 6358, 6359, 6239, 6239, 6359, 6360, 6240, 6240, 6360, 6241, 6121, 6241, 6361, 6362, 6242, 6242, 6362, 6363, 6243, 6243, 6363, 6364, 6244, 6244, 6364, 6365, 6245, 6245, 6365, 6366, 6246, 6246, 6366, 6367, 6247, 6247, 6367, 6368, 6248, 6248, 6368, 6369, 6249, 6249, 6369, 6370, 6250, 6250, 6370, 6371, 6251, 6251, 6371, 6372, 6252, 6252, 6372, 6373, 6253, 6253, 6373, 6374, 6254, 6254, 6374, 6375, 6255, 6255, 6375, 6376, 6256, 6256, 6376, 6377, 6257, 6257, 6377, 6378, 6258, 6258, 6378, 6379, 6259, 6259, 6379, 6380, 6260, 6260, 6380, 6381, 6261, 6261, 6381, 6382, 6262, 6262, 6382, 6383, 6263, 6263, 6383, 6384, 6264, 6264, 6384, 6385, 6265, 6265, 6385, 6386, 6266, 6266, 6386, 6387, 6267, 6267, 6387, 6388, 6268, 6268, 6388, 6389, 6269, 6269, 6389, 6390, 6270, 6270, 6390, 6391, 6271, 6271, 6391, 6392, 6272, 6272, 6392, 6393, 6273, 6273, 6393, 6394, 6274, 6274, 6394, 6395, 6275, 6275, 6395, 6396, 6276, 6276, 6396, 6397, 6277, 6277, 6397, 6398, 6278, 6278, 6398, 6399, 6279, 6279, 6399, 6400, 6280, 6280, 6400, 6401, 6281, 6281, 6401, 6402, 6282, 6282, 6402, 6403, 6283, 6283, 6403, 6404, 6284, 6284, 6404, 6405, 6285, 6285, 6405, 6406, 6286, 6286, 6406, 6407, 6287, 6287, 6407, 6408, 6288, 6288, 6408, 6409, 6289, 6289, 6409, 6410, 6290, 6290, 6410, 6411, 6291, 6291, 6411, 6412, 6292, 6292, 6412, 6413, 6293, 6293, 6413, 6414, 6294, 6294, 6414, 6415, 6295, 6295, 6415, 6416, 6296, 6296, 6416, 6417, 6297, 6297, 6417, 6418, 6298, 6298, 6418, 6419, 6299, 6299, 6419, 6420, 6300, 6300, 6420, 6421, 6301, 6301, 6421, 6422, 6302, 6302, 6422, 6423, 6303, 6303, 6423, 6424, 6304, 6304, 6424, 6425, 6305, 6305, 6425, 6426, 6306, 6306, 6426, 6427, 6307, 6307, 6427, 6428, 6308, 6308, 6428, 6429, 6309, 6309, 6429, 6430, 6310, 6310, 6430, 6431, 6311, 6311, 6431, 6432, 6312, 6312, 6432, 6433, 6313, 6313, 6433, 6434, 6314, 6314, 6434, 6435, 6315, 6315, 6435, 6436, 6316, 6316, 6436, 6437, 6317, 6317, 6437, 6438, 6318, 6318, 6438, 6439, 6319, 6319, 6439, 6440, 6320, 6320, 6440, 6441, 6321, 6321, 6441, 6442, 6322, 6322, 6442, 6443, 6323, 6323, 6443, 6444, 6324, 6324, 6444, 6445, 6325, 6325, 6445, 6446, 6326, 6326, 6446, 6447, 6327, 6327, 6447, 6448, 6328, 6328, 6448, 6449, 6329, 6329, 6449, 6450, 6330, 6330, 6450, 6451, 6331, 6331, 6451, 6452, 6332, 6332, 6452, 6453, 6333, 6333, 6453, 6454, 6334, 6334, 6454, 6455, 6335, 6335, 6455, 6456, 6336, 6336, 6456, 6457, 6337, 6337, 6457, 6458, 6338, 6338, 6458, 6459, 6339, 6339, 6459, 6460, 6340, 6340, 6460, 6461, 6341, 6341, 6461, 6462, 6342, 6342, 6462, 6463, 6343, 6343, 6463, 6464, 6344, 6344, 6464, 6465, 6345, 6345, 6465, 6466, 6346, 6346, 6466, 6467, 6347, 6347, 6467, 6468, 6348, 6348, 6468, 6469, 6349, 6349, 6469, 6470, 6350, 6350, 6470, 6471, 6351, 6351, 6471, 6472, 6352, 6352, 6472, 6473, 6353, 6353, 6473, 6474, 6354, 6354, 6474, 6475, 6355, 6355, 6475, 6476, 6356, 6356, 6476, 6477, 6357, 6357, 6477, 6478, 6358, 6358, 6478, 6479, 6359, 6359, 6479, 6480, 6360, 6360, 6480, 6361, 6241, 6361, 6481, 6482, 6362, 6362, 6482, 6483, 6363, 6363, 6483, 6484, 6364, 6364, 6484, 6485, 6365, 6365, 6485, 6486, 6366, 6366, 6486, 6487, 6367, 6367, 6487, 6488, 6368, 6368, 6488, 6489, 6369, 6369, 6489, 6490, 6370, 6370, 6490, 6491, 6371, 6371, 6491, 6492, 6372, 6372, 6492, 6493, 6373, 6373, 6493, 6494, 6374, 6374, 6494, 6495, 6375, 6375, 6495, 6496, 6376, 6376, 6496, 6497, 6377, 6377, 6497, 6498, 6378, 6378, 6498, 6499, 6379, 6379, 6499, 6500, 6380, 6380, 6500, 6501, 6381, 6381, 6501, 6502, 6382, 6382, 6502, 6503, 6383, 6383, 6503, 6504, 6384, 6384, 6504, 6505, 6385, 6385, 6505, 6506, 6386, 6386, 6506, 6507, 6387, 6387, 6507, 6508, 6388, 6388, 6508, 6509, 6389, 6389, 6509, 6510, 6390, 6390, 6510, 6511, 6391, 6391, 6511, 6512, 6392, 6392, 6512, 6513, 6393, 6393, 6513, 6514, 6394, 6394, 6514, 6515, 6395, 6395, 6515, 6516, 6396, 6396, 6516, 6517, 6397, 6397, 6517, 6518, 6398, 6398, 6518, 6519, 6399, 6399, 6519, 6520, 6400, 6400, 6520, 6521, 6401, 6401, 6521, 6522, 6402, 6402, 6522, 6523, 6403, 6403, 6523, 6524, 6404, 6404, 6524, 6525, 6405, 6405, 6525, 6526, 6406, 6406, 6526, 6527, 6407, 6407, 6527, 6528, 6408, 6408, 6528, 6529, 6409, 6409, 6529, 6530, 6410, 6410, 6530, 6531, 6411, 6411, 6531, 6532, 6412, 6412, 6532, 6533, 6413, 6413, 6533, 6534, 6414, 6414, 6534, 6535, 6415, 6415, 6535, 6536, 6416, 6416, 6536, 6537, 6417, 6417, 6537, 6538, 6418, 6418, 6538, 6539, 6419, 6419, 6539, 6540, 6420, 6420, 6540, 6541, 6421, 6421, 6541, 6542, 6422, 6422, 6542, 6543, 6423, 6423, 6543, 6544, 6424, 6424, 6544, 6545, 6425, 6425, 6545, 6546, 6426, 6426, 6546, 6547, 6427, 6427, 6547, 6548, 6428, 6428, 6548, 6549, 6429, 6429, 6549, 6550, 6430, 6430, 6550, 6551, 6431, 6431, 6551, 6552, 6432, 6432, 6552, 6553, 6433, 6433, 6553, 6554, 6434, 6434, 6554, 6555, 6435, 6435, 6555, 6556, 6436, 6436, 6556, 6557, 6437, 6437, 6557, 6558, 6438, 6438, 6558, 6559, 6439, 6439, 6559, 6560, 6440, 6440, 6560, 6561, 6441, 6441, 6561, 6562, 6442, 6442, 6562, 6563, 6443, 6443, 6563, 6564, 6444, 6444, 6564, 6565, 6445, 6445, 6565, 6566, 6446, 6446, 6566, 6567, 6447, 6447, 6567, 6568, 6448, 6448, 6568, 6569, 6449, 6449, 6569, 6570, 6450, 6450, 6570, 6571, 6451, 6451, 6571, 6572, 6452, 6452, 6572, 6573, 6453, 6453, 6573, 6574, 6454, 6454, 6574, 6575, 6455, 6455, 6575, 6576, 6456, 6456, 6576, 6577, 6457, 6457, 6577, 6578, 6458, 6458, 6578, 6579, 6459, 6459, 6579, 6580, 6460, 6460, 6580, 6581, 6461, 6461, 6581, 6582, 6462, 6462, 6582, 6583, 6463, 6463, 6583, 6584, 6464, 6464, 6584, 6585, 6465, 6465, 6585, 6586, 6466, 6466, 6586, 6587, 6467, 6467, 6587, 6588, 6468, 6468, 6588, 6589, 6469, 6469, 6589, 6590, 6470, 6470, 6590, 6591, 6471, 6471, 6591, 6592, 6472, 6472, 6592, 6593, 6473, 6473, 6593, 6594, 6474, 6474, 6594, 6595, 6475, 6475, 6595, 6596, 6476, 6476, 6596, 6597, 6477, 6477, 6597, 6598, 6478, 6478, 6598, 6599, 6479, 6479, 6599, 6600, 6480, 6480, 6600, 6481, 6361, 6481, 6601, 6602, 6482, 6482, 6602, 6603, 6483, 6483, 6603, 6604, 6484, 6484, 6604, 6605, 6485, 6485, 6605, 6606, 6486, 6486, 6606, 6607, 6487, 6487, 6607, 6608, 6488, 6488, 6608, 6609, 6489, 6489, 6609, 6610, 6490, 6490, 6610, 6611, 6491, 6491, 6611, 6612, 6492, 6492, 6612, 6613, 6493, 6493, 6613, 6614, 6494, 6494, 6614, 6615, 6495, 6495, 6615, 6616, 6496, 6496, 6616, 6617, 6497, 6497, 6617, 6618, 6498, 6498, 6618, 6619, 6499, 6499, 6619, 6620, 6500, 6500, 6620, 6621, 6501, 6501, 6621, 6622, 6502, 6502, 6622, 6623, 6503, 6503, 6623, 6624, 6504, 6504, 6624, 6625, 6505, 6505, 6625, 6626, 6506, 6506, 6626, 6627, 6507, 6507, 6627, 6628, 6508, 6508, 6628, 6629, 6509, 6509, 6629, 6630, 6510, 6510, 6630, 6631, 6511, 6511, 6631, 6632, 6512, 6512, 6632, 6633, 6513, 6513, 6633, 6634, 6514, 6514, 6634, 6635, 6515, 6515, 6635, 6636, 6516, 6516, 6636, 6637, 6517, 6517, 6637, 6638, 6518, 6518, 6638, 6639, 6519, 6519, 6639, 6640, 6520, 6520, 6640, 6641, 6521, 6521, 6641, 6642, 6522, 6522, 6642, 6643, 6523, 6523, 6643, 6644, 6524, 6524, 6644, 6645, 6525, 6525, 6645, 6646, 6526, 6526, 6646, 6647, 6527, 6527, 6647, 6648, 6528, 6528, 6648, 6649, 6529, 6529, 6649, 6650, 6530, 6530, 6650, 6651, 6531, 6531, 6651, 6652, 6532, 6532, 6652, 6653, 6533, 6533, 6653, 6654, 6534, 6534, 6654, 6655, 6535, 6535, 6655, 6656, 6536, 6536, 6656, 6657, 6537, 6537, 6657, 6658, 6538, 6538, 6658, 6659, 6539, 6539, 6659, 6660, 6540, 6540, 6660, 6661, 6541, 6541, 6661, 6662, 6542, 6542, 6662, 6663, 6543, 6543, 6663, 6664, 6544, 6544, 6664, 6665, 6545, 6545, 6665, 6666, 6546, 6546, 6666, 6667, 6547, 6547, 6667, 6668, 6548, 6548, 6668, 6669, 6549, 6549, 6669, 6670, 6550, 6550, 6670, 6671, 6551, 6551, 6671, 6672, 6552, 6552, 6672, 6673, 6553, 6553, 6673, 6674, 6554, 6554, 6674, 6675, 6555, 6555, 6675, 6676, 6556, 6556, 6676, 6677, 6557, 6557, 6677, 6678, 6558, 6558, 6678, 6679, 6559, 6559, 6679, 6680, 6560, 6560, 6680, 6681, 6561, 6561, 6681, 6682, 6562, 6562, 6682, 6683, 6563, 6563, 6683, 6684, 6564, 6564, 6684, 6685, 6565, 6565, 6685, 6686, 6566, 6566, 6686, 6687, 6567, 6567, 6687, 6688, 6568, 6568, 6688, 6689, 6569, 6569, 6689, 6690, 6570, 6570, 6690, 6691, 6571, 6571, 6691, 6692, 6572, 6572, 6692, 6693, 6573, 6573, 6693, 6694, 6574, 6574, 6694, 6695, 6575, 6575, 6695, 6696, 6576, 6576, 6696, 6697, 6577, 6577, 6697, 6698, 6578, 6578, 6698, 6699, 6579, 6579, 6699, 6700, 6580, 6580, 6700, 6701, 6581, 6581, 6701, 6702, 6582, 6582, 6702, 6703, 6583, 6583, 6703, 6704, 6584, 6584, 6704, 6705, 6585, 6585, 6705, 6706, 6586, 6586, 6706, 6707, 6587, 6587, 6707, 6708, 6588, 6588, 6708, 6709, 6589, 6589, 6709, 6710, 6590, 6590, 6710, 6711, 6591, 6591, 6711, 6712, 6592, 6592, 6712, 6713, 6593, 6593, 6713, 6714, 6594, 6594, 6714, 6715, 6595, 6595, 6715, 6716, 6596, 6596, 6716, 6717, 6597, 6597, 6717, 6718, 6598, 6598, 6718, 6719, 6599, 6599, 6719, 6720, 6600, 6600, 6720, 6601, 6481, 6601, 6721, 6722, 6602, 6602, 6722, 6723, 6603, 6603, 6723, 6724, 6604, 6604, 6724, 6725, 6605, 6605, 6725, 6726, 6606, 6606, 6726, 6727, 6607, 6607, 6727, 6728, 6608, 6608, 6728, 6729, 6609, 6609, 6729, 6730, 6610, 6610, 6730, 6731, 6611, 6611, 6731, 6732, 6612, 6612, 6732, 6733, 6613, 6613, 6733, 6734, 6614, 6614, 6734, 6735, 6615, 6615, 6735, 6736, 6616, 6616, 6736, 6737, 6617, 6617, 6737, 6738, 6618, 6618, 6738, 6739, 6619, 6619, 6739, 6740, 6620, 6620, 6740, 6741, 6621, 6621, 6741, 6742, 6622, 6622, 6742, 6743, 6623, 6623, 6743, 6744, 6624, 6624, 6744, 6745, 6625, 6625, 6745, 6746, 6626, 6626, 6746, 6747, 6627, 6627, 6747, 6748, 6628, 6628, 6748, 6749, 6629, 6629, 6749, 6750, 6630, 6630, 6750, 6751, 6631, 6631, 6751, 6752, 6632, 6632, 6752, 6753, 6633, 6633, 6753, 6754, 6634, 6634, 6754, 6755, 6635, 6635, 6755, 6756, 6636, 6636, 6756, 6757, 6637, 6637, 6757, 6758, 6638, 6638, 6758, 6759, 6639, 6639, 6759, 6760, 6640, 6640, 6760, 6761, 6641, 6641, 6761, 6762, 6642, 6642, 6762, 6763, 6643, 6643, 6763, 6764, 6644, 6644, 6764, 6765, 6645, 6645, 6765, 6766, 6646, 6646, 6766, 6767, 6647, 6647, 6767, 6768, 6648, 6648, 6768, 6769, 6649, 6649, 6769, 6770, 6650, 6650, 6770, 6771, 6651, 6651, 6771, 6772, 6652, 6652, 6772, 6773, 6653, 6653, 6773, 6774, 6654, 6654, 6774, 6775, 6655, 6655, 6775, 6776, 6656, 6656, 6776, 6777, 6657, 6657, 6777, 6778, 6658, 6658, 6778, 6779, 6659, 6659, 6779, 6780, 6660, 6660, 6780, 6781, 6661, 6661, 6781, 6782, 6662, 6662, 6782, 6783, 6663, 6663, 6783, 6784, 6664, 6664, 6784, 6785, 6665, 6665, 6785, 6786, 6666, 6666, 6786, 6787, 6667, 6667, 6787, 6788, 6668, 6668, 6788, 6789, 6669, 6669, 6789, 6790, 6670, 6670, 6790, 6791, 6671, 6671, 6791, 6792, 6672, 6672, 6792, 6793, 6673, 6673, 6793, 6794, 6674, 6674, 6794, 6795, 6675, 6675, 6795, 6796, 6676, 6676, 6796, 6797, 6677, 6677, 6797, 6798, 6678, 6678, 6798, 6799, 6679, 6679, 6799, 6800, 6680, 6680, 6800, 6801, 6681, 6681, 6801, 6802, 6682, 6682, 6802, 6803, 6683, 6683, 6803, 6804, 6684, 6684, 6804, 6805, 6685, 6685, 6805, 6806, 6686, 6686, 6806, 6807, 6687, 6687, 6807, 6808, 6688, 6688, 6808, 6809, 6689, 6689, 6809, 6810, 6690, 6690, 6810, 6811, 6691, 6691, 6811, 6812, 6692, 6692, 6812, 6813, 6693, 6693, 6813, 6814, 6694, 6694, 6814, 6815, 6695, 6695, 6815, 6816, 6696, 6696, 6816, 6817, 6697, 6697, 6817, 6818, 6698, 6698, 6818, 6819, 6699, 6699, 6819, 6820, 6700, 6700, 6820, 6821, 6701, 6701, 6821, 6822, 6702, 6702, 6822, 6823, 6703, 6703, 6823, 6824, 6704, 6704, 6824, 6825, 6705, 6705, 6825, 6826, 6706, 6706, 6826, 6827, 6707, 6707, 6827, 6828, 6708, 6708, 6828, 6829, 6709, 6709, 6829, 6830, 6710, 6710, 6830, 6831, 6711, 6711, 6831, 6832, 6712, 6712, 6832, 6833, 6713, 6713, 6833, 6834, 6714, 6714, 6834, 6835, 6715, 6715, 6835, 6836, 6716, 6716, 6836, 6837, 6717, 6717, 6837, 6838, 6718, 6718, 6838, 6839, 6719, 6719, 6839, 6840, 6720, 6720, 6840, 6721, 6601, 6721, 6841, 6842, 6722, 6722, 6842, 6843, 6723, 6723, 6843, 6844, 6724, 6724, 6844, 6845, 6725, 6725, 6845, 6846, 6726, 6726, 6846, 6847, 6727, 6727, 6847, 6848, 6728, 6728, 6848, 6849, 6729, 6729, 6849, 6850, 6730, 6730, 6850, 6851, 6731, 6731, 6851, 6852, 6732, 6732, 6852, 6853, 6733, 6733, 6853, 6854, 6734, 6734, 6854, 6855, 6735, 6735, 6855, 6856, 6736, 6736, 6856, 6857, 6737, 6737, 6857, 6858, 6738, 6738, 6858, 6859, 6739, 6739, 6859, 6860, 6740, 6740, 6860, 6861, 6741, 6741, 6861, 6862, 6742, 6742, 6862, 6863, 6743, 6743, 6863, 6864, 6744, 6744, 6864, 6865, 6745, 6745, 6865, 6866, 6746, 6746, 6866, 6867, 6747, 6747, 6867, 6868, 6748, 6748, 6868, 6869, 6749, 6749, 6869, 6870, 6750, 6750, 6870, 6871, 6751, 6751, 6871, 6872, 6752, 6752, 6872, 6873, 6753, 6753, 6873, 6874, 6754, 6754, 6874, 6875, 6755, 6755, 6875, 6876, 6756, 6756, 6876, 6877, 6757, 6757, 6877, 6878, 6758, 6758, 6878, 6879, 6759, 6759, 6879, 6880, 6760, 6760, 6880, 6881, 6761, 6761, 6881, 6882, 6762, 6762, 6882, 6883, 6763, 6763, 6883, 6884, 6764, 6764, 6884, 6885, 6765, 6765, 6885, 6886, 6766, 6766, 6886, 6887, 6767, 6767, 6887, 6888, 6768, 6768, 6888, 6889, 6769, 6769, 6889, 6890, 6770, 6770, 6890, 6891, 6771, 6771, 6891, 6892, 6772, 6772, 6892, 6893, 6773, 6773, 6893, 6894, 6774, 6774, 6894, 6895, 6775, 6775, 6895, 6896, 6776, 6776, 6896, 6897, 6777, 6777, 6897, 6898, 6778, 6778, 6898, 6899, 6779, 6779, 6899, 6900, 6780, 6780, 6900, 6901, 6781, 6781, 6901, 6902, 6782, 6782, 6902, 6903, 6783, 6783, 6903, 6904, 6784, 6784, 6904, 6905, 6785, 6785, 6905, 6906, 6786, 6786, 6906, 6907, 6787, 6787, 6907, 6908, 6788, 6788, 6908, 6909, 6789, 6789, 6909, 6910, 6790, 6790, 6910, 6911, 6791, 6791, 6911, 6912, 6792, 6792, 6912, 6913, 6793, 6793, 6913, 6914, 6794, 6794, 6914, 6915, 6795, 6795, 6915, 6916, 6796, 6796, 6916, 6917, 6797, 6797, 6917, 6918, 6798, 6798, 6918, 6919, 6799, 6799, 6919, 6920, 6800, 6800, 6920, 6921, 6801, 6801, 6921, 6922, 6802, 6802, 6922, 6923, 6803, 6803, 6923, 6924, 6804, 6804, 6924, 6925, 6805, 6805, 6925, 6926, 6806, 6806, 6926, 6927, 6807, 6807, 6927, 6928, 6808, 6808, 6928, 6929, 6809, 6809, 6929, 6930, 6810, 6810, 6930, 6931, 6811, 6811, 6931, 6932, 6812, 6812, 6932, 6933, 6813, 6813, 6933, 6934, 6814, 6814, 6934, 6935, 6815, 6815, 6935, 6936, 6816, 6816, 6936, 6937, 6817, 6817, 6937, 6938, 6818, 6818, 6938, 6939, 6819, 6819, 6939, 6940, 6820, 6820, 6940, 6941, 6821, 6821, 6941, 6942, 6822, 6822, 6942, 6943, 6823, 6823, 6943, 6944, 6824, 6824, 6944, 6945, 6825, 6825, 6945, 6946, 6826, 6826, 6946, 6947, 6827, 6827, 6947, 6948, 6828, 6828, 6948, 6949, 6829, 6829, 6949, 6950, 6830, 6830, 6950, 6951, 6831, 6831, 6951, 6952, 6832, 6832, 6952, 6953, 6833, 6833, 6953, 6954, 6834, 6834, 6954, 6955, 6835, 6835, 6955, 6956, 6836, 6836, 6956, 6957, 6837, 6837, 6957, 6958, 6838, 6838, 6958, 6959, 6839, 6839, 6959, 6960, 6840, 6840, 6960, 6841, 6721, 6841, 6961, 6962, 6842, 6842, 6962, 6963, 6843, 6843, 6963, 6964, 6844, 6844, 6964, 6965, 6845, 6845, 6965, 6966, 6846, 6846, 6966, 6967, 6847, 6847, 6967, 6968, 6848, 6848, 6968, 6969, 6849, 6849, 6969, 6970, 6850, 6850, 6970, 6971, 6851, 6851, 6971, 6972, 6852, 6852, 6972, 6973, 6853, 6853, 6973, 6974, 6854, 6854, 6974, 6975, 6855, 6855, 6975, 6976, 6856, 6856, 6976, 6977, 6857, 6857, 6977, 6978, 6858, 6858, 6978, 6979, 6859, 6859, 6979, 6980, 6860, 6860, 6980, 6981, 6861, 6861, 6981, 6982, 6862, 6862, 6982, 6983, 6863, 6863, 6983, 6984, 6864, 6864, 6984, 6985, 6865, 6865, 6985, 6986, 6866, 6866, 6986, 6987, 6867, 6867, 6987, 6988, 6868, 6868, 6988, 6989, 6869, 6869, 6989, 6990, 6870, 6870, 6990, 6991, 6871, 6871, 6991, 6992, 6872, 6872, 6992, 6993, 6873, 6873, 6993, 6994, 6874, 6874, 6994, 6995, 6875, 6875, 6995, 6996, 6876, 6876, 6996, 6997, 6877, 6877, 6997, 6998, 6878, 6878, 6998, 6999, 6879, 6879, 6999, 7000, 6880, 6880, 7000, 7001, 6881, 6881, 7001, 7002, 6882, 6882, 7002, 7003, 6883, 6883, 7003, 7004, 6884, 6884, 7004, 7005, 6885, 6885, 7005, 7006, 6886, 6886, 7006, 7007, 6887, 6887, 7007, 7008, 6888, 6888, 7008, 7009, 6889, 6889, 7009, 7010, 6890, 6890, 7010, 7011, 6891, 6891, 7011, 7012, 6892, 6892, 7012, 7013, 6893, 6893, 7013, 7014, 6894, 6894, 7014, 7015, 6895, 6895, 7015, 7016, 6896, 6896, 7016, 7017, 6897, 6897, 7017, 7018, 6898, 6898, 7018, 7019, 6899, 6899, 7019, 7020, 6900, 6900, 7020, 7021, 6901, 6901, 7021, 7022, 6902, 6902, 7022, 7023, 6903, 6903, 7023, 7024, 6904, 6904, 7024, 7025, 6905, 6905, 7025, 7026, 6906, 6906, 7026, 7027, 6907, 6907, 7027, 7028, 6908, 6908, 7028, 7029, 6909, 6909, 7029, 7030, 6910, 6910, 7030, 7031, 6911, 6911, 7031, 7032, 6912, 6912, 7032, 7033, 6913, 6913, 7033, 7034, 6914, 6914, 7034, 7035, 6915, 6915, 7035, 7036, 6916, 6916, 7036, 7037, 6917, 6917, 7037, 7038, 6918, 6918, 7038, 7039, 6919, 6919, 7039, 7040, 6920, 6920, 7040, 7041, 6921, 6921, 7041, 7042, 6922, 6922, 7042, 7043, 6923, 6923, 7043, 7044, 6924, 6924, 7044, 7045, 6925, 6925, 7045, 7046, 6926, 6926, 7046, 7047, 6927, 6927, 7047, 7048, 6928, 6928, 7048, 7049, 6929, 6929, 7049, 7050, 6930, 6930, 7050, 7051, 6931, 6931, 7051, 7052, 6932, 6932, 7052, 7053, 6933, 6933, 7053, 7054, 6934, 6934, 7054, 7055, 6935, 6935, 7055, 7056, 6936, 6936, 7056, 7057, 6937, 6937, 7057, 7058, 6938, 6938, 7058, 7059, 6939, 6939, 7059, 7060, 6940, 6940, 7060, 7061, 6941, 6941, 7061, 7062, 6942, 6942, 7062, 7063, 6943, 6943, 7063, 7064, 6944, 6944, 7064, 7065, 6945, 6945, 7065, 7066, 6946, 6946, 7066, 7067, 6947, 6947, 7067, 7068, 6948, 6948, 7068, 7069, 6949, 6949, 7069, 7070, 6950, 6950, 7070, 7071, 6951, 6951, 7071, 7072, 6952, 6952, 7072, 7073, 6953, 6953, 7073, 7074, 6954, 6954, 7074, 7075, 6955, 6955, 7075, 7076, 6956, 6956, 7076, 7077, 6957, 6957, 7077, 7078, 6958, 6958, 7078, 7079, 6959, 6959, 7079, 7080, 6960, 6960, 7080, 6961, 6841, 7081, 6962, 6961, 7081, 6963, 6962, 7081, 6964, 6963, 7081, 6965, 6964, 7081, 6966, 6965, 7081, 6967, 6966, 7081, 6968, 6967, 7081, 6969, 6968, 7081, 6970, 6969, 7081, 6971, 6970, 7081, 6972, 6971, 7081, 6973, 6972, 7081, 6974, 6973, 7081, 6975, 6974, 7081, 6976, 6975, 7081, 6977, 6976, 7081, 6978, 6977, 7081, 6979, 6978, 7081, 6980, 6979, 7081, 6981, 6980, 7081, 6982, 6981, 7081, 6983, 6982, 7081, 6984, 6983, 7081, 6985, 6984, 7081, 6986, 6985, 7081, 6987, 6986, 7081, 6988, 6987, 7081, 6989, 6988, 7081, 6990, 6989, 7081, 6991, 6990, 7081, 6992, 6991, 7081, 6993, 6992, 7081, 6994, 6993, 7081, 6995, 6994, 7081, 6996, 6995, 7081, 6997, 6996, 7081, 6998, 6997, 7081, 6999, 6998, 7081, 7000, 6999, 7081, 7001, 7000, 7081, 7002, 7001, 7081, 7003, 7002, 7081, 7004, 7003, 7081, 7005, 7004, 7081, 7006, 7005, 7081, 7007, 7006, 7081, 7008, 7007, 7081, 7009, 7008, 7081, 7010, 7009, 7081, 7011, 7010, 7081, 7012, 7011, 7081, 7013, 7012, 7081, 7014, 7013, 7081, 7015, 7014, 7081, 7016, 7015, 7081, 7017, 7016, 7081, 7018, 7017, 7081, 7019, 7018, 7081, 7020, 7019, 7081, 7021, 7020, 7081, 7022, 7021, 7081, 7023, 7022, 7081, 7024, 7023, 7081, 7025, 7024, 7081, 7026, 7025, 7081, 7027, 7026, 7081, 7028, 7027, 7081, 7029, 7028, 7081, 7030, 7029, 7081, 7031, 7030, 7081, 7032, 7031, 7081, 7033, 7032, 7081, 7034, 7033, 7081, 7035, 7034, 7081, 7036, 7035, 7081, 7037, 7036, 7081, 7038, 7037, 7081, 7039, 7038, 7081, 7040, 7039, 7081, 7041, 7040, 7081, 7042, 7041, 7081, 7043, 7042, 7081, 7044, 7043, 7081, 7045, 7044, 7081, 7046, 7045, 7081, 7047, 7046, 7081, 7048, 7047, 7081, 7049, 7048, 7081, 7050, 7049, 7081, 7051, 7050, 7081, 7052, 7051, 7081, 7053, 7052, 7081, 7054, 7053, 7081, 7055, 7054, 7081, 7056, 7055, 7081, 7057, 7056, 7081, 7058, 7057, 7081, 7059, 7058, 7081, 7060, 7059, 7081, 7061, 7060, 7081, 7062, 7061, 7081, 7063, 7062, 7081, 7064, 7063, 7081, 7065, 7064, 7081, 7066, 7065, 7081, 7067, 7066, 7081, 7068, 7067, 7081, 7069, 7068, 7081, 7070, 7069, 7081, 7071, 7070, 7081, 7072, 7071, 7081, 7073, 7072, 7081, 7074, 7073, 7081, 7075, 7074, 7081, 7076, 7075, 7081, 7077, 7076, 7081, 7078, 7077, 7081, 7079, 7078, 7081, 7080, 7079, 7081, 6961, 7080] + normal3f[] normals = [(0, -50, 0), (2.616798, -49.931477, 0), (2.6132116, -49.931477, 0.13695261), (0, -50, 0), (2.6132116, -49.931477, 0.13695261), (2.6024628, -49.931477, 0.27352986), (0, -50, 0), (2.6024628, -49.931477, 0.27352986), (2.5845807, -49.931477, 0.40935737), (0, -50, 0), (2.5845807, -49.931477, 0.40935737), (2.5596144, -49.931477, 0.54406285), (0, -50, 0), (2.5596144, -49.931477, 0.54406285), (2.5276325, -49.931477, 0.6772771), (0, -50, 0), (2.5276325, -49.931477, 0.6772771), (2.4887226, -49.931477, 0.808635), (0, -50, 0), (2.4887226, -49.931477, 0.808635), (2.4429913, -49.931477, 0.93777645), (0, -50, 0), (2.4429913, -49.931477, 0.93777645), (2.3905637, -49.931477, 1.0643475), (0, -50, 0), (2.3905637, -49.931477, 1.0643475), (2.331584, -49.931477, 1.1880014), (0, -50, 0), (2.331584, -49.931477, 1.1880014), (2.2662134, -49.931477, 1.308399), (0, -50, 0), (2.2662134, -49.931477, 1.308399), (2.1946313, -49.931477, 1.4252102), (0, -50, 0), (2.1946313, -49.931477, 1.4252102), (2.117034, -49.931477, 1.5381151), (0, -50, 0), (2.117034, -49.931477, 1.5381151), (2.033634, -49.931477, 1.6468042), (0, -50, 0), (2.033634, -49.931477, 1.6468042), (1.9446597, -49.931477, 1.7509795), (0, -50, 0), (1.9446597, -49.931477, 1.7509795), (1.8503555, -49.931477, 1.8503555), (0, -50, 0), (1.8503555, -49.931477, 1.8503555), (1.7509795, -49.931477, 1.9446597), (0, -50, 0), (1.7509795, -49.931477, 1.9446597), (1.6468042, -49.931477, 2.033634), (0, -50, 0), (1.6468042, -49.931477, 2.033634), (1.5381151, -49.931477, 2.117034), (0, -50, 0), (1.5381151, -49.931477, 2.117034), (1.4252102, -49.931477, 2.1946313), (0, -50, 0), (1.4252102, -49.931477, 2.1946313), (1.308399, -49.931477, 2.2662134), (0, -50, 0), (1.308399, -49.931477, 2.2662134), (1.1880014, -49.931477, 2.331584), (0, -50, 0), (1.1880014, -49.931477, 2.331584), (1.0643475, -49.931477, 2.3905637), (0, -50, 0), (1.0643475, -49.931477, 2.3905637), (0.93777645, -49.931477, 2.4429913), (0, -50, 0), (0.93777645, -49.931477, 2.4429913), (0.808635, -49.931477, 2.4887226), (0, -50, 0), (0.808635, -49.931477, 2.4887226), (0.6772771, -49.931477, 2.5276325), (0, -50, 0), (0.6772771, -49.931477, 2.5276325), (0.54406285, -49.931477, 2.5596144), (0, -50, 0), (0.54406285, -49.931477, 2.5596144), (0.40935737, -49.931477, 2.5845807), (0, -50, 0), (0.40935737, -49.931477, 2.5845807), (0.27352986, -49.931477, 2.6024628), (0, -50, 0), (0.27352986, -49.931477, 2.6024628), (0.13695261, -49.931477, 2.6132116), (0, -50, 0), (0.13695261, -49.931477, 2.6132116), (1.6023265e-16, -49.931477, 2.616798), (0, -50, 0), (1.6023265e-16, -49.931477, 2.616798), (-0.13695261, -49.931477, 2.6132116), (0, -50, 0), (-0.13695261, -49.931477, 2.6132116), (-0.27352986, -49.931477, 2.6024628), (0, -50, 0), (-0.27352986, -49.931477, 2.6024628), (-0.40935737, -49.931477, 2.5845807), (0, -50, 0), (-0.40935737, -49.931477, 2.5845807), (-0.54406285, -49.931477, 2.5596144), (0, -50, 0), (-0.54406285, -49.931477, 2.5596144), (-0.6772771, -49.931477, 2.5276325), (0, -50, 0), (-0.6772771, -49.931477, 2.5276325), (-0.808635, -49.931477, 2.4887226), (0, -50, 0), (-0.808635, -49.931477, 2.4887226), (-0.93777645, -49.931477, 2.4429913), (0, -50, 0), (-0.93777645, -49.931477, 2.4429913), (-1.0643475, -49.931477, 2.3905637), (0, -50, 0), (-1.0643475, -49.931477, 2.3905637), (-1.1880014, -49.931477, 2.331584), (0, -50, 0), (-1.1880014, -49.931477, 2.331584), (-1.308399, -49.931477, 2.2662134), (0, -50, 0), (-1.308399, -49.931477, 2.2662134), (-1.4252102, -49.931477, 2.1946313), (0, -50, 0), (-1.4252102, -49.931477, 2.1946313), (-1.5381151, -49.931477, 2.117034), (0, -50, 0), (-1.5381151, -49.931477, 2.117034), (-1.6468042, -49.931477, 2.033634), (0, -50, 0), (-1.6468042, -49.931477, 2.033634), (-1.7509795, -49.931477, 1.9446597), (0, -50, 0), (-1.7509795, -49.931477, 1.9446597), (-1.8503555, -49.931477, 1.8503555), (0, -50, 0), (-1.8503555, -49.931477, 1.8503555), (-1.9446597, -49.931477, 1.7509795), (0, -50, 0), (-1.9446597, -49.931477, 1.7509795), (-2.033634, -49.931477, 1.6468042), (0, -50, 0), (-2.033634, -49.931477, 1.6468042), (-2.117034, -49.931477, 1.5381151), (0, -50, 0), (-2.117034, -49.931477, 1.5381151), (-2.1946313, -49.931477, 1.4252102), (0, -50, 0), (-2.1946313, -49.931477, 1.4252102), (-2.2662134, -49.931477, 1.308399), (0, -50, 0), (-2.2662134, -49.931477, 1.308399), (-2.331584, -49.931477, 1.1880014), (0, -50, 0), (-2.331584, -49.931477, 1.1880014), (-2.3905637, -49.931477, 1.0643475), (0, -50, 0), (-2.3905637, -49.931477, 1.0643475), (-2.4429913, -49.931477, 0.93777645), (0, -50, 0), (-2.4429913, -49.931477, 0.93777645), (-2.4887226, -49.931477, 0.808635), (0, -50, 0), (-2.4887226, -49.931477, 0.808635), (-2.5276325, -49.931477, 0.6772771), (0, -50, 0), (-2.5276325, -49.931477, 0.6772771), (-2.5596144, -49.931477, 0.54406285), (0, -50, 0), (-2.5596144, -49.931477, 0.54406285), (-2.5845807, -49.931477, 0.40935737), (0, -50, 0), (-2.5845807, -49.931477, 0.40935737), (-2.6024628, -49.931477, 0.27352986), (0, -50, 0), (-2.6024628, -49.931477, 0.27352986), (-2.6132116, -49.931477, 0.13695261), (0, -50, 0), (-2.6132116, -49.931477, 0.13695261), (-2.616798, -49.931477, 3.204653e-16), (0, -50, 0), (-2.616798, -49.931477, 3.204653e-16), (-2.6132116, -49.931477, -0.13695261), (0, -50, 0), (-2.6132116, -49.931477, -0.13695261), (-2.6024628, -49.931477, -0.27352986), (0, -50, 0), (-2.6024628, -49.931477, -0.27352986), (-2.5845807, -49.931477, -0.40935737), (0, -50, 0), (-2.5845807, -49.931477, -0.40935737), (-2.5596144, -49.931477, -0.54406285), (0, -50, 0), (-2.5596144, -49.931477, -0.54406285), (-2.5276325, -49.931477, -0.6772771), (0, -50, 0), (-2.5276325, -49.931477, -0.6772771), (-2.4887226, -49.931477, -0.808635), (0, -50, 0), (-2.4887226, -49.931477, -0.808635), (-2.4429913, -49.931477, -0.93777645), (0, -50, 0), (-2.4429913, -49.931477, -0.93777645), (-2.3905637, -49.931477, -1.0643475), (0, -50, 0), (-2.3905637, -49.931477, -1.0643475), (-2.331584, -49.931477, -1.1880014), (0, -50, 0), (-2.331584, -49.931477, -1.1880014), (-2.2662134, -49.931477, -1.308399), (0, -50, 0), (-2.2662134, -49.931477, -1.308399), (-2.1946313, -49.931477, -1.4252102), (0, -50, 0), (-2.1946313, -49.931477, -1.4252102), (-2.117034, -49.931477, -1.5381151), (0, -50, 0), (-2.117034, -49.931477, -1.5381151), (-2.033634, -49.931477, -1.6468042), (0, -50, 0), (-2.033634, -49.931477, -1.6468042), (-1.9446597, -49.931477, -1.7509795), (0, -50, 0), (-1.9446597, -49.931477, -1.7509795), (-1.8503555, -49.931477, -1.8503555), (0, -50, 0), (-1.8503555, -49.931477, -1.8503555), (-1.7509795, -49.931477, -1.9446597), (0, -50, 0), (-1.7509795, -49.931477, -1.9446597), (-1.6468042, -49.931477, -2.033634), (0, -50, 0), (-1.6468042, -49.931477, -2.033634), (-1.5381151, -49.931477, -2.117034), (0, -50, 0), (-1.5381151, -49.931477, -2.117034), (-1.4252102, -49.931477, -2.1946313), (0, -50, 0), (-1.4252102, -49.931477, -2.1946313), (-1.308399, -49.931477, -2.2662134), (0, -50, 0), (-1.308399, -49.931477, -2.2662134), (-1.1880014, -49.931477, -2.331584), (0, -50, 0), (-1.1880014, -49.931477, -2.331584), (-1.0643475, -49.931477, -2.3905637), (0, -50, 0), (-1.0643475, -49.931477, -2.3905637), (-0.93777645, -49.931477, -2.4429913), (0, -50, 0), (-0.93777645, -49.931477, -2.4429913), (-0.808635, -49.931477, -2.4887226), (0, -50, 0), (-0.808635, -49.931477, -2.4887226), (-0.6772771, -49.931477, -2.5276325), (0, -50, 0), (-0.6772771, -49.931477, -2.5276325), (-0.54406285, -49.931477, -2.5596144), (0, -50, 0), (-0.54406285, -49.931477, -2.5596144), (-0.40935737, -49.931477, -2.5845807), (0, -50, 0), (-0.40935737, -49.931477, -2.5845807), (-0.27352986, -49.931477, -2.6024628), (0, -50, 0), (-0.27352986, -49.931477, -2.6024628), (-0.13695261, -49.931477, -2.6132116), (0, -50, 0), (-0.13695261, -49.931477, -2.6132116), (-4.80698e-16, -49.931477, -2.616798), (0, -50, 0), (-4.80698e-16, -49.931477, -2.616798), (0.13695261, -49.931477, -2.6132116), (0, -50, 0), (0.13695261, -49.931477, -2.6132116), (0.27352986, -49.931477, -2.6024628), (0, -50, 0), (0.27352986, -49.931477, -2.6024628), (0.40935737, -49.931477, -2.5845807), (0, -50, 0), (0.40935737, -49.931477, -2.5845807), (0.54406285, -49.931477, -2.5596144), (0, -50, 0), (0.54406285, -49.931477, -2.5596144), (0.6772771, -49.931477, -2.5276325), (0, -50, 0), (0.6772771, -49.931477, -2.5276325), (0.808635, -49.931477, -2.4887226), (0, -50, 0), (0.808635, -49.931477, -2.4887226), (0.93777645, -49.931477, -2.4429913), (0, -50, 0), (0.93777645, -49.931477, -2.4429913), (1.0643475, -49.931477, -2.3905637), (0, -50, 0), (1.0643475, -49.931477, -2.3905637), (1.1880014, -49.931477, -2.331584), (0, -50, 0), (1.1880014, -49.931477, -2.331584), (1.308399, -49.931477, -2.2662134), (0, -50, 0), (1.308399, -49.931477, -2.2662134), (1.4252102, -49.931477, -2.1946313), (0, -50, 0), (1.4252102, -49.931477, -2.1946313), (1.5381151, -49.931477, -2.117034), (0, -50, 0), (1.5381151, -49.931477, -2.117034), (1.6468042, -49.931477, -2.033634), (0, -50, 0), (1.6468042, -49.931477, -2.033634), (1.7509795, -49.931477, -1.9446597), (0, -50, 0), (1.7509795, -49.931477, -1.9446597), (1.8503555, -49.931477, -1.8503555), (0, -50, 0), (1.8503555, -49.931477, -1.8503555), (1.9446597, -49.931477, -1.7509795), (0, -50, 0), (1.9446597, -49.931477, -1.7509795), (2.033634, -49.931477, -1.6468042), (0, -50, 0), (2.033634, -49.931477, -1.6468042), (2.117034, -49.931477, -1.5381151), (0, -50, 0), (2.117034, -49.931477, -1.5381151), (2.1946313, -49.931477, -1.4252102), (0, -50, 0), (2.1946313, -49.931477, -1.4252102), (2.2662134, -49.931477, -1.308399), (0, -50, 0), (2.2662134, -49.931477, -1.308399), (2.331584, -49.931477, -1.1880014), (0, -50, 0), (2.331584, -49.931477, -1.1880014), (2.3905637, -49.931477, -1.0643475), (0, -50, 0), (2.3905637, -49.931477, -1.0643475), (2.4429913, -49.931477, -0.93777645), (0, -50, 0), (2.4429913, -49.931477, -0.93777645), (2.4887226, -49.931477, -0.808635), (0, -50, 0), (2.4887226, -49.931477, -0.808635), (2.5276325, -49.931477, -0.6772771), (0, -50, 0), (2.5276325, -49.931477, -0.6772771), (2.5596144, -49.931477, -0.54406285), (0, -50, 0), (2.5596144, -49.931477, -0.54406285), (2.5845807, -49.931477, -0.40935737), (0, -50, 0), (2.5845807, -49.931477, -0.40935737), (2.6024628, -49.931477, -0.27352986), (0, -50, 0), (2.6024628, -49.931477, -0.27352986), (2.6132116, -49.931477, -0.13695261), (0, -50, 0), (2.6132116, -49.931477, -0.13695261), (2.616798, -49.931477, 0), (2.616798, -49.931477, 0), (5.2264233, -49.726093, 0), (5.2192607, -49.726093, 0.27352986), (2.6132116, -49.931477, 0.13695261), (2.6132116, -49.931477, 0.13695261), (5.2192607, -49.726093, 0.27352986), (5.197792, -49.726093, 0.54631), (2.6024628, -49.931477, 0.27352986), (2.6024628, -49.931477, 0.27352986), (5.197792, -49.726093, 0.54631), (5.1620774, -49.726093, 0.81759274), (2.5845807, -49.931477, 0.40935737), (2.5845807, -49.931477, 0.40935737), (5.1620774, -49.726093, 0.81759274), (5.112213, -49.726093, 1.0866345), (2.5596144, -49.931477, 0.54406285), (2.5596144, -49.931477, 0.54406285), (5.112213, -49.726093, 1.0866345), (5.048337, -49.726093, 1.3526978), (2.5276325, -49.931477, 0.6772771), (2.5276325, -49.931477, 0.6772771), (5.048337, -49.726093, 1.3526978), (4.970624, -49.726093, 1.6150535), (2.4887226, -49.931477, 0.808635), (2.4887226, -49.931477, 0.808635), (4.970624, -49.726093, 1.6150535), (4.8792863, -49.726093, 1.8729825), (2.4429913, -49.931477, 0.93777645), (2.4429913, -49.931477, 0.93777645), (4.8792863, -49.726093, 1.8729825), (4.774575, -49.726093, 2.1257777), (2.3905637, -49.931477, 1.0643475), (2.3905637, -49.931477, 1.0643475), (4.774575, -49.726093, 2.1257777), (4.656777, -49.726093, 2.3727465), (2.331584, -49.931477, 1.1880014), (2.331584, -49.931477, 1.1880014), (4.656777, -49.726093, 2.3727465), (4.526215, -49.726093, 2.6132116), (2.2662134, -49.931477, 1.308399), (2.2662134, -49.931477, 1.308399), (4.526215, -49.726093, 2.6132116), (4.3832474, -49.726093, 2.846514), (2.1946313, -49.931477, 1.4252102), (2.1946313, -49.931477, 1.4252102), (4.3832474, -49.726093, 2.846514), (4.2282653, -49.726093, 3.0720146), (2.117034, -49.931477, 1.5381151), (2.117034, -49.931477, 1.5381151), (4.2282653, -49.726093, 3.0720146), (4.0616937, -49.726093, 3.2890947), (2.033634, -49.931477, 1.6468042), (2.033634, -49.931477, 1.6468042), (4.0616937, -49.726093, 3.2890947), (3.8839893, -49.726093, 3.4971597), (1.9446597, -49.931477, 1.7509795), (1.9446597, -49.931477, 1.7509795), (3.8839893, -49.726093, 3.4971597), (3.6956394, -49.726093, 3.6956394), (1.8503555, -49.931477, 1.8503555), (1.8503555, -49.931477, 1.8503555), (3.6956394, -49.726093, 3.6956394), (3.4971597, -49.726093, 3.8839893), (1.7509795, -49.931477, 1.9446597), (1.7509795, -49.931477, 1.9446597), (3.4971597, -49.726093, 3.8839893), (3.2890947, -49.726093, 4.0616937), (1.6468042, -49.931477, 2.033634), (1.6468042, -49.931477, 2.033634), (3.2890947, -49.726093, 4.0616937), (3.0720146, -49.726093, 4.2282653), (1.5381151, -49.931477, 2.117034), (1.5381151, -49.931477, 2.117034), (3.0720146, -49.726093, 4.2282653), (2.846514, -49.726093, 4.3832474), (1.4252102, -49.931477, 2.1946313), (1.4252102, -49.931477, 2.1946313), (2.846514, -49.726093, 4.3832474), (2.6132116, -49.726093, 4.526215), (1.308399, -49.931477, 2.2662134), (1.308399, -49.931477, 2.2662134), (2.6132116, -49.726093, 4.526215), (2.3727465, -49.726093, 4.656777), (1.1880014, -49.931477, 2.331584), (1.1880014, -49.931477, 2.331584), (2.3727465, -49.726093, 4.656777), (2.1257777, -49.726093, 4.774575), (1.0643475, -49.931477, 2.3905637), (1.0643475, -49.931477, 2.3905637), (2.1257777, -49.726093, 4.774575), (1.8729825, -49.726093, 4.8792863), (0.93777645, -49.931477, 2.4429913), (0.93777645, -49.931477, 2.4429913), (1.8729825, -49.726093, 4.8792863), (1.6150535, -49.726093, 4.970624), (0.808635, -49.931477, 2.4887226), (0.808635, -49.931477, 2.4887226), (1.6150535, -49.726093, 4.970624), (1.3526978, -49.726093, 5.048337), (0.6772771, -49.931477, 2.5276325), (0.6772771, -49.931477, 2.5276325), (1.3526978, -49.726093, 5.048337), (1.0866345, -49.726093, 5.112213), (0.54406285, -49.931477, 2.5596144), (0.54406285, -49.931477, 2.5596144), (1.0866345, -49.726093, 5.112213), (0.81759274, -49.726093, 5.1620774), (0.40935737, -49.931477, 2.5845807), (0.40935737, -49.931477, 2.5845807), (0.81759274, -49.726093, 5.1620774), (0.54631, -49.726093, 5.197792), (0.27352986, -49.931477, 2.6024628), (0.27352986, -49.931477, 2.6024628), (0.54631, -49.726093, 5.197792), (0.27352986, -49.726093, 5.2192607), (0.13695261, -49.931477, 2.6132116), (0.13695261, -49.931477, 2.6132116), (0.27352986, -49.726093, 5.2192607), (3.2002612e-16, -49.726093, 5.2264233), (1.6023265e-16, -49.931477, 2.616798), (1.6023265e-16, -49.931477, 2.616798), (3.2002612e-16, -49.726093, 5.2264233), (-0.27352986, -49.726093, 5.2192607), (-0.13695261, -49.931477, 2.6132116), (-0.13695261, -49.931477, 2.6132116), (-0.27352986, -49.726093, 5.2192607), (-0.54631, -49.726093, 5.197792), (-0.27352986, -49.931477, 2.6024628), (-0.27352986, -49.931477, 2.6024628), (-0.54631, -49.726093, 5.197792), (-0.81759274, -49.726093, 5.1620774), (-0.40935737, -49.931477, 2.5845807), (-0.40935737, -49.931477, 2.5845807), (-0.81759274, -49.726093, 5.1620774), (-1.0866345, -49.726093, 5.112213), (-0.54406285, -49.931477, 2.5596144), (-0.54406285, -49.931477, 2.5596144), (-1.0866345, -49.726093, 5.112213), (-1.3526978, -49.726093, 5.048337), (-0.6772771, -49.931477, 2.5276325), (-0.6772771, -49.931477, 2.5276325), (-1.3526978, -49.726093, 5.048337), (-1.6150535, -49.726093, 4.970624), (-0.808635, -49.931477, 2.4887226), (-0.808635, -49.931477, 2.4887226), (-1.6150535, -49.726093, 4.970624), (-1.8729825, -49.726093, 4.8792863), (-0.93777645, -49.931477, 2.4429913), (-0.93777645, -49.931477, 2.4429913), (-1.8729825, -49.726093, 4.8792863), (-2.1257777, -49.726093, 4.774575), (-1.0643475, -49.931477, 2.3905637), (-1.0643475, -49.931477, 2.3905637), (-2.1257777, -49.726093, 4.774575), (-2.3727465, -49.726093, 4.656777), (-1.1880014, -49.931477, 2.331584), (-1.1880014, -49.931477, 2.331584), (-2.3727465, -49.726093, 4.656777), (-2.6132116, -49.726093, 4.526215), (-1.308399, -49.931477, 2.2662134), (-1.308399, -49.931477, 2.2662134), (-2.6132116, -49.726093, 4.526215), (-2.846514, -49.726093, 4.3832474), (-1.4252102, -49.931477, 2.1946313), (-1.4252102, -49.931477, 2.1946313), (-2.846514, -49.726093, 4.3832474), (-3.0720146, -49.726093, 4.2282653), (-1.5381151, -49.931477, 2.117034), (-1.5381151, -49.931477, 2.117034), (-3.0720146, -49.726093, 4.2282653), (-3.2890947, -49.726093, 4.0616937), (-1.6468042, -49.931477, 2.033634), (-1.6468042, -49.931477, 2.033634), (-3.2890947, -49.726093, 4.0616937), (-3.4971597, -49.726093, 3.8839893), (-1.7509795, -49.931477, 1.9446597), (-1.7509795, -49.931477, 1.9446597), (-3.4971597, -49.726093, 3.8839893), (-3.6956394, -49.726093, 3.6956394), (-1.8503555, -49.931477, 1.8503555), (-1.8503555, -49.931477, 1.8503555), (-3.6956394, -49.726093, 3.6956394), (-3.8839893, -49.726093, 3.4971597), (-1.9446597, -49.931477, 1.7509795), (-1.9446597, -49.931477, 1.7509795), (-3.8839893, -49.726093, 3.4971597), (-4.0616937, -49.726093, 3.2890947), (-2.033634, -49.931477, 1.6468042), (-2.033634, -49.931477, 1.6468042), (-4.0616937, -49.726093, 3.2890947), (-4.2282653, -49.726093, 3.0720146), (-2.117034, -49.931477, 1.5381151), (-2.117034, -49.931477, 1.5381151), (-4.2282653, -49.726093, 3.0720146), (-4.3832474, -49.726093, 2.846514), (-2.1946313, -49.931477, 1.4252102), (-2.1946313, -49.931477, 1.4252102), (-4.3832474, -49.726093, 2.846514), (-4.526215, -49.726093, 2.6132116), (-2.2662134, -49.931477, 1.308399), (-2.2662134, -49.931477, 1.308399), (-4.526215, -49.726093, 2.6132116), (-4.656777, -49.726093, 2.3727465), (-2.331584, -49.931477, 1.1880014), (-2.331584, -49.931477, 1.1880014), (-4.656777, -49.726093, 2.3727465), (-4.774575, -49.726093, 2.1257777), (-2.3905637, -49.931477, 1.0643475), (-2.3905637, -49.931477, 1.0643475), (-4.774575, -49.726093, 2.1257777), (-4.8792863, -49.726093, 1.8729825), (-2.4429913, -49.931477, 0.93777645), (-2.4429913, -49.931477, 0.93777645), (-4.8792863, -49.726093, 1.8729825), (-4.970624, -49.726093, 1.6150535), (-2.4887226, -49.931477, 0.808635), (-2.4887226, -49.931477, 0.808635), (-4.970624, -49.726093, 1.6150535), (-5.048337, -49.726093, 1.3526978), (-2.5276325, -49.931477, 0.6772771), (-2.5276325, -49.931477, 0.6772771), (-5.048337, -49.726093, 1.3526978), (-5.112213, -49.726093, 1.0866345), (-2.5596144, -49.931477, 0.54406285), (-2.5596144, -49.931477, 0.54406285), (-5.112213, -49.726093, 1.0866345), (-5.1620774, -49.726093, 0.81759274), (-2.5845807, -49.931477, 0.40935737), (-2.5845807, -49.931477, 0.40935737), (-5.1620774, -49.726093, 0.81759274), (-5.197792, -49.726093, 0.54631), (-2.6024628, -49.931477, 0.27352986), (-2.6024628, -49.931477, 0.27352986), (-5.197792, -49.726093, 0.54631), (-5.2192607, -49.726093, 0.27352986), (-2.6132116, -49.931477, 0.13695261), (-2.6132116, -49.931477, 0.13695261), (-5.2192607, -49.726093, 0.27352986), (-5.2264233, -49.726093, 6.4005224e-16), (-2.616798, -49.931477, 3.204653e-16), (-2.616798, -49.931477, 3.204653e-16), (-5.2264233, -49.726093, 6.4005224e-16), (-5.2192607, -49.726093, -0.27352986), (-2.6132116, -49.931477, -0.13695261), (-2.6132116, -49.931477, -0.13695261), (-5.2192607, -49.726093, -0.27352986), (-5.197792, -49.726093, -0.54631), (-2.6024628, -49.931477, -0.27352986), (-2.6024628, -49.931477, -0.27352986), (-5.197792, -49.726093, -0.54631), (-5.1620774, -49.726093, -0.81759274), (-2.5845807, -49.931477, -0.40935737), (-2.5845807, -49.931477, -0.40935737), (-5.1620774, -49.726093, -0.81759274), (-5.112213, -49.726093, -1.0866345), (-2.5596144, -49.931477, -0.54406285), (-2.5596144, -49.931477, -0.54406285), (-5.112213, -49.726093, -1.0866345), (-5.048337, -49.726093, -1.3526978), (-2.5276325, -49.931477, -0.6772771), (-2.5276325, -49.931477, -0.6772771), (-5.048337, -49.726093, -1.3526978), (-4.970624, -49.726093, -1.6150535), (-2.4887226, -49.931477, -0.808635), (-2.4887226, -49.931477, -0.808635), (-4.970624, -49.726093, -1.6150535), (-4.8792863, -49.726093, -1.8729825), (-2.4429913, -49.931477, -0.93777645), (-2.4429913, -49.931477, -0.93777645), (-4.8792863, -49.726093, -1.8729825), (-4.774575, -49.726093, -2.1257777), (-2.3905637, -49.931477, -1.0643475), (-2.3905637, -49.931477, -1.0643475), (-4.774575, -49.726093, -2.1257777), (-4.656777, -49.726093, -2.3727465), (-2.331584, -49.931477, -1.1880014), (-2.331584, -49.931477, -1.1880014), (-4.656777, -49.726093, -2.3727465), (-4.526215, -49.726093, -2.6132116), (-2.2662134, -49.931477, -1.308399), (-2.2662134, -49.931477, -1.308399), (-4.526215, -49.726093, -2.6132116), (-4.3832474, -49.726093, -2.846514), (-2.1946313, -49.931477, -1.4252102), (-2.1946313, -49.931477, -1.4252102), (-4.3832474, -49.726093, -2.846514), (-4.2282653, -49.726093, -3.0720146), (-2.117034, -49.931477, -1.5381151), (-2.117034, -49.931477, -1.5381151), (-4.2282653, -49.726093, -3.0720146), (-4.0616937, -49.726093, -3.2890947), (-2.033634, -49.931477, -1.6468042), (-2.033634, -49.931477, -1.6468042), (-4.0616937, -49.726093, -3.2890947), (-3.8839893, -49.726093, -3.4971597), (-1.9446597, -49.931477, -1.7509795), (-1.9446597, -49.931477, -1.7509795), (-3.8839893, -49.726093, -3.4971597), (-3.6956394, -49.726093, -3.6956394), (-1.8503555, -49.931477, -1.8503555), (-1.8503555, -49.931477, -1.8503555), (-3.6956394, -49.726093, -3.6956394), (-3.4971597, -49.726093, -3.8839893), (-1.7509795, -49.931477, -1.9446597), (-1.7509795, -49.931477, -1.9446597), (-3.4971597, -49.726093, -3.8839893), (-3.2890947, -49.726093, -4.0616937), (-1.6468042, -49.931477, -2.033634), (-1.6468042, -49.931477, -2.033634), (-3.2890947, -49.726093, -4.0616937), (-3.0720146, -49.726093, -4.2282653), (-1.5381151, -49.931477, -2.117034), (-1.5381151, -49.931477, -2.117034), (-3.0720146, -49.726093, -4.2282653), (-2.846514, -49.726093, -4.3832474), (-1.4252102, -49.931477, -2.1946313), (-1.4252102, -49.931477, -2.1946313), (-2.846514, -49.726093, -4.3832474), (-2.6132116, -49.726093, -4.526215), (-1.308399, -49.931477, -2.2662134), (-1.308399, -49.931477, -2.2662134), (-2.6132116, -49.726093, -4.526215), (-2.3727465, -49.726093, -4.656777), (-1.1880014, -49.931477, -2.331584), (-1.1880014, -49.931477, -2.331584), (-2.3727465, -49.726093, -4.656777), (-2.1257777, -49.726093, -4.774575), (-1.0643475, -49.931477, -2.3905637), (-1.0643475, -49.931477, -2.3905637), (-2.1257777, -49.726093, -4.774575), (-1.8729825, -49.726093, -4.8792863), (-0.93777645, -49.931477, -2.4429913), (-0.93777645, -49.931477, -2.4429913), (-1.8729825, -49.726093, -4.8792863), (-1.6150535, -49.726093, -4.970624), (-0.808635, -49.931477, -2.4887226), (-0.808635, -49.931477, -2.4887226), (-1.6150535, -49.726093, -4.970624), (-1.3526978, -49.726093, -5.048337), (-0.6772771, -49.931477, -2.5276325), (-0.6772771, -49.931477, -2.5276325), (-1.3526978, -49.726093, -5.048337), (-1.0866345, -49.726093, -5.112213), (-0.54406285, -49.931477, -2.5596144), (-0.54406285, -49.931477, -2.5596144), (-1.0866345, -49.726093, -5.112213), (-0.81759274, -49.726093, -5.1620774), (-0.40935737, -49.931477, -2.5845807), (-0.40935737, -49.931477, -2.5845807), (-0.81759274, -49.726093, -5.1620774), (-0.54631, -49.726093, -5.197792), (-0.27352986, -49.931477, -2.6024628), (-0.27352986, -49.931477, -2.6024628), (-0.54631, -49.726093, -5.197792), (-0.27352986, -49.726093, -5.2192607), (-0.13695261, -49.931477, -2.6132116), (-0.13695261, -49.931477, -2.6132116), (-0.27352986, -49.726093, -5.2192607), (-9.600784e-16, -49.726093, -5.2264233), (-4.80698e-16, -49.931477, -2.616798), (-4.80698e-16, -49.931477, -2.616798), (-9.600784e-16, -49.726093, -5.2264233), (0.27352986, -49.726093, -5.2192607), (0.13695261, -49.931477, -2.6132116), (0.13695261, -49.931477, -2.6132116), (0.27352986, -49.726093, -5.2192607), (0.54631, -49.726093, -5.197792), (0.27352986, -49.931477, -2.6024628), (0.27352986, -49.931477, -2.6024628), (0.54631, -49.726093, -5.197792), (0.81759274, -49.726093, -5.1620774), (0.40935737, -49.931477, -2.5845807), (0.40935737, -49.931477, -2.5845807), (0.81759274, -49.726093, -5.1620774), (1.0866345, -49.726093, -5.112213), (0.54406285, -49.931477, -2.5596144), (0.54406285, -49.931477, -2.5596144), (1.0866345, -49.726093, -5.112213), (1.3526978, -49.726093, -5.048337), (0.6772771, -49.931477, -2.5276325), (0.6772771, -49.931477, -2.5276325), (1.3526978, -49.726093, -5.048337), (1.6150535, -49.726093, -4.970624), (0.808635, -49.931477, -2.4887226), (0.808635, -49.931477, -2.4887226), (1.6150535, -49.726093, -4.970624), (1.8729825, -49.726093, -4.8792863), (0.93777645, -49.931477, -2.4429913), (0.93777645, -49.931477, -2.4429913), (1.8729825, -49.726093, -4.8792863), (2.1257777, -49.726093, -4.774575), (1.0643475, -49.931477, -2.3905637), (1.0643475, -49.931477, -2.3905637), (2.1257777, -49.726093, -4.774575), (2.3727465, -49.726093, -4.656777), (1.1880014, -49.931477, -2.331584), (1.1880014, -49.931477, -2.331584), (2.3727465, -49.726093, -4.656777), (2.6132116, -49.726093, -4.526215), (1.308399, -49.931477, -2.2662134), (1.308399, -49.931477, -2.2662134), (2.6132116, -49.726093, -4.526215), (2.846514, -49.726093, -4.3832474), (1.4252102, -49.931477, -2.1946313), (1.4252102, -49.931477, -2.1946313), (2.846514, -49.726093, -4.3832474), (3.0720146, -49.726093, -4.2282653), (1.5381151, -49.931477, -2.117034), (1.5381151, -49.931477, -2.117034), (3.0720146, -49.726093, -4.2282653), (3.2890947, -49.726093, -4.0616937), (1.6468042, -49.931477, -2.033634), (1.6468042, -49.931477, -2.033634), (3.2890947, -49.726093, -4.0616937), (3.4971597, -49.726093, -3.8839893), (1.7509795, -49.931477, -1.9446597), (1.7509795, -49.931477, -1.9446597), (3.4971597, -49.726093, -3.8839893), (3.6956394, -49.726093, -3.6956394), (1.8503555, -49.931477, -1.8503555), (1.8503555, -49.931477, -1.8503555), (3.6956394, -49.726093, -3.6956394), (3.8839893, -49.726093, -3.4971597), (1.9446597, -49.931477, -1.7509795), (1.9446597, -49.931477, -1.7509795), (3.8839893, -49.726093, -3.4971597), (4.0616937, -49.726093, -3.2890947), (2.033634, -49.931477, -1.6468042), (2.033634, -49.931477, -1.6468042), (4.0616937, -49.726093, -3.2890947), (4.2282653, -49.726093, -3.0720146), (2.117034, -49.931477, -1.5381151), (2.117034, -49.931477, -1.5381151), (4.2282653, -49.726093, -3.0720146), (4.3832474, -49.726093, -2.846514), (2.1946313, -49.931477, -1.4252102), (2.1946313, -49.931477, -1.4252102), (4.3832474, -49.726093, -2.846514), (4.526215, -49.726093, -2.6132116), (2.2662134, -49.931477, -1.308399), (2.2662134, -49.931477, -1.308399), (4.526215, -49.726093, -2.6132116), (4.656777, -49.726093, -2.3727465), (2.331584, -49.931477, -1.1880014), (2.331584, -49.931477, -1.1880014), (4.656777, -49.726093, -2.3727465), (4.774575, -49.726093, -2.1257777), (2.3905637, -49.931477, -1.0643475), (2.3905637, -49.931477, -1.0643475), (4.774575, -49.726093, -2.1257777), (4.8792863, -49.726093, -1.8729825), (2.4429913, -49.931477, -0.93777645), (2.4429913, -49.931477, -0.93777645), (4.8792863, -49.726093, -1.8729825), (4.970624, -49.726093, -1.6150535), (2.4887226, -49.931477, -0.808635), (2.4887226, -49.931477, -0.808635), (4.970624, -49.726093, -1.6150535), (5.048337, -49.726093, -1.3526978), (2.5276325, -49.931477, -0.6772771), (2.5276325, -49.931477, -0.6772771), (5.048337, -49.726093, -1.3526978), (5.112213, -49.726093, -1.0866345), (2.5596144, -49.931477, -0.54406285), (2.5596144, -49.931477, -0.54406285), (5.112213, -49.726093, -1.0866345), (5.1620774, -49.726093, -0.81759274), (2.5845807, -49.931477, -0.40935737), (2.5845807, -49.931477, -0.40935737), (5.1620774, -49.726093, -0.81759274), (5.197792, -49.726093, -0.54631), (2.6024628, -49.931477, -0.27352986), (2.6024628, -49.931477, -0.27352986), (5.197792, -49.726093, -0.54631), (5.2192607, -49.726093, -0.27352986), (2.6132116, -49.931477, -0.13695261), (2.6132116, -49.931477, -0.13695261), (5.2192607, -49.726093, -0.27352986), (5.2264233, -49.726093, 0), (2.616798, -49.931477, 0), (5.2264233, -49.726093, 0), (7.8217235, -49.38442, 0), (7.8110037, -49.38442, 0.40935737), (5.2192607, -49.726093, 0.27352986), (5.2192607, -49.726093, 0.27352986), (7.8110037, -49.38442, 0.40935737), (7.778875, -49.38442, 0.81759274), (5.197792, -49.726093, 0.54631), (5.197792, -49.726093, 0.54631), (7.778875, -49.38442, 0.81759274), (7.725425, -49.38442, 1.223587), (5.1620774, -49.726093, 0.81759274), (5.1620774, -49.726093, 0.81759274), (7.725425, -49.38442, 1.223587), (7.6507998, -49.38442, 1.6262277), (5.112213, -49.726093, 1.0866345), (5.112213, -49.726093, 1.0866345), (7.6507998, -49.38442, 1.6262277), (7.5552044, -49.38442, 2.024411), (5.048337, -49.726093, 1.3526978), (5.048337, -49.726093, 1.3526978), (7.5552044, -49.38442, 2.024411), (7.438901, -49.38442, 2.4170454), (4.970624, -49.726093, 1.6150535), (4.970624, -49.726093, 1.6150535), (7.438901, -49.38442, 2.4170454), (7.302208, -49.38442, 2.8030548), (4.8792863, -49.726093, 1.8729825), (4.8792863, -49.726093, 1.8729825), (7.302208, -49.38442, 2.8030548), (7.1454997, -49.38442, 3.1813815), (4.774575, -49.726093, 2.1257777), (4.774575, -49.726093, 2.1257777), (7.1454997, -49.38442, 3.1813815), (6.9692063, -49.38442, 3.550988), (4.656777, -49.726093, 2.3727465), (4.656777, -49.726093, 2.3727465), (6.9692063, -49.38442, 3.550988), (6.773811, -49.38442, 3.9108617), (4.526215, -49.726093, 2.6132116), (4.526215, -49.726093, 2.6132116), (6.773811, -49.38442, 3.9108617), (6.5598493, -49.38442, 4.260016), (4.3832474, -49.726093, 2.846514), (4.3832474, -49.726093, 2.846514), (6.5598493, -49.38442, 4.260016), (6.327907, -49.38442, 4.5974936), (4.2282653, -49.726093, 3.0720146), (4.2282653, -49.726093, 3.0720146), (6.327907, -49.38442, 4.5974936), (6.0786204, -49.38442, 4.92237), (4.0616937, -49.726093, 3.2890947), (4.0616937, -49.726093, 3.2890947), (6.0786204, -49.38442, 4.92237), (5.812673, -49.38442, 5.2337546), (3.8839893, -49.726093, 3.4971597), (3.8839893, -49.726093, 3.4971597), (5.812673, -49.38442, 5.2337546), (5.5307937, -49.38442, 5.5307937), (3.6956394, -49.726093, 3.6956394), (3.6956394, -49.726093, 3.6956394), (5.5307937, -49.38442, 5.5307937), (5.2337546, -49.38442, 5.812673), (3.4971597, -49.726093, 3.8839893), (3.4971597, -49.726093, 3.8839893), (5.2337546, -49.38442, 5.812673), (4.92237, -49.38442, 6.0786204), (3.2890947, -49.726093, 4.0616937), (3.2890947, -49.726093, 4.0616937), (4.92237, -49.38442, 6.0786204), (4.5974936, -49.38442, 6.327907), (3.0720146, -49.726093, 4.2282653), (3.0720146, -49.726093, 4.2282653), (4.5974936, -49.38442, 6.327907), (4.260016, -49.38442, 6.5598493), (2.846514, -49.726093, 4.3832474), (2.846514, -49.726093, 4.3832474), (4.260016, -49.38442, 6.5598493), (3.9108617, -49.38442, 6.773811), (2.6132116, -49.726093, 4.526215), (2.6132116, -49.726093, 4.526215), (3.9108617, -49.38442, 6.773811), (3.550988, -49.38442, 6.9692063), (2.3727465, -49.726093, 4.656777), (2.3727465, -49.726093, 4.656777), (3.550988, -49.38442, 6.9692063), (3.1813815, -49.38442, 7.1454997), (2.1257777, -49.726093, 4.774575), (2.1257777, -49.726093, 4.774575), (3.1813815, -49.38442, 7.1454997), (2.8030548, -49.38442, 7.302208), (1.8729825, -49.726093, 4.8792863), (1.8729825, -49.726093, 4.8792863), (2.8030548, -49.38442, 7.302208), (2.4170454, -49.38442, 7.438901), (1.6150535, -49.726093, 4.970624), (1.6150535, -49.726093, 4.970624), (2.4170454, -49.38442, 7.438901), (2.024411, -49.38442, 7.5552044), (1.3526978, -49.726093, 5.048337), (1.3526978, -49.726093, 5.048337), (2.024411, -49.38442, 7.5552044), (1.6262277, -49.38442, 7.6507998), (1.0866345, -49.726093, 5.112213), (1.0866345, -49.726093, 5.112213), (1.6262277, -49.38442, 7.6507998), (1.223587, -49.38442, 7.725425), (0.81759274, -49.726093, 5.1620774), (0.81759274, -49.726093, 5.1620774), (1.223587, -49.38442, 7.725425), (0.81759274, -49.38442, 7.778875), (0.54631, -49.726093, 5.197792), (0.54631, -49.726093, 5.197792), (0.81759274, -49.38442, 7.778875), (0.40935737, -49.38442, 7.8110037), (0.27352986, -49.726093, 5.2192607), (0.27352986, -49.726093, 5.2192607), (0.40935737, -49.38442, 7.8110037), (4.789424e-16, -49.38442, 7.8217235), (3.2002612e-16, -49.726093, 5.2264233), (3.2002612e-16, -49.726093, 5.2264233), (4.789424e-16, -49.38442, 7.8217235), (-0.40935737, -49.38442, 7.8110037), (-0.27352986, -49.726093, 5.2192607), (-0.27352986, -49.726093, 5.2192607), (-0.40935737, -49.38442, 7.8110037), (-0.81759274, -49.38442, 7.778875), (-0.54631, -49.726093, 5.197792), (-0.54631, -49.726093, 5.197792), (-0.81759274, -49.38442, 7.778875), (-1.223587, -49.38442, 7.725425), (-0.81759274, -49.726093, 5.1620774), (-0.81759274, -49.726093, 5.1620774), (-1.223587, -49.38442, 7.725425), (-1.6262277, -49.38442, 7.6507998), (-1.0866345, -49.726093, 5.112213), (-1.0866345, -49.726093, 5.112213), (-1.6262277, -49.38442, 7.6507998), (-2.024411, -49.38442, 7.5552044), (-1.3526978, -49.726093, 5.048337), (-1.3526978, -49.726093, 5.048337), (-2.024411, -49.38442, 7.5552044), (-2.4170454, -49.38442, 7.438901), (-1.6150535, -49.726093, 4.970624), (-1.6150535, -49.726093, 4.970624), (-2.4170454, -49.38442, 7.438901), (-2.8030548, -49.38442, 7.302208), (-1.8729825, -49.726093, 4.8792863), (-1.8729825, -49.726093, 4.8792863), (-2.8030548, -49.38442, 7.302208), (-3.1813815, -49.38442, 7.1454997), (-2.1257777, -49.726093, 4.774575), (-2.1257777, -49.726093, 4.774575), (-3.1813815, -49.38442, 7.1454997), (-3.550988, -49.38442, 6.9692063), (-2.3727465, -49.726093, 4.656777), (-2.3727465, -49.726093, 4.656777), (-3.550988, -49.38442, 6.9692063), (-3.9108617, -49.38442, 6.773811), (-2.6132116, -49.726093, 4.526215), (-2.6132116, -49.726093, 4.526215), (-3.9108617, -49.38442, 6.773811), (-4.260016, -49.38442, 6.5598493), (-2.846514, -49.726093, 4.3832474), (-2.846514, -49.726093, 4.3832474), (-4.260016, -49.38442, 6.5598493), (-4.5974936, -49.38442, 6.327907), (-3.0720146, -49.726093, 4.2282653), (-3.0720146, -49.726093, 4.2282653), (-4.5974936, -49.38442, 6.327907), (-4.92237, -49.38442, 6.0786204), (-3.2890947, -49.726093, 4.0616937), (-3.2890947, -49.726093, 4.0616937), (-4.92237, -49.38442, 6.0786204), (-5.2337546, -49.38442, 5.812673), (-3.4971597, -49.726093, 3.8839893), (-3.4971597, -49.726093, 3.8839893), (-5.2337546, -49.38442, 5.812673), (-5.5307937, -49.38442, 5.5307937), (-3.6956394, -49.726093, 3.6956394), (-3.6956394, -49.726093, 3.6956394), (-5.5307937, -49.38442, 5.5307937), (-5.812673, -49.38442, 5.2337546), (-3.8839893, -49.726093, 3.4971597), (-3.8839893, -49.726093, 3.4971597), (-5.812673, -49.38442, 5.2337546), (-6.0786204, -49.38442, 4.92237), (-4.0616937, -49.726093, 3.2890947), (-4.0616937, -49.726093, 3.2890947), (-6.0786204, -49.38442, 4.92237), (-6.327907, -49.38442, 4.5974936), (-4.2282653, -49.726093, 3.0720146), (-4.2282653, -49.726093, 3.0720146), (-6.327907, -49.38442, 4.5974936), (-6.5598493, -49.38442, 4.260016), (-4.3832474, -49.726093, 2.846514), (-4.3832474, -49.726093, 2.846514), (-6.5598493, -49.38442, 4.260016), (-6.773811, -49.38442, 3.9108617), (-4.526215, -49.726093, 2.6132116), (-4.526215, -49.726093, 2.6132116), (-6.773811, -49.38442, 3.9108617), (-6.9692063, -49.38442, 3.550988), (-4.656777, -49.726093, 2.3727465), (-4.656777, -49.726093, 2.3727465), (-6.9692063, -49.38442, 3.550988), (-7.1454997, -49.38442, 3.1813815), (-4.774575, -49.726093, 2.1257777), (-4.774575, -49.726093, 2.1257777), (-7.1454997, -49.38442, 3.1813815), (-7.302208, -49.38442, 2.8030548), (-4.8792863, -49.726093, 1.8729825), (-4.8792863, -49.726093, 1.8729825), (-7.302208, -49.38442, 2.8030548), (-7.438901, -49.38442, 2.4170454), (-4.970624, -49.726093, 1.6150535), (-4.970624, -49.726093, 1.6150535), (-7.438901, -49.38442, 2.4170454), (-7.5552044, -49.38442, 2.024411), (-5.048337, -49.726093, 1.3526978), (-5.048337, -49.726093, 1.3526978), (-7.5552044, -49.38442, 2.024411), (-7.6507998, -49.38442, 1.6262277), (-5.112213, -49.726093, 1.0866345), (-5.112213, -49.726093, 1.0866345), (-7.6507998, -49.38442, 1.6262277), (-7.725425, -49.38442, 1.223587), (-5.1620774, -49.726093, 0.81759274), (-5.1620774, -49.726093, 0.81759274), (-7.725425, -49.38442, 1.223587), (-7.778875, -49.38442, 0.81759274), (-5.197792, -49.726093, 0.54631), (-5.197792, -49.726093, 0.54631), (-7.778875, -49.38442, 0.81759274), (-7.8110037, -49.38442, 0.40935737), (-5.2192607, -49.726093, 0.27352986), (-5.2192607, -49.726093, 0.27352986), (-7.8110037, -49.38442, 0.40935737), (-7.8217235, -49.38442, 9.578848e-16), (-5.2264233, -49.726093, 6.4005224e-16), (-5.2264233, -49.726093, 6.4005224e-16), (-7.8217235, -49.38442, 9.578848e-16), (-7.8110037, -49.38442, -0.40935737), (-5.2192607, -49.726093, -0.27352986), (-5.2192607, -49.726093, -0.27352986), (-7.8110037, -49.38442, -0.40935737), (-7.778875, -49.38442, -0.81759274), (-5.197792, -49.726093, -0.54631), (-5.197792, -49.726093, -0.54631), (-7.778875, -49.38442, -0.81759274), (-7.725425, -49.38442, -1.223587), (-5.1620774, -49.726093, -0.81759274), (-5.1620774, -49.726093, -0.81759274), (-7.725425, -49.38442, -1.223587), (-7.6507998, -49.38442, -1.6262277), (-5.112213, -49.726093, -1.0866345), (-5.112213, -49.726093, -1.0866345), (-7.6507998, -49.38442, -1.6262277), (-7.5552044, -49.38442, -2.024411), (-5.048337, -49.726093, -1.3526978), (-5.048337, -49.726093, -1.3526978), (-7.5552044, -49.38442, -2.024411), (-7.438901, -49.38442, -2.4170454), (-4.970624, -49.726093, -1.6150535), (-4.970624, -49.726093, -1.6150535), (-7.438901, -49.38442, -2.4170454), (-7.302208, -49.38442, -2.8030548), (-4.8792863, -49.726093, -1.8729825), (-4.8792863, -49.726093, -1.8729825), (-7.302208, -49.38442, -2.8030548), (-7.1454997, -49.38442, -3.1813815), (-4.774575, -49.726093, -2.1257777), (-4.774575, -49.726093, -2.1257777), (-7.1454997, -49.38442, -3.1813815), (-6.9692063, -49.38442, -3.550988), (-4.656777, -49.726093, -2.3727465), (-4.656777, -49.726093, -2.3727465), (-6.9692063, -49.38442, -3.550988), (-6.773811, -49.38442, -3.9108617), (-4.526215, -49.726093, -2.6132116), (-4.526215, -49.726093, -2.6132116), (-6.773811, -49.38442, -3.9108617), (-6.5598493, -49.38442, -4.260016), (-4.3832474, -49.726093, -2.846514), (-4.3832474, -49.726093, -2.846514), (-6.5598493, -49.38442, -4.260016), (-6.327907, -49.38442, -4.5974936), (-4.2282653, -49.726093, -3.0720146), (-4.2282653, -49.726093, -3.0720146), (-6.327907, -49.38442, -4.5974936), (-6.0786204, -49.38442, -4.92237), (-4.0616937, -49.726093, -3.2890947), (-4.0616937, -49.726093, -3.2890947), (-6.0786204, -49.38442, -4.92237), (-5.812673, -49.38442, -5.2337546), (-3.8839893, -49.726093, -3.4971597), (-3.8839893, -49.726093, -3.4971597), (-5.812673, -49.38442, -5.2337546), (-5.5307937, -49.38442, -5.5307937), (-3.6956394, -49.726093, -3.6956394), (-3.6956394, -49.726093, -3.6956394), (-5.5307937, -49.38442, -5.5307937), (-5.2337546, -49.38442, -5.812673), (-3.4971597, -49.726093, -3.8839893), (-3.4971597, -49.726093, -3.8839893), (-5.2337546, -49.38442, -5.812673), (-4.92237, -49.38442, -6.0786204), (-3.2890947, -49.726093, -4.0616937), (-3.2890947, -49.726093, -4.0616937), (-4.92237, -49.38442, -6.0786204), (-4.5974936, -49.38442, -6.327907), (-3.0720146, -49.726093, -4.2282653), (-3.0720146, -49.726093, -4.2282653), (-4.5974936, -49.38442, -6.327907), (-4.260016, -49.38442, -6.5598493), (-2.846514, -49.726093, -4.3832474), (-2.846514, -49.726093, -4.3832474), (-4.260016, -49.38442, -6.5598493), (-3.9108617, -49.38442, -6.773811), (-2.6132116, -49.726093, -4.526215), (-2.6132116, -49.726093, -4.526215), (-3.9108617, -49.38442, -6.773811), (-3.550988, -49.38442, -6.9692063), (-2.3727465, -49.726093, -4.656777), (-2.3727465, -49.726093, -4.656777), (-3.550988, -49.38442, -6.9692063), (-3.1813815, -49.38442, -7.1454997), (-2.1257777, -49.726093, -4.774575), (-2.1257777, -49.726093, -4.774575), (-3.1813815, -49.38442, -7.1454997), (-2.8030548, -49.38442, -7.302208), (-1.8729825, -49.726093, -4.8792863), (-1.8729825, -49.726093, -4.8792863), (-2.8030548, -49.38442, -7.302208), (-2.4170454, -49.38442, -7.438901), (-1.6150535, -49.726093, -4.970624), (-1.6150535, -49.726093, -4.970624), (-2.4170454, -49.38442, -7.438901), (-2.024411, -49.38442, -7.5552044), (-1.3526978, -49.726093, -5.048337), (-1.3526978, -49.726093, -5.048337), (-2.024411, -49.38442, -7.5552044), (-1.6262277, -49.38442, -7.6507998), (-1.0866345, -49.726093, -5.112213), (-1.0866345, -49.726093, -5.112213), (-1.6262277, -49.38442, -7.6507998), (-1.223587, -49.38442, -7.725425), (-0.81759274, -49.726093, -5.1620774), (-0.81759274, -49.726093, -5.1620774), (-1.223587, -49.38442, -7.725425), (-0.81759274, -49.38442, -7.778875), (-0.54631, -49.726093, -5.197792), (-0.54631, -49.726093, -5.197792), (-0.81759274, -49.38442, -7.778875), (-0.40935737, -49.38442, -7.8110037), (-0.27352986, -49.726093, -5.2192607), (-0.27352986, -49.726093, -5.2192607), (-0.40935737, -49.38442, -7.8110037), (-1.4368273e-15, -49.38442, -7.8217235), (-9.600784e-16, -49.726093, -5.2264233), (-9.600784e-16, -49.726093, -5.2264233), (-1.4368273e-15, -49.38442, -7.8217235), (0.40935737, -49.38442, -7.8110037), (0.27352986, -49.726093, -5.2192607), (0.27352986, -49.726093, -5.2192607), (0.40935737, -49.38442, -7.8110037), (0.81759274, -49.38442, -7.778875), (0.54631, -49.726093, -5.197792), (0.54631, -49.726093, -5.197792), (0.81759274, -49.38442, -7.778875), (1.223587, -49.38442, -7.725425), (0.81759274, -49.726093, -5.1620774), (0.81759274, -49.726093, -5.1620774), (1.223587, -49.38442, -7.725425), (1.6262277, -49.38442, -7.6507998), (1.0866345, -49.726093, -5.112213), (1.0866345, -49.726093, -5.112213), (1.6262277, -49.38442, -7.6507998), (2.024411, -49.38442, -7.5552044), (1.3526978, -49.726093, -5.048337), (1.3526978, -49.726093, -5.048337), (2.024411, -49.38442, -7.5552044), (2.4170454, -49.38442, -7.438901), (1.6150535, -49.726093, -4.970624), (1.6150535, -49.726093, -4.970624), (2.4170454, -49.38442, -7.438901), (2.8030548, -49.38442, -7.302208), (1.8729825, -49.726093, -4.8792863), (1.8729825, -49.726093, -4.8792863), (2.8030548, -49.38442, -7.302208), (3.1813815, -49.38442, -7.1454997), (2.1257777, -49.726093, -4.774575), (2.1257777, -49.726093, -4.774575), (3.1813815, -49.38442, -7.1454997), (3.550988, -49.38442, -6.9692063), (2.3727465, -49.726093, -4.656777), (2.3727465, -49.726093, -4.656777), (3.550988, -49.38442, -6.9692063), (3.9108617, -49.38442, -6.773811), (2.6132116, -49.726093, -4.526215), (2.6132116, -49.726093, -4.526215), (3.9108617, -49.38442, -6.773811), (4.260016, -49.38442, -6.5598493), (2.846514, -49.726093, -4.3832474), (2.846514, -49.726093, -4.3832474), (4.260016, -49.38442, -6.5598493), (4.5974936, -49.38442, -6.327907), (3.0720146, -49.726093, -4.2282653), (3.0720146, -49.726093, -4.2282653), (4.5974936, -49.38442, -6.327907), (4.92237, -49.38442, -6.0786204), (3.2890947, -49.726093, -4.0616937), (3.2890947, -49.726093, -4.0616937), (4.92237, -49.38442, -6.0786204), (5.2337546, -49.38442, -5.812673), (3.4971597, -49.726093, -3.8839893), (3.4971597, -49.726093, -3.8839893), (5.2337546, -49.38442, -5.812673), (5.5307937, -49.38442, -5.5307937), (3.6956394, -49.726093, -3.6956394), (3.6956394, -49.726093, -3.6956394), (5.5307937, -49.38442, -5.5307937), (5.812673, -49.38442, -5.2337546), (3.8839893, -49.726093, -3.4971597), (3.8839893, -49.726093, -3.4971597), (5.812673, -49.38442, -5.2337546), (6.0786204, -49.38442, -4.92237), (4.0616937, -49.726093, -3.2890947), (4.0616937, -49.726093, -3.2890947), (6.0786204, -49.38442, -4.92237), (6.327907, -49.38442, -4.5974936), (4.2282653, -49.726093, -3.0720146), (4.2282653, -49.726093, -3.0720146), (6.327907, -49.38442, -4.5974936), (6.5598493, -49.38442, -4.260016), (4.3832474, -49.726093, -2.846514), (4.3832474, -49.726093, -2.846514), (6.5598493, -49.38442, -4.260016), (6.773811, -49.38442, -3.9108617), (4.526215, -49.726093, -2.6132116), (4.526215, -49.726093, -2.6132116), (6.773811, -49.38442, -3.9108617), (6.9692063, -49.38442, -3.550988), (4.656777, -49.726093, -2.3727465), (4.656777, -49.726093, -2.3727465), (6.9692063, -49.38442, -3.550988), (7.1454997, -49.38442, -3.1813815), (4.774575, -49.726093, -2.1257777), (4.774575, -49.726093, -2.1257777), (7.1454997, -49.38442, -3.1813815), (7.302208, -49.38442, -2.8030548), (4.8792863, -49.726093, -1.8729825), (4.8792863, -49.726093, -1.8729825), (7.302208, -49.38442, -2.8030548), (7.438901, -49.38442, -2.4170454), (4.970624, -49.726093, -1.6150535), (4.970624, -49.726093, -1.6150535), (7.438901, -49.38442, -2.4170454), (7.5552044, -49.38442, -2.024411), (5.048337, -49.726093, -1.3526978), (5.048337, -49.726093, -1.3526978), (7.5552044, -49.38442, -2.024411), (7.6507998, -49.38442, -1.6262277), (5.112213, -49.726093, -1.0866345), (5.112213, -49.726093, -1.0866345), (7.6507998, -49.38442, -1.6262277), (7.725425, -49.38442, -1.223587), (5.1620774, -49.726093, -0.81759274), (5.1620774, -49.726093, -0.81759274), (7.725425, -49.38442, -1.223587), (7.778875, -49.38442, -0.81759274), (5.197792, -49.726093, -0.54631), (5.197792, -49.726093, -0.54631), (7.778875, -49.38442, -0.81759274), (7.8110037, -49.38442, -0.40935737), (5.2192607, -49.726093, -0.27352986), (5.2192607, -49.726093, -0.27352986), (7.8110037, -49.38442, -0.40935737), (7.8217235, -49.38442, 0), (5.2264233, -49.726093, 0), (7.8217235, -49.38442, 0), (10.395584, -48.90738, 0), (10.381338, -48.90738, 0.54406285), (7.8110037, -49.38442, 0.40935737), (7.8110037, -49.38442, 0.40935737), (10.381338, -48.90738, 0.54406285), (10.338636, -48.90738, 1.0866345), (7.778875, -49.38442, 0.81759274), (7.778875, -49.38442, 0.81759274), (10.338636, -48.90738, 1.0866345), (10.267597, -48.90738, 1.6262277), (7.725425, -49.38442, 1.223587), (7.725425, -49.38442, 1.223587), (10.267597, -48.90738, 1.6262277), (10.168416, -48.90738, 2.1613636), (7.6507998, -49.38442, 1.6262277), (7.6507998, -49.38442, 1.6262277), (10.168416, -48.90738, 2.1613636), (10.041364, -48.90738, 2.6905754), (7.5552044, -49.38442, 2.024411), (7.5552044, -49.38442, 2.024411), (10.041364, -48.90738, 2.6905754), (9.886788, -48.90738, 3.2124124), (7.438901, -49.38442, 2.4170454), (7.438901, -49.38442, 2.4170454), (9.886788, -48.90738, 3.2124124), (9.705114, -48.90738, 3.7254443), (7.302208, -49.38442, 2.8030548), (7.302208, -49.38442, 2.8030548), (9.705114, -48.90738, 3.7254443), (9.496839, -48.90738, 4.2282653), (7.1454997, -49.38442, 3.1813815), (7.1454997, -49.38442, 3.1813815), (9.496839, -48.90738, 4.2282653), (9.262533, -48.90738, 4.7194967), (6.9692063, -49.38442, 3.550988), (6.9692063, -49.38442, 3.550988), (9.262533, -48.90738, 4.7194967), (9.00284, -48.90738, 5.197792), (6.773811, -49.38442, 3.9108617), (6.773811, -49.38442, 3.9108617), (9.00284, -48.90738, 5.197792), (8.718471, -48.90738, 5.661841), (6.5598493, -49.38442, 4.260016), (6.5598493, -49.38442, 4.260016), (8.718471, -48.90738, 5.661841), (8.410205, -48.90738, 6.110371), (6.327907, -49.38442, 4.5974936), (6.327907, -49.38442, 4.5974936), (8.410205, -48.90738, 6.110371), (8.078887, -48.90738, 6.5421534), (6.0786204, -49.38442, 4.92237), (6.0786204, -49.38442, 4.92237), (8.078887, -48.90738, 6.5421534), (7.725425, -48.90738, 6.9560037), (5.812673, -49.38442, 5.2337546), (5.812673, -49.38442, 5.2337546), (7.725425, -48.90738, 6.9560037), (7.350788, -48.90738, 7.350788), (5.5307937, -49.38442, 5.5307937), (5.5307937, -49.38442, 5.5307937), (7.350788, -48.90738, 7.350788), (6.9560037, -48.90738, 7.725425), (5.2337546, -49.38442, 5.812673), (5.2337546, -49.38442, 5.812673), (6.9560037, -48.90738, 7.725425), (6.5421534, -48.90738, 8.078887), (4.92237, -49.38442, 6.0786204), (4.92237, -49.38442, 6.0786204), (6.5421534, -48.90738, 8.078887), (6.110371, -48.90738, 8.410205), (4.5974936, -49.38442, 6.327907), (4.5974936, -49.38442, 6.327907), (6.110371, -48.90738, 8.410205), (5.661841, -48.90738, 8.718471), (4.260016, -49.38442, 6.5598493), (4.260016, -49.38442, 6.5598493), (5.661841, -48.90738, 8.718471), (5.197792, -48.90738, 9.00284), (3.9108617, -49.38442, 6.773811), (3.9108617, -49.38442, 6.773811), (5.197792, -48.90738, 9.00284), (4.7194967, -48.90738, 9.262533), (3.550988, -49.38442, 6.9692063), (3.550988, -49.38442, 6.9692063), (4.7194967, -48.90738, 9.262533), (4.2282653, -48.90738, 9.496839), (3.1813815, -49.38442, 7.1454997), (3.1813815, -49.38442, 7.1454997), (4.2282653, -48.90738, 9.496839), (3.7254443, -48.90738, 9.705114), (2.8030548, -49.38442, 7.302208), (2.8030548, -49.38442, 7.302208), (3.7254443, -48.90738, 9.705114), (3.2124124, -48.90738, 9.886788), (2.4170454, -49.38442, 7.438901), (2.4170454, -49.38442, 7.438901), (3.2124124, -48.90738, 9.886788), (2.6905754, -48.90738, 10.041364), (2.024411, -49.38442, 7.5552044), (2.024411, -49.38442, 7.5552044), (2.6905754, -48.90738, 10.041364), (2.1613636, -48.90738, 10.168416), (1.6262277, -49.38442, 7.6507998), (1.6262277, -49.38442, 7.6507998), (2.1613636, -48.90738, 10.168416), (1.6262277, -48.90738, 10.267597), (1.223587, -49.38442, 7.725425), (1.223587, -49.38442, 7.725425), (1.6262277, -48.90738, 10.267597), (1.0866345, -48.90738, 10.338636), (0.81759274, -49.38442, 7.778875), (0.81759274, -49.38442, 7.778875), (1.0866345, -48.90738, 10.338636), (0.54406285, -48.90738, 10.381338), (0.40935737, -49.38442, 7.8110037), (0.40935737, -49.38442, 7.8110037), (0.54406285, -48.90738, 10.381338), (6.3654595e-16, -48.90738, 10.395584), (4.789424e-16, -49.38442, 7.8217235), (4.789424e-16, -49.38442, 7.8217235), (6.3654595e-16, -48.90738, 10.395584), (-0.54406285, -48.90738, 10.381338), (-0.40935737, -49.38442, 7.8110037), (-0.40935737, -49.38442, 7.8110037), (-0.54406285, -48.90738, 10.381338), (-1.0866345, -48.90738, 10.338636), (-0.81759274, -49.38442, 7.778875), (-0.81759274, -49.38442, 7.778875), (-1.0866345, -48.90738, 10.338636), (-1.6262277, -48.90738, 10.267597), (-1.223587, -49.38442, 7.725425), (-1.223587, -49.38442, 7.725425), (-1.6262277, -48.90738, 10.267597), (-2.1613636, -48.90738, 10.168416), (-1.6262277, -49.38442, 7.6507998), (-1.6262277, -49.38442, 7.6507998), (-2.1613636, -48.90738, 10.168416), (-2.6905754, -48.90738, 10.041364), (-2.024411, -49.38442, 7.5552044), (-2.024411, -49.38442, 7.5552044), (-2.6905754, -48.90738, 10.041364), (-3.2124124, -48.90738, 9.886788), (-2.4170454, -49.38442, 7.438901), (-2.4170454, -49.38442, 7.438901), (-3.2124124, -48.90738, 9.886788), (-3.7254443, -48.90738, 9.705114), (-2.8030548, -49.38442, 7.302208), (-2.8030548, -49.38442, 7.302208), (-3.7254443, -48.90738, 9.705114), (-4.2282653, -48.90738, 9.496839), (-3.1813815, -49.38442, 7.1454997), (-3.1813815, -49.38442, 7.1454997), (-4.2282653, -48.90738, 9.496839), (-4.7194967, -48.90738, 9.262533), (-3.550988, -49.38442, 6.9692063), (-3.550988, -49.38442, 6.9692063), (-4.7194967, -48.90738, 9.262533), (-5.197792, -48.90738, 9.00284), (-3.9108617, -49.38442, 6.773811), (-3.9108617, -49.38442, 6.773811), (-5.197792, -48.90738, 9.00284), (-5.661841, -48.90738, 8.718471), (-4.260016, -49.38442, 6.5598493), (-4.260016, -49.38442, 6.5598493), (-5.661841, -48.90738, 8.718471), (-6.110371, -48.90738, 8.410205), (-4.5974936, -49.38442, 6.327907), (-4.5974936, -49.38442, 6.327907), (-6.110371, -48.90738, 8.410205), (-6.5421534, -48.90738, 8.078887), (-4.92237, -49.38442, 6.0786204), (-4.92237, -49.38442, 6.0786204), (-6.5421534, -48.90738, 8.078887), (-6.9560037, -48.90738, 7.725425), (-5.2337546, -49.38442, 5.812673), (-5.2337546, -49.38442, 5.812673), (-6.9560037, -48.90738, 7.725425), (-7.350788, -48.90738, 7.350788), (-5.5307937, -49.38442, 5.5307937), (-5.5307937, -49.38442, 5.5307937), (-7.350788, -48.90738, 7.350788), (-7.725425, -48.90738, 6.9560037), (-5.812673, -49.38442, 5.2337546), (-5.812673, -49.38442, 5.2337546), (-7.725425, -48.90738, 6.9560037), (-8.078887, -48.90738, 6.5421534), (-6.0786204, -49.38442, 4.92237), (-6.0786204, -49.38442, 4.92237), (-8.078887, -48.90738, 6.5421534), (-8.410205, -48.90738, 6.110371), (-6.327907, -49.38442, 4.5974936), (-6.327907, -49.38442, 4.5974936), (-8.410205, -48.90738, 6.110371), (-8.718471, -48.90738, 5.661841), (-6.5598493, -49.38442, 4.260016), (-6.5598493, -49.38442, 4.260016), (-8.718471, -48.90738, 5.661841), (-9.00284, -48.90738, 5.197792), (-6.773811, -49.38442, 3.9108617), (-6.773811, -49.38442, 3.9108617), (-9.00284, -48.90738, 5.197792), (-9.262533, -48.90738, 4.7194967), (-6.9692063, -49.38442, 3.550988), (-6.9692063, -49.38442, 3.550988), (-9.262533, -48.90738, 4.7194967), (-9.496839, -48.90738, 4.2282653), (-7.1454997, -49.38442, 3.1813815), (-7.1454997, -49.38442, 3.1813815), (-9.496839, -48.90738, 4.2282653), (-9.705114, -48.90738, 3.7254443), (-7.302208, -49.38442, 2.8030548), (-7.302208, -49.38442, 2.8030548), (-9.705114, -48.90738, 3.7254443), (-9.886788, -48.90738, 3.2124124), (-7.438901, -49.38442, 2.4170454), (-7.438901, -49.38442, 2.4170454), (-9.886788, -48.90738, 3.2124124), (-10.041364, -48.90738, 2.6905754), (-7.5552044, -49.38442, 2.024411), (-7.5552044, -49.38442, 2.024411), (-10.041364, -48.90738, 2.6905754), (-10.168416, -48.90738, 2.1613636), (-7.6507998, -49.38442, 1.6262277), (-7.6507998, -49.38442, 1.6262277), (-10.168416, -48.90738, 2.1613636), (-10.267597, -48.90738, 1.6262277), (-7.725425, -49.38442, 1.223587), (-7.725425, -49.38442, 1.223587), (-10.267597, -48.90738, 1.6262277), (-10.338636, -48.90738, 1.0866345), (-7.778875, -49.38442, 0.81759274), (-7.778875, -49.38442, 0.81759274), (-10.338636, -48.90738, 1.0866345), (-10.381338, -48.90738, 0.54406285), (-7.8110037, -49.38442, 0.40935737), (-7.8110037, -49.38442, 0.40935737), (-10.381338, -48.90738, 0.54406285), (-10.395584, -48.90738, 1.2730919e-15), (-7.8217235, -49.38442, 9.578848e-16), (-7.8217235, -49.38442, 9.578848e-16), (-10.395584, -48.90738, 1.2730919e-15), (-10.381338, -48.90738, -0.54406285), (-7.8110037, -49.38442, -0.40935737), (-7.8110037, -49.38442, -0.40935737), (-10.381338, -48.90738, -0.54406285), (-10.338636, -48.90738, -1.0866345), (-7.778875, -49.38442, -0.81759274), (-7.778875, -49.38442, -0.81759274), (-10.338636, -48.90738, -1.0866345), (-10.267597, -48.90738, -1.6262277), (-7.725425, -49.38442, -1.223587), (-7.725425, -49.38442, -1.223587), (-10.267597, -48.90738, -1.6262277), (-10.168416, -48.90738, -2.1613636), (-7.6507998, -49.38442, -1.6262277), (-7.6507998, -49.38442, -1.6262277), (-10.168416, -48.90738, -2.1613636), (-10.041364, -48.90738, -2.6905754), (-7.5552044, -49.38442, -2.024411), (-7.5552044, -49.38442, -2.024411), (-10.041364, -48.90738, -2.6905754), (-9.886788, -48.90738, -3.2124124), (-7.438901, -49.38442, -2.4170454), (-7.438901, -49.38442, -2.4170454), (-9.886788, -48.90738, -3.2124124), (-9.705114, -48.90738, -3.7254443), (-7.302208, -49.38442, -2.8030548), (-7.302208, -49.38442, -2.8030548), (-9.705114, -48.90738, -3.7254443), (-9.496839, -48.90738, -4.2282653), (-7.1454997, -49.38442, -3.1813815), (-7.1454997, -49.38442, -3.1813815), (-9.496839, -48.90738, -4.2282653), (-9.262533, -48.90738, -4.7194967), (-6.9692063, -49.38442, -3.550988), (-6.9692063, -49.38442, -3.550988), (-9.262533, -48.90738, -4.7194967), (-9.00284, -48.90738, -5.197792), (-6.773811, -49.38442, -3.9108617), (-6.773811, -49.38442, -3.9108617), (-9.00284, -48.90738, -5.197792), (-8.718471, -48.90738, -5.661841), (-6.5598493, -49.38442, -4.260016), (-6.5598493, -49.38442, -4.260016), (-8.718471, -48.90738, -5.661841), (-8.410205, -48.90738, -6.110371), (-6.327907, -49.38442, -4.5974936), (-6.327907, -49.38442, -4.5974936), (-8.410205, -48.90738, -6.110371), (-8.078887, -48.90738, -6.5421534), (-6.0786204, -49.38442, -4.92237), (-6.0786204, -49.38442, -4.92237), (-8.078887, -48.90738, -6.5421534), (-7.725425, -48.90738, -6.9560037), (-5.812673, -49.38442, -5.2337546), (-5.812673, -49.38442, -5.2337546), (-7.725425, -48.90738, -6.9560037), (-7.350788, -48.90738, -7.350788), (-5.5307937, -49.38442, -5.5307937), (-5.5307937, -49.38442, -5.5307937), (-7.350788, -48.90738, -7.350788), (-6.9560037, -48.90738, -7.725425), (-5.2337546, -49.38442, -5.812673), (-5.2337546, -49.38442, -5.812673), (-6.9560037, -48.90738, -7.725425), (-6.5421534, -48.90738, -8.078887), (-4.92237, -49.38442, -6.0786204), (-4.92237, -49.38442, -6.0786204), (-6.5421534, -48.90738, -8.078887), (-6.110371, -48.90738, -8.410205), (-4.5974936, -49.38442, -6.327907), (-4.5974936, -49.38442, -6.327907), (-6.110371, -48.90738, -8.410205), (-5.661841, -48.90738, -8.718471), (-4.260016, -49.38442, -6.5598493), (-4.260016, -49.38442, -6.5598493), (-5.661841, -48.90738, -8.718471), (-5.197792, -48.90738, -9.00284), (-3.9108617, -49.38442, -6.773811), (-3.9108617, -49.38442, -6.773811), (-5.197792, -48.90738, -9.00284), (-4.7194967, -48.90738, -9.262533), (-3.550988, -49.38442, -6.9692063), (-3.550988, -49.38442, -6.9692063), (-4.7194967, -48.90738, -9.262533), (-4.2282653, -48.90738, -9.496839), (-3.1813815, -49.38442, -7.1454997), (-3.1813815, -49.38442, -7.1454997), (-4.2282653, -48.90738, -9.496839), (-3.7254443, -48.90738, -9.705114), (-2.8030548, -49.38442, -7.302208), (-2.8030548, -49.38442, -7.302208), (-3.7254443, -48.90738, -9.705114), (-3.2124124, -48.90738, -9.886788), (-2.4170454, -49.38442, -7.438901), (-2.4170454, -49.38442, -7.438901), (-3.2124124, -48.90738, -9.886788), (-2.6905754, -48.90738, -10.041364), (-2.024411, -49.38442, -7.5552044), (-2.024411, -49.38442, -7.5552044), (-2.6905754, -48.90738, -10.041364), (-2.1613636, -48.90738, -10.168416), (-1.6262277, -49.38442, -7.6507998), (-1.6262277, -49.38442, -7.6507998), (-2.1613636, -48.90738, -10.168416), (-1.6262277, -48.90738, -10.267597), (-1.223587, -49.38442, -7.725425), (-1.223587, -49.38442, -7.725425), (-1.6262277, -48.90738, -10.267597), (-1.0866345, -48.90738, -10.338636), (-0.81759274, -49.38442, -7.778875), (-0.81759274, -49.38442, -7.778875), (-1.0866345, -48.90738, -10.338636), (-0.54406285, -48.90738, -10.381338), (-0.40935737, -49.38442, -7.8110037), (-0.40935737, -49.38442, -7.8110037), (-0.54406285, -48.90738, -10.381338), (-1.909638e-15, -48.90738, -10.395584), (-1.4368273e-15, -49.38442, -7.8217235), (-1.4368273e-15, -49.38442, -7.8217235), (-1.909638e-15, -48.90738, -10.395584), (0.54406285, -48.90738, -10.381338), (0.40935737, -49.38442, -7.8110037), (0.40935737, -49.38442, -7.8110037), (0.54406285, -48.90738, -10.381338), (1.0866345, -48.90738, -10.338636), (0.81759274, -49.38442, -7.778875), (0.81759274, -49.38442, -7.778875), (1.0866345, -48.90738, -10.338636), (1.6262277, -48.90738, -10.267597), (1.223587, -49.38442, -7.725425), (1.223587, -49.38442, -7.725425), (1.6262277, -48.90738, -10.267597), (2.1613636, -48.90738, -10.168416), (1.6262277, -49.38442, -7.6507998), (1.6262277, -49.38442, -7.6507998), (2.1613636, -48.90738, -10.168416), (2.6905754, -48.90738, -10.041364), (2.024411, -49.38442, -7.5552044), (2.024411, -49.38442, -7.5552044), (2.6905754, -48.90738, -10.041364), (3.2124124, -48.90738, -9.886788), (2.4170454, -49.38442, -7.438901), (2.4170454, -49.38442, -7.438901), (3.2124124, -48.90738, -9.886788), (3.7254443, -48.90738, -9.705114), (2.8030548, -49.38442, -7.302208), (2.8030548, -49.38442, -7.302208), (3.7254443, -48.90738, -9.705114), (4.2282653, -48.90738, -9.496839), (3.1813815, -49.38442, -7.1454997), (3.1813815, -49.38442, -7.1454997), (4.2282653, -48.90738, -9.496839), (4.7194967, -48.90738, -9.262533), (3.550988, -49.38442, -6.9692063), (3.550988, -49.38442, -6.9692063), (4.7194967, -48.90738, -9.262533), (5.197792, -48.90738, -9.00284), (3.9108617, -49.38442, -6.773811), (3.9108617, -49.38442, -6.773811), (5.197792, -48.90738, -9.00284), (5.661841, -48.90738, -8.718471), (4.260016, -49.38442, -6.5598493), (4.260016, -49.38442, -6.5598493), (5.661841, -48.90738, -8.718471), (6.110371, -48.90738, -8.410205), (4.5974936, -49.38442, -6.327907), (4.5974936, -49.38442, -6.327907), (6.110371, -48.90738, -8.410205), (6.5421534, -48.90738, -8.078887), (4.92237, -49.38442, -6.0786204), (4.92237, -49.38442, -6.0786204), (6.5421534, -48.90738, -8.078887), (6.9560037, -48.90738, -7.725425), (5.2337546, -49.38442, -5.812673), (5.2337546, -49.38442, -5.812673), (6.9560037, -48.90738, -7.725425), (7.350788, -48.90738, -7.350788), (5.5307937, -49.38442, -5.5307937), (5.5307937, -49.38442, -5.5307937), (7.350788, -48.90738, -7.350788), (7.725425, -48.90738, -6.9560037), (5.812673, -49.38442, -5.2337546), (5.812673, -49.38442, -5.2337546), (7.725425, -48.90738, -6.9560037), (8.078887, -48.90738, -6.5421534), (6.0786204, -49.38442, -4.92237), (6.0786204, -49.38442, -4.92237), (8.078887, -48.90738, -6.5421534), (8.410205, -48.90738, -6.110371), (6.327907, -49.38442, -4.5974936), (6.327907, -49.38442, -4.5974936), (8.410205, -48.90738, -6.110371), (8.718471, -48.90738, -5.661841), (6.5598493, -49.38442, -4.260016), (6.5598493, -49.38442, -4.260016), (8.718471, -48.90738, -5.661841), (9.00284, -48.90738, -5.197792), (6.773811, -49.38442, -3.9108617), (6.773811, -49.38442, -3.9108617), (9.00284, -48.90738, -5.197792), (9.262533, -48.90738, -4.7194967), (6.9692063, -49.38442, -3.550988), (6.9692063, -49.38442, -3.550988), (9.262533, -48.90738, -4.7194967), (9.496839, -48.90738, -4.2282653), (7.1454997, -49.38442, -3.1813815), (7.1454997, -49.38442, -3.1813815), (9.496839, -48.90738, -4.2282653), (9.705114, -48.90738, -3.7254443), (7.302208, -49.38442, -2.8030548), (7.302208, -49.38442, -2.8030548), (9.705114, -48.90738, -3.7254443), (9.886788, -48.90738, -3.2124124), (7.438901, -49.38442, -2.4170454), (7.438901, -49.38442, -2.4170454), (9.886788, -48.90738, -3.2124124), (10.041364, -48.90738, -2.6905754), (7.5552044, -49.38442, -2.024411), (7.5552044, -49.38442, -2.024411), (10.041364, -48.90738, -2.6905754), (10.168416, -48.90738, -2.1613636), (7.6507998, -49.38442, -1.6262277), (7.6507998, -49.38442, -1.6262277), (10.168416, -48.90738, -2.1613636), (10.267597, -48.90738, -1.6262277), (7.725425, -49.38442, -1.223587), (7.725425, -49.38442, -1.223587), (10.267597, -48.90738, -1.6262277), (10.338636, -48.90738, -1.0866345), (7.778875, -49.38442, -0.81759274), (7.778875, -49.38442, -0.81759274), (10.338636, -48.90738, -1.0866345), (10.381338, -48.90738, -0.54406285), (7.8110037, -49.38442, -0.40935737), (7.8110037, -49.38442, -0.40935737), (10.381338, -48.90738, -0.54406285), (10.395584, -48.90738, 0), (7.8217235, -49.38442, 0), (10.395584, -48.90738, 0), (12.940952, -48.29629, 0), (12.923217, -48.29629, 0.6772771), (10.381338, -48.90738, 0.54406285), (10.381338, -48.90738, 0.54406285), (12.923217, -48.29629, 0.6772771), (12.87006, -48.29629, 1.3526978), (10.338636, -48.90738, 1.0866345), (10.338636, -48.90738, 1.0866345), (12.87006, -48.29629, 1.3526978), (12.781628, -48.29629, 2.024411), (10.267597, -48.90738, 1.6262277), (10.267597, -48.90738, 1.6262277), (12.781628, -48.29629, 2.024411), (12.658161, -48.29629, 2.6905754), (10.168416, -48.90738, 2.1613636), (10.168416, -48.90738, 2.1613636), (12.658161, -48.29629, 2.6905754), (12.5, -48.29629, 3.349365), (10.041364, -48.90738, 2.6905754), (10.041364, -48.90738, 2.6905754), (12.5, -48.29629, 3.349365), (12.307577, -48.29629, 3.998974), (9.886788, -48.90738, 3.2124124), (9.886788, -48.90738, 3.2124124), (12.307577, -48.29629, 3.998974), (12.08142, -48.29629, 4.6376224), (9.705114, -48.90738, 3.7254443), (9.705114, -48.90738, 3.7254443), (12.08142, -48.29629, 4.6376224), (11.822148, -48.29629, 5.2635593), (9.496839, -48.90738, 4.2282653), (9.496839, -48.90738, 4.2282653), (11.822148, -48.29629, 5.2635593), (11.530473, -48.29629, 5.8750696), (9.262533, -48.90738, 4.7194967), (9.262533, -48.90738, 4.7194967), (11.530473, -48.29629, 5.8750696), (11.207193, -48.29629, 6.470476), (9.00284, -48.90738, 5.197792), (9.00284, -48.90738, 5.197792), (11.207193, -48.29629, 6.470476), (10.853196, -48.29629, 7.0481477), (8.718471, -48.90738, 5.661841), (8.718471, -48.90738, 5.661841), (10.853196, -48.29629, 7.0481477), (10.46945, -48.29629, 7.606501), (8.410205, -48.90738, 6.110371), (8.410205, -48.90738, 6.110371), (10.46945, -48.29629, 7.606501), (10.057009, -48.29629, 8.144005), (8.078887, -48.90738, 6.5421534), (8.078887, -48.90738, 6.5421534), (10.057009, -48.29629, 8.144005), (9.617002, -48.29629, 8.659187), (7.725425, -48.90738, 6.9560037), (7.725425, -48.90738, 6.9560037), (9.617002, -48.29629, 8.659187), (9.150635, -48.29629, 9.150635), (7.350788, -48.90738, 7.350788), (7.350788, -48.90738, 7.350788), (9.150635, -48.29629, 9.150635), (8.659187, -48.29629, 9.617002), (6.9560037, -48.90738, 7.725425), (6.9560037, -48.90738, 7.725425), (8.659187, -48.29629, 9.617002), (8.144005, -48.29629, 10.057009), (6.5421534, -48.90738, 8.078887), (6.5421534, -48.90738, 8.078887), (8.144005, -48.29629, 10.057009), (7.606501, -48.29629, 10.46945), (6.110371, -48.90738, 8.410205), (6.110371, -48.90738, 8.410205), (7.606501, -48.29629, 10.46945), (7.0481477, -48.29629, 10.853196), (5.661841, -48.90738, 8.718471), (5.661841, -48.90738, 8.718471), (7.0481477, -48.29629, 10.853196), (6.470476, -48.29629, 11.207193), (5.197792, -48.90738, 9.00284), (5.197792, -48.90738, 9.00284), (6.470476, -48.29629, 11.207193), (5.8750696, -48.29629, 11.530473), (4.7194967, -48.90738, 9.262533), (4.7194967, -48.90738, 9.262533), (5.8750696, -48.29629, 11.530473), (5.2635593, -48.29629, 11.822148), (4.2282653, -48.90738, 9.496839), (4.2282653, -48.90738, 9.496839), (5.2635593, -48.29629, 11.822148), (4.6376224, -48.29629, 12.08142), (3.7254443, -48.90738, 9.705114), (3.7254443, -48.90738, 9.705114), (4.6376224, -48.29629, 12.08142), (3.998974, -48.29629, 12.307577), (3.2124124, -48.90738, 9.886788), (3.2124124, -48.90738, 9.886788), (3.998974, -48.29629, 12.307577), (3.349365, -48.29629, 12.5), (2.6905754, -48.90738, 10.041364), (2.6905754, -48.90738, 10.041364), (3.349365, -48.29629, 12.5), (2.6905754, -48.29629, 12.658161), (2.1613636, -48.90738, 10.168416), (2.1613636, -48.90738, 10.168416), (2.6905754, -48.29629, 12.658161), (2.024411, -48.29629, 12.781628), (1.6262277, -48.90738, 10.267597), (1.6262277, -48.90738, 10.267597), (2.024411, -48.29629, 12.781628), (1.3526978, -48.29629, 12.87006), (1.0866345, -48.90738, 10.338636), (1.0866345, -48.90738, 10.338636), (1.3526978, -48.29629, 12.87006), (0.6772771, -48.29629, 12.923217), (0.54406285, -48.90738, 10.381338), (0.54406285, -48.90738, 10.381338), (0.6772771, -48.29629, 12.923217), (7.924048e-16, -48.29629, 12.940952), (6.3654595e-16, -48.90738, 10.395584), (6.3654595e-16, -48.90738, 10.395584), (7.924048e-16, -48.29629, 12.940952), (-0.6772771, -48.29629, 12.923217), (-0.54406285, -48.90738, 10.381338), (-0.54406285, -48.90738, 10.381338), (-0.6772771, -48.29629, 12.923217), (-1.3526978, -48.29629, 12.87006), (-1.0866345, -48.90738, 10.338636), (-1.0866345, -48.90738, 10.338636), (-1.3526978, -48.29629, 12.87006), (-2.024411, -48.29629, 12.781628), (-1.6262277, -48.90738, 10.267597), (-1.6262277, -48.90738, 10.267597), (-2.024411, -48.29629, 12.781628), (-2.6905754, -48.29629, 12.658161), (-2.1613636, -48.90738, 10.168416), (-2.1613636, -48.90738, 10.168416), (-2.6905754, -48.29629, 12.658161), (-3.349365, -48.29629, 12.5), (-2.6905754, -48.90738, 10.041364), (-2.6905754, -48.90738, 10.041364), (-3.349365, -48.29629, 12.5), (-3.998974, -48.29629, 12.307577), (-3.2124124, -48.90738, 9.886788), (-3.2124124, -48.90738, 9.886788), (-3.998974, -48.29629, 12.307577), (-4.6376224, -48.29629, 12.08142), (-3.7254443, -48.90738, 9.705114), (-3.7254443, -48.90738, 9.705114), (-4.6376224, -48.29629, 12.08142), (-5.2635593, -48.29629, 11.822148), (-4.2282653, -48.90738, 9.496839), (-4.2282653, -48.90738, 9.496839), (-5.2635593, -48.29629, 11.822148), (-5.8750696, -48.29629, 11.530473), (-4.7194967, -48.90738, 9.262533), (-4.7194967, -48.90738, 9.262533), (-5.8750696, -48.29629, 11.530473), (-6.470476, -48.29629, 11.207193), (-5.197792, -48.90738, 9.00284), (-5.197792, -48.90738, 9.00284), (-6.470476, -48.29629, 11.207193), (-7.0481477, -48.29629, 10.853196), (-5.661841, -48.90738, 8.718471), (-5.661841, -48.90738, 8.718471), (-7.0481477, -48.29629, 10.853196), (-7.606501, -48.29629, 10.46945), (-6.110371, -48.90738, 8.410205), (-6.110371, -48.90738, 8.410205), (-7.606501, -48.29629, 10.46945), (-8.144005, -48.29629, 10.057009), (-6.5421534, -48.90738, 8.078887), (-6.5421534, -48.90738, 8.078887), (-8.144005, -48.29629, 10.057009), (-8.659187, -48.29629, 9.617002), (-6.9560037, -48.90738, 7.725425), (-6.9560037, -48.90738, 7.725425), (-8.659187, -48.29629, 9.617002), (-9.150635, -48.29629, 9.150635), (-7.350788, -48.90738, 7.350788), (-7.350788, -48.90738, 7.350788), (-9.150635, -48.29629, 9.150635), (-9.617002, -48.29629, 8.659187), (-7.725425, -48.90738, 6.9560037), (-7.725425, -48.90738, 6.9560037), (-9.617002, -48.29629, 8.659187), (-10.057009, -48.29629, 8.144005), (-8.078887, -48.90738, 6.5421534), (-8.078887, -48.90738, 6.5421534), (-10.057009, -48.29629, 8.144005), (-10.46945, -48.29629, 7.606501), (-8.410205, -48.90738, 6.110371), (-8.410205, -48.90738, 6.110371), (-10.46945, -48.29629, 7.606501), (-10.853196, -48.29629, 7.0481477), (-8.718471, -48.90738, 5.661841), (-8.718471, -48.90738, 5.661841), (-10.853196, -48.29629, 7.0481477), (-11.207193, -48.29629, 6.470476), (-9.00284, -48.90738, 5.197792), (-9.00284, -48.90738, 5.197792), (-11.207193, -48.29629, 6.470476), (-11.530473, -48.29629, 5.8750696), (-9.262533, -48.90738, 4.7194967), (-9.262533, -48.90738, 4.7194967), (-11.530473, -48.29629, 5.8750696), (-11.822148, -48.29629, 5.2635593), (-9.496839, -48.90738, 4.2282653), (-9.496839, -48.90738, 4.2282653), (-11.822148, -48.29629, 5.2635593), (-12.08142, -48.29629, 4.6376224), (-9.705114, -48.90738, 3.7254443), (-9.705114, -48.90738, 3.7254443), (-12.08142, -48.29629, 4.6376224), (-12.307577, -48.29629, 3.998974), (-9.886788, -48.90738, 3.2124124), (-9.886788, -48.90738, 3.2124124), (-12.307577, -48.29629, 3.998974), (-12.5, -48.29629, 3.349365), (-10.041364, -48.90738, 2.6905754), (-10.041364, -48.90738, 2.6905754), (-12.5, -48.29629, 3.349365), (-12.658161, -48.29629, 2.6905754), (-10.168416, -48.90738, 2.1613636), (-10.168416, -48.90738, 2.1613636), (-12.658161, -48.29629, 2.6905754), (-12.781628, -48.29629, 2.024411), (-10.267597, -48.90738, 1.6262277), (-10.267597, -48.90738, 1.6262277), (-12.781628, -48.29629, 2.024411), (-12.87006, -48.29629, 1.3526978), (-10.338636, -48.90738, 1.0866345), (-10.338636, -48.90738, 1.0866345), (-12.87006, -48.29629, 1.3526978), (-12.923217, -48.29629, 0.6772771), (-10.381338, -48.90738, 0.54406285), (-10.381338, -48.90738, 0.54406285), (-12.923217, -48.29629, 0.6772771), (-12.940952, -48.29629, 1.5848095e-15), (-10.395584, -48.90738, 1.2730919e-15), (-10.395584, -48.90738, 1.2730919e-15), (-12.940952, -48.29629, 1.5848095e-15), (-12.923217, -48.29629, -0.6772771), (-10.381338, -48.90738, -0.54406285), (-10.381338, -48.90738, -0.54406285), (-12.923217, -48.29629, -0.6772771), (-12.87006, -48.29629, -1.3526978), (-10.338636, -48.90738, -1.0866345), (-10.338636, -48.90738, -1.0866345), (-12.87006, -48.29629, -1.3526978), (-12.781628, -48.29629, -2.024411), (-10.267597, -48.90738, -1.6262277), (-10.267597, -48.90738, -1.6262277), (-12.781628, -48.29629, -2.024411), (-12.658161, -48.29629, -2.6905754), (-10.168416, -48.90738, -2.1613636), (-10.168416, -48.90738, -2.1613636), (-12.658161, -48.29629, -2.6905754), (-12.5, -48.29629, -3.349365), (-10.041364, -48.90738, -2.6905754), (-10.041364, -48.90738, -2.6905754), (-12.5, -48.29629, -3.349365), (-12.307577, -48.29629, -3.998974), (-9.886788, -48.90738, -3.2124124), (-9.886788, -48.90738, -3.2124124), (-12.307577, -48.29629, -3.998974), (-12.08142, -48.29629, -4.6376224), (-9.705114, -48.90738, -3.7254443), (-9.705114, -48.90738, -3.7254443), (-12.08142, -48.29629, -4.6376224), (-11.822148, -48.29629, -5.2635593), (-9.496839, -48.90738, -4.2282653), (-9.496839, -48.90738, -4.2282653), (-11.822148, -48.29629, -5.2635593), (-11.530473, -48.29629, -5.8750696), (-9.262533, -48.90738, -4.7194967), (-9.262533, -48.90738, -4.7194967), (-11.530473, -48.29629, -5.8750696), (-11.207193, -48.29629, -6.470476), (-9.00284, -48.90738, -5.197792), (-9.00284, -48.90738, -5.197792), (-11.207193, -48.29629, -6.470476), (-10.853196, -48.29629, -7.0481477), (-8.718471, -48.90738, -5.661841), (-8.718471, -48.90738, -5.661841), (-10.853196, -48.29629, -7.0481477), (-10.46945, -48.29629, -7.606501), (-8.410205, -48.90738, -6.110371), (-8.410205, -48.90738, -6.110371), (-10.46945, -48.29629, -7.606501), (-10.057009, -48.29629, -8.144005), (-8.078887, -48.90738, -6.5421534), (-8.078887, -48.90738, -6.5421534), (-10.057009, -48.29629, -8.144005), (-9.617002, -48.29629, -8.659187), (-7.725425, -48.90738, -6.9560037), (-7.725425, -48.90738, -6.9560037), (-9.617002, -48.29629, -8.659187), (-9.150635, -48.29629, -9.150635), (-7.350788, -48.90738, -7.350788), (-7.350788, -48.90738, -7.350788), (-9.150635, -48.29629, -9.150635), (-8.659187, -48.29629, -9.617002), (-6.9560037, -48.90738, -7.725425), (-6.9560037, -48.90738, -7.725425), (-8.659187, -48.29629, -9.617002), (-8.144005, -48.29629, -10.057009), (-6.5421534, -48.90738, -8.078887), (-6.5421534, -48.90738, -8.078887), (-8.144005, -48.29629, -10.057009), (-7.606501, -48.29629, -10.46945), (-6.110371, -48.90738, -8.410205), (-6.110371, -48.90738, -8.410205), (-7.606501, -48.29629, -10.46945), (-7.0481477, -48.29629, -10.853196), (-5.661841, -48.90738, -8.718471), (-5.661841, -48.90738, -8.718471), (-7.0481477, -48.29629, -10.853196), (-6.470476, -48.29629, -11.207193), (-5.197792, -48.90738, -9.00284), (-5.197792, -48.90738, -9.00284), (-6.470476, -48.29629, -11.207193), (-5.8750696, -48.29629, -11.530473), (-4.7194967, -48.90738, -9.262533), (-4.7194967, -48.90738, -9.262533), (-5.8750696, -48.29629, -11.530473), (-5.2635593, -48.29629, -11.822148), (-4.2282653, -48.90738, -9.496839), (-4.2282653, -48.90738, -9.496839), (-5.2635593, -48.29629, -11.822148), (-4.6376224, -48.29629, -12.08142), (-3.7254443, -48.90738, -9.705114), (-3.7254443, -48.90738, -9.705114), (-4.6376224, -48.29629, -12.08142), (-3.998974, -48.29629, -12.307577), (-3.2124124, -48.90738, -9.886788), (-3.2124124, -48.90738, -9.886788), (-3.998974, -48.29629, -12.307577), (-3.349365, -48.29629, -12.5), (-2.6905754, -48.90738, -10.041364), (-2.6905754, -48.90738, -10.041364), (-3.349365, -48.29629, -12.5), (-2.6905754, -48.29629, -12.658161), (-2.1613636, -48.90738, -10.168416), (-2.1613636, -48.90738, -10.168416), (-2.6905754, -48.29629, -12.658161), (-2.024411, -48.29629, -12.781628), (-1.6262277, -48.90738, -10.267597), (-1.6262277, -48.90738, -10.267597), (-2.024411, -48.29629, -12.781628), (-1.3526978, -48.29629, -12.87006), (-1.0866345, -48.90738, -10.338636), (-1.0866345, -48.90738, -10.338636), (-1.3526978, -48.29629, -12.87006), (-0.6772771, -48.29629, -12.923217), (-0.54406285, -48.90738, -10.381338), (-0.54406285, -48.90738, -10.381338), (-0.6772771, -48.29629, -12.923217), (-2.3772143e-15, -48.29629, -12.940952), (-1.909638e-15, -48.90738, -10.395584), (-1.909638e-15, -48.90738, -10.395584), (-2.3772143e-15, -48.29629, -12.940952), (0.6772771, -48.29629, -12.923217), (0.54406285, -48.90738, -10.381338), (0.54406285, -48.90738, -10.381338), (0.6772771, -48.29629, -12.923217), (1.3526978, -48.29629, -12.87006), (1.0866345, -48.90738, -10.338636), (1.0866345, -48.90738, -10.338636), (1.3526978, -48.29629, -12.87006), (2.024411, -48.29629, -12.781628), (1.6262277, -48.90738, -10.267597), (1.6262277, -48.90738, -10.267597), (2.024411, -48.29629, -12.781628), (2.6905754, -48.29629, -12.658161), (2.1613636, -48.90738, -10.168416), (2.1613636, -48.90738, -10.168416), (2.6905754, -48.29629, -12.658161), (3.349365, -48.29629, -12.5), (2.6905754, -48.90738, -10.041364), (2.6905754, -48.90738, -10.041364), (3.349365, -48.29629, -12.5), (3.998974, -48.29629, -12.307577), (3.2124124, -48.90738, -9.886788), (3.2124124, -48.90738, -9.886788), (3.998974, -48.29629, -12.307577), (4.6376224, -48.29629, -12.08142), (3.7254443, -48.90738, -9.705114), (3.7254443, -48.90738, -9.705114), (4.6376224, -48.29629, -12.08142), (5.2635593, -48.29629, -11.822148), (4.2282653, -48.90738, -9.496839), (4.2282653, -48.90738, -9.496839), (5.2635593, -48.29629, -11.822148), (5.8750696, -48.29629, -11.530473), (4.7194967, -48.90738, -9.262533), (4.7194967, -48.90738, -9.262533), (5.8750696, -48.29629, -11.530473), (6.470476, -48.29629, -11.207193), (5.197792, -48.90738, -9.00284), (5.197792, -48.90738, -9.00284), (6.470476, -48.29629, -11.207193), (7.0481477, -48.29629, -10.853196), (5.661841, -48.90738, -8.718471), (5.661841, -48.90738, -8.718471), (7.0481477, -48.29629, -10.853196), (7.606501, -48.29629, -10.46945), (6.110371, -48.90738, -8.410205), (6.110371, -48.90738, -8.410205), (7.606501, -48.29629, -10.46945), (8.144005, -48.29629, -10.057009), (6.5421534, -48.90738, -8.078887), (6.5421534, -48.90738, -8.078887), (8.144005, -48.29629, -10.057009), (8.659187, -48.29629, -9.617002), (6.9560037, -48.90738, -7.725425), (6.9560037, -48.90738, -7.725425), (8.659187, -48.29629, -9.617002), (9.150635, -48.29629, -9.150635), (7.350788, -48.90738, -7.350788), (7.350788, -48.90738, -7.350788), (9.150635, -48.29629, -9.150635), (9.617002, -48.29629, -8.659187), (7.725425, -48.90738, -6.9560037), (7.725425, -48.90738, -6.9560037), (9.617002, -48.29629, -8.659187), (10.057009, -48.29629, -8.144005), (8.078887, -48.90738, -6.5421534), (8.078887, -48.90738, -6.5421534), (10.057009, -48.29629, -8.144005), (10.46945, -48.29629, -7.606501), (8.410205, -48.90738, -6.110371), (8.410205, -48.90738, -6.110371), (10.46945, -48.29629, -7.606501), (10.853196, -48.29629, -7.0481477), (8.718471, -48.90738, -5.661841), (8.718471, -48.90738, -5.661841), (10.853196, -48.29629, -7.0481477), (11.207193, -48.29629, -6.470476), (9.00284, -48.90738, -5.197792), (9.00284, -48.90738, -5.197792), (11.207193, -48.29629, -6.470476), (11.530473, -48.29629, -5.8750696), (9.262533, -48.90738, -4.7194967), (9.262533, -48.90738, -4.7194967), (11.530473, -48.29629, -5.8750696), (11.822148, -48.29629, -5.2635593), (9.496839, -48.90738, -4.2282653), (9.496839, -48.90738, -4.2282653), (11.822148, -48.29629, -5.2635593), (12.08142, -48.29629, -4.6376224), (9.705114, -48.90738, -3.7254443), (9.705114, -48.90738, -3.7254443), (12.08142, -48.29629, -4.6376224), (12.307577, -48.29629, -3.998974), (9.886788, -48.90738, -3.2124124), (9.886788, -48.90738, -3.2124124), (12.307577, -48.29629, -3.998974), (12.5, -48.29629, -3.349365), (10.041364, -48.90738, -2.6905754), (10.041364, -48.90738, -2.6905754), (12.5, -48.29629, -3.349365), (12.658161, -48.29629, -2.6905754), (10.168416, -48.90738, -2.1613636), (10.168416, -48.90738, -2.1613636), (12.658161, -48.29629, -2.6905754), (12.781628, -48.29629, -2.024411), (10.267597, -48.90738, -1.6262277), (10.267597, -48.90738, -1.6262277), (12.781628, -48.29629, -2.024411), (12.87006, -48.29629, -1.3526978), (10.338636, -48.90738, -1.0866345), (10.338636, -48.90738, -1.0866345), (12.87006, -48.29629, -1.3526978), (12.923217, -48.29629, -0.6772771), (10.381338, -48.90738, -0.54406285), (10.381338, -48.90738, -0.54406285), (12.923217, -48.29629, -0.6772771), (12.940952, -48.29629, 0), (10.395584, -48.90738, 0), (12.940952, -48.29629, 0), (15.45085, -47.552826, 0), (15.429675, -47.552826, 0.808635), (12.923217, -48.29629, 0.6772771), (12.923217, -48.29629, 0.6772771), (15.429675, -47.552826, 0.808635), (15.366208, -47.552826, 1.6150535), (12.87006, -48.29629, 1.3526978), (12.87006, -48.29629, 1.3526978), (15.366208, -47.552826, 1.6150535), (15.260624, -47.552826, 2.4170454), (12.781628, -48.29629, 2.024411), (12.781628, -48.29629, 2.024411), (15.260624, -47.552826, 2.4170454), (15.113212, -47.552826, 3.2124124), (12.658161, -48.29629, 2.6905754), (12.658161, -48.29629, 2.6905754), (15.113212, -47.552826, 3.2124124), (14.924375, -47.552826, 3.998974), (12.5, -48.29629, 3.349365), (12.5, -48.29629, 3.349365), (14.924375, -47.552826, 3.998974), (14.694632, -47.552826, 4.774575), (12.307577, -48.29629, 3.998974), (12.307577, -48.29629, 3.998974), (14.694632, -47.552826, 4.774575), (14.424611, -47.552826, 5.5370893), (12.08142, -48.29629, 4.6376224), (12.08142, -48.29629, 4.6376224), (14.424611, -47.552826, 5.5370893), (14.115053, -47.552826, 6.2844267), (11.822148, -48.29629, 5.2635593), (11.822148, -48.29629, 5.2635593), (14.115053, -47.552826, 6.2844267), (13.766808, -47.552826, 7.014539), (11.530473, -48.29629, 5.8750696), (11.530473, -48.29629, 5.8750696), (13.766808, -47.552826, 7.014539), (13.380828, -47.552826, 7.725425), (11.207193, -48.29629, 6.470476), (11.207193, -48.29629, 6.470476), (13.380828, -47.552826, 7.725425), (12.958173, -47.552826, 8.415136), (10.853196, -48.29629, 7.0481477), (10.853196, -48.29629, 7.0481477), (12.958173, -47.552826, 8.415136), (12.5, -47.552826, 9.081781), (10.46945, -48.29629, 7.606501), (10.46945, -48.29629, 7.606501), (12.5, -47.552826, 9.081781), (12.0075655, -47.552826, 9.723535), (10.057009, -48.29629, 8.144005), (10.057009, -48.29629, 8.144005), (12.0075655, -47.552826, 9.723535), (11.482219, -47.552826, 10.338636), (9.617002, -48.29629, 8.659187), (9.617002, -48.29629, 8.659187), (11.482219, -47.552826, 10.338636), (10.925401, -47.552826, 10.925401), (9.150635, -48.29629, 9.150635), (9.150635, -48.29629, 9.150635), (10.925401, -47.552826, 10.925401), (10.338636, -47.552826, 11.482219), (8.659187, -48.29629, 9.617002), (8.659187, -48.29629, 9.617002), (10.338636, -47.552826, 11.482219), (9.723535, -47.552826, 12.0075655), (8.144005, -48.29629, 10.057009), (8.144005, -48.29629, 10.057009), (9.723535, -47.552826, 12.0075655), (9.081781, -47.552826, 12.5), (7.606501, -48.29629, 10.46945), (7.606501, -48.29629, 10.46945), (9.081781, -47.552826, 12.5), (8.415136, -47.552826, 12.958173), (7.0481477, -48.29629, 10.853196), (7.0481477, -48.29629, 10.853196), (8.415136, -47.552826, 12.958173), (7.725425, -47.552826, 13.380828), (6.470476, -48.29629, 11.207193), (6.470476, -48.29629, 11.207193), (7.725425, -47.552826, 13.380828), (7.014539, -47.552826, 13.766808), (5.8750696, -48.29629, 11.530473), (5.8750696, -48.29629, 11.530473), (7.014539, -47.552826, 13.766808), (6.2844267, -47.552826, 14.115053), (5.2635593, -48.29629, 11.822148), (5.2635593, -48.29629, 11.822148), (6.2844267, -47.552826, 14.115053), (5.5370893, -47.552826, 14.424611), (4.6376224, -48.29629, 12.08142), (4.6376224, -48.29629, 12.08142), (5.5370893, -47.552826, 14.424611), (4.774575, -47.552826, 14.694632), (3.998974, -48.29629, 12.307577), (3.998974, -48.29629, 12.307577), (4.774575, -47.552826, 14.694632), (3.998974, -47.552826, 14.924375), (3.349365, -48.29629, 12.5), (3.349365, -48.29629, 12.5), (3.998974, -47.552826, 14.924375), (3.2124124, -47.552826, 15.113212), (2.6905754, -48.29629, 12.658161), (2.6905754, -48.29629, 12.658161), (3.2124124, -47.552826, 15.113212), (2.4170454, -47.552826, 15.260624), (2.024411, -48.29629, 12.781628), (2.024411, -48.29629, 12.781628), (2.4170454, -47.552826, 15.260624), (1.6150535, -47.552826, 15.366208), (1.3526978, -48.29629, 12.87006), (1.3526978, -48.29629, 12.87006), (1.6150535, -47.552826, 15.366208), (0.808635, -47.552826, 15.429675), (0.6772771, -48.29629, 12.923217), (0.6772771, -48.29629, 12.923217), (0.808635, -47.552826, 15.429675), (9.460917e-16, -47.552826, 15.45085), (7.924048e-16, -48.29629, 12.940952), (7.924048e-16, -48.29629, 12.940952), (9.460917e-16, -47.552826, 15.45085), (-0.808635, -47.552826, 15.429675), (-0.6772771, -48.29629, 12.923217), (-0.6772771, -48.29629, 12.923217), (-0.808635, -47.552826, 15.429675), (-1.6150535, -47.552826, 15.366208), (-1.3526978, -48.29629, 12.87006), (-1.3526978, -48.29629, 12.87006), (-1.6150535, -47.552826, 15.366208), (-2.4170454, -47.552826, 15.260624), (-2.024411, -48.29629, 12.781628), (-2.024411, -48.29629, 12.781628), (-2.4170454, -47.552826, 15.260624), (-3.2124124, -47.552826, 15.113212), (-2.6905754, -48.29629, 12.658161), (-2.6905754, -48.29629, 12.658161), (-3.2124124, -47.552826, 15.113212), (-3.998974, -47.552826, 14.924375), (-3.349365, -48.29629, 12.5), (-3.349365, -48.29629, 12.5), (-3.998974, -47.552826, 14.924375), (-4.774575, -47.552826, 14.694632), (-3.998974, -48.29629, 12.307577), (-3.998974, -48.29629, 12.307577), (-4.774575, -47.552826, 14.694632), (-5.5370893, -47.552826, 14.424611), (-4.6376224, -48.29629, 12.08142), (-4.6376224, -48.29629, 12.08142), (-5.5370893, -47.552826, 14.424611), (-6.2844267, -47.552826, 14.115053), (-5.2635593, -48.29629, 11.822148), (-5.2635593, -48.29629, 11.822148), (-6.2844267, -47.552826, 14.115053), (-7.014539, -47.552826, 13.766808), (-5.8750696, -48.29629, 11.530473), (-5.8750696, -48.29629, 11.530473), (-7.014539, -47.552826, 13.766808), (-7.725425, -47.552826, 13.380828), (-6.470476, -48.29629, 11.207193), (-6.470476, -48.29629, 11.207193), (-7.725425, -47.552826, 13.380828), (-8.415136, -47.552826, 12.958173), (-7.0481477, -48.29629, 10.853196), (-7.0481477, -48.29629, 10.853196), (-8.415136, -47.552826, 12.958173), (-9.081781, -47.552826, 12.5), (-7.606501, -48.29629, 10.46945), (-7.606501, -48.29629, 10.46945), (-9.081781, -47.552826, 12.5), (-9.723535, -47.552826, 12.0075655), (-8.144005, -48.29629, 10.057009), (-8.144005, -48.29629, 10.057009), (-9.723535, -47.552826, 12.0075655), (-10.338636, -47.552826, 11.482219), (-8.659187, -48.29629, 9.617002), (-8.659187, -48.29629, 9.617002), (-10.338636, -47.552826, 11.482219), (-10.925401, -47.552826, 10.925401), (-9.150635, -48.29629, 9.150635), (-9.150635, -48.29629, 9.150635), (-10.925401, -47.552826, 10.925401), (-11.482219, -47.552826, 10.338636), (-9.617002, -48.29629, 8.659187), (-9.617002, -48.29629, 8.659187), (-11.482219, -47.552826, 10.338636), (-12.0075655, -47.552826, 9.723535), (-10.057009, -48.29629, 8.144005), (-10.057009, -48.29629, 8.144005), (-12.0075655, -47.552826, 9.723535), (-12.5, -47.552826, 9.081781), (-10.46945, -48.29629, 7.606501), (-10.46945, -48.29629, 7.606501), (-12.5, -47.552826, 9.081781), (-12.958173, -47.552826, 8.415136), (-10.853196, -48.29629, 7.0481477), (-10.853196, -48.29629, 7.0481477), (-12.958173, -47.552826, 8.415136), (-13.380828, -47.552826, 7.725425), (-11.207193, -48.29629, 6.470476), (-11.207193, -48.29629, 6.470476), (-13.380828, -47.552826, 7.725425), (-13.766808, -47.552826, 7.014539), (-11.530473, -48.29629, 5.8750696), (-11.530473, -48.29629, 5.8750696), (-13.766808, -47.552826, 7.014539), (-14.115053, -47.552826, 6.2844267), (-11.822148, -48.29629, 5.2635593), (-11.822148, -48.29629, 5.2635593), (-14.115053, -47.552826, 6.2844267), (-14.424611, -47.552826, 5.5370893), (-12.08142, -48.29629, 4.6376224), (-12.08142, -48.29629, 4.6376224), (-14.424611, -47.552826, 5.5370893), (-14.694632, -47.552826, 4.774575), (-12.307577, -48.29629, 3.998974), (-12.307577, -48.29629, 3.998974), (-14.694632, -47.552826, 4.774575), (-14.924375, -47.552826, 3.998974), (-12.5, -48.29629, 3.349365), (-12.5, -48.29629, 3.349365), (-14.924375, -47.552826, 3.998974), (-15.113212, -47.552826, 3.2124124), (-12.658161, -48.29629, 2.6905754), (-12.658161, -48.29629, 2.6905754), (-15.113212, -47.552826, 3.2124124), (-15.260624, -47.552826, 2.4170454), (-12.781628, -48.29629, 2.024411), (-12.781628, -48.29629, 2.024411), (-15.260624, -47.552826, 2.4170454), (-15.366208, -47.552826, 1.6150535), (-12.87006, -48.29629, 1.3526978), (-12.87006, -48.29629, 1.3526978), (-15.366208, -47.552826, 1.6150535), (-15.429675, -47.552826, 0.808635), (-12.923217, -48.29629, 0.6772771), (-12.923217, -48.29629, 0.6772771), (-15.429675, -47.552826, 0.808635), (-15.45085, -47.552826, 1.8921833e-15), (-12.940952, -48.29629, 1.5848095e-15), (-12.940952, -48.29629, 1.5848095e-15), (-15.45085, -47.552826, 1.8921833e-15), (-15.429675, -47.552826, -0.808635), (-12.923217, -48.29629, -0.6772771), (-12.923217, -48.29629, -0.6772771), (-15.429675, -47.552826, -0.808635), (-15.366208, -47.552826, -1.6150535), (-12.87006, -48.29629, -1.3526978), (-12.87006, -48.29629, -1.3526978), (-15.366208, -47.552826, -1.6150535), (-15.260624, -47.552826, -2.4170454), (-12.781628, -48.29629, -2.024411), (-12.781628, -48.29629, -2.024411), (-15.260624, -47.552826, -2.4170454), (-15.113212, -47.552826, -3.2124124), (-12.658161, -48.29629, -2.6905754), (-12.658161, -48.29629, -2.6905754), (-15.113212, -47.552826, -3.2124124), (-14.924375, -47.552826, -3.998974), (-12.5, -48.29629, -3.349365), (-12.5, -48.29629, -3.349365), (-14.924375, -47.552826, -3.998974), (-14.694632, -47.552826, -4.774575), (-12.307577, -48.29629, -3.998974), (-12.307577, -48.29629, -3.998974), (-14.694632, -47.552826, -4.774575), (-14.424611, -47.552826, -5.5370893), (-12.08142, -48.29629, -4.6376224), (-12.08142, -48.29629, -4.6376224), (-14.424611, -47.552826, -5.5370893), (-14.115053, -47.552826, -6.2844267), (-11.822148, -48.29629, -5.2635593), (-11.822148, -48.29629, -5.2635593), (-14.115053, -47.552826, -6.2844267), (-13.766808, -47.552826, -7.014539), (-11.530473, -48.29629, -5.8750696), (-11.530473, -48.29629, -5.8750696), (-13.766808, -47.552826, -7.014539), (-13.380828, -47.552826, -7.725425), (-11.207193, -48.29629, -6.470476), (-11.207193, -48.29629, -6.470476), (-13.380828, -47.552826, -7.725425), (-12.958173, -47.552826, -8.415136), (-10.853196, -48.29629, -7.0481477), (-10.853196, -48.29629, -7.0481477), (-12.958173, -47.552826, -8.415136), (-12.5, -47.552826, -9.081781), (-10.46945, -48.29629, -7.606501), (-10.46945, -48.29629, -7.606501), (-12.5, -47.552826, -9.081781), (-12.0075655, -47.552826, -9.723535), (-10.057009, -48.29629, -8.144005), (-10.057009, -48.29629, -8.144005), (-12.0075655, -47.552826, -9.723535), (-11.482219, -47.552826, -10.338636), (-9.617002, -48.29629, -8.659187), (-9.617002, -48.29629, -8.659187), (-11.482219, -47.552826, -10.338636), (-10.925401, -47.552826, -10.925401), (-9.150635, -48.29629, -9.150635), (-9.150635, -48.29629, -9.150635), (-10.925401, -47.552826, -10.925401), (-10.338636, -47.552826, -11.482219), (-8.659187, -48.29629, -9.617002), (-8.659187, -48.29629, -9.617002), (-10.338636, -47.552826, -11.482219), (-9.723535, -47.552826, -12.0075655), (-8.144005, -48.29629, -10.057009), (-8.144005, -48.29629, -10.057009), (-9.723535, -47.552826, -12.0075655), (-9.081781, -47.552826, -12.5), (-7.606501, -48.29629, -10.46945), (-7.606501, -48.29629, -10.46945), (-9.081781, -47.552826, -12.5), (-8.415136, -47.552826, -12.958173), (-7.0481477, -48.29629, -10.853196), (-7.0481477, -48.29629, -10.853196), (-8.415136, -47.552826, -12.958173), (-7.725425, -47.552826, -13.380828), (-6.470476, -48.29629, -11.207193), (-6.470476, -48.29629, -11.207193), (-7.725425, -47.552826, -13.380828), (-7.014539, -47.552826, -13.766808), (-5.8750696, -48.29629, -11.530473), (-5.8750696, -48.29629, -11.530473), (-7.014539, -47.552826, -13.766808), (-6.2844267, -47.552826, -14.115053), (-5.2635593, -48.29629, -11.822148), (-5.2635593, -48.29629, -11.822148), (-6.2844267, -47.552826, -14.115053), (-5.5370893, -47.552826, -14.424611), (-4.6376224, -48.29629, -12.08142), (-4.6376224, -48.29629, -12.08142), (-5.5370893, -47.552826, -14.424611), (-4.774575, -47.552826, -14.694632), (-3.998974, -48.29629, -12.307577), (-3.998974, -48.29629, -12.307577), (-4.774575, -47.552826, -14.694632), (-3.998974, -47.552826, -14.924375), (-3.349365, -48.29629, -12.5), (-3.349365, -48.29629, -12.5), (-3.998974, -47.552826, -14.924375), (-3.2124124, -47.552826, -15.113212), (-2.6905754, -48.29629, -12.658161), (-2.6905754, -48.29629, -12.658161), (-3.2124124, -47.552826, -15.113212), (-2.4170454, -47.552826, -15.260624), (-2.024411, -48.29629, -12.781628), (-2.024411, -48.29629, -12.781628), (-2.4170454, -47.552826, -15.260624), (-1.6150535, -47.552826, -15.366208), (-1.3526978, -48.29629, -12.87006), (-1.3526978, -48.29629, -12.87006), (-1.6150535, -47.552826, -15.366208), (-0.808635, -47.552826, -15.429675), (-0.6772771, -48.29629, -12.923217), (-0.6772771, -48.29629, -12.923217), (-0.808635, -47.552826, -15.429675), (-2.838275e-15, -47.552826, -15.45085), (-2.3772143e-15, -48.29629, -12.940952), (-2.3772143e-15, -48.29629, -12.940952), (-2.838275e-15, -47.552826, -15.45085), (0.808635, -47.552826, -15.429675), (0.6772771, -48.29629, -12.923217), (0.6772771, -48.29629, -12.923217), (0.808635, -47.552826, -15.429675), (1.6150535, -47.552826, -15.366208), (1.3526978, -48.29629, -12.87006), (1.3526978, -48.29629, -12.87006), (1.6150535, -47.552826, -15.366208), (2.4170454, -47.552826, -15.260624), (2.024411, -48.29629, -12.781628), (2.024411, -48.29629, -12.781628), (2.4170454, -47.552826, -15.260624), (3.2124124, -47.552826, -15.113212), (2.6905754, -48.29629, -12.658161), (2.6905754, -48.29629, -12.658161), (3.2124124, -47.552826, -15.113212), (3.998974, -47.552826, -14.924375), (3.349365, -48.29629, -12.5), (3.349365, -48.29629, -12.5), (3.998974, -47.552826, -14.924375), (4.774575, -47.552826, -14.694632), (3.998974, -48.29629, -12.307577), (3.998974, -48.29629, -12.307577), (4.774575, -47.552826, -14.694632), (5.5370893, -47.552826, -14.424611), (4.6376224, -48.29629, -12.08142), (4.6376224, -48.29629, -12.08142), (5.5370893, -47.552826, -14.424611), (6.2844267, -47.552826, -14.115053), (5.2635593, -48.29629, -11.822148), (5.2635593, -48.29629, -11.822148), (6.2844267, -47.552826, -14.115053), (7.014539, -47.552826, -13.766808), (5.8750696, -48.29629, -11.530473), (5.8750696, -48.29629, -11.530473), (7.014539, -47.552826, -13.766808), (7.725425, -47.552826, -13.380828), (6.470476, -48.29629, -11.207193), (6.470476, -48.29629, -11.207193), (7.725425, -47.552826, -13.380828), (8.415136, -47.552826, -12.958173), (7.0481477, -48.29629, -10.853196), (7.0481477, -48.29629, -10.853196), (8.415136, -47.552826, -12.958173), (9.081781, -47.552826, -12.5), (7.606501, -48.29629, -10.46945), (7.606501, -48.29629, -10.46945), (9.081781, -47.552826, -12.5), (9.723535, -47.552826, -12.0075655), (8.144005, -48.29629, -10.057009), (8.144005, -48.29629, -10.057009), (9.723535, -47.552826, -12.0075655), (10.338636, -47.552826, -11.482219), (8.659187, -48.29629, -9.617002), (8.659187, -48.29629, -9.617002), (10.338636, -47.552826, -11.482219), (10.925401, -47.552826, -10.925401), (9.150635, -48.29629, -9.150635), (9.150635, -48.29629, -9.150635), (10.925401, -47.552826, -10.925401), (11.482219, -47.552826, -10.338636), (9.617002, -48.29629, -8.659187), (9.617002, -48.29629, -8.659187), (11.482219, -47.552826, -10.338636), (12.0075655, -47.552826, -9.723535), (10.057009, -48.29629, -8.144005), (10.057009, -48.29629, -8.144005), (12.0075655, -47.552826, -9.723535), (12.5, -47.552826, -9.081781), (10.46945, -48.29629, -7.606501), (10.46945, -48.29629, -7.606501), (12.5, -47.552826, -9.081781), (12.958173, -47.552826, -8.415136), (10.853196, -48.29629, -7.0481477), (10.853196, -48.29629, -7.0481477), (12.958173, -47.552826, -8.415136), (13.380828, -47.552826, -7.725425), (11.207193, -48.29629, -6.470476), (11.207193, -48.29629, -6.470476), (13.380828, -47.552826, -7.725425), (13.766808, -47.552826, -7.014539), (11.530473, -48.29629, -5.8750696), (11.530473, -48.29629, -5.8750696), (13.766808, -47.552826, -7.014539), (14.115053, -47.552826, -6.2844267), (11.822148, -48.29629, -5.2635593), (11.822148, -48.29629, -5.2635593), (14.115053, -47.552826, -6.2844267), (14.424611, -47.552826, -5.5370893), (12.08142, -48.29629, -4.6376224), (12.08142, -48.29629, -4.6376224), (14.424611, -47.552826, -5.5370893), (14.694632, -47.552826, -4.774575), (12.307577, -48.29629, -3.998974), (12.307577, -48.29629, -3.998974), (14.694632, -47.552826, -4.774575), (14.924375, -47.552826, -3.998974), (12.5, -48.29629, -3.349365), (12.5, -48.29629, -3.349365), (14.924375, -47.552826, -3.998974), (15.113212, -47.552826, -3.2124124), (12.658161, -48.29629, -2.6905754), (12.658161, -48.29629, -2.6905754), (15.113212, -47.552826, -3.2124124), (15.260624, -47.552826, -2.4170454), (12.781628, -48.29629, -2.024411), (12.781628, -48.29629, -2.024411), (15.260624, -47.552826, -2.4170454), (15.366208, -47.552826, -1.6150535), (12.87006, -48.29629, -1.3526978), (12.87006, -48.29629, -1.3526978), (15.366208, -47.552826, -1.6150535), (15.429675, -47.552826, -0.808635), (12.923217, -48.29629, -0.6772771), (12.923217, -48.29629, -0.6772771), (15.429675, -47.552826, -0.808635), (15.45085, -47.552826, 0), (12.940952, -48.29629, 0), (15.45085, -47.552826, 0), (17.918398, -46.67902, 0), (17.89384, -46.67902, 0.93777645), (15.429675, -47.552826, 0.808635), (15.429675, -47.552826, 0.808635), (17.89384, -46.67902, 0.93777645), (17.820238, -46.67902, 1.8729825), (15.366208, -47.552826, 1.6150535), (15.366208, -47.552826, 1.6150535), (17.820238, -46.67902, 1.8729825), (17.697792, -46.67902, 2.8030548), (15.260624, -47.552826, 2.4170454), (15.260624, -47.552826, 2.4170454), (17.697792, -46.67902, 2.8030548), (17.526838, -46.67902, 3.7254443), (15.113212, -47.552826, 3.2124124), (15.113212, -47.552826, 3.2124124), (17.526838, -46.67902, 3.7254443), (17.307842, -46.67902, 4.6376224), (14.924375, -47.552826, 3.998974), (14.924375, -47.552826, 3.998974), (17.307842, -46.67902, 4.6376224), (17.041409, -46.67902, 5.5370893), (14.694632, -47.552826, 4.774575), (14.694632, -47.552826, 4.774575), (17.041409, -46.67902, 5.5370893), (16.728266, -46.67902, 6.4213796), (14.424611, -47.552826, 5.5370893), (14.424611, -47.552826, 5.5370893), (16.728266, -46.67902, 6.4213796), (16.36927, -46.67902, 7.288069), (14.115053, -47.552826, 6.2844267), (14.115053, -47.552826, 6.2844267), (16.36927, -46.67902, 7.288069), (15.965409, -46.67902, 8.134782), (13.766808, -47.552826, 7.014539), (13.766808, -47.552826, 7.014539), (15.965409, -46.67902, 8.134782), (15.517787, -46.67902, 8.959199), (13.380828, -47.552826, 7.725425), (13.380828, -47.552826, 7.725425), (15.517787, -46.67902, 8.959199), (15.027633, -46.67902, 9.759059), (12.958173, -47.552826, 8.415136), (12.958173, -47.552826, 8.415136), (15.027633, -46.67902, 9.759059), (14.496288, -46.67902, 10.532169), (12.5, -47.552826, 9.081781), (12.5, -47.552826, 9.081781), (14.496288, -46.67902, 10.532169), (13.92521, -46.67902, 11.276413), (12.0075655, -47.552826, 9.723535), (12.0075655, -47.552826, 9.723535), (13.92521, -46.67902, 11.276413), (13.315965, -46.67902, 11.989748), (11.482219, -47.552826, 10.338636), (11.482219, -47.552826, 10.338636), (13.315965, -46.67902, 11.989748), (12.67022, -46.67902, 12.67022), (10.925401, -47.552826, 10.925401), (10.925401, -47.552826, 10.925401), (12.67022, -46.67902, 12.67022), (11.989748, -46.67902, 13.315965), (10.338636, -47.552826, 11.482219), (10.338636, -47.552826, 11.482219), (11.989748, -46.67902, 13.315965), (11.276413, -46.67902, 13.92521), (9.723535, -47.552826, 12.0075655), (9.723535, -47.552826, 12.0075655), (11.276413, -46.67902, 13.92521), (10.532169, -46.67902, 14.496288), (9.081781, -47.552826, 12.5), (9.081781, -47.552826, 12.5), (10.532169, -46.67902, 14.496288), (9.759059, -46.67902, 15.027633), (8.415136, -47.552826, 12.958173), (8.415136, -47.552826, 12.958173), (9.759059, -46.67902, 15.027633), (8.959199, -46.67902, 15.517787), (7.725425, -47.552826, 13.380828), (7.725425, -47.552826, 13.380828), (8.959199, -46.67902, 15.517787), (8.134782, -46.67902, 15.965409), (7.014539, -47.552826, 13.766808), (7.014539, -47.552826, 13.766808), (8.134782, -46.67902, 15.965409), (7.288069, -46.67902, 16.36927), (6.2844267, -47.552826, 14.115053), (6.2844267, -47.552826, 14.115053), (7.288069, -46.67902, 16.36927), (6.4213796, -46.67902, 16.728266), (5.5370893, -47.552826, 14.424611), (5.5370893, -47.552826, 14.424611), (6.4213796, -46.67902, 16.728266), (5.5370893, -46.67902, 17.041409), (4.774575, -47.552826, 14.694632), (4.774575, -47.552826, 14.694632), (5.5370893, -46.67902, 17.041409), (4.6376224, -46.67902, 17.307842), (3.998974, -47.552826, 14.924375), (3.998974, -47.552826, 14.924375), (4.6376224, -46.67902, 17.307842), (3.7254443, -46.67902, 17.526838), (3.2124124, -47.552826, 15.113212), (3.2124124, -47.552826, 15.113212), (3.7254443, -46.67902, 17.526838), (2.8030548, -46.67902, 17.697792), (2.4170454, -47.552826, 15.260624), (2.4170454, -47.552826, 15.260624), (2.8030548, -46.67902, 17.697792), (1.8729825, -46.67902, 17.820238), (1.6150535, -47.552826, 15.366208), (1.6150535, -47.552826, 15.366208), (1.8729825, -46.67902, 17.820238), (0.93777645, -46.67902, 17.89384), (0.808635, -47.552826, 15.429675), (0.808635, -47.552826, 15.429675), (0.93777645, -46.67902, 17.89384), (1.0971854e-15, -46.67902, 17.918398), (9.460917e-16, -47.552826, 15.45085), (9.460917e-16, -47.552826, 15.45085), (1.0971854e-15, -46.67902, 17.918398), (-0.93777645, -46.67902, 17.89384), (-0.808635, -47.552826, 15.429675), (-0.808635, -47.552826, 15.429675), (-0.93777645, -46.67902, 17.89384), (-1.8729825, -46.67902, 17.820238), (-1.6150535, -47.552826, 15.366208), (-1.6150535, -47.552826, 15.366208), (-1.8729825, -46.67902, 17.820238), (-2.8030548, -46.67902, 17.697792), (-2.4170454, -47.552826, 15.260624), (-2.4170454, -47.552826, 15.260624), (-2.8030548, -46.67902, 17.697792), (-3.7254443, -46.67902, 17.526838), (-3.2124124, -47.552826, 15.113212), (-3.2124124, -47.552826, 15.113212), (-3.7254443, -46.67902, 17.526838), (-4.6376224, -46.67902, 17.307842), (-3.998974, -47.552826, 14.924375), (-3.998974, -47.552826, 14.924375), (-4.6376224, -46.67902, 17.307842), (-5.5370893, -46.67902, 17.041409), (-4.774575, -47.552826, 14.694632), (-4.774575, -47.552826, 14.694632), (-5.5370893, -46.67902, 17.041409), (-6.4213796, -46.67902, 16.728266), (-5.5370893, -47.552826, 14.424611), (-5.5370893, -47.552826, 14.424611), (-6.4213796, -46.67902, 16.728266), (-7.288069, -46.67902, 16.36927), (-6.2844267, -47.552826, 14.115053), (-6.2844267, -47.552826, 14.115053), (-7.288069, -46.67902, 16.36927), (-8.134782, -46.67902, 15.965409), (-7.014539, -47.552826, 13.766808), (-7.014539, -47.552826, 13.766808), (-8.134782, -46.67902, 15.965409), (-8.959199, -46.67902, 15.517787), (-7.725425, -47.552826, 13.380828), (-7.725425, -47.552826, 13.380828), (-8.959199, -46.67902, 15.517787), (-9.759059, -46.67902, 15.027633), (-8.415136, -47.552826, 12.958173), (-8.415136, -47.552826, 12.958173), (-9.759059, -46.67902, 15.027633), (-10.532169, -46.67902, 14.496288), (-9.081781, -47.552826, 12.5), (-9.081781, -47.552826, 12.5), (-10.532169, -46.67902, 14.496288), (-11.276413, -46.67902, 13.92521), (-9.723535, -47.552826, 12.0075655), (-9.723535, -47.552826, 12.0075655), (-11.276413, -46.67902, 13.92521), (-11.989748, -46.67902, 13.315965), (-10.338636, -47.552826, 11.482219), (-10.338636, -47.552826, 11.482219), (-11.989748, -46.67902, 13.315965), (-12.67022, -46.67902, 12.67022), (-10.925401, -47.552826, 10.925401), (-10.925401, -47.552826, 10.925401), (-12.67022, -46.67902, 12.67022), (-13.315965, -46.67902, 11.989748), (-11.482219, -47.552826, 10.338636), (-11.482219, -47.552826, 10.338636), (-13.315965, -46.67902, 11.989748), (-13.92521, -46.67902, 11.276413), (-12.0075655, -47.552826, 9.723535), (-12.0075655, -47.552826, 9.723535), (-13.92521, -46.67902, 11.276413), (-14.496288, -46.67902, 10.532169), (-12.5, -47.552826, 9.081781), (-12.5, -47.552826, 9.081781), (-14.496288, -46.67902, 10.532169), (-15.027633, -46.67902, 9.759059), (-12.958173, -47.552826, 8.415136), (-12.958173, -47.552826, 8.415136), (-15.027633, -46.67902, 9.759059), (-15.517787, -46.67902, 8.959199), (-13.380828, -47.552826, 7.725425), (-13.380828, -47.552826, 7.725425), (-15.517787, -46.67902, 8.959199), (-15.965409, -46.67902, 8.134782), (-13.766808, -47.552826, 7.014539), (-13.766808, -47.552826, 7.014539), (-15.965409, -46.67902, 8.134782), (-16.36927, -46.67902, 7.288069), (-14.115053, -47.552826, 6.2844267), (-14.115053, -47.552826, 6.2844267), (-16.36927, -46.67902, 7.288069), (-16.728266, -46.67902, 6.4213796), (-14.424611, -47.552826, 5.5370893), (-14.424611, -47.552826, 5.5370893), (-16.728266, -46.67902, 6.4213796), (-17.041409, -46.67902, 5.5370893), (-14.694632, -47.552826, 4.774575), (-14.694632, -47.552826, 4.774575), (-17.041409, -46.67902, 5.5370893), (-17.307842, -46.67902, 4.6376224), (-14.924375, -47.552826, 3.998974), (-14.924375, -47.552826, 3.998974), (-17.307842, -46.67902, 4.6376224), (-17.526838, -46.67902, 3.7254443), (-15.113212, -47.552826, 3.2124124), (-15.113212, -47.552826, 3.2124124), (-17.526838, -46.67902, 3.7254443), (-17.697792, -46.67902, 2.8030548), (-15.260624, -47.552826, 2.4170454), (-15.260624, -47.552826, 2.4170454), (-17.697792, -46.67902, 2.8030548), (-17.820238, -46.67902, 1.8729825), (-15.366208, -47.552826, 1.6150535), (-15.366208, -47.552826, 1.6150535), (-17.820238, -46.67902, 1.8729825), (-17.89384, -46.67902, 0.93777645), (-15.429675, -47.552826, 0.808635), (-15.429675, -47.552826, 0.808635), (-17.89384, -46.67902, 0.93777645), (-17.918398, -46.67902, 2.1943708e-15), (-15.45085, -47.552826, 1.8921833e-15), (-15.45085, -47.552826, 1.8921833e-15), (-17.918398, -46.67902, 2.1943708e-15), (-17.89384, -46.67902, -0.93777645), (-15.429675, -47.552826, -0.808635), (-15.429675, -47.552826, -0.808635), (-17.89384, -46.67902, -0.93777645), (-17.820238, -46.67902, -1.8729825), (-15.366208, -47.552826, -1.6150535), (-15.366208, -47.552826, -1.6150535), (-17.820238, -46.67902, -1.8729825), (-17.697792, -46.67902, -2.8030548), (-15.260624, -47.552826, -2.4170454), (-15.260624, -47.552826, -2.4170454), (-17.697792, -46.67902, -2.8030548), (-17.526838, -46.67902, -3.7254443), (-15.113212, -47.552826, -3.2124124), (-15.113212, -47.552826, -3.2124124), (-17.526838, -46.67902, -3.7254443), (-17.307842, -46.67902, -4.6376224), (-14.924375, -47.552826, -3.998974), (-14.924375, -47.552826, -3.998974), (-17.307842, -46.67902, -4.6376224), (-17.041409, -46.67902, -5.5370893), (-14.694632, -47.552826, -4.774575), (-14.694632, -47.552826, -4.774575), (-17.041409, -46.67902, -5.5370893), (-16.728266, -46.67902, -6.4213796), (-14.424611, -47.552826, -5.5370893), (-14.424611, -47.552826, -5.5370893), (-16.728266, -46.67902, -6.4213796), (-16.36927, -46.67902, -7.288069), (-14.115053, -47.552826, -6.2844267), (-14.115053, -47.552826, -6.2844267), (-16.36927, -46.67902, -7.288069), (-15.965409, -46.67902, -8.134782), (-13.766808, -47.552826, -7.014539), (-13.766808, -47.552826, -7.014539), (-15.965409, -46.67902, -8.134782), (-15.517787, -46.67902, -8.959199), (-13.380828, -47.552826, -7.725425), (-13.380828, -47.552826, -7.725425), (-15.517787, -46.67902, -8.959199), (-15.027633, -46.67902, -9.759059), (-12.958173, -47.552826, -8.415136), (-12.958173, -47.552826, -8.415136), (-15.027633, -46.67902, -9.759059), (-14.496288, -46.67902, -10.532169), (-12.5, -47.552826, -9.081781), (-12.5, -47.552826, -9.081781), (-14.496288, -46.67902, -10.532169), (-13.92521, -46.67902, -11.276413), (-12.0075655, -47.552826, -9.723535), (-12.0075655, -47.552826, -9.723535), (-13.92521, -46.67902, -11.276413), (-13.315965, -46.67902, -11.989748), (-11.482219, -47.552826, -10.338636), (-11.482219, -47.552826, -10.338636), (-13.315965, -46.67902, -11.989748), (-12.67022, -46.67902, -12.67022), (-10.925401, -47.552826, -10.925401), (-10.925401, -47.552826, -10.925401), (-12.67022, -46.67902, -12.67022), (-11.989748, -46.67902, -13.315965), (-10.338636, -47.552826, -11.482219), (-10.338636, -47.552826, -11.482219), (-11.989748, -46.67902, -13.315965), (-11.276413, -46.67902, -13.92521), (-9.723535, -47.552826, -12.0075655), (-9.723535, -47.552826, -12.0075655), (-11.276413, -46.67902, -13.92521), (-10.532169, -46.67902, -14.496288), (-9.081781, -47.552826, -12.5), (-9.081781, -47.552826, -12.5), (-10.532169, -46.67902, -14.496288), (-9.759059, -46.67902, -15.027633), (-8.415136, -47.552826, -12.958173), (-8.415136, -47.552826, -12.958173), (-9.759059, -46.67902, -15.027633), (-8.959199, -46.67902, -15.517787), (-7.725425, -47.552826, -13.380828), (-7.725425, -47.552826, -13.380828), (-8.959199, -46.67902, -15.517787), (-8.134782, -46.67902, -15.965409), (-7.014539, -47.552826, -13.766808), (-7.014539, -47.552826, -13.766808), (-8.134782, -46.67902, -15.965409), (-7.288069, -46.67902, -16.36927), (-6.2844267, -47.552826, -14.115053), (-6.2844267, -47.552826, -14.115053), (-7.288069, -46.67902, -16.36927), (-6.4213796, -46.67902, -16.728266), (-5.5370893, -47.552826, -14.424611), (-5.5370893, -47.552826, -14.424611), (-6.4213796, -46.67902, -16.728266), (-5.5370893, -46.67902, -17.041409), (-4.774575, -47.552826, -14.694632), (-4.774575, -47.552826, -14.694632), (-5.5370893, -46.67902, -17.041409), (-4.6376224, -46.67902, -17.307842), (-3.998974, -47.552826, -14.924375), (-3.998974, -47.552826, -14.924375), (-4.6376224, -46.67902, -17.307842), (-3.7254443, -46.67902, -17.526838), (-3.2124124, -47.552826, -15.113212), (-3.2124124, -47.552826, -15.113212), (-3.7254443, -46.67902, -17.526838), (-2.8030548, -46.67902, -17.697792), (-2.4170454, -47.552826, -15.260624), (-2.4170454, -47.552826, -15.260624), (-2.8030548, -46.67902, -17.697792), (-1.8729825, -46.67902, -17.820238), (-1.6150535, -47.552826, -15.366208), (-1.6150535, -47.552826, -15.366208), (-1.8729825, -46.67902, -17.820238), (-0.93777645, -46.67902, -17.89384), (-0.808635, -47.552826, -15.429675), (-0.808635, -47.552826, -15.429675), (-0.93777645, -46.67902, -17.89384), (-3.2915563e-15, -46.67902, -17.918398), (-2.838275e-15, -47.552826, -15.45085), (-2.838275e-15, -47.552826, -15.45085), (-3.2915563e-15, -46.67902, -17.918398), (0.93777645, -46.67902, -17.89384), (0.808635, -47.552826, -15.429675), (0.808635, -47.552826, -15.429675), (0.93777645, -46.67902, -17.89384), (1.8729825, -46.67902, -17.820238), (1.6150535, -47.552826, -15.366208), (1.6150535, -47.552826, -15.366208), (1.8729825, -46.67902, -17.820238), (2.8030548, -46.67902, -17.697792), (2.4170454, -47.552826, -15.260624), (2.4170454, -47.552826, -15.260624), (2.8030548, -46.67902, -17.697792), (3.7254443, -46.67902, -17.526838), (3.2124124, -47.552826, -15.113212), (3.2124124, -47.552826, -15.113212), (3.7254443, -46.67902, -17.526838), (4.6376224, -46.67902, -17.307842), (3.998974, -47.552826, -14.924375), (3.998974, -47.552826, -14.924375), (4.6376224, -46.67902, -17.307842), (5.5370893, -46.67902, -17.041409), (4.774575, -47.552826, -14.694632), (4.774575, -47.552826, -14.694632), (5.5370893, -46.67902, -17.041409), (6.4213796, -46.67902, -16.728266), (5.5370893, -47.552826, -14.424611), (5.5370893, -47.552826, -14.424611), (6.4213796, -46.67902, -16.728266), (7.288069, -46.67902, -16.36927), (6.2844267, -47.552826, -14.115053), (6.2844267, -47.552826, -14.115053), (7.288069, -46.67902, -16.36927), (8.134782, -46.67902, -15.965409), (7.014539, -47.552826, -13.766808), (7.014539, -47.552826, -13.766808), (8.134782, -46.67902, -15.965409), (8.959199, -46.67902, -15.517787), (7.725425, -47.552826, -13.380828), (7.725425, -47.552826, -13.380828), (8.959199, -46.67902, -15.517787), (9.759059, -46.67902, -15.027633), (8.415136, -47.552826, -12.958173), (8.415136, -47.552826, -12.958173), (9.759059, -46.67902, -15.027633), (10.532169, -46.67902, -14.496288), (9.081781, -47.552826, -12.5), (9.081781, -47.552826, -12.5), (10.532169, -46.67902, -14.496288), (11.276413, -46.67902, -13.92521), (9.723535, -47.552826, -12.0075655), (9.723535, -47.552826, -12.0075655), (11.276413, -46.67902, -13.92521), (11.989748, -46.67902, -13.315965), (10.338636, -47.552826, -11.482219), (10.338636, -47.552826, -11.482219), (11.989748, -46.67902, -13.315965), (12.67022, -46.67902, -12.67022), (10.925401, -47.552826, -10.925401), (10.925401, -47.552826, -10.925401), (12.67022, -46.67902, -12.67022), (13.315965, -46.67902, -11.989748), (11.482219, -47.552826, -10.338636), (11.482219, -47.552826, -10.338636), (13.315965, -46.67902, -11.989748), (13.92521, -46.67902, -11.276413), (12.0075655, -47.552826, -9.723535), (12.0075655, -47.552826, -9.723535), (13.92521, -46.67902, -11.276413), (14.496288, -46.67902, -10.532169), (12.5, -47.552826, -9.081781), (12.5, -47.552826, -9.081781), (14.496288, -46.67902, -10.532169), (15.027633, -46.67902, -9.759059), (12.958173, -47.552826, -8.415136), (12.958173, -47.552826, -8.415136), (15.027633, -46.67902, -9.759059), (15.517787, -46.67902, -8.959199), (13.380828, -47.552826, -7.725425), (13.380828, -47.552826, -7.725425), (15.517787, -46.67902, -8.959199), (15.965409, -46.67902, -8.134782), (13.766808, -47.552826, -7.014539), (13.766808, -47.552826, -7.014539), (15.965409, -46.67902, -8.134782), (16.36927, -46.67902, -7.288069), (14.115053, -47.552826, -6.2844267), (14.115053, -47.552826, -6.2844267), (16.36927, -46.67902, -7.288069), (16.728266, -46.67902, -6.4213796), (14.424611, -47.552826, -5.5370893), (14.424611, -47.552826, -5.5370893), (16.728266, -46.67902, -6.4213796), (17.041409, -46.67902, -5.5370893), (14.694632, -47.552826, -4.774575), (14.694632, -47.552826, -4.774575), (17.041409, -46.67902, -5.5370893), (17.307842, -46.67902, -4.6376224), (14.924375, -47.552826, -3.998974), (14.924375, -47.552826, -3.998974), (17.307842, -46.67902, -4.6376224), (17.526838, -46.67902, -3.7254443), (15.113212, -47.552826, -3.2124124), (15.113212, -47.552826, -3.2124124), (17.526838, -46.67902, -3.7254443), (17.697792, -46.67902, -2.8030548), (15.260624, -47.552826, -2.4170454), (15.260624, -47.552826, -2.4170454), (17.697792, -46.67902, -2.8030548), (17.820238, -46.67902, -1.8729825), (15.366208, -47.552826, -1.6150535), (15.366208, -47.552826, -1.6150535), (17.820238, -46.67902, -1.8729825), (17.89384, -46.67902, -0.93777645), (15.429675, -47.552826, -0.808635), (15.429675, -47.552826, -0.808635), (17.89384, -46.67902, -0.93777645), (17.918398, -46.67902, 0), (15.45085, -47.552826, 0), (17.918398, -46.67902, 0), (20.336832, -45.677273, 0), (20.308962, -45.677273, 1.0643475), (17.89384, -46.67902, 0.93777645), (17.89384, -46.67902, 0.93777645), (20.308962, -45.677273, 1.0643475), (20.225426, -45.677273, 2.1257777), (17.820238, -46.67902, 1.8729825), (17.820238, -46.67902, 1.8729825), (20.225426, -45.677273, 2.1257777), (20.086452, -45.677273, 3.1813815), (17.697792, -46.67902, 2.8030548), (17.697792, -46.67902, 2.8030548), (20.086452, -45.677273, 3.1813815), (19.892424, -45.677273, 4.2282653), (17.526838, -46.67902, 3.7254443), (17.526838, -46.67902, 3.7254443), (19.892424, -45.677273, 4.2282653), (19.643871, -45.677273, 5.2635593), (17.307842, -46.67902, 4.6376224), (17.307842, -46.67902, 4.6376224), (19.643871, -45.677273, 5.2635593), (19.341476, -45.677273, 6.2844267), (17.041409, -46.67902, 5.5370893), (17.041409, -46.67902, 5.5370893), (19.341476, -45.677273, 6.2844267), (18.986069, -45.677273, 7.288069), (16.728266, -46.67902, 6.4213796), (16.728266, -46.67902, 6.4213796), (18.986069, -45.677273, 7.288069), (18.57862, -45.677273, 8.271735), (16.36927, -46.67902, 7.288069), (16.36927, -46.67902, 7.288069), (18.57862, -45.677273, 8.271735), (18.12025, -45.677273, 9.232729), (15.965409, -46.67902, 8.134782), (15.965409, -46.67902, 8.134782), (18.12025, -45.677273, 9.232729), (17.612213, -45.677273, 10.168416), (15.517787, -46.67902, 8.959199), (15.517787, -46.67902, 8.959199), (17.612213, -45.677273, 10.168416), (17.055902, -45.677273, 11.076233), (15.027633, -46.67902, 9.759059), (15.027633, -46.67902, 9.759059), (17.055902, -45.677273, 11.076233), (16.452843, -45.677273, 11.95369), (14.496288, -46.67902, 10.532169), (14.496288, -46.67902, 10.532169), (16.452843, -45.677273, 11.95369), (15.804687, -45.677273, 12.798383), (13.92521, -46.67902, 11.276413), (13.92521, -46.67902, 11.276413), (15.804687, -45.677273, 12.798383), (15.113212, -45.677273, 13.607997), (13.315965, -46.67902, 11.989748), (13.315965, -46.67902, 11.989748), (15.113212, -45.677273, 13.607997), (14.380312, -45.677273, 14.380312), (12.67022, -46.67902, 12.67022), (12.67022, -46.67902, 12.67022), (14.380312, -45.677273, 14.380312), (13.607997, -45.677273, 15.113212), (11.989748, -46.67902, 13.315965), (11.989748, -46.67902, 13.315965), (13.607997, -45.677273, 15.113212), (12.798383, -45.677273, 15.804687), (11.276413, -46.67902, 13.92521), (11.276413, -46.67902, 13.92521), (12.798383, -45.677273, 15.804687), (11.95369, -45.677273, 16.452843), (10.532169, -46.67902, 14.496288), (10.532169, -46.67902, 14.496288), (11.95369, -45.677273, 16.452843), (11.076233, -45.677273, 17.055902), (9.759059, -46.67902, 15.027633), (9.759059, -46.67902, 15.027633), (11.076233, -45.677273, 17.055902), (10.168416, -45.677273, 17.612213), (8.959199, -46.67902, 15.517787), (8.959199, -46.67902, 15.517787), (10.168416, -45.677273, 17.612213), (9.232729, -45.677273, 18.12025), (8.134782, -46.67902, 15.965409), (8.134782, -46.67902, 15.965409), (9.232729, -45.677273, 18.12025), (8.271735, -45.677273, 18.57862), (7.288069, -46.67902, 16.36927), (7.288069, -46.67902, 16.36927), (8.271735, -45.677273, 18.57862), (7.288069, -45.677273, 18.986069), (6.4213796, -46.67902, 16.728266), (6.4213796, -46.67902, 16.728266), (7.288069, -45.677273, 18.986069), (6.2844267, -45.677273, 19.341476), (5.5370893, -46.67902, 17.041409), (5.5370893, -46.67902, 17.041409), (6.2844267, -45.677273, 19.341476), (5.2635593, -45.677273, 19.643871), (4.6376224, -46.67902, 17.307842), (4.6376224, -46.67902, 17.307842), (5.2635593, -45.677273, 19.643871), (4.2282653, -45.677273, 19.892424), (3.7254443, -46.67902, 17.526838), (3.7254443, -46.67902, 17.526838), (4.2282653, -45.677273, 19.892424), (3.1813815, -45.677273, 20.086452), (2.8030548, -46.67902, 17.697792), (2.8030548, -46.67902, 17.697792), (3.1813815, -45.677273, 20.086452), (2.1257777, -45.677273, 20.225426), (1.8729825, -46.67902, 17.820238), (1.8729825, -46.67902, 17.820238), (2.1257777, -45.677273, 20.225426), (1.0643475, -45.677273, 20.308962), (0.93777645, -46.67902, 17.89384), (0.93777645, -46.67902, 17.89384), (1.0643475, -45.677273, 20.308962), (1.2452718e-15, -45.677273, 20.336832), (1.0971854e-15, -46.67902, 17.918398), (1.0971854e-15, -46.67902, 17.918398), (1.2452718e-15, -45.677273, 20.336832), (-1.0643475, -45.677273, 20.308962), (-0.93777645, -46.67902, 17.89384), (-0.93777645, -46.67902, 17.89384), (-1.0643475, -45.677273, 20.308962), (-2.1257777, -45.677273, 20.225426), (-1.8729825, -46.67902, 17.820238), (-1.8729825, -46.67902, 17.820238), (-2.1257777, -45.677273, 20.225426), (-3.1813815, -45.677273, 20.086452), (-2.8030548, -46.67902, 17.697792), (-2.8030548, -46.67902, 17.697792), (-3.1813815, -45.677273, 20.086452), (-4.2282653, -45.677273, 19.892424), (-3.7254443, -46.67902, 17.526838), (-3.7254443, -46.67902, 17.526838), (-4.2282653, -45.677273, 19.892424), (-5.2635593, -45.677273, 19.643871), (-4.6376224, -46.67902, 17.307842), (-4.6376224, -46.67902, 17.307842), (-5.2635593, -45.677273, 19.643871), (-6.2844267, -45.677273, 19.341476), (-5.5370893, -46.67902, 17.041409), (-5.5370893, -46.67902, 17.041409), (-6.2844267, -45.677273, 19.341476), (-7.288069, -45.677273, 18.986069), (-6.4213796, -46.67902, 16.728266), (-6.4213796, -46.67902, 16.728266), (-7.288069, -45.677273, 18.986069), (-8.271735, -45.677273, 18.57862), (-7.288069, -46.67902, 16.36927), (-7.288069, -46.67902, 16.36927), (-8.271735, -45.677273, 18.57862), (-9.232729, -45.677273, 18.12025), (-8.134782, -46.67902, 15.965409), (-8.134782, -46.67902, 15.965409), (-9.232729, -45.677273, 18.12025), (-10.168416, -45.677273, 17.612213), (-8.959199, -46.67902, 15.517787), (-8.959199, -46.67902, 15.517787), (-10.168416, -45.677273, 17.612213), (-11.076233, -45.677273, 17.055902), (-9.759059, -46.67902, 15.027633), (-9.759059, -46.67902, 15.027633), (-11.076233, -45.677273, 17.055902), (-11.95369, -45.677273, 16.452843), (-10.532169, -46.67902, 14.496288), (-10.532169, -46.67902, 14.496288), (-11.95369, -45.677273, 16.452843), (-12.798383, -45.677273, 15.804687), (-11.276413, -46.67902, 13.92521), (-11.276413, -46.67902, 13.92521), (-12.798383, -45.677273, 15.804687), (-13.607997, -45.677273, 15.113212), (-11.989748, -46.67902, 13.315965), (-11.989748, -46.67902, 13.315965), (-13.607997, -45.677273, 15.113212), (-14.380312, -45.677273, 14.380312), (-12.67022, -46.67902, 12.67022), (-12.67022, -46.67902, 12.67022), (-14.380312, -45.677273, 14.380312), (-15.113212, -45.677273, 13.607997), (-13.315965, -46.67902, 11.989748), (-13.315965, -46.67902, 11.989748), (-15.113212, -45.677273, 13.607997), (-15.804687, -45.677273, 12.798383), (-13.92521, -46.67902, 11.276413), (-13.92521, -46.67902, 11.276413), (-15.804687, -45.677273, 12.798383), (-16.452843, -45.677273, 11.95369), (-14.496288, -46.67902, 10.532169), (-14.496288, -46.67902, 10.532169), (-16.452843, -45.677273, 11.95369), (-17.055902, -45.677273, 11.076233), (-15.027633, -46.67902, 9.759059), (-15.027633, -46.67902, 9.759059), (-17.055902, -45.677273, 11.076233), (-17.612213, -45.677273, 10.168416), (-15.517787, -46.67902, 8.959199), (-15.517787, -46.67902, 8.959199), (-17.612213, -45.677273, 10.168416), (-18.12025, -45.677273, 9.232729), (-15.965409, -46.67902, 8.134782), (-15.965409, -46.67902, 8.134782), (-18.12025, -45.677273, 9.232729), (-18.57862, -45.677273, 8.271735), (-16.36927, -46.67902, 7.288069), (-16.36927, -46.67902, 7.288069), (-18.57862, -45.677273, 8.271735), (-18.986069, -45.677273, 7.288069), (-16.728266, -46.67902, 6.4213796), (-16.728266, -46.67902, 6.4213796), (-18.986069, -45.677273, 7.288069), (-19.341476, -45.677273, 6.2844267), (-17.041409, -46.67902, 5.5370893), (-17.041409, -46.67902, 5.5370893), (-19.341476, -45.677273, 6.2844267), (-19.643871, -45.677273, 5.2635593), (-17.307842, -46.67902, 4.6376224), (-17.307842, -46.67902, 4.6376224), (-19.643871, -45.677273, 5.2635593), (-19.892424, -45.677273, 4.2282653), (-17.526838, -46.67902, 3.7254443), (-17.526838, -46.67902, 3.7254443), (-19.892424, -45.677273, 4.2282653), (-20.086452, -45.677273, 3.1813815), (-17.697792, -46.67902, 2.8030548), (-17.697792, -46.67902, 2.8030548), (-20.086452, -45.677273, 3.1813815), (-20.225426, -45.677273, 2.1257777), (-17.820238, -46.67902, 1.8729825), (-17.820238, -46.67902, 1.8729825), (-20.225426, -45.677273, 2.1257777), (-20.308962, -45.677273, 1.0643475), (-17.89384, -46.67902, 0.93777645), (-17.89384, -46.67902, 0.93777645), (-20.308962, -45.677273, 1.0643475), (-20.336832, -45.677273, 2.4905437e-15), (-17.918398, -46.67902, 2.1943708e-15), (-17.918398, -46.67902, 2.1943708e-15), (-20.336832, -45.677273, 2.4905437e-15), (-20.308962, -45.677273, -1.0643475), (-17.89384, -46.67902, -0.93777645), (-17.89384, -46.67902, -0.93777645), (-20.308962, -45.677273, -1.0643475), (-20.225426, -45.677273, -2.1257777), (-17.820238, -46.67902, -1.8729825), (-17.820238, -46.67902, -1.8729825), (-20.225426, -45.677273, -2.1257777), (-20.086452, -45.677273, -3.1813815), (-17.697792, -46.67902, -2.8030548), (-17.697792, -46.67902, -2.8030548), (-20.086452, -45.677273, -3.1813815), (-19.892424, -45.677273, -4.2282653), (-17.526838, -46.67902, -3.7254443), (-17.526838, -46.67902, -3.7254443), (-19.892424, -45.677273, -4.2282653), (-19.643871, -45.677273, -5.2635593), (-17.307842, -46.67902, -4.6376224), (-17.307842, -46.67902, -4.6376224), (-19.643871, -45.677273, -5.2635593), (-19.341476, -45.677273, -6.2844267), (-17.041409, -46.67902, -5.5370893), (-17.041409, -46.67902, -5.5370893), (-19.341476, -45.677273, -6.2844267), (-18.986069, -45.677273, -7.288069), (-16.728266, -46.67902, -6.4213796), (-16.728266, -46.67902, -6.4213796), (-18.986069, -45.677273, -7.288069), (-18.57862, -45.677273, -8.271735), (-16.36927, -46.67902, -7.288069), (-16.36927, -46.67902, -7.288069), (-18.57862, -45.677273, -8.271735), (-18.12025, -45.677273, -9.232729), (-15.965409, -46.67902, -8.134782), (-15.965409, -46.67902, -8.134782), (-18.12025, -45.677273, -9.232729), (-17.612213, -45.677273, -10.168416), (-15.517787, -46.67902, -8.959199), (-15.517787, -46.67902, -8.959199), (-17.612213, -45.677273, -10.168416), (-17.055902, -45.677273, -11.076233), (-15.027633, -46.67902, -9.759059), (-15.027633, -46.67902, -9.759059), (-17.055902, -45.677273, -11.076233), (-16.452843, -45.677273, -11.95369), (-14.496288, -46.67902, -10.532169), (-14.496288, -46.67902, -10.532169), (-16.452843, -45.677273, -11.95369), (-15.804687, -45.677273, -12.798383), (-13.92521, -46.67902, -11.276413), (-13.92521, -46.67902, -11.276413), (-15.804687, -45.677273, -12.798383), (-15.113212, -45.677273, -13.607997), (-13.315965, -46.67902, -11.989748), (-13.315965, -46.67902, -11.989748), (-15.113212, -45.677273, -13.607997), (-14.380312, -45.677273, -14.380312), (-12.67022, -46.67902, -12.67022), (-12.67022, -46.67902, -12.67022), (-14.380312, -45.677273, -14.380312), (-13.607997, -45.677273, -15.113212), (-11.989748, -46.67902, -13.315965), (-11.989748, -46.67902, -13.315965), (-13.607997, -45.677273, -15.113212), (-12.798383, -45.677273, -15.804687), (-11.276413, -46.67902, -13.92521), (-11.276413, -46.67902, -13.92521), (-12.798383, -45.677273, -15.804687), (-11.95369, -45.677273, -16.452843), (-10.532169, -46.67902, -14.496288), (-10.532169, -46.67902, -14.496288), (-11.95369, -45.677273, -16.452843), (-11.076233, -45.677273, -17.055902), (-9.759059, -46.67902, -15.027633), (-9.759059, -46.67902, -15.027633), (-11.076233, -45.677273, -17.055902), (-10.168416, -45.677273, -17.612213), (-8.959199, -46.67902, -15.517787), (-8.959199, -46.67902, -15.517787), (-10.168416, -45.677273, -17.612213), (-9.232729, -45.677273, -18.12025), (-8.134782, -46.67902, -15.965409), (-8.134782, -46.67902, -15.965409), (-9.232729, -45.677273, -18.12025), (-8.271735, -45.677273, -18.57862), (-7.288069, -46.67902, -16.36927), (-7.288069, -46.67902, -16.36927), (-8.271735, -45.677273, -18.57862), (-7.288069, -45.677273, -18.986069), (-6.4213796, -46.67902, -16.728266), (-6.4213796, -46.67902, -16.728266), (-7.288069, -45.677273, -18.986069), (-6.2844267, -45.677273, -19.341476), (-5.5370893, -46.67902, -17.041409), (-5.5370893, -46.67902, -17.041409), (-6.2844267, -45.677273, -19.341476), (-5.2635593, -45.677273, -19.643871), (-4.6376224, -46.67902, -17.307842), (-4.6376224, -46.67902, -17.307842), (-5.2635593, -45.677273, -19.643871), (-4.2282653, -45.677273, -19.892424), (-3.7254443, -46.67902, -17.526838), (-3.7254443, -46.67902, -17.526838), (-4.2282653, -45.677273, -19.892424), (-3.1813815, -45.677273, -20.086452), (-2.8030548, -46.67902, -17.697792), (-2.8030548, -46.67902, -17.697792), (-3.1813815, -45.677273, -20.086452), (-2.1257777, -45.677273, -20.225426), (-1.8729825, -46.67902, -17.820238), (-1.8729825, -46.67902, -17.820238), (-2.1257777, -45.677273, -20.225426), (-1.0643475, -45.677273, -20.308962), (-0.93777645, -46.67902, -17.89384), (-0.93777645, -46.67902, -17.89384), (-1.0643475, -45.677273, -20.308962), (-3.7358155e-15, -45.677273, -20.336832), (-3.2915563e-15, -46.67902, -17.918398), (-3.2915563e-15, -46.67902, -17.918398), (-3.7358155e-15, -45.677273, -20.336832), (1.0643475, -45.677273, -20.308962), (0.93777645, -46.67902, -17.89384), (0.93777645, -46.67902, -17.89384), (1.0643475, -45.677273, -20.308962), (2.1257777, -45.677273, -20.225426), (1.8729825, -46.67902, -17.820238), (1.8729825, -46.67902, -17.820238), (2.1257777, -45.677273, -20.225426), (3.1813815, -45.677273, -20.086452), (2.8030548, -46.67902, -17.697792), (2.8030548, -46.67902, -17.697792), (3.1813815, -45.677273, -20.086452), (4.2282653, -45.677273, -19.892424), (3.7254443, -46.67902, -17.526838), (3.7254443, -46.67902, -17.526838), (4.2282653, -45.677273, -19.892424), (5.2635593, -45.677273, -19.643871), (4.6376224, -46.67902, -17.307842), (4.6376224, -46.67902, -17.307842), (5.2635593, -45.677273, -19.643871), (6.2844267, -45.677273, -19.341476), (5.5370893, -46.67902, -17.041409), (5.5370893, -46.67902, -17.041409), (6.2844267, -45.677273, -19.341476), (7.288069, -45.677273, -18.986069), (6.4213796, -46.67902, -16.728266), (6.4213796, -46.67902, -16.728266), (7.288069, -45.677273, -18.986069), (8.271735, -45.677273, -18.57862), (7.288069, -46.67902, -16.36927), (7.288069, -46.67902, -16.36927), (8.271735, -45.677273, -18.57862), (9.232729, -45.677273, -18.12025), (8.134782, -46.67902, -15.965409), (8.134782, -46.67902, -15.965409), (9.232729, -45.677273, -18.12025), (10.168416, -45.677273, -17.612213), (8.959199, -46.67902, -15.517787), (8.959199, -46.67902, -15.517787), (10.168416, -45.677273, -17.612213), (11.076233, -45.677273, -17.055902), (9.759059, -46.67902, -15.027633), (9.759059, -46.67902, -15.027633), (11.076233, -45.677273, -17.055902), (11.95369, -45.677273, -16.452843), (10.532169, -46.67902, -14.496288), (10.532169, -46.67902, -14.496288), (11.95369, -45.677273, -16.452843), (12.798383, -45.677273, -15.804687), (11.276413, -46.67902, -13.92521), (11.276413, -46.67902, -13.92521), (12.798383, -45.677273, -15.804687), (13.607997, -45.677273, -15.113212), (11.989748, -46.67902, -13.315965), (11.989748, -46.67902, -13.315965), (13.607997, -45.677273, -15.113212), (14.380312, -45.677273, -14.380312), (12.67022, -46.67902, -12.67022), (12.67022, -46.67902, -12.67022), (14.380312, -45.677273, -14.380312), (15.113212, -45.677273, -13.607997), (13.315965, -46.67902, -11.989748), (13.315965, -46.67902, -11.989748), (15.113212, -45.677273, -13.607997), (15.804687, -45.677273, -12.798383), (13.92521, -46.67902, -11.276413), (13.92521, -46.67902, -11.276413), (15.804687, -45.677273, -12.798383), (16.452843, -45.677273, -11.95369), (14.496288, -46.67902, -10.532169), (14.496288, -46.67902, -10.532169), (16.452843, -45.677273, -11.95369), (17.055902, -45.677273, -11.076233), (15.027633, -46.67902, -9.759059), (15.027633, -46.67902, -9.759059), (17.055902, -45.677273, -11.076233), (17.612213, -45.677273, -10.168416), (15.517787, -46.67902, -8.959199), (15.517787, -46.67902, -8.959199), (17.612213, -45.677273, -10.168416), (18.12025, -45.677273, -9.232729), (15.965409, -46.67902, -8.134782), (15.965409, -46.67902, -8.134782), (18.12025, -45.677273, -9.232729), (18.57862, -45.677273, -8.271735), (16.36927, -46.67902, -7.288069), (16.36927, -46.67902, -7.288069), (18.57862, -45.677273, -8.271735), (18.986069, -45.677273, -7.288069), (16.728266, -46.67902, -6.4213796), (16.728266, -46.67902, -6.4213796), (18.986069, -45.677273, -7.288069), (19.341476, -45.677273, -6.2844267), (17.041409, -46.67902, -5.5370893), (17.041409, -46.67902, -5.5370893), (19.341476, -45.677273, -6.2844267), (19.643871, -45.677273, -5.2635593), (17.307842, -46.67902, -4.6376224), (17.307842, -46.67902, -4.6376224), (19.643871, -45.677273, -5.2635593), (19.892424, -45.677273, -4.2282653), (17.526838, -46.67902, -3.7254443), (17.526838, -46.67902, -3.7254443), (19.892424, -45.677273, -4.2282653), (20.086452, -45.677273, -3.1813815), (17.697792, -46.67902, -2.8030548), (17.697792, -46.67902, -2.8030548), (20.086452, -45.677273, -3.1813815), (20.225426, -45.677273, -2.1257777), (17.820238, -46.67902, -1.8729825), (17.820238, -46.67902, -1.8729825), (20.225426, -45.677273, -2.1257777), (20.308962, -45.677273, -1.0643475), (17.89384, -46.67902, -0.93777645), (17.89384, -46.67902, -0.93777645), (20.308962, -45.677273, -1.0643475), (20.336832, -45.677273, 0), (17.918398, -46.67902, 0), (20.336832, -45.677273, 0), (22.699526, -44.550327, 0), (22.668417, -44.550327, 1.1880014), (20.308962, -45.677273, 1.0643475), (20.308962, -45.677273, 1.0643475), (22.668417, -44.550327, 1.1880014), (22.575174, -44.550327, 2.3727465), (20.225426, -45.677273, 2.1257777), (20.225426, -45.677273, 2.1257777), (22.575174, -44.550327, 2.3727465), (22.420055, -44.550327, 3.550988), (20.086452, -45.677273, 3.1813815), (20.086452, -45.677273, 3.1813815), (22.420055, -44.550327, 3.550988), (22.203485, -44.550327, 4.7194967), (19.892424, -45.677273, 4.2282653), (19.892424, -45.677273, 4.2282653), (22.203485, -44.550327, 4.7194967), (21.926058, -44.550327, 5.8750696), (19.643871, -45.677273, 5.2635593), (19.643871, -45.677273, 5.2635593), (21.926058, -44.550327, 5.8750696), (21.588531, -44.550327, 7.014539), (19.341476, -45.677273, 6.2844267), (19.341476, -45.677273, 6.2844267), (21.588531, -44.550327, 7.014539), (21.191832, -44.550327, 8.134782), (18.986069, -45.677273, 7.288069), (18.986069, -45.677273, 7.288069), (21.191832, -44.550327, 8.134782), (20.737047, -44.550327, 9.232729), (18.57862, -45.677273, 8.271735), (18.57862, -45.677273, 8.271735), (20.737047, -44.550327, 9.232729), (20.225426, -44.550327, 10.305368), (18.12025, -45.677273, 9.232729), (18.12025, -45.677273, 9.232729), (20.225426, -44.550327, 10.305368), (19.658365, -44.550327, 11.349763), (17.612213, -45.677273, 10.168416), (17.612213, -45.677273, 10.168416), (19.658365, -44.550327, 11.349763), (19.037424, -44.550327, 12.363048), (17.055902, -45.677273, 11.076233), (17.055902, -45.677273, 11.076233), (19.037424, -44.550327, 12.363048), (18.364302, -44.550327, 13.342446), (16.452843, -45.677273, 11.95369), (16.452843, -45.677273, 11.95369), (18.364302, -44.550327, 13.342446), (17.640844, -44.550327, 14.285274), (15.804687, -45.677273, 12.798383), (15.804687, -45.677273, 12.798383), (17.640844, -44.550327, 14.285274), (16.869034, -44.550327, 15.188947), (15.113212, -45.677273, 13.607997), (15.113212, -45.677273, 13.607997), (16.869034, -44.550327, 15.188947), (16.050987, -44.550327, 16.050987), (14.380312, -45.677273, 14.380312), (14.380312, -45.677273, 14.380312), (16.050987, -44.550327, 16.050987), (15.188947, -44.550327, 16.869034), (13.607997, -45.677273, 15.113212), (13.607997, -45.677273, 15.113212), (15.188947, -44.550327, 16.869034), (14.285274, -44.550327, 17.640844), (12.798383, -45.677273, 15.804687), (12.798383, -45.677273, 15.804687), (14.285274, -44.550327, 17.640844), (13.342446, -44.550327, 18.364302), (11.95369, -45.677273, 16.452843), (11.95369, -45.677273, 16.452843), (13.342446, -44.550327, 18.364302), (12.363048, -44.550327, 19.037424), (11.076233, -45.677273, 17.055902), (11.076233, -45.677273, 17.055902), (12.363048, -44.550327, 19.037424), (11.349763, -44.550327, 19.658365), (10.168416, -45.677273, 17.612213), (10.168416, -45.677273, 17.612213), (11.349763, -44.550327, 19.658365), (10.305368, -44.550327, 20.225426), (9.232729, -45.677273, 18.12025), (9.232729, -45.677273, 18.12025), (10.305368, -44.550327, 20.225426), (9.232729, -44.550327, 20.737047), (8.271735, -45.677273, 18.57862), (8.271735, -45.677273, 18.57862), (9.232729, -44.550327, 20.737047), (8.134782, -44.550327, 21.191832), (7.288069, -45.677273, 18.986069), (7.288069, -45.677273, 18.986069), (8.134782, -44.550327, 21.191832), (7.014539, -44.550327, 21.588531), (6.2844267, -45.677273, 19.341476), (6.2844267, -45.677273, 19.341476), (7.014539, -44.550327, 21.588531), (5.8750696, -44.550327, 21.926058), (5.2635593, -45.677273, 19.643871), (5.2635593, -45.677273, 19.643871), (5.8750696, -44.550327, 21.926058), (4.7194967, -44.550327, 22.203485), (4.2282653, -45.677273, 19.892424), (4.2282653, -45.677273, 19.892424), (4.7194967, -44.550327, 22.203485), (3.550988, -44.550327, 22.420055), (3.1813815, -45.677273, 20.086452), (3.1813815, -45.677273, 20.086452), (3.550988, -44.550327, 22.420055), (2.3727465, -44.550327, 22.575174), (2.1257777, -45.677273, 20.225426), (2.1257777, -45.677273, 20.225426), (2.3727465, -44.550327, 22.575174), (1.1880014, -44.550327, 22.668417), (1.0643475, -45.677273, 20.308962), (1.0643475, -45.677273, 20.308962), (1.1880014, -44.550327, 22.668417), (1.3899451e-15, -44.550327, 22.699526), (1.2452718e-15, -45.677273, 20.336832), (1.2452718e-15, -45.677273, 20.336832), (1.3899451e-15, -44.550327, 22.699526), (-1.1880014, -44.550327, 22.668417), (-1.0643475, -45.677273, 20.308962), (-1.0643475, -45.677273, 20.308962), (-1.1880014, -44.550327, 22.668417), (-2.3727465, -44.550327, 22.575174), (-2.1257777, -45.677273, 20.225426), (-2.1257777, -45.677273, 20.225426), (-2.3727465, -44.550327, 22.575174), (-3.550988, -44.550327, 22.420055), (-3.1813815, -45.677273, 20.086452), (-3.1813815, -45.677273, 20.086452), (-3.550988, -44.550327, 22.420055), (-4.7194967, -44.550327, 22.203485), (-4.2282653, -45.677273, 19.892424), (-4.2282653, -45.677273, 19.892424), (-4.7194967, -44.550327, 22.203485), (-5.8750696, -44.550327, 21.926058), (-5.2635593, -45.677273, 19.643871), (-5.2635593, -45.677273, 19.643871), (-5.8750696, -44.550327, 21.926058), (-7.014539, -44.550327, 21.588531), (-6.2844267, -45.677273, 19.341476), (-6.2844267, -45.677273, 19.341476), (-7.014539, -44.550327, 21.588531), (-8.134782, -44.550327, 21.191832), (-7.288069, -45.677273, 18.986069), (-7.288069, -45.677273, 18.986069), (-8.134782, -44.550327, 21.191832), (-9.232729, -44.550327, 20.737047), (-8.271735, -45.677273, 18.57862), (-8.271735, -45.677273, 18.57862), (-9.232729, -44.550327, 20.737047), (-10.305368, -44.550327, 20.225426), (-9.232729, -45.677273, 18.12025), (-9.232729, -45.677273, 18.12025), (-10.305368, -44.550327, 20.225426), (-11.349763, -44.550327, 19.658365), (-10.168416, -45.677273, 17.612213), (-10.168416, -45.677273, 17.612213), (-11.349763, -44.550327, 19.658365), (-12.363048, -44.550327, 19.037424), (-11.076233, -45.677273, 17.055902), (-11.076233, -45.677273, 17.055902), (-12.363048, -44.550327, 19.037424), (-13.342446, -44.550327, 18.364302), (-11.95369, -45.677273, 16.452843), (-11.95369, -45.677273, 16.452843), (-13.342446, -44.550327, 18.364302), (-14.285274, -44.550327, 17.640844), (-12.798383, -45.677273, 15.804687), (-12.798383, -45.677273, 15.804687), (-14.285274, -44.550327, 17.640844), (-15.188947, -44.550327, 16.869034), (-13.607997, -45.677273, 15.113212), (-13.607997, -45.677273, 15.113212), (-15.188947, -44.550327, 16.869034), (-16.050987, -44.550327, 16.050987), (-14.380312, -45.677273, 14.380312), (-14.380312, -45.677273, 14.380312), (-16.050987, -44.550327, 16.050987), (-16.869034, -44.550327, 15.188947), (-15.113212, -45.677273, 13.607997), (-15.113212, -45.677273, 13.607997), (-16.869034, -44.550327, 15.188947), (-17.640844, -44.550327, 14.285274), (-15.804687, -45.677273, 12.798383), (-15.804687, -45.677273, 12.798383), (-17.640844, -44.550327, 14.285274), (-18.364302, -44.550327, 13.342446), (-16.452843, -45.677273, 11.95369), (-16.452843, -45.677273, 11.95369), (-18.364302, -44.550327, 13.342446), (-19.037424, -44.550327, 12.363048), (-17.055902, -45.677273, 11.076233), (-17.055902, -45.677273, 11.076233), (-19.037424, -44.550327, 12.363048), (-19.658365, -44.550327, 11.349763), (-17.612213, -45.677273, 10.168416), (-17.612213, -45.677273, 10.168416), (-19.658365, -44.550327, 11.349763), (-20.225426, -44.550327, 10.305368), (-18.12025, -45.677273, 9.232729), (-18.12025, -45.677273, 9.232729), (-20.225426, -44.550327, 10.305368), (-20.737047, -44.550327, 9.232729), (-18.57862, -45.677273, 8.271735), (-18.57862, -45.677273, 8.271735), (-20.737047, -44.550327, 9.232729), (-21.191832, -44.550327, 8.134782), (-18.986069, -45.677273, 7.288069), (-18.986069, -45.677273, 7.288069), (-21.191832, -44.550327, 8.134782), (-21.588531, -44.550327, 7.014539), (-19.341476, -45.677273, 6.2844267), (-19.341476, -45.677273, 6.2844267), (-21.588531, -44.550327, 7.014539), (-21.926058, -44.550327, 5.8750696), (-19.643871, -45.677273, 5.2635593), (-19.643871, -45.677273, 5.2635593), (-21.926058, -44.550327, 5.8750696), (-22.203485, -44.550327, 4.7194967), (-19.892424, -45.677273, 4.2282653), (-19.892424, -45.677273, 4.2282653), (-22.203485, -44.550327, 4.7194967), (-22.420055, -44.550327, 3.550988), (-20.086452, -45.677273, 3.1813815), (-20.086452, -45.677273, 3.1813815), (-22.420055, -44.550327, 3.550988), (-22.575174, -44.550327, 2.3727465), (-20.225426, -45.677273, 2.1257777), (-20.225426, -45.677273, 2.1257777), (-22.575174, -44.550327, 2.3727465), (-22.668417, -44.550327, 1.1880014), (-20.308962, -45.677273, 1.0643475), (-20.308962, -45.677273, 1.0643475), (-22.668417, -44.550327, 1.1880014), (-22.699526, -44.550327, 2.7798901e-15), (-20.336832, -45.677273, 2.4905437e-15), (-20.336832, -45.677273, 2.4905437e-15), (-22.699526, -44.550327, 2.7798901e-15), (-22.668417, -44.550327, -1.1880014), (-20.308962, -45.677273, -1.0643475), (-20.308962, -45.677273, -1.0643475), (-22.668417, -44.550327, -1.1880014), (-22.575174, -44.550327, -2.3727465), (-20.225426, -45.677273, -2.1257777), (-20.225426, -45.677273, -2.1257777), (-22.575174, -44.550327, -2.3727465), (-22.420055, -44.550327, -3.550988), (-20.086452, -45.677273, -3.1813815), (-20.086452, -45.677273, -3.1813815), (-22.420055, -44.550327, -3.550988), (-22.203485, -44.550327, -4.7194967), (-19.892424, -45.677273, -4.2282653), (-19.892424, -45.677273, -4.2282653), (-22.203485, -44.550327, -4.7194967), (-21.926058, -44.550327, -5.8750696), (-19.643871, -45.677273, -5.2635593), (-19.643871, -45.677273, -5.2635593), (-21.926058, -44.550327, -5.8750696), (-21.588531, -44.550327, -7.014539), (-19.341476, -45.677273, -6.2844267), (-19.341476, -45.677273, -6.2844267), (-21.588531, -44.550327, -7.014539), (-21.191832, -44.550327, -8.134782), (-18.986069, -45.677273, -7.288069), (-18.986069, -45.677273, -7.288069), (-21.191832, -44.550327, -8.134782), (-20.737047, -44.550327, -9.232729), (-18.57862, -45.677273, -8.271735), (-18.57862, -45.677273, -8.271735), (-20.737047, -44.550327, -9.232729), (-20.225426, -44.550327, -10.305368), (-18.12025, -45.677273, -9.232729), (-18.12025, -45.677273, -9.232729), (-20.225426, -44.550327, -10.305368), (-19.658365, -44.550327, -11.349763), (-17.612213, -45.677273, -10.168416), (-17.612213, -45.677273, -10.168416), (-19.658365, -44.550327, -11.349763), (-19.037424, -44.550327, -12.363048), (-17.055902, -45.677273, -11.076233), (-17.055902, -45.677273, -11.076233), (-19.037424, -44.550327, -12.363048), (-18.364302, -44.550327, -13.342446), (-16.452843, -45.677273, -11.95369), (-16.452843, -45.677273, -11.95369), (-18.364302, -44.550327, -13.342446), (-17.640844, -44.550327, -14.285274), (-15.804687, -45.677273, -12.798383), (-15.804687, -45.677273, -12.798383), (-17.640844, -44.550327, -14.285274), (-16.869034, -44.550327, -15.188947), (-15.113212, -45.677273, -13.607997), (-15.113212, -45.677273, -13.607997), (-16.869034, -44.550327, -15.188947), (-16.050987, -44.550327, -16.050987), (-14.380312, -45.677273, -14.380312), (-14.380312, -45.677273, -14.380312), (-16.050987, -44.550327, -16.050987), (-15.188947, -44.550327, -16.869034), (-13.607997, -45.677273, -15.113212), (-13.607997, -45.677273, -15.113212), (-15.188947, -44.550327, -16.869034), (-14.285274, -44.550327, -17.640844), (-12.798383, -45.677273, -15.804687), (-12.798383, -45.677273, -15.804687), (-14.285274, -44.550327, -17.640844), (-13.342446, -44.550327, -18.364302), (-11.95369, -45.677273, -16.452843), (-11.95369, -45.677273, -16.452843), (-13.342446, -44.550327, -18.364302), (-12.363048, -44.550327, -19.037424), (-11.076233, -45.677273, -17.055902), (-11.076233, -45.677273, -17.055902), (-12.363048, -44.550327, -19.037424), (-11.349763, -44.550327, -19.658365), (-10.168416, -45.677273, -17.612213), (-10.168416, -45.677273, -17.612213), (-11.349763, -44.550327, -19.658365), (-10.305368, -44.550327, -20.225426), (-9.232729, -45.677273, -18.12025), (-9.232729, -45.677273, -18.12025), (-10.305368, -44.550327, -20.225426), (-9.232729, -44.550327, -20.737047), (-8.271735, -45.677273, -18.57862), (-8.271735, -45.677273, -18.57862), (-9.232729, -44.550327, -20.737047), (-8.134782, -44.550327, -21.191832), (-7.288069, -45.677273, -18.986069), (-7.288069, -45.677273, -18.986069), (-8.134782, -44.550327, -21.191832), (-7.014539, -44.550327, -21.588531), (-6.2844267, -45.677273, -19.341476), (-6.2844267, -45.677273, -19.341476), (-7.014539, -44.550327, -21.588531), (-5.8750696, -44.550327, -21.926058), (-5.2635593, -45.677273, -19.643871), (-5.2635593, -45.677273, -19.643871), (-5.8750696, -44.550327, -21.926058), (-4.7194967, -44.550327, -22.203485), (-4.2282653, -45.677273, -19.892424), (-4.2282653, -45.677273, -19.892424), (-4.7194967, -44.550327, -22.203485), (-3.550988, -44.550327, -22.420055), (-3.1813815, -45.677273, -20.086452), (-3.1813815, -45.677273, -20.086452), (-3.550988, -44.550327, -22.420055), (-2.3727465, -44.550327, -22.575174), (-2.1257777, -45.677273, -20.225426), (-2.1257777, -45.677273, -20.225426), (-2.3727465, -44.550327, -22.575174), (-1.1880014, -44.550327, -22.668417), (-1.0643475, -45.677273, -20.308962), (-1.0643475, -45.677273, -20.308962), (-1.1880014, -44.550327, -22.668417), (-4.169835e-15, -44.550327, -22.699526), (-3.7358155e-15, -45.677273, -20.336832), (-3.7358155e-15, -45.677273, -20.336832), (-4.169835e-15, -44.550327, -22.699526), (1.1880014, -44.550327, -22.668417), (1.0643475, -45.677273, -20.308962), (1.0643475, -45.677273, -20.308962), (1.1880014, -44.550327, -22.668417), (2.3727465, -44.550327, -22.575174), (2.1257777, -45.677273, -20.225426), (2.1257777, -45.677273, -20.225426), (2.3727465, -44.550327, -22.575174), (3.550988, -44.550327, -22.420055), (3.1813815, -45.677273, -20.086452), (3.1813815, -45.677273, -20.086452), (3.550988, -44.550327, -22.420055), (4.7194967, -44.550327, -22.203485), (4.2282653, -45.677273, -19.892424), (4.2282653, -45.677273, -19.892424), (4.7194967, -44.550327, -22.203485), (5.8750696, -44.550327, -21.926058), (5.2635593, -45.677273, -19.643871), (5.2635593, -45.677273, -19.643871), (5.8750696, -44.550327, -21.926058), (7.014539, -44.550327, -21.588531), (6.2844267, -45.677273, -19.341476), (6.2844267, -45.677273, -19.341476), (7.014539, -44.550327, -21.588531), (8.134782, -44.550327, -21.191832), (7.288069, -45.677273, -18.986069), (7.288069, -45.677273, -18.986069), (8.134782, -44.550327, -21.191832), (9.232729, -44.550327, -20.737047), (8.271735, -45.677273, -18.57862), (8.271735, -45.677273, -18.57862), (9.232729, -44.550327, -20.737047), (10.305368, -44.550327, -20.225426), (9.232729, -45.677273, -18.12025), (9.232729, -45.677273, -18.12025), (10.305368, -44.550327, -20.225426), (11.349763, -44.550327, -19.658365), (10.168416, -45.677273, -17.612213), (10.168416, -45.677273, -17.612213), (11.349763, -44.550327, -19.658365), (12.363048, -44.550327, -19.037424), (11.076233, -45.677273, -17.055902), (11.076233, -45.677273, -17.055902), (12.363048, -44.550327, -19.037424), (13.342446, -44.550327, -18.364302), (11.95369, -45.677273, -16.452843), (11.95369, -45.677273, -16.452843), (13.342446, -44.550327, -18.364302), (14.285274, -44.550327, -17.640844), (12.798383, -45.677273, -15.804687), (12.798383, -45.677273, -15.804687), (14.285274, -44.550327, -17.640844), (15.188947, -44.550327, -16.869034), (13.607997, -45.677273, -15.113212), (13.607997, -45.677273, -15.113212), (15.188947, -44.550327, -16.869034), (16.050987, -44.550327, -16.050987), (14.380312, -45.677273, -14.380312), (14.380312, -45.677273, -14.380312), (16.050987, -44.550327, -16.050987), (16.869034, -44.550327, -15.188947), (15.113212, -45.677273, -13.607997), (15.113212, -45.677273, -13.607997), (16.869034, -44.550327, -15.188947), (17.640844, -44.550327, -14.285274), (15.804687, -45.677273, -12.798383), (15.804687, -45.677273, -12.798383), (17.640844, -44.550327, -14.285274), (18.364302, -44.550327, -13.342446), (16.452843, -45.677273, -11.95369), (16.452843, -45.677273, -11.95369), (18.364302, -44.550327, -13.342446), (19.037424, -44.550327, -12.363048), (17.055902, -45.677273, -11.076233), (17.055902, -45.677273, -11.076233), (19.037424, -44.550327, -12.363048), (19.658365, -44.550327, -11.349763), (17.612213, -45.677273, -10.168416), (17.612213, -45.677273, -10.168416), (19.658365, -44.550327, -11.349763), (20.225426, -44.550327, -10.305368), (18.12025, -45.677273, -9.232729), (18.12025, -45.677273, -9.232729), (20.225426, -44.550327, -10.305368), (20.737047, -44.550327, -9.232729), (18.57862, -45.677273, -8.271735), (18.57862, -45.677273, -8.271735), (20.737047, -44.550327, -9.232729), (21.191832, -44.550327, -8.134782), (18.986069, -45.677273, -7.288069), (18.986069, -45.677273, -7.288069), (21.191832, -44.550327, -8.134782), (21.588531, -44.550327, -7.014539), (19.341476, -45.677273, -6.2844267), (19.341476, -45.677273, -6.2844267), (21.588531, -44.550327, -7.014539), (21.926058, -44.550327, -5.8750696), (19.643871, -45.677273, -5.2635593), (19.643871, -45.677273, -5.2635593), (21.926058, -44.550327, -5.8750696), (22.203485, -44.550327, -4.7194967), (19.892424, -45.677273, -4.2282653), (19.892424, -45.677273, -4.2282653), (22.203485, -44.550327, -4.7194967), (22.420055, -44.550327, -3.550988), (20.086452, -45.677273, -3.1813815), (20.086452, -45.677273, -3.1813815), (22.420055, -44.550327, -3.550988), (22.575174, -44.550327, -2.3727465), (20.225426, -45.677273, -2.1257777), (20.225426, -45.677273, -2.1257777), (22.575174, -44.550327, -2.3727465), (22.668417, -44.550327, -1.1880014), (20.308962, -45.677273, -1.0643475), (20.308962, -45.677273, -1.0643475), (22.668417, -44.550327, -1.1880014), (22.699526, -44.550327, 0), (20.336832, -45.677273, 0), (22.699526, -44.550327, 0), (25, -43.30127, 0), (24.965738, -43.30127, 1.308399), (22.668417, -44.550327, 1.1880014), (22.668417, -44.550327, 1.1880014), (24.965738, -43.30127, 1.308399), (24.863047, -43.30127, 2.6132116), (22.575174, -44.550327, 2.3727465), (22.575174, -44.550327, 2.3727465), (24.863047, -43.30127, 2.6132116), (24.69221, -43.30127, 3.9108617), (22.420055, -44.550327, 3.550988), (22.420055, -44.550327, 3.550988), (24.69221, -43.30127, 3.9108617), (24.45369, -43.30127, 5.197792), (22.203485, -44.550327, 4.7194967), (22.203485, -44.550327, 4.7194967), (24.45369, -43.30127, 5.197792), (24.148146, -43.30127, 6.470476), (21.926058, -44.550327, 5.8750696), (21.926058, -44.550327, 5.8750696), (24.148146, -43.30127, 6.470476), (23.776413, -43.30127, 7.725425), (21.588531, -44.550327, 7.014539), (21.588531, -44.550327, 7.014539), (23.776413, -43.30127, 7.725425), (23.33951, -43.30127, 8.959199), (21.191832, -44.550327, 8.134782), (21.191832, -44.550327, 8.134782), (23.33951, -43.30127, 8.959199), (22.838636, -43.30127, 10.168416), (20.737047, -44.550327, 9.232729), (20.737047, -44.550327, 9.232729), (22.838636, -43.30127, 10.168416), (22.275164, -43.30127, 11.349763), (20.225426, -44.550327, 10.305368), (20.225426, -44.550327, 10.305368), (22.275164, -43.30127, 11.349763), (21.650635, -43.30127, 12.5), (19.658365, -44.550327, 11.349763), (19.658365, -44.550327, 11.349763), (21.650635, -43.30127, 12.5), (20.966764, -43.30127, 13.615976), (19.037424, -44.550327, 12.363048), (19.037424, -44.550327, 12.363048), (20.966764, -43.30127, 13.615976), (20.225426, -43.30127, 14.694632), (18.364302, -44.550327, 13.342446), (18.364302, -44.550327, 13.342446), (20.225426, -43.30127, 14.694632), (19.42865, -43.30127, 15.733009), (17.640844, -44.550327, 14.285274), (17.640844, -44.550327, 14.285274), (19.42865, -43.30127, 15.733009), (18.57862, -43.30127, 16.728266), (16.869034, -44.550327, 15.188947), (16.869034, -44.550327, 15.188947), (18.57862, -43.30127, 16.728266), (17.67767, -43.30127, 17.67767), (16.050987, -44.550327, 16.050987), (16.050987, -44.550327, 16.050987), (17.67767, -43.30127, 17.67767), (16.728266, -43.30127, 18.57862), (15.188947, -44.550327, 16.869034), (15.188947, -44.550327, 16.869034), (16.728266, -43.30127, 18.57862), (15.733009, -43.30127, 19.42865), (14.285274, -44.550327, 17.640844), (14.285274, -44.550327, 17.640844), (15.733009, -43.30127, 19.42865), (14.694632, -43.30127, 20.225426), (13.342446, -44.550327, 18.364302), (13.342446, -44.550327, 18.364302), (14.694632, -43.30127, 20.225426), (13.615976, -43.30127, 20.966764), (12.363048, -44.550327, 19.037424), (12.363048, -44.550327, 19.037424), (13.615976, -43.30127, 20.966764), (12.5, -43.30127, 21.650635), (11.349763, -44.550327, 19.658365), (11.349763, -44.550327, 19.658365), (12.5, -43.30127, 21.650635), (11.349763, -43.30127, 22.275164), (10.305368, -44.550327, 20.225426), (10.305368, -44.550327, 20.225426), (11.349763, -43.30127, 22.275164), (10.168416, -43.30127, 22.838636), (9.232729, -44.550327, 20.737047), (9.232729, -44.550327, 20.737047), (10.168416, -43.30127, 22.838636), (8.959199, -43.30127, 23.33951), (8.134782, -44.550327, 21.191832), (8.134782, -44.550327, 21.191832), (8.959199, -43.30127, 23.33951), (7.725425, -43.30127, 23.776413), (7.014539, -44.550327, 21.588531), (7.014539, -44.550327, 21.588531), (7.725425, -43.30127, 23.776413), (6.470476, -43.30127, 24.148146), (5.8750696, -44.550327, 21.926058), (5.8750696, -44.550327, 21.926058), (6.470476, -43.30127, 24.148146), (5.197792, -43.30127, 24.45369), (4.7194967, -44.550327, 22.203485), (4.7194967, -44.550327, 22.203485), (5.197792, -43.30127, 24.45369), (3.9108617, -43.30127, 24.69221), (3.550988, -44.550327, 22.420055), (3.550988, -44.550327, 22.420055), (3.9108617, -43.30127, 24.69221), (2.6132116, -43.30127, 24.863047), (2.3727465, -44.550327, 22.575174), (2.3727465, -44.550327, 22.575174), (2.6132116, -43.30127, 24.863047), (1.308399, -43.30127, 24.965738), (1.1880014, -44.550327, 22.668417), (1.1880014, -44.550327, 22.668417), (1.308399, -43.30127, 24.965738), (1.5308084e-15, -43.30127, 25), (1.3899451e-15, -44.550327, 22.699526), (1.3899451e-15, -44.550327, 22.699526), (1.5308084e-15, -43.30127, 25), (-1.308399, -43.30127, 24.965738), (-1.1880014, -44.550327, 22.668417), (-1.1880014, -44.550327, 22.668417), (-1.308399, -43.30127, 24.965738), (-2.6132116, -43.30127, 24.863047), (-2.3727465, -44.550327, 22.575174), (-2.3727465, -44.550327, 22.575174), (-2.6132116, -43.30127, 24.863047), (-3.9108617, -43.30127, 24.69221), (-3.550988, -44.550327, 22.420055), (-3.550988, -44.550327, 22.420055), (-3.9108617, -43.30127, 24.69221), (-5.197792, -43.30127, 24.45369), (-4.7194967, -44.550327, 22.203485), (-4.7194967, -44.550327, 22.203485), (-5.197792, -43.30127, 24.45369), (-6.470476, -43.30127, 24.148146), (-5.8750696, -44.550327, 21.926058), (-5.8750696, -44.550327, 21.926058), (-6.470476, -43.30127, 24.148146), (-7.725425, -43.30127, 23.776413), (-7.014539, -44.550327, 21.588531), (-7.014539, -44.550327, 21.588531), (-7.725425, -43.30127, 23.776413), (-8.959199, -43.30127, 23.33951), (-8.134782, -44.550327, 21.191832), (-8.134782, -44.550327, 21.191832), (-8.959199, -43.30127, 23.33951), (-10.168416, -43.30127, 22.838636), (-9.232729, -44.550327, 20.737047), (-9.232729, -44.550327, 20.737047), (-10.168416, -43.30127, 22.838636), (-11.349763, -43.30127, 22.275164), (-10.305368, -44.550327, 20.225426), (-10.305368, -44.550327, 20.225426), (-11.349763, -43.30127, 22.275164), (-12.5, -43.30127, 21.650635), (-11.349763, -44.550327, 19.658365), (-11.349763, -44.550327, 19.658365), (-12.5, -43.30127, 21.650635), (-13.615976, -43.30127, 20.966764), (-12.363048, -44.550327, 19.037424), (-12.363048, -44.550327, 19.037424), (-13.615976, -43.30127, 20.966764), (-14.694632, -43.30127, 20.225426), (-13.342446, -44.550327, 18.364302), (-13.342446, -44.550327, 18.364302), (-14.694632, -43.30127, 20.225426), (-15.733009, -43.30127, 19.42865), (-14.285274, -44.550327, 17.640844), (-14.285274, -44.550327, 17.640844), (-15.733009, -43.30127, 19.42865), (-16.728266, -43.30127, 18.57862), (-15.188947, -44.550327, 16.869034), (-15.188947, -44.550327, 16.869034), (-16.728266, -43.30127, 18.57862), (-17.67767, -43.30127, 17.67767), (-16.050987, -44.550327, 16.050987), (-16.050987, -44.550327, 16.050987), (-17.67767, -43.30127, 17.67767), (-18.57862, -43.30127, 16.728266), (-16.869034, -44.550327, 15.188947), (-16.869034, -44.550327, 15.188947), (-18.57862, -43.30127, 16.728266), (-19.42865, -43.30127, 15.733009), (-17.640844, -44.550327, 14.285274), (-17.640844, -44.550327, 14.285274), (-19.42865, -43.30127, 15.733009), (-20.225426, -43.30127, 14.694632), (-18.364302, -44.550327, 13.342446), (-18.364302, -44.550327, 13.342446), (-20.225426, -43.30127, 14.694632), (-20.966764, -43.30127, 13.615976), (-19.037424, -44.550327, 12.363048), (-19.037424, -44.550327, 12.363048), (-20.966764, -43.30127, 13.615976), (-21.650635, -43.30127, 12.5), (-19.658365, -44.550327, 11.349763), (-19.658365, -44.550327, 11.349763), (-21.650635, -43.30127, 12.5), (-22.275164, -43.30127, 11.349763), (-20.225426, -44.550327, 10.305368), (-20.225426, -44.550327, 10.305368), (-22.275164, -43.30127, 11.349763), (-22.838636, -43.30127, 10.168416), (-20.737047, -44.550327, 9.232729), (-20.737047, -44.550327, 9.232729), (-22.838636, -43.30127, 10.168416), (-23.33951, -43.30127, 8.959199), (-21.191832, -44.550327, 8.134782), (-21.191832, -44.550327, 8.134782), (-23.33951, -43.30127, 8.959199), (-23.776413, -43.30127, 7.725425), (-21.588531, -44.550327, 7.014539), (-21.588531, -44.550327, 7.014539), (-23.776413, -43.30127, 7.725425), (-24.148146, -43.30127, 6.470476), (-21.926058, -44.550327, 5.8750696), (-21.926058, -44.550327, 5.8750696), (-24.148146, -43.30127, 6.470476), (-24.45369, -43.30127, 5.197792), (-22.203485, -44.550327, 4.7194967), (-22.203485, -44.550327, 4.7194967), (-24.45369, -43.30127, 5.197792), (-24.69221, -43.30127, 3.9108617), (-22.420055, -44.550327, 3.550988), (-22.420055, -44.550327, 3.550988), (-24.69221, -43.30127, 3.9108617), (-24.863047, -43.30127, 2.6132116), (-22.575174, -44.550327, 2.3727465), (-22.575174, -44.550327, 2.3727465), (-24.863047, -43.30127, 2.6132116), (-24.965738, -43.30127, 1.308399), (-22.668417, -44.550327, 1.1880014), (-22.668417, -44.550327, 1.1880014), (-24.965738, -43.30127, 1.308399), (-25, -43.30127, 3.0616169e-15), (-22.699526, -44.550327, 2.7798901e-15), (-22.699526, -44.550327, 2.7798901e-15), (-25, -43.30127, 3.0616169e-15), (-24.965738, -43.30127, -1.308399), (-22.668417, -44.550327, -1.1880014), (-22.668417, -44.550327, -1.1880014), (-24.965738, -43.30127, -1.308399), (-24.863047, -43.30127, -2.6132116), (-22.575174, -44.550327, -2.3727465), (-22.575174, -44.550327, -2.3727465), (-24.863047, -43.30127, -2.6132116), (-24.69221, -43.30127, -3.9108617), (-22.420055, -44.550327, -3.550988), (-22.420055, -44.550327, -3.550988), (-24.69221, -43.30127, -3.9108617), (-24.45369, -43.30127, -5.197792), (-22.203485, -44.550327, -4.7194967), (-22.203485, -44.550327, -4.7194967), (-24.45369, -43.30127, -5.197792), (-24.148146, -43.30127, -6.470476), (-21.926058, -44.550327, -5.8750696), (-21.926058, -44.550327, -5.8750696), (-24.148146, -43.30127, -6.470476), (-23.776413, -43.30127, -7.725425), (-21.588531, -44.550327, -7.014539), (-21.588531, -44.550327, -7.014539), (-23.776413, -43.30127, -7.725425), (-23.33951, -43.30127, -8.959199), (-21.191832, -44.550327, -8.134782), (-21.191832, -44.550327, -8.134782), (-23.33951, -43.30127, -8.959199), (-22.838636, -43.30127, -10.168416), (-20.737047, -44.550327, -9.232729), (-20.737047, -44.550327, -9.232729), (-22.838636, -43.30127, -10.168416), (-22.275164, -43.30127, -11.349763), (-20.225426, -44.550327, -10.305368), (-20.225426, -44.550327, -10.305368), (-22.275164, -43.30127, -11.349763), (-21.650635, -43.30127, -12.5), (-19.658365, -44.550327, -11.349763), (-19.658365, -44.550327, -11.349763), (-21.650635, -43.30127, -12.5), (-20.966764, -43.30127, -13.615976), (-19.037424, -44.550327, -12.363048), (-19.037424, -44.550327, -12.363048), (-20.966764, -43.30127, -13.615976), (-20.225426, -43.30127, -14.694632), (-18.364302, -44.550327, -13.342446), (-18.364302, -44.550327, -13.342446), (-20.225426, -43.30127, -14.694632), (-19.42865, -43.30127, -15.733009), (-17.640844, -44.550327, -14.285274), (-17.640844, -44.550327, -14.285274), (-19.42865, -43.30127, -15.733009), (-18.57862, -43.30127, -16.728266), (-16.869034, -44.550327, -15.188947), (-16.869034, -44.550327, -15.188947), (-18.57862, -43.30127, -16.728266), (-17.67767, -43.30127, -17.67767), (-16.050987, -44.550327, -16.050987), (-16.050987, -44.550327, -16.050987), (-17.67767, -43.30127, -17.67767), (-16.728266, -43.30127, -18.57862), (-15.188947, -44.550327, -16.869034), (-15.188947, -44.550327, -16.869034), (-16.728266, -43.30127, -18.57862), (-15.733009, -43.30127, -19.42865), (-14.285274, -44.550327, -17.640844), (-14.285274, -44.550327, -17.640844), (-15.733009, -43.30127, -19.42865), (-14.694632, -43.30127, -20.225426), (-13.342446, -44.550327, -18.364302), (-13.342446, -44.550327, -18.364302), (-14.694632, -43.30127, -20.225426), (-13.615976, -43.30127, -20.966764), (-12.363048, -44.550327, -19.037424), (-12.363048, -44.550327, -19.037424), (-13.615976, -43.30127, -20.966764), (-12.5, -43.30127, -21.650635), (-11.349763, -44.550327, -19.658365), (-11.349763, -44.550327, -19.658365), (-12.5, -43.30127, -21.650635), (-11.349763, -43.30127, -22.275164), (-10.305368, -44.550327, -20.225426), (-10.305368, -44.550327, -20.225426), (-11.349763, -43.30127, -22.275164), (-10.168416, -43.30127, -22.838636), (-9.232729, -44.550327, -20.737047), (-9.232729, -44.550327, -20.737047), (-10.168416, -43.30127, -22.838636), (-8.959199, -43.30127, -23.33951), (-8.134782, -44.550327, -21.191832), (-8.134782, -44.550327, -21.191832), (-8.959199, -43.30127, -23.33951), (-7.725425, -43.30127, -23.776413), (-7.014539, -44.550327, -21.588531), (-7.014539, -44.550327, -21.588531), (-7.725425, -43.30127, -23.776413), (-6.470476, -43.30127, -24.148146), (-5.8750696, -44.550327, -21.926058), (-5.8750696, -44.550327, -21.926058), (-6.470476, -43.30127, -24.148146), (-5.197792, -43.30127, -24.45369), (-4.7194967, -44.550327, -22.203485), (-4.7194967, -44.550327, -22.203485), (-5.197792, -43.30127, -24.45369), (-3.9108617, -43.30127, -24.69221), (-3.550988, -44.550327, -22.420055), (-3.550988, -44.550327, -22.420055), (-3.9108617, -43.30127, -24.69221), (-2.6132116, -43.30127, -24.863047), (-2.3727465, -44.550327, -22.575174), (-2.3727465, -44.550327, -22.575174), (-2.6132116, -43.30127, -24.863047), (-1.308399, -43.30127, -24.965738), (-1.1880014, -44.550327, -22.668417), (-1.1880014, -44.550327, -22.668417), (-1.308399, -43.30127, -24.965738), (-4.5924254e-15, -43.30127, -25), (-4.169835e-15, -44.550327, -22.699526), (-4.169835e-15, -44.550327, -22.699526), (-4.5924254e-15, -43.30127, -25), (1.308399, -43.30127, -24.965738), (1.1880014, -44.550327, -22.668417), (1.1880014, -44.550327, -22.668417), (1.308399, -43.30127, -24.965738), (2.6132116, -43.30127, -24.863047), (2.3727465, -44.550327, -22.575174), (2.3727465, -44.550327, -22.575174), (2.6132116, -43.30127, -24.863047), (3.9108617, -43.30127, -24.69221), (3.550988, -44.550327, -22.420055), (3.550988, -44.550327, -22.420055), (3.9108617, -43.30127, -24.69221), (5.197792, -43.30127, -24.45369), (4.7194967, -44.550327, -22.203485), (4.7194967, -44.550327, -22.203485), (5.197792, -43.30127, -24.45369), (6.470476, -43.30127, -24.148146), (5.8750696, -44.550327, -21.926058), (5.8750696, -44.550327, -21.926058), (6.470476, -43.30127, -24.148146), (7.725425, -43.30127, -23.776413), (7.014539, -44.550327, -21.588531), (7.014539, -44.550327, -21.588531), (7.725425, -43.30127, -23.776413), (8.959199, -43.30127, -23.33951), (8.134782, -44.550327, -21.191832), (8.134782, -44.550327, -21.191832), (8.959199, -43.30127, -23.33951), (10.168416, -43.30127, -22.838636), (9.232729, -44.550327, -20.737047), (9.232729, -44.550327, -20.737047), (10.168416, -43.30127, -22.838636), (11.349763, -43.30127, -22.275164), (10.305368, -44.550327, -20.225426), (10.305368, -44.550327, -20.225426), (11.349763, -43.30127, -22.275164), (12.5, -43.30127, -21.650635), (11.349763, -44.550327, -19.658365), (11.349763, -44.550327, -19.658365), (12.5, -43.30127, -21.650635), (13.615976, -43.30127, -20.966764), (12.363048, -44.550327, -19.037424), (12.363048, -44.550327, -19.037424), (13.615976, -43.30127, -20.966764), (14.694632, -43.30127, -20.225426), (13.342446, -44.550327, -18.364302), (13.342446, -44.550327, -18.364302), (14.694632, -43.30127, -20.225426), (15.733009, -43.30127, -19.42865), (14.285274, -44.550327, -17.640844), (14.285274, -44.550327, -17.640844), (15.733009, -43.30127, -19.42865), (16.728266, -43.30127, -18.57862), (15.188947, -44.550327, -16.869034), (15.188947, -44.550327, -16.869034), (16.728266, -43.30127, -18.57862), (17.67767, -43.30127, -17.67767), (16.050987, -44.550327, -16.050987), (16.050987, -44.550327, -16.050987), (17.67767, -43.30127, -17.67767), (18.57862, -43.30127, -16.728266), (16.869034, -44.550327, -15.188947), (16.869034, -44.550327, -15.188947), (18.57862, -43.30127, -16.728266), (19.42865, -43.30127, -15.733009), (17.640844, -44.550327, -14.285274), (17.640844, -44.550327, -14.285274), (19.42865, -43.30127, -15.733009), (20.225426, -43.30127, -14.694632), (18.364302, -44.550327, -13.342446), (18.364302, -44.550327, -13.342446), (20.225426, -43.30127, -14.694632), (20.966764, -43.30127, -13.615976), (19.037424, -44.550327, -12.363048), (19.037424, -44.550327, -12.363048), (20.966764, -43.30127, -13.615976), (21.650635, -43.30127, -12.5), (19.658365, -44.550327, -11.349763), (19.658365, -44.550327, -11.349763), (21.650635, -43.30127, -12.5), (22.275164, -43.30127, -11.349763), (20.225426, -44.550327, -10.305368), (20.225426, -44.550327, -10.305368), (22.275164, -43.30127, -11.349763), (22.838636, -43.30127, -10.168416), (20.737047, -44.550327, -9.232729), (20.737047, -44.550327, -9.232729), (22.838636, -43.30127, -10.168416), (23.33951, -43.30127, -8.959199), (21.191832, -44.550327, -8.134782), (21.191832, -44.550327, -8.134782), (23.33951, -43.30127, -8.959199), (23.776413, -43.30127, -7.725425), (21.588531, -44.550327, -7.014539), (21.588531, -44.550327, -7.014539), (23.776413, -43.30127, -7.725425), (24.148146, -43.30127, -6.470476), (21.926058, -44.550327, -5.8750696), (21.926058, -44.550327, -5.8750696), (24.148146, -43.30127, -6.470476), (24.45369, -43.30127, -5.197792), (22.203485, -44.550327, -4.7194967), (22.203485, -44.550327, -4.7194967), (24.45369, -43.30127, -5.197792), (24.69221, -43.30127, -3.9108617), (22.420055, -44.550327, -3.550988), (22.420055, -44.550327, -3.550988), (24.69221, -43.30127, -3.9108617), (24.863047, -43.30127, -2.6132116), (22.575174, -44.550327, -2.3727465), (22.575174, -44.550327, -2.3727465), (24.863047, -43.30127, -2.6132116), (24.965738, -43.30127, -1.308399), (22.668417, -44.550327, -1.1880014), (22.668417, -44.550327, -1.1880014), (24.965738, -43.30127, -1.308399), (25, -43.30127, 0), (22.699526, -44.550327, 0), (25, -43.30127, 0), (27.231953, -41.93353, 0), (27.194632, -41.93353, 1.4252102), (24.965738, -43.30127, 1.308399), (24.965738, -43.30127, 1.308399), (27.194632, -41.93353, 1.4252102), (27.082773, -41.93353, 2.846514), (24.863047, -43.30127, 2.6132116), (24.863047, -43.30127, 2.6132116), (27.082773, -41.93353, 2.846514), (26.89668, -41.93353, 4.260016), (24.69221, -43.30127, 3.9108617), (24.69221, -43.30127, 3.9108617), (26.89668, -41.93353, 4.260016), (26.636868, -41.93353, 5.661841), (24.45369, -43.30127, 5.197792), (24.45369, -43.30127, 5.197792), (26.636868, -41.93353, 5.661841), (26.304045, -41.93353, 7.0481477), (24.148146, -43.30127, 6.470476), (24.148146, -43.30127, 6.470476), (26.304045, -41.93353, 7.0481477), (25.899126, -41.93353, 8.415136), (23.776413, -43.30127, 7.725425), (23.776413, -43.30127, 7.725425), (25.899126, -41.93353, 8.415136), (25.423218, -41.93353, 9.759059), (23.33951, -43.30127, 8.959199), (23.33951, -43.30127, 8.959199), (25.423218, -41.93353, 9.759059), (24.877626, -41.93353, 11.076233), (22.838636, -43.30127, 10.168416), (22.838636, -43.30127, 10.168416), (24.877626, -41.93353, 11.076233), (24.263847, -41.93353, 12.363048), (22.275164, -43.30127, 11.349763), (22.275164, -43.30127, 11.349763), (24.263847, -41.93353, 12.363048), (23.583563, -41.93353, 13.615976), (21.650635, -43.30127, 12.5), (21.650635, -43.30127, 12.5), (23.583563, -41.93353, 13.615976), (22.838636, -41.93353, 14.831584), (20.966764, -43.30127, 13.615976), (20.966764, -43.30127, 13.615976), (22.838636, -41.93353, 14.831584), (22.031113, -41.93353, 16.00654), (20.225426, -43.30127, 14.694632), (20.225426, -43.30127, 14.694632), (22.031113, -41.93353, 16.00654), (21.1632, -41.93353, 17.137623), (19.42865, -43.30127, 15.733009), (19.42865, -43.30127, 15.733009), (21.1632, -41.93353, 17.137623), (20.237284, -41.93353, 18.221733), (18.57862, -43.30127, 16.728266), (18.57862, -43.30127, 16.728266), (20.237284, -41.93353, 18.221733), (19.255898, -41.93353, 19.255898), (17.67767, -43.30127, 17.67767), (17.67767, -43.30127, 17.67767), (19.255898, -41.93353, 19.255898), (18.221733, -41.93353, 20.237284), (16.728266, -43.30127, 18.57862), (16.728266, -43.30127, 18.57862), (18.221733, -41.93353, 20.237284), (17.137623, -41.93353, 21.1632), (15.733009, -43.30127, 19.42865), (15.733009, -43.30127, 19.42865), (17.137623, -41.93353, 21.1632), (16.00654, -41.93353, 22.031113), (14.694632, -43.30127, 20.225426), (14.694632, -43.30127, 20.225426), (16.00654, -41.93353, 22.031113), (14.831584, -41.93353, 22.838636), (13.615976, -43.30127, 20.966764), (13.615976, -43.30127, 20.966764), (14.831584, -41.93353, 22.838636), (13.615976, -41.93353, 23.583563), (12.5, -43.30127, 21.650635), (12.5, -43.30127, 21.650635), (13.615976, -41.93353, 23.583563), (12.363048, -41.93353, 24.263847), (11.349763, -43.30127, 22.275164), (11.349763, -43.30127, 22.275164), (12.363048, -41.93353, 24.263847), (11.076233, -41.93353, 24.877626), (10.168416, -43.30127, 22.838636), (10.168416, -43.30127, 22.838636), (11.076233, -41.93353, 24.877626), (9.759059, -41.93353, 25.423218), (8.959199, -43.30127, 23.33951), (8.959199, -43.30127, 23.33951), (9.759059, -41.93353, 25.423218), (8.415136, -41.93353, 25.899126), (7.725425, -43.30127, 23.776413), (7.725425, -43.30127, 23.776413), (8.415136, -41.93353, 25.899126), (7.0481477, -41.93353, 26.304045), (6.470476, -43.30127, 24.148146), (6.470476, -43.30127, 24.148146), (7.0481477, -41.93353, 26.304045), (5.661841, -41.93353, 26.636868), (5.197792, -43.30127, 24.45369), (5.197792, -43.30127, 24.45369), (5.661841, -41.93353, 26.636868), (4.260016, -41.93353, 26.89668), (3.9108617, -43.30127, 24.69221), (3.9108617, -43.30127, 24.69221), (4.260016, -41.93353, 26.89668), (2.846514, -41.93353, 27.082773), (2.6132116, -43.30127, 24.863047), (2.6132116, -43.30127, 24.863047), (2.846514, -41.93353, 27.082773), (1.4252102, -41.93353, 27.194632), (1.308399, -43.30127, 24.965738), (1.308399, -43.30127, 24.965738), (1.4252102, -41.93353, 27.194632), (1.6674762e-15, -41.93353, 27.231953), (1.5308084e-15, -43.30127, 25), (1.5308084e-15, -43.30127, 25), (1.6674762e-15, -41.93353, 27.231953), (-1.4252102, -41.93353, 27.194632), (-1.308399, -43.30127, 24.965738), (-1.308399, -43.30127, 24.965738), (-1.4252102, -41.93353, 27.194632), (-2.846514, -41.93353, 27.082773), (-2.6132116, -43.30127, 24.863047), (-2.6132116, -43.30127, 24.863047), (-2.846514, -41.93353, 27.082773), (-4.260016, -41.93353, 26.89668), (-3.9108617, -43.30127, 24.69221), (-3.9108617, -43.30127, 24.69221), (-4.260016, -41.93353, 26.89668), (-5.661841, -41.93353, 26.636868), (-5.197792, -43.30127, 24.45369), (-5.197792, -43.30127, 24.45369), (-5.661841, -41.93353, 26.636868), (-7.0481477, -41.93353, 26.304045), (-6.470476, -43.30127, 24.148146), (-6.470476, -43.30127, 24.148146), (-7.0481477, -41.93353, 26.304045), (-8.415136, -41.93353, 25.899126), (-7.725425, -43.30127, 23.776413), (-7.725425, -43.30127, 23.776413), (-8.415136, -41.93353, 25.899126), (-9.759059, -41.93353, 25.423218), (-8.959199, -43.30127, 23.33951), (-8.959199, -43.30127, 23.33951), (-9.759059, -41.93353, 25.423218), (-11.076233, -41.93353, 24.877626), (-10.168416, -43.30127, 22.838636), (-10.168416, -43.30127, 22.838636), (-11.076233, -41.93353, 24.877626), (-12.363048, -41.93353, 24.263847), (-11.349763, -43.30127, 22.275164), (-11.349763, -43.30127, 22.275164), (-12.363048, -41.93353, 24.263847), (-13.615976, -41.93353, 23.583563), (-12.5, -43.30127, 21.650635), (-12.5, -43.30127, 21.650635), (-13.615976, -41.93353, 23.583563), (-14.831584, -41.93353, 22.838636), (-13.615976, -43.30127, 20.966764), (-13.615976, -43.30127, 20.966764), (-14.831584, -41.93353, 22.838636), (-16.00654, -41.93353, 22.031113), (-14.694632, -43.30127, 20.225426), (-14.694632, -43.30127, 20.225426), (-16.00654, -41.93353, 22.031113), (-17.137623, -41.93353, 21.1632), (-15.733009, -43.30127, 19.42865), (-15.733009, -43.30127, 19.42865), (-17.137623, -41.93353, 21.1632), (-18.221733, -41.93353, 20.237284), (-16.728266, -43.30127, 18.57862), (-16.728266, -43.30127, 18.57862), (-18.221733, -41.93353, 20.237284), (-19.255898, -41.93353, 19.255898), (-17.67767, -43.30127, 17.67767), (-17.67767, -43.30127, 17.67767), (-19.255898, -41.93353, 19.255898), (-20.237284, -41.93353, 18.221733), (-18.57862, -43.30127, 16.728266), (-18.57862, -43.30127, 16.728266), (-20.237284, -41.93353, 18.221733), (-21.1632, -41.93353, 17.137623), (-19.42865, -43.30127, 15.733009), (-19.42865, -43.30127, 15.733009), (-21.1632, -41.93353, 17.137623), (-22.031113, -41.93353, 16.00654), (-20.225426, -43.30127, 14.694632), (-20.225426, -43.30127, 14.694632), (-22.031113, -41.93353, 16.00654), (-22.838636, -41.93353, 14.831584), (-20.966764, -43.30127, 13.615976), (-20.966764, -43.30127, 13.615976), (-22.838636, -41.93353, 14.831584), (-23.583563, -41.93353, 13.615976), (-21.650635, -43.30127, 12.5), (-21.650635, -43.30127, 12.5), (-23.583563, -41.93353, 13.615976), (-24.263847, -41.93353, 12.363048), (-22.275164, -43.30127, 11.349763), (-22.275164, -43.30127, 11.349763), (-24.263847, -41.93353, 12.363048), (-24.877626, -41.93353, 11.076233), (-22.838636, -43.30127, 10.168416), (-22.838636, -43.30127, 10.168416), (-24.877626, -41.93353, 11.076233), (-25.423218, -41.93353, 9.759059), (-23.33951, -43.30127, 8.959199), (-23.33951, -43.30127, 8.959199), (-25.423218, -41.93353, 9.759059), (-25.899126, -41.93353, 8.415136), (-23.776413, -43.30127, 7.725425), (-23.776413, -43.30127, 7.725425), (-25.899126, -41.93353, 8.415136), (-26.304045, -41.93353, 7.0481477), (-24.148146, -43.30127, 6.470476), (-24.148146, -43.30127, 6.470476), (-26.304045, -41.93353, 7.0481477), (-26.636868, -41.93353, 5.661841), (-24.45369, -43.30127, 5.197792), (-24.45369, -43.30127, 5.197792), (-26.636868, -41.93353, 5.661841), (-26.89668, -41.93353, 4.260016), (-24.69221, -43.30127, 3.9108617), (-24.69221, -43.30127, 3.9108617), (-26.89668, -41.93353, 4.260016), (-27.082773, -41.93353, 2.846514), (-24.863047, -43.30127, 2.6132116), (-24.863047, -43.30127, 2.6132116), (-27.082773, -41.93353, 2.846514), (-27.194632, -41.93353, 1.4252102), (-24.965738, -43.30127, 1.308399), (-24.965738, -43.30127, 1.308399), (-27.194632, -41.93353, 1.4252102), (-27.231953, -41.93353, 3.3349523e-15), (-25, -43.30127, 3.0616169e-15), (-25, -43.30127, 3.0616169e-15), (-27.231953, -41.93353, 3.3349523e-15), (-27.194632, -41.93353, -1.4252102), (-24.965738, -43.30127, -1.308399), (-24.965738, -43.30127, -1.308399), (-27.194632, -41.93353, -1.4252102), (-27.082773, -41.93353, -2.846514), (-24.863047, -43.30127, -2.6132116), (-24.863047, -43.30127, -2.6132116), (-27.082773, -41.93353, -2.846514), (-26.89668, -41.93353, -4.260016), (-24.69221, -43.30127, -3.9108617), (-24.69221, -43.30127, -3.9108617), (-26.89668, -41.93353, -4.260016), (-26.636868, -41.93353, -5.661841), (-24.45369, -43.30127, -5.197792), (-24.45369, -43.30127, -5.197792), (-26.636868, -41.93353, -5.661841), (-26.304045, -41.93353, -7.0481477), (-24.148146, -43.30127, -6.470476), (-24.148146, -43.30127, -6.470476), (-26.304045, -41.93353, -7.0481477), (-25.899126, -41.93353, -8.415136), (-23.776413, -43.30127, -7.725425), (-23.776413, -43.30127, -7.725425), (-25.899126, -41.93353, -8.415136), (-25.423218, -41.93353, -9.759059), (-23.33951, -43.30127, -8.959199), (-23.33951, -43.30127, -8.959199), (-25.423218, -41.93353, -9.759059), (-24.877626, -41.93353, -11.076233), (-22.838636, -43.30127, -10.168416), (-22.838636, -43.30127, -10.168416), (-24.877626, -41.93353, -11.076233), (-24.263847, -41.93353, -12.363048), (-22.275164, -43.30127, -11.349763), (-22.275164, -43.30127, -11.349763), (-24.263847, -41.93353, -12.363048), (-23.583563, -41.93353, -13.615976), (-21.650635, -43.30127, -12.5), (-21.650635, -43.30127, -12.5), (-23.583563, -41.93353, -13.615976), (-22.838636, -41.93353, -14.831584), (-20.966764, -43.30127, -13.615976), (-20.966764, -43.30127, -13.615976), (-22.838636, -41.93353, -14.831584), (-22.031113, -41.93353, -16.00654), (-20.225426, -43.30127, -14.694632), (-20.225426, -43.30127, -14.694632), (-22.031113, -41.93353, -16.00654), (-21.1632, -41.93353, -17.137623), (-19.42865, -43.30127, -15.733009), (-19.42865, -43.30127, -15.733009), (-21.1632, -41.93353, -17.137623), (-20.237284, -41.93353, -18.221733), (-18.57862, -43.30127, -16.728266), (-18.57862, -43.30127, -16.728266), (-20.237284, -41.93353, -18.221733), (-19.255898, -41.93353, -19.255898), (-17.67767, -43.30127, -17.67767), (-17.67767, -43.30127, -17.67767), (-19.255898, -41.93353, -19.255898), (-18.221733, -41.93353, -20.237284), (-16.728266, -43.30127, -18.57862), (-16.728266, -43.30127, -18.57862), (-18.221733, -41.93353, -20.237284), (-17.137623, -41.93353, -21.1632), (-15.733009, -43.30127, -19.42865), (-15.733009, -43.30127, -19.42865), (-17.137623, -41.93353, -21.1632), (-16.00654, -41.93353, -22.031113), (-14.694632, -43.30127, -20.225426), (-14.694632, -43.30127, -20.225426), (-16.00654, -41.93353, -22.031113), (-14.831584, -41.93353, -22.838636), (-13.615976, -43.30127, -20.966764), (-13.615976, -43.30127, -20.966764), (-14.831584, -41.93353, -22.838636), (-13.615976, -41.93353, -23.583563), (-12.5, -43.30127, -21.650635), (-12.5, -43.30127, -21.650635), (-13.615976, -41.93353, -23.583563), (-12.363048, -41.93353, -24.263847), (-11.349763, -43.30127, -22.275164), (-11.349763, -43.30127, -22.275164), (-12.363048, -41.93353, -24.263847), (-11.076233, -41.93353, -24.877626), (-10.168416, -43.30127, -22.838636), (-10.168416, -43.30127, -22.838636), (-11.076233, -41.93353, -24.877626), (-9.759059, -41.93353, -25.423218), (-8.959199, -43.30127, -23.33951), (-8.959199, -43.30127, -23.33951), (-9.759059, -41.93353, -25.423218), (-8.415136, -41.93353, -25.899126), (-7.725425, -43.30127, -23.776413), (-7.725425, -43.30127, -23.776413), (-8.415136, -41.93353, -25.899126), (-7.0481477, -41.93353, -26.304045), (-6.470476, -43.30127, -24.148146), (-6.470476, -43.30127, -24.148146), (-7.0481477, -41.93353, -26.304045), (-5.661841, -41.93353, -26.636868), (-5.197792, -43.30127, -24.45369), (-5.197792, -43.30127, -24.45369), (-5.661841, -41.93353, -26.636868), (-4.260016, -41.93353, -26.89668), (-3.9108617, -43.30127, -24.69221), (-3.9108617, -43.30127, -24.69221), (-4.260016, -41.93353, -26.89668), (-2.846514, -41.93353, -27.082773), (-2.6132116, -43.30127, -24.863047), (-2.6132116, -43.30127, -24.863047), (-2.846514, -41.93353, -27.082773), (-1.4252102, -41.93353, -27.194632), (-1.308399, -43.30127, -24.965738), (-1.308399, -43.30127, -24.965738), (-1.4252102, -41.93353, -27.194632), (-5.0024284e-15, -41.93353, -27.231953), (-4.5924254e-15, -43.30127, -25), (-4.5924254e-15, -43.30127, -25), (-5.0024284e-15, -41.93353, -27.231953), (1.4252102, -41.93353, -27.194632), (1.308399, -43.30127, -24.965738), (1.308399, -43.30127, -24.965738), (1.4252102, -41.93353, -27.194632), (2.846514, -41.93353, -27.082773), (2.6132116, -43.30127, -24.863047), (2.6132116, -43.30127, -24.863047), (2.846514, -41.93353, -27.082773), (4.260016, -41.93353, -26.89668), (3.9108617, -43.30127, -24.69221), (3.9108617, -43.30127, -24.69221), (4.260016, -41.93353, -26.89668), (5.661841, -41.93353, -26.636868), (5.197792, -43.30127, -24.45369), (5.197792, -43.30127, -24.45369), (5.661841, -41.93353, -26.636868), (7.0481477, -41.93353, -26.304045), (6.470476, -43.30127, -24.148146), (6.470476, -43.30127, -24.148146), (7.0481477, -41.93353, -26.304045), (8.415136, -41.93353, -25.899126), (7.725425, -43.30127, -23.776413), (7.725425, -43.30127, -23.776413), (8.415136, -41.93353, -25.899126), (9.759059, -41.93353, -25.423218), (8.959199, -43.30127, -23.33951), (8.959199, -43.30127, -23.33951), (9.759059, -41.93353, -25.423218), (11.076233, -41.93353, -24.877626), (10.168416, -43.30127, -22.838636), (10.168416, -43.30127, -22.838636), (11.076233, -41.93353, -24.877626), (12.363048, -41.93353, -24.263847), (11.349763, -43.30127, -22.275164), (11.349763, -43.30127, -22.275164), (12.363048, -41.93353, -24.263847), (13.615976, -41.93353, -23.583563), (12.5, -43.30127, -21.650635), (12.5, -43.30127, -21.650635), (13.615976, -41.93353, -23.583563), (14.831584, -41.93353, -22.838636), (13.615976, -43.30127, -20.966764), (13.615976, -43.30127, -20.966764), (14.831584, -41.93353, -22.838636), (16.00654, -41.93353, -22.031113), (14.694632, -43.30127, -20.225426), (14.694632, -43.30127, -20.225426), (16.00654, -41.93353, -22.031113), (17.137623, -41.93353, -21.1632), (15.733009, -43.30127, -19.42865), (15.733009, -43.30127, -19.42865), (17.137623, -41.93353, -21.1632), (18.221733, -41.93353, -20.237284), (16.728266, -43.30127, -18.57862), (16.728266, -43.30127, -18.57862), (18.221733, -41.93353, -20.237284), (19.255898, -41.93353, -19.255898), (17.67767, -43.30127, -17.67767), (17.67767, -43.30127, -17.67767), (19.255898, -41.93353, -19.255898), (20.237284, -41.93353, -18.221733), (18.57862, -43.30127, -16.728266), (18.57862, -43.30127, -16.728266), (20.237284, -41.93353, -18.221733), (21.1632, -41.93353, -17.137623), (19.42865, -43.30127, -15.733009), (19.42865, -43.30127, -15.733009), (21.1632, -41.93353, -17.137623), (22.031113, -41.93353, -16.00654), (20.225426, -43.30127, -14.694632), (20.225426, -43.30127, -14.694632), (22.031113, -41.93353, -16.00654), (22.838636, -41.93353, -14.831584), (20.966764, -43.30127, -13.615976), (20.966764, -43.30127, -13.615976), (22.838636, -41.93353, -14.831584), (23.583563, -41.93353, -13.615976), (21.650635, -43.30127, -12.5), (21.650635, -43.30127, -12.5), (23.583563, -41.93353, -13.615976), (24.263847, -41.93353, -12.363048), (22.275164, -43.30127, -11.349763), (22.275164, -43.30127, -11.349763), (24.263847, -41.93353, -12.363048), (24.877626, -41.93353, -11.076233), (22.838636, -43.30127, -10.168416), (22.838636, -43.30127, -10.168416), (24.877626, -41.93353, -11.076233), (25.423218, -41.93353, -9.759059), (23.33951, -43.30127, -8.959199), (23.33951, -43.30127, -8.959199), (25.423218, -41.93353, -9.759059), (25.899126, -41.93353, -8.415136), (23.776413, -43.30127, -7.725425), (23.776413, -43.30127, -7.725425), (25.899126, -41.93353, -8.415136), (26.304045, -41.93353, -7.0481477), (24.148146, -43.30127, -6.470476), (24.148146, -43.30127, -6.470476), (26.304045, -41.93353, -7.0481477), (26.636868, -41.93353, -5.661841), (24.45369, -43.30127, -5.197792), (24.45369, -43.30127, -5.197792), (26.636868, -41.93353, -5.661841), (26.89668, -41.93353, -4.260016), (24.69221, -43.30127, -3.9108617), (24.69221, -43.30127, -3.9108617), (26.89668, -41.93353, -4.260016), (27.082773, -41.93353, -2.846514), (24.863047, -43.30127, -2.6132116), (24.863047, -43.30127, -2.6132116), (27.082773, -41.93353, -2.846514), (27.194632, -41.93353, -1.4252102), (24.965738, -43.30127, -1.308399), (24.965738, -43.30127, -1.308399), (27.194632, -41.93353, -1.4252102), (27.231953, -41.93353, 0), (25, -43.30127, 0), (27.231953, -41.93353, 0), (29.389263, -40.45085, 0), (29.348986, -40.45085, 1.5381151), (27.194632, -41.93353, 1.4252102), (27.194632, -41.93353, 1.4252102), (29.348986, -40.45085, 1.5381151), (29.228266, -40.45085, 3.0720146), (27.082773, -41.93353, 2.846514), (27.082773, -41.93353, 2.846514), (29.228266, -40.45085, 3.0720146), (29.027431, -40.45085, 4.5974936), (26.89668, -41.93353, 4.260016), (26.89668, -41.93353, 4.260016), (29.027431, -40.45085, 4.5974936), (28.747036, -40.45085, 6.110371), (26.636868, -41.93353, 5.661841), (26.636868, -41.93353, 5.661841), (28.747036, -40.45085, 6.110371), (28.387848, -40.45085, 7.606501), (26.304045, -41.93353, 7.0481477), (26.304045, -41.93353, 7.0481477), (28.387848, -40.45085, 7.606501), (27.95085, -40.45085, 9.081781), (25.899126, -41.93353, 8.415136), (25.899126, -41.93353, 8.415136), (27.95085, -40.45085, 9.081781), (27.43724, -40.45085, 10.532169), (25.423218, -41.93353, 9.759059), (25.423218, -41.93353, 9.759059), (27.43724, -40.45085, 10.532169), (26.848427, -40.45085, 11.95369), (24.877626, -41.93353, 11.076233), (24.877626, -41.93353, 11.076233), (26.848427, -40.45085, 11.95369), (26.186026, -40.45085, 13.342446), (24.263847, -41.93353, 12.363048), (24.263847, -41.93353, 12.363048), (26.186026, -40.45085, 13.342446), (25.451847, -40.45085, 14.694632), (23.583563, -41.93353, 13.615976), (23.583563, -41.93353, 13.615976), (25.451847, -40.45085, 14.694632), (24.64791, -40.45085, 16.00654), (22.838636, -41.93353, 14.831584), (22.838636, -41.93353, 14.831584), (24.64791, -40.45085, 16.00654), (23.776413, -40.45085, 17.274574), (22.031113, -41.93353, 16.00654), (22.031113, -41.93353, 16.00654), (23.776413, -40.45085, 17.274574), (22.839746, -40.45085, 18.495262), (21.1632, -41.93353, 17.137623), (21.1632, -41.93353, 17.137623), (22.839746, -40.45085, 18.495262), (21.840479, -40.45085, 19.665255), (20.237284, -41.93353, 18.221733), (20.237284, -41.93353, 18.221733), (21.840479, -40.45085, 19.665255), (20.781347, -40.45085, 20.781347), (19.255898, -41.93353, 19.255898), (19.255898, -41.93353, 19.255898), (20.781347, -40.45085, 20.781347), (19.665255, -40.45085, 21.840479), (18.221733, -41.93353, 20.237284), (18.221733, -41.93353, 20.237284), (19.665255, -40.45085, 21.840479), (18.495262, -40.45085, 22.839746), (17.137623, -41.93353, 21.1632), (17.137623, -41.93353, 21.1632), (18.495262, -40.45085, 22.839746), (17.274574, -40.45085, 23.776413), (16.00654, -41.93353, 22.031113), (16.00654, -41.93353, 22.031113), (17.274574, -40.45085, 23.776413), (16.00654, -40.45085, 24.64791), (14.831584, -41.93353, 22.838636), (14.831584, -41.93353, 22.838636), (16.00654, -40.45085, 24.64791), (14.694632, -40.45085, 25.451847), (13.615976, -41.93353, 23.583563), (13.615976, -41.93353, 23.583563), (14.694632, -40.45085, 25.451847), (13.342446, -40.45085, 26.186026), (12.363048, -41.93353, 24.263847), (12.363048, -41.93353, 24.263847), (13.342446, -40.45085, 26.186026), (11.95369, -40.45085, 26.848427), (11.076233, -41.93353, 24.877626), (11.076233, -41.93353, 24.877626), (11.95369, -40.45085, 26.848427), (10.532169, -40.45085, 27.43724), (9.759059, -41.93353, 25.423218), (9.759059, -41.93353, 25.423218), (10.532169, -40.45085, 27.43724), (9.081781, -40.45085, 27.95085), (8.415136, -41.93353, 25.899126), (8.415136, -41.93353, 25.899126), (9.081781, -40.45085, 27.95085), (7.606501, -40.45085, 28.387848), (7.0481477, -41.93353, 26.304045), (7.0481477, -41.93353, 26.304045), (7.606501, -40.45085, 28.387848), (6.110371, -40.45085, 28.747036), (5.661841, -41.93353, 26.636868), (5.661841, -41.93353, 26.636868), (6.110371, -40.45085, 28.747036), (4.5974936, -40.45085, 29.027431), (4.260016, -41.93353, 26.89668), (4.260016, -41.93353, 26.89668), (4.5974936, -40.45085, 29.027431), (3.0720146, -40.45085, 29.228266), (2.846514, -41.93353, 27.082773), (2.846514, -41.93353, 27.082773), (3.0720146, -40.45085, 29.228266), (1.5381151, -40.45085, 29.348986), (1.4252102, -41.93353, 27.194632), (1.4252102, -41.93353, 27.194632), (1.5381151, -40.45085, 29.348986), (1.7995734e-15, -40.45085, 29.389263), (1.6674762e-15, -41.93353, 27.231953), (1.6674762e-15, -41.93353, 27.231953), (1.7995734e-15, -40.45085, 29.389263), (-1.5381151, -40.45085, 29.348986), (-1.4252102, -41.93353, 27.194632), (-1.4252102, -41.93353, 27.194632), (-1.5381151, -40.45085, 29.348986), (-3.0720146, -40.45085, 29.228266), (-2.846514, -41.93353, 27.082773), (-2.846514, -41.93353, 27.082773), (-3.0720146, -40.45085, 29.228266), (-4.5974936, -40.45085, 29.027431), (-4.260016, -41.93353, 26.89668), (-4.260016, -41.93353, 26.89668), (-4.5974936, -40.45085, 29.027431), (-6.110371, -40.45085, 28.747036), (-5.661841, -41.93353, 26.636868), (-5.661841, -41.93353, 26.636868), (-6.110371, -40.45085, 28.747036), (-7.606501, -40.45085, 28.387848), (-7.0481477, -41.93353, 26.304045), (-7.0481477, -41.93353, 26.304045), (-7.606501, -40.45085, 28.387848), (-9.081781, -40.45085, 27.95085), (-8.415136, -41.93353, 25.899126), (-8.415136, -41.93353, 25.899126), (-9.081781, -40.45085, 27.95085), (-10.532169, -40.45085, 27.43724), (-9.759059, -41.93353, 25.423218), (-9.759059, -41.93353, 25.423218), (-10.532169, -40.45085, 27.43724), (-11.95369, -40.45085, 26.848427), (-11.076233, -41.93353, 24.877626), (-11.076233, -41.93353, 24.877626), (-11.95369, -40.45085, 26.848427), (-13.342446, -40.45085, 26.186026), (-12.363048, -41.93353, 24.263847), (-12.363048, -41.93353, 24.263847), (-13.342446, -40.45085, 26.186026), (-14.694632, -40.45085, 25.451847), (-13.615976, -41.93353, 23.583563), (-13.615976, -41.93353, 23.583563), (-14.694632, -40.45085, 25.451847), (-16.00654, -40.45085, 24.64791), (-14.831584, -41.93353, 22.838636), (-14.831584, -41.93353, 22.838636), (-16.00654, -40.45085, 24.64791), (-17.274574, -40.45085, 23.776413), (-16.00654, -41.93353, 22.031113), (-16.00654, -41.93353, 22.031113), (-17.274574, -40.45085, 23.776413), (-18.495262, -40.45085, 22.839746), (-17.137623, -41.93353, 21.1632), (-17.137623, -41.93353, 21.1632), (-18.495262, -40.45085, 22.839746), (-19.665255, -40.45085, 21.840479), (-18.221733, -41.93353, 20.237284), (-18.221733, -41.93353, 20.237284), (-19.665255, -40.45085, 21.840479), (-20.781347, -40.45085, 20.781347), (-19.255898, -41.93353, 19.255898), (-19.255898, -41.93353, 19.255898), (-20.781347, -40.45085, 20.781347), (-21.840479, -40.45085, 19.665255), (-20.237284, -41.93353, 18.221733), (-20.237284, -41.93353, 18.221733), (-21.840479, -40.45085, 19.665255), (-22.839746, -40.45085, 18.495262), (-21.1632, -41.93353, 17.137623), (-21.1632, -41.93353, 17.137623), (-22.839746, -40.45085, 18.495262), (-23.776413, -40.45085, 17.274574), (-22.031113, -41.93353, 16.00654), (-22.031113, -41.93353, 16.00654), (-23.776413, -40.45085, 17.274574), (-24.64791, -40.45085, 16.00654), (-22.838636, -41.93353, 14.831584), (-22.838636, -41.93353, 14.831584), (-24.64791, -40.45085, 16.00654), (-25.451847, -40.45085, 14.694632), (-23.583563, -41.93353, 13.615976), (-23.583563, -41.93353, 13.615976), (-25.451847, -40.45085, 14.694632), (-26.186026, -40.45085, 13.342446), (-24.263847, -41.93353, 12.363048), (-24.263847, -41.93353, 12.363048), (-26.186026, -40.45085, 13.342446), (-26.848427, -40.45085, 11.95369), (-24.877626, -41.93353, 11.076233), (-24.877626, -41.93353, 11.076233), (-26.848427, -40.45085, 11.95369), (-27.43724, -40.45085, 10.532169), (-25.423218, -41.93353, 9.759059), (-25.423218, -41.93353, 9.759059), (-27.43724, -40.45085, 10.532169), (-27.95085, -40.45085, 9.081781), (-25.899126, -41.93353, 8.415136), (-25.899126, -41.93353, 8.415136), (-27.95085, -40.45085, 9.081781), (-28.387848, -40.45085, 7.606501), (-26.304045, -41.93353, 7.0481477), (-26.304045, -41.93353, 7.0481477), (-28.387848, -40.45085, 7.606501), (-28.747036, -40.45085, 6.110371), (-26.636868, -41.93353, 5.661841), (-26.636868, -41.93353, 5.661841), (-28.747036, -40.45085, 6.110371), (-29.027431, -40.45085, 4.5974936), (-26.89668, -41.93353, 4.260016), (-26.89668, -41.93353, 4.260016), (-29.027431, -40.45085, 4.5974936), (-29.228266, -40.45085, 3.0720146), (-27.082773, -41.93353, 2.846514), (-27.082773, -41.93353, 2.846514), (-29.228266, -40.45085, 3.0720146), (-29.348986, -40.45085, 1.5381151), (-27.194632, -41.93353, 1.4252102), (-27.194632, -41.93353, 1.4252102), (-29.348986, -40.45085, 1.5381151), (-29.389263, -40.45085, 3.5991468e-15), (-27.231953, -41.93353, 3.3349523e-15), (-27.231953, -41.93353, 3.3349523e-15), (-29.389263, -40.45085, 3.5991468e-15), (-29.348986, -40.45085, -1.5381151), (-27.194632, -41.93353, -1.4252102), (-27.194632, -41.93353, -1.4252102), (-29.348986, -40.45085, -1.5381151), (-29.228266, -40.45085, -3.0720146), (-27.082773, -41.93353, -2.846514), (-27.082773, -41.93353, -2.846514), (-29.228266, -40.45085, -3.0720146), (-29.027431, -40.45085, -4.5974936), (-26.89668, -41.93353, -4.260016), (-26.89668, -41.93353, -4.260016), (-29.027431, -40.45085, -4.5974936), (-28.747036, -40.45085, -6.110371), (-26.636868, -41.93353, -5.661841), (-26.636868, -41.93353, -5.661841), (-28.747036, -40.45085, -6.110371), (-28.387848, -40.45085, -7.606501), (-26.304045, -41.93353, -7.0481477), (-26.304045, -41.93353, -7.0481477), (-28.387848, -40.45085, -7.606501), (-27.95085, -40.45085, -9.081781), (-25.899126, -41.93353, -8.415136), (-25.899126, -41.93353, -8.415136), (-27.95085, -40.45085, -9.081781), (-27.43724, -40.45085, -10.532169), (-25.423218, -41.93353, -9.759059), (-25.423218, -41.93353, -9.759059), (-27.43724, -40.45085, -10.532169), (-26.848427, -40.45085, -11.95369), (-24.877626, -41.93353, -11.076233), (-24.877626, -41.93353, -11.076233), (-26.848427, -40.45085, -11.95369), (-26.186026, -40.45085, -13.342446), (-24.263847, -41.93353, -12.363048), (-24.263847, -41.93353, -12.363048), (-26.186026, -40.45085, -13.342446), (-25.451847, -40.45085, -14.694632), (-23.583563, -41.93353, -13.615976), (-23.583563, -41.93353, -13.615976), (-25.451847, -40.45085, -14.694632), (-24.64791, -40.45085, -16.00654), (-22.838636, -41.93353, -14.831584), (-22.838636, -41.93353, -14.831584), (-24.64791, -40.45085, -16.00654), (-23.776413, -40.45085, -17.274574), (-22.031113, -41.93353, -16.00654), (-22.031113, -41.93353, -16.00654), (-23.776413, -40.45085, -17.274574), (-22.839746, -40.45085, -18.495262), (-21.1632, -41.93353, -17.137623), (-21.1632, -41.93353, -17.137623), (-22.839746, -40.45085, -18.495262), (-21.840479, -40.45085, -19.665255), (-20.237284, -41.93353, -18.221733), (-20.237284, -41.93353, -18.221733), (-21.840479, -40.45085, -19.665255), (-20.781347, -40.45085, -20.781347), (-19.255898, -41.93353, -19.255898), (-19.255898, -41.93353, -19.255898), (-20.781347, -40.45085, -20.781347), (-19.665255, -40.45085, -21.840479), (-18.221733, -41.93353, -20.237284), (-18.221733, -41.93353, -20.237284), (-19.665255, -40.45085, -21.840479), (-18.495262, -40.45085, -22.839746), (-17.137623, -41.93353, -21.1632), (-17.137623, -41.93353, -21.1632), (-18.495262, -40.45085, -22.839746), (-17.274574, -40.45085, -23.776413), (-16.00654, -41.93353, -22.031113), (-16.00654, -41.93353, -22.031113), (-17.274574, -40.45085, -23.776413), (-16.00654, -40.45085, -24.64791), (-14.831584, -41.93353, -22.838636), (-14.831584, -41.93353, -22.838636), (-16.00654, -40.45085, -24.64791), (-14.694632, -40.45085, -25.451847), (-13.615976, -41.93353, -23.583563), (-13.615976, -41.93353, -23.583563), (-14.694632, -40.45085, -25.451847), (-13.342446, -40.45085, -26.186026), (-12.363048, -41.93353, -24.263847), (-12.363048, -41.93353, -24.263847), (-13.342446, -40.45085, -26.186026), (-11.95369, -40.45085, -26.848427), (-11.076233, -41.93353, -24.877626), (-11.076233, -41.93353, -24.877626), (-11.95369, -40.45085, -26.848427), (-10.532169, -40.45085, -27.43724), (-9.759059, -41.93353, -25.423218), (-9.759059, -41.93353, -25.423218), (-10.532169, -40.45085, -27.43724), (-9.081781, -40.45085, -27.95085), (-8.415136, -41.93353, -25.899126), (-8.415136, -41.93353, -25.899126), (-9.081781, -40.45085, -27.95085), (-7.606501, -40.45085, -28.387848), (-7.0481477, -41.93353, -26.304045), (-7.0481477, -41.93353, -26.304045), (-7.606501, -40.45085, -28.387848), (-6.110371, -40.45085, -28.747036), (-5.661841, -41.93353, -26.636868), (-5.661841, -41.93353, -26.636868), (-6.110371, -40.45085, -28.747036), (-4.5974936, -40.45085, -29.027431), (-4.260016, -41.93353, -26.89668), (-4.260016, -41.93353, -26.89668), (-4.5974936, -40.45085, -29.027431), (-3.0720146, -40.45085, -29.228266), (-2.846514, -41.93353, -27.082773), (-2.846514, -41.93353, -27.082773), (-3.0720146, -40.45085, -29.228266), (-1.5381151, -40.45085, -29.348986), (-1.4252102, -41.93353, -27.194632), (-1.4252102, -41.93353, -27.194632), (-1.5381151, -40.45085, -29.348986), (-5.39872e-15, -40.45085, -29.389263), (-5.0024284e-15, -41.93353, -27.231953), (-5.0024284e-15, -41.93353, -27.231953), (-5.39872e-15, -40.45085, -29.389263), (1.5381151, -40.45085, -29.348986), (1.4252102, -41.93353, -27.194632), (1.4252102, -41.93353, -27.194632), (1.5381151, -40.45085, -29.348986), (3.0720146, -40.45085, -29.228266), (2.846514, -41.93353, -27.082773), (2.846514, -41.93353, -27.082773), (3.0720146, -40.45085, -29.228266), (4.5974936, -40.45085, -29.027431), (4.260016, -41.93353, -26.89668), (4.260016, -41.93353, -26.89668), (4.5974936, -40.45085, -29.027431), (6.110371, -40.45085, -28.747036), (5.661841, -41.93353, -26.636868), (5.661841, -41.93353, -26.636868), (6.110371, -40.45085, -28.747036), (7.606501, -40.45085, -28.387848), (7.0481477, -41.93353, -26.304045), (7.0481477, -41.93353, -26.304045), (7.606501, -40.45085, -28.387848), (9.081781, -40.45085, -27.95085), (8.415136, -41.93353, -25.899126), (8.415136, -41.93353, -25.899126), (9.081781, -40.45085, -27.95085), (10.532169, -40.45085, -27.43724), (9.759059, -41.93353, -25.423218), (9.759059, -41.93353, -25.423218), (10.532169, -40.45085, -27.43724), (11.95369, -40.45085, -26.848427), (11.076233, -41.93353, -24.877626), (11.076233, -41.93353, -24.877626), (11.95369, -40.45085, -26.848427), (13.342446, -40.45085, -26.186026), (12.363048, -41.93353, -24.263847), (12.363048, -41.93353, -24.263847), (13.342446, -40.45085, -26.186026), (14.694632, -40.45085, -25.451847), (13.615976, -41.93353, -23.583563), (13.615976, -41.93353, -23.583563), (14.694632, -40.45085, -25.451847), (16.00654, -40.45085, -24.64791), (14.831584, -41.93353, -22.838636), (14.831584, -41.93353, -22.838636), (16.00654, -40.45085, -24.64791), (17.274574, -40.45085, -23.776413), (16.00654, -41.93353, -22.031113), (16.00654, -41.93353, -22.031113), (17.274574, -40.45085, -23.776413), (18.495262, -40.45085, -22.839746), (17.137623, -41.93353, -21.1632), (17.137623, -41.93353, -21.1632), (18.495262, -40.45085, -22.839746), (19.665255, -40.45085, -21.840479), (18.221733, -41.93353, -20.237284), (18.221733, -41.93353, -20.237284), (19.665255, -40.45085, -21.840479), (20.781347, -40.45085, -20.781347), (19.255898, -41.93353, -19.255898), (19.255898, -41.93353, -19.255898), (20.781347, -40.45085, -20.781347), (21.840479, -40.45085, -19.665255), (20.237284, -41.93353, -18.221733), (20.237284, -41.93353, -18.221733), (21.840479, -40.45085, -19.665255), (22.839746, -40.45085, -18.495262), (21.1632, -41.93353, -17.137623), (21.1632, -41.93353, -17.137623), (22.839746, -40.45085, -18.495262), (23.776413, -40.45085, -17.274574), (22.031113, -41.93353, -16.00654), (22.031113, -41.93353, -16.00654), (23.776413, -40.45085, -17.274574), (24.64791, -40.45085, -16.00654), (22.838636, -41.93353, -14.831584), (22.838636, -41.93353, -14.831584), (24.64791, -40.45085, -16.00654), (25.451847, -40.45085, -14.694632), (23.583563, -41.93353, -13.615976), (23.583563, -41.93353, -13.615976), (25.451847, -40.45085, -14.694632), (26.186026, -40.45085, -13.342446), (24.263847, -41.93353, -12.363048), (24.263847, -41.93353, -12.363048), (26.186026, -40.45085, -13.342446), (26.848427, -40.45085, -11.95369), (24.877626, -41.93353, -11.076233), (24.877626, -41.93353, -11.076233), (26.848427, -40.45085, -11.95369), (27.43724, -40.45085, -10.532169), (25.423218, -41.93353, -9.759059), (25.423218, -41.93353, -9.759059), (27.43724, -40.45085, -10.532169), (27.95085, -40.45085, -9.081781), (25.899126, -41.93353, -8.415136), (25.899126, -41.93353, -8.415136), (27.95085, -40.45085, -9.081781), (28.387848, -40.45085, -7.606501), (26.304045, -41.93353, -7.0481477), (26.304045, -41.93353, -7.0481477), (28.387848, -40.45085, -7.606501), (28.747036, -40.45085, -6.110371), (26.636868, -41.93353, -5.661841), (26.636868, -41.93353, -5.661841), (28.747036, -40.45085, -6.110371), (29.027431, -40.45085, -4.5974936), (26.89668, -41.93353, -4.260016), (26.89668, -41.93353, -4.260016), (29.027431, -40.45085, -4.5974936), (29.228266, -40.45085, -3.0720146), (27.082773, -41.93353, -2.846514), (27.082773, -41.93353, -2.846514), (29.228266, -40.45085, -3.0720146), (29.348986, -40.45085, -1.5381151), (27.194632, -41.93353, -1.4252102), (27.194632, -41.93353, -1.4252102), (29.348986, -40.45085, -1.5381151), (29.389263, -40.45085, 0), (27.231953, -41.93353, 0), (29.389263, -40.45085, 0), (31.466019, -38.8573, 0), (31.422897, -38.8573, 1.6468042), (29.348986, -40.45085, 1.5381151), (29.348986, -40.45085, 1.5381151), (31.422897, -38.8573, 1.6468042), (31.293646, -38.8573, 3.2890947), (29.228266, -40.45085, 3.0720146), (29.228266, -40.45085, 3.0720146), (31.293646, -38.8573, 3.2890947), (31.07862, -38.8573, 4.92237), (29.027431, -40.45085, 4.5974936), (29.027431, -40.45085, 4.5974936), (31.07862, -38.8573, 4.92237), (30.778412, -38.8573, 6.5421534), (28.747036, -40.45085, 6.110371), (28.747036, -40.45085, 6.110371), (30.778412, -38.8573, 6.5421534), (30.39384, -38.8573, 8.144005), (28.387848, -40.45085, 7.606501), (28.387848, -40.45085, 7.606501), (30.39384, -38.8573, 8.144005), (29.925962, -38.8573, 9.723535), (27.95085, -40.45085, 9.081781), (27.95085, -40.45085, 9.081781), (29.925962, -38.8573, 9.723535), (29.37606, -38.8573, 11.276413), (27.43724, -40.45085, 10.532169), (27.43724, -40.45085, 10.532169), (29.37606, -38.8573, 11.276413), (28.74564, -38.8573, 12.798383), (26.848427, -40.45085, 11.95369), (26.848427, -40.45085, 11.95369), (28.74564, -38.8573, 12.798383), (28.036428, -38.8573, 14.285274), (26.186026, -40.45085, 13.342446), (26.186026, -40.45085, 13.342446), (28.036428, -38.8573, 14.285274), (27.250372, -38.8573, 15.733009), (25.451847, -40.45085, 14.694632), (25.451847, -40.45085, 14.694632), (27.250372, -38.8573, 15.733009), (26.389624, -38.8573, 17.137623), (24.64791, -40.45085, 16.00654), (24.64791, -40.45085, 16.00654), (26.389624, -38.8573, 17.137623), (25.456545, -38.8573, 18.495262), (23.776413, -40.45085, 17.274574), (23.776413, -40.45085, 17.274574), (25.456545, -38.8573, 18.495262), (24.45369, -38.8573, 19.802208), (22.839746, -40.45085, 18.495262), (22.839746, -40.45085, 18.495262), (24.45369, -38.8573, 19.802208), (23.38381, -38.8573, 21.054876), (21.840479, -40.45085, 19.665255), (21.840479, -40.45085, 19.665255), (23.38381, -38.8573, 21.054876), (22.249836, -38.8573, 22.249836), (20.781347, -40.45085, 20.781347), (20.781347, -40.45085, 20.781347), (22.249836, -38.8573, 22.249836), (21.054876, -38.8573, 23.38381), (19.665255, -40.45085, 21.840479), (19.665255, -40.45085, 21.840479), (21.054876, -38.8573, 23.38381), (19.802208, -38.8573, 24.45369), (18.495262, -40.45085, 22.839746), (18.495262, -40.45085, 22.839746), (19.802208, -38.8573, 24.45369), (18.495262, -38.8573, 25.456545), (17.274574, -40.45085, 23.776413), (17.274574, -40.45085, 23.776413), (18.495262, -38.8573, 25.456545), (17.137623, -38.8573, 26.389624), (16.00654, -40.45085, 24.64791), (16.00654, -40.45085, 24.64791), (17.137623, -38.8573, 26.389624), (15.733009, -38.8573, 27.250372), (14.694632, -40.45085, 25.451847), (14.694632, -40.45085, 25.451847), (15.733009, -38.8573, 27.250372), (14.285274, -38.8573, 28.036428), (13.342446, -40.45085, 26.186026), (13.342446, -40.45085, 26.186026), (14.285274, -38.8573, 28.036428), (12.798383, -38.8573, 28.74564), (11.95369, -40.45085, 26.848427), (11.95369, -40.45085, 26.848427), (12.798383, -38.8573, 28.74564), (11.276413, -38.8573, 29.37606), (10.532169, -40.45085, 27.43724), (10.532169, -40.45085, 27.43724), (11.276413, -38.8573, 29.37606), (9.723535, -38.8573, 29.925962), (9.081781, -40.45085, 27.95085), (9.081781, -40.45085, 27.95085), (9.723535, -38.8573, 29.925962), (8.144005, -38.8573, 30.39384), (7.606501, -40.45085, 28.387848), (7.606501, -40.45085, 28.387848), (8.144005, -38.8573, 30.39384), (6.5421534, -38.8573, 30.778412), (6.110371, -40.45085, 28.747036), (6.110371, -40.45085, 28.747036), (6.5421534, -38.8573, 30.778412), (4.92237, -38.8573, 31.07862), (4.5974936, -40.45085, 29.027431), (4.5974936, -40.45085, 29.027431), (4.92237, -38.8573, 31.07862), (3.2890947, -38.8573, 31.293646), (3.0720146, -40.45085, 29.228266), (3.0720146, -40.45085, 29.228266), (3.2890947, -38.8573, 31.293646), (1.6468042, -38.8573, 31.422897), (1.5381151, -40.45085, 29.348986), (1.5381151, -40.45085, 29.348986), (1.6468042, -38.8573, 31.422897), (1.926738e-15, -38.8573, 31.466019), (1.7995734e-15, -40.45085, 29.389263), (1.7995734e-15, -40.45085, 29.389263), (1.926738e-15, -38.8573, 31.466019), (-1.6468042, -38.8573, 31.422897), (-1.5381151, -40.45085, 29.348986), (-1.5381151, -40.45085, 29.348986), (-1.6468042, -38.8573, 31.422897), (-3.2890947, -38.8573, 31.293646), (-3.0720146, -40.45085, 29.228266), (-3.0720146, -40.45085, 29.228266), (-3.2890947, -38.8573, 31.293646), (-4.92237, -38.8573, 31.07862), (-4.5974936, -40.45085, 29.027431), (-4.5974936, -40.45085, 29.027431), (-4.92237, -38.8573, 31.07862), (-6.5421534, -38.8573, 30.778412), (-6.110371, -40.45085, 28.747036), (-6.110371, -40.45085, 28.747036), (-6.5421534, -38.8573, 30.778412), (-8.144005, -38.8573, 30.39384), (-7.606501, -40.45085, 28.387848), (-7.606501, -40.45085, 28.387848), (-8.144005, -38.8573, 30.39384), (-9.723535, -38.8573, 29.925962), (-9.081781, -40.45085, 27.95085), (-9.081781, -40.45085, 27.95085), (-9.723535, -38.8573, 29.925962), (-11.276413, -38.8573, 29.37606), (-10.532169, -40.45085, 27.43724), (-10.532169, -40.45085, 27.43724), (-11.276413, -38.8573, 29.37606), (-12.798383, -38.8573, 28.74564), (-11.95369, -40.45085, 26.848427), (-11.95369, -40.45085, 26.848427), (-12.798383, -38.8573, 28.74564), (-14.285274, -38.8573, 28.036428), (-13.342446, -40.45085, 26.186026), (-13.342446, -40.45085, 26.186026), (-14.285274, -38.8573, 28.036428), (-15.733009, -38.8573, 27.250372), (-14.694632, -40.45085, 25.451847), (-14.694632, -40.45085, 25.451847), (-15.733009, -38.8573, 27.250372), (-17.137623, -38.8573, 26.389624), (-16.00654, -40.45085, 24.64791), (-16.00654, -40.45085, 24.64791), (-17.137623, -38.8573, 26.389624), (-18.495262, -38.8573, 25.456545), (-17.274574, -40.45085, 23.776413), (-17.274574, -40.45085, 23.776413), (-18.495262, -38.8573, 25.456545), (-19.802208, -38.8573, 24.45369), (-18.495262, -40.45085, 22.839746), (-18.495262, -40.45085, 22.839746), (-19.802208, -38.8573, 24.45369), (-21.054876, -38.8573, 23.38381), (-19.665255, -40.45085, 21.840479), (-19.665255, -40.45085, 21.840479), (-21.054876, -38.8573, 23.38381), (-22.249836, -38.8573, 22.249836), (-20.781347, -40.45085, 20.781347), (-20.781347, -40.45085, 20.781347), (-22.249836, -38.8573, 22.249836), (-23.38381, -38.8573, 21.054876), (-21.840479, -40.45085, 19.665255), (-21.840479, -40.45085, 19.665255), (-23.38381, -38.8573, 21.054876), (-24.45369, -38.8573, 19.802208), (-22.839746, -40.45085, 18.495262), (-22.839746, -40.45085, 18.495262), (-24.45369, -38.8573, 19.802208), (-25.456545, -38.8573, 18.495262), (-23.776413, -40.45085, 17.274574), (-23.776413, -40.45085, 17.274574), (-25.456545, -38.8573, 18.495262), (-26.389624, -38.8573, 17.137623), (-24.64791, -40.45085, 16.00654), (-24.64791, -40.45085, 16.00654), (-26.389624, -38.8573, 17.137623), (-27.250372, -38.8573, 15.733009), (-25.451847, -40.45085, 14.694632), (-25.451847, -40.45085, 14.694632), (-27.250372, -38.8573, 15.733009), (-28.036428, -38.8573, 14.285274), (-26.186026, -40.45085, 13.342446), (-26.186026, -40.45085, 13.342446), (-28.036428, -38.8573, 14.285274), (-28.74564, -38.8573, 12.798383), (-26.848427, -40.45085, 11.95369), (-26.848427, -40.45085, 11.95369), (-28.74564, -38.8573, 12.798383), (-29.37606, -38.8573, 11.276413), (-27.43724, -40.45085, 10.532169), (-27.43724, -40.45085, 10.532169), (-29.37606, -38.8573, 11.276413), (-29.925962, -38.8573, 9.723535), (-27.95085, -40.45085, 9.081781), (-27.95085, -40.45085, 9.081781), (-29.925962, -38.8573, 9.723535), (-30.39384, -38.8573, 8.144005), (-28.387848, -40.45085, 7.606501), (-28.387848, -40.45085, 7.606501), (-30.39384, -38.8573, 8.144005), (-30.778412, -38.8573, 6.5421534), (-28.747036, -40.45085, 6.110371), (-28.747036, -40.45085, 6.110371), (-30.778412, -38.8573, 6.5421534), (-31.07862, -38.8573, 4.92237), (-29.027431, -40.45085, 4.5974936), (-29.027431, -40.45085, 4.5974936), (-31.07862, -38.8573, 4.92237), (-31.293646, -38.8573, 3.2890947), (-29.228266, -40.45085, 3.0720146), (-29.228266, -40.45085, 3.0720146), (-31.293646, -38.8573, 3.2890947), (-31.422897, -38.8573, 1.6468042), (-29.348986, -40.45085, 1.5381151), (-29.348986, -40.45085, 1.5381151), (-31.422897, -38.8573, 1.6468042), (-31.466019, -38.8573, 3.853476e-15), (-29.389263, -40.45085, 3.5991468e-15), (-29.389263, -40.45085, 3.5991468e-15), (-31.466019, -38.8573, 3.853476e-15), (-31.422897, -38.8573, -1.6468042), (-29.348986, -40.45085, -1.5381151), (-29.348986, -40.45085, -1.5381151), (-31.422897, -38.8573, -1.6468042), (-31.293646, -38.8573, -3.2890947), (-29.228266, -40.45085, -3.0720146), (-29.228266, -40.45085, -3.0720146), (-31.293646, -38.8573, -3.2890947), (-31.07862, -38.8573, -4.92237), (-29.027431, -40.45085, -4.5974936), (-29.027431, -40.45085, -4.5974936), (-31.07862, -38.8573, -4.92237), (-30.778412, -38.8573, -6.5421534), (-28.747036, -40.45085, -6.110371), (-28.747036, -40.45085, -6.110371), (-30.778412, -38.8573, -6.5421534), (-30.39384, -38.8573, -8.144005), (-28.387848, -40.45085, -7.606501), (-28.387848, -40.45085, -7.606501), (-30.39384, -38.8573, -8.144005), (-29.925962, -38.8573, -9.723535), (-27.95085, -40.45085, -9.081781), (-27.95085, -40.45085, -9.081781), (-29.925962, -38.8573, -9.723535), (-29.37606, -38.8573, -11.276413), (-27.43724, -40.45085, -10.532169), (-27.43724, -40.45085, -10.532169), (-29.37606, -38.8573, -11.276413), (-28.74564, -38.8573, -12.798383), (-26.848427, -40.45085, -11.95369), (-26.848427, -40.45085, -11.95369), (-28.74564, -38.8573, -12.798383), (-28.036428, -38.8573, -14.285274), (-26.186026, -40.45085, -13.342446), (-26.186026, -40.45085, -13.342446), (-28.036428, -38.8573, -14.285274), (-27.250372, -38.8573, -15.733009), (-25.451847, -40.45085, -14.694632), (-25.451847, -40.45085, -14.694632), (-27.250372, -38.8573, -15.733009), (-26.389624, -38.8573, -17.137623), (-24.64791, -40.45085, -16.00654), (-24.64791, -40.45085, -16.00654), (-26.389624, -38.8573, -17.137623), (-25.456545, -38.8573, -18.495262), (-23.776413, -40.45085, -17.274574), (-23.776413, -40.45085, -17.274574), (-25.456545, -38.8573, -18.495262), (-24.45369, -38.8573, -19.802208), (-22.839746, -40.45085, -18.495262), (-22.839746, -40.45085, -18.495262), (-24.45369, -38.8573, -19.802208), (-23.38381, -38.8573, -21.054876), (-21.840479, -40.45085, -19.665255), (-21.840479, -40.45085, -19.665255), (-23.38381, -38.8573, -21.054876), (-22.249836, -38.8573, -22.249836), (-20.781347, -40.45085, -20.781347), (-20.781347, -40.45085, -20.781347), (-22.249836, -38.8573, -22.249836), (-21.054876, -38.8573, -23.38381), (-19.665255, -40.45085, -21.840479), (-19.665255, -40.45085, -21.840479), (-21.054876, -38.8573, -23.38381), (-19.802208, -38.8573, -24.45369), (-18.495262, -40.45085, -22.839746), (-18.495262, -40.45085, -22.839746), (-19.802208, -38.8573, -24.45369), (-18.495262, -38.8573, -25.456545), (-17.274574, -40.45085, -23.776413), (-17.274574, -40.45085, -23.776413), (-18.495262, -38.8573, -25.456545), (-17.137623, -38.8573, -26.389624), (-16.00654, -40.45085, -24.64791), (-16.00654, -40.45085, -24.64791), (-17.137623, -38.8573, -26.389624), (-15.733009, -38.8573, -27.250372), (-14.694632, -40.45085, -25.451847), (-14.694632, -40.45085, -25.451847), (-15.733009, -38.8573, -27.250372), (-14.285274, -38.8573, -28.036428), (-13.342446, -40.45085, -26.186026), (-13.342446, -40.45085, -26.186026), (-14.285274, -38.8573, -28.036428), (-12.798383, -38.8573, -28.74564), (-11.95369, -40.45085, -26.848427), (-11.95369, -40.45085, -26.848427), (-12.798383, -38.8573, -28.74564), (-11.276413, -38.8573, -29.37606), (-10.532169, -40.45085, -27.43724), (-10.532169, -40.45085, -27.43724), (-11.276413, -38.8573, -29.37606), (-9.723535, -38.8573, -29.925962), (-9.081781, -40.45085, -27.95085), (-9.081781, -40.45085, -27.95085), (-9.723535, -38.8573, -29.925962), (-8.144005, -38.8573, -30.39384), (-7.606501, -40.45085, -28.387848), (-7.606501, -40.45085, -28.387848), (-8.144005, -38.8573, -30.39384), (-6.5421534, -38.8573, -30.778412), (-6.110371, -40.45085, -28.747036), (-6.110371, -40.45085, -28.747036), (-6.5421534, -38.8573, -30.778412), (-4.92237, -38.8573, -31.07862), (-4.5974936, -40.45085, -29.027431), (-4.5974936, -40.45085, -29.027431), (-4.92237, -38.8573, -31.07862), (-3.2890947, -38.8573, -31.293646), (-3.0720146, -40.45085, -29.228266), (-3.0720146, -40.45085, -29.228266), (-3.2890947, -38.8573, -31.293646), (-1.6468042, -38.8573, -31.422897), (-1.5381151, -40.45085, -29.348986), (-1.5381151, -40.45085, -29.348986), (-1.6468042, -38.8573, -31.422897), (-5.780214e-15, -38.8573, -31.466019), (-5.39872e-15, -40.45085, -29.389263), (-5.39872e-15, -40.45085, -29.389263), (-5.780214e-15, -38.8573, -31.466019), (1.6468042, -38.8573, -31.422897), (1.5381151, -40.45085, -29.348986), (1.5381151, -40.45085, -29.348986), (1.6468042, -38.8573, -31.422897), (3.2890947, -38.8573, -31.293646), (3.0720146, -40.45085, -29.228266), (3.0720146, -40.45085, -29.228266), (3.2890947, -38.8573, -31.293646), (4.92237, -38.8573, -31.07862), (4.5974936, -40.45085, -29.027431), (4.5974936, -40.45085, -29.027431), (4.92237, -38.8573, -31.07862), (6.5421534, -38.8573, -30.778412), (6.110371, -40.45085, -28.747036), (6.110371, -40.45085, -28.747036), (6.5421534, -38.8573, -30.778412), (8.144005, -38.8573, -30.39384), (7.606501, -40.45085, -28.387848), (7.606501, -40.45085, -28.387848), (8.144005, -38.8573, -30.39384), (9.723535, -38.8573, -29.925962), (9.081781, -40.45085, -27.95085), (9.081781, -40.45085, -27.95085), (9.723535, -38.8573, -29.925962), (11.276413, -38.8573, -29.37606), (10.532169, -40.45085, -27.43724), (10.532169, -40.45085, -27.43724), (11.276413, -38.8573, -29.37606), (12.798383, -38.8573, -28.74564), (11.95369, -40.45085, -26.848427), (11.95369, -40.45085, -26.848427), (12.798383, -38.8573, -28.74564), (14.285274, -38.8573, -28.036428), (13.342446, -40.45085, -26.186026), (13.342446, -40.45085, -26.186026), (14.285274, -38.8573, -28.036428), (15.733009, -38.8573, -27.250372), (14.694632, -40.45085, -25.451847), (14.694632, -40.45085, -25.451847), (15.733009, -38.8573, -27.250372), (17.137623, -38.8573, -26.389624), (16.00654, -40.45085, -24.64791), (16.00654, -40.45085, -24.64791), (17.137623, -38.8573, -26.389624), (18.495262, -38.8573, -25.456545), (17.274574, -40.45085, -23.776413), (17.274574, -40.45085, -23.776413), (18.495262, -38.8573, -25.456545), (19.802208, -38.8573, -24.45369), (18.495262, -40.45085, -22.839746), (18.495262, -40.45085, -22.839746), (19.802208, -38.8573, -24.45369), (21.054876, -38.8573, -23.38381), (19.665255, -40.45085, -21.840479), (19.665255, -40.45085, -21.840479), (21.054876, -38.8573, -23.38381), (22.249836, -38.8573, -22.249836), (20.781347, -40.45085, -20.781347), (20.781347, -40.45085, -20.781347), (22.249836, -38.8573, -22.249836), (23.38381, -38.8573, -21.054876), (21.840479, -40.45085, -19.665255), (21.840479, -40.45085, -19.665255), (23.38381, -38.8573, -21.054876), (24.45369, -38.8573, -19.802208), (22.839746, -40.45085, -18.495262), (22.839746, -40.45085, -18.495262), (24.45369, -38.8573, -19.802208), (25.456545, -38.8573, -18.495262), (23.776413, -40.45085, -17.274574), (23.776413, -40.45085, -17.274574), (25.456545, -38.8573, -18.495262), (26.389624, -38.8573, -17.137623), (24.64791, -40.45085, -16.00654), (24.64791, -40.45085, -16.00654), (26.389624, -38.8573, -17.137623), (27.250372, -38.8573, -15.733009), (25.451847, -40.45085, -14.694632), (25.451847, -40.45085, -14.694632), (27.250372, -38.8573, -15.733009), (28.036428, -38.8573, -14.285274), (26.186026, -40.45085, -13.342446), (26.186026, -40.45085, -13.342446), (28.036428, -38.8573, -14.285274), (28.74564, -38.8573, -12.798383), (26.848427, -40.45085, -11.95369), (26.848427, -40.45085, -11.95369), (28.74564, -38.8573, -12.798383), (29.37606, -38.8573, -11.276413), (27.43724, -40.45085, -10.532169), (27.43724, -40.45085, -10.532169), (29.37606, -38.8573, -11.276413), (29.925962, -38.8573, -9.723535), (27.95085, -40.45085, -9.081781), (27.95085, -40.45085, -9.081781), (29.925962, -38.8573, -9.723535), (30.39384, -38.8573, -8.144005), (28.387848, -40.45085, -7.606501), (28.387848, -40.45085, -7.606501), (30.39384, -38.8573, -8.144005), (30.778412, -38.8573, -6.5421534), (28.747036, -40.45085, -6.110371), (28.747036, -40.45085, -6.110371), (30.778412, -38.8573, -6.5421534), (31.07862, -38.8573, -4.92237), (29.027431, -40.45085, -4.5974936), (29.027431, -40.45085, -4.5974936), (31.07862, -38.8573, -4.92237), (31.293646, -38.8573, -3.2890947), (29.228266, -40.45085, -3.0720146), (29.228266, -40.45085, -3.0720146), (31.293646, -38.8573, -3.2890947), (31.422897, -38.8573, -1.6468042), (29.348986, -40.45085, -1.5381151), (29.348986, -40.45085, -1.5381151), (31.422897, -38.8573, -1.6468042), (31.466019, -38.8573, 0), (29.389263, -40.45085, 0), (31.466019, -38.8573, 0), (33.45653, -37.15724, 0), (33.41068, -37.15724, 1.7509795), (31.422897, -38.8573, 1.6468042), (31.422897, -38.8573, 1.6468042), (33.41068, -37.15724, 1.7509795), (33.27325, -37.15724, 3.4971597), (31.293646, -38.8573, 3.2890947), (31.293646, -38.8573, 3.2890947), (33.27325, -37.15724, 3.4971597), (33.044624, -37.15724, 5.2337546), (31.07862, -38.8573, 4.92237), (31.07862, -38.8573, 4.92237), (33.044624, -37.15724, 5.2337546), (32.725426, -37.15724, 6.9560037), (30.778412, -38.8573, 6.5421534), (30.778412, -38.8573, 6.5421534), (32.725426, -37.15724, 6.9560037), (32.31653, -37.15724, 8.659187), (30.39384, -38.8573, 8.144005), (30.39384, -38.8573, 8.144005), (32.31653, -37.15724, 8.659187), (31.819052, -37.15724, 10.338636), (29.925962, -38.8573, 9.723535), (29.925962, -38.8573, 9.723535), (31.819052, -37.15724, 10.338636), (31.234362, -37.15724, 11.989748), (29.37606, -38.8573, 11.276413), (29.37606, -38.8573, 11.276413), (31.234362, -37.15724, 11.989748), (30.564062, -37.15724, 13.607997), (28.74564, -38.8573, 12.798383), (28.74564, -38.8573, 12.798383), (30.564062, -37.15724, 13.607997), (29.809986, -37.15724, 15.188947), (28.036428, -38.8573, 14.285274), (28.036428, -38.8573, 14.285274), (29.809986, -37.15724, 15.188947), (28.974205, -37.15724, 16.728266), (27.250372, -38.8573, 15.733009), (27.250372, -38.8573, 15.733009), (28.974205, -37.15724, 16.728266), (28.059008, -37.15724, 18.221733), (26.389624, -38.8573, 17.137623), (26.389624, -38.8573, 17.137623), (28.059008, -37.15724, 18.221733), (27.066902, -37.15724, 19.665255), (25.456545, -38.8573, 18.495262), (25.456545, -38.8573, 18.495262), (27.066902, -37.15724, 19.665255), (26.000607, -37.15724, 21.054876), (24.45369, -38.8573, 19.802208), (24.45369, -38.8573, 19.802208), (26.000607, -37.15724, 21.054876), (24.863047, -37.15724, 22.38679), (23.38381, -38.8573, 21.054876), (23.38381, -38.8573, 21.054876), (24.863047, -37.15724, 22.38679), (23.65734, -37.15724, 23.65734), (22.249836, -38.8573, 22.249836), (22.249836, -38.8573, 22.249836), (23.65734, -37.15724, 23.65734), (22.38679, -37.15724, 24.863047), (21.054876, -38.8573, 23.38381), (21.054876, -38.8573, 23.38381), (22.38679, -37.15724, 24.863047), (21.054876, -37.15724, 26.000607), (19.802208, -38.8573, 24.45369), (19.802208, -38.8573, 24.45369), (21.054876, -37.15724, 26.000607), (19.665255, -37.15724, 27.066902), (18.495262, -38.8573, 25.456545), (18.495262, -38.8573, 25.456545), (19.665255, -37.15724, 27.066902), (18.221733, -37.15724, 28.059008), (17.137623, -38.8573, 26.389624), (17.137623, -38.8573, 26.389624), (18.221733, -37.15724, 28.059008), (16.728266, -37.15724, 28.974205), (15.733009, -38.8573, 27.250372), (15.733009, -38.8573, 27.250372), (16.728266, -37.15724, 28.974205), (15.188947, -37.15724, 29.809986), (14.285274, -38.8573, 28.036428), (14.285274, -38.8573, 28.036428), (15.188947, -37.15724, 29.809986), (13.607997, -37.15724, 30.564062), (12.798383, -38.8573, 28.74564), (12.798383, -38.8573, 28.74564), (13.607997, -37.15724, 30.564062), (11.989748, -37.15724, 31.234362), (11.276413, -38.8573, 29.37606), (11.276413, -38.8573, 29.37606), (11.989748, -37.15724, 31.234362), (10.338636, -37.15724, 31.819052), (9.723535, -38.8573, 29.925962), (9.723535, -38.8573, 29.925962), (10.338636, -37.15724, 31.819052), (8.659187, -37.15724, 32.31653), (8.144005, -38.8573, 30.39384), (8.144005, -38.8573, 30.39384), (8.659187, -37.15724, 32.31653), (6.9560037, -37.15724, 32.725426), (6.5421534, -38.8573, 30.778412), (6.5421534, -38.8573, 30.778412), (6.9560037, -37.15724, 32.725426), (5.2337546, -37.15724, 33.044624), (4.92237, -38.8573, 31.07862), (4.92237, -38.8573, 31.07862), (5.2337546, -37.15724, 33.044624), (3.4971597, -37.15724, 33.27325), (3.2890947, -38.8573, 31.293646), (3.2890947, -38.8573, 31.293646), (3.4971597, -37.15724, 33.27325), (1.7509795, -37.15724, 33.41068), (1.6468042, -38.8573, 31.422897), (1.6468042, -38.8573, 31.422897), (1.7509795, -37.15724, 33.41068), (2.0486216e-15, -37.15724, 33.45653), (1.926738e-15, -38.8573, 31.466019), (1.926738e-15, -38.8573, 31.466019), (2.0486216e-15, -37.15724, 33.45653), (-1.7509795, -37.15724, 33.41068), (-1.6468042, -38.8573, 31.422897), (-1.6468042, -38.8573, 31.422897), (-1.7509795, -37.15724, 33.41068), (-3.4971597, -37.15724, 33.27325), (-3.2890947, -38.8573, 31.293646), (-3.2890947, -38.8573, 31.293646), (-3.4971597, -37.15724, 33.27325), (-5.2337546, -37.15724, 33.044624), (-4.92237, -38.8573, 31.07862), (-4.92237, -38.8573, 31.07862), (-5.2337546, -37.15724, 33.044624), (-6.9560037, -37.15724, 32.725426), (-6.5421534, -38.8573, 30.778412), (-6.5421534, -38.8573, 30.778412), (-6.9560037, -37.15724, 32.725426), (-8.659187, -37.15724, 32.31653), (-8.144005, -38.8573, 30.39384), (-8.144005, -38.8573, 30.39384), (-8.659187, -37.15724, 32.31653), (-10.338636, -37.15724, 31.819052), (-9.723535, -38.8573, 29.925962), (-9.723535, -38.8573, 29.925962), (-10.338636, -37.15724, 31.819052), (-11.989748, -37.15724, 31.234362), (-11.276413, -38.8573, 29.37606), (-11.276413, -38.8573, 29.37606), (-11.989748, -37.15724, 31.234362), (-13.607997, -37.15724, 30.564062), (-12.798383, -38.8573, 28.74564), (-12.798383, -38.8573, 28.74564), (-13.607997, -37.15724, 30.564062), (-15.188947, -37.15724, 29.809986), (-14.285274, -38.8573, 28.036428), (-14.285274, -38.8573, 28.036428), (-15.188947, -37.15724, 29.809986), (-16.728266, -37.15724, 28.974205), (-15.733009, -38.8573, 27.250372), (-15.733009, -38.8573, 27.250372), (-16.728266, -37.15724, 28.974205), (-18.221733, -37.15724, 28.059008), (-17.137623, -38.8573, 26.389624), (-17.137623, -38.8573, 26.389624), (-18.221733, -37.15724, 28.059008), (-19.665255, -37.15724, 27.066902), (-18.495262, -38.8573, 25.456545), (-18.495262, -38.8573, 25.456545), (-19.665255, -37.15724, 27.066902), (-21.054876, -37.15724, 26.000607), (-19.802208, -38.8573, 24.45369), (-19.802208, -38.8573, 24.45369), (-21.054876, -37.15724, 26.000607), (-22.38679, -37.15724, 24.863047), (-21.054876, -38.8573, 23.38381), (-21.054876, -38.8573, 23.38381), (-22.38679, -37.15724, 24.863047), (-23.65734, -37.15724, 23.65734), (-22.249836, -38.8573, 22.249836), (-22.249836, -38.8573, 22.249836), (-23.65734, -37.15724, 23.65734), (-24.863047, -37.15724, 22.38679), (-23.38381, -38.8573, 21.054876), (-23.38381, -38.8573, 21.054876), (-24.863047, -37.15724, 22.38679), (-26.000607, -37.15724, 21.054876), (-24.45369, -38.8573, 19.802208), (-24.45369, -38.8573, 19.802208), (-26.000607, -37.15724, 21.054876), (-27.066902, -37.15724, 19.665255), (-25.456545, -38.8573, 18.495262), (-25.456545, -38.8573, 18.495262), (-27.066902, -37.15724, 19.665255), (-28.059008, -37.15724, 18.221733), (-26.389624, -38.8573, 17.137623), (-26.389624, -38.8573, 17.137623), (-28.059008, -37.15724, 18.221733), (-28.974205, -37.15724, 16.728266), (-27.250372, -38.8573, 15.733009), (-27.250372, -38.8573, 15.733009), (-28.974205, -37.15724, 16.728266), (-29.809986, -37.15724, 15.188947), (-28.036428, -38.8573, 14.285274), (-28.036428, -38.8573, 14.285274), (-29.809986, -37.15724, 15.188947), (-30.564062, -37.15724, 13.607997), (-28.74564, -38.8573, 12.798383), (-28.74564, -38.8573, 12.798383), (-30.564062, -37.15724, 13.607997), (-31.234362, -37.15724, 11.989748), (-29.37606, -38.8573, 11.276413), (-29.37606, -38.8573, 11.276413), (-31.234362, -37.15724, 11.989748), (-31.819052, -37.15724, 10.338636), (-29.925962, -38.8573, 9.723535), (-29.925962, -38.8573, 9.723535), (-31.819052, -37.15724, 10.338636), (-32.31653, -37.15724, 8.659187), (-30.39384, -38.8573, 8.144005), (-30.39384, -38.8573, 8.144005), (-32.31653, -37.15724, 8.659187), (-32.725426, -37.15724, 6.9560037), (-30.778412, -38.8573, 6.5421534), (-30.778412, -38.8573, 6.5421534), (-32.725426, -37.15724, 6.9560037), (-33.044624, -37.15724, 5.2337546), (-31.07862, -38.8573, 4.92237), (-31.07862, -38.8573, 4.92237), (-33.044624, -37.15724, 5.2337546), (-33.27325, -37.15724, 3.4971597), (-31.293646, -38.8573, 3.2890947), (-31.293646, -38.8573, 3.2890947), (-33.27325, -37.15724, 3.4971597), (-33.41068, -37.15724, 1.7509795), (-31.422897, -38.8573, 1.6468042), (-31.422897, -38.8573, 1.6468042), (-33.41068, -37.15724, 1.7509795), (-33.45653, -37.15724, 4.097243e-15), (-31.466019, -38.8573, 3.853476e-15), (-31.466019, -38.8573, 3.853476e-15), (-33.45653, -37.15724, 4.097243e-15), (-33.41068, -37.15724, -1.7509795), (-31.422897, -38.8573, -1.6468042), (-31.422897, -38.8573, -1.6468042), (-33.41068, -37.15724, -1.7509795), (-33.27325, -37.15724, -3.4971597), (-31.293646, -38.8573, -3.2890947), (-31.293646, -38.8573, -3.2890947), (-33.27325, -37.15724, -3.4971597), (-33.044624, -37.15724, -5.2337546), (-31.07862, -38.8573, -4.92237), (-31.07862, -38.8573, -4.92237), (-33.044624, -37.15724, -5.2337546), (-32.725426, -37.15724, -6.9560037), (-30.778412, -38.8573, -6.5421534), (-30.778412, -38.8573, -6.5421534), (-32.725426, -37.15724, -6.9560037), (-32.31653, -37.15724, -8.659187), (-30.39384, -38.8573, -8.144005), (-30.39384, -38.8573, -8.144005), (-32.31653, -37.15724, -8.659187), (-31.819052, -37.15724, -10.338636), (-29.925962, -38.8573, -9.723535), (-29.925962, -38.8573, -9.723535), (-31.819052, -37.15724, -10.338636), (-31.234362, -37.15724, -11.989748), (-29.37606, -38.8573, -11.276413), (-29.37606, -38.8573, -11.276413), (-31.234362, -37.15724, -11.989748), (-30.564062, -37.15724, -13.607997), (-28.74564, -38.8573, -12.798383), (-28.74564, -38.8573, -12.798383), (-30.564062, -37.15724, -13.607997), (-29.809986, -37.15724, -15.188947), (-28.036428, -38.8573, -14.285274), (-28.036428, -38.8573, -14.285274), (-29.809986, -37.15724, -15.188947), (-28.974205, -37.15724, -16.728266), (-27.250372, -38.8573, -15.733009), (-27.250372, -38.8573, -15.733009), (-28.974205, -37.15724, -16.728266), (-28.059008, -37.15724, -18.221733), (-26.389624, -38.8573, -17.137623), (-26.389624, -38.8573, -17.137623), (-28.059008, -37.15724, -18.221733), (-27.066902, -37.15724, -19.665255), (-25.456545, -38.8573, -18.495262), (-25.456545, -38.8573, -18.495262), (-27.066902, -37.15724, -19.665255), (-26.000607, -37.15724, -21.054876), (-24.45369, -38.8573, -19.802208), (-24.45369, -38.8573, -19.802208), (-26.000607, -37.15724, -21.054876), (-24.863047, -37.15724, -22.38679), (-23.38381, -38.8573, -21.054876), (-23.38381, -38.8573, -21.054876), (-24.863047, -37.15724, -22.38679), (-23.65734, -37.15724, -23.65734), (-22.249836, -38.8573, -22.249836), (-22.249836, -38.8573, -22.249836), (-23.65734, -37.15724, -23.65734), (-22.38679, -37.15724, -24.863047), (-21.054876, -38.8573, -23.38381), (-21.054876, -38.8573, -23.38381), (-22.38679, -37.15724, -24.863047), (-21.054876, -37.15724, -26.000607), (-19.802208, -38.8573, -24.45369), (-19.802208, -38.8573, -24.45369), (-21.054876, -37.15724, -26.000607), (-19.665255, -37.15724, -27.066902), (-18.495262, -38.8573, -25.456545), (-18.495262, -38.8573, -25.456545), (-19.665255, -37.15724, -27.066902), (-18.221733, -37.15724, -28.059008), (-17.137623, -38.8573, -26.389624), (-17.137623, -38.8573, -26.389624), (-18.221733, -37.15724, -28.059008), (-16.728266, -37.15724, -28.974205), (-15.733009, -38.8573, -27.250372), (-15.733009, -38.8573, -27.250372), (-16.728266, -37.15724, -28.974205), (-15.188947, -37.15724, -29.809986), (-14.285274, -38.8573, -28.036428), (-14.285274, -38.8573, -28.036428), (-15.188947, -37.15724, -29.809986), (-13.607997, -37.15724, -30.564062), (-12.798383, -38.8573, -28.74564), (-12.798383, -38.8573, -28.74564), (-13.607997, -37.15724, -30.564062), (-11.989748, -37.15724, -31.234362), (-11.276413, -38.8573, -29.37606), (-11.276413, -38.8573, -29.37606), (-11.989748, -37.15724, -31.234362), (-10.338636, -37.15724, -31.819052), (-9.723535, -38.8573, -29.925962), (-9.723535, -38.8573, -29.925962), (-10.338636, -37.15724, -31.819052), (-8.659187, -37.15724, -32.31653), (-8.144005, -38.8573, -30.39384), (-8.144005, -38.8573, -30.39384), (-8.659187, -37.15724, -32.31653), (-6.9560037, -37.15724, -32.725426), (-6.5421534, -38.8573, -30.778412), (-6.5421534, -38.8573, -30.778412), (-6.9560037, -37.15724, -32.725426), (-5.2337546, -37.15724, -33.044624), (-4.92237, -38.8573, -31.07862), (-4.92237, -38.8573, -31.07862), (-5.2337546, -37.15724, -33.044624), (-3.4971597, -37.15724, -33.27325), (-3.2890947, -38.8573, -31.293646), (-3.2890947, -38.8573, -31.293646), (-3.4971597, -37.15724, -33.27325), (-1.7509795, -37.15724, -33.41068), (-1.6468042, -38.8573, -31.422897), (-1.6468042, -38.8573, -31.422897), (-1.7509795, -37.15724, -33.41068), (-6.145865e-15, -37.15724, -33.45653), (-5.780214e-15, -38.8573, -31.466019), (-5.780214e-15, -38.8573, -31.466019), (-6.145865e-15, -37.15724, -33.45653), (1.7509795, -37.15724, -33.41068), (1.6468042, -38.8573, -31.422897), (1.6468042, -38.8573, -31.422897), (1.7509795, -37.15724, -33.41068), (3.4971597, -37.15724, -33.27325), (3.2890947, -38.8573, -31.293646), (3.2890947, -38.8573, -31.293646), (3.4971597, -37.15724, -33.27325), (5.2337546, -37.15724, -33.044624), (4.92237, -38.8573, -31.07862), (4.92237, -38.8573, -31.07862), (5.2337546, -37.15724, -33.044624), (6.9560037, -37.15724, -32.725426), (6.5421534, -38.8573, -30.778412), (6.5421534, -38.8573, -30.778412), (6.9560037, -37.15724, -32.725426), (8.659187, -37.15724, -32.31653), (8.144005, -38.8573, -30.39384), (8.144005, -38.8573, -30.39384), (8.659187, -37.15724, -32.31653), (10.338636, -37.15724, -31.819052), (9.723535, -38.8573, -29.925962), (9.723535, -38.8573, -29.925962), (10.338636, -37.15724, -31.819052), (11.989748, -37.15724, -31.234362), (11.276413, -38.8573, -29.37606), (11.276413, -38.8573, -29.37606), (11.989748, -37.15724, -31.234362), (13.607997, -37.15724, -30.564062), (12.798383, -38.8573, -28.74564), (12.798383, -38.8573, -28.74564), (13.607997, -37.15724, -30.564062), (15.188947, -37.15724, -29.809986), (14.285274, -38.8573, -28.036428), (14.285274, -38.8573, -28.036428), (15.188947, -37.15724, -29.809986), (16.728266, -37.15724, -28.974205), (15.733009, -38.8573, -27.250372), (15.733009, -38.8573, -27.250372), (16.728266, -37.15724, -28.974205), (18.221733, -37.15724, -28.059008), (17.137623, -38.8573, -26.389624), (17.137623, -38.8573, -26.389624), (18.221733, -37.15724, -28.059008), (19.665255, -37.15724, -27.066902), (18.495262, -38.8573, -25.456545), (18.495262, -38.8573, -25.456545), (19.665255, -37.15724, -27.066902), (21.054876, -37.15724, -26.000607), (19.802208, -38.8573, -24.45369), (19.802208, -38.8573, -24.45369), (21.054876, -37.15724, -26.000607), (22.38679, -37.15724, -24.863047), (21.054876, -38.8573, -23.38381), (21.054876, -38.8573, -23.38381), (22.38679, -37.15724, -24.863047), (23.65734, -37.15724, -23.65734), (22.249836, -38.8573, -22.249836), (22.249836, -38.8573, -22.249836), (23.65734, -37.15724, -23.65734), (24.863047, -37.15724, -22.38679), (23.38381, -38.8573, -21.054876), (23.38381, -38.8573, -21.054876), (24.863047, -37.15724, -22.38679), (26.000607, -37.15724, -21.054876), (24.45369, -38.8573, -19.802208), (24.45369, -38.8573, -19.802208), (26.000607, -37.15724, -21.054876), (27.066902, -37.15724, -19.665255), (25.456545, -38.8573, -18.495262), (25.456545, -38.8573, -18.495262), (27.066902, -37.15724, -19.665255), (28.059008, -37.15724, -18.221733), (26.389624, -38.8573, -17.137623), (26.389624, -38.8573, -17.137623), (28.059008, -37.15724, -18.221733), (28.974205, -37.15724, -16.728266), (27.250372, -38.8573, -15.733009), (27.250372, -38.8573, -15.733009), (28.974205, -37.15724, -16.728266), (29.809986, -37.15724, -15.188947), (28.036428, -38.8573, -14.285274), (28.036428, -38.8573, -14.285274), (29.809986, -37.15724, -15.188947), (30.564062, -37.15724, -13.607997), (28.74564, -38.8573, -12.798383), (28.74564, -38.8573, -12.798383), (30.564062, -37.15724, -13.607997), (31.234362, -37.15724, -11.989748), (29.37606, -38.8573, -11.276413), (29.37606, -38.8573, -11.276413), (31.234362, -37.15724, -11.989748), (31.819052, -37.15724, -10.338636), (29.925962, -38.8573, -9.723535), (29.925962, -38.8573, -9.723535), (31.819052, -37.15724, -10.338636), (32.31653, -37.15724, -8.659187), (30.39384, -38.8573, -8.144005), (30.39384, -38.8573, -8.144005), (32.31653, -37.15724, -8.659187), (32.725426, -37.15724, -6.9560037), (30.778412, -38.8573, -6.5421534), (30.778412, -38.8573, -6.5421534), (32.725426, -37.15724, -6.9560037), (33.044624, -37.15724, -5.2337546), (31.07862, -38.8573, -4.92237), (31.07862, -38.8573, -4.92237), (33.044624, -37.15724, -5.2337546), (33.27325, -37.15724, -3.4971597), (31.293646, -38.8573, -3.2890947), (31.293646, -38.8573, -3.2890947), (33.27325, -37.15724, -3.4971597), (33.41068, -37.15724, -1.7509795), (31.422897, -38.8573, -1.6468042), (31.422897, -38.8573, -1.6468042), (33.41068, -37.15724, -1.7509795), (33.45653, -37.15724, 0), (31.466019, -38.8573, 0), (33.45653, -37.15724, 0), (35.35534, -35.35534, 0), (35.306885, -35.35534, 1.8503555), (33.41068, -37.15724, 1.7509795), (33.41068, -37.15724, 1.7509795), (35.306885, -35.35534, 1.8503555), (35.16166, -35.35534, 3.6956394), (33.27325, -37.15724, 3.4971597), (33.27325, -37.15724, 3.4971597), (35.16166, -35.35534, 3.6956394), (34.920055, -35.35534, 5.5307937), (33.044624, -37.15724, 5.2337546), (33.044624, -37.15724, 5.2337546), (34.920055, -35.35534, 5.5307937), (34.58274, -35.35534, 7.350788), (32.725426, -37.15724, 6.9560037), (32.725426, -37.15724, 6.9560037), (34.58274, -35.35534, 7.350788), (34.150635, -35.35534, 9.150635), (32.31653, -37.15724, 8.659187), (32.31653, -37.15724, 8.659187), (34.150635, -35.35534, 9.150635), (33.624924, -35.35534, 10.925401), (31.819052, -37.15724, 10.338636), (31.819052, -37.15724, 10.338636), (33.624924, -35.35534, 10.925401), (33.007053, -35.35534, 12.67022), (31.234362, -37.15724, 11.989748), (31.234362, -37.15724, 11.989748), (33.007053, -35.35534, 12.67022), (32.29871, -35.35534, 14.380312), (30.564062, -37.15724, 13.607997), (30.564062, -37.15724, 13.607997), (32.29871, -35.35534, 14.380312), (31.501839, -35.35534, 16.050987), (29.809986, -37.15724, 15.188947), (29.809986, -37.15724, 15.188947), (31.501839, -35.35534, 16.050987), (30.618622, -35.35534, 17.67767), (28.974205, -37.15724, 16.728266), (28.974205, -37.15724, 16.728266), (30.618622, -35.35534, 17.67767), (29.651482, -35.35534, 19.255898), (28.059008, -37.15724, 18.221733), (28.059008, -37.15724, 18.221733), (29.651482, -35.35534, 19.255898), (28.60307, -35.35534, 20.781347), (27.066902, -37.15724, 19.665255), (27.066902, -37.15724, 19.665255), (28.60307, -35.35534, 20.781347), (27.47626, -35.35534, 22.249836), (26.000607, -37.15724, 21.054876), (26.000607, -37.15724, 21.054876), (27.47626, -35.35534, 22.249836), (26.274137, -35.35534, 23.65734), (24.863047, -37.15724, 22.38679), (24.863047, -37.15724, 22.38679), (26.274137, -35.35534, 23.65734), (25, -35.35534, 25), (23.65734, -37.15724, 23.65734), (23.65734, -37.15724, 23.65734), (25, -35.35534, 25), (23.65734, -35.35534, 26.274137), (22.38679, -37.15724, 24.863047), (22.38679, -37.15724, 24.863047), (23.65734, -35.35534, 26.274137), (22.249836, -35.35534, 27.47626), (21.054876, -37.15724, 26.000607), (21.054876, -37.15724, 26.000607), (22.249836, -35.35534, 27.47626), (20.781347, -35.35534, 28.60307), (19.665255, -37.15724, 27.066902), (19.665255, -37.15724, 27.066902), (20.781347, -35.35534, 28.60307), (19.255898, -35.35534, 29.651482), (18.221733, -37.15724, 28.059008), (18.221733, -37.15724, 28.059008), (19.255898, -35.35534, 29.651482), (17.67767, -35.35534, 30.618622), (16.728266, -37.15724, 28.974205), (16.728266, -37.15724, 28.974205), (17.67767, -35.35534, 30.618622), (16.050987, -35.35534, 31.501839), (15.188947, -37.15724, 29.809986), (15.188947, -37.15724, 29.809986), (16.050987, -35.35534, 31.501839), (14.380312, -35.35534, 32.29871), (13.607997, -37.15724, 30.564062), (13.607997, -37.15724, 30.564062), (14.380312, -35.35534, 32.29871), (12.67022, -35.35534, 33.007053), (11.989748, -37.15724, 31.234362), (11.989748, -37.15724, 31.234362), (12.67022, -35.35534, 33.007053), (10.925401, -35.35534, 33.624924), (10.338636, -37.15724, 31.819052), (10.338636, -37.15724, 31.819052), (10.925401, -35.35534, 33.624924), (9.150635, -35.35534, 34.150635), (8.659187, -37.15724, 32.31653), (8.659187, -37.15724, 32.31653), (9.150635, -35.35534, 34.150635), (7.350788, -35.35534, 34.58274), (6.9560037, -37.15724, 32.725426), (6.9560037, -37.15724, 32.725426), (7.350788, -35.35534, 34.58274), (5.5307937, -35.35534, 34.920055), (5.2337546, -37.15724, 33.044624), (5.2337546, -37.15724, 33.044624), (5.5307937, -35.35534, 34.920055), (3.6956394, -35.35534, 35.16166), (3.4971597, -37.15724, 33.27325), (3.4971597, -37.15724, 33.27325), (3.6956394, -35.35534, 35.16166), (1.8503555, -35.35534, 35.306885), (1.7509795, -37.15724, 33.41068), (1.7509795, -37.15724, 33.41068), (1.8503555, -35.35534, 35.306885), (2.1648902e-15, -35.35534, 35.35534), (2.0486216e-15, -37.15724, 33.45653), (2.0486216e-15, -37.15724, 33.45653), (2.1648902e-15, -35.35534, 35.35534), (-1.8503555, -35.35534, 35.306885), (-1.7509795, -37.15724, 33.41068), (-1.7509795, -37.15724, 33.41068), (-1.8503555, -35.35534, 35.306885), (-3.6956394, -35.35534, 35.16166), (-3.4971597, -37.15724, 33.27325), (-3.4971597, -37.15724, 33.27325), (-3.6956394, -35.35534, 35.16166), (-5.5307937, -35.35534, 34.920055), (-5.2337546, -37.15724, 33.044624), (-5.2337546, -37.15724, 33.044624), (-5.5307937, -35.35534, 34.920055), (-7.350788, -35.35534, 34.58274), (-6.9560037, -37.15724, 32.725426), (-6.9560037, -37.15724, 32.725426), (-7.350788, -35.35534, 34.58274), (-9.150635, -35.35534, 34.150635), (-8.659187, -37.15724, 32.31653), (-8.659187, -37.15724, 32.31653), (-9.150635, -35.35534, 34.150635), (-10.925401, -35.35534, 33.624924), (-10.338636, -37.15724, 31.819052), (-10.338636, -37.15724, 31.819052), (-10.925401, -35.35534, 33.624924), (-12.67022, -35.35534, 33.007053), (-11.989748, -37.15724, 31.234362), (-11.989748, -37.15724, 31.234362), (-12.67022, -35.35534, 33.007053), (-14.380312, -35.35534, 32.29871), (-13.607997, -37.15724, 30.564062), (-13.607997, -37.15724, 30.564062), (-14.380312, -35.35534, 32.29871), (-16.050987, -35.35534, 31.501839), (-15.188947, -37.15724, 29.809986), (-15.188947, -37.15724, 29.809986), (-16.050987, -35.35534, 31.501839), (-17.67767, -35.35534, 30.618622), (-16.728266, -37.15724, 28.974205), (-16.728266, -37.15724, 28.974205), (-17.67767, -35.35534, 30.618622), (-19.255898, -35.35534, 29.651482), (-18.221733, -37.15724, 28.059008), (-18.221733, -37.15724, 28.059008), (-19.255898, -35.35534, 29.651482), (-20.781347, -35.35534, 28.60307), (-19.665255, -37.15724, 27.066902), (-19.665255, -37.15724, 27.066902), (-20.781347, -35.35534, 28.60307), (-22.249836, -35.35534, 27.47626), (-21.054876, -37.15724, 26.000607), (-21.054876, -37.15724, 26.000607), (-22.249836, -35.35534, 27.47626), (-23.65734, -35.35534, 26.274137), (-22.38679, -37.15724, 24.863047), (-22.38679, -37.15724, 24.863047), (-23.65734, -35.35534, 26.274137), (-25, -35.35534, 25), (-23.65734, -37.15724, 23.65734), (-23.65734, -37.15724, 23.65734), (-25, -35.35534, 25), (-26.274137, -35.35534, 23.65734), (-24.863047, -37.15724, 22.38679), (-24.863047, -37.15724, 22.38679), (-26.274137, -35.35534, 23.65734), (-27.47626, -35.35534, 22.249836), (-26.000607, -37.15724, 21.054876), (-26.000607, -37.15724, 21.054876), (-27.47626, -35.35534, 22.249836), (-28.60307, -35.35534, 20.781347), (-27.066902, -37.15724, 19.665255), (-27.066902, -37.15724, 19.665255), (-28.60307, -35.35534, 20.781347), (-29.651482, -35.35534, 19.255898), (-28.059008, -37.15724, 18.221733), (-28.059008, -37.15724, 18.221733), (-29.651482, -35.35534, 19.255898), (-30.618622, -35.35534, 17.67767), (-28.974205, -37.15724, 16.728266), (-28.974205, -37.15724, 16.728266), (-30.618622, -35.35534, 17.67767), (-31.501839, -35.35534, 16.050987), (-29.809986, -37.15724, 15.188947), (-29.809986, -37.15724, 15.188947), (-31.501839, -35.35534, 16.050987), (-32.29871, -35.35534, 14.380312), (-30.564062, -37.15724, 13.607997), (-30.564062, -37.15724, 13.607997), (-32.29871, -35.35534, 14.380312), (-33.007053, -35.35534, 12.67022), (-31.234362, -37.15724, 11.989748), (-31.234362, -37.15724, 11.989748), (-33.007053, -35.35534, 12.67022), (-33.624924, -35.35534, 10.925401), (-31.819052, -37.15724, 10.338636), (-31.819052, -37.15724, 10.338636), (-33.624924, -35.35534, 10.925401), (-34.150635, -35.35534, 9.150635), (-32.31653, -37.15724, 8.659187), (-32.31653, -37.15724, 8.659187), (-34.150635, -35.35534, 9.150635), (-34.58274, -35.35534, 7.350788), (-32.725426, -37.15724, 6.9560037), (-32.725426, -37.15724, 6.9560037), (-34.58274, -35.35534, 7.350788), (-34.920055, -35.35534, 5.5307937), (-33.044624, -37.15724, 5.2337546), (-33.044624, -37.15724, 5.2337546), (-34.920055, -35.35534, 5.5307937), (-35.16166, -35.35534, 3.6956394), (-33.27325, -37.15724, 3.4971597), (-33.27325, -37.15724, 3.4971597), (-35.16166, -35.35534, 3.6956394), (-35.306885, -35.35534, 1.8503555), (-33.41068, -37.15724, 1.7509795), (-33.41068, -37.15724, 1.7509795), (-35.306885, -35.35534, 1.8503555), (-35.35534, -35.35534, 4.3297804e-15), (-33.45653, -37.15724, 4.097243e-15), (-33.45653, -37.15724, 4.097243e-15), (-35.35534, -35.35534, 4.3297804e-15), (-35.306885, -35.35534, -1.8503555), (-33.41068, -37.15724, -1.7509795), (-33.41068, -37.15724, -1.7509795), (-35.306885, -35.35534, -1.8503555), (-35.16166, -35.35534, -3.6956394), (-33.27325, -37.15724, -3.4971597), (-33.27325, -37.15724, -3.4971597), (-35.16166, -35.35534, -3.6956394), (-34.920055, -35.35534, -5.5307937), (-33.044624, -37.15724, -5.2337546), (-33.044624, -37.15724, -5.2337546), (-34.920055, -35.35534, -5.5307937), (-34.58274, -35.35534, -7.350788), (-32.725426, -37.15724, -6.9560037), (-32.725426, -37.15724, -6.9560037), (-34.58274, -35.35534, -7.350788), (-34.150635, -35.35534, -9.150635), (-32.31653, -37.15724, -8.659187), (-32.31653, -37.15724, -8.659187), (-34.150635, -35.35534, -9.150635), (-33.624924, -35.35534, -10.925401), (-31.819052, -37.15724, -10.338636), (-31.819052, -37.15724, -10.338636), (-33.624924, -35.35534, -10.925401), (-33.007053, -35.35534, -12.67022), (-31.234362, -37.15724, -11.989748), (-31.234362, -37.15724, -11.989748), (-33.007053, -35.35534, -12.67022), (-32.29871, -35.35534, -14.380312), (-30.564062, -37.15724, -13.607997), (-30.564062, -37.15724, -13.607997), (-32.29871, -35.35534, -14.380312), (-31.501839, -35.35534, -16.050987), (-29.809986, -37.15724, -15.188947), (-29.809986, -37.15724, -15.188947), (-31.501839, -35.35534, -16.050987), (-30.618622, -35.35534, -17.67767), (-28.974205, -37.15724, -16.728266), (-28.974205, -37.15724, -16.728266), (-30.618622, -35.35534, -17.67767), (-29.651482, -35.35534, -19.255898), (-28.059008, -37.15724, -18.221733), (-28.059008, -37.15724, -18.221733), (-29.651482, -35.35534, -19.255898), (-28.60307, -35.35534, -20.781347), (-27.066902, -37.15724, -19.665255), (-27.066902, -37.15724, -19.665255), (-28.60307, -35.35534, -20.781347), (-27.47626, -35.35534, -22.249836), (-26.000607, -37.15724, -21.054876), (-26.000607, -37.15724, -21.054876), (-27.47626, -35.35534, -22.249836), (-26.274137, -35.35534, -23.65734), (-24.863047, -37.15724, -22.38679), (-24.863047, -37.15724, -22.38679), (-26.274137, -35.35534, -23.65734), (-25, -35.35534, -25), (-23.65734, -37.15724, -23.65734), (-23.65734, -37.15724, -23.65734), (-25, -35.35534, -25), (-23.65734, -35.35534, -26.274137), (-22.38679, -37.15724, -24.863047), (-22.38679, -37.15724, -24.863047), (-23.65734, -35.35534, -26.274137), (-22.249836, -35.35534, -27.47626), (-21.054876, -37.15724, -26.000607), (-21.054876, -37.15724, -26.000607), (-22.249836, -35.35534, -27.47626), (-20.781347, -35.35534, -28.60307), (-19.665255, -37.15724, -27.066902), (-19.665255, -37.15724, -27.066902), (-20.781347, -35.35534, -28.60307), (-19.255898, -35.35534, -29.651482), (-18.221733, -37.15724, -28.059008), (-18.221733, -37.15724, -28.059008), (-19.255898, -35.35534, -29.651482), (-17.67767, -35.35534, -30.618622), (-16.728266, -37.15724, -28.974205), (-16.728266, -37.15724, -28.974205), (-17.67767, -35.35534, -30.618622), (-16.050987, -35.35534, -31.501839), (-15.188947, -37.15724, -29.809986), (-15.188947, -37.15724, -29.809986), (-16.050987, -35.35534, -31.501839), (-14.380312, -35.35534, -32.29871), (-13.607997, -37.15724, -30.564062), (-13.607997, -37.15724, -30.564062), (-14.380312, -35.35534, -32.29871), (-12.67022, -35.35534, -33.007053), (-11.989748, -37.15724, -31.234362), (-11.989748, -37.15724, -31.234362), (-12.67022, -35.35534, -33.007053), (-10.925401, -35.35534, -33.624924), (-10.338636, -37.15724, -31.819052), (-10.338636, -37.15724, -31.819052), (-10.925401, -35.35534, -33.624924), (-9.150635, -35.35534, -34.150635), (-8.659187, -37.15724, -32.31653), (-8.659187, -37.15724, -32.31653), (-9.150635, -35.35534, -34.150635), (-7.350788, -35.35534, -34.58274), (-6.9560037, -37.15724, -32.725426), (-6.9560037, -37.15724, -32.725426), (-7.350788, -35.35534, -34.58274), (-5.5307937, -35.35534, -34.920055), (-5.2337546, -37.15724, -33.044624), (-5.2337546, -37.15724, -33.044624), (-5.5307937, -35.35534, -34.920055), (-3.6956394, -35.35534, -35.16166), (-3.4971597, -37.15724, -33.27325), (-3.4971597, -37.15724, -33.27325), (-3.6956394, -35.35534, -35.16166), (-1.8503555, -35.35534, -35.306885), (-1.7509795, -37.15724, -33.41068), (-1.7509795, -37.15724, -33.41068), (-1.8503555, -35.35534, -35.306885), (-6.4946704e-15, -35.35534, -35.35534), (-6.145865e-15, -37.15724, -33.45653), (-6.145865e-15, -37.15724, -33.45653), (-6.4946704e-15, -35.35534, -35.35534), (1.8503555, -35.35534, -35.306885), (1.7509795, -37.15724, -33.41068), (1.7509795, -37.15724, -33.41068), (1.8503555, -35.35534, -35.306885), (3.6956394, -35.35534, -35.16166), (3.4971597, -37.15724, -33.27325), (3.4971597, -37.15724, -33.27325), (3.6956394, -35.35534, -35.16166), (5.5307937, -35.35534, -34.920055), (5.2337546, -37.15724, -33.044624), (5.2337546, -37.15724, -33.044624), (5.5307937, -35.35534, -34.920055), (7.350788, -35.35534, -34.58274), (6.9560037, -37.15724, -32.725426), (6.9560037, -37.15724, -32.725426), (7.350788, -35.35534, -34.58274), (9.150635, -35.35534, -34.150635), (8.659187, -37.15724, -32.31653), (8.659187, -37.15724, -32.31653), (9.150635, -35.35534, -34.150635), (10.925401, -35.35534, -33.624924), (10.338636, -37.15724, -31.819052), (10.338636, -37.15724, -31.819052), (10.925401, -35.35534, -33.624924), (12.67022, -35.35534, -33.007053), (11.989748, -37.15724, -31.234362), (11.989748, -37.15724, -31.234362), (12.67022, -35.35534, -33.007053), (14.380312, -35.35534, -32.29871), (13.607997, -37.15724, -30.564062), (13.607997, -37.15724, -30.564062), (14.380312, -35.35534, -32.29871), (16.050987, -35.35534, -31.501839), (15.188947, -37.15724, -29.809986), (15.188947, -37.15724, -29.809986), (16.050987, -35.35534, -31.501839), (17.67767, -35.35534, -30.618622), (16.728266, -37.15724, -28.974205), (16.728266, -37.15724, -28.974205), (17.67767, -35.35534, -30.618622), (19.255898, -35.35534, -29.651482), (18.221733, -37.15724, -28.059008), (18.221733, -37.15724, -28.059008), (19.255898, -35.35534, -29.651482), (20.781347, -35.35534, -28.60307), (19.665255, -37.15724, -27.066902), (19.665255, -37.15724, -27.066902), (20.781347, -35.35534, -28.60307), (22.249836, -35.35534, -27.47626), (21.054876, -37.15724, -26.000607), (21.054876, -37.15724, -26.000607), (22.249836, -35.35534, -27.47626), (23.65734, -35.35534, -26.274137), (22.38679, -37.15724, -24.863047), (22.38679, -37.15724, -24.863047), (23.65734, -35.35534, -26.274137), (25, -35.35534, -25), (23.65734, -37.15724, -23.65734), (23.65734, -37.15724, -23.65734), (25, -35.35534, -25), (26.274137, -35.35534, -23.65734), (24.863047, -37.15724, -22.38679), (24.863047, -37.15724, -22.38679), (26.274137, -35.35534, -23.65734), (27.47626, -35.35534, -22.249836), (26.000607, -37.15724, -21.054876), (26.000607, -37.15724, -21.054876), (27.47626, -35.35534, -22.249836), (28.60307, -35.35534, -20.781347), (27.066902, -37.15724, -19.665255), (27.066902, -37.15724, -19.665255), (28.60307, -35.35534, -20.781347), (29.651482, -35.35534, -19.255898), (28.059008, -37.15724, -18.221733), (28.059008, -37.15724, -18.221733), (29.651482, -35.35534, -19.255898), (30.618622, -35.35534, -17.67767), (28.974205, -37.15724, -16.728266), (28.974205, -37.15724, -16.728266), (30.618622, -35.35534, -17.67767), (31.501839, -35.35534, -16.050987), (29.809986, -37.15724, -15.188947), (29.809986, -37.15724, -15.188947), (31.501839, -35.35534, -16.050987), (32.29871, -35.35534, -14.380312), (30.564062, -37.15724, -13.607997), (30.564062, -37.15724, -13.607997), (32.29871, -35.35534, -14.380312), (33.007053, -35.35534, -12.67022), (31.234362, -37.15724, -11.989748), (31.234362, -37.15724, -11.989748), (33.007053, -35.35534, -12.67022), (33.624924, -35.35534, -10.925401), (31.819052, -37.15724, -10.338636), (31.819052, -37.15724, -10.338636), (33.624924, -35.35534, -10.925401), (34.150635, -35.35534, -9.150635), (32.31653, -37.15724, -8.659187), (32.31653, -37.15724, -8.659187), (34.150635, -35.35534, -9.150635), (34.58274, -35.35534, -7.350788), (32.725426, -37.15724, -6.9560037), (32.725426, -37.15724, -6.9560037), (34.58274, -35.35534, -7.350788), (34.920055, -35.35534, -5.5307937), (33.044624, -37.15724, -5.2337546), (33.044624, -37.15724, -5.2337546), (34.920055, -35.35534, -5.5307937), (35.16166, -35.35534, -3.6956394), (33.27325, -37.15724, -3.4971597), (33.27325, -37.15724, -3.4971597), (35.16166, -35.35534, -3.6956394), (35.306885, -35.35534, -1.8503555), (33.41068, -37.15724, -1.7509795), (33.41068, -37.15724, -1.7509795), (35.306885, -35.35534, -1.8503555), (35.35534, -35.35534, 0), (33.45653, -37.15724, 0), (35.35534, -35.35534, 0), (37.15724, -33.45653, 0), (37.10632, -33.45653, 1.9446597), (35.306885, -35.35534, 1.8503555), (35.306885, -35.35534, 1.8503555), (37.10632, -33.45653, 1.9446597), (36.95369, -33.45653, 3.8839893), (35.16166, -35.35534, 3.6956394), (35.16166, -35.35534, 3.6956394), (36.95369, -33.45653, 3.8839893), (36.699776, -33.45653, 5.812673), (34.920055, -35.35534, 5.5307937), (34.920055, -35.35534, 5.5307937), (36.699776, -33.45653, 5.812673), (36.34527, -33.45653, 7.725425), (34.58274, -35.35534, 7.350788), (34.58274, -35.35534, 7.350788), (36.34527, -33.45653, 7.725425), (35.89114, -33.45653, 9.617002), (34.150635, -35.35534, 9.150635), (34.150635, -35.35534, 9.150635), (35.89114, -33.45653, 9.617002), (35.33864, -33.45653, 11.482219), (33.624924, -35.35534, 10.925401), (33.624924, -35.35534, 10.925401), (35.33864, -33.45653, 11.482219), (34.689274, -33.45653, 13.315965), (33.007053, -35.35534, 12.67022), (33.007053, -35.35534, 12.67022), (34.689274, -33.45653, 13.315965), (33.944828, -33.45653, 15.113212), (32.29871, -35.35534, 14.380312), (32.29871, -35.35534, 14.380312), (33.944828, -33.45653, 15.113212), (33.107346, -33.45653, 16.869034), (31.501839, -35.35534, 16.050987), (31.501839, -35.35534, 16.050987), (33.107346, -33.45653, 16.869034), (32.179115, -33.45653, 18.57862), (30.618622, -35.35534, 17.67767), (30.618622, -35.35534, 17.67767), (32.179115, -33.45653, 18.57862), (31.162685, -33.45653, 20.237284), (29.651482, -35.35534, 19.255898), (29.651482, -35.35534, 19.255898), (31.162685, -33.45653, 20.237284), (30.06084, -33.45653, 21.840479), (28.60307, -35.35534, 20.781347), (28.60307, -35.35534, 20.781347), (30.06084, -33.45653, 21.840479), (28.8766, -33.45653, 23.38381), (27.47626, -35.35534, 22.249836), (27.47626, -35.35534, 22.249836), (28.8766, -33.45653, 23.38381), (27.61321, -33.45653, 24.863047), (26.274137, -35.35534, 23.65734), (26.274137, -35.35534, 23.65734), (27.61321, -33.45653, 24.863047), (26.274137, -33.45653, 26.274137), (25, -35.35534, 25), (25, -35.35534, 25), (26.274137, -33.45653, 26.274137), (24.863047, -33.45653, 27.61321), (23.65734, -35.35534, 26.274137), (23.65734, -35.35534, 26.274137), (24.863047, -33.45653, 27.61321), (23.38381, -33.45653, 28.8766), (22.249836, -35.35534, 27.47626), (22.249836, -35.35534, 27.47626), (23.38381, -33.45653, 28.8766), (21.840479, -33.45653, 30.06084), (20.781347, -35.35534, 28.60307), (20.781347, -35.35534, 28.60307), (21.840479, -33.45653, 30.06084), (20.237284, -33.45653, 31.162685), (19.255898, -35.35534, 29.651482), (19.255898, -35.35534, 29.651482), (20.237284, -33.45653, 31.162685), (18.57862, -33.45653, 32.179115), (17.67767, -35.35534, 30.618622), (17.67767, -35.35534, 30.618622), (18.57862, -33.45653, 32.179115), (16.869034, -33.45653, 33.107346), (16.050987, -35.35534, 31.501839), (16.050987, -35.35534, 31.501839), (16.869034, -33.45653, 33.107346), (15.113212, -33.45653, 33.944828), (14.380312, -35.35534, 32.29871), (14.380312, -35.35534, 32.29871), (15.113212, -33.45653, 33.944828), (13.315965, -33.45653, 34.689274), (12.67022, -35.35534, 33.007053), (12.67022, -35.35534, 33.007053), (13.315965, -33.45653, 34.689274), (11.482219, -33.45653, 35.33864), (10.925401, -35.35534, 33.624924), (10.925401, -35.35534, 33.624924), (11.482219, -33.45653, 35.33864), (9.617002, -33.45653, 35.89114), (9.150635, -35.35534, 34.150635), (9.150635, -35.35534, 34.150635), (9.617002, -33.45653, 35.89114), (7.725425, -33.45653, 36.34527), (7.350788, -35.35534, 34.58274), (7.350788, -35.35534, 34.58274), (7.725425, -33.45653, 36.34527), (5.812673, -33.45653, 36.699776), (5.5307937, -35.35534, 34.920055), (5.5307937, -35.35534, 34.920055), (5.812673, -33.45653, 36.699776), (3.8839893, -33.45653, 36.95369), (3.6956394, -35.35534, 35.16166), (3.6956394, -35.35534, 35.16166), (3.8839893, -33.45653, 36.95369), (1.9446597, -33.45653, 37.10632), (1.8503555, -35.35534, 35.306885), (1.8503555, -35.35534, 35.306885), (1.9446597, -33.45653, 37.10632), (2.2752247e-15, -33.45653, 37.15724), (2.1648902e-15, -35.35534, 35.35534), (2.1648902e-15, -35.35534, 35.35534), (2.2752247e-15, -33.45653, 37.15724), (-1.9446597, -33.45653, 37.10632), (-1.8503555, -35.35534, 35.306885), (-1.8503555, -35.35534, 35.306885), (-1.9446597, -33.45653, 37.10632), (-3.8839893, -33.45653, 36.95369), (-3.6956394, -35.35534, 35.16166), (-3.6956394, -35.35534, 35.16166), (-3.8839893, -33.45653, 36.95369), (-5.812673, -33.45653, 36.699776), (-5.5307937, -35.35534, 34.920055), (-5.5307937, -35.35534, 34.920055), (-5.812673, -33.45653, 36.699776), (-7.725425, -33.45653, 36.34527), (-7.350788, -35.35534, 34.58274), (-7.350788, -35.35534, 34.58274), (-7.725425, -33.45653, 36.34527), (-9.617002, -33.45653, 35.89114), (-9.150635, -35.35534, 34.150635), (-9.150635, -35.35534, 34.150635), (-9.617002, -33.45653, 35.89114), (-11.482219, -33.45653, 35.33864), (-10.925401, -35.35534, 33.624924), (-10.925401, -35.35534, 33.624924), (-11.482219, -33.45653, 35.33864), (-13.315965, -33.45653, 34.689274), (-12.67022, -35.35534, 33.007053), (-12.67022, -35.35534, 33.007053), (-13.315965, -33.45653, 34.689274), (-15.113212, -33.45653, 33.944828), (-14.380312, -35.35534, 32.29871), (-14.380312, -35.35534, 32.29871), (-15.113212, -33.45653, 33.944828), (-16.869034, -33.45653, 33.107346), (-16.050987, -35.35534, 31.501839), (-16.050987, -35.35534, 31.501839), (-16.869034, -33.45653, 33.107346), (-18.57862, -33.45653, 32.179115), (-17.67767, -35.35534, 30.618622), (-17.67767, -35.35534, 30.618622), (-18.57862, -33.45653, 32.179115), (-20.237284, -33.45653, 31.162685), (-19.255898, -35.35534, 29.651482), (-19.255898, -35.35534, 29.651482), (-20.237284, -33.45653, 31.162685), (-21.840479, -33.45653, 30.06084), (-20.781347, -35.35534, 28.60307), (-20.781347, -35.35534, 28.60307), (-21.840479, -33.45653, 30.06084), (-23.38381, -33.45653, 28.8766), (-22.249836, -35.35534, 27.47626), (-22.249836, -35.35534, 27.47626), (-23.38381, -33.45653, 28.8766), (-24.863047, -33.45653, 27.61321), (-23.65734, -35.35534, 26.274137), (-23.65734, -35.35534, 26.274137), (-24.863047, -33.45653, 27.61321), (-26.274137, -33.45653, 26.274137), (-25, -35.35534, 25), (-25, -35.35534, 25), (-26.274137, -33.45653, 26.274137), (-27.61321, -33.45653, 24.863047), (-26.274137, -35.35534, 23.65734), (-26.274137, -35.35534, 23.65734), (-27.61321, -33.45653, 24.863047), (-28.8766, -33.45653, 23.38381), (-27.47626, -35.35534, 22.249836), (-27.47626, -35.35534, 22.249836), (-28.8766, -33.45653, 23.38381), (-30.06084, -33.45653, 21.840479), (-28.60307, -35.35534, 20.781347), (-28.60307, -35.35534, 20.781347), (-30.06084, -33.45653, 21.840479), (-31.162685, -33.45653, 20.237284), (-29.651482, -35.35534, 19.255898), (-29.651482, -35.35534, 19.255898), (-31.162685, -33.45653, 20.237284), (-32.179115, -33.45653, 18.57862), (-30.618622, -35.35534, 17.67767), (-30.618622, -35.35534, 17.67767), (-32.179115, -33.45653, 18.57862), (-33.107346, -33.45653, 16.869034), (-31.501839, -35.35534, 16.050987), (-31.501839, -35.35534, 16.050987), (-33.107346, -33.45653, 16.869034), (-33.944828, -33.45653, 15.113212), (-32.29871, -35.35534, 14.380312), (-32.29871, -35.35534, 14.380312), (-33.944828, -33.45653, 15.113212), (-34.689274, -33.45653, 13.315965), (-33.007053, -35.35534, 12.67022), (-33.007053, -35.35534, 12.67022), (-34.689274, -33.45653, 13.315965), (-35.33864, -33.45653, 11.482219), (-33.624924, -35.35534, 10.925401), (-33.624924, -35.35534, 10.925401), (-35.33864, -33.45653, 11.482219), (-35.89114, -33.45653, 9.617002), (-34.150635, -35.35534, 9.150635), (-34.150635, -35.35534, 9.150635), (-35.89114, -33.45653, 9.617002), (-36.34527, -33.45653, 7.725425), (-34.58274, -35.35534, 7.350788), (-34.58274, -35.35534, 7.350788), (-36.34527, -33.45653, 7.725425), (-36.699776, -33.45653, 5.812673), (-34.920055, -35.35534, 5.5307937), (-34.920055, -35.35534, 5.5307937), (-36.699776, -33.45653, 5.812673), (-36.95369, -33.45653, 3.8839893), (-35.16166, -35.35534, 3.6956394), (-35.16166, -35.35534, 3.6956394), (-36.95369, -33.45653, 3.8839893), (-37.10632, -33.45653, 1.9446597), (-35.306885, -35.35534, 1.8503555), (-35.306885, -35.35534, 1.8503555), (-37.10632, -33.45653, 1.9446597), (-37.15724, -33.45653, 4.5504495e-15), (-35.35534, -35.35534, 4.3297804e-15), (-35.35534, -35.35534, 4.3297804e-15), (-37.15724, -33.45653, 4.5504495e-15), (-37.10632, -33.45653, -1.9446597), (-35.306885, -35.35534, -1.8503555), (-35.306885, -35.35534, -1.8503555), (-37.10632, -33.45653, -1.9446597), (-36.95369, -33.45653, -3.8839893), (-35.16166, -35.35534, -3.6956394), (-35.16166, -35.35534, -3.6956394), (-36.95369, -33.45653, -3.8839893), (-36.699776, -33.45653, -5.812673), (-34.920055, -35.35534, -5.5307937), (-34.920055, -35.35534, -5.5307937), (-36.699776, -33.45653, -5.812673), (-36.34527, -33.45653, -7.725425), (-34.58274, -35.35534, -7.350788), (-34.58274, -35.35534, -7.350788), (-36.34527, -33.45653, -7.725425), (-35.89114, -33.45653, -9.617002), (-34.150635, -35.35534, -9.150635), (-34.150635, -35.35534, -9.150635), (-35.89114, -33.45653, -9.617002), (-35.33864, -33.45653, -11.482219), (-33.624924, -35.35534, -10.925401), (-33.624924, -35.35534, -10.925401), (-35.33864, -33.45653, -11.482219), (-34.689274, -33.45653, -13.315965), (-33.007053, -35.35534, -12.67022), (-33.007053, -35.35534, -12.67022), (-34.689274, -33.45653, -13.315965), (-33.944828, -33.45653, -15.113212), (-32.29871, -35.35534, -14.380312), (-32.29871, -35.35534, -14.380312), (-33.944828, -33.45653, -15.113212), (-33.107346, -33.45653, -16.869034), (-31.501839, -35.35534, -16.050987), (-31.501839, -35.35534, -16.050987), (-33.107346, -33.45653, -16.869034), (-32.179115, -33.45653, -18.57862), (-30.618622, -35.35534, -17.67767), (-30.618622, -35.35534, -17.67767), (-32.179115, -33.45653, -18.57862), (-31.162685, -33.45653, -20.237284), (-29.651482, -35.35534, -19.255898), (-29.651482, -35.35534, -19.255898), (-31.162685, -33.45653, -20.237284), (-30.06084, -33.45653, -21.840479), (-28.60307, -35.35534, -20.781347), (-28.60307, -35.35534, -20.781347), (-30.06084, -33.45653, -21.840479), (-28.8766, -33.45653, -23.38381), (-27.47626, -35.35534, -22.249836), (-27.47626, -35.35534, -22.249836), (-28.8766, -33.45653, -23.38381), (-27.61321, -33.45653, -24.863047), (-26.274137, -35.35534, -23.65734), (-26.274137, -35.35534, -23.65734), (-27.61321, -33.45653, -24.863047), (-26.274137, -33.45653, -26.274137), (-25, -35.35534, -25), (-25, -35.35534, -25), (-26.274137, -33.45653, -26.274137), (-24.863047, -33.45653, -27.61321), (-23.65734, -35.35534, -26.274137), (-23.65734, -35.35534, -26.274137), (-24.863047, -33.45653, -27.61321), (-23.38381, -33.45653, -28.8766), (-22.249836, -35.35534, -27.47626), (-22.249836, -35.35534, -27.47626), (-23.38381, -33.45653, -28.8766), (-21.840479, -33.45653, -30.06084), (-20.781347, -35.35534, -28.60307), (-20.781347, -35.35534, -28.60307), (-21.840479, -33.45653, -30.06084), (-20.237284, -33.45653, -31.162685), (-19.255898, -35.35534, -29.651482), (-19.255898, -35.35534, -29.651482), (-20.237284, -33.45653, -31.162685), (-18.57862, -33.45653, -32.179115), (-17.67767, -35.35534, -30.618622), (-17.67767, -35.35534, -30.618622), (-18.57862, -33.45653, -32.179115), (-16.869034, -33.45653, -33.107346), (-16.050987, -35.35534, -31.501839), (-16.050987, -35.35534, -31.501839), (-16.869034, -33.45653, -33.107346), (-15.113212, -33.45653, -33.944828), (-14.380312, -35.35534, -32.29871), (-14.380312, -35.35534, -32.29871), (-15.113212, -33.45653, -33.944828), (-13.315965, -33.45653, -34.689274), (-12.67022, -35.35534, -33.007053), (-12.67022, -35.35534, -33.007053), (-13.315965, -33.45653, -34.689274), (-11.482219, -33.45653, -35.33864), (-10.925401, -35.35534, -33.624924), (-10.925401, -35.35534, -33.624924), (-11.482219, -33.45653, -35.33864), (-9.617002, -33.45653, -35.89114), (-9.150635, -35.35534, -34.150635), (-9.150635, -35.35534, -34.150635), (-9.617002, -33.45653, -35.89114), (-7.725425, -33.45653, -36.34527), (-7.350788, -35.35534, -34.58274), (-7.350788, -35.35534, -34.58274), (-7.725425, -33.45653, -36.34527), (-5.812673, -33.45653, -36.699776), (-5.5307937, -35.35534, -34.920055), (-5.5307937, -35.35534, -34.920055), (-5.812673, -33.45653, -36.699776), (-3.8839893, -33.45653, -36.95369), (-3.6956394, -35.35534, -35.16166), (-3.6956394, -35.35534, -35.16166), (-3.8839893, -33.45653, -36.95369), (-1.9446597, -33.45653, -37.10632), (-1.8503555, -35.35534, -35.306885), (-1.8503555, -35.35534, -35.306885), (-1.9446597, -33.45653, -37.10632), (-6.8256744e-15, -33.45653, -37.15724), (-6.4946704e-15, -35.35534, -35.35534), (-6.4946704e-15, -35.35534, -35.35534), (-6.8256744e-15, -33.45653, -37.15724), (1.9446597, -33.45653, -37.10632), (1.8503555, -35.35534, -35.306885), (1.8503555, -35.35534, -35.306885), (1.9446597, -33.45653, -37.10632), (3.8839893, -33.45653, -36.95369), (3.6956394, -35.35534, -35.16166), (3.6956394, -35.35534, -35.16166), (3.8839893, -33.45653, -36.95369), (5.812673, -33.45653, -36.699776), (5.5307937, -35.35534, -34.920055), (5.5307937, -35.35534, -34.920055), (5.812673, -33.45653, -36.699776), (7.725425, -33.45653, -36.34527), (7.350788, -35.35534, -34.58274), (7.350788, -35.35534, -34.58274), (7.725425, -33.45653, -36.34527), (9.617002, -33.45653, -35.89114), (9.150635, -35.35534, -34.150635), (9.150635, -35.35534, -34.150635), (9.617002, -33.45653, -35.89114), (11.482219, -33.45653, -35.33864), (10.925401, -35.35534, -33.624924), (10.925401, -35.35534, -33.624924), (11.482219, -33.45653, -35.33864), (13.315965, -33.45653, -34.689274), (12.67022, -35.35534, -33.007053), (12.67022, -35.35534, -33.007053), (13.315965, -33.45653, -34.689274), (15.113212, -33.45653, -33.944828), (14.380312, -35.35534, -32.29871), (14.380312, -35.35534, -32.29871), (15.113212, -33.45653, -33.944828), (16.869034, -33.45653, -33.107346), (16.050987, -35.35534, -31.501839), (16.050987, -35.35534, -31.501839), (16.869034, -33.45653, -33.107346), (18.57862, -33.45653, -32.179115), (17.67767, -35.35534, -30.618622), (17.67767, -35.35534, -30.618622), (18.57862, -33.45653, -32.179115), (20.237284, -33.45653, -31.162685), (19.255898, -35.35534, -29.651482), (19.255898, -35.35534, -29.651482), (20.237284, -33.45653, -31.162685), (21.840479, -33.45653, -30.06084), (20.781347, -35.35534, -28.60307), (20.781347, -35.35534, -28.60307), (21.840479, -33.45653, -30.06084), (23.38381, -33.45653, -28.8766), (22.249836, -35.35534, -27.47626), (22.249836, -35.35534, -27.47626), (23.38381, -33.45653, -28.8766), (24.863047, -33.45653, -27.61321), (23.65734, -35.35534, -26.274137), (23.65734, -35.35534, -26.274137), (24.863047, -33.45653, -27.61321), (26.274137, -33.45653, -26.274137), (25, -35.35534, -25), (25, -35.35534, -25), (26.274137, -33.45653, -26.274137), (27.61321, -33.45653, -24.863047), (26.274137, -35.35534, -23.65734), (26.274137, -35.35534, -23.65734), (27.61321, -33.45653, -24.863047), (28.8766, -33.45653, -23.38381), (27.47626, -35.35534, -22.249836), (27.47626, -35.35534, -22.249836), (28.8766, -33.45653, -23.38381), (30.06084, -33.45653, -21.840479), (28.60307, -35.35534, -20.781347), (28.60307, -35.35534, -20.781347), (30.06084, -33.45653, -21.840479), (31.162685, -33.45653, -20.237284), (29.651482, -35.35534, -19.255898), (29.651482, -35.35534, -19.255898), (31.162685, -33.45653, -20.237284), (32.179115, -33.45653, -18.57862), (30.618622, -35.35534, -17.67767), (30.618622, -35.35534, -17.67767), (32.179115, -33.45653, -18.57862), (33.107346, -33.45653, -16.869034), (31.501839, -35.35534, -16.050987), (31.501839, -35.35534, -16.050987), (33.107346, -33.45653, -16.869034), (33.944828, -33.45653, -15.113212), (32.29871, -35.35534, -14.380312), (32.29871, -35.35534, -14.380312), (33.944828, -33.45653, -15.113212), (34.689274, -33.45653, -13.315965), (33.007053, -35.35534, -12.67022), (33.007053, -35.35534, -12.67022), (34.689274, -33.45653, -13.315965), (35.33864, -33.45653, -11.482219), (33.624924, -35.35534, -10.925401), (33.624924, -35.35534, -10.925401), (35.33864, -33.45653, -11.482219), (35.89114, -33.45653, -9.617002), (34.150635, -35.35534, -9.150635), (34.150635, -35.35534, -9.150635), (35.89114, -33.45653, -9.617002), (36.34527, -33.45653, -7.725425), (34.58274, -35.35534, -7.350788), (34.58274, -35.35534, -7.350788), (36.34527, -33.45653, -7.725425), (36.699776, -33.45653, -5.812673), (34.920055, -35.35534, -5.5307937), (34.920055, -35.35534, -5.5307937), (36.699776, -33.45653, -5.812673), (36.95369, -33.45653, -3.8839893), (35.16166, -35.35534, -3.6956394), (35.16166, -35.35534, -3.6956394), (36.95369, -33.45653, -3.8839893), (37.10632, -33.45653, -1.9446597), (35.306885, -35.35534, -1.8503555), (35.306885, -35.35534, -1.8503555), (37.10632, -33.45653, -1.9446597), (37.15724, -33.45653, 0), (35.35534, -35.35534, 0), (37.15724, -33.45653, 0), (38.8573, -31.466019, 0), (38.804047, -31.466019, 2.033634), (37.10632, -33.45653, 1.9446597), (37.10632, -33.45653, 1.9446597), (38.804047, -31.466019, 2.033634), (38.644432, -31.466019, 4.0616937), (36.95369, -33.45653, 3.8839893), (36.95369, -33.45653, 3.8839893), (38.644432, -31.466019, 4.0616937), (38.3789, -31.466019, 6.0786204), (36.699776, -33.45653, 5.812673), (36.699776, -33.45653, 5.812673), (38.3789, -31.466019, 6.0786204), (38.00817, -31.466019, 8.078887), (36.34527, -33.45653, 7.725425), (36.34527, -33.45653, 7.725425), (38.00817, -31.466019, 8.078887), (37.533268, -31.466019, 10.057009), (35.89114, -33.45653, 9.617002), (35.89114, -33.45653, 9.617002), (37.533268, -31.466019, 10.057009), (36.955486, -31.466019, 12.0075655), (35.33864, -33.45653, 11.482219), (35.33864, -33.45653, 11.482219), (36.955486, -31.466019, 12.0075655), (36.276413, -31.466019, 13.92521), (34.689274, -33.45653, 13.315965), (34.689274, -33.45653, 13.315965), (36.276413, -31.466019, 13.92521), (35.49791, -31.466019, 15.804687), (33.944828, -33.45653, 15.113212), (33.944828, -33.45653, 15.113212), (35.49791, -31.466019, 15.804687), (34.622105, -31.466019, 17.640844), (33.107346, -33.45653, 16.869034), (33.107346, -33.45653, 16.869034), (34.622105, -31.466019, 17.640844), (33.65141, -31.466019, 19.42865), (32.179115, -33.45653, 18.57862), (32.179115, -33.45653, 18.57862), (33.65141, -31.466019, 19.42865), (32.58847, -31.466019, 21.1632), (31.162685, -33.45653, 20.237284), (31.162685, -33.45653, 20.237284), (32.58847, -31.466019, 21.1632), (31.436214, -31.466019, 22.839746), (30.06084, -33.45653, 21.840479), (30.06084, -33.45653, 21.840479), (31.436214, -31.466019, 22.839746), (30.197792, -31.466019, 24.45369), (28.8766, -33.45653, 23.38381), (28.8766, -33.45653, 23.38381), (30.197792, -31.466019, 24.45369), (28.8766, -31.466019, 26.000607), (27.61321, -33.45653, 24.863047), (27.61321, -33.45653, 24.863047), (28.8766, -31.466019, 26.000607), (27.47626, -31.466019, 27.47626), (26.274137, -33.45653, 26.274137), (26.274137, -33.45653, 26.274137), (27.47626, -31.466019, 27.47626), (26.000607, -31.466019, 28.8766), (24.863047, -33.45653, 27.61321), (24.863047, -33.45653, 27.61321), (26.000607, -31.466019, 28.8766), (24.45369, -31.466019, 30.197792), (23.38381, -33.45653, 28.8766), (23.38381, -33.45653, 28.8766), (24.45369, -31.466019, 30.197792), (22.839746, -31.466019, 31.436214), (21.840479, -33.45653, 30.06084), (21.840479, -33.45653, 30.06084), (22.839746, -31.466019, 31.436214), (21.1632, -31.466019, 32.58847), (20.237284, -33.45653, 31.162685), (20.237284, -33.45653, 31.162685), (21.1632, -31.466019, 32.58847), (19.42865, -31.466019, 33.65141), (18.57862, -33.45653, 32.179115), (18.57862, -33.45653, 32.179115), (19.42865, -31.466019, 33.65141), (17.640844, -31.466019, 34.622105), (16.869034, -33.45653, 33.107346), (16.869034, -33.45653, 33.107346), (17.640844, -31.466019, 34.622105), (15.804687, -31.466019, 35.49791), (15.113212, -33.45653, 33.944828), (15.113212, -33.45653, 33.944828), (15.804687, -31.466019, 35.49791), (13.92521, -31.466019, 36.276413), (13.315965, -33.45653, 34.689274), (13.315965, -33.45653, 34.689274), (13.92521, -31.466019, 36.276413), (12.0075655, -31.466019, 36.955486), (11.482219, -33.45653, 35.33864), (11.482219, -33.45653, 35.33864), (12.0075655, -31.466019, 36.955486), (10.057009, -31.466019, 37.533268), (9.617002, -33.45653, 35.89114), (9.617002, -33.45653, 35.89114), (10.057009, -31.466019, 37.533268), (8.078887, -31.466019, 38.00817), (7.725425, -33.45653, 36.34527), (7.725425, -33.45653, 36.34527), (8.078887, -31.466019, 38.00817), (6.0786204, -31.466019, 38.3789), (5.812673, -33.45653, 36.699776), (5.812673, -33.45653, 36.699776), (6.0786204, -31.466019, 38.3789), (4.0616937, -31.466019, 38.644432), (3.8839893, -33.45653, 36.95369), (3.8839893, -33.45653, 36.95369), (4.0616937, -31.466019, 38.644432), (2.033634, -31.466019, 38.804047), (1.9446597, -33.45653, 37.10632), (1.9446597, -33.45653, 37.10632), (2.033634, -31.466019, 38.804047), (2.3793234e-15, -31.466019, 38.8573), (2.2752247e-15, -33.45653, 37.15724), (2.2752247e-15, -33.45653, 37.15724), (2.3793234e-15, -31.466019, 38.8573), (-2.033634, -31.466019, 38.804047), (-1.9446597, -33.45653, 37.10632), (-1.9446597, -33.45653, 37.10632), (-2.033634, -31.466019, 38.804047), (-4.0616937, -31.466019, 38.644432), (-3.8839893, -33.45653, 36.95369), (-3.8839893, -33.45653, 36.95369), (-4.0616937, -31.466019, 38.644432), (-6.0786204, -31.466019, 38.3789), (-5.812673, -33.45653, 36.699776), (-5.812673, -33.45653, 36.699776), (-6.0786204, -31.466019, 38.3789), (-8.078887, -31.466019, 38.00817), (-7.725425, -33.45653, 36.34527), (-7.725425, -33.45653, 36.34527), (-8.078887, -31.466019, 38.00817), (-10.057009, -31.466019, 37.533268), (-9.617002, -33.45653, 35.89114), (-9.617002, -33.45653, 35.89114), (-10.057009, -31.466019, 37.533268), (-12.0075655, -31.466019, 36.955486), (-11.482219, -33.45653, 35.33864), (-11.482219, -33.45653, 35.33864), (-12.0075655, -31.466019, 36.955486), (-13.92521, -31.466019, 36.276413), (-13.315965, -33.45653, 34.689274), (-13.315965, -33.45653, 34.689274), (-13.92521, -31.466019, 36.276413), (-15.804687, -31.466019, 35.49791), (-15.113212, -33.45653, 33.944828), (-15.113212, -33.45653, 33.944828), (-15.804687, -31.466019, 35.49791), (-17.640844, -31.466019, 34.622105), (-16.869034, -33.45653, 33.107346), (-16.869034, -33.45653, 33.107346), (-17.640844, -31.466019, 34.622105), (-19.42865, -31.466019, 33.65141), (-18.57862, -33.45653, 32.179115), (-18.57862, -33.45653, 32.179115), (-19.42865, -31.466019, 33.65141), (-21.1632, -31.466019, 32.58847), (-20.237284, -33.45653, 31.162685), (-20.237284, -33.45653, 31.162685), (-21.1632, -31.466019, 32.58847), (-22.839746, -31.466019, 31.436214), (-21.840479, -33.45653, 30.06084), (-21.840479, -33.45653, 30.06084), (-22.839746, -31.466019, 31.436214), (-24.45369, -31.466019, 30.197792), (-23.38381, -33.45653, 28.8766), (-23.38381, -33.45653, 28.8766), (-24.45369, -31.466019, 30.197792), (-26.000607, -31.466019, 28.8766), (-24.863047, -33.45653, 27.61321), (-24.863047, -33.45653, 27.61321), (-26.000607, -31.466019, 28.8766), (-27.47626, -31.466019, 27.47626), (-26.274137, -33.45653, 26.274137), (-26.274137, -33.45653, 26.274137), (-27.47626, -31.466019, 27.47626), (-28.8766, -31.466019, 26.000607), (-27.61321, -33.45653, 24.863047), (-27.61321, -33.45653, 24.863047), (-28.8766, -31.466019, 26.000607), (-30.197792, -31.466019, 24.45369), (-28.8766, -33.45653, 23.38381), (-28.8766, -33.45653, 23.38381), (-30.197792, -31.466019, 24.45369), (-31.436214, -31.466019, 22.839746), (-30.06084, -33.45653, 21.840479), (-30.06084, -33.45653, 21.840479), (-31.436214, -31.466019, 22.839746), (-32.58847, -31.466019, 21.1632), (-31.162685, -33.45653, 20.237284), (-31.162685, -33.45653, 20.237284), (-32.58847, -31.466019, 21.1632), (-33.65141, -31.466019, 19.42865), (-32.179115, -33.45653, 18.57862), (-32.179115, -33.45653, 18.57862), (-33.65141, -31.466019, 19.42865), (-34.622105, -31.466019, 17.640844), (-33.107346, -33.45653, 16.869034), (-33.107346, -33.45653, 16.869034), (-34.622105, -31.466019, 17.640844), (-35.49791, -31.466019, 15.804687), (-33.944828, -33.45653, 15.113212), (-33.944828, -33.45653, 15.113212), (-35.49791, -31.466019, 15.804687), (-36.276413, -31.466019, 13.92521), (-34.689274, -33.45653, 13.315965), (-34.689274, -33.45653, 13.315965), (-36.276413, -31.466019, 13.92521), (-36.955486, -31.466019, 12.0075655), (-35.33864, -33.45653, 11.482219), (-35.33864, -33.45653, 11.482219), (-36.955486, -31.466019, 12.0075655), (-37.533268, -31.466019, 10.057009), (-35.89114, -33.45653, 9.617002), (-35.89114, -33.45653, 9.617002), (-37.533268, -31.466019, 10.057009), (-38.00817, -31.466019, 8.078887), (-36.34527, -33.45653, 7.725425), (-36.34527, -33.45653, 7.725425), (-38.00817, -31.466019, 8.078887), (-38.3789, -31.466019, 6.0786204), (-36.699776, -33.45653, 5.812673), (-36.699776, -33.45653, 5.812673), (-38.3789, -31.466019, 6.0786204), (-38.644432, -31.466019, 4.0616937), (-36.95369, -33.45653, 3.8839893), (-36.95369, -33.45653, 3.8839893), (-38.644432, -31.466019, 4.0616937), (-38.804047, -31.466019, 2.033634), (-37.10632, -33.45653, 1.9446597), (-37.10632, -33.45653, 1.9446597), (-38.804047, -31.466019, 2.033634), (-38.8573, -31.466019, 4.7586468e-15), (-37.15724, -33.45653, 4.5504495e-15), (-37.15724, -33.45653, 4.5504495e-15), (-38.8573, -31.466019, 4.7586468e-15), (-38.804047, -31.466019, -2.033634), (-37.10632, -33.45653, -1.9446597), (-37.10632, -33.45653, -1.9446597), (-38.804047, -31.466019, -2.033634), (-38.644432, -31.466019, -4.0616937), (-36.95369, -33.45653, -3.8839893), (-36.95369, -33.45653, -3.8839893), (-38.644432, -31.466019, -4.0616937), (-38.3789, -31.466019, -6.0786204), (-36.699776, -33.45653, -5.812673), (-36.699776, -33.45653, -5.812673), (-38.3789, -31.466019, -6.0786204), (-38.00817, -31.466019, -8.078887), (-36.34527, -33.45653, -7.725425), (-36.34527, -33.45653, -7.725425), (-38.00817, -31.466019, -8.078887), (-37.533268, -31.466019, -10.057009), (-35.89114, -33.45653, -9.617002), (-35.89114, -33.45653, -9.617002), (-37.533268, -31.466019, -10.057009), (-36.955486, -31.466019, -12.0075655), (-35.33864, -33.45653, -11.482219), (-35.33864, -33.45653, -11.482219), (-36.955486, -31.466019, -12.0075655), (-36.276413, -31.466019, -13.92521), (-34.689274, -33.45653, -13.315965), (-34.689274, -33.45653, -13.315965), (-36.276413, -31.466019, -13.92521), (-35.49791, -31.466019, -15.804687), (-33.944828, -33.45653, -15.113212), (-33.944828, -33.45653, -15.113212), (-35.49791, -31.466019, -15.804687), (-34.622105, -31.466019, -17.640844), (-33.107346, -33.45653, -16.869034), (-33.107346, -33.45653, -16.869034), (-34.622105, -31.466019, -17.640844), (-33.65141, -31.466019, -19.42865), (-32.179115, -33.45653, -18.57862), (-32.179115, -33.45653, -18.57862), (-33.65141, -31.466019, -19.42865), (-32.58847, -31.466019, -21.1632), (-31.162685, -33.45653, -20.237284), (-31.162685, -33.45653, -20.237284), (-32.58847, -31.466019, -21.1632), (-31.436214, -31.466019, -22.839746), (-30.06084, -33.45653, -21.840479), (-30.06084, -33.45653, -21.840479), (-31.436214, -31.466019, -22.839746), (-30.197792, -31.466019, -24.45369), (-28.8766, -33.45653, -23.38381), (-28.8766, -33.45653, -23.38381), (-30.197792, -31.466019, -24.45369), (-28.8766, -31.466019, -26.000607), (-27.61321, -33.45653, -24.863047), (-27.61321, -33.45653, -24.863047), (-28.8766, -31.466019, -26.000607), (-27.47626, -31.466019, -27.47626), (-26.274137, -33.45653, -26.274137), (-26.274137, -33.45653, -26.274137), (-27.47626, -31.466019, -27.47626), (-26.000607, -31.466019, -28.8766), (-24.863047, -33.45653, -27.61321), (-24.863047, -33.45653, -27.61321), (-26.000607, -31.466019, -28.8766), (-24.45369, -31.466019, -30.197792), (-23.38381, -33.45653, -28.8766), (-23.38381, -33.45653, -28.8766), (-24.45369, -31.466019, -30.197792), (-22.839746, -31.466019, -31.436214), (-21.840479, -33.45653, -30.06084), (-21.840479, -33.45653, -30.06084), (-22.839746, -31.466019, -31.436214), (-21.1632, -31.466019, -32.58847), (-20.237284, -33.45653, -31.162685), (-20.237284, -33.45653, -31.162685), (-21.1632, -31.466019, -32.58847), (-19.42865, -31.466019, -33.65141), (-18.57862, -33.45653, -32.179115), (-18.57862, -33.45653, -32.179115), (-19.42865, -31.466019, -33.65141), (-17.640844, -31.466019, -34.622105), (-16.869034, -33.45653, -33.107346), (-16.869034, -33.45653, -33.107346), (-17.640844, -31.466019, -34.622105), (-15.804687, -31.466019, -35.49791), (-15.113212, -33.45653, -33.944828), (-15.113212, -33.45653, -33.944828), (-15.804687, -31.466019, -35.49791), (-13.92521, -31.466019, -36.276413), (-13.315965, -33.45653, -34.689274), (-13.315965, -33.45653, -34.689274), (-13.92521, -31.466019, -36.276413), (-12.0075655, -31.466019, -36.955486), (-11.482219, -33.45653, -35.33864), (-11.482219, -33.45653, -35.33864), (-12.0075655, -31.466019, -36.955486), (-10.057009, -31.466019, -37.533268), (-9.617002, -33.45653, -35.89114), (-9.617002, -33.45653, -35.89114), (-10.057009, -31.466019, -37.533268), (-8.078887, -31.466019, -38.00817), (-7.725425, -33.45653, -36.34527), (-7.725425, -33.45653, -36.34527), (-8.078887, -31.466019, -38.00817), (-6.0786204, -31.466019, -38.3789), (-5.812673, -33.45653, -36.699776), (-5.812673, -33.45653, -36.699776), (-6.0786204, -31.466019, -38.3789), (-4.0616937, -31.466019, -38.644432), (-3.8839893, -33.45653, -36.95369), (-3.8839893, -33.45653, -36.95369), (-4.0616937, -31.466019, -38.644432), (-2.033634, -31.466019, -38.804047), (-1.9446597, -33.45653, -37.10632), (-1.9446597, -33.45653, -37.10632), (-2.033634, -31.466019, -38.804047), (-7.1379695e-15, -31.466019, -38.8573), (-6.8256744e-15, -33.45653, -37.15724), (-6.8256744e-15, -33.45653, -37.15724), (-7.1379695e-15, -31.466019, -38.8573), (2.033634, -31.466019, -38.804047), (1.9446597, -33.45653, -37.10632), (1.9446597, -33.45653, -37.10632), (2.033634, -31.466019, -38.804047), (4.0616937, -31.466019, -38.644432), (3.8839893, -33.45653, -36.95369), (3.8839893, -33.45653, -36.95369), (4.0616937, -31.466019, -38.644432), (6.0786204, -31.466019, -38.3789), (5.812673, -33.45653, -36.699776), (5.812673, -33.45653, -36.699776), (6.0786204, -31.466019, -38.3789), (8.078887, -31.466019, -38.00817), (7.725425, -33.45653, -36.34527), (7.725425, -33.45653, -36.34527), (8.078887, -31.466019, -38.00817), (10.057009, -31.466019, -37.533268), (9.617002, -33.45653, -35.89114), (9.617002, -33.45653, -35.89114), (10.057009, -31.466019, -37.533268), (12.0075655, -31.466019, -36.955486), (11.482219, -33.45653, -35.33864), (11.482219, -33.45653, -35.33864), (12.0075655, -31.466019, -36.955486), (13.92521, -31.466019, -36.276413), (13.315965, -33.45653, -34.689274), (13.315965, -33.45653, -34.689274), (13.92521, -31.466019, -36.276413), (15.804687, -31.466019, -35.49791), (15.113212, -33.45653, -33.944828), (15.113212, -33.45653, -33.944828), (15.804687, -31.466019, -35.49791), (17.640844, -31.466019, -34.622105), (16.869034, -33.45653, -33.107346), (16.869034, -33.45653, -33.107346), (17.640844, -31.466019, -34.622105), (19.42865, -31.466019, -33.65141), (18.57862, -33.45653, -32.179115), (18.57862, -33.45653, -32.179115), (19.42865, -31.466019, -33.65141), (21.1632, -31.466019, -32.58847), (20.237284, -33.45653, -31.162685), (20.237284, -33.45653, -31.162685), (21.1632, -31.466019, -32.58847), (22.839746, -31.466019, -31.436214), (21.840479, -33.45653, -30.06084), (21.840479, -33.45653, -30.06084), (22.839746, -31.466019, -31.436214), (24.45369, -31.466019, -30.197792), (23.38381, -33.45653, -28.8766), (23.38381, -33.45653, -28.8766), (24.45369, -31.466019, -30.197792), (26.000607, -31.466019, -28.8766), (24.863047, -33.45653, -27.61321), (24.863047, -33.45653, -27.61321), (26.000607, -31.466019, -28.8766), (27.47626, -31.466019, -27.47626), (26.274137, -33.45653, -26.274137), (26.274137, -33.45653, -26.274137), (27.47626, -31.466019, -27.47626), (28.8766, -31.466019, -26.000607), (27.61321, -33.45653, -24.863047), (27.61321, -33.45653, -24.863047), (28.8766, -31.466019, -26.000607), (30.197792, -31.466019, -24.45369), (28.8766, -33.45653, -23.38381), (28.8766, -33.45653, -23.38381), (30.197792, -31.466019, -24.45369), (31.436214, -31.466019, -22.839746), (30.06084, -33.45653, -21.840479), (30.06084, -33.45653, -21.840479), (31.436214, -31.466019, -22.839746), (32.58847, -31.466019, -21.1632), (31.162685, -33.45653, -20.237284), (31.162685, -33.45653, -20.237284), (32.58847, -31.466019, -21.1632), (33.65141, -31.466019, -19.42865), (32.179115, -33.45653, -18.57862), (32.179115, -33.45653, -18.57862), (33.65141, -31.466019, -19.42865), (34.622105, -31.466019, -17.640844), (33.107346, -33.45653, -16.869034), (33.107346, -33.45653, -16.869034), (34.622105, -31.466019, -17.640844), (35.49791, -31.466019, -15.804687), (33.944828, -33.45653, -15.113212), (33.944828, -33.45653, -15.113212), (35.49791, -31.466019, -15.804687), (36.276413, -31.466019, -13.92521), (34.689274, -33.45653, -13.315965), (34.689274, -33.45653, -13.315965), (36.276413, -31.466019, -13.92521), (36.955486, -31.466019, -12.0075655), (35.33864, -33.45653, -11.482219), (35.33864, -33.45653, -11.482219), (36.955486, -31.466019, -12.0075655), (37.533268, -31.466019, -10.057009), (35.89114, -33.45653, -9.617002), (35.89114, -33.45653, -9.617002), (37.533268, -31.466019, -10.057009), (38.00817, -31.466019, -8.078887), (36.34527, -33.45653, -7.725425), (36.34527, -33.45653, -7.725425), (38.00817, -31.466019, -8.078887), (38.3789, -31.466019, -6.0786204), (36.699776, -33.45653, -5.812673), (36.699776, -33.45653, -5.812673), (38.3789, -31.466019, -6.0786204), (38.644432, -31.466019, -4.0616937), (36.95369, -33.45653, -3.8839893), (36.95369, -33.45653, -3.8839893), (38.644432, -31.466019, -4.0616937), (38.804047, -31.466019, -2.033634), (37.10632, -33.45653, -1.9446597), (37.10632, -33.45653, -1.9446597), (38.804047, -31.466019, -2.033634), (38.8573, -31.466019, 0), (37.15724, -33.45653, 0), (38.8573, -31.466019, 0), (40.45085, -29.389263, 0), (40.395412, -29.389263, 2.117034), (38.804047, -31.466019, 2.033634), (38.804047, -31.466019, 2.033634), (40.395412, -29.389263, 2.117034), (40.229256, -29.389263, 4.2282653), (38.644432, -31.466019, 4.0616937), (38.644432, -31.466019, 4.0616937), (40.229256, -29.389263, 4.2282653), (39.95283, -29.389263, 6.327907), (38.3789, -31.466019, 6.0786204), (38.3789, -31.466019, 6.0786204), (39.95283, -29.389263, 6.327907), (39.566902, -29.389263, 8.410205), (38.00817, -31.466019, 8.078887), (38.00817, -31.466019, 8.078887), (39.566902, -29.389263, 8.410205), (39.07252, -29.389263, 10.46945), (37.533268, -31.466019, 10.057009), (37.533268, -31.466019, 10.057009), (39.07252, -29.389263, 10.46945), (38.471043, -29.389263, 12.5), (36.955486, -31.466019, 12.0075655), (36.955486, -31.466019, 12.0075655), (38.471043, -29.389263, 12.5), (37.764122, -29.389263, 14.496288), (36.276413, -31.466019, 13.92521), (36.276413, -31.466019, 13.92521), (37.764122, -29.389263, 14.496288), (36.95369, -29.389263, 16.452843), (35.49791, -31.466019, 15.804687), (35.49791, -31.466019, 15.804687), (36.95369, -29.389263, 16.452843), (36.04197, -29.389263, 18.364302), (34.622105, -31.466019, 17.640844), (34.622105, -31.466019, 17.640844), (36.04197, -29.389263, 18.364302), (35.031464, -29.389263, 20.225426), (33.65141, -31.466019, 19.42865), (33.65141, -31.466019, 19.42865), (35.031464, -29.389263, 20.225426), (33.92494, -29.389263, 22.031113), (32.58847, -31.466019, 21.1632), (32.58847, -31.466019, 21.1632), (33.92494, -29.389263, 22.031113), (32.725426, -29.389263, 23.776413), (31.436214, -31.466019, 22.839746), (31.436214, -31.466019, 22.839746), (32.725426, -29.389263, 23.776413), (31.436214, -29.389263, 25.456545), (30.197792, -31.466019, 24.45369), (30.197792, -31.466019, 24.45369), (31.436214, -29.389263, 25.456545), (30.06084, -29.389263, 27.066902), (28.8766, -31.466019, 26.000607), (28.8766, -31.466019, 26.000607), (30.06084, -29.389263, 27.066902), (28.60307, -29.389263, 28.60307), (27.47626, -31.466019, 27.47626), (27.47626, -31.466019, 27.47626), (28.60307, -29.389263, 28.60307), (27.066902, -29.389263, 30.06084), (26.000607, -31.466019, 28.8766), (26.000607, -31.466019, 28.8766), (27.066902, -29.389263, 30.06084), (25.456545, -29.389263, 31.436214), (24.45369, -31.466019, 30.197792), (24.45369, -31.466019, 30.197792), (25.456545, -29.389263, 31.436214), (23.776413, -29.389263, 32.725426), (22.839746, -31.466019, 31.436214), (22.839746, -31.466019, 31.436214), (23.776413, -29.389263, 32.725426), (22.031113, -29.389263, 33.92494), (21.1632, -31.466019, 32.58847), (21.1632, -31.466019, 32.58847), (22.031113, -29.389263, 33.92494), (20.225426, -29.389263, 35.031464), (19.42865, -31.466019, 33.65141), (19.42865, -31.466019, 33.65141), (20.225426, -29.389263, 35.031464), (18.364302, -29.389263, 36.04197), (17.640844, -31.466019, 34.622105), (17.640844, -31.466019, 34.622105), (18.364302, -29.389263, 36.04197), (16.452843, -29.389263, 36.95369), (15.804687, -31.466019, 35.49791), (15.804687, -31.466019, 35.49791), (16.452843, -29.389263, 36.95369), (14.496288, -29.389263, 37.764122), (13.92521, -31.466019, 36.276413), (13.92521, -31.466019, 36.276413), (14.496288, -29.389263, 37.764122), (12.5, -29.389263, 38.471043), (12.0075655, -31.466019, 36.955486), (12.0075655, -31.466019, 36.955486), (12.5, -29.389263, 38.471043), (10.46945, -29.389263, 39.07252), (10.057009, -31.466019, 37.533268), (10.057009, -31.466019, 37.533268), (10.46945, -29.389263, 39.07252), (8.410205, -29.389263, 39.566902), (8.078887, -31.466019, 38.00817), (8.078887, -31.466019, 38.00817), (8.410205, -29.389263, 39.566902), (6.327907, -29.389263, 39.95283), (6.0786204, -31.466019, 38.3789), (6.0786204, -31.466019, 38.3789), (6.327907, -29.389263, 39.95283), (4.2282653, -29.389263, 40.229256), (4.0616937, -31.466019, 38.644432), (4.0616937, -31.466019, 38.644432), (4.2282653, -29.389263, 40.229256), (2.117034, -29.389263, 40.395412), (2.033634, -31.466019, 38.804047), (2.033634, -31.466019, 38.804047), (2.117034, -29.389263, 40.395412), (2.4769e-15, -29.389263, 40.45085), (2.3793234e-15, -31.466019, 38.8573), (2.3793234e-15, -31.466019, 38.8573), (2.4769e-15, -29.389263, 40.45085), (-2.117034, -29.389263, 40.395412), (-2.033634, -31.466019, 38.804047), (-2.033634, -31.466019, 38.804047), (-2.117034, -29.389263, 40.395412), (-4.2282653, -29.389263, 40.229256), (-4.0616937, -31.466019, 38.644432), (-4.0616937, -31.466019, 38.644432), (-4.2282653, -29.389263, 40.229256), (-6.327907, -29.389263, 39.95283), (-6.0786204, -31.466019, 38.3789), (-6.0786204, -31.466019, 38.3789), (-6.327907, -29.389263, 39.95283), (-8.410205, -29.389263, 39.566902), (-8.078887, -31.466019, 38.00817), (-8.078887, -31.466019, 38.00817), (-8.410205, -29.389263, 39.566902), (-10.46945, -29.389263, 39.07252), (-10.057009, -31.466019, 37.533268), (-10.057009, -31.466019, 37.533268), (-10.46945, -29.389263, 39.07252), (-12.5, -29.389263, 38.471043), (-12.0075655, -31.466019, 36.955486), (-12.0075655, -31.466019, 36.955486), (-12.5, -29.389263, 38.471043), (-14.496288, -29.389263, 37.764122), (-13.92521, -31.466019, 36.276413), (-13.92521, -31.466019, 36.276413), (-14.496288, -29.389263, 37.764122), (-16.452843, -29.389263, 36.95369), (-15.804687, -31.466019, 35.49791), (-15.804687, -31.466019, 35.49791), (-16.452843, -29.389263, 36.95369), (-18.364302, -29.389263, 36.04197), (-17.640844, -31.466019, 34.622105), (-17.640844, -31.466019, 34.622105), (-18.364302, -29.389263, 36.04197), (-20.225426, -29.389263, 35.031464), (-19.42865, -31.466019, 33.65141), (-19.42865, -31.466019, 33.65141), (-20.225426, -29.389263, 35.031464), (-22.031113, -29.389263, 33.92494), (-21.1632, -31.466019, 32.58847), (-21.1632, -31.466019, 32.58847), (-22.031113, -29.389263, 33.92494), (-23.776413, -29.389263, 32.725426), (-22.839746, -31.466019, 31.436214), (-22.839746, -31.466019, 31.436214), (-23.776413, -29.389263, 32.725426), (-25.456545, -29.389263, 31.436214), (-24.45369, -31.466019, 30.197792), (-24.45369, -31.466019, 30.197792), (-25.456545, -29.389263, 31.436214), (-27.066902, -29.389263, 30.06084), (-26.000607, -31.466019, 28.8766), (-26.000607, -31.466019, 28.8766), (-27.066902, -29.389263, 30.06084), (-28.60307, -29.389263, 28.60307), (-27.47626, -31.466019, 27.47626), (-27.47626, -31.466019, 27.47626), (-28.60307, -29.389263, 28.60307), (-30.06084, -29.389263, 27.066902), (-28.8766, -31.466019, 26.000607), (-28.8766, -31.466019, 26.000607), (-30.06084, -29.389263, 27.066902), (-31.436214, -29.389263, 25.456545), (-30.197792, -31.466019, 24.45369), (-30.197792, -31.466019, 24.45369), (-31.436214, -29.389263, 25.456545), (-32.725426, -29.389263, 23.776413), (-31.436214, -31.466019, 22.839746), (-31.436214, -31.466019, 22.839746), (-32.725426, -29.389263, 23.776413), (-33.92494, -29.389263, 22.031113), (-32.58847, -31.466019, 21.1632), (-32.58847, -31.466019, 21.1632), (-33.92494, -29.389263, 22.031113), (-35.031464, -29.389263, 20.225426), (-33.65141, -31.466019, 19.42865), (-33.65141, -31.466019, 19.42865), (-35.031464, -29.389263, 20.225426), (-36.04197, -29.389263, 18.364302), (-34.622105, -31.466019, 17.640844), (-34.622105, -31.466019, 17.640844), (-36.04197, -29.389263, 18.364302), (-36.95369, -29.389263, 16.452843), (-35.49791, -31.466019, 15.804687), (-35.49791, -31.466019, 15.804687), (-36.95369, -29.389263, 16.452843), (-37.764122, -29.389263, 14.496288), (-36.276413, -31.466019, 13.92521), (-36.276413, -31.466019, 13.92521), (-37.764122, -29.389263, 14.496288), (-38.471043, -29.389263, 12.5), (-36.955486, -31.466019, 12.0075655), (-36.955486, -31.466019, 12.0075655), (-38.471043, -29.389263, 12.5), (-39.07252, -29.389263, 10.46945), (-37.533268, -31.466019, 10.057009), (-37.533268, -31.466019, 10.057009), (-39.07252, -29.389263, 10.46945), (-39.566902, -29.389263, 8.410205), (-38.00817, -31.466019, 8.078887), (-38.00817, -31.466019, 8.078887), (-39.566902, -29.389263, 8.410205), (-39.95283, -29.389263, 6.327907), (-38.3789, -31.466019, 6.0786204), (-38.3789, -31.466019, 6.0786204), (-39.95283, -29.389263, 6.327907), (-40.229256, -29.389263, 4.2282653), (-38.644432, -31.466019, 4.0616937), (-38.644432, -31.466019, 4.0616937), (-40.229256, -29.389263, 4.2282653), (-40.395412, -29.389263, 2.117034), (-38.804047, -31.466019, 2.033634), (-38.804047, -31.466019, 2.033634), (-40.395412, -29.389263, 2.117034), (-40.45085, -29.389263, 4.9538e-15), (-38.8573, -31.466019, 4.7586468e-15), (-38.8573, -31.466019, 4.7586468e-15), (-40.45085, -29.389263, 4.9538e-15), (-40.395412, -29.389263, -2.117034), (-38.804047, -31.466019, -2.033634), (-38.804047, -31.466019, -2.033634), (-40.395412, -29.389263, -2.117034), (-40.229256, -29.389263, -4.2282653), (-38.644432, -31.466019, -4.0616937), (-38.644432, -31.466019, -4.0616937), (-40.229256, -29.389263, -4.2282653), (-39.95283, -29.389263, -6.327907), (-38.3789, -31.466019, -6.0786204), (-38.3789, -31.466019, -6.0786204), (-39.95283, -29.389263, -6.327907), (-39.566902, -29.389263, -8.410205), (-38.00817, -31.466019, -8.078887), (-38.00817, -31.466019, -8.078887), (-39.566902, -29.389263, -8.410205), (-39.07252, -29.389263, -10.46945), (-37.533268, -31.466019, -10.057009), (-37.533268, -31.466019, -10.057009), (-39.07252, -29.389263, -10.46945), (-38.471043, -29.389263, -12.5), (-36.955486, -31.466019, -12.0075655), (-36.955486, -31.466019, -12.0075655), (-38.471043, -29.389263, -12.5), (-37.764122, -29.389263, -14.496288), (-36.276413, -31.466019, -13.92521), (-36.276413, -31.466019, -13.92521), (-37.764122, -29.389263, -14.496288), (-36.95369, -29.389263, -16.452843), (-35.49791, -31.466019, -15.804687), (-35.49791, -31.466019, -15.804687), (-36.95369, -29.389263, -16.452843), (-36.04197, -29.389263, -18.364302), (-34.622105, -31.466019, -17.640844), (-34.622105, -31.466019, -17.640844), (-36.04197, -29.389263, -18.364302), (-35.031464, -29.389263, -20.225426), (-33.65141, -31.466019, -19.42865), (-33.65141, -31.466019, -19.42865), (-35.031464, -29.389263, -20.225426), (-33.92494, -29.389263, -22.031113), (-32.58847, -31.466019, -21.1632), (-32.58847, -31.466019, -21.1632), (-33.92494, -29.389263, -22.031113), (-32.725426, -29.389263, -23.776413), (-31.436214, -31.466019, -22.839746), (-31.436214, -31.466019, -22.839746), (-32.725426, -29.389263, -23.776413), (-31.436214, -29.389263, -25.456545), (-30.197792, -31.466019, -24.45369), (-30.197792, -31.466019, -24.45369), (-31.436214, -29.389263, -25.456545), (-30.06084, -29.389263, -27.066902), (-28.8766, -31.466019, -26.000607), (-28.8766, -31.466019, -26.000607), (-30.06084, -29.389263, -27.066902), (-28.60307, -29.389263, -28.60307), (-27.47626, -31.466019, -27.47626), (-27.47626, -31.466019, -27.47626), (-28.60307, -29.389263, -28.60307), (-27.066902, -29.389263, -30.06084), (-26.000607, -31.466019, -28.8766), (-26.000607, -31.466019, -28.8766), (-27.066902, -29.389263, -30.06084), (-25.456545, -29.389263, -31.436214), (-24.45369, -31.466019, -30.197792), (-24.45369, -31.466019, -30.197792), (-25.456545, -29.389263, -31.436214), (-23.776413, -29.389263, -32.725426), (-22.839746, -31.466019, -31.436214), (-22.839746, -31.466019, -31.436214), (-23.776413, -29.389263, -32.725426), (-22.031113, -29.389263, -33.92494), (-21.1632, -31.466019, -32.58847), (-21.1632, -31.466019, -32.58847), (-22.031113, -29.389263, -33.92494), (-20.225426, -29.389263, -35.031464), (-19.42865, -31.466019, -33.65141), (-19.42865, -31.466019, -33.65141), (-20.225426, -29.389263, -35.031464), (-18.364302, -29.389263, -36.04197), (-17.640844, -31.466019, -34.622105), (-17.640844, -31.466019, -34.622105), (-18.364302, -29.389263, -36.04197), (-16.452843, -29.389263, -36.95369), (-15.804687, -31.466019, -35.49791), (-15.804687, -31.466019, -35.49791), (-16.452843, -29.389263, -36.95369), (-14.496288, -29.389263, -37.764122), (-13.92521, -31.466019, -36.276413), (-13.92521, -31.466019, -36.276413), (-14.496288, -29.389263, -37.764122), (-12.5, -29.389263, -38.471043), (-12.0075655, -31.466019, -36.955486), (-12.0075655, -31.466019, -36.955486), (-12.5, -29.389263, -38.471043), (-10.46945, -29.389263, -39.07252), (-10.057009, -31.466019, -37.533268), (-10.057009, -31.466019, -37.533268), (-10.46945, -29.389263, -39.07252), (-8.410205, -29.389263, -39.566902), (-8.078887, -31.466019, -38.00817), (-8.078887, -31.466019, -38.00817), (-8.410205, -29.389263, -39.566902), (-6.327907, -29.389263, -39.95283), (-6.0786204, -31.466019, -38.3789), (-6.0786204, -31.466019, -38.3789), (-6.327907, -29.389263, -39.95283), (-4.2282653, -29.389263, -40.229256), (-4.0616937, -31.466019, -38.644432), (-4.0616937, -31.466019, -38.644432), (-4.2282653, -29.389263, -40.229256), (-2.117034, -29.389263, -40.395412), (-2.033634, -31.466019, -38.804047), (-2.033634, -31.466019, -38.804047), (-2.117034, -29.389263, -40.395412), (-7.430701e-15, -29.389263, -40.45085), (-7.1379695e-15, -31.466019, -38.8573), (-7.1379695e-15, -31.466019, -38.8573), (-7.430701e-15, -29.389263, -40.45085), (2.117034, -29.389263, -40.395412), (2.033634, -31.466019, -38.804047), (2.033634, -31.466019, -38.804047), (2.117034, -29.389263, -40.395412), (4.2282653, -29.389263, -40.229256), (4.0616937, -31.466019, -38.644432), (4.0616937, -31.466019, -38.644432), (4.2282653, -29.389263, -40.229256), (6.327907, -29.389263, -39.95283), (6.0786204, -31.466019, -38.3789), (6.0786204, -31.466019, -38.3789), (6.327907, -29.389263, -39.95283), (8.410205, -29.389263, -39.566902), (8.078887, -31.466019, -38.00817), (8.078887, -31.466019, -38.00817), (8.410205, -29.389263, -39.566902), (10.46945, -29.389263, -39.07252), (10.057009, -31.466019, -37.533268), (10.057009, -31.466019, -37.533268), (10.46945, -29.389263, -39.07252), (12.5, -29.389263, -38.471043), (12.0075655, -31.466019, -36.955486), (12.0075655, -31.466019, -36.955486), (12.5, -29.389263, -38.471043), (14.496288, -29.389263, -37.764122), (13.92521, -31.466019, -36.276413), (13.92521, -31.466019, -36.276413), (14.496288, -29.389263, -37.764122), (16.452843, -29.389263, -36.95369), (15.804687, -31.466019, -35.49791), (15.804687, -31.466019, -35.49791), (16.452843, -29.389263, -36.95369), (18.364302, -29.389263, -36.04197), (17.640844, -31.466019, -34.622105), (17.640844, -31.466019, -34.622105), (18.364302, -29.389263, -36.04197), (20.225426, -29.389263, -35.031464), (19.42865, -31.466019, -33.65141), (19.42865, -31.466019, -33.65141), (20.225426, -29.389263, -35.031464), (22.031113, -29.389263, -33.92494), (21.1632, -31.466019, -32.58847), (21.1632, -31.466019, -32.58847), (22.031113, -29.389263, -33.92494), (23.776413, -29.389263, -32.725426), (22.839746, -31.466019, -31.436214), (22.839746, -31.466019, -31.436214), (23.776413, -29.389263, -32.725426), (25.456545, -29.389263, -31.436214), (24.45369, -31.466019, -30.197792), (24.45369, -31.466019, -30.197792), (25.456545, -29.389263, -31.436214), (27.066902, -29.389263, -30.06084), (26.000607, -31.466019, -28.8766), (26.000607, -31.466019, -28.8766), (27.066902, -29.389263, -30.06084), (28.60307, -29.389263, -28.60307), (27.47626, -31.466019, -27.47626), (27.47626, -31.466019, -27.47626), (28.60307, -29.389263, -28.60307), (30.06084, -29.389263, -27.066902), (28.8766, -31.466019, -26.000607), (28.8766, -31.466019, -26.000607), (30.06084, -29.389263, -27.066902), (31.436214, -29.389263, -25.456545), (30.197792, -31.466019, -24.45369), (30.197792, -31.466019, -24.45369), (31.436214, -29.389263, -25.456545), (32.725426, -29.389263, -23.776413), (31.436214, -31.466019, -22.839746), (31.436214, -31.466019, -22.839746), (32.725426, -29.389263, -23.776413), (33.92494, -29.389263, -22.031113), (32.58847, -31.466019, -21.1632), (32.58847, -31.466019, -21.1632), (33.92494, -29.389263, -22.031113), (35.031464, -29.389263, -20.225426), (33.65141, -31.466019, -19.42865), (33.65141, -31.466019, -19.42865), (35.031464, -29.389263, -20.225426), (36.04197, -29.389263, -18.364302), (34.622105, -31.466019, -17.640844), (34.622105, -31.466019, -17.640844), (36.04197, -29.389263, -18.364302), (36.95369, -29.389263, -16.452843), (35.49791, -31.466019, -15.804687), (35.49791, -31.466019, -15.804687), (36.95369, -29.389263, -16.452843), (37.764122, -29.389263, -14.496288), (36.276413, -31.466019, -13.92521), (36.276413, -31.466019, -13.92521), (37.764122, -29.389263, -14.496288), (38.471043, -29.389263, -12.5), (36.955486, -31.466019, -12.0075655), (36.955486, -31.466019, -12.0075655), (38.471043, -29.389263, -12.5), (39.07252, -29.389263, -10.46945), (37.533268, -31.466019, -10.057009), (37.533268, -31.466019, -10.057009), (39.07252, -29.389263, -10.46945), (39.566902, -29.389263, -8.410205), (38.00817, -31.466019, -8.078887), (38.00817, -31.466019, -8.078887), (39.566902, -29.389263, -8.410205), (39.95283, -29.389263, -6.327907), (38.3789, -31.466019, -6.0786204), (38.3789, -31.466019, -6.0786204), (39.95283, -29.389263, -6.327907), (40.229256, -29.389263, -4.2282653), (38.644432, -31.466019, -4.0616937), (38.644432, -31.466019, -4.0616937), (40.229256, -29.389263, -4.2282653), (40.395412, -29.389263, -2.117034), (38.804047, -31.466019, -2.033634), (38.804047, -31.466019, -2.033634), (40.395412, -29.389263, -2.117034), (40.45085, -29.389263, 0), (38.8573, -31.466019, 0), (40.45085, -29.389263, 0), (41.93353, -27.231953, 0), (41.87606, -27.231953, 2.1946313), (40.395412, -29.389263, 2.117034), (40.395412, -29.389263, 2.117034), (41.87606, -27.231953, 2.1946313), (41.70381, -27.231953, 4.3832474), (40.229256, -29.389263, 4.2282653), (40.229256, -29.389263, 4.2282653), (41.70381, -27.231953, 4.3832474), (41.417255, -27.231953, 6.5598493), (39.95283, -29.389263, 6.327907), (39.95283, -29.389263, 6.327907), (41.417255, -27.231953, 6.5598493), (41.01718, -27.231953, 8.718471), (39.566902, -29.389263, 8.410205), (39.566902, -29.389263, 8.410205), (41.01718, -27.231953, 8.718471), (40.504677, -27.231953, 10.853196), (39.07252, -29.389263, 10.46945), (39.07252, -29.389263, 10.46945), (40.504677, -27.231953, 10.853196), (39.881157, -27.231953, 12.958173), (38.471043, -29.389263, 12.5), (38.471043, -29.389263, 12.5), (39.881157, -27.231953, 12.958173), (39.148323, -27.231953, 15.027633), (37.764122, -29.389263, 14.496288), (37.764122, -29.389263, 14.496288), (39.148323, -27.231953, 15.027633), (38.308186, -27.231953, 17.055902), (36.95369, -29.389263, 16.452843), (36.95369, -29.389263, 16.452843), (38.308186, -27.231953, 17.055902), (37.36305, -27.231953, 19.037424), (36.04197, -29.389263, 18.364302), (36.04197, -29.389263, 18.364302), (37.36305, -27.231953, 19.037424), (36.315502, -27.231953, 20.966764), (35.031464, -29.389263, 20.225426), (35.031464, -29.389263, 20.225426), (36.315502, -27.231953, 20.966764), (35.168415, -27.231953, 22.838636), (33.92494, -29.389263, 22.031113), (33.92494, -29.389263, 22.031113), (35.168415, -27.231953, 22.838636), (33.92494, -27.231953, 24.64791), (32.725426, -29.389263, 23.776413), (32.725426, -29.389263, 23.776413), (33.92494, -27.231953, 24.64791), (32.58847, -27.231953, 26.389624), (31.436214, -29.389263, 25.456545), (31.436214, -29.389263, 25.456545), (32.58847, -27.231953, 26.389624), (31.162685, -27.231953, 28.059008), (30.06084, -29.389263, 27.066902), (30.06084, -29.389263, 27.066902), (31.162685, -27.231953, 28.059008), (29.651482, -27.231953, 29.651482), (28.60307, -29.389263, 28.60307), (28.60307, -29.389263, 28.60307), (29.651482, -27.231953, 29.651482), (28.059008, -27.231953, 31.162685), (27.066902, -29.389263, 30.06084), (27.066902, -29.389263, 30.06084), (28.059008, -27.231953, 31.162685), (26.389624, -27.231953, 32.58847), (25.456545, -29.389263, 31.436214), (25.456545, -29.389263, 31.436214), (26.389624, -27.231953, 32.58847), (24.64791, -27.231953, 33.92494), (23.776413, -29.389263, 32.725426), (23.776413, -29.389263, 32.725426), (24.64791, -27.231953, 33.92494), (22.838636, -27.231953, 35.168415), (22.031113, -29.389263, 33.92494), (22.031113, -29.389263, 33.92494), (22.838636, -27.231953, 35.168415), (20.966764, -27.231953, 36.315502), (20.225426, -29.389263, 35.031464), (20.225426, -29.389263, 35.031464), (20.966764, -27.231953, 36.315502), (19.037424, -27.231953, 37.36305), (18.364302, -29.389263, 36.04197), (18.364302, -29.389263, 36.04197), (19.037424, -27.231953, 37.36305), (17.055902, -27.231953, 38.308186), (16.452843, -29.389263, 36.95369), (16.452843, -29.389263, 36.95369), (17.055902, -27.231953, 38.308186), (15.027633, -27.231953, 39.148323), (14.496288, -29.389263, 37.764122), (14.496288, -29.389263, 37.764122), (15.027633, -27.231953, 39.148323), (12.958173, -27.231953, 39.881157), (12.5, -29.389263, 38.471043), (12.5, -29.389263, 38.471043), (12.958173, -27.231953, 39.881157), (10.853196, -27.231953, 40.504677), (10.46945, -29.389263, 39.07252), (10.46945, -29.389263, 39.07252), (10.853196, -27.231953, 40.504677), (8.718471, -27.231953, 41.01718), (8.410205, -29.389263, 39.566902), (8.410205, -29.389263, 39.566902), (8.718471, -27.231953, 41.01718), (6.5598493, -27.231953, 41.417255), (6.327907, -29.389263, 39.95283), (6.327907, -29.389263, 39.95283), (6.5598493, -27.231953, 41.417255), (4.3832474, -27.231953, 41.70381), (4.2282653, -29.389263, 40.229256), (4.2282653, -29.389263, 40.229256), (4.3832474, -27.231953, 41.70381), (2.1946313, -27.231953, 41.87606), (2.117034, -29.389263, 40.395412), (2.117034, -29.389263, 40.395412), (2.1946313, -27.231953, 41.87606), (2.567688e-15, -27.231953, 41.93353), (2.4769e-15, -29.389263, 40.45085), (2.4769e-15, -29.389263, 40.45085), (2.567688e-15, -27.231953, 41.93353), (-2.1946313, -27.231953, 41.87606), (-2.117034, -29.389263, 40.395412), (-2.117034, -29.389263, 40.395412), (-2.1946313, -27.231953, 41.87606), (-4.3832474, -27.231953, 41.70381), (-4.2282653, -29.389263, 40.229256), (-4.2282653, -29.389263, 40.229256), (-4.3832474, -27.231953, 41.70381), (-6.5598493, -27.231953, 41.417255), (-6.327907, -29.389263, 39.95283), (-6.327907, -29.389263, 39.95283), (-6.5598493, -27.231953, 41.417255), (-8.718471, -27.231953, 41.01718), (-8.410205, -29.389263, 39.566902), (-8.410205, -29.389263, 39.566902), (-8.718471, -27.231953, 41.01718), (-10.853196, -27.231953, 40.504677), (-10.46945, -29.389263, 39.07252), (-10.46945, -29.389263, 39.07252), (-10.853196, -27.231953, 40.504677), (-12.958173, -27.231953, 39.881157), (-12.5, -29.389263, 38.471043), (-12.5, -29.389263, 38.471043), (-12.958173, -27.231953, 39.881157), (-15.027633, -27.231953, 39.148323), (-14.496288, -29.389263, 37.764122), (-14.496288, -29.389263, 37.764122), (-15.027633, -27.231953, 39.148323), (-17.055902, -27.231953, 38.308186), (-16.452843, -29.389263, 36.95369), (-16.452843, -29.389263, 36.95369), (-17.055902, -27.231953, 38.308186), (-19.037424, -27.231953, 37.36305), (-18.364302, -29.389263, 36.04197), (-18.364302, -29.389263, 36.04197), (-19.037424, -27.231953, 37.36305), (-20.966764, -27.231953, 36.315502), (-20.225426, -29.389263, 35.031464), (-20.225426, -29.389263, 35.031464), (-20.966764, -27.231953, 36.315502), (-22.838636, -27.231953, 35.168415), (-22.031113, -29.389263, 33.92494), (-22.031113, -29.389263, 33.92494), (-22.838636, -27.231953, 35.168415), (-24.64791, -27.231953, 33.92494), (-23.776413, -29.389263, 32.725426), (-23.776413, -29.389263, 32.725426), (-24.64791, -27.231953, 33.92494), (-26.389624, -27.231953, 32.58847), (-25.456545, -29.389263, 31.436214), (-25.456545, -29.389263, 31.436214), (-26.389624, -27.231953, 32.58847), (-28.059008, -27.231953, 31.162685), (-27.066902, -29.389263, 30.06084), (-27.066902, -29.389263, 30.06084), (-28.059008, -27.231953, 31.162685), (-29.651482, -27.231953, 29.651482), (-28.60307, -29.389263, 28.60307), (-28.60307, -29.389263, 28.60307), (-29.651482, -27.231953, 29.651482), (-31.162685, -27.231953, 28.059008), (-30.06084, -29.389263, 27.066902), (-30.06084, -29.389263, 27.066902), (-31.162685, -27.231953, 28.059008), (-32.58847, -27.231953, 26.389624), (-31.436214, -29.389263, 25.456545), (-31.436214, -29.389263, 25.456545), (-32.58847, -27.231953, 26.389624), (-33.92494, -27.231953, 24.64791), (-32.725426, -29.389263, 23.776413), (-32.725426, -29.389263, 23.776413), (-33.92494, -27.231953, 24.64791), (-35.168415, -27.231953, 22.838636), (-33.92494, -29.389263, 22.031113), (-33.92494, -29.389263, 22.031113), (-35.168415, -27.231953, 22.838636), (-36.315502, -27.231953, 20.966764), (-35.031464, -29.389263, 20.225426), (-35.031464, -29.389263, 20.225426), (-36.315502, -27.231953, 20.966764), (-37.36305, -27.231953, 19.037424), (-36.04197, -29.389263, 18.364302), (-36.04197, -29.389263, 18.364302), (-37.36305, -27.231953, 19.037424), (-38.308186, -27.231953, 17.055902), (-36.95369, -29.389263, 16.452843), (-36.95369, -29.389263, 16.452843), (-38.308186, -27.231953, 17.055902), (-39.148323, -27.231953, 15.027633), (-37.764122, -29.389263, 14.496288), (-37.764122, -29.389263, 14.496288), (-39.148323, -27.231953, 15.027633), (-39.881157, -27.231953, 12.958173), (-38.471043, -29.389263, 12.5), (-38.471043, -29.389263, 12.5), (-39.881157, -27.231953, 12.958173), (-40.504677, -27.231953, 10.853196), (-39.07252, -29.389263, 10.46945), (-39.07252, -29.389263, 10.46945), (-40.504677, -27.231953, 10.853196), (-41.01718, -27.231953, 8.718471), (-39.566902, -29.389263, 8.410205), (-39.566902, -29.389263, 8.410205), (-41.01718, -27.231953, 8.718471), (-41.417255, -27.231953, 6.5598493), (-39.95283, -29.389263, 6.327907), (-39.95283, -29.389263, 6.327907), (-41.417255, -27.231953, 6.5598493), (-41.70381, -27.231953, 4.3832474), (-40.229256, -29.389263, 4.2282653), (-40.229256, -29.389263, 4.2282653), (-41.70381, -27.231953, 4.3832474), (-41.87606, -27.231953, 2.1946313), (-40.395412, -29.389263, 2.117034), (-40.395412, -29.389263, 2.117034), (-41.87606, -27.231953, 2.1946313), (-41.93353, -27.231953, 5.135376e-15), (-40.45085, -29.389263, 4.9538e-15), (-40.45085, -29.389263, 4.9538e-15), (-41.93353, -27.231953, 5.135376e-15), (-41.87606, -27.231953, -2.1946313), (-40.395412, -29.389263, -2.117034), (-40.395412, -29.389263, -2.117034), (-41.87606, -27.231953, -2.1946313), (-41.70381, -27.231953, -4.3832474), (-40.229256, -29.389263, -4.2282653), (-40.229256, -29.389263, -4.2282653), (-41.70381, -27.231953, -4.3832474), (-41.417255, -27.231953, -6.5598493), (-39.95283, -29.389263, -6.327907), (-39.95283, -29.389263, -6.327907), (-41.417255, -27.231953, -6.5598493), (-41.01718, -27.231953, -8.718471), (-39.566902, -29.389263, -8.410205), (-39.566902, -29.389263, -8.410205), (-41.01718, -27.231953, -8.718471), (-40.504677, -27.231953, -10.853196), (-39.07252, -29.389263, -10.46945), (-39.07252, -29.389263, -10.46945), (-40.504677, -27.231953, -10.853196), (-39.881157, -27.231953, -12.958173), (-38.471043, -29.389263, -12.5), (-38.471043, -29.389263, -12.5), (-39.881157, -27.231953, -12.958173), (-39.148323, -27.231953, -15.027633), (-37.764122, -29.389263, -14.496288), (-37.764122, -29.389263, -14.496288), (-39.148323, -27.231953, -15.027633), (-38.308186, -27.231953, -17.055902), (-36.95369, -29.389263, -16.452843), (-36.95369, -29.389263, -16.452843), (-38.308186, -27.231953, -17.055902), (-37.36305, -27.231953, -19.037424), (-36.04197, -29.389263, -18.364302), (-36.04197, -29.389263, -18.364302), (-37.36305, -27.231953, -19.037424), (-36.315502, -27.231953, -20.966764), (-35.031464, -29.389263, -20.225426), (-35.031464, -29.389263, -20.225426), (-36.315502, -27.231953, -20.966764), (-35.168415, -27.231953, -22.838636), (-33.92494, -29.389263, -22.031113), (-33.92494, -29.389263, -22.031113), (-35.168415, -27.231953, -22.838636), (-33.92494, -27.231953, -24.64791), (-32.725426, -29.389263, -23.776413), (-32.725426, -29.389263, -23.776413), (-33.92494, -27.231953, -24.64791), (-32.58847, -27.231953, -26.389624), (-31.436214, -29.389263, -25.456545), (-31.436214, -29.389263, -25.456545), (-32.58847, -27.231953, -26.389624), (-31.162685, -27.231953, -28.059008), (-30.06084, -29.389263, -27.066902), (-30.06084, -29.389263, -27.066902), (-31.162685, -27.231953, -28.059008), (-29.651482, -27.231953, -29.651482), (-28.60307, -29.389263, -28.60307), (-28.60307, -29.389263, -28.60307), (-29.651482, -27.231953, -29.651482), (-28.059008, -27.231953, -31.162685), (-27.066902, -29.389263, -30.06084), (-27.066902, -29.389263, -30.06084), (-28.059008, -27.231953, -31.162685), (-26.389624, -27.231953, -32.58847), (-25.456545, -29.389263, -31.436214), (-25.456545, -29.389263, -31.436214), (-26.389624, -27.231953, -32.58847), (-24.64791, -27.231953, -33.92494), (-23.776413, -29.389263, -32.725426), (-23.776413, -29.389263, -32.725426), (-24.64791, -27.231953, -33.92494), (-22.838636, -27.231953, -35.168415), (-22.031113, -29.389263, -33.92494), (-22.031113, -29.389263, -33.92494), (-22.838636, -27.231953, -35.168415), (-20.966764, -27.231953, -36.315502), (-20.225426, -29.389263, -35.031464), (-20.225426, -29.389263, -35.031464), (-20.966764, -27.231953, -36.315502), (-19.037424, -27.231953, -37.36305), (-18.364302, -29.389263, -36.04197), (-18.364302, -29.389263, -36.04197), (-19.037424, -27.231953, -37.36305), (-17.055902, -27.231953, -38.308186), (-16.452843, -29.389263, -36.95369), (-16.452843, -29.389263, -36.95369), (-17.055902, -27.231953, -38.308186), (-15.027633, -27.231953, -39.148323), (-14.496288, -29.389263, -37.764122), (-14.496288, -29.389263, -37.764122), (-15.027633, -27.231953, -39.148323), (-12.958173, -27.231953, -39.881157), (-12.5, -29.389263, -38.471043), (-12.5, -29.389263, -38.471043), (-12.958173, -27.231953, -39.881157), (-10.853196, -27.231953, -40.504677), (-10.46945, -29.389263, -39.07252), (-10.46945, -29.389263, -39.07252), (-10.853196, -27.231953, -40.504677), (-8.718471, -27.231953, -41.01718), (-8.410205, -29.389263, -39.566902), (-8.410205, -29.389263, -39.566902), (-8.718471, -27.231953, -41.01718), (-6.5598493, -27.231953, -41.417255), (-6.327907, -29.389263, -39.95283), (-6.327907, -29.389263, -39.95283), (-6.5598493, -27.231953, -41.417255), (-4.3832474, -27.231953, -41.70381), (-4.2282653, -29.389263, -40.229256), (-4.2282653, -29.389263, -40.229256), (-4.3832474, -27.231953, -41.70381), (-2.1946313, -27.231953, -41.87606), (-2.117034, -29.389263, -40.395412), (-2.117034, -29.389263, -40.395412), (-2.1946313, -27.231953, -41.87606), (-7.703064e-15, -27.231953, -41.93353), (-7.430701e-15, -29.389263, -40.45085), (-7.430701e-15, -29.389263, -40.45085), (-7.703064e-15, -27.231953, -41.93353), (2.1946313, -27.231953, -41.87606), (2.117034, -29.389263, -40.395412), (2.117034, -29.389263, -40.395412), (2.1946313, -27.231953, -41.87606), (4.3832474, -27.231953, -41.70381), (4.2282653, -29.389263, -40.229256), (4.2282653, -29.389263, -40.229256), (4.3832474, -27.231953, -41.70381), (6.5598493, -27.231953, -41.417255), (6.327907, -29.389263, -39.95283), (6.327907, -29.389263, -39.95283), (6.5598493, -27.231953, -41.417255), (8.718471, -27.231953, -41.01718), (8.410205, -29.389263, -39.566902), (8.410205, -29.389263, -39.566902), (8.718471, -27.231953, -41.01718), (10.853196, -27.231953, -40.504677), (10.46945, -29.389263, -39.07252), (10.46945, -29.389263, -39.07252), (10.853196, -27.231953, -40.504677), (12.958173, -27.231953, -39.881157), (12.5, -29.389263, -38.471043), (12.5, -29.389263, -38.471043), (12.958173, -27.231953, -39.881157), (15.027633, -27.231953, -39.148323), (14.496288, -29.389263, -37.764122), (14.496288, -29.389263, -37.764122), (15.027633, -27.231953, -39.148323), (17.055902, -27.231953, -38.308186), (16.452843, -29.389263, -36.95369), (16.452843, -29.389263, -36.95369), (17.055902, -27.231953, -38.308186), (19.037424, -27.231953, -37.36305), (18.364302, -29.389263, -36.04197), (18.364302, -29.389263, -36.04197), (19.037424, -27.231953, -37.36305), (20.966764, -27.231953, -36.315502), (20.225426, -29.389263, -35.031464), (20.225426, -29.389263, -35.031464), (20.966764, -27.231953, -36.315502), (22.838636, -27.231953, -35.168415), (22.031113, -29.389263, -33.92494), (22.031113, -29.389263, -33.92494), (22.838636, -27.231953, -35.168415), (24.64791, -27.231953, -33.92494), (23.776413, -29.389263, -32.725426), (23.776413, -29.389263, -32.725426), (24.64791, -27.231953, -33.92494), (26.389624, -27.231953, -32.58847), (25.456545, -29.389263, -31.436214), (25.456545, -29.389263, -31.436214), (26.389624, -27.231953, -32.58847), (28.059008, -27.231953, -31.162685), (27.066902, -29.389263, -30.06084), (27.066902, -29.389263, -30.06084), (28.059008, -27.231953, -31.162685), (29.651482, -27.231953, -29.651482), (28.60307, -29.389263, -28.60307), (28.60307, -29.389263, -28.60307), (29.651482, -27.231953, -29.651482), (31.162685, -27.231953, -28.059008), (30.06084, -29.389263, -27.066902), (30.06084, -29.389263, -27.066902), (31.162685, -27.231953, -28.059008), (32.58847, -27.231953, -26.389624), (31.436214, -29.389263, -25.456545), (31.436214, -29.389263, -25.456545), (32.58847, -27.231953, -26.389624), (33.92494, -27.231953, -24.64791), (32.725426, -29.389263, -23.776413), (32.725426, -29.389263, -23.776413), (33.92494, -27.231953, -24.64791), (35.168415, -27.231953, -22.838636), (33.92494, -29.389263, -22.031113), (33.92494, -29.389263, -22.031113), (35.168415, -27.231953, -22.838636), (36.315502, -27.231953, -20.966764), (35.031464, -29.389263, -20.225426), (35.031464, -29.389263, -20.225426), (36.315502, -27.231953, -20.966764), (37.36305, -27.231953, -19.037424), (36.04197, -29.389263, -18.364302), (36.04197, -29.389263, -18.364302), (37.36305, -27.231953, -19.037424), (38.308186, -27.231953, -17.055902), (36.95369, -29.389263, -16.452843), (36.95369, -29.389263, -16.452843), (38.308186, -27.231953, -17.055902), (39.148323, -27.231953, -15.027633), (37.764122, -29.389263, -14.496288), (37.764122, -29.389263, -14.496288), (39.148323, -27.231953, -15.027633), (39.881157, -27.231953, -12.958173), (38.471043, -29.389263, -12.5), (38.471043, -29.389263, -12.5), (39.881157, -27.231953, -12.958173), (40.504677, -27.231953, -10.853196), (39.07252, -29.389263, -10.46945), (39.07252, -29.389263, -10.46945), (40.504677, -27.231953, -10.853196), (41.01718, -27.231953, -8.718471), (39.566902, -29.389263, -8.410205), (39.566902, -29.389263, -8.410205), (41.01718, -27.231953, -8.718471), (41.417255, -27.231953, -6.5598493), (39.95283, -29.389263, -6.327907), (39.95283, -29.389263, -6.327907), (41.417255, -27.231953, -6.5598493), (41.70381, -27.231953, -4.3832474), (40.229256, -29.389263, -4.2282653), (40.229256, -29.389263, -4.2282653), (41.70381, -27.231953, -4.3832474), (41.87606, -27.231953, -2.1946313), (40.395412, -29.389263, -2.117034), (40.395412, -29.389263, -2.117034), (41.87606, -27.231953, -2.1946313), (41.93353, -27.231953, 0), (40.45085, -29.389263, 0), (41.93353, -27.231953, 0), (43.30127, -25, 0), (43.24193, -25, 2.2662134), (41.87606, -27.231953, 2.1946313), (41.87606, -27.231953, 2.1946313), (43.24193, -25, 2.2662134), (43.06406, -25, 4.526215), (41.70381, -27.231953, 4.3832474), (41.70381, -27.231953, 4.3832474), (43.06406, -25, 4.526215), (42.768158, -25, 6.773811), (41.417255, -27.231953, 6.5598493), (41.417255, -27.231953, 6.5598493), (42.768158, -25, 6.773811), (42.355034, -25, 9.00284), (41.01718, -27.231953, 8.718471), (41.01718, -27.231953, 8.718471), (42.355034, -25, 9.00284), (41.825813, -25, 11.207193), (40.504677, -27.231953, 10.853196), (40.504677, -27.231953, 10.853196), (41.825813, -25, 11.207193), (41.181953, -25, 13.380828), (39.881157, -27.231953, 12.958173), (39.881157, -27.231953, 12.958173), (41.181953, -25, 13.380828), (40.425217, -25, 15.517787), (39.148323, -27.231953, 15.027633), (39.148323, -27.231953, 15.027633), (40.425217, -25, 15.517787), (39.55768, -25, 17.612213), (38.308186, -27.231953, 17.055902), (38.308186, -27.231953, 17.055902), (39.55768, -25, 17.612213), (38.581715, -25, 19.658365), (37.36305, -27.231953, 19.037424), (37.36305, -27.231953, 19.037424), (38.581715, -25, 19.658365), (37.5, -25, 21.650635), (36.315502, -27.231953, 20.966764), (36.315502, -27.231953, 20.966764), (37.5, -25, 21.650635), (36.315502, -25, 23.583563), (35.168415, -27.231953, 22.838636), (35.168415, -27.231953, 22.838636), (36.315502, -25, 23.583563), (35.031464, -25, 25.451847), (33.92494, -27.231953, 24.64791), (33.92494, -27.231953, 24.64791), (35.031464, -25, 25.451847), (33.65141, -25, 27.250372), (32.58847, -27.231953, 26.389624), (32.58847, -27.231953, 26.389624), (33.65141, -25, 27.250372), (32.179115, -25, 28.974205), (31.162685, -27.231953, 28.059008), (31.162685, -27.231953, 28.059008), (32.179115, -25, 28.974205), (30.618622, -25, 30.618622), (29.651482, -27.231953, 29.651482), (29.651482, -27.231953, 29.651482), (30.618622, -25, 30.618622), (28.974205, -25, 32.179115), (28.059008, -27.231953, 31.162685), (28.059008, -27.231953, 31.162685), (28.974205, -25, 32.179115), (27.250372, -25, 33.65141), (26.389624, -27.231953, 32.58847), (26.389624, -27.231953, 32.58847), (27.250372, -25, 33.65141), (25.451847, -25, 35.031464), (24.64791, -27.231953, 33.92494), (24.64791, -27.231953, 33.92494), (25.451847, -25, 35.031464), (23.583563, -25, 36.315502), (22.838636, -27.231953, 35.168415), (22.838636, -27.231953, 35.168415), (23.583563, -25, 36.315502), (21.650635, -25, 37.5), (20.966764, -27.231953, 36.315502), (20.966764, -27.231953, 36.315502), (21.650635, -25, 37.5), (19.658365, -25, 38.581715), (19.037424, -27.231953, 37.36305), (19.037424, -27.231953, 37.36305), (19.658365, -25, 38.581715), (17.612213, -25, 39.55768), (17.055902, -27.231953, 38.308186), (17.055902, -27.231953, 38.308186), (17.612213, -25, 39.55768), (15.517787, -25, 40.425217), (15.027633, -27.231953, 39.148323), (15.027633, -27.231953, 39.148323), (15.517787, -25, 40.425217), (13.380828, -25, 41.181953), (12.958173, -27.231953, 39.881157), (12.958173, -27.231953, 39.881157), (13.380828, -25, 41.181953), (11.207193, -25, 41.825813), (10.853196, -27.231953, 40.504677), (10.853196, -27.231953, 40.504677), (11.207193, -25, 41.825813), (9.00284, -25, 42.355034), (8.718471, -27.231953, 41.01718), (8.718471, -27.231953, 41.01718), (9.00284, -25, 42.355034), (6.773811, -25, 42.768158), (6.5598493, -27.231953, 41.417255), (6.5598493, -27.231953, 41.417255), (6.773811, -25, 42.768158), (4.526215, -25, 43.06406), (4.3832474, -27.231953, 41.70381), (4.3832474, -27.231953, 41.70381), (4.526215, -25, 43.06406), (2.2662134, -25, 43.24193), (2.1946313, -27.231953, 41.87606), (2.1946313, -27.231953, 41.87606), (2.2662134, -25, 43.24193), (2.651438e-15, -25, 43.30127), (2.567688e-15, -27.231953, 41.93353), (2.567688e-15, -27.231953, 41.93353), (2.651438e-15, -25, 43.30127), (-2.2662134, -25, 43.24193), (-2.1946313, -27.231953, 41.87606), (-2.1946313, -27.231953, 41.87606), (-2.2662134, -25, 43.24193), (-4.526215, -25, 43.06406), (-4.3832474, -27.231953, 41.70381), (-4.3832474, -27.231953, 41.70381), (-4.526215, -25, 43.06406), (-6.773811, -25, 42.768158), (-6.5598493, -27.231953, 41.417255), (-6.5598493, -27.231953, 41.417255), (-6.773811, -25, 42.768158), (-9.00284, -25, 42.355034), (-8.718471, -27.231953, 41.01718), (-8.718471, -27.231953, 41.01718), (-9.00284, -25, 42.355034), (-11.207193, -25, 41.825813), (-10.853196, -27.231953, 40.504677), (-10.853196, -27.231953, 40.504677), (-11.207193, -25, 41.825813), (-13.380828, -25, 41.181953), (-12.958173, -27.231953, 39.881157), (-12.958173, -27.231953, 39.881157), (-13.380828, -25, 41.181953), (-15.517787, -25, 40.425217), (-15.027633, -27.231953, 39.148323), (-15.027633, -27.231953, 39.148323), (-15.517787, -25, 40.425217), (-17.612213, -25, 39.55768), (-17.055902, -27.231953, 38.308186), (-17.055902, -27.231953, 38.308186), (-17.612213, -25, 39.55768), (-19.658365, -25, 38.581715), (-19.037424, -27.231953, 37.36305), (-19.037424, -27.231953, 37.36305), (-19.658365, -25, 38.581715), (-21.650635, -25, 37.5), (-20.966764, -27.231953, 36.315502), (-20.966764, -27.231953, 36.315502), (-21.650635, -25, 37.5), (-23.583563, -25, 36.315502), (-22.838636, -27.231953, 35.168415), (-22.838636, -27.231953, 35.168415), (-23.583563, -25, 36.315502), (-25.451847, -25, 35.031464), (-24.64791, -27.231953, 33.92494), (-24.64791, -27.231953, 33.92494), (-25.451847, -25, 35.031464), (-27.250372, -25, 33.65141), (-26.389624, -27.231953, 32.58847), (-26.389624, -27.231953, 32.58847), (-27.250372, -25, 33.65141), (-28.974205, -25, 32.179115), (-28.059008, -27.231953, 31.162685), (-28.059008, -27.231953, 31.162685), (-28.974205, -25, 32.179115), (-30.618622, -25, 30.618622), (-29.651482, -27.231953, 29.651482), (-29.651482, -27.231953, 29.651482), (-30.618622, -25, 30.618622), (-32.179115, -25, 28.974205), (-31.162685, -27.231953, 28.059008), (-31.162685, -27.231953, 28.059008), (-32.179115, -25, 28.974205), (-33.65141, -25, 27.250372), (-32.58847, -27.231953, 26.389624), (-32.58847, -27.231953, 26.389624), (-33.65141, -25, 27.250372), (-35.031464, -25, 25.451847), (-33.92494, -27.231953, 24.64791), (-33.92494, -27.231953, 24.64791), (-35.031464, -25, 25.451847), (-36.315502, -25, 23.583563), (-35.168415, -27.231953, 22.838636), (-35.168415, -27.231953, 22.838636), (-36.315502, -25, 23.583563), (-37.5, -25, 21.650635), (-36.315502, -27.231953, 20.966764), (-36.315502, -27.231953, 20.966764), (-37.5, -25, 21.650635), (-38.581715, -25, 19.658365), (-37.36305, -27.231953, 19.037424), (-37.36305, -27.231953, 19.037424), (-38.581715, -25, 19.658365), (-39.55768, -25, 17.612213), (-38.308186, -27.231953, 17.055902), (-38.308186, -27.231953, 17.055902), (-39.55768, -25, 17.612213), (-40.425217, -25, 15.517787), (-39.148323, -27.231953, 15.027633), (-39.148323, -27.231953, 15.027633), (-40.425217, -25, 15.517787), (-41.181953, -25, 13.380828), (-39.881157, -27.231953, 12.958173), (-39.881157, -27.231953, 12.958173), (-41.181953, -25, 13.380828), (-41.825813, -25, 11.207193), (-40.504677, -27.231953, 10.853196), (-40.504677, -27.231953, 10.853196), (-41.825813, -25, 11.207193), (-42.355034, -25, 9.00284), (-41.01718, -27.231953, 8.718471), (-41.01718, -27.231953, 8.718471), (-42.355034, -25, 9.00284), (-42.768158, -25, 6.773811), (-41.417255, -27.231953, 6.5598493), (-41.417255, -27.231953, 6.5598493), (-42.768158, -25, 6.773811), (-43.06406, -25, 4.526215), (-41.70381, -27.231953, 4.3832474), (-41.70381, -27.231953, 4.3832474), (-43.06406, -25, 4.526215), (-43.24193, -25, 2.2662134), (-41.87606, -27.231953, 2.1946313), (-41.87606, -27.231953, 2.1946313), (-43.24193, -25, 2.2662134), (-43.30127, -25, 5.302876e-15), (-41.93353, -27.231953, 5.135376e-15), (-41.93353, -27.231953, 5.135376e-15), (-43.30127, -25, 5.302876e-15), (-43.24193, -25, -2.2662134), (-41.87606, -27.231953, -2.1946313), (-41.87606, -27.231953, -2.1946313), (-43.24193, -25, -2.2662134), (-43.06406, -25, -4.526215), (-41.70381, -27.231953, -4.3832474), (-41.70381, -27.231953, -4.3832474), (-43.06406, -25, -4.526215), (-42.768158, -25, -6.773811), (-41.417255, -27.231953, -6.5598493), (-41.417255, -27.231953, -6.5598493), (-42.768158, -25, -6.773811), (-42.355034, -25, -9.00284), (-41.01718, -27.231953, -8.718471), (-41.01718, -27.231953, -8.718471), (-42.355034, -25, -9.00284), (-41.825813, -25, -11.207193), (-40.504677, -27.231953, -10.853196), (-40.504677, -27.231953, -10.853196), (-41.825813, -25, -11.207193), (-41.181953, -25, -13.380828), (-39.881157, -27.231953, -12.958173), (-39.881157, -27.231953, -12.958173), (-41.181953, -25, -13.380828), (-40.425217, -25, -15.517787), (-39.148323, -27.231953, -15.027633), (-39.148323, -27.231953, -15.027633), (-40.425217, -25, -15.517787), (-39.55768, -25, -17.612213), (-38.308186, -27.231953, -17.055902), (-38.308186, -27.231953, -17.055902), (-39.55768, -25, -17.612213), (-38.581715, -25, -19.658365), (-37.36305, -27.231953, -19.037424), (-37.36305, -27.231953, -19.037424), (-38.581715, -25, -19.658365), (-37.5, -25, -21.650635), (-36.315502, -27.231953, -20.966764), (-36.315502, -27.231953, -20.966764), (-37.5, -25, -21.650635), (-36.315502, -25, -23.583563), (-35.168415, -27.231953, -22.838636), (-35.168415, -27.231953, -22.838636), (-36.315502, -25, -23.583563), (-35.031464, -25, -25.451847), (-33.92494, -27.231953, -24.64791), (-33.92494, -27.231953, -24.64791), (-35.031464, -25, -25.451847), (-33.65141, -25, -27.250372), (-32.58847, -27.231953, -26.389624), (-32.58847, -27.231953, -26.389624), (-33.65141, -25, -27.250372), (-32.179115, -25, -28.974205), (-31.162685, -27.231953, -28.059008), (-31.162685, -27.231953, -28.059008), (-32.179115, -25, -28.974205), (-30.618622, -25, -30.618622), (-29.651482, -27.231953, -29.651482), (-29.651482, -27.231953, -29.651482), (-30.618622, -25, -30.618622), (-28.974205, -25, -32.179115), (-28.059008, -27.231953, -31.162685), (-28.059008, -27.231953, -31.162685), (-28.974205, -25, -32.179115), (-27.250372, -25, -33.65141), (-26.389624, -27.231953, -32.58847), (-26.389624, -27.231953, -32.58847), (-27.250372, -25, -33.65141), (-25.451847, -25, -35.031464), (-24.64791, -27.231953, -33.92494), (-24.64791, -27.231953, -33.92494), (-25.451847, -25, -35.031464), (-23.583563, -25, -36.315502), (-22.838636, -27.231953, -35.168415), (-22.838636, -27.231953, -35.168415), (-23.583563, -25, -36.315502), (-21.650635, -25, -37.5), (-20.966764, -27.231953, -36.315502), (-20.966764, -27.231953, -36.315502), (-21.650635, -25, -37.5), (-19.658365, -25, -38.581715), (-19.037424, -27.231953, -37.36305), (-19.037424, -27.231953, -37.36305), (-19.658365, -25, -38.581715), (-17.612213, -25, -39.55768), (-17.055902, -27.231953, -38.308186), (-17.055902, -27.231953, -38.308186), (-17.612213, -25, -39.55768), (-15.517787, -25, -40.425217), (-15.027633, -27.231953, -39.148323), (-15.027633, -27.231953, -39.148323), (-15.517787, -25, -40.425217), (-13.380828, -25, -41.181953), (-12.958173, -27.231953, -39.881157), (-12.958173, -27.231953, -39.881157), (-13.380828, -25, -41.181953), (-11.207193, -25, -41.825813), (-10.853196, -27.231953, -40.504677), (-10.853196, -27.231953, -40.504677), (-11.207193, -25, -41.825813), (-9.00284, -25, -42.355034), (-8.718471, -27.231953, -41.01718), (-8.718471, -27.231953, -41.01718), (-9.00284, -25, -42.355034), (-6.773811, -25, -42.768158), (-6.5598493, -27.231953, -41.417255), (-6.5598493, -27.231953, -41.417255), (-6.773811, -25, -42.768158), (-4.526215, -25, -43.06406), (-4.3832474, -27.231953, -41.70381), (-4.3832474, -27.231953, -41.70381), (-4.526215, -25, -43.06406), (-2.2662134, -25, -43.24193), (-2.1946313, -27.231953, -41.87606), (-2.1946313, -27.231953, -41.87606), (-2.2662134, -25, -43.24193), (-7.9543145e-15, -25, -43.30127), (-7.703064e-15, -27.231953, -41.93353), (-7.703064e-15, -27.231953, -41.93353), (-7.9543145e-15, -25, -43.30127), (2.2662134, -25, -43.24193), (2.1946313, -27.231953, -41.87606), (2.1946313, -27.231953, -41.87606), (2.2662134, -25, -43.24193), (4.526215, -25, -43.06406), (4.3832474, -27.231953, -41.70381), (4.3832474, -27.231953, -41.70381), (4.526215, -25, -43.06406), (6.773811, -25, -42.768158), (6.5598493, -27.231953, -41.417255), (6.5598493, -27.231953, -41.417255), (6.773811, -25, -42.768158), (9.00284, -25, -42.355034), (8.718471, -27.231953, -41.01718), (8.718471, -27.231953, -41.01718), (9.00284, -25, -42.355034), (11.207193, -25, -41.825813), (10.853196, -27.231953, -40.504677), (10.853196, -27.231953, -40.504677), (11.207193, -25, -41.825813), (13.380828, -25, -41.181953), (12.958173, -27.231953, -39.881157), (12.958173, -27.231953, -39.881157), (13.380828, -25, -41.181953), (15.517787, -25, -40.425217), (15.027633, -27.231953, -39.148323), (15.027633, -27.231953, -39.148323), (15.517787, -25, -40.425217), (17.612213, -25, -39.55768), (17.055902, -27.231953, -38.308186), (17.055902, -27.231953, -38.308186), (17.612213, -25, -39.55768), (19.658365, -25, -38.581715), (19.037424, -27.231953, -37.36305), (19.037424, -27.231953, -37.36305), (19.658365, -25, -38.581715), (21.650635, -25, -37.5), (20.966764, -27.231953, -36.315502), (20.966764, -27.231953, -36.315502), (21.650635, -25, -37.5), (23.583563, -25, -36.315502), (22.838636, -27.231953, -35.168415), (22.838636, -27.231953, -35.168415), (23.583563, -25, -36.315502), (25.451847, -25, -35.031464), (24.64791, -27.231953, -33.92494), (24.64791, -27.231953, -33.92494), (25.451847, -25, -35.031464), (27.250372, -25, -33.65141), (26.389624, -27.231953, -32.58847), (26.389624, -27.231953, -32.58847), (27.250372, -25, -33.65141), (28.974205, -25, -32.179115), (28.059008, -27.231953, -31.162685), (28.059008, -27.231953, -31.162685), (28.974205, -25, -32.179115), (30.618622, -25, -30.618622), (29.651482, -27.231953, -29.651482), (29.651482, -27.231953, -29.651482), (30.618622, -25, -30.618622), (32.179115, -25, -28.974205), (31.162685, -27.231953, -28.059008), (31.162685, -27.231953, -28.059008), (32.179115, -25, -28.974205), (33.65141, -25, -27.250372), (32.58847, -27.231953, -26.389624), (32.58847, -27.231953, -26.389624), (33.65141, -25, -27.250372), (35.031464, -25, -25.451847), (33.92494, -27.231953, -24.64791), (33.92494, -27.231953, -24.64791), (35.031464, -25, -25.451847), (36.315502, -25, -23.583563), (35.168415, -27.231953, -22.838636), (35.168415, -27.231953, -22.838636), (36.315502, -25, -23.583563), (37.5, -25, -21.650635), (36.315502, -27.231953, -20.966764), (36.315502, -27.231953, -20.966764), (37.5, -25, -21.650635), (38.581715, -25, -19.658365), (37.36305, -27.231953, -19.037424), (37.36305, -27.231953, -19.037424), (38.581715, -25, -19.658365), (39.55768, -25, -17.612213), (38.308186, -27.231953, -17.055902), (38.308186, -27.231953, -17.055902), (39.55768, -25, -17.612213), (40.425217, -25, -15.517787), (39.148323, -27.231953, -15.027633), (39.148323, -27.231953, -15.027633), (40.425217, -25, -15.517787), (41.181953, -25, -13.380828), (39.881157, -27.231953, -12.958173), (39.881157, -27.231953, -12.958173), (41.181953, -25, -13.380828), (41.825813, -25, -11.207193), (40.504677, -27.231953, -10.853196), (40.504677, -27.231953, -10.853196), (41.825813, -25, -11.207193), (42.355034, -25, -9.00284), (41.01718, -27.231953, -8.718471), (41.01718, -27.231953, -8.718471), (42.355034, -25, -9.00284), (42.768158, -25, -6.773811), (41.417255, -27.231953, -6.5598493), (41.417255, -27.231953, -6.5598493), (42.768158, -25, -6.773811), (43.06406, -25, -4.526215), (41.70381, -27.231953, -4.3832474), (41.70381, -27.231953, -4.3832474), (43.06406, -25, -4.526215), (43.24193, -25, -2.2662134), (41.87606, -27.231953, -2.1946313), (41.87606, -27.231953, -2.1946313), (43.24193, -25, -2.2662134), (43.30127, -25, 0), (41.93353, -27.231953, 0), (43.30127, -25, 0), (44.550327, -22.699526, 0), (44.489273, -22.699526, 2.331584), (43.24193, -25, 2.2662134), (43.24193, -25, 2.2662134), (44.489273, -22.699526, 2.331584), (44.306274, -22.699526, 4.656777), (43.06406, -25, 4.526215), (43.06406, -25, 4.526215), (44.306274, -22.699526, 4.656777), (44.00184, -22.699526, 6.9692063), (42.768158, -25, 6.773811), (42.768158, -25, 6.773811), (44.00184, -22.699526, 6.9692063), (43.576794, -22.699526, 9.262533), (42.355034, -25, 9.00284), (42.355034, -25, 9.00284), (43.576794, -22.699526, 9.262533), (43.03231, -22.699526, 11.530473), (41.825813, -25, 11.207193), (41.825813, -25, 11.207193), (43.03231, -22.699526, 11.530473), (42.369877, -22.699526, 13.766808), (41.181953, -25, 13.380828), (41.181953, -25, 13.380828), (42.369877, -22.699526, 13.766808), (41.591312, -22.699526, 15.965409), (40.425217, -25, 15.517787), (40.425217, -25, 15.517787), (41.591312, -22.699526, 15.965409), (40.69875, -22.699526, 18.12025), (39.55768, -25, 17.612213), (39.55768, -25, 17.612213), (40.69875, -22.699526, 18.12025), (39.69463, -22.699526, 20.225426), (38.581715, -25, 19.658365), (38.581715, -25, 19.658365), (39.69463, -22.699526, 20.225426), (38.581715, -22.699526, 22.275164), (37.5, -25, 21.650635), (37.5, -25, 21.650635), (38.581715, -22.699526, 22.275164), (37.36305, -22.699526, 24.263847), (36.315502, -25, 23.583563), (36.315502, -25, 23.583563), (37.36305, -22.699526, 24.263847), (36.04197, -22.699526, 26.186026), (35.031464, -25, 25.451847), (35.031464, -25, 25.451847), (36.04197, -22.699526, 26.186026), (34.622105, -22.699526, 28.036428), (33.65141, -25, 27.250372), (33.65141, -25, 27.250372), (34.622105, -22.699526, 28.036428), (33.107346, -22.699526, 29.809986), (32.179115, -25, 28.974205), (32.179115, -25, 28.974205), (33.107346, -22.699526, 29.809986), (31.501839, -22.699526, 31.501839), (30.618622, -25, 30.618622), (30.618622, -25, 30.618622), (31.501839, -22.699526, 31.501839), (29.809986, -22.699526, 33.107346), (28.974205, -25, 32.179115), (28.974205, -25, 32.179115), (29.809986, -22.699526, 33.107346), (28.036428, -22.699526, 34.622105), (27.250372, -25, 33.65141), (27.250372, -25, 33.65141), (28.036428, -22.699526, 34.622105), (26.186026, -22.699526, 36.04197), (25.451847, -25, 35.031464), (25.451847, -25, 35.031464), (26.186026, -22.699526, 36.04197), (24.263847, -22.699526, 37.36305), (23.583563, -25, 36.315502), (23.583563, -25, 36.315502), (24.263847, -22.699526, 37.36305), (22.275164, -22.699526, 38.581715), (21.650635, -25, 37.5), (21.650635, -25, 37.5), (22.275164, -22.699526, 38.581715), (20.225426, -22.699526, 39.69463), (19.658365, -25, 38.581715), (19.658365, -25, 38.581715), (20.225426, -22.699526, 39.69463), (18.12025, -22.699526, 40.69875), (17.612213, -25, 39.55768), (17.612213, -25, 39.55768), (18.12025, -22.699526, 40.69875), (15.965409, -22.699526, 41.591312), (15.517787, -25, 40.425217), (15.517787, -25, 40.425217), (15.965409, -22.699526, 41.591312), (13.766808, -22.699526, 42.369877), (13.380828, -25, 41.181953), (13.380828, -25, 41.181953), (13.766808, -22.699526, 42.369877), (11.530473, -22.699526, 43.03231), (11.207193, -25, 41.825813), (11.207193, -25, 41.825813), (11.530473, -22.699526, 43.03231), (9.262533, -22.699526, 43.576794), (9.00284, -25, 42.355034), (9.00284, -25, 42.355034), (9.262533, -22.699526, 43.576794), (6.9692063, -22.699526, 44.00184), (6.773811, -25, 42.768158), (6.773811, -25, 42.768158), (6.9692063, -22.699526, 44.00184), (4.656777, -22.699526, 44.306274), (4.526215, -25, 43.06406), (4.526215, -25, 43.06406), (4.656777, -22.699526, 44.306274), (2.331584, -22.699526, 44.489273), (2.2662134, -25, 43.24193), (2.2662134, -25, 43.24193), (2.331584, -22.699526, 44.489273), (2.7279206e-15, -22.699526, 44.550327), (2.651438e-15, -25, 43.30127), (2.651438e-15, -25, 43.30127), (2.7279206e-15, -22.699526, 44.550327), (-2.331584, -22.699526, 44.489273), (-2.2662134, -25, 43.24193), (-2.2662134, -25, 43.24193), (-2.331584, -22.699526, 44.489273), (-4.656777, -22.699526, 44.306274), (-4.526215, -25, 43.06406), (-4.526215, -25, 43.06406), (-4.656777, -22.699526, 44.306274), (-6.9692063, -22.699526, 44.00184), (-6.773811, -25, 42.768158), (-6.773811, -25, 42.768158), (-6.9692063, -22.699526, 44.00184), (-9.262533, -22.699526, 43.576794), (-9.00284, -25, 42.355034), (-9.00284, -25, 42.355034), (-9.262533, -22.699526, 43.576794), (-11.530473, -22.699526, 43.03231), (-11.207193, -25, 41.825813), (-11.207193, -25, 41.825813), (-11.530473, -22.699526, 43.03231), (-13.766808, -22.699526, 42.369877), (-13.380828, -25, 41.181953), (-13.380828, -25, 41.181953), (-13.766808, -22.699526, 42.369877), (-15.965409, -22.699526, 41.591312), (-15.517787, -25, 40.425217), (-15.517787, -25, 40.425217), (-15.965409, -22.699526, 41.591312), (-18.12025, -22.699526, 40.69875), (-17.612213, -25, 39.55768), (-17.612213, -25, 39.55768), (-18.12025, -22.699526, 40.69875), (-20.225426, -22.699526, 39.69463), (-19.658365, -25, 38.581715), (-19.658365, -25, 38.581715), (-20.225426, -22.699526, 39.69463), (-22.275164, -22.699526, 38.581715), (-21.650635, -25, 37.5), (-21.650635, -25, 37.5), (-22.275164, -22.699526, 38.581715), (-24.263847, -22.699526, 37.36305), (-23.583563, -25, 36.315502), (-23.583563, -25, 36.315502), (-24.263847, -22.699526, 37.36305), (-26.186026, -22.699526, 36.04197), (-25.451847, -25, 35.031464), (-25.451847, -25, 35.031464), (-26.186026, -22.699526, 36.04197), (-28.036428, -22.699526, 34.622105), (-27.250372, -25, 33.65141), (-27.250372, -25, 33.65141), (-28.036428, -22.699526, 34.622105), (-29.809986, -22.699526, 33.107346), (-28.974205, -25, 32.179115), (-28.974205, -25, 32.179115), (-29.809986, -22.699526, 33.107346), (-31.501839, -22.699526, 31.501839), (-30.618622, -25, 30.618622), (-30.618622, -25, 30.618622), (-31.501839, -22.699526, 31.501839), (-33.107346, -22.699526, 29.809986), (-32.179115, -25, 28.974205), (-32.179115, -25, 28.974205), (-33.107346, -22.699526, 29.809986), (-34.622105, -22.699526, 28.036428), (-33.65141, -25, 27.250372), (-33.65141, -25, 27.250372), (-34.622105, -22.699526, 28.036428), (-36.04197, -22.699526, 26.186026), (-35.031464, -25, 25.451847), (-35.031464, -25, 25.451847), (-36.04197, -22.699526, 26.186026), (-37.36305, -22.699526, 24.263847), (-36.315502, -25, 23.583563), (-36.315502, -25, 23.583563), (-37.36305, -22.699526, 24.263847), (-38.581715, -22.699526, 22.275164), (-37.5, -25, 21.650635), (-37.5, -25, 21.650635), (-38.581715, -22.699526, 22.275164), (-39.69463, -22.699526, 20.225426), (-38.581715, -25, 19.658365), (-38.581715, -25, 19.658365), (-39.69463, -22.699526, 20.225426), (-40.69875, -22.699526, 18.12025), (-39.55768, -25, 17.612213), (-39.55768, -25, 17.612213), (-40.69875, -22.699526, 18.12025), (-41.591312, -22.699526, 15.965409), (-40.425217, -25, 15.517787), (-40.425217, -25, 15.517787), (-41.591312, -22.699526, 15.965409), (-42.369877, -22.699526, 13.766808), (-41.181953, -25, 13.380828), (-41.181953, -25, 13.380828), (-42.369877, -22.699526, 13.766808), (-43.03231, -22.699526, 11.530473), (-41.825813, -25, 11.207193), (-41.825813, -25, 11.207193), (-43.03231, -22.699526, 11.530473), (-43.576794, -22.699526, 9.262533), (-42.355034, -25, 9.00284), (-42.355034, -25, 9.00284), (-43.576794, -22.699526, 9.262533), (-44.00184, -22.699526, 6.9692063), (-42.768158, -25, 6.773811), (-42.768158, -25, 6.773811), (-44.00184, -22.699526, 6.9692063), (-44.306274, -22.699526, 4.656777), (-43.06406, -25, 4.526215), (-43.06406, -25, 4.526215), (-44.306274, -22.699526, 4.656777), (-44.489273, -22.699526, 2.331584), (-43.24193, -25, 2.2662134), (-43.24193, -25, 2.2662134), (-44.489273, -22.699526, 2.331584), (-44.550327, -22.699526, 5.4558413e-15), (-43.30127, -25, 5.302876e-15), (-43.30127, -25, 5.302876e-15), (-44.550327, -22.699526, 5.4558413e-15), (-44.489273, -22.699526, -2.331584), (-43.24193, -25, -2.2662134), (-43.24193, -25, -2.2662134), (-44.489273, -22.699526, -2.331584), (-44.306274, -22.699526, -4.656777), (-43.06406, -25, -4.526215), (-43.06406, -25, -4.526215), (-44.306274, -22.699526, -4.656777), (-44.00184, -22.699526, -6.9692063), (-42.768158, -25, -6.773811), (-42.768158, -25, -6.773811), (-44.00184, -22.699526, -6.9692063), (-43.576794, -22.699526, -9.262533), (-42.355034, -25, -9.00284), (-42.355034, -25, -9.00284), (-43.576794, -22.699526, -9.262533), (-43.03231, -22.699526, -11.530473), (-41.825813, -25, -11.207193), (-41.825813, -25, -11.207193), (-43.03231, -22.699526, -11.530473), (-42.369877, -22.699526, -13.766808), (-41.181953, -25, -13.380828), (-41.181953, -25, -13.380828), (-42.369877, -22.699526, -13.766808), (-41.591312, -22.699526, -15.965409), (-40.425217, -25, -15.517787), (-40.425217, -25, -15.517787), (-41.591312, -22.699526, -15.965409), (-40.69875, -22.699526, -18.12025), (-39.55768, -25, -17.612213), (-39.55768, -25, -17.612213), (-40.69875, -22.699526, -18.12025), (-39.69463, -22.699526, -20.225426), (-38.581715, -25, -19.658365), (-38.581715, -25, -19.658365), (-39.69463, -22.699526, -20.225426), (-38.581715, -22.699526, -22.275164), (-37.5, -25, -21.650635), (-37.5, -25, -21.650635), (-38.581715, -22.699526, -22.275164), (-37.36305, -22.699526, -24.263847), (-36.315502, -25, -23.583563), (-36.315502, -25, -23.583563), (-37.36305, -22.699526, -24.263847), (-36.04197, -22.699526, -26.186026), (-35.031464, -25, -25.451847), (-35.031464, -25, -25.451847), (-36.04197, -22.699526, -26.186026), (-34.622105, -22.699526, -28.036428), (-33.65141, -25, -27.250372), (-33.65141, -25, -27.250372), (-34.622105, -22.699526, -28.036428), (-33.107346, -22.699526, -29.809986), (-32.179115, -25, -28.974205), (-32.179115, -25, -28.974205), (-33.107346, -22.699526, -29.809986), (-31.501839, -22.699526, -31.501839), (-30.618622, -25, -30.618622), (-30.618622, -25, -30.618622), (-31.501839, -22.699526, -31.501839), (-29.809986, -22.699526, -33.107346), (-28.974205, -25, -32.179115), (-28.974205, -25, -32.179115), (-29.809986, -22.699526, -33.107346), (-28.036428, -22.699526, -34.622105), (-27.250372, -25, -33.65141), (-27.250372, -25, -33.65141), (-28.036428, -22.699526, -34.622105), (-26.186026, -22.699526, -36.04197), (-25.451847, -25, -35.031464), (-25.451847, -25, -35.031464), (-26.186026, -22.699526, -36.04197), (-24.263847, -22.699526, -37.36305), (-23.583563, -25, -36.315502), (-23.583563, -25, -36.315502), (-24.263847, -22.699526, -37.36305), (-22.275164, -22.699526, -38.581715), (-21.650635, -25, -37.5), (-21.650635, -25, -37.5), (-22.275164, -22.699526, -38.581715), (-20.225426, -22.699526, -39.69463), (-19.658365, -25, -38.581715), (-19.658365, -25, -38.581715), (-20.225426, -22.699526, -39.69463), (-18.12025, -22.699526, -40.69875), (-17.612213, -25, -39.55768), (-17.612213, -25, -39.55768), (-18.12025, -22.699526, -40.69875), (-15.965409, -22.699526, -41.591312), (-15.517787, -25, -40.425217), (-15.517787, -25, -40.425217), (-15.965409, -22.699526, -41.591312), (-13.766808, -22.699526, -42.369877), (-13.380828, -25, -41.181953), (-13.380828, -25, -41.181953), (-13.766808, -22.699526, -42.369877), (-11.530473, -22.699526, -43.03231), (-11.207193, -25, -41.825813), (-11.207193, -25, -41.825813), (-11.530473, -22.699526, -43.03231), (-9.262533, -22.699526, -43.576794), (-9.00284, -25, -42.355034), (-9.00284, -25, -42.355034), (-9.262533, -22.699526, -43.576794), (-6.9692063, -22.699526, -44.00184), (-6.773811, -25, -42.768158), (-6.773811, -25, -42.768158), (-6.9692063, -22.699526, -44.00184), (-4.656777, -22.699526, -44.306274), (-4.526215, -25, -43.06406), (-4.526215, -25, -43.06406), (-4.656777, -22.699526, -44.306274), (-2.331584, -22.699526, -44.489273), (-2.2662134, -25, -43.24193), (-2.2662134, -25, -43.24193), (-2.331584, -22.699526, -44.489273), (-8.183762e-15, -22.699526, -44.550327), (-7.9543145e-15, -25, -43.30127), (-7.9543145e-15, -25, -43.30127), (-8.183762e-15, -22.699526, -44.550327), (2.331584, -22.699526, -44.489273), (2.2662134, -25, -43.24193), (2.2662134, -25, -43.24193), (2.331584, -22.699526, -44.489273), (4.656777, -22.699526, -44.306274), (4.526215, -25, -43.06406), (4.526215, -25, -43.06406), (4.656777, -22.699526, -44.306274), (6.9692063, -22.699526, -44.00184), (6.773811, -25, -42.768158), (6.773811, -25, -42.768158), (6.9692063, -22.699526, -44.00184), (9.262533, -22.699526, -43.576794), (9.00284, -25, -42.355034), (9.00284, -25, -42.355034), (9.262533, -22.699526, -43.576794), (11.530473, -22.699526, -43.03231), (11.207193, -25, -41.825813), (11.207193, -25, -41.825813), (11.530473, -22.699526, -43.03231), (13.766808, -22.699526, -42.369877), (13.380828, -25, -41.181953), (13.380828, -25, -41.181953), (13.766808, -22.699526, -42.369877), (15.965409, -22.699526, -41.591312), (15.517787, -25, -40.425217), (15.517787, -25, -40.425217), (15.965409, -22.699526, -41.591312), (18.12025, -22.699526, -40.69875), (17.612213, -25, -39.55768), (17.612213, -25, -39.55768), (18.12025, -22.699526, -40.69875), (20.225426, -22.699526, -39.69463), (19.658365, -25, -38.581715), (19.658365, -25, -38.581715), (20.225426, -22.699526, -39.69463), (22.275164, -22.699526, -38.581715), (21.650635, -25, -37.5), (21.650635, -25, -37.5), (22.275164, -22.699526, -38.581715), (24.263847, -22.699526, -37.36305), (23.583563, -25, -36.315502), (23.583563, -25, -36.315502), (24.263847, -22.699526, -37.36305), (26.186026, -22.699526, -36.04197), (25.451847, -25, -35.031464), (25.451847, -25, -35.031464), (26.186026, -22.699526, -36.04197), (28.036428, -22.699526, -34.622105), (27.250372, -25, -33.65141), (27.250372, -25, -33.65141), (28.036428, -22.699526, -34.622105), (29.809986, -22.699526, -33.107346), (28.974205, -25, -32.179115), (28.974205, -25, -32.179115), (29.809986, -22.699526, -33.107346), (31.501839, -22.699526, -31.501839), (30.618622, -25, -30.618622), (30.618622, -25, -30.618622), (31.501839, -22.699526, -31.501839), (33.107346, -22.699526, -29.809986), (32.179115, -25, -28.974205), (32.179115, -25, -28.974205), (33.107346, -22.699526, -29.809986), (34.622105, -22.699526, -28.036428), (33.65141, -25, -27.250372), (33.65141, -25, -27.250372), (34.622105, -22.699526, -28.036428), (36.04197, -22.699526, -26.186026), (35.031464, -25, -25.451847), (35.031464, -25, -25.451847), (36.04197, -22.699526, -26.186026), (37.36305, -22.699526, -24.263847), (36.315502, -25, -23.583563), (36.315502, -25, -23.583563), (37.36305, -22.699526, -24.263847), (38.581715, -22.699526, -22.275164), (37.5, -25, -21.650635), (37.5, -25, -21.650635), (38.581715, -22.699526, -22.275164), (39.69463, -22.699526, -20.225426), (38.581715, -25, -19.658365), (38.581715, -25, -19.658365), (39.69463, -22.699526, -20.225426), (40.69875, -22.699526, -18.12025), (39.55768, -25, -17.612213), (39.55768, -25, -17.612213), (40.69875, -22.699526, -18.12025), (41.591312, -22.699526, -15.965409), (40.425217, -25, -15.517787), (40.425217, -25, -15.517787), (41.591312, -22.699526, -15.965409), (42.369877, -22.699526, -13.766808), (41.181953, -25, -13.380828), (41.181953, -25, -13.380828), (42.369877, -22.699526, -13.766808), (43.03231, -22.699526, -11.530473), (41.825813, -25, -11.207193), (41.825813, -25, -11.207193), (43.03231, -22.699526, -11.530473), (43.576794, -22.699526, -9.262533), (42.355034, -25, -9.00284), (42.355034, -25, -9.00284), (43.576794, -22.699526, -9.262533), (44.00184, -22.699526, -6.9692063), (42.768158, -25, -6.773811), (42.768158, -25, -6.773811), (44.00184, -22.699526, -6.9692063), (44.306274, -22.699526, -4.656777), (43.06406, -25, -4.526215), (43.06406, -25, -4.526215), (44.306274, -22.699526, -4.656777), (44.489273, -22.699526, -2.331584), (43.24193, -25, -2.2662134), (43.24193, -25, -2.2662134), (44.489273, -22.699526, -2.331584), (44.550327, -22.699526, 0), (43.30127, -25, 0), (44.550327, -22.699526, 0), (45.677273, -20.336832, 0), (45.614674, -20.336832, 2.3905637), (44.489273, -22.699526, 2.331584), (44.489273, -22.699526, 2.331584), (45.614674, -20.336832, 2.3905637), (45.427048, -20.336832, 4.774575), (44.306274, -22.699526, 4.656777), (44.306274, -22.699526, 4.656777), (45.427048, -20.336832, 4.774575), (45.11491, -20.336832, 7.1454997), (44.00184, -22.699526, 6.9692063), (44.00184, -22.699526, 6.9692063), (45.11491, -20.336832, 7.1454997), (44.679115, -20.336832, 9.496839), (43.576794, -22.699526, 9.262533), (43.576794, -22.699526, 9.262533), (44.679115, -20.336832, 9.496839), (44.120857, -20.336832, 11.822148), (43.03231, -22.699526, 11.530473), (43.03231, -22.699526, 11.530473), (44.120857, -20.336832, 11.822148), (43.44167, -20.336832, 14.115053), (42.369877, -22.699526, 13.766808), (42.369877, -22.699526, 13.766808), (43.44167, -20.336832, 14.115053), (42.64341, -20.336832, 16.36927), (41.591312, -22.699526, 15.965409), (41.591312, -22.699526, 15.965409), (42.64341, -20.336832, 16.36927), (41.728264, -20.336832, 18.57862), (40.69875, -22.699526, 18.12025), (40.69875, -22.699526, 18.12025), (41.728264, -20.336832, 18.57862), (40.69875, -20.336832, 20.737047), (39.69463, -22.699526, 20.225426), (39.69463, -22.699526, 20.225426), (40.69875, -20.336832, 20.737047), (39.55768, -20.336832, 22.838636), (38.581715, -22.699526, 22.275164), (38.581715, -22.699526, 22.275164), (39.55768, -20.336832, 22.838636), (38.308186, -20.336832, 24.877626), (37.36305, -22.699526, 24.263847), (37.36305, -22.699526, 24.263847), (38.308186, -20.336832, 24.877626), (36.95369, -20.336832, 26.848427), (36.04197, -22.699526, 26.186026), (36.04197, -22.699526, 26.186026), (36.95369, -20.336832, 26.848427), (35.49791, -20.336832, 28.74564), (34.622105, -22.699526, 28.036428), (34.622105, -22.699526, 28.036428), (35.49791, -20.336832, 28.74564), (33.944828, -20.336832, 30.564062), (33.107346, -22.699526, 29.809986), (33.107346, -22.699526, 29.809986), (33.944828, -20.336832, 30.564062), (32.29871, -20.336832, 32.29871), (31.501839, -22.699526, 31.501839), (31.501839, -22.699526, 31.501839), (32.29871, -20.336832, 32.29871), (30.564062, -20.336832, 33.944828), (29.809986, -22.699526, 33.107346), (29.809986, -22.699526, 33.107346), (30.564062, -20.336832, 33.944828), (28.74564, -20.336832, 35.49791), (28.036428, -22.699526, 34.622105), (28.036428, -22.699526, 34.622105), (28.74564, -20.336832, 35.49791), (26.848427, -20.336832, 36.95369), (26.186026, -22.699526, 36.04197), (26.186026, -22.699526, 36.04197), (26.848427, -20.336832, 36.95369), (24.877626, -20.336832, 38.308186), (24.263847, -22.699526, 37.36305), (24.263847, -22.699526, 37.36305), (24.877626, -20.336832, 38.308186), (22.838636, -20.336832, 39.55768), (22.275164, -22.699526, 38.581715), (22.275164, -22.699526, 38.581715), (22.838636, -20.336832, 39.55768), (20.737047, -20.336832, 40.69875), (20.225426, -22.699526, 39.69463), (20.225426, -22.699526, 39.69463), (20.737047, -20.336832, 40.69875), (18.57862, -20.336832, 41.728264), (18.12025, -22.699526, 40.69875), (18.12025, -22.699526, 40.69875), (18.57862, -20.336832, 41.728264), (16.36927, -20.336832, 42.64341), (15.965409, -22.699526, 41.591312), (15.965409, -22.699526, 41.591312), (16.36927, -20.336832, 42.64341), (14.115053, -20.336832, 43.44167), (13.766808, -22.699526, 42.369877), (13.766808, -22.699526, 42.369877), (14.115053, -20.336832, 43.44167), (11.822148, -20.336832, 44.120857), (11.530473, -22.699526, 43.03231), (11.530473, -22.699526, 43.03231), (11.822148, -20.336832, 44.120857), (9.496839, -20.336832, 44.679115), (9.262533, -22.699526, 43.576794), (9.262533, -22.699526, 43.576794), (9.496839, -20.336832, 44.679115), (7.1454997, -20.336832, 45.11491), (6.9692063, -22.699526, 44.00184), (6.9692063, -22.699526, 44.00184), (7.1454997, -20.336832, 45.11491), (4.774575, -20.336832, 45.427048), (4.656777, -22.699526, 44.306274), (4.656777, -22.699526, 44.306274), (4.774575, -20.336832, 45.427048), (2.3905637, -20.336832, 45.614674), (2.331584, -22.699526, 44.489273), (2.331584, -22.699526, 44.489273), (2.3905637, -20.336832, 45.614674), (2.7969263e-15, -20.336832, 45.677273), (2.7279206e-15, -22.699526, 44.550327), (2.7279206e-15, -22.699526, 44.550327), (2.7969263e-15, -20.336832, 45.677273), (-2.3905637, -20.336832, 45.614674), (-2.331584, -22.699526, 44.489273), (-2.331584, -22.699526, 44.489273), (-2.3905637, -20.336832, 45.614674), (-4.774575, -20.336832, 45.427048), (-4.656777, -22.699526, 44.306274), (-4.656777, -22.699526, 44.306274), (-4.774575, -20.336832, 45.427048), (-7.1454997, -20.336832, 45.11491), (-6.9692063, -22.699526, 44.00184), (-6.9692063, -22.699526, 44.00184), (-7.1454997, -20.336832, 45.11491), (-9.496839, -20.336832, 44.679115), (-9.262533, -22.699526, 43.576794), (-9.262533, -22.699526, 43.576794), (-9.496839, -20.336832, 44.679115), (-11.822148, -20.336832, 44.120857), (-11.530473, -22.699526, 43.03231), (-11.530473, -22.699526, 43.03231), (-11.822148, -20.336832, 44.120857), (-14.115053, -20.336832, 43.44167), (-13.766808, -22.699526, 42.369877), (-13.766808, -22.699526, 42.369877), (-14.115053, -20.336832, 43.44167), (-16.36927, -20.336832, 42.64341), (-15.965409, -22.699526, 41.591312), (-15.965409, -22.699526, 41.591312), (-16.36927, -20.336832, 42.64341), (-18.57862, -20.336832, 41.728264), (-18.12025, -22.699526, 40.69875), (-18.12025, -22.699526, 40.69875), (-18.57862, -20.336832, 41.728264), (-20.737047, -20.336832, 40.69875), (-20.225426, -22.699526, 39.69463), (-20.225426, -22.699526, 39.69463), (-20.737047, -20.336832, 40.69875), (-22.838636, -20.336832, 39.55768), (-22.275164, -22.699526, 38.581715), (-22.275164, -22.699526, 38.581715), (-22.838636, -20.336832, 39.55768), (-24.877626, -20.336832, 38.308186), (-24.263847, -22.699526, 37.36305), (-24.263847, -22.699526, 37.36305), (-24.877626, -20.336832, 38.308186), (-26.848427, -20.336832, 36.95369), (-26.186026, -22.699526, 36.04197), (-26.186026, -22.699526, 36.04197), (-26.848427, -20.336832, 36.95369), (-28.74564, -20.336832, 35.49791), (-28.036428, -22.699526, 34.622105), (-28.036428, -22.699526, 34.622105), (-28.74564, -20.336832, 35.49791), (-30.564062, -20.336832, 33.944828), (-29.809986, -22.699526, 33.107346), (-29.809986, -22.699526, 33.107346), (-30.564062, -20.336832, 33.944828), (-32.29871, -20.336832, 32.29871), (-31.501839, -22.699526, 31.501839), (-31.501839, -22.699526, 31.501839), (-32.29871, -20.336832, 32.29871), (-33.944828, -20.336832, 30.564062), (-33.107346, -22.699526, 29.809986), (-33.107346, -22.699526, 29.809986), (-33.944828, -20.336832, 30.564062), (-35.49791, -20.336832, 28.74564), (-34.622105, -22.699526, 28.036428), (-34.622105, -22.699526, 28.036428), (-35.49791, -20.336832, 28.74564), (-36.95369, -20.336832, 26.848427), (-36.04197, -22.699526, 26.186026), (-36.04197, -22.699526, 26.186026), (-36.95369, -20.336832, 26.848427), (-38.308186, -20.336832, 24.877626), (-37.36305, -22.699526, 24.263847), (-37.36305, -22.699526, 24.263847), (-38.308186, -20.336832, 24.877626), (-39.55768, -20.336832, 22.838636), (-38.581715, -22.699526, 22.275164), (-38.581715, -22.699526, 22.275164), (-39.55768, -20.336832, 22.838636), (-40.69875, -20.336832, 20.737047), (-39.69463, -22.699526, 20.225426), (-39.69463, -22.699526, 20.225426), (-40.69875, -20.336832, 20.737047), (-41.728264, -20.336832, 18.57862), (-40.69875, -22.699526, 18.12025), (-40.69875, -22.699526, 18.12025), (-41.728264, -20.336832, 18.57862), (-42.64341, -20.336832, 16.36927), (-41.591312, -22.699526, 15.965409), (-41.591312, -22.699526, 15.965409), (-42.64341, -20.336832, 16.36927), (-43.44167, -20.336832, 14.115053), (-42.369877, -22.699526, 13.766808), (-42.369877, -22.699526, 13.766808), (-43.44167, -20.336832, 14.115053), (-44.120857, -20.336832, 11.822148), (-43.03231, -22.699526, 11.530473), (-43.03231, -22.699526, 11.530473), (-44.120857, -20.336832, 11.822148), (-44.679115, -20.336832, 9.496839), (-43.576794, -22.699526, 9.262533), (-43.576794, -22.699526, 9.262533), (-44.679115, -20.336832, 9.496839), (-45.11491, -20.336832, 7.1454997), (-44.00184, -22.699526, 6.9692063), (-44.00184, -22.699526, 6.9692063), (-45.11491, -20.336832, 7.1454997), (-45.427048, -20.336832, 4.774575), (-44.306274, -22.699526, 4.656777), (-44.306274, -22.699526, 4.656777), (-45.427048, -20.336832, 4.774575), (-45.614674, -20.336832, 2.3905637), (-44.489273, -22.699526, 2.331584), (-44.489273, -22.699526, 2.331584), (-45.614674, -20.336832, 2.3905637), (-45.677273, -20.336832, 5.5938526e-15), (-44.550327, -22.699526, 5.4558413e-15), (-44.550327, -22.699526, 5.4558413e-15), (-45.677273, -20.336832, 5.5938526e-15), (-45.614674, -20.336832, -2.3905637), (-44.489273, -22.699526, -2.331584), (-44.489273, -22.699526, -2.331584), (-45.614674, -20.336832, -2.3905637), (-45.427048, -20.336832, -4.774575), (-44.306274, -22.699526, -4.656777), (-44.306274, -22.699526, -4.656777), (-45.427048, -20.336832, -4.774575), (-45.11491, -20.336832, -7.1454997), (-44.00184, -22.699526, -6.9692063), (-44.00184, -22.699526, -6.9692063), (-45.11491, -20.336832, -7.1454997), (-44.679115, -20.336832, -9.496839), (-43.576794, -22.699526, -9.262533), (-43.576794, -22.699526, -9.262533), (-44.679115, -20.336832, -9.496839), (-44.120857, -20.336832, -11.822148), (-43.03231, -22.699526, -11.530473), (-43.03231, -22.699526, -11.530473), (-44.120857, -20.336832, -11.822148), (-43.44167, -20.336832, -14.115053), (-42.369877, -22.699526, -13.766808), (-42.369877, -22.699526, -13.766808), (-43.44167, -20.336832, -14.115053), (-42.64341, -20.336832, -16.36927), (-41.591312, -22.699526, -15.965409), (-41.591312, -22.699526, -15.965409), (-42.64341, -20.336832, -16.36927), (-41.728264, -20.336832, -18.57862), (-40.69875, -22.699526, -18.12025), (-40.69875, -22.699526, -18.12025), (-41.728264, -20.336832, -18.57862), (-40.69875, -20.336832, -20.737047), (-39.69463, -22.699526, -20.225426), (-39.69463, -22.699526, -20.225426), (-40.69875, -20.336832, -20.737047), (-39.55768, -20.336832, -22.838636), (-38.581715, -22.699526, -22.275164), (-38.581715, -22.699526, -22.275164), (-39.55768, -20.336832, -22.838636), (-38.308186, -20.336832, -24.877626), (-37.36305, -22.699526, -24.263847), (-37.36305, -22.699526, -24.263847), (-38.308186, -20.336832, -24.877626), (-36.95369, -20.336832, -26.848427), (-36.04197, -22.699526, -26.186026), (-36.04197, -22.699526, -26.186026), (-36.95369, -20.336832, -26.848427), (-35.49791, -20.336832, -28.74564), (-34.622105, -22.699526, -28.036428), (-34.622105, -22.699526, -28.036428), (-35.49791, -20.336832, -28.74564), (-33.944828, -20.336832, -30.564062), (-33.107346, -22.699526, -29.809986), (-33.107346, -22.699526, -29.809986), (-33.944828, -20.336832, -30.564062), (-32.29871, -20.336832, -32.29871), (-31.501839, -22.699526, -31.501839), (-31.501839, -22.699526, -31.501839), (-32.29871, -20.336832, -32.29871), (-30.564062, -20.336832, -33.944828), (-29.809986, -22.699526, -33.107346), (-29.809986, -22.699526, -33.107346), (-30.564062, -20.336832, -33.944828), (-28.74564, -20.336832, -35.49791), (-28.036428, -22.699526, -34.622105), (-28.036428, -22.699526, -34.622105), (-28.74564, -20.336832, -35.49791), (-26.848427, -20.336832, -36.95369), (-26.186026, -22.699526, -36.04197), (-26.186026, -22.699526, -36.04197), (-26.848427, -20.336832, -36.95369), (-24.877626, -20.336832, -38.308186), (-24.263847, -22.699526, -37.36305), (-24.263847, -22.699526, -37.36305), (-24.877626, -20.336832, -38.308186), (-22.838636, -20.336832, -39.55768), (-22.275164, -22.699526, -38.581715), (-22.275164, -22.699526, -38.581715), (-22.838636, -20.336832, -39.55768), (-20.737047, -20.336832, -40.69875), (-20.225426, -22.699526, -39.69463), (-20.225426, -22.699526, -39.69463), (-20.737047, -20.336832, -40.69875), (-18.57862, -20.336832, -41.728264), (-18.12025, -22.699526, -40.69875), (-18.12025, -22.699526, -40.69875), (-18.57862, -20.336832, -41.728264), (-16.36927, -20.336832, -42.64341), (-15.965409, -22.699526, -41.591312), (-15.965409, -22.699526, -41.591312), (-16.36927, -20.336832, -42.64341), (-14.115053, -20.336832, -43.44167), (-13.766808, -22.699526, -42.369877), (-13.766808, -22.699526, -42.369877), (-14.115053, -20.336832, -43.44167), (-11.822148, -20.336832, -44.120857), (-11.530473, -22.699526, -43.03231), (-11.530473, -22.699526, -43.03231), (-11.822148, -20.336832, -44.120857), (-9.496839, -20.336832, -44.679115), (-9.262533, -22.699526, -43.576794), (-9.262533, -22.699526, -43.576794), (-9.496839, -20.336832, -44.679115), (-7.1454997, -20.336832, -45.11491), (-6.9692063, -22.699526, -44.00184), (-6.9692063, -22.699526, -44.00184), (-7.1454997, -20.336832, -45.11491), (-4.774575, -20.336832, -45.427048), (-4.656777, -22.699526, -44.306274), (-4.656777, -22.699526, -44.306274), (-4.774575, -20.336832, -45.427048), (-2.3905637, -20.336832, -45.614674), (-2.331584, -22.699526, -44.489273), (-2.331584, -22.699526, -44.489273), (-2.3905637, -20.336832, -45.614674), (-8.390779e-15, -20.336832, -45.677273), (-8.183762e-15, -22.699526, -44.550327), (-8.183762e-15, -22.699526, -44.550327), (-8.390779e-15, -20.336832, -45.677273), (2.3905637, -20.336832, -45.614674), (2.331584, -22.699526, -44.489273), (2.331584, -22.699526, -44.489273), (2.3905637, -20.336832, -45.614674), (4.774575, -20.336832, -45.427048), (4.656777, -22.699526, -44.306274), (4.656777, -22.699526, -44.306274), (4.774575, -20.336832, -45.427048), (7.1454997, -20.336832, -45.11491), (6.9692063, -22.699526, -44.00184), (6.9692063, -22.699526, -44.00184), (7.1454997, -20.336832, -45.11491), (9.496839, -20.336832, -44.679115), (9.262533, -22.699526, -43.576794), (9.262533, -22.699526, -43.576794), (9.496839, -20.336832, -44.679115), (11.822148, -20.336832, -44.120857), (11.530473, -22.699526, -43.03231), (11.530473, -22.699526, -43.03231), (11.822148, -20.336832, -44.120857), (14.115053, -20.336832, -43.44167), (13.766808, -22.699526, -42.369877), (13.766808, -22.699526, -42.369877), (14.115053, -20.336832, -43.44167), (16.36927, -20.336832, -42.64341), (15.965409, -22.699526, -41.591312), (15.965409, -22.699526, -41.591312), (16.36927, -20.336832, -42.64341), (18.57862, -20.336832, -41.728264), (18.12025, -22.699526, -40.69875), (18.12025, -22.699526, -40.69875), (18.57862, -20.336832, -41.728264), (20.737047, -20.336832, -40.69875), (20.225426, -22.699526, -39.69463), (20.225426, -22.699526, -39.69463), (20.737047, -20.336832, -40.69875), (22.838636, -20.336832, -39.55768), (22.275164, -22.699526, -38.581715), (22.275164, -22.699526, -38.581715), (22.838636, -20.336832, -39.55768), (24.877626, -20.336832, -38.308186), (24.263847, -22.699526, -37.36305), (24.263847, -22.699526, -37.36305), (24.877626, -20.336832, -38.308186), (26.848427, -20.336832, -36.95369), (26.186026, -22.699526, -36.04197), (26.186026, -22.699526, -36.04197), (26.848427, -20.336832, -36.95369), (28.74564, -20.336832, -35.49791), (28.036428, -22.699526, -34.622105), (28.036428, -22.699526, -34.622105), (28.74564, -20.336832, -35.49791), (30.564062, -20.336832, -33.944828), (29.809986, -22.699526, -33.107346), (29.809986, -22.699526, -33.107346), (30.564062, -20.336832, -33.944828), (32.29871, -20.336832, -32.29871), (31.501839, -22.699526, -31.501839), (31.501839, -22.699526, -31.501839), (32.29871, -20.336832, -32.29871), (33.944828, -20.336832, -30.564062), (33.107346, -22.699526, -29.809986), (33.107346, -22.699526, -29.809986), (33.944828, -20.336832, -30.564062), (35.49791, -20.336832, -28.74564), (34.622105, -22.699526, -28.036428), (34.622105, -22.699526, -28.036428), (35.49791, -20.336832, -28.74564), (36.95369, -20.336832, -26.848427), (36.04197, -22.699526, -26.186026), (36.04197, -22.699526, -26.186026), (36.95369, -20.336832, -26.848427), (38.308186, -20.336832, -24.877626), (37.36305, -22.699526, -24.263847), (37.36305, -22.699526, -24.263847), (38.308186, -20.336832, -24.877626), (39.55768, -20.336832, -22.838636), (38.581715, -22.699526, -22.275164), (38.581715, -22.699526, -22.275164), (39.55768, -20.336832, -22.838636), (40.69875, -20.336832, -20.737047), (39.69463, -22.699526, -20.225426), (39.69463, -22.699526, -20.225426), (40.69875, -20.336832, -20.737047), (41.728264, -20.336832, -18.57862), (40.69875, -22.699526, -18.12025), (40.69875, -22.699526, -18.12025), (41.728264, -20.336832, -18.57862), (42.64341, -20.336832, -16.36927), (41.591312, -22.699526, -15.965409), (41.591312, -22.699526, -15.965409), (42.64341, -20.336832, -16.36927), (43.44167, -20.336832, -14.115053), (42.369877, -22.699526, -13.766808), (42.369877, -22.699526, -13.766808), (43.44167, -20.336832, -14.115053), (44.120857, -20.336832, -11.822148), (43.03231, -22.699526, -11.530473), (43.03231, -22.699526, -11.530473), (44.120857, -20.336832, -11.822148), (44.679115, -20.336832, -9.496839), (43.576794, -22.699526, -9.262533), (43.576794, -22.699526, -9.262533), (44.679115, -20.336832, -9.496839), (45.11491, -20.336832, -7.1454997), (44.00184, -22.699526, -6.9692063), (44.00184, -22.699526, -6.9692063), (45.11491, -20.336832, -7.1454997), (45.427048, -20.336832, -4.774575), (44.306274, -22.699526, -4.656777), (44.306274, -22.699526, -4.656777), (45.427048, -20.336832, -4.774575), (45.614674, -20.336832, -2.3905637), (44.489273, -22.699526, -2.331584), (44.489273, -22.699526, -2.331584), (45.614674, -20.336832, -2.3905637), (45.677273, -20.336832, 0), (44.550327, -22.699526, 0), (45.677273, -20.336832, 0), (46.67902, -17.918398, 0), (46.615047, -17.918398, 2.4429913), (45.614674, -20.336832, 2.3905637), (45.614674, -20.336832, 2.3905637), (46.615047, -17.918398, 2.4429913), (46.42331, -17.918398, 4.8792863), (45.427048, -20.336832, 4.774575), (45.427048, -20.336832, 4.774575), (46.42331, -17.918398, 4.8792863), (46.104324, -17.918398, 7.302208), (45.11491, -20.336832, 7.1454997), (45.11491, -20.336832, 7.1454997), (46.104324, -17.918398, 7.302208), (45.658974, -17.918398, 9.705114), (44.679115, -20.336832, 9.496839), (44.679115, -20.336832, 9.496839), (45.658974, -17.918398, 9.705114), (45.08847, -17.918398, 12.08142), (44.120857, -20.336832, 11.822148), (44.120857, -20.336832, 11.822148), (45.08847, -17.918398, 12.08142), (44.394386, -17.918398, 14.424611), (43.44167, -20.336832, 14.115053), (43.44167, -20.336832, 14.115053), (44.394386, -17.918398, 14.424611), (43.57862, -17.918398, 16.728266), (42.64341, -20.336832, 16.36927), (42.64341, -20.336832, 16.36927), (43.57862, -17.918398, 16.728266), (42.64341, -17.918398, 18.986069), (41.728264, -20.336832, 18.57862), (41.728264, -20.336832, 18.57862), (42.64341, -17.918398, 18.986069), (41.591312, -17.918398, 21.191832), (40.69875, -20.336832, 20.737047), (40.69875, -20.336832, 20.737047), (41.591312, -17.918398, 21.191832), (40.425217, -17.918398, 23.33951), (39.55768, -20.336832, 22.838636), (39.55768, -20.336832, 22.838636), (40.425217, -17.918398, 23.33951), (39.148323, -17.918398, 25.423218), (38.308186, -20.336832, 24.877626), (38.308186, -20.336832, 24.877626), (39.148323, -17.918398, 25.423218), (37.764122, -17.918398, 27.43724), (36.95369, -20.336832, 26.848427), (36.95369, -20.336832, 26.848427), (37.764122, -17.918398, 27.43724), (36.276413, -17.918398, 29.37606), (35.49791, -20.336832, 28.74564), (35.49791, -20.336832, 28.74564), (36.276413, -17.918398, 29.37606), (34.689274, -17.918398, 31.234362), (33.944828, -20.336832, 30.564062), (33.944828, -20.336832, 30.564062), (34.689274, -17.918398, 31.234362), (33.007053, -17.918398, 33.007053), (32.29871, -20.336832, 32.29871), (32.29871, -20.336832, 32.29871), (33.007053, -17.918398, 33.007053), (31.234362, -17.918398, 34.689274), (30.564062, -20.336832, 33.944828), (30.564062, -20.336832, 33.944828), (31.234362, -17.918398, 34.689274), (29.37606, -17.918398, 36.276413), (28.74564, -20.336832, 35.49791), (28.74564, -20.336832, 35.49791), (29.37606, -17.918398, 36.276413), (27.43724, -17.918398, 37.764122), (26.848427, -20.336832, 36.95369), (26.848427, -20.336832, 36.95369), (27.43724, -17.918398, 37.764122), (25.423218, -17.918398, 39.148323), (24.877626, -20.336832, 38.308186), (24.877626, -20.336832, 38.308186), (25.423218, -17.918398, 39.148323), (23.33951, -17.918398, 40.425217), (22.838636, -20.336832, 39.55768), (22.838636, -20.336832, 39.55768), (23.33951, -17.918398, 40.425217), (21.191832, -17.918398, 41.591312), (20.737047, -20.336832, 40.69875), (20.737047, -20.336832, 40.69875), (21.191832, -17.918398, 41.591312), (18.986069, -17.918398, 42.64341), (18.57862, -20.336832, 41.728264), (18.57862, -20.336832, 41.728264), (18.986069, -17.918398, 42.64341), (16.728266, -17.918398, 43.57862), (16.36927, -20.336832, 42.64341), (16.36927, -20.336832, 42.64341), (16.728266, -17.918398, 43.57862), (14.424611, -17.918398, 44.394386), (14.115053, -20.336832, 43.44167), (14.115053, -20.336832, 43.44167), (14.424611, -17.918398, 44.394386), (12.08142, -17.918398, 45.08847), (11.822148, -20.336832, 44.120857), (11.822148, -20.336832, 44.120857), (12.08142, -17.918398, 45.08847), (9.705114, -17.918398, 45.658974), (9.496839, -20.336832, 44.679115), (9.496839, -20.336832, 44.679115), (9.705114, -17.918398, 45.658974), (7.302208, -17.918398, 46.104324), (7.1454997, -20.336832, 45.11491), (7.1454997, -20.336832, 45.11491), (7.302208, -17.918398, 46.104324), (4.8792863, -17.918398, 46.42331), (4.774575, -20.336832, 45.427048), (4.774575, -20.336832, 45.427048), (4.8792863, -17.918398, 46.42331), (2.4429913, -17.918398, 46.615047), (2.3905637, -20.336832, 45.614674), (2.3905637, -20.336832, 45.614674), (2.4429913, -17.918398, 46.615047), (2.8582657e-15, -17.918398, 46.67902), (2.7969263e-15, -20.336832, 45.677273), (2.7969263e-15, -20.336832, 45.677273), (2.8582657e-15, -17.918398, 46.67902), (-2.4429913, -17.918398, 46.615047), (-2.3905637, -20.336832, 45.614674), (-2.3905637, -20.336832, 45.614674), (-2.4429913, -17.918398, 46.615047), (-4.8792863, -17.918398, 46.42331), (-4.774575, -20.336832, 45.427048), (-4.774575, -20.336832, 45.427048), (-4.8792863, -17.918398, 46.42331), (-7.302208, -17.918398, 46.104324), (-7.1454997, -20.336832, 45.11491), (-7.1454997, -20.336832, 45.11491), (-7.302208, -17.918398, 46.104324), (-9.705114, -17.918398, 45.658974), (-9.496839, -20.336832, 44.679115), (-9.496839, -20.336832, 44.679115), (-9.705114, -17.918398, 45.658974), (-12.08142, -17.918398, 45.08847), (-11.822148, -20.336832, 44.120857), (-11.822148, -20.336832, 44.120857), (-12.08142, -17.918398, 45.08847), (-14.424611, -17.918398, 44.394386), (-14.115053, -20.336832, 43.44167), (-14.115053, -20.336832, 43.44167), (-14.424611, -17.918398, 44.394386), (-16.728266, -17.918398, 43.57862), (-16.36927, -20.336832, 42.64341), (-16.36927, -20.336832, 42.64341), (-16.728266, -17.918398, 43.57862), (-18.986069, -17.918398, 42.64341), (-18.57862, -20.336832, 41.728264), (-18.57862, -20.336832, 41.728264), (-18.986069, -17.918398, 42.64341), (-21.191832, -17.918398, 41.591312), (-20.737047, -20.336832, 40.69875), (-20.737047, -20.336832, 40.69875), (-21.191832, -17.918398, 41.591312), (-23.33951, -17.918398, 40.425217), (-22.838636, -20.336832, 39.55768), (-22.838636, -20.336832, 39.55768), (-23.33951, -17.918398, 40.425217), (-25.423218, -17.918398, 39.148323), (-24.877626, -20.336832, 38.308186), (-24.877626, -20.336832, 38.308186), (-25.423218, -17.918398, 39.148323), (-27.43724, -17.918398, 37.764122), (-26.848427, -20.336832, 36.95369), (-26.848427, -20.336832, 36.95369), (-27.43724, -17.918398, 37.764122), (-29.37606, -17.918398, 36.276413), (-28.74564, -20.336832, 35.49791), (-28.74564, -20.336832, 35.49791), (-29.37606, -17.918398, 36.276413), (-31.234362, -17.918398, 34.689274), (-30.564062, -20.336832, 33.944828), (-30.564062, -20.336832, 33.944828), (-31.234362, -17.918398, 34.689274), (-33.007053, -17.918398, 33.007053), (-32.29871, -20.336832, 32.29871), (-32.29871, -20.336832, 32.29871), (-33.007053, -17.918398, 33.007053), (-34.689274, -17.918398, 31.234362), (-33.944828, -20.336832, 30.564062), (-33.944828, -20.336832, 30.564062), (-34.689274, -17.918398, 31.234362), (-36.276413, -17.918398, 29.37606), (-35.49791, -20.336832, 28.74564), (-35.49791, -20.336832, 28.74564), (-36.276413, -17.918398, 29.37606), (-37.764122, -17.918398, 27.43724), (-36.95369, -20.336832, 26.848427), (-36.95369, -20.336832, 26.848427), (-37.764122, -17.918398, 27.43724), (-39.148323, -17.918398, 25.423218), (-38.308186, -20.336832, 24.877626), (-38.308186, -20.336832, 24.877626), (-39.148323, -17.918398, 25.423218), (-40.425217, -17.918398, 23.33951), (-39.55768, -20.336832, 22.838636), (-39.55768, -20.336832, 22.838636), (-40.425217, -17.918398, 23.33951), (-41.591312, -17.918398, 21.191832), (-40.69875, -20.336832, 20.737047), (-40.69875, -20.336832, 20.737047), (-41.591312, -17.918398, 21.191832), (-42.64341, -17.918398, 18.986069), (-41.728264, -20.336832, 18.57862), (-41.728264, -20.336832, 18.57862), (-42.64341, -17.918398, 18.986069), (-43.57862, -17.918398, 16.728266), (-42.64341, -20.336832, 16.36927), (-42.64341, -20.336832, 16.36927), (-43.57862, -17.918398, 16.728266), (-44.394386, -17.918398, 14.424611), (-43.44167, -20.336832, 14.115053), (-43.44167, -20.336832, 14.115053), (-44.394386, -17.918398, 14.424611), (-45.08847, -17.918398, 12.08142), (-44.120857, -20.336832, 11.822148), (-44.120857, -20.336832, 11.822148), (-45.08847, -17.918398, 12.08142), (-45.658974, -17.918398, 9.705114), (-44.679115, -20.336832, 9.496839), (-44.679115, -20.336832, 9.496839), (-45.658974, -17.918398, 9.705114), (-46.104324, -17.918398, 7.302208), (-45.11491, -20.336832, 7.1454997), (-45.11491, -20.336832, 7.1454997), (-46.104324, -17.918398, 7.302208), (-46.42331, -17.918398, 4.8792863), (-45.427048, -20.336832, 4.774575), (-45.427048, -20.336832, 4.774575), (-46.42331, -17.918398, 4.8792863), (-46.615047, -17.918398, 2.4429913), (-45.614674, -20.336832, 2.3905637), (-45.614674, -20.336832, 2.3905637), (-46.615047, -17.918398, 2.4429913), (-46.67902, -17.918398, 5.7165313e-15), (-45.677273, -20.336832, 5.5938526e-15), (-45.677273, -20.336832, 5.5938526e-15), (-46.67902, -17.918398, 5.7165313e-15), (-46.615047, -17.918398, -2.4429913), (-45.614674, -20.336832, -2.3905637), (-45.614674, -20.336832, -2.3905637), (-46.615047, -17.918398, -2.4429913), (-46.42331, -17.918398, -4.8792863), (-45.427048, -20.336832, -4.774575), (-45.427048, -20.336832, -4.774575), (-46.42331, -17.918398, -4.8792863), (-46.104324, -17.918398, -7.302208), (-45.11491, -20.336832, -7.1454997), (-45.11491, -20.336832, -7.1454997), (-46.104324, -17.918398, -7.302208), (-45.658974, -17.918398, -9.705114), (-44.679115, -20.336832, -9.496839), (-44.679115, -20.336832, -9.496839), (-45.658974, -17.918398, -9.705114), (-45.08847, -17.918398, -12.08142), (-44.120857, -20.336832, -11.822148), (-44.120857, -20.336832, -11.822148), (-45.08847, -17.918398, -12.08142), (-44.394386, -17.918398, -14.424611), (-43.44167, -20.336832, -14.115053), (-43.44167, -20.336832, -14.115053), (-44.394386, -17.918398, -14.424611), (-43.57862, -17.918398, -16.728266), (-42.64341, -20.336832, -16.36927), (-42.64341, -20.336832, -16.36927), (-43.57862, -17.918398, -16.728266), (-42.64341, -17.918398, -18.986069), (-41.728264, -20.336832, -18.57862), (-41.728264, -20.336832, -18.57862), (-42.64341, -17.918398, -18.986069), (-41.591312, -17.918398, -21.191832), (-40.69875, -20.336832, -20.737047), (-40.69875, -20.336832, -20.737047), (-41.591312, -17.918398, -21.191832), (-40.425217, -17.918398, -23.33951), (-39.55768, -20.336832, -22.838636), (-39.55768, -20.336832, -22.838636), (-40.425217, -17.918398, -23.33951), (-39.148323, -17.918398, -25.423218), (-38.308186, -20.336832, -24.877626), (-38.308186, -20.336832, -24.877626), (-39.148323, -17.918398, -25.423218), (-37.764122, -17.918398, -27.43724), (-36.95369, -20.336832, -26.848427), (-36.95369, -20.336832, -26.848427), (-37.764122, -17.918398, -27.43724), (-36.276413, -17.918398, -29.37606), (-35.49791, -20.336832, -28.74564), (-35.49791, -20.336832, -28.74564), (-36.276413, -17.918398, -29.37606), (-34.689274, -17.918398, -31.234362), (-33.944828, -20.336832, -30.564062), (-33.944828, -20.336832, -30.564062), (-34.689274, -17.918398, -31.234362), (-33.007053, -17.918398, -33.007053), (-32.29871, -20.336832, -32.29871), (-32.29871, -20.336832, -32.29871), (-33.007053, -17.918398, -33.007053), (-31.234362, -17.918398, -34.689274), (-30.564062, -20.336832, -33.944828), (-30.564062, -20.336832, -33.944828), (-31.234362, -17.918398, -34.689274), (-29.37606, -17.918398, -36.276413), (-28.74564, -20.336832, -35.49791), (-28.74564, -20.336832, -35.49791), (-29.37606, -17.918398, -36.276413), (-27.43724, -17.918398, -37.764122), (-26.848427, -20.336832, -36.95369), (-26.848427, -20.336832, -36.95369), (-27.43724, -17.918398, -37.764122), (-25.423218, -17.918398, -39.148323), (-24.877626, -20.336832, -38.308186), (-24.877626, -20.336832, -38.308186), (-25.423218, -17.918398, -39.148323), (-23.33951, -17.918398, -40.425217), (-22.838636, -20.336832, -39.55768), (-22.838636, -20.336832, -39.55768), (-23.33951, -17.918398, -40.425217), (-21.191832, -17.918398, -41.591312), (-20.737047, -20.336832, -40.69875), (-20.737047, -20.336832, -40.69875), (-21.191832, -17.918398, -41.591312), (-18.986069, -17.918398, -42.64341), (-18.57862, -20.336832, -41.728264), (-18.57862, -20.336832, -41.728264), (-18.986069, -17.918398, -42.64341), (-16.728266, -17.918398, -43.57862), (-16.36927, -20.336832, -42.64341), (-16.36927, -20.336832, -42.64341), (-16.728266, -17.918398, -43.57862), (-14.424611, -17.918398, -44.394386), (-14.115053, -20.336832, -43.44167), (-14.115053, -20.336832, -43.44167), (-14.424611, -17.918398, -44.394386), (-12.08142, -17.918398, -45.08847), (-11.822148, -20.336832, -44.120857), (-11.822148, -20.336832, -44.120857), (-12.08142, -17.918398, -45.08847), (-9.705114, -17.918398, -45.658974), (-9.496839, -20.336832, -44.679115), (-9.496839, -20.336832, -44.679115), (-9.705114, -17.918398, -45.658974), (-7.302208, -17.918398, -46.104324), (-7.1454997, -20.336832, -45.11491), (-7.1454997, -20.336832, -45.11491), (-7.302208, -17.918398, -46.104324), (-4.8792863, -17.918398, -46.42331), (-4.774575, -20.336832, -45.427048), (-4.774575, -20.336832, -45.427048), (-4.8792863, -17.918398, -46.42331), (-2.4429913, -17.918398, -46.615047), (-2.3905637, -20.336832, -45.614674), (-2.3905637, -20.336832, -45.614674), (-2.4429913, -17.918398, -46.615047), (-8.5747974e-15, -17.918398, -46.67902), (-8.390779e-15, -20.336832, -45.677273), (-8.390779e-15, -20.336832, -45.677273), (-8.5747974e-15, -17.918398, -46.67902), (2.4429913, -17.918398, -46.615047), (2.3905637, -20.336832, -45.614674), (2.3905637, -20.336832, -45.614674), (2.4429913, -17.918398, -46.615047), (4.8792863, -17.918398, -46.42331), (4.774575, -20.336832, -45.427048), (4.774575, -20.336832, -45.427048), (4.8792863, -17.918398, -46.42331), (7.302208, -17.918398, -46.104324), (7.1454997, -20.336832, -45.11491), (7.1454997, -20.336832, -45.11491), (7.302208, -17.918398, -46.104324), (9.705114, -17.918398, -45.658974), (9.496839, -20.336832, -44.679115), (9.496839, -20.336832, -44.679115), (9.705114, -17.918398, -45.658974), (12.08142, -17.918398, -45.08847), (11.822148, -20.336832, -44.120857), (11.822148, -20.336832, -44.120857), (12.08142, -17.918398, -45.08847), (14.424611, -17.918398, -44.394386), (14.115053, -20.336832, -43.44167), (14.115053, -20.336832, -43.44167), (14.424611, -17.918398, -44.394386), (16.728266, -17.918398, -43.57862), (16.36927, -20.336832, -42.64341), (16.36927, -20.336832, -42.64341), (16.728266, -17.918398, -43.57862), (18.986069, -17.918398, -42.64341), (18.57862, -20.336832, -41.728264), (18.57862, -20.336832, -41.728264), (18.986069, -17.918398, -42.64341), (21.191832, -17.918398, -41.591312), (20.737047, -20.336832, -40.69875), (20.737047, -20.336832, -40.69875), (21.191832, -17.918398, -41.591312), (23.33951, -17.918398, -40.425217), (22.838636, -20.336832, -39.55768), (22.838636, -20.336832, -39.55768), (23.33951, -17.918398, -40.425217), (25.423218, -17.918398, -39.148323), (24.877626, -20.336832, -38.308186), (24.877626, -20.336832, -38.308186), (25.423218, -17.918398, -39.148323), (27.43724, -17.918398, -37.764122), (26.848427, -20.336832, -36.95369), (26.848427, -20.336832, -36.95369), (27.43724, -17.918398, -37.764122), (29.37606, -17.918398, -36.276413), (28.74564, -20.336832, -35.49791), (28.74564, -20.336832, -35.49791), (29.37606, -17.918398, -36.276413), (31.234362, -17.918398, -34.689274), (30.564062, -20.336832, -33.944828), (30.564062, -20.336832, -33.944828), (31.234362, -17.918398, -34.689274), (33.007053, -17.918398, -33.007053), (32.29871, -20.336832, -32.29871), (32.29871, -20.336832, -32.29871), (33.007053, -17.918398, -33.007053), (34.689274, -17.918398, -31.234362), (33.944828, -20.336832, -30.564062), (33.944828, -20.336832, -30.564062), (34.689274, -17.918398, -31.234362), (36.276413, -17.918398, -29.37606), (35.49791, -20.336832, -28.74564), (35.49791, -20.336832, -28.74564), (36.276413, -17.918398, -29.37606), (37.764122, -17.918398, -27.43724), (36.95369, -20.336832, -26.848427), (36.95369, -20.336832, -26.848427), (37.764122, -17.918398, -27.43724), (39.148323, -17.918398, -25.423218), (38.308186, -20.336832, -24.877626), (38.308186, -20.336832, -24.877626), (39.148323, -17.918398, -25.423218), (40.425217, -17.918398, -23.33951), (39.55768, -20.336832, -22.838636), (39.55768, -20.336832, -22.838636), (40.425217, -17.918398, -23.33951), (41.591312, -17.918398, -21.191832), (40.69875, -20.336832, -20.737047), (40.69875, -20.336832, -20.737047), (41.591312, -17.918398, -21.191832), (42.64341, -17.918398, -18.986069), (41.728264, -20.336832, -18.57862), (41.728264, -20.336832, -18.57862), (42.64341, -17.918398, -18.986069), (43.57862, -17.918398, -16.728266), (42.64341, -20.336832, -16.36927), (42.64341, -20.336832, -16.36927), (43.57862, -17.918398, -16.728266), (44.394386, -17.918398, -14.424611), (43.44167, -20.336832, -14.115053), (43.44167, -20.336832, -14.115053), (44.394386, -17.918398, -14.424611), (45.08847, -17.918398, -12.08142), (44.120857, -20.336832, -11.822148), (44.120857, -20.336832, -11.822148), (45.08847, -17.918398, -12.08142), (45.658974, -17.918398, -9.705114), (44.679115, -20.336832, -9.496839), (44.679115, -20.336832, -9.496839), (45.658974, -17.918398, -9.705114), (46.104324, -17.918398, -7.302208), (45.11491, -20.336832, -7.1454997), (45.11491, -20.336832, -7.1454997), (46.104324, -17.918398, -7.302208), (46.42331, -17.918398, -4.8792863), (45.427048, -20.336832, -4.774575), (45.427048, -20.336832, -4.774575), (46.42331, -17.918398, -4.8792863), (46.615047, -17.918398, -2.4429913), (45.614674, -20.336832, -2.3905637), (45.614674, -20.336832, -2.3905637), (46.615047, -17.918398, -2.4429913), (46.67902, -17.918398, 0), (45.677273, -20.336832, 0), (46.67902, -17.918398, 0), (47.552826, -15.45085, 0), (47.487656, -15.45085, 2.4887226), (46.615047, -17.918398, 2.4429913), (46.615047, -17.918398, 2.4429913), (47.487656, -15.45085, 2.4887226), (47.292328, -15.45085, 4.970624), (46.42331, -17.918398, 4.8792863), (46.42331, -17.918398, 4.8792863), (47.292328, -15.45085, 4.970624), (46.967373, -15.45085, 7.438901), (46.104324, -17.918398, 7.302208), (46.104324, -17.918398, 7.302208), (46.967373, -15.45085, 7.438901), (46.513683, -15.45085, 9.886788), (45.658974, -17.918398, 9.705114), (45.658974, -17.918398, 9.705114), (46.513683, -15.45085, 9.886788), (45.932503, -15.45085, 12.307577), (45.08847, -17.918398, 12.08142), (45.08847, -17.918398, 12.08142), (45.932503, -15.45085, 12.307577), (45.225426, -15.45085, 14.694632), (44.394386, -17.918398, 14.424611), (44.394386, -17.918398, 14.424611), (45.225426, -15.45085, 14.694632), (44.394386, -15.45085, 17.041409), (43.57862, -17.918398, 16.728266), (43.57862, -17.918398, 16.728266), (44.394386, -15.45085, 17.041409), (43.44167, -15.45085, 19.341476), (42.64341, -17.918398, 18.986069), (42.64341, -17.918398, 18.986069), (43.44167, -15.45085, 19.341476), (42.369877, -15.45085, 21.588531), (41.591312, -17.918398, 21.191832), (41.591312, -17.918398, 21.191832), (42.369877, -15.45085, 21.588531), (41.181953, -15.45085, 23.776413), (40.425217, -17.918398, 23.33951), (40.425217, -17.918398, 23.33951), (41.181953, -15.45085, 23.776413), (39.881157, -15.45085, 25.899126), (39.148323, -17.918398, 25.423218), (39.148323, -17.918398, 25.423218), (39.881157, -15.45085, 25.899126), (38.471043, -15.45085, 27.95085), (37.764122, -17.918398, 27.43724), (37.764122, -17.918398, 27.43724), (38.471043, -15.45085, 27.95085), (36.955486, -15.45085, 29.925962), (36.276413, -17.918398, 29.37606), (36.276413, -17.918398, 29.37606), (36.955486, -15.45085, 29.925962), (35.33864, -15.45085, 31.819052), (34.689274, -17.918398, 31.234362), (34.689274, -17.918398, 31.234362), (35.33864, -15.45085, 31.819052), (33.624924, -15.45085, 33.624924), (33.007053, -17.918398, 33.007053), (33.007053, -17.918398, 33.007053), (33.624924, -15.45085, 33.624924), (31.819052, -15.45085, 35.33864), (31.234362, -17.918398, 34.689274), (31.234362, -17.918398, 34.689274), (31.819052, -15.45085, 35.33864), (29.925962, -15.45085, 36.955486), (29.37606, -17.918398, 36.276413), (29.37606, -17.918398, 36.276413), (29.925962, -15.45085, 36.955486), (27.95085, -15.45085, 38.471043), (27.43724, -17.918398, 37.764122), (27.43724, -17.918398, 37.764122), (27.95085, -15.45085, 38.471043), (25.899126, -15.45085, 39.881157), (25.423218, -17.918398, 39.148323), (25.423218, -17.918398, 39.148323), (25.899126, -15.45085, 39.881157), (23.776413, -15.45085, 41.181953), (23.33951, -17.918398, 40.425217), (23.33951, -17.918398, 40.425217), (23.776413, -15.45085, 41.181953), (21.588531, -15.45085, 42.369877), (21.191832, -17.918398, 41.591312), (21.191832, -17.918398, 41.591312), (21.588531, -15.45085, 42.369877), (19.341476, -15.45085, 43.44167), (18.986069, -17.918398, 42.64341), (18.986069, -17.918398, 42.64341), (19.341476, -15.45085, 43.44167), (17.041409, -15.45085, 44.394386), (16.728266, -17.918398, 43.57862), (16.728266, -17.918398, 43.57862), (17.041409, -15.45085, 44.394386), (14.694632, -15.45085, 45.225426), (14.424611, -17.918398, 44.394386), (14.424611, -17.918398, 44.394386), (14.694632, -15.45085, 45.225426), (12.307577, -15.45085, 45.932503), (12.08142, -17.918398, 45.08847), (12.08142, -17.918398, 45.08847), (12.307577, -15.45085, 45.932503), (9.886788, -15.45085, 46.513683), (9.705114, -17.918398, 45.658974), (9.705114, -17.918398, 45.658974), (9.886788, -15.45085, 46.513683), (7.438901, -15.45085, 46.967373), (7.302208, -17.918398, 46.104324), (7.302208, -17.918398, 46.104324), (7.438901, -15.45085, 46.967373), (4.970624, -15.45085, 47.292328), (4.8792863, -17.918398, 46.42331), (4.8792863, -17.918398, 46.42331), (4.970624, -15.45085, 47.292328), (2.4887226, -15.45085, 47.487656), (2.4429913, -17.918398, 46.615047), (2.4429913, -17.918398, 46.615047), (2.4887226, -15.45085, 47.487656), (2.9117708e-15, -15.45085, 47.552826), (2.8582657e-15, -17.918398, 46.67902), (2.8582657e-15, -17.918398, 46.67902), (2.9117708e-15, -15.45085, 47.552826), (-2.4887226, -15.45085, 47.487656), (-2.4429913, -17.918398, 46.615047), (-2.4429913, -17.918398, 46.615047), (-2.4887226, -15.45085, 47.487656), (-4.970624, -15.45085, 47.292328), (-4.8792863, -17.918398, 46.42331), (-4.8792863, -17.918398, 46.42331), (-4.970624, -15.45085, 47.292328), (-7.438901, -15.45085, 46.967373), (-7.302208, -17.918398, 46.104324), (-7.302208, -17.918398, 46.104324), (-7.438901, -15.45085, 46.967373), (-9.886788, -15.45085, 46.513683), (-9.705114, -17.918398, 45.658974), (-9.705114, -17.918398, 45.658974), (-9.886788, -15.45085, 46.513683), (-12.307577, -15.45085, 45.932503), (-12.08142, -17.918398, 45.08847), (-12.08142, -17.918398, 45.08847), (-12.307577, -15.45085, 45.932503), (-14.694632, -15.45085, 45.225426), (-14.424611, -17.918398, 44.394386), (-14.424611, -17.918398, 44.394386), (-14.694632, -15.45085, 45.225426), (-17.041409, -15.45085, 44.394386), (-16.728266, -17.918398, 43.57862), (-16.728266, -17.918398, 43.57862), (-17.041409, -15.45085, 44.394386), (-19.341476, -15.45085, 43.44167), (-18.986069, -17.918398, 42.64341), (-18.986069, -17.918398, 42.64341), (-19.341476, -15.45085, 43.44167), (-21.588531, -15.45085, 42.369877), (-21.191832, -17.918398, 41.591312), (-21.191832, -17.918398, 41.591312), (-21.588531, -15.45085, 42.369877), (-23.776413, -15.45085, 41.181953), (-23.33951, -17.918398, 40.425217), (-23.33951, -17.918398, 40.425217), (-23.776413, -15.45085, 41.181953), (-25.899126, -15.45085, 39.881157), (-25.423218, -17.918398, 39.148323), (-25.423218, -17.918398, 39.148323), (-25.899126, -15.45085, 39.881157), (-27.95085, -15.45085, 38.471043), (-27.43724, -17.918398, 37.764122), (-27.43724, -17.918398, 37.764122), (-27.95085, -15.45085, 38.471043), (-29.925962, -15.45085, 36.955486), (-29.37606, -17.918398, 36.276413), (-29.37606, -17.918398, 36.276413), (-29.925962, -15.45085, 36.955486), (-31.819052, -15.45085, 35.33864), (-31.234362, -17.918398, 34.689274), (-31.234362, -17.918398, 34.689274), (-31.819052, -15.45085, 35.33864), (-33.624924, -15.45085, 33.624924), (-33.007053, -17.918398, 33.007053), (-33.007053, -17.918398, 33.007053), (-33.624924, -15.45085, 33.624924), (-35.33864, -15.45085, 31.819052), (-34.689274, -17.918398, 31.234362), (-34.689274, -17.918398, 31.234362), (-35.33864, -15.45085, 31.819052), (-36.955486, -15.45085, 29.925962), (-36.276413, -17.918398, 29.37606), (-36.276413, -17.918398, 29.37606), (-36.955486, -15.45085, 29.925962), (-38.471043, -15.45085, 27.95085), (-37.764122, -17.918398, 27.43724), (-37.764122, -17.918398, 27.43724), (-38.471043, -15.45085, 27.95085), (-39.881157, -15.45085, 25.899126), (-39.148323, -17.918398, 25.423218), (-39.148323, -17.918398, 25.423218), (-39.881157, -15.45085, 25.899126), (-41.181953, -15.45085, 23.776413), (-40.425217, -17.918398, 23.33951), (-40.425217, -17.918398, 23.33951), (-41.181953, -15.45085, 23.776413), (-42.369877, -15.45085, 21.588531), (-41.591312, -17.918398, 21.191832), (-41.591312, -17.918398, 21.191832), (-42.369877, -15.45085, 21.588531), (-43.44167, -15.45085, 19.341476), (-42.64341, -17.918398, 18.986069), (-42.64341, -17.918398, 18.986069), (-43.44167, -15.45085, 19.341476), (-44.394386, -15.45085, 17.041409), (-43.57862, -17.918398, 16.728266), (-43.57862, -17.918398, 16.728266), (-44.394386, -15.45085, 17.041409), (-45.225426, -15.45085, 14.694632), (-44.394386, -17.918398, 14.424611), (-44.394386, -17.918398, 14.424611), (-45.225426, -15.45085, 14.694632), (-45.932503, -15.45085, 12.307577), (-45.08847, -17.918398, 12.08142), (-45.08847, -17.918398, 12.08142), (-45.932503, -15.45085, 12.307577), (-46.513683, -15.45085, 9.886788), (-45.658974, -17.918398, 9.705114), (-45.658974, -17.918398, 9.705114), (-46.513683, -15.45085, 9.886788), (-46.967373, -15.45085, 7.438901), (-46.104324, -17.918398, 7.302208), (-46.104324, -17.918398, 7.302208), (-46.967373, -15.45085, 7.438901), (-47.292328, -15.45085, 4.970624), (-46.42331, -17.918398, 4.8792863), (-46.42331, -17.918398, 4.8792863), (-47.292328, -15.45085, 4.970624), (-47.487656, -15.45085, 2.4887226), (-46.615047, -17.918398, 2.4429913), (-46.615047, -17.918398, 2.4429913), (-47.487656, -15.45085, 2.4887226), (-47.552826, -15.45085, 5.8235417e-15), (-46.67902, -17.918398, 5.7165313e-15), (-46.67902, -17.918398, 5.7165313e-15), (-47.552826, -15.45085, 5.8235417e-15), (-47.487656, -15.45085, -2.4887226), (-46.615047, -17.918398, -2.4429913), (-46.615047, -17.918398, -2.4429913), (-47.487656, -15.45085, -2.4887226), (-47.292328, -15.45085, -4.970624), (-46.42331, -17.918398, -4.8792863), (-46.42331, -17.918398, -4.8792863), (-47.292328, -15.45085, -4.970624), (-46.967373, -15.45085, -7.438901), (-46.104324, -17.918398, -7.302208), (-46.104324, -17.918398, -7.302208), (-46.967373, -15.45085, -7.438901), (-46.513683, -15.45085, -9.886788), (-45.658974, -17.918398, -9.705114), (-45.658974, -17.918398, -9.705114), (-46.513683, -15.45085, -9.886788), (-45.932503, -15.45085, -12.307577), (-45.08847, -17.918398, -12.08142), (-45.08847, -17.918398, -12.08142), (-45.932503, -15.45085, -12.307577), (-45.225426, -15.45085, -14.694632), (-44.394386, -17.918398, -14.424611), (-44.394386, -17.918398, -14.424611), (-45.225426, -15.45085, -14.694632), (-44.394386, -15.45085, -17.041409), (-43.57862, -17.918398, -16.728266), (-43.57862, -17.918398, -16.728266), (-44.394386, -15.45085, -17.041409), (-43.44167, -15.45085, -19.341476), (-42.64341, -17.918398, -18.986069), (-42.64341, -17.918398, -18.986069), (-43.44167, -15.45085, -19.341476), (-42.369877, -15.45085, -21.588531), (-41.591312, -17.918398, -21.191832), (-41.591312, -17.918398, -21.191832), (-42.369877, -15.45085, -21.588531), (-41.181953, -15.45085, -23.776413), (-40.425217, -17.918398, -23.33951), (-40.425217, -17.918398, -23.33951), (-41.181953, -15.45085, -23.776413), (-39.881157, -15.45085, -25.899126), (-39.148323, -17.918398, -25.423218), (-39.148323, -17.918398, -25.423218), (-39.881157, -15.45085, -25.899126), (-38.471043, -15.45085, -27.95085), (-37.764122, -17.918398, -27.43724), (-37.764122, -17.918398, -27.43724), (-38.471043, -15.45085, -27.95085), (-36.955486, -15.45085, -29.925962), (-36.276413, -17.918398, -29.37606), (-36.276413, -17.918398, -29.37606), (-36.955486, -15.45085, -29.925962), (-35.33864, -15.45085, -31.819052), (-34.689274, -17.918398, -31.234362), (-34.689274, -17.918398, -31.234362), (-35.33864, -15.45085, -31.819052), (-33.624924, -15.45085, -33.624924), (-33.007053, -17.918398, -33.007053), (-33.007053, -17.918398, -33.007053), (-33.624924, -15.45085, -33.624924), (-31.819052, -15.45085, -35.33864), (-31.234362, -17.918398, -34.689274), (-31.234362, -17.918398, -34.689274), (-31.819052, -15.45085, -35.33864), (-29.925962, -15.45085, -36.955486), (-29.37606, -17.918398, -36.276413), (-29.37606, -17.918398, -36.276413), (-29.925962, -15.45085, -36.955486), (-27.95085, -15.45085, -38.471043), (-27.43724, -17.918398, -37.764122), (-27.43724, -17.918398, -37.764122), (-27.95085, -15.45085, -38.471043), (-25.899126, -15.45085, -39.881157), (-25.423218, -17.918398, -39.148323), (-25.423218, -17.918398, -39.148323), (-25.899126, -15.45085, -39.881157), (-23.776413, -15.45085, -41.181953), (-23.33951, -17.918398, -40.425217), (-23.33951, -17.918398, -40.425217), (-23.776413, -15.45085, -41.181953), (-21.588531, -15.45085, -42.369877), (-21.191832, -17.918398, -41.591312), (-21.191832, -17.918398, -41.591312), (-21.588531, -15.45085, -42.369877), (-19.341476, -15.45085, -43.44167), (-18.986069, -17.918398, -42.64341), (-18.986069, -17.918398, -42.64341), (-19.341476, -15.45085, -43.44167), (-17.041409, -15.45085, -44.394386), (-16.728266, -17.918398, -43.57862), (-16.728266, -17.918398, -43.57862), (-17.041409, -15.45085, -44.394386), (-14.694632, -15.45085, -45.225426), (-14.424611, -17.918398, -44.394386), (-14.424611, -17.918398, -44.394386), (-14.694632, -15.45085, -45.225426), (-12.307577, -15.45085, -45.932503), (-12.08142, -17.918398, -45.08847), (-12.08142, -17.918398, -45.08847), (-12.307577, -15.45085, -45.932503), (-9.886788, -15.45085, -46.513683), (-9.705114, -17.918398, -45.658974), (-9.705114, -17.918398, -45.658974), (-9.886788, -15.45085, -46.513683), (-7.438901, -15.45085, -46.967373), (-7.302208, -17.918398, -46.104324), (-7.302208, -17.918398, -46.104324), (-7.438901, -15.45085, -46.967373), (-4.970624, -15.45085, -47.292328), (-4.8792863, -17.918398, -46.42331), (-4.8792863, -17.918398, -46.42331), (-4.970624, -15.45085, -47.292328), (-2.4887226, -15.45085, -47.487656), (-2.4429913, -17.918398, -46.615047), (-2.4429913, -17.918398, -46.615047), (-2.4887226, -15.45085, -47.487656), (-8.735313e-15, -15.45085, -47.552826), (-8.5747974e-15, -17.918398, -46.67902), (-8.5747974e-15, -17.918398, -46.67902), (-8.735313e-15, -15.45085, -47.552826), (2.4887226, -15.45085, -47.487656), (2.4429913, -17.918398, -46.615047), (2.4429913, -17.918398, -46.615047), (2.4887226, -15.45085, -47.487656), (4.970624, -15.45085, -47.292328), (4.8792863, -17.918398, -46.42331), (4.8792863, -17.918398, -46.42331), (4.970624, -15.45085, -47.292328), (7.438901, -15.45085, -46.967373), (7.302208, -17.918398, -46.104324), (7.302208, -17.918398, -46.104324), (7.438901, -15.45085, -46.967373), (9.886788, -15.45085, -46.513683), (9.705114, -17.918398, -45.658974), (9.705114, -17.918398, -45.658974), (9.886788, -15.45085, -46.513683), (12.307577, -15.45085, -45.932503), (12.08142, -17.918398, -45.08847), (12.08142, -17.918398, -45.08847), (12.307577, -15.45085, -45.932503), (14.694632, -15.45085, -45.225426), (14.424611, -17.918398, -44.394386), (14.424611, -17.918398, -44.394386), (14.694632, -15.45085, -45.225426), (17.041409, -15.45085, -44.394386), (16.728266, -17.918398, -43.57862), (16.728266, -17.918398, -43.57862), (17.041409, -15.45085, -44.394386), (19.341476, -15.45085, -43.44167), (18.986069, -17.918398, -42.64341), (18.986069, -17.918398, -42.64341), (19.341476, -15.45085, -43.44167), (21.588531, -15.45085, -42.369877), (21.191832, -17.918398, -41.591312), (21.191832, -17.918398, -41.591312), (21.588531, -15.45085, -42.369877), (23.776413, -15.45085, -41.181953), (23.33951, -17.918398, -40.425217), (23.33951, -17.918398, -40.425217), (23.776413, -15.45085, -41.181953), (25.899126, -15.45085, -39.881157), (25.423218, -17.918398, -39.148323), (25.423218, -17.918398, -39.148323), (25.899126, -15.45085, -39.881157), (27.95085, -15.45085, -38.471043), (27.43724, -17.918398, -37.764122), (27.43724, -17.918398, -37.764122), (27.95085, -15.45085, -38.471043), (29.925962, -15.45085, -36.955486), (29.37606, -17.918398, -36.276413), (29.37606, -17.918398, -36.276413), (29.925962, -15.45085, -36.955486), (31.819052, -15.45085, -35.33864), (31.234362, -17.918398, -34.689274), (31.234362, -17.918398, -34.689274), (31.819052, -15.45085, -35.33864), (33.624924, -15.45085, -33.624924), (33.007053, -17.918398, -33.007053), (33.007053, -17.918398, -33.007053), (33.624924, -15.45085, -33.624924), (35.33864, -15.45085, -31.819052), (34.689274, -17.918398, -31.234362), (34.689274, -17.918398, -31.234362), (35.33864, -15.45085, -31.819052), (36.955486, -15.45085, -29.925962), (36.276413, -17.918398, -29.37606), (36.276413, -17.918398, -29.37606), (36.955486, -15.45085, -29.925962), (38.471043, -15.45085, -27.95085), (37.764122, -17.918398, -27.43724), (37.764122, -17.918398, -27.43724), (38.471043, -15.45085, -27.95085), (39.881157, -15.45085, -25.899126), (39.148323, -17.918398, -25.423218), (39.148323, -17.918398, -25.423218), (39.881157, -15.45085, -25.899126), (41.181953, -15.45085, -23.776413), (40.425217, -17.918398, -23.33951), (40.425217, -17.918398, -23.33951), (41.181953, -15.45085, -23.776413), (42.369877, -15.45085, -21.588531), (41.591312, -17.918398, -21.191832), (41.591312, -17.918398, -21.191832), (42.369877, -15.45085, -21.588531), (43.44167, -15.45085, -19.341476), (42.64341, -17.918398, -18.986069), (42.64341, -17.918398, -18.986069), (43.44167, -15.45085, -19.341476), (44.394386, -15.45085, -17.041409), (43.57862, -17.918398, -16.728266), (43.57862, -17.918398, -16.728266), (44.394386, -15.45085, -17.041409), (45.225426, -15.45085, -14.694632), (44.394386, -17.918398, -14.424611), (44.394386, -17.918398, -14.424611), (45.225426, -15.45085, -14.694632), (45.932503, -15.45085, -12.307577), (45.08847, -17.918398, -12.08142), (45.08847, -17.918398, -12.08142), (45.932503, -15.45085, -12.307577), (46.513683, -15.45085, -9.886788), (45.658974, -17.918398, -9.705114), (45.658974, -17.918398, -9.705114), (46.513683, -15.45085, -9.886788), (46.967373, -15.45085, -7.438901), (46.104324, -17.918398, -7.302208), (46.104324, -17.918398, -7.302208), (46.967373, -15.45085, -7.438901), (47.292328, -15.45085, -4.970624), (46.42331, -17.918398, -4.8792863), (46.42331, -17.918398, -4.8792863), (47.292328, -15.45085, -4.970624), (47.487656, -15.45085, -2.4887226), (46.615047, -17.918398, -2.4429913), (46.615047, -17.918398, -2.4429913), (47.487656, -15.45085, -2.4887226), (47.552826, -15.45085, 0), (46.67902, -17.918398, 0), (47.552826, -15.45085, 0), (48.29629, -12.940952, 0), (48.230103, -12.940952, 2.5276325), (47.487656, -15.45085, 2.4887226), (47.487656, -15.45085, 2.4887226), (48.230103, -12.940952, 2.5276325), (48.03172, -12.940952, 5.048337), (47.292328, -15.45085, 4.970624), (47.292328, -15.45085, 4.970624), (48.03172, -12.940952, 5.048337), (47.701683, -12.940952, 7.5552044), (46.967373, -15.45085, 7.438901), (46.967373, -15.45085, 7.438901), (47.701683, -12.940952, 7.5552044), (47.240902, -12.940952, 10.041364), (46.513683, -15.45085, 9.886788), (46.513683, -15.45085, 9.886788), (47.240902, -12.940952, 10.041364), (46.650635, -12.940952, 12.5), (45.932503, -15.45085, 12.307577), (45.932503, -15.45085, 12.307577), (46.650635, -12.940952, 12.5), (45.932503, -12.940952, 14.924375), (45.225426, -15.45085, 14.694632), (45.225426, -15.45085, 14.694632), (45.932503, -12.940952, 14.924375), (45.08847, -12.940952, 17.307842), (44.394386, -15.45085, 17.041409), (44.394386, -15.45085, 17.041409), (45.08847, -12.940952, 17.307842), (44.120857, -12.940952, 19.643871), (43.44167, -15.45085, 19.341476), (43.44167, -15.45085, 19.341476), (44.120857, -12.940952, 19.643871), (43.03231, -12.940952, 21.926058), (42.369877, -15.45085, 21.588531), (42.369877, -15.45085, 21.588531), (43.03231, -12.940952, 21.926058), (41.825813, -12.940952, 24.148146), (41.181953, -15.45085, 23.776413), (41.181953, -15.45085, 23.776413), (41.825813, -12.940952, 24.148146), (40.504677, -12.940952, 26.304045), (39.881157, -15.45085, 25.899126), (39.881157, -15.45085, 25.899126), (40.504677, -12.940952, 26.304045), (39.07252, -12.940952, 28.387848), (38.471043, -15.45085, 27.95085), (38.471043, -15.45085, 27.95085), (39.07252, -12.940952, 28.387848), (37.533268, -12.940952, 30.39384), (36.955486, -15.45085, 29.925962), (36.955486, -15.45085, 29.925962), (37.533268, -12.940952, 30.39384), (35.89114, -12.940952, 32.31653), (35.33864, -15.45085, 31.819052), (35.33864, -15.45085, 31.819052), (35.89114, -12.940952, 32.31653), (34.150635, -12.940952, 34.150635), (33.624924, -15.45085, 33.624924), (33.624924, -15.45085, 33.624924), (34.150635, -12.940952, 34.150635), (32.31653, -12.940952, 35.89114), (31.819052, -15.45085, 35.33864), (31.819052, -15.45085, 35.33864), (32.31653, -12.940952, 35.89114), (30.39384, -12.940952, 37.533268), (29.925962, -15.45085, 36.955486), (29.925962, -15.45085, 36.955486), (30.39384, -12.940952, 37.533268), (28.387848, -12.940952, 39.07252), (27.95085, -15.45085, 38.471043), (27.95085, -15.45085, 38.471043), (28.387848, -12.940952, 39.07252), (26.304045, -12.940952, 40.504677), (25.899126, -15.45085, 39.881157), (25.899126, -15.45085, 39.881157), (26.304045, -12.940952, 40.504677), (24.148146, -12.940952, 41.825813), (23.776413, -15.45085, 41.181953), (23.776413, -15.45085, 41.181953), (24.148146, -12.940952, 41.825813), (21.926058, -12.940952, 43.03231), (21.588531, -15.45085, 42.369877), (21.588531, -15.45085, 42.369877), (21.926058, -12.940952, 43.03231), (19.643871, -12.940952, 44.120857), (19.341476, -15.45085, 43.44167), (19.341476, -15.45085, 43.44167), (19.643871, -12.940952, 44.120857), (17.307842, -12.940952, 45.08847), (17.041409, -15.45085, 44.394386), (17.041409, -15.45085, 44.394386), (17.307842, -12.940952, 45.08847), (14.924375, -12.940952, 45.932503), (14.694632, -15.45085, 45.225426), (14.694632, -15.45085, 45.225426), (14.924375, -12.940952, 45.932503), (12.5, -12.940952, 46.650635), (12.307577, -15.45085, 45.932503), (12.307577, -15.45085, 45.932503), (12.5, -12.940952, 46.650635), (10.041364, -12.940952, 47.240902), (9.886788, -15.45085, 46.513683), (9.886788, -15.45085, 46.513683), (10.041364, -12.940952, 47.240902), (7.5552044, -12.940952, 47.701683), (7.438901, -15.45085, 46.967373), (7.438901, -15.45085, 46.967373), (7.5552044, -12.940952, 47.701683), (5.048337, -12.940952, 48.03172), (4.970624, -15.45085, 47.292328), (4.970624, -15.45085, 47.292328), (5.048337, -12.940952, 48.03172), (2.5276325, -12.940952, 48.230103), (2.4887226, -15.45085, 47.487656), (2.4887226, -15.45085, 47.487656), (2.5276325, -12.940952, 48.230103), (2.9572948e-15, -12.940952, 48.29629), (2.9117708e-15, -15.45085, 47.552826), (2.9117708e-15, -15.45085, 47.552826), (2.9572948e-15, -12.940952, 48.29629), (-2.5276325, -12.940952, 48.230103), (-2.4887226, -15.45085, 47.487656), (-2.4887226, -15.45085, 47.487656), (-2.5276325, -12.940952, 48.230103), (-5.048337, -12.940952, 48.03172), (-4.970624, -15.45085, 47.292328), (-4.970624, -15.45085, 47.292328), (-5.048337, -12.940952, 48.03172), (-7.5552044, -12.940952, 47.701683), (-7.438901, -15.45085, 46.967373), (-7.438901, -15.45085, 46.967373), (-7.5552044, -12.940952, 47.701683), (-10.041364, -12.940952, 47.240902), (-9.886788, -15.45085, 46.513683), (-9.886788, -15.45085, 46.513683), (-10.041364, -12.940952, 47.240902), (-12.5, -12.940952, 46.650635), (-12.307577, -15.45085, 45.932503), (-12.307577, -15.45085, 45.932503), (-12.5, -12.940952, 46.650635), (-14.924375, -12.940952, 45.932503), (-14.694632, -15.45085, 45.225426), (-14.694632, -15.45085, 45.225426), (-14.924375, -12.940952, 45.932503), (-17.307842, -12.940952, 45.08847), (-17.041409, -15.45085, 44.394386), (-17.041409, -15.45085, 44.394386), (-17.307842, -12.940952, 45.08847), (-19.643871, -12.940952, 44.120857), (-19.341476, -15.45085, 43.44167), (-19.341476, -15.45085, 43.44167), (-19.643871, -12.940952, 44.120857), (-21.926058, -12.940952, 43.03231), (-21.588531, -15.45085, 42.369877), (-21.588531, -15.45085, 42.369877), (-21.926058, -12.940952, 43.03231), (-24.148146, -12.940952, 41.825813), (-23.776413, -15.45085, 41.181953), (-23.776413, -15.45085, 41.181953), (-24.148146, -12.940952, 41.825813), (-26.304045, -12.940952, 40.504677), (-25.899126, -15.45085, 39.881157), (-25.899126, -15.45085, 39.881157), (-26.304045, -12.940952, 40.504677), (-28.387848, -12.940952, 39.07252), (-27.95085, -15.45085, 38.471043), (-27.95085, -15.45085, 38.471043), (-28.387848, -12.940952, 39.07252), (-30.39384, -12.940952, 37.533268), (-29.925962, -15.45085, 36.955486), (-29.925962, -15.45085, 36.955486), (-30.39384, -12.940952, 37.533268), (-32.31653, -12.940952, 35.89114), (-31.819052, -15.45085, 35.33864), (-31.819052, -15.45085, 35.33864), (-32.31653, -12.940952, 35.89114), (-34.150635, -12.940952, 34.150635), (-33.624924, -15.45085, 33.624924), (-33.624924, -15.45085, 33.624924), (-34.150635, -12.940952, 34.150635), (-35.89114, -12.940952, 32.31653), (-35.33864, -15.45085, 31.819052), (-35.33864, -15.45085, 31.819052), (-35.89114, -12.940952, 32.31653), (-37.533268, -12.940952, 30.39384), (-36.955486, -15.45085, 29.925962), (-36.955486, -15.45085, 29.925962), (-37.533268, -12.940952, 30.39384), (-39.07252, -12.940952, 28.387848), (-38.471043, -15.45085, 27.95085), (-38.471043, -15.45085, 27.95085), (-39.07252, -12.940952, 28.387848), (-40.504677, -12.940952, 26.304045), (-39.881157, -15.45085, 25.899126), (-39.881157, -15.45085, 25.899126), (-40.504677, -12.940952, 26.304045), (-41.825813, -12.940952, 24.148146), (-41.181953, -15.45085, 23.776413), (-41.181953, -15.45085, 23.776413), (-41.825813, -12.940952, 24.148146), (-43.03231, -12.940952, 21.926058), (-42.369877, -15.45085, 21.588531), (-42.369877, -15.45085, 21.588531), (-43.03231, -12.940952, 21.926058), (-44.120857, -12.940952, 19.643871), (-43.44167, -15.45085, 19.341476), (-43.44167, -15.45085, 19.341476), (-44.120857, -12.940952, 19.643871), (-45.08847, -12.940952, 17.307842), (-44.394386, -15.45085, 17.041409), (-44.394386, -15.45085, 17.041409), (-45.08847, -12.940952, 17.307842), (-45.932503, -12.940952, 14.924375), (-45.225426, -15.45085, 14.694632), (-45.225426, -15.45085, 14.694632), (-45.932503, -12.940952, 14.924375), (-46.650635, -12.940952, 12.5), (-45.932503, -15.45085, 12.307577), (-45.932503, -15.45085, 12.307577), (-46.650635, -12.940952, 12.5), (-47.240902, -12.940952, 10.041364), (-46.513683, -15.45085, 9.886788), (-46.513683, -15.45085, 9.886788), (-47.240902, -12.940952, 10.041364), (-47.701683, -12.940952, 7.5552044), (-46.967373, -15.45085, 7.438901), (-46.967373, -15.45085, 7.438901), (-47.701683, -12.940952, 7.5552044), (-48.03172, -12.940952, 5.048337), (-47.292328, -15.45085, 4.970624), (-47.292328, -15.45085, 4.970624), (-48.03172, -12.940952, 5.048337), (-48.230103, -12.940952, 2.5276325), (-47.487656, -15.45085, 2.4887226), (-47.487656, -15.45085, 2.4887226), (-48.230103, -12.940952, 2.5276325), (-48.29629, -12.940952, 5.9145897e-15), (-47.552826, -15.45085, 5.8235417e-15), (-47.552826, -15.45085, 5.8235417e-15), (-48.29629, -12.940952, 5.9145897e-15), (-48.230103, -12.940952, -2.5276325), (-47.487656, -15.45085, -2.4887226), (-47.487656, -15.45085, -2.4887226), (-48.230103, -12.940952, -2.5276325), (-48.03172, -12.940952, -5.048337), (-47.292328, -15.45085, -4.970624), (-47.292328, -15.45085, -4.970624), (-48.03172, -12.940952, -5.048337), (-47.701683, -12.940952, -7.5552044), (-46.967373, -15.45085, -7.438901), (-46.967373, -15.45085, -7.438901), (-47.701683, -12.940952, -7.5552044), (-47.240902, -12.940952, -10.041364), (-46.513683, -15.45085, -9.886788), (-46.513683, -15.45085, -9.886788), (-47.240902, -12.940952, -10.041364), (-46.650635, -12.940952, -12.5), (-45.932503, -15.45085, -12.307577), (-45.932503, -15.45085, -12.307577), (-46.650635, -12.940952, -12.5), (-45.932503, -12.940952, -14.924375), (-45.225426, -15.45085, -14.694632), (-45.225426, -15.45085, -14.694632), (-45.932503, -12.940952, -14.924375), (-45.08847, -12.940952, -17.307842), (-44.394386, -15.45085, -17.041409), (-44.394386, -15.45085, -17.041409), (-45.08847, -12.940952, -17.307842), (-44.120857, -12.940952, -19.643871), (-43.44167, -15.45085, -19.341476), (-43.44167, -15.45085, -19.341476), (-44.120857, -12.940952, -19.643871), (-43.03231, -12.940952, -21.926058), (-42.369877, -15.45085, -21.588531), (-42.369877, -15.45085, -21.588531), (-43.03231, -12.940952, -21.926058), (-41.825813, -12.940952, -24.148146), (-41.181953, -15.45085, -23.776413), (-41.181953, -15.45085, -23.776413), (-41.825813, -12.940952, -24.148146), (-40.504677, -12.940952, -26.304045), (-39.881157, -15.45085, -25.899126), (-39.881157, -15.45085, -25.899126), (-40.504677, -12.940952, -26.304045), (-39.07252, -12.940952, -28.387848), (-38.471043, -15.45085, -27.95085), (-38.471043, -15.45085, -27.95085), (-39.07252, -12.940952, -28.387848), (-37.533268, -12.940952, -30.39384), (-36.955486, -15.45085, -29.925962), (-36.955486, -15.45085, -29.925962), (-37.533268, -12.940952, -30.39384), (-35.89114, -12.940952, -32.31653), (-35.33864, -15.45085, -31.819052), (-35.33864, -15.45085, -31.819052), (-35.89114, -12.940952, -32.31653), (-34.150635, -12.940952, -34.150635), (-33.624924, -15.45085, -33.624924), (-33.624924, -15.45085, -33.624924), (-34.150635, -12.940952, -34.150635), (-32.31653, -12.940952, -35.89114), (-31.819052, -15.45085, -35.33864), (-31.819052, -15.45085, -35.33864), (-32.31653, -12.940952, -35.89114), (-30.39384, -12.940952, -37.533268), (-29.925962, -15.45085, -36.955486), (-29.925962, -15.45085, -36.955486), (-30.39384, -12.940952, -37.533268), (-28.387848, -12.940952, -39.07252), (-27.95085, -15.45085, -38.471043), (-27.95085, -15.45085, -38.471043), (-28.387848, -12.940952, -39.07252), (-26.304045, -12.940952, -40.504677), (-25.899126, -15.45085, -39.881157), (-25.899126, -15.45085, -39.881157), (-26.304045, -12.940952, -40.504677), (-24.148146, -12.940952, -41.825813), (-23.776413, -15.45085, -41.181953), (-23.776413, -15.45085, -41.181953), (-24.148146, -12.940952, -41.825813), (-21.926058, -12.940952, -43.03231), (-21.588531, -15.45085, -42.369877), (-21.588531, -15.45085, -42.369877), (-21.926058, -12.940952, -43.03231), (-19.643871, -12.940952, -44.120857), (-19.341476, -15.45085, -43.44167), (-19.341476, -15.45085, -43.44167), (-19.643871, -12.940952, -44.120857), (-17.307842, -12.940952, -45.08847), (-17.041409, -15.45085, -44.394386), (-17.041409, -15.45085, -44.394386), (-17.307842, -12.940952, -45.08847), (-14.924375, -12.940952, -45.932503), (-14.694632, -15.45085, -45.225426), (-14.694632, -15.45085, -45.225426), (-14.924375, -12.940952, -45.932503), (-12.5, -12.940952, -46.650635), (-12.307577, -15.45085, -45.932503), (-12.307577, -15.45085, -45.932503), (-12.5, -12.940952, -46.650635), (-10.041364, -12.940952, -47.240902), (-9.886788, -15.45085, -46.513683), (-9.886788, -15.45085, -46.513683), (-10.041364, -12.940952, -47.240902), (-7.5552044, -12.940952, -47.701683), (-7.438901, -15.45085, -46.967373), (-7.438901, -15.45085, -46.967373), (-7.5552044, -12.940952, -47.701683), (-5.048337, -12.940952, -48.03172), (-4.970624, -15.45085, -47.292328), (-4.970624, -15.45085, -47.292328), (-5.048337, -12.940952, -48.03172), (-2.5276325, -12.940952, -48.230103), (-2.4887226, -15.45085, -47.487656), (-2.4887226, -15.45085, -47.487656), (-2.5276325, -12.940952, -48.230103), (-8.871885e-15, -12.940952, -48.29629), (-8.735313e-15, -15.45085, -47.552826), (-8.735313e-15, -15.45085, -47.552826), (-8.871885e-15, -12.940952, -48.29629), (2.5276325, -12.940952, -48.230103), (2.4887226, -15.45085, -47.487656), (2.4887226, -15.45085, -47.487656), (2.5276325, -12.940952, -48.230103), (5.048337, -12.940952, -48.03172), (4.970624, -15.45085, -47.292328), (4.970624, -15.45085, -47.292328), (5.048337, -12.940952, -48.03172), (7.5552044, -12.940952, -47.701683), (7.438901, -15.45085, -46.967373), (7.438901, -15.45085, -46.967373), (7.5552044, -12.940952, -47.701683), (10.041364, -12.940952, -47.240902), (9.886788, -15.45085, -46.513683), (9.886788, -15.45085, -46.513683), (10.041364, -12.940952, -47.240902), (12.5, -12.940952, -46.650635), (12.307577, -15.45085, -45.932503), (12.307577, -15.45085, -45.932503), (12.5, -12.940952, -46.650635), (14.924375, -12.940952, -45.932503), (14.694632, -15.45085, -45.225426), (14.694632, -15.45085, -45.225426), (14.924375, -12.940952, -45.932503), (17.307842, -12.940952, -45.08847), (17.041409, -15.45085, -44.394386), (17.041409, -15.45085, -44.394386), (17.307842, -12.940952, -45.08847), (19.643871, -12.940952, -44.120857), (19.341476, -15.45085, -43.44167), (19.341476, -15.45085, -43.44167), (19.643871, -12.940952, -44.120857), (21.926058, -12.940952, -43.03231), (21.588531, -15.45085, -42.369877), (21.588531, -15.45085, -42.369877), (21.926058, -12.940952, -43.03231), (24.148146, -12.940952, -41.825813), (23.776413, -15.45085, -41.181953), (23.776413, -15.45085, -41.181953), (24.148146, -12.940952, -41.825813), (26.304045, -12.940952, -40.504677), (25.899126, -15.45085, -39.881157), (25.899126, -15.45085, -39.881157), (26.304045, -12.940952, -40.504677), (28.387848, -12.940952, -39.07252), (27.95085, -15.45085, -38.471043), (27.95085, -15.45085, -38.471043), (28.387848, -12.940952, -39.07252), (30.39384, -12.940952, -37.533268), (29.925962, -15.45085, -36.955486), (29.925962, -15.45085, -36.955486), (30.39384, -12.940952, -37.533268), (32.31653, -12.940952, -35.89114), (31.819052, -15.45085, -35.33864), (31.819052, -15.45085, -35.33864), (32.31653, -12.940952, -35.89114), (34.150635, -12.940952, -34.150635), (33.624924, -15.45085, -33.624924), (33.624924, -15.45085, -33.624924), (34.150635, -12.940952, -34.150635), (35.89114, -12.940952, -32.31653), (35.33864, -15.45085, -31.819052), (35.33864, -15.45085, -31.819052), (35.89114, -12.940952, -32.31653), (37.533268, -12.940952, -30.39384), (36.955486, -15.45085, -29.925962), (36.955486, -15.45085, -29.925962), (37.533268, -12.940952, -30.39384), (39.07252, -12.940952, -28.387848), (38.471043, -15.45085, -27.95085), (38.471043, -15.45085, -27.95085), (39.07252, -12.940952, -28.387848), (40.504677, -12.940952, -26.304045), (39.881157, -15.45085, -25.899126), (39.881157, -15.45085, -25.899126), (40.504677, -12.940952, -26.304045), (41.825813, -12.940952, -24.148146), (41.181953, -15.45085, -23.776413), (41.181953, -15.45085, -23.776413), (41.825813, -12.940952, -24.148146), (43.03231, -12.940952, -21.926058), (42.369877, -15.45085, -21.588531), (42.369877, -15.45085, -21.588531), (43.03231, -12.940952, -21.926058), (44.120857, -12.940952, -19.643871), (43.44167, -15.45085, -19.341476), (43.44167, -15.45085, -19.341476), (44.120857, -12.940952, -19.643871), (45.08847, -12.940952, -17.307842), (44.394386, -15.45085, -17.041409), (44.394386, -15.45085, -17.041409), (45.08847, -12.940952, -17.307842), (45.932503, -12.940952, -14.924375), (45.225426, -15.45085, -14.694632), (45.225426, -15.45085, -14.694632), (45.932503, -12.940952, -14.924375), (46.650635, -12.940952, -12.5), (45.932503, -15.45085, -12.307577), (45.932503, -15.45085, -12.307577), (46.650635, -12.940952, -12.5), (47.240902, -12.940952, -10.041364), (46.513683, -15.45085, -9.886788), (46.513683, -15.45085, -9.886788), (47.240902, -12.940952, -10.041364), (47.701683, -12.940952, -7.5552044), (46.967373, -15.45085, -7.438901), (46.967373, -15.45085, -7.438901), (47.701683, -12.940952, -7.5552044), (48.03172, -12.940952, -5.048337), (47.292328, -15.45085, -4.970624), (47.292328, -15.45085, -4.970624), (48.03172, -12.940952, -5.048337), (48.230103, -12.940952, -2.5276325), (47.487656, -15.45085, -2.4887226), (47.487656, -15.45085, -2.4887226), (48.230103, -12.940952, -2.5276325), (48.29629, -12.940952, 0), (47.552826, -15.45085, 0), (48.29629, -12.940952, 0), (48.90738, -10.395584, 0), (48.840355, -10.395584, 2.5596144), (48.230103, -12.940952, 2.5276325), (48.230103, -12.940952, 2.5276325), (48.840355, -10.395584, 2.5596144), (48.63946, -10.395584, 5.112213), (48.03172, -12.940952, 5.048337), (48.03172, -12.940952, 5.048337), (48.63946, -10.395584, 5.112213), (48.30525, -10.395584, 7.6507998), (47.701683, -12.940952, 7.5552044), (47.701683, -12.940952, 7.5552044), (48.30525, -10.395584, 7.6507998), (47.83864, -10.395584, 10.168416), (47.240902, -12.940952, 10.041364), (47.240902, -12.940952, 10.041364), (47.83864, -10.395584, 10.168416), (47.240902, -10.395584, 12.658161), (46.650635, -12.940952, 12.5), (46.650635, -12.940952, 12.5), (47.240902, -10.395584, 12.658161), (46.513683, -10.395584, 15.113212), (45.932503, -12.940952, 14.924375), (45.932503, -12.940952, 14.924375), (46.513683, -10.395584, 15.113212), (45.658974, -10.395584, 17.526838), (45.08847, -12.940952, 17.307842), (45.08847, -12.940952, 17.307842), (45.658974, -10.395584, 17.526838), (44.679115, -10.395584, 19.892424), (44.120857, -12.940952, 19.643871), (44.120857, -12.940952, 19.643871), (44.679115, -10.395584, 19.892424), (43.576794, -10.395584, 22.203485), (43.03231, -12.940952, 21.926058), (43.03231, -12.940952, 21.926058), (43.576794, -10.395584, 22.203485), (42.355034, -10.395584, 24.45369), (41.825813, -12.940952, 24.148146), (41.825813, -12.940952, 24.148146), (42.355034, -10.395584, 24.45369), (41.01718, -10.395584, 26.636868), (40.504677, -12.940952, 26.304045), (40.504677, -12.940952, 26.304045), (41.01718, -10.395584, 26.636868), (39.566902, -10.395584, 28.747036), (39.07252, -12.940952, 28.387848), (39.07252, -12.940952, 28.387848), (39.566902, -10.395584, 28.747036), (38.00817, -10.395584, 30.778412), (37.533268, -12.940952, 30.39384), (37.533268, -12.940952, 30.39384), (38.00817, -10.395584, 30.778412), (36.34527, -10.395584, 32.725426), (35.89114, -12.940952, 32.31653), (35.89114, -12.940952, 32.31653), (36.34527, -10.395584, 32.725426), (34.58274, -10.395584, 34.58274), (34.150635, -12.940952, 34.150635), (34.150635, -12.940952, 34.150635), (34.58274, -10.395584, 34.58274), (32.725426, -10.395584, 36.34527), (32.31653, -12.940952, 35.89114), (32.31653, -12.940952, 35.89114), (32.725426, -10.395584, 36.34527), (30.778412, -10.395584, 38.00817), (30.39384, -12.940952, 37.533268), (30.39384, -12.940952, 37.533268), (30.778412, -10.395584, 38.00817), (28.747036, -10.395584, 39.566902), (28.387848, -12.940952, 39.07252), (28.387848, -12.940952, 39.07252), (28.747036, -10.395584, 39.566902), (26.636868, -10.395584, 41.01718), (26.304045, -12.940952, 40.504677), (26.304045, -12.940952, 40.504677), (26.636868, -10.395584, 41.01718), (24.45369, -10.395584, 42.355034), (24.148146, -12.940952, 41.825813), (24.148146, -12.940952, 41.825813), (24.45369, -10.395584, 42.355034), (22.203485, -10.395584, 43.576794), (21.926058, -12.940952, 43.03231), (21.926058, -12.940952, 43.03231), (22.203485, -10.395584, 43.576794), (19.892424, -10.395584, 44.679115), (19.643871, -12.940952, 44.120857), (19.643871, -12.940952, 44.120857), (19.892424, -10.395584, 44.679115), (17.526838, -10.395584, 45.658974), (17.307842, -12.940952, 45.08847), (17.307842, -12.940952, 45.08847), (17.526838, -10.395584, 45.658974), (15.113212, -10.395584, 46.513683), (14.924375, -12.940952, 45.932503), (14.924375, -12.940952, 45.932503), (15.113212, -10.395584, 46.513683), (12.658161, -10.395584, 47.240902), (12.5, -12.940952, 46.650635), (12.5, -12.940952, 46.650635), (12.658161, -10.395584, 47.240902), (10.168416, -10.395584, 47.83864), (10.041364, -12.940952, 47.240902), (10.041364, -12.940952, 47.240902), (10.168416, -10.395584, 47.83864), (7.6507998, -10.395584, 48.30525), (7.5552044, -12.940952, 47.701683), (7.5552044, -12.940952, 47.701683), (7.6507998, -10.395584, 48.30525), (5.112213, -10.395584, 48.63946), (5.048337, -12.940952, 48.03172), (5.048337, -12.940952, 48.03172), (5.112213, -10.395584, 48.63946), (2.5596144, -10.395584, 48.840355), (2.5276325, -12.940952, 48.230103), (2.5276325, -12.940952, 48.230103), (2.5596144, -10.395584, 48.840355), (2.9947134e-15, -10.395584, 48.90738), (2.9572948e-15, -12.940952, 48.29629), (2.9572948e-15, -12.940952, 48.29629), (2.9947134e-15, -10.395584, 48.90738), (-2.5596144, -10.395584, 48.840355), (-2.5276325, -12.940952, 48.230103), (-2.5276325, -12.940952, 48.230103), (-2.5596144, -10.395584, 48.840355), (-5.112213, -10.395584, 48.63946), (-5.048337, -12.940952, 48.03172), (-5.048337, -12.940952, 48.03172), (-5.112213, -10.395584, 48.63946), (-7.6507998, -10.395584, 48.30525), (-7.5552044, -12.940952, 47.701683), (-7.5552044, -12.940952, 47.701683), (-7.6507998, -10.395584, 48.30525), (-10.168416, -10.395584, 47.83864), (-10.041364, -12.940952, 47.240902), (-10.041364, -12.940952, 47.240902), (-10.168416, -10.395584, 47.83864), (-12.658161, -10.395584, 47.240902), (-12.5, -12.940952, 46.650635), (-12.5, -12.940952, 46.650635), (-12.658161, -10.395584, 47.240902), (-15.113212, -10.395584, 46.513683), (-14.924375, -12.940952, 45.932503), (-14.924375, -12.940952, 45.932503), (-15.113212, -10.395584, 46.513683), (-17.526838, -10.395584, 45.658974), (-17.307842, -12.940952, 45.08847), (-17.307842, -12.940952, 45.08847), (-17.526838, -10.395584, 45.658974), (-19.892424, -10.395584, 44.679115), (-19.643871, -12.940952, 44.120857), (-19.643871, -12.940952, 44.120857), (-19.892424, -10.395584, 44.679115), (-22.203485, -10.395584, 43.576794), (-21.926058, -12.940952, 43.03231), (-21.926058, -12.940952, 43.03231), (-22.203485, -10.395584, 43.576794), (-24.45369, -10.395584, 42.355034), (-24.148146, -12.940952, 41.825813), (-24.148146, -12.940952, 41.825813), (-24.45369, -10.395584, 42.355034), (-26.636868, -10.395584, 41.01718), (-26.304045, -12.940952, 40.504677), (-26.304045, -12.940952, 40.504677), (-26.636868, -10.395584, 41.01718), (-28.747036, -10.395584, 39.566902), (-28.387848, -12.940952, 39.07252), (-28.387848, -12.940952, 39.07252), (-28.747036, -10.395584, 39.566902), (-30.778412, -10.395584, 38.00817), (-30.39384, -12.940952, 37.533268), (-30.39384, -12.940952, 37.533268), (-30.778412, -10.395584, 38.00817), (-32.725426, -10.395584, 36.34527), (-32.31653, -12.940952, 35.89114), (-32.31653, -12.940952, 35.89114), (-32.725426, -10.395584, 36.34527), (-34.58274, -10.395584, 34.58274), (-34.150635, -12.940952, 34.150635), (-34.150635, -12.940952, 34.150635), (-34.58274, -10.395584, 34.58274), (-36.34527, -10.395584, 32.725426), (-35.89114, -12.940952, 32.31653), (-35.89114, -12.940952, 32.31653), (-36.34527, -10.395584, 32.725426), (-38.00817, -10.395584, 30.778412), (-37.533268, -12.940952, 30.39384), (-37.533268, -12.940952, 30.39384), (-38.00817, -10.395584, 30.778412), (-39.566902, -10.395584, 28.747036), (-39.07252, -12.940952, 28.387848), (-39.07252, -12.940952, 28.387848), (-39.566902, -10.395584, 28.747036), (-41.01718, -10.395584, 26.636868), (-40.504677, -12.940952, 26.304045), (-40.504677, -12.940952, 26.304045), (-41.01718, -10.395584, 26.636868), (-42.355034, -10.395584, 24.45369), (-41.825813, -12.940952, 24.148146), (-41.825813, -12.940952, 24.148146), (-42.355034, -10.395584, 24.45369), (-43.576794, -10.395584, 22.203485), (-43.03231, -12.940952, 21.926058), (-43.03231, -12.940952, 21.926058), (-43.576794, -10.395584, 22.203485), (-44.679115, -10.395584, 19.892424), (-44.120857, -12.940952, 19.643871), (-44.120857, -12.940952, 19.643871), (-44.679115, -10.395584, 19.892424), (-45.658974, -10.395584, 17.526838), (-45.08847, -12.940952, 17.307842), (-45.08847, -12.940952, 17.307842), (-45.658974, -10.395584, 17.526838), (-46.513683, -10.395584, 15.113212), (-45.932503, -12.940952, 14.924375), (-45.932503, -12.940952, 14.924375), (-46.513683, -10.395584, 15.113212), (-47.240902, -10.395584, 12.658161), (-46.650635, -12.940952, 12.5), (-46.650635, -12.940952, 12.5), (-47.240902, -10.395584, 12.658161), (-47.83864, -10.395584, 10.168416), (-47.240902, -12.940952, 10.041364), (-47.240902, -12.940952, 10.041364), (-47.83864, -10.395584, 10.168416), (-48.30525, -10.395584, 7.6507998), (-47.701683, -12.940952, 7.5552044), (-47.701683, -12.940952, 7.5552044), (-48.30525, -10.395584, 7.6507998), (-48.63946, -10.395584, 5.112213), (-48.03172, -12.940952, 5.048337), (-48.03172, -12.940952, 5.048337), (-48.63946, -10.395584, 5.112213), (-48.840355, -10.395584, 2.5596144), (-48.230103, -12.940952, 2.5276325), (-48.230103, -12.940952, 2.5276325), (-48.840355, -10.395584, 2.5596144), (-48.90738, -10.395584, 5.9894267e-15), (-48.29629, -12.940952, 5.9145897e-15), (-48.29629, -12.940952, 5.9145897e-15), (-48.90738, -10.395584, 5.9894267e-15), (-48.840355, -10.395584, -2.5596144), (-48.230103, -12.940952, -2.5276325), (-48.230103, -12.940952, -2.5276325), (-48.840355, -10.395584, -2.5596144), (-48.63946, -10.395584, -5.112213), (-48.03172, -12.940952, -5.048337), (-48.03172, -12.940952, -5.048337), (-48.63946, -10.395584, -5.112213), (-48.30525, -10.395584, -7.6507998), (-47.701683, -12.940952, -7.5552044), (-47.701683, -12.940952, -7.5552044), (-48.30525, -10.395584, -7.6507998), (-47.83864, -10.395584, -10.168416), (-47.240902, -12.940952, -10.041364), (-47.240902, -12.940952, -10.041364), (-47.83864, -10.395584, -10.168416), (-47.240902, -10.395584, -12.658161), (-46.650635, -12.940952, -12.5), (-46.650635, -12.940952, -12.5), (-47.240902, -10.395584, -12.658161), (-46.513683, -10.395584, -15.113212), (-45.932503, -12.940952, -14.924375), (-45.932503, -12.940952, -14.924375), (-46.513683, -10.395584, -15.113212), (-45.658974, -10.395584, -17.526838), (-45.08847, -12.940952, -17.307842), (-45.08847, -12.940952, -17.307842), (-45.658974, -10.395584, -17.526838), (-44.679115, -10.395584, -19.892424), (-44.120857, -12.940952, -19.643871), (-44.120857, -12.940952, -19.643871), (-44.679115, -10.395584, -19.892424), (-43.576794, -10.395584, -22.203485), (-43.03231, -12.940952, -21.926058), (-43.03231, -12.940952, -21.926058), (-43.576794, -10.395584, -22.203485), (-42.355034, -10.395584, -24.45369), (-41.825813, -12.940952, -24.148146), (-41.825813, -12.940952, -24.148146), (-42.355034, -10.395584, -24.45369), (-41.01718, -10.395584, -26.636868), (-40.504677, -12.940952, -26.304045), (-40.504677, -12.940952, -26.304045), (-41.01718, -10.395584, -26.636868), (-39.566902, -10.395584, -28.747036), (-39.07252, -12.940952, -28.387848), (-39.07252, -12.940952, -28.387848), (-39.566902, -10.395584, -28.747036), (-38.00817, -10.395584, -30.778412), (-37.533268, -12.940952, -30.39384), (-37.533268, -12.940952, -30.39384), (-38.00817, -10.395584, -30.778412), (-36.34527, -10.395584, -32.725426), (-35.89114, -12.940952, -32.31653), (-35.89114, -12.940952, -32.31653), (-36.34527, -10.395584, -32.725426), (-34.58274, -10.395584, -34.58274), (-34.150635, -12.940952, -34.150635), (-34.150635, -12.940952, -34.150635), (-34.58274, -10.395584, -34.58274), (-32.725426, -10.395584, -36.34527), (-32.31653, -12.940952, -35.89114), (-32.31653, -12.940952, -35.89114), (-32.725426, -10.395584, -36.34527), (-30.778412, -10.395584, -38.00817), (-30.39384, -12.940952, -37.533268), (-30.39384, -12.940952, -37.533268), (-30.778412, -10.395584, -38.00817), (-28.747036, -10.395584, -39.566902), (-28.387848, -12.940952, -39.07252), (-28.387848, -12.940952, -39.07252), (-28.747036, -10.395584, -39.566902), (-26.636868, -10.395584, -41.01718), (-26.304045, -12.940952, -40.504677), (-26.304045, -12.940952, -40.504677), (-26.636868, -10.395584, -41.01718), (-24.45369, -10.395584, -42.355034), (-24.148146, -12.940952, -41.825813), (-24.148146, -12.940952, -41.825813), (-24.45369, -10.395584, -42.355034), (-22.203485, -10.395584, -43.576794), (-21.926058, -12.940952, -43.03231), (-21.926058, -12.940952, -43.03231), (-22.203485, -10.395584, -43.576794), (-19.892424, -10.395584, -44.679115), (-19.643871, -12.940952, -44.120857), (-19.643871, -12.940952, -44.120857), (-19.892424, -10.395584, -44.679115), (-17.526838, -10.395584, -45.658974), (-17.307842, -12.940952, -45.08847), (-17.307842, -12.940952, -45.08847), (-17.526838, -10.395584, -45.658974), (-15.113212, -10.395584, -46.513683), (-14.924375, -12.940952, -45.932503), (-14.924375, -12.940952, -45.932503), (-15.113212, -10.395584, -46.513683), (-12.658161, -10.395584, -47.240902), (-12.5, -12.940952, -46.650635), (-12.5, -12.940952, -46.650635), (-12.658161, -10.395584, -47.240902), (-10.168416, -10.395584, -47.83864), (-10.041364, -12.940952, -47.240902), (-10.041364, -12.940952, -47.240902), (-10.168416, -10.395584, -47.83864), (-7.6507998, -10.395584, -48.30525), (-7.5552044, -12.940952, -47.701683), (-7.5552044, -12.940952, -47.701683), (-7.6507998, -10.395584, -48.30525), (-5.112213, -10.395584, -48.63946), (-5.048337, -12.940952, -48.03172), (-5.048337, -12.940952, -48.03172), (-5.112213, -10.395584, -48.63946), (-2.5596144, -10.395584, -48.840355), (-2.5276325, -12.940952, -48.230103), (-2.5276325, -12.940952, -48.230103), (-2.5596144, -10.395584, -48.840355), (-8.98414e-15, -10.395584, -48.90738), (-8.871885e-15, -12.940952, -48.29629), (-8.871885e-15, -12.940952, -48.29629), (-8.98414e-15, -10.395584, -48.90738), (2.5596144, -10.395584, -48.840355), (2.5276325, -12.940952, -48.230103), (2.5276325, -12.940952, -48.230103), (2.5596144, -10.395584, -48.840355), (5.112213, -10.395584, -48.63946), (5.048337, -12.940952, -48.03172), (5.048337, -12.940952, -48.03172), (5.112213, -10.395584, -48.63946), (7.6507998, -10.395584, -48.30525), (7.5552044, -12.940952, -47.701683), (7.5552044, -12.940952, -47.701683), (7.6507998, -10.395584, -48.30525), (10.168416, -10.395584, -47.83864), (10.041364, -12.940952, -47.240902), (10.041364, -12.940952, -47.240902), (10.168416, -10.395584, -47.83864), (12.658161, -10.395584, -47.240902), (12.5, -12.940952, -46.650635), (12.5, -12.940952, -46.650635), (12.658161, -10.395584, -47.240902), (15.113212, -10.395584, -46.513683), (14.924375, -12.940952, -45.932503), (14.924375, -12.940952, -45.932503), (15.113212, -10.395584, -46.513683), (17.526838, -10.395584, -45.658974), (17.307842, -12.940952, -45.08847), (17.307842, -12.940952, -45.08847), (17.526838, -10.395584, -45.658974), (19.892424, -10.395584, -44.679115), (19.643871, -12.940952, -44.120857), (19.643871, -12.940952, -44.120857), (19.892424, -10.395584, -44.679115), (22.203485, -10.395584, -43.576794), (21.926058, -12.940952, -43.03231), (21.926058, -12.940952, -43.03231), (22.203485, -10.395584, -43.576794), (24.45369, -10.395584, -42.355034), (24.148146, -12.940952, -41.825813), (24.148146, -12.940952, -41.825813), (24.45369, -10.395584, -42.355034), (26.636868, -10.395584, -41.01718), (26.304045, -12.940952, -40.504677), (26.304045, -12.940952, -40.504677), (26.636868, -10.395584, -41.01718), (28.747036, -10.395584, -39.566902), (28.387848, -12.940952, -39.07252), (28.387848, -12.940952, -39.07252), (28.747036, -10.395584, -39.566902), (30.778412, -10.395584, -38.00817), (30.39384, -12.940952, -37.533268), (30.39384, -12.940952, -37.533268), (30.778412, -10.395584, -38.00817), (32.725426, -10.395584, -36.34527), (32.31653, -12.940952, -35.89114), (32.31653, -12.940952, -35.89114), (32.725426, -10.395584, -36.34527), (34.58274, -10.395584, -34.58274), (34.150635, -12.940952, -34.150635), (34.150635, -12.940952, -34.150635), (34.58274, -10.395584, -34.58274), (36.34527, -10.395584, -32.725426), (35.89114, -12.940952, -32.31653), (35.89114, -12.940952, -32.31653), (36.34527, -10.395584, -32.725426), (38.00817, -10.395584, -30.778412), (37.533268, -12.940952, -30.39384), (37.533268, -12.940952, -30.39384), (38.00817, -10.395584, -30.778412), (39.566902, -10.395584, -28.747036), (39.07252, -12.940952, -28.387848), (39.07252, -12.940952, -28.387848), (39.566902, -10.395584, -28.747036), (41.01718, -10.395584, -26.636868), (40.504677, -12.940952, -26.304045), (40.504677, -12.940952, -26.304045), (41.01718, -10.395584, -26.636868), (42.355034, -10.395584, -24.45369), (41.825813, -12.940952, -24.148146), (41.825813, -12.940952, -24.148146), (42.355034, -10.395584, -24.45369), (43.576794, -10.395584, -22.203485), (43.03231, -12.940952, -21.926058), (43.03231, -12.940952, -21.926058), (43.576794, -10.395584, -22.203485), (44.679115, -10.395584, -19.892424), (44.120857, -12.940952, -19.643871), (44.120857, -12.940952, -19.643871), (44.679115, -10.395584, -19.892424), (45.658974, -10.395584, -17.526838), (45.08847, -12.940952, -17.307842), (45.08847, -12.940952, -17.307842), (45.658974, -10.395584, -17.526838), (46.513683, -10.395584, -15.113212), (45.932503, -12.940952, -14.924375), (45.932503, -12.940952, -14.924375), (46.513683, -10.395584, -15.113212), (47.240902, -10.395584, -12.658161), (46.650635, -12.940952, -12.5), (46.650635, -12.940952, -12.5), (47.240902, -10.395584, -12.658161), (47.83864, -10.395584, -10.168416), (47.240902, -12.940952, -10.041364), (47.240902, -12.940952, -10.041364), (47.83864, -10.395584, -10.168416), (48.30525, -10.395584, -7.6507998), (47.701683, -12.940952, -7.5552044), (47.701683, -12.940952, -7.5552044), (48.30525, -10.395584, -7.6507998), (48.63946, -10.395584, -5.112213), (48.03172, -12.940952, -5.048337), (48.03172, -12.940952, -5.048337), (48.63946, -10.395584, -5.112213), (48.840355, -10.395584, -2.5596144), (48.230103, -12.940952, -2.5276325), (48.230103, -12.940952, -2.5276325), (48.840355, -10.395584, -2.5596144), (48.90738, -10.395584, 0), (48.29629, -12.940952, 0), (48.90738, -10.395584, 0), (49.38442, -7.8217235, 0), (49.31674, -7.8217235, 2.5845807), (48.840355, -10.395584, 2.5596144), (48.840355, -10.395584, 2.5596144), (49.31674, -7.8217235, 2.5845807), (49.113884, -7.8217235, 5.1620774), (48.63946, -10.395584, 5.112213), (48.63946, -10.395584, 5.112213), (49.113884, -7.8217235, 5.1620774), (48.776413, -7.8217235, 7.725425), (48.30525, -10.395584, 7.6507998), (48.30525, -10.395584, 7.6507998), (48.776413, -7.8217235, 7.725425), (48.30525, -7.8217235, 10.267597), (47.83864, -10.395584, 10.168416), (47.83864, -10.395584, 10.168416), (48.30525, -7.8217235, 10.267597), (47.701683, -7.8217235, 12.781628), (47.240902, -10.395584, 12.658161), (47.240902, -10.395584, 12.658161), (47.701683, -7.8217235, 12.781628), (46.967373, -7.8217235, 15.260624), (46.513683, -10.395584, 15.113212), (46.513683, -10.395584, 15.113212), (46.967373, -7.8217235, 15.260624), (46.104324, -7.8217235, 17.697792), (45.658974, -10.395584, 17.526838), (45.658974, -10.395584, 17.526838), (46.104324, -7.8217235, 17.697792), (45.11491, -7.8217235, 20.086452), (44.679115, -10.395584, 19.892424), (44.679115, -10.395584, 19.892424), (45.11491, -7.8217235, 20.086452), (44.00184, -7.8217235, 22.420055), (43.576794, -10.395584, 22.203485), (43.576794, -10.395584, 22.203485), (44.00184, -7.8217235, 22.420055), (42.768158, -7.8217235, 24.69221), (42.355034, -10.395584, 24.45369), (42.355034, -10.395584, 24.45369), (42.768158, -7.8217235, 24.69221), (41.417255, -7.8217235, 26.89668), (41.01718, -10.395584, 26.636868), (41.01718, -10.395584, 26.636868), (41.417255, -7.8217235, 26.89668), (39.95283, -7.8217235, 29.027431), (39.566902, -10.395584, 28.747036), (39.566902, -10.395584, 28.747036), (39.95283, -7.8217235, 29.027431), (38.3789, -7.8217235, 31.07862), (38.00817, -10.395584, 30.778412), (38.00817, -10.395584, 30.778412), (38.3789, -7.8217235, 31.07862), (36.699776, -7.8217235, 33.044624), (36.34527, -10.395584, 32.725426), (36.34527, -10.395584, 32.725426), (36.699776, -7.8217235, 33.044624), (34.920055, -7.8217235, 34.920055), (34.58274, -10.395584, 34.58274), (34.58274, -10.395584, 34.58274), (34.920055, -7.8217235, 34.920055), (33.044624, -7.8217235, 36.699776), (32.725426, -10.395584, 36.34527), (32.725426, -10.395584, 36.34527), (33.044624, -7.8217235, 36.699776), (31.07862, -7.8217235, 38.3789), (30.778412, -10.395584, 38.00817), (30.778412, -10.395584, 38.00817), (31.07862, -7.8217235, 38.3789), (29.027431, -7.8217235, 39.95283), (28.747036, -10.395584, 39.566902), (28.747036, -10.395584, 39.566902), (29.027431, -7.8217235, 39.95283), (26.89668, -7.8217235, 41.417255), (26.636868, -10.395584, 41.01718), (26.636868, -10.395584, 41.01718), (26.89668, -7.8217235, 41.417255), (24.69221, -7.8217235, 42.768158), (24.45369, -10.395584, 42.355034), (24.45369, -10.395584, 42.355034), (24.69221, -7.8217235, 42.768158), (22.420055, -7.8217235, 44.00184), (22.203485, -10.395584, 43.576794), (22.203485, -10.395584, 43.576794), (22.420055, -7.8217235, 44.00184), (20.086452, -7.8217235, 45.11491), (19.892424, -10.395584, 44.679115), (19.892424, -10.395584, 44.679115), (20.086452, -7.8217235, 45.11491), (17.697792, -7.8217235, 46.104324), (17.526838, -10.395584, 45.658974), (17.526838, -10.395584, 45.658974), (17.697792, -7.8217235, 46.104324), (15.260624, -7.8217235, 46.967373), (15.113212, -10.395584, 46.513683), (15.113212, -10.395584, 46.513683), (15.260624, -7.8217235, 46.967373), (12.781628, -7.8217235, 47.701683), (12.658161, -10.395584, 47.240902), (12.658161, -10.395584, 47.240902), (12.781628, -7.8217235, 47.701683), (10.267597, -7.8217235, 48.30525), (10.168416, -10.395584, 47.83864), (10.168416, -10.395584, 47.83864), (10.267597, -7.8217235, 48.30525), (7.725425, -7.8217235, 48.776413), (7.6507998, -10.395584, 48.30525), (7.6507998, -10.395584, 48.30525), (7.725425, -7.8217235, 48.776413), (5.1620774, -7.8217235, 49.113884), (5.112213, -10.395584, 48.63946), (5.112213, -10.395584, 48.63946), (5.1620774, -7.8217235, 49.113884), (2.5845807, -7.8217235, 49.31674), (2.5596144, -10.395584, 48.840355), (2.5596144, -10.395584, 48.840355), (2.5845807, -7.8217235, 49.31674), (3.0239235e-15, -7.8217235, 49.38442), (2.9947134e-15, -10.395584, 48.90738), (2.9947134e-15, -10.395584, 48.90738), (3.0239235e-15, -7.8217235, 49.38442), (-2.5845807, -7.8217235, 49.31674), (-2.5596144, -10.395584, 48.840355), (-2.5596144, -10.395584, 48.840355), (-2.5845807, -7.8217235, 49.31674), (-5.1620774, -7.8217235, 49.113884), (-5.112213, -10.395584, 48.63946), (-5.112213, -10.395584, 48.63946), (-5.1620774, -7.8217235, 49.113884), (-7.725425, -7.8217235, 48.776413), (-7.6507998, -10.395584, 48.30525), (-7.6507998, -10.395584, 48.30525), (-7.725425, -7.8217235, 48.776413), (-10.267597, -7.8217235, 48.30525), (-10.168416, -10.395584, 47.83864), (-10.168416, -10.395584, 47.83864), (-10.267597, -7.8217235, 48.30525), (-12.781628, -7.8217235, 47.701683), (-12.658161, -10.395584, 47.240902), (-12.658161, -10.395584, 47.240902), (-12.781628, -7.8217235, 47.701683), (-15.260624, -7.8217235, 46.967373), (-15.113212, -10.395584, 46.513683), (-15.113212, -10.395584, 46.513683), (-15.260624, -7.8217235, 46.967373), (-17.697792, -7.8217235, 46.104324), (-17.526838, -10.395584, 45.658974), (-17.526838, -10.395584, 45.658974), (-17.697792, -7.8217235, 46.104324), (-20.086452, -7.8217235, 45.11491), (-19.892424, -10.395584, 44.679115), (-19.892424, -10.395584, 44.679115), (-20.086452, -7.8217235, 45.11491), (-22.420055, -7.8217235, 44.00184), (-22.203485, -10.395584, 43.576794), (-22.203485, -10.395584, 43.576794), (-22.420055, -7.8217235, 44.00184), (-24.69221, -7.8217235, 42.768158), (-24.45369, -10.395584, 42.355034), (-24.45369, -10.395584, 42.355034), (-24.69221, -7.8217235, 42.768158), (-26.89668, -7.8217235, 41.417255), (-26.636868, -10.395584, 41.01718), (-26.636868, -10.395584, 41.01718), (-26.89668, -7.8217235, 41.417255), (-29.027431, -7.8217235, 39.95283), (-28.747036, -10.395584, 39.566902), (-28.747036, -10.395584, 39.566902), (-29.027431, -7.8217235, 39.95283), (-31.07862, -7.8217235, 38.3789), (-30.778412, -10.395584, 38.00817), (-30.778412, -10.395584, 38.00817), (-31.07862, -7.8217235, 38.3789), (-33.044624, -7.8217235, 36.699776), (-32.725426, -10.395584, 36.34527), (-32.725426, -10.395584, 36.34527), (-33.044624, -7.8217235, 36.699776), (-34.920055, -7.8217235, 34.920055), (-34.58274, -10.395584, 34.58274), (-34.58274, -10.395584, 34.58274), (-34.920055, -7.8217235, 34.920055), (-36.699776, -7.8217235, 33.044624), (-36.34527, -10.395584, 32.725426), (-36.34527, -10.395584, 32.725426), (-36.699776, -7.8217235, 33.044624), (-38.3789, -7.8217235, 31.07862), (-38.00817, -10.395584, 30.778412), (-38.00817, -10.395584, 30.778412), (-38.3789, -7.8217235, 31.07862), (-39.95283, -7.8217235, 29.027431), (-39.566902, -10.395584, 28.747036), (-39.566902, -10.395584, 28.747036), (-39.95283, -7.8217235, 29.027431), (-41.417255, -7.8217235, 26.89668), (-41.01718, -10.395584, 26.636868), (-41.01718, -10.395584, 26.636868), (-41.417255, -7.8217235, 26.89668), (-42.768158, -7.8217235, 24.69221), (-42.355034, -10.395584, 24.45369), (-42.355034, -10.395584, 24.45369), (-42.768158, -7.8217235, 24.69221), (-44.00184, -7.8217235, 22.420055), (-43.576794, -10.395584, 22.203485), (-43.576794, -10.395584, 22.203485), (-44.00184, -7.8217235, 22.420055), (-45.11491, -7.8217235, 20.086452), (-44.679115, -10.395584, 19.892424), (-44.679115, -10.395584, 19.892424), (-45.11491, -7.8217235, 20.086452), (-46.104324, -7.8217235, 17.697792), (-45.658974, -10.395584, 17.526838), (-45.658974, -10.395584, 17.526838), (-46.104324, -7.8217235, 17.697792), (-46.967373, -7.8217235, 15.260624), (-46.513683, -10.395584, 15.113212), (-46.513683, -10.395584, 15.113212), (-46.967373, -7.8217235, 15.260624), (-47.701683, -7.8217235, 12.781628), (-47.240902, -10.395584, 12.658161), (-47.240902, -10.395584, 12.658161), (-47.701683, -7.8217235, 12.781628), (-48.30525, -7.8217235, 10.267597), (-47.83864, -10.395584, 10.168416), (-47.83864, -10.395584, 10.168416), (-48.30525, -7.8217235, 10.267597), (-48.776413, -7.8217235, 7.725425), (-48.30525, -10.395584, 7.6507998), (-48.30525, -10.395584, 7.6507998), (-48.776413, -7.8217235, 7.725425), (-49.113884, -7.8217235, 5.1620774), (-48.63946, -10.395584, 5.112213), (-48.63946, -10.395584, 5.112213), (-49.113884, -7.8217235, 5.1620774), (-49.31674, -7.8217235, 2.5845807), (-48.840355, -10.395584, 2.5596144), (-48.840355, -10.395584, 2.5596144), (-49.31674, -7.8217235, 2.5845807), (-49.38442, -7.8217235, 6.047847e-15), (-48.90738, -10.395584, 5.9894267e-15), (-48.90738, -10.395584, 5.9894267e-15), (-49.38442, -7.8217235, 6.047847e-15), (-49.31674, -7.8217235, -2.5845807), (-48.840355, -10.395584, -2.5596144), (-48.840355, -10.395584, -2.5596144), (-49.31674, -7.8217235, -2.5845807), (-49.113884, -7.8217235, -5.1620774), (-48.63946, -10.395584, -5.112213), (-48.63946, -10.395584, -5.112213), (-49.113884, -7.8217235, -5.1620774), (-48.776413, -7.8217235, -7.725425), (-48.30525, -10.395584, -7.6507998), (-48.30525, -10.395584, -7.6507998), (-48.776413, -7.8217235, -7.725425), (-48.30525, -7.8217235, -10.267597), (-47.83864, -10.395584, -10.168416), (-47.83864, -10.395584, -10.168416), (-48.30525, -7.8217235, -10.267597), (-47.701683, -7.8217235, -12.781628), (-47.240902, -10.395584, -12.658161), (-47.240902, -10.395584, -12.658161), (-47.701683, -7.8217235, -12.781628), (-46.967373, -7.8217235, -15.260624), (-46.513683, -10.395584, -15.113212), (-46.513683, -10.395584, -15.113212), (-46.967373, -7.8217235, -15.260624), (-46.104324, -7.8217235, -17.697792), (-45.658974, -10.395584, -17.526838), (-45.658974, -10.395584, -17.526838), (-46.104324, -7.8217235, -17.697792), (-45.11491, -7.8217235, -20.086452), (-44.679115, -10.395584, -19.892424), (-44.679115, -10.395584, -19.892424), (-45.11491, -7.8217235, -20.086452), (-44.00184, -7.8217235, -22.420055), (-43.576794, -10.395584, -22.203485), (-43.576794, -10.395584, -22.203485), (-44.00184, -7.8217235, -22.420055), (-42.768158, -7.8217235, -24.69221), (-42.355034, -10.395584, -24.45369), (-42.355034, -10.395584, -24.45369), (-42.768158, -7.8217235, -24.69221), (-41.417255, -7.8217235, -26.89668), (-41.01718, -10.395584, -26.636868), (-41.01718, -10.395584, -26.636868), (-41.417255, -7.8217235, -26.89668), (-39.95283, -7.8217235, -29.027431), (-39.566902, -10.395584, -28.747036), (-39.566902, -10.395584, -28.747036), (-39.95283, -7.8217235, -29.027431), (-38.3789, -7.8217235, -31.07862), (-38.00817, -10.395584, -30.778412), (-38.00817, -10.395584, -30.778412), (-38.3789, -7.8217235, -31.07862), (-36.699776, -7.8217235, -33.044624), (-36.34527, -10.395584, -32.725426), (-36.34527, -10.395584, -32.725426), (-36.699776, -7.8217235, -33.044624), (-34.920055, -7.8217235, -34.920055), (-34.58274, -10.395584, -34.58274), (-34.58274, -10.395584, -34.58274), (-34.920055, -7.8217235, -34.920055), (-33.044624, -7.8217235, -36.699776), (-32.725426, -10.395584, -36.34527), (-32.725426, -10.395584, -36.34527), (-33.044624, -7.8217235, -36.699776), (-31.07862, -7.8217235, -38.3789), (-30.778412, -10.395584, -38.00817), (-30.778412, -10.395584, -38.00817), (-31.07862, -7.8217235, -38.3789), (-29.027431, -7.8217235, -39.95283), (-28.747036, -10.395584, -39.566902), (-28.747036, -10.395584, -39.566902), (-29.027431, -7.8217235, -39.95283), (-26.89668, -7.8217235, -41.417255), (-26.636868, -10.395584, -41.01718), (-26.636868, -10.395584, -41.01718), (-26.89668, -7.8217235, -41.417255), (-24.69221, -7.8217235, -42.768158), (-24.45369, -10.395584, -42.355034), (-24.45369, -10.395584, -42.355034), (-24.69221, -7.8217235, -42.768158), (-22.420055, -7.8217235, -44.00184), (-22.203485, -10.395584, -43.576794), (-22.203485, -10.395584, -43.576794), (-22.420055, -7.8217235, -44.00184), (-20.086452, -7.8217235, -45.11491), (-19.892424, -10.395584, -44.679115), (-19.892424, -10.395584, -44.679115), (-20.086452, -7.8217235, -45.11491), (-17.697792, -7.8217235, -46.104324), (-17.526838, -10.395584, -45.658974), (-17.526838, -10.395584, -45.658974), (-17.697792, -7.8217235, -46.104324), (-15.260624, -7.8217235, -46.967373), (-15.113212, -10.395584, -46.513683), (-15.113212, -10.395584, -46.513683), (-15.260624, -7.8217235, -46.967373), (-12.781628, -7.8217235, -47.701683), (-12.658161, -10.395584, -47.240902), (-12.658161, -10.395584, -47.240902), (-12.781628, -7.8217235, -47.701683), (-10.267597, -7.8217235, -48.30525), (-10.168416, -10.395584, -47.83864), (-10.168416, -10.395584, -47.83864), (-10.267597, -7.8217235, -48.30525), (-7.725425, -7.8217235, -48.776413), (-7.6507998, -10.395584, -48.30525), (-7.6507998, -10.395584, -48.30525), (-7.725425, -7.8217235, -48.776413), (-5.1620774, -7.8217235, -49.113884), (-5.112213, -10.395584, -48.63946), (-5.112213, -10.395584, -48.63946), (-5.1620774, -7.8217235, -49.113884), (-2.5845807, -7.8217235, -49.31674), (-2.5596144, -10.395584, -48.840355), (-2.5596144, -10.395584, -48.840355), (-2.5845807, -7.8217235, -49.31674), (-9.07177e-15, -7.8217235, -49.38442), (-8.98414e-15, -10.395584, -48.90738), (-8.98414e-15, -10.395584, -48.90738), (-9.07177e-15, -7.8217235, -49.38442), (2.5845807, -7.8217235, -49.31674), (2.5596144, -10.395584, -48.840355), (2.5596144, -10.395584, -48.840355), (2.5845807, -7.8217235, -49.31674), (5.1620774, -7.8217235, -49.113884), (5.112213, -10.395584, -48.63946), (5.112213, -10.395584, -48.63946), (5.1620774, -7.8217235, -49.113884), (7.725425, -7.8217235, -48.776413), (7.6507998, -10.395584, -48.30525), (7.6507998, -10.395584, -48.30525), (7.725425, -7.8217235, -48.776413), (10.267597, -7.8217235, -48.30525), (10.168416, -10.395584, -47.83864), (10.168416, -10.395584, -47.83864), (10.267597, -7.8217235, -48.30525), (12.781628, -7.8217235, -47.701683), (12.658161, -10.395584, -47.240902), (12.658161, -10.395584, -47.240902), (12.781628, -7.8217235, -47.701683), (15.260624, -7.8217235, -46.967373), (15.113212, -10.395584, -46.513683), (15.113212, -10.395584, -46.513683), (15.260624, -7.8217235, -46.967373), (17.697792, -7.8217235, -46.104324), (17.526838, -10.395584, -45.658974), (17.526838, -10.395584, -45.658974), (17.697792, -7.8217235, -46.104324), (20.086452, -7.8217235, -45.11491), (19.892424, -10.395584, -44.679115), (19.892424, -10.395584, -44.679115), (20.086452, -7.8217235, -45.11491), (22.420055, -7.8217235, -44.00184), (22.203485, -10.395584, -43.576794), (22.203485, -10.395584, -43.576794), (22.420055, -7.8217235, -44.00184), (24.69221, -7.8217235, -42.768158), (24.45369, -10.395584, -42.355034), (24.45369, -10.395584, -42.355034), (24.69221, -7.8217235, -42.768158), (26.89668, -7.8217235, -41.417255), (26.636868, -10.395584, -41.01718), (26.636868, -10.395584, -41.01718), (26.89668, -7.8217235, -41.417255), (29.027431, -7.8217235, -39.95283), (28.747036, -10.395584, -39.566902), (28.747036, -10.395584, -39.566902), (29.027431, -7.8217235, -39.95283), (31.07862, -7.8217235, -38.3789), (30.778412, -10.395584, -38.00817), (30.778412, -10.395584, -38.00817), (31.07862, -7.8217235, -38.3789), (33.044624, -7.8217235, -36.699776), (32.725426, -10.395584, -36.34527), (32.725426, -10.395584, -36.34527), (33.044624, -7.8217235, -36.699776), (34.920055, -7.8217235, -34.920055), (34.58274, -10.395584, -34.58274), (34.58274, -10.395584, -34.58274), (34.920055, -7.8217235, -34.920055), (36.699776, -7.8217235, -33.044624), (36.34527, -10.395584, -32.725426), (36.34527, -10.395584, -32.725426), (36.699776, -7.8217235, -33.044624), (38.3789, -7.8217235, -31.07862), (38.00817, -10.395584, -30.778412), (38.00817, -10.395584, -30.778412), (38.3789, -7.8217235, -31.07862), (39.95283, -7.8217235, -29.027431), (39.566902, -10.395584, -28.747036), (39.566902, -10.395584, -28.747036), (39.95283, -7.8217235, -29.027431), (41.417255, -7.8217235, -26.89668), (41.01718, -10.395584, -26.636868), (41.01718, -10.395584, -26.636868), (41.417255, -7.8217235, -26.89668), (42.768158, -7.8217235, -24.69221), (42.355034, -10.395584, -24.45369), (42.355034, -10.395584, -24.45369), (42.768158, -7.8217235, -24.69221), (44.00184, -7.8217235, -22.420055), (43.576794, -10.395584, -22.203485), (43.576794, -10.395584, -22.203485), (44.00184, -7.8217235, -22.420055), (45.11491, -7.8217235, -20.086452), (44.679115, -10.395584, -19.892424), (44.679115, -10.395584, -19.892424), (45.11491, -7.8217235, -20.086452), (46.104324, -7.8217235, -17.697792), (45.658974, -10.395584, -17.526838), (45.658974, -10.395584, -17.526838), (46.104324, -7.8217235, -17.697792), (46.967373, -7.8217235, -15.260624), (46.513683, -10.395584, -15.113212), (46.513683, -10.395584, -15.113212), (46.967373, -7.8217235, -15.260624), (47.701683, -7.8217235, -12.781628), (47.240902, -10.395584, -12.658161), (47.240902, -10.395584, -12.658161), (47.701683, -7.8217235, -12.781628), (48.30525, -7.8217235, -10.267597), (47.83864, -10.395584, -10.168416), (47.83864, -10.395584, -10.168416), (48.30525, -7.8217235, -10.267597), (48.776413, -7.8217235, -7.725425), (48.30525, -10.395584, -7.6507998), (48.30525, -10.395584, -7.6507998), (48.776413, -7.8217235, -7.725425), (49.113884, -7.8217235, -5.1620774), (48.63946, -10.395584, -5.112213), (48.63946, -10.395584, -5.112213), (49.113884, -7.8217235, -5.1620774), (49.31674, -7.8217235, -2.5845807), (48.840355, -10.395584, -2.5596144), (48.840355, -10.395584, -2.5596144), (49.31674, -7.8217235, -2.5845807), (49.38442, -7.8217235, 0), (48.90738, -10.395584, 0), (49.38442, -7.8217235, 0), (49.726093, -5.2264233, 0), (49.657948, -5.2264233, 2.6024628), (49.31674, -7.8217235, 2.5845807), (49.31674, -7.8217235, 2.5845807), (49.657948, -5.2264233, 2.6024628), (49.45369, -5.2264233, 5.197792), (49.113884, -7.8217235, 5.1620774), (49.113884, -7.8217235, 5.1620774), (49.45369, -5.2264233, 5.197792), (49.113884, -5.2264233, 7.778875), (48.776413, -7.8217235, 7.725425), (48.776413, -7.8217235, 7.725425), (49.113884, -5.2264233, 7.778875), (48.63946, -5.2264233, 10.338636), (48.30525, -7.8217235, 10.267597), (48.30525, -7.8217235, 10.267597), (48.63946, -5.2264233, 10.338636), (48.03172, -5.2264233, 12.87006), (47.701683, -7.8217235, 12.781628), (47.701683, -7.8217235, 12.781628), (48.03172, -5.2264233, 12.87006), (47.292328, -5.2264233, 15.366208), (46.967373, -7.8217235, 15.260624), (46.967373, -7.8217235, 15.260624), (47.292328, -5.2264233, 15.366208), (46.42331, -5.2264233, 17.820238), (46.104324, -7.8217235, 17.697792), (46.104324, -7.8217235, 17.697792), (46.42331, -5.2264233, 17.820238), (45.427048, -5.2264233, 20.225426), (45.11491, -7.8217235, 20.086452), (45.11491, -7.8217235, 20.086452), (45.427048, -5.2264233, 20.225426), (44.306274, -5.2264233, 22.575174), (44.00184, -7.8217235, 22.420055), (44.00184, -7.8217235, 22.420055), (44.306274, -5.2264233, 22.575174), (43.06406, -5.2264233, 24.863047), (42.768158, -7.8217235, 24.69221), (42.768158, -7.8217235, 24.69221), (43.06406, -5.2264233, 24.863047), (41.70381, -5.2264233, 27.082773), (41.417255, -7.8217235, 26.89668), (41.417255, -7.8217235, 26.89668), (41.70381, -5.2264233, 27.082773), (40.229256, -5.2264233, 29.228266), (39.95283, -7.8217235, 29.027431), (39.95283, -7.8217235, 29.027431), (40.229256, -5.2264233, 29.228266), (38.644432, -5.2264233, 31.293646), (38.3789, -7.8217235, 31.07862), (38.3789, -7.8217235, 31.07862), (38.644432, -5.2264233, 31.293646), (36.95369, -5.2264233, 33.27325), (36.699776, -7.8217235, 33.044624), (36.699776, -7.8217235, 33.044624), (36.95369, -5.2264233, 33.27325), (35.16166, -5.2264233, 35.16166), (34.920055, -7.8217235, 34.920055), (34.920055, -7.8217235, 34.920055), (35.16166, -5.2264233, 35.16166), (33.27325, -5.2264233, 36.95369), (33.044624, -7.8217235, 36.699776), (33.044624, -7.8217235, 36.699776), (33.27325, -5.2264233, 36.95369), (31.293646, -5.2264233, 38.644432), (31.07862, -7.8217235, 38.3789), (31.07862, -7.8217235, 38.3789), (31.293646, -5.2264233, 38.644432), (29.228266, -5.2264233, 40.229256), (29.027431, -7.8217235, 39.95283), (29.027431, -7.8217235, 39.95283), (29.228266, -5.2264233, 40.229256), (27.082773, -5.2264233, 41.70381), (26.89668, -7.8217235, 41.417255), (26.89668, -7.8217235, 41.417255), (27.082773, -5.2264233, 41.70381), (24.863047, -5.2264233, 43.06406), (24.69221, -7.8217235, 42.768158), (24.69221, -7.8217235, 42.768158), (24.863047, -5.2264233, 43.06406), (22.575174, -5.2264233, 44.306274), (22.420055, -7.8217235, 44.00184), (22.420055, -7.8217235, 44.00184), (22.575174, -5.2264233, 44.306274), (20.225426, -5.2264233, 45.427048), (20.086452, -7.8217235, 45.11491), (20.086452, -7.8217235, 45.11491), (20.225426, -5.2264233, 45.427048), (17.820238, -5.2264233, 46.42331), (17.697792, -7.8217235, 46.104324), (17.697792, -7.8217235, 46.104324), (17.820238, -5.2264233, 46.42331), (15.366208, -5.2264233, 47.292328), (15.260624, -7.8217235, 46.967373), (15.260624, -7.8217235, 46.967373), (15.366208, -5.2264233, 47.292328), (12.87006, -5.2264233, 48.03172), (12.781628, -7.8217235, 47.701683), (12.781628, -7.8217235, 47.701683), (12.87006, -5.2264233, 48.03172), (10.338636, -5.2264233, 48.63946), (10.267597, -7.8217235, 48.30525), (10.267597, -7.8217235, 48.30525), (10.338636, -5.2264233, 48.63946), (7.778875, -5.2264233, 49.113884), (7.725425, -7.8217235, 48.776413), (7.725425, -7.8217235, 48.776413), (7.778875, -5.2264233, 49.113884), (5.197792, -5.2264233, 49.45369), (5.1620774, -7.8217235, 49.113884), (5.1620774, -7.8217235, 49.113884), (5.197792, -5.2264233, 49.45369), (2.6024628, -5.2264233, 49.657948), (2.5845807, -7.8217235, 49.31674), (2.5845807, -7.8217235, 49.31674), (2.6024628, -5.2264233, 49.657948), (3.0448452e-15, -5.2264233, 49.726093), (3.0239235e-15, -7.8217235, 49.38442), (3.0239235e-15, -7.8217235, 49.38442), (3.0448452e-15, -5.2264233, 49.726093), (-2.6024628, -5.2264233, 49.657948), (-2.5845807, -7.8217235, 49.31674), (-2.5845807, -7.8217235, 49.31674), (-2.6024628, -5.2264233, 49.657948), (-5.197792, -5.2264233, 49.45369), (-5.1620774, -7.8217235, 49.113884), (-5.1620774, -7.8217235, 49.113884), (-5.197792, -5.2264233, 49.45369), (-7.778875, -5.2264233, 49.113884), (-7.725425, -7.8217235, 48.776413), (-7.725425, -7.8217235, 48.776413), (-7.778875, -5.2264233, 49.113884), (-10.338636, -5.2264233, 48.63946), (-10.267597, -7.8217235, 48.30525), (-10.267597, -7.8217235, 48.30525), (-10.338636, -5.2264233, 48.63946), (-12.87006, -5.2264233, 48.03172), (-12.781628, -7.8217235, 47.701683), (-12.781628, -7.8217235, 47.701683), (-12.87006, -5.2264233, 48.03172), (-15.366208, -5.2264233, 47.292328), (-15.260624, -7.8217235, 46.967373), (-15.260624, -7.8217235, 46.967373), (-15.366208, -5.2264233, 47.292328), (-17.820238, -5.2264233, 46.42331), (-17.697792, -7.8217235, 46.104324), (-17.697792, -7.8217235, 46.104324), (-17.820238, -5.2264233, 46.42331), (-20.225426, -5.2264233, 45.427048), (-20.086452, -7.8217235, 45.11491), (-20.086452, -7.8217235, 45.11491), (-20.225426, -5.2264233, 45.427048), (-22.575174, -5.2264233, 44.306274), (-22.420055, -7.8217235, 44.00184), (-22.420055, -7.8217235, 44.00184), (-22.575174, -5.2264233, 44.306274), (-24.863047, -5.2264233, 43.06406), (-24.69221, -7.8217235, 42.768158), (-24.69221, -7.8217235, 42.768158), (-24.863047, -5.2264233, 43.06406), (-27.082773, -5.2264233, 41.70381), (-26.89668, -7.8217235, 41.417255), (-26.89668, -7.8217235, 41.417255), (-27.082773, -5.2264233, 41.70381), (-29.228266, -5.2264233, 40.229256), (-29.027431, -7.8217235, 39.95283), (-29.027431, -7.8217235, 39.95283), (-29.228266, -5.2264233, 40.229256), (-31.293646, -5.2264233, 38.644432), (-31.07862, -7.8217235, 38.3789), (-31.07862, -7.8217235, 38.3789), (-31.293646, -5.2264233, 38.644432), (-33.27325, -5.2264233, 36.95369), (-33.044624, -7.8217235, 36.699776), (-33.044624, -7.8217235, 36.699776), (-33.27325, -5.2264233, 36.95369), (-35.16166, -5.2264233, 35.16166), (-34.920055, -7.8217235, 34.920055), (-34.920055, -7.8217235, 34.920055), (-35.16166, -5.2264233, 35.16166), (-36.95369, -5.2264233, 33.27325), (-36.699776, -7.8217235, 33.044624), (-36.699776, -7.8217235, 33.044624), (-36.95369, -5.2264233, 33.27325), (-38.644432, -5.2264233, 31.293646), (-38.3789, -7.8217235, 31.07862), (-38.3789, -7.8217235, 31.07862), (-38.644432, -5.2264233, 31.293646), (-40.229256, -5.2264233, 29.228266), (-39.95283, -7.8217235, 29.027431), (-39.95283, -7.8217235, 29.027431), (-40.229256, -5.2264233, 29.228266), (-41.70381, -5.2264233, 27.082773), (-41.417255, -7.8217235, 26.89668), (-41.417255, -7.8217235, 26.89668), (-41.70381, -5.2264233, 27.082773), (-43.06406, -5.2264233, 24.863047), (-42.768158, -7.8217235, 24.69221), (-42.768158, -7.8217235, 24.69221), (-43.06406, -5.2264233, 24.863047), (-44.306274, -5.2264233, 22.575174), (-44.00184, -7.8217235, 22.420055), (-44.00184, -7.8217235, 22.420055), (-44.306274, -5.2264233, 22.575174), (-45.427048, -5.2264233, 20.225426), (-45.11491, -7.8217235, 20.086452), (-45.11491, -7.8217235, 20.086452), (-45.427048, -5.2264233, 20.225426), (-46.42331, -5.2264233, 17.820238), (-46.104324, -7.8217235, 17.697792), (-46.104324, -7.8217235, 17.697792), (-46.42331, -5.2264233, 17.820238), (-47.292328, -5.2264233, 15.366208), (-46.967373, -7.8217235, 15.260624), (-46.967373, -7.8217235, 15.260624), (-47.292328, -5.2264233, 15.366208), (-48.03172, -5.2264233, 12.87006), (-47.701683, -7.8217235, 12.781628), (-47.701683, -7.8217235, 12.781628), (-48.03172, -5.2264233, 12.87006), (-48.63946, -5.2264233, 10.338636), (-48.30525, -7.8217235, 10.267597), (-48.30525, -7.8217235, 10.267597), (-48.63946, -5.2264233, 10.338636), (-49.113884, -5.2264233, 7.778875), (-48.776413, -7.8217235, 7.725425), (-48.776413, -7.8217235, 7.725425), (-49.113884, -5.2264233, 7.778875), (-49.45369, -5.2264233, 5.197792), (-49.113884, -7.8217235, 5.1620774), (-49.113884, -7.8217235, 5.1620774), (-49.45369, -5.2264233, 5.197792), (-49.657948, -5.2264233, 2.6024628), (-49.31674, -7.8217235, 2.5845807), (-49.31674, -7.8217235, 2.5845807), (-49.657948, -5.2264233, 2.6024628), (-49.726093, -5.2264233, 6.0896904e-15), (-49.38442, -7.8217235, 6.047847e-15), (-49.38442, -7.8217235, 6.047847e-15), (-49.726093, -5.2264233, 6.0896904e-15), (-49.657948, -5.2264233, -2.6024628), (-49.31674, -7.8217235, -2.5845807), (-49.31674, -7.8217235, -2.5845807), (-49.657948, -5.2264233, -2.6024628), (-49.45369, -5.2264233, -5.197792), (-49.113884, -7.8217235, -5.1620774), (-49.113884, -7.8217235, -5.1620774), (-49.45369, -5.2264233, -5.197792), (-49.113884, -5.2264233, -7.778875), (-48.776413, -7.8217235, -7.725425), (-48.776413, -7.8217235, -7.725425), (-49.113884, -5.2264233, -7.778875), (-48.63946, -5.2264233, -10.338636), (-48.30525, -7.8217235, -10.267597), (-48.30525, -7.8217235, -10.267597), (-48.63946, -5.2264233, -10.338636), (-48.03172, -5.2264233, -12.87006), (-47.701683, -7.8217235, -12.781628), (-47.701683, -7.8217235, -12.781628), (-48.03172, -5.2264233, -12.87006), (-47.292328, -5.2264233, -15.366208), (-46.967373, -7.8217235, -15.260624), (-46.967373, -7.8217235, -15.260624), (-47.292328, -5.2264233, -15.366208), (-46.42331, -5.2264233, -17.820238), (-46.104324, -7.8217235, -17.697792), (-46.104324, -7.8217235, -17.697792), (-46.42331, -5.2264233, -17.820238), (-45.427048, -5.2264233, -20.225426), (-45.11491, -7.8217235, -20.086452), (-45.11491, -7.8217235, -20.086452), (-45.427048, -5.2264233, -20.225426), (-44.306274, -5.2264233, -22.575174), (-44.00184, -7.8217235, -22.420055), (-44.00184, -7.8217235, -22.420055), (-44.306274, -5.2264233, -22.575174), (-43.06406, -5.2264233, -24.863047), (-42.768158, -7.8217235, -24.69221), (-42.768158, -7.8217235, -24.69221), (-43.06406, -5.2264233, -24.863047), (-41.70381, -5.2264233, -27.082773), (-41.417255, -7.8217235, -26.89668), (-41.417255, -7.8217235, -26.89668), (-41.70381, -5.2264233, -27.082773), (-40.229256, -5.2264233, -29.228266), (-39.95283, -7.8217235, -29.027431), (-39.95283, -7.8217235, -29.027431), (-40.229256, -5.2264233, -29.228266), (-38.644432, -5.2264233, -31.293646), (-38.3789, -7.8217235, -31.07862), (-38.3789, -7.8217235, -31.07862), (-38.644432, -5.2264233, -31.293646), (-36.95369, -5.2264233, -33.27325), (-36.699776, -7.8217235, -33.044624), (-36.699776, -7.8217235, -33.044624), (-36.95369, -5.2264233, -33.27325), (-35.16166, -5.2264233, -35.16166), (-34.920055, -7.8217235, -34.920055), (-34.920055, -7.8217235, -34.920055), (-35.16166, -5.2264233, -35.16166), (-33.27325, -5.2264233, -36.95369), (-33.044624, -7.8217235, -36.699776), (-33.044624, -7.8217235, -36.699776), (-33.27325, -5.2264233, -36.95369), (-31.293646, -5.2264233, -38.644432), (-31.07862, -7.8217235, -38.3789), (-31.07862, -7.8217235, -38.3789), (-31.293646, -5.2264233, -38.644432), (-29.228266, -5.2264233, -40.229256), (-29.027431, -7.8217235, -39.95283), (-29.027431, -7.8217235, -39.95283), (-29.228266, -5.2264233, -40.229256), (-27.082773, -5.2264233, -41.70381), (-26.89668, -7.8217235, -41.417255), (-26.89668, -7.8217235, -41.417255), (-27.082773, -5.2264233, -41.70381), (-24.863047, -5.2264233, -43.06406), (-24.69221, -7.8217235, -42.768158), (-24.69221, -7.8217235, -42.768158), (-24.863047, -5.2264233, -43.06406), (-22.575174, -5.2264233, -44.306274), (-22.420055, -7.8217235, -44.00184), (-22.420055, -7.8217235, -44.00184), (-22.575174, -5.2264233, -44.306274), (-20.225426, -5.2264233, -45.427048), (-20.086452, -7.8217235, -45.11491), (-20.086452, -7.8217235, -45.11491), (-20.225426, -5.2264233, -45.427048), (-17.820238, -5.2264233, -46.42331), (-17.697792, -7.8217235, -46.104324), (-17.697792, -7.8217235, -46.104324), (-17.820238, -5.2264233, -46.42331), (-15.366208, -5.2264233, -47.292328), (-15.260624, -7.8217235, -46.967373), (-15.260624, -7.8217235, -46.967373), (-15.366208, -5.2264233, -47.292328), (-12.87006, -5.2264233, -48.03172), (-12.781628, -7.8217235, -47.701683), (-12.781628, -7.8217235, -47.701683), (-12.87006, -5.2264233, -48.03172), (-10.338636, -5.2264233, -48.63946), (-10.267597, -7.8217235, -48.30525), (-10.267597, -7.8217235, -48.30525), (-10.338636, -5.2264233, -48.63946), (-7.778875, -5.2264233, -49.113884), (-7.725425, -7.8217235, -48.776413), (-7.725425, -7.8217235, -48.776413), (-7.778875, -5.2264233, -49.113884), (-5.197792, -5.2264233, -49.45369), (-5.1620774, -7.8217235, -49.113884), (-5.1620774, -7.8217235, -49.113884), (-5.197792, -5.2264233, -49.45369), (-2.6024628, -5.2264233, -49.657948), (-2.5845807, -7.8217235, -49.31674), (-2.5845807, -7.8217235, -49.31674), (-2.6024628, -5.2264233, -49.657948), (-9.1345354e-15, -5.2264233, -49.726093), (-9.07177e-15, -7.8217235, -49.38442), (-9.07177e-15, -7.8217235, -49.38442), (-9.1345354e-15, -5.2264233, -49.726093), (2.6024628, -5.2264233, -49.657948), (2.5845807, -7.8217235, -49.31674), (2.5845807, -7.8217235, -49.31674), (2.6024628, -5.2264233, -49.657948), (5.197792, -5.2264233, -49.45369), (5.1620774, -7.8217235, -49.113884), (5.1620774, -7.8217235, -49.113884), (5.197792, -5.2264233, -49.45369), (7.778875, -5.2264233, -49.113884), (7.725425, -7.8217235, -48.776413), (7.725425, -7.8217235, -48.776413), (7.778875, -5.2264233, -49.113884), (10.338636, -5.2264233, -48.63946), (10.267597, -7.8217235, -48.30525), (10.267597, -7.8217235, -48.30525), (10.338636, -5.2264233, -48.63946), (12.87006, -5.2264233, -48.03172), (12.781628, -7.8217235, -47.701683), (12.781628, -7.8217235, -47.701683), (12.87006, -5.2264233, -48.03172), (15.366208, -5.2264233, -47.292328), (15.260624, -7.8217235, -46.967373), (15.260624, -7.8217235, -46.967373), (15.366208, -5.2264233, -47.292328), (17.820238, -5.2264233, -46.42331), (17.697792, -7.8217235, -46.104324), (17.697792, -7.8217235, -46.104324), (17.820238, -5.2264233, -46.42331), (20.225426, -5.2264233, -45.427048), (20.086452, -7.8217235, -45.11491), (20.086452, -7.8217235, -45.11491), (20.225426, -5.2264233, -45.427048), (22.575174, -5.2264233, -44.306274), (22.420055, -7.8217235, -44.00184), (22.420055, -7.8217235, -44.00184), (22.575174, -5.2264233, -44.306274), (24.863047, -5.2264233, -43.06406), (24.69221, -7.8217235, -42.768158), (24.69221, -7.8217235, -42.768158), (24.863047, -5.2264233, -43.06406), (27.082773, -5.2264233, -41.70381), (26.89668, -7.8217235, -41.417255), (26.89668, -7.8217235, -41.417255), (27.082773, -5.2264233, -41.70381), (29.228266, -5.2264233, -40.229256), (29.027431, -7.8217235, -39.95283), (29.027431, -7.8217235, -39.95283), (29.228266, -5.2264233, -40.229256), (31.293646, -5.2264233, -38.644432), (31.07862, -7.8217235, -38.3789), (31.07862, -7.8217235, -38.3789), (31.293646, -5.2264233, -38.644432), (33.27325, -5.2264233, -36.95369), (33.044624, -7.8217235, -36.699776), (33.044624, -7.8217235, -36.699776), (33.27325, -5.2264233, -36.95369), (35.16166, -5.2264233, -35.16166), (34.920055, -7.8217235, -34.920055), (34.920055, -7.8217235, -34.920055), (35.16166, -5.2264233, -35.16166), (36.95369, -5.2264233, -33.27325), (36.699776, -7.8217235, -33.044624), (36.699776, -7.8217235, -33.044624), (36.95369, -5.2264233, -33.27325), (38.644432, -5.2264233, -31.293646), (38.3789, -7.8217235, -31.07862), (38.3789, -7.8217235, -31.07862), (38.644432, -5.2264233, -31.293646), (40.229256, -5.2264233, -29.228266), (39.95283, -7.8217235, -29.027431), (39.95283, -7.8217235, -29.027431), (40.229256, -5.2264233, -29.228266), (41.70381, -5.2264233, -27.082773), (41.417255, -7.8217235, -26.89668), (41.417255, -7.8217235, -26.89668), (41.70381, -5.2264233, -27.082773), (43.06406, -5.2264233, -24.863047), (42.768158, -7.8217235, -24.69221), (42.768158, -7.8217235, -24.69221), (43.06406, -5.2264233, -24.863047), (44.306274, -5.2264233, -22.575174), (44.00184, -7.8217235, -22.420055), (44.00184, -7.8217235, -22.420055), (44.306274, -5.2264233, -22.575174), (45.427048, -5.2264233, -20.225426), (45.11491, -7.8217235, -20.086452), (45.11491, -7.8217235, -20.086452), (45.427048, -5.2264233, -20.225426), (46.42331, -5.2264233, -17.820238), (46.104324, -7.8217235, -17.697792), (46.104324, -7.8217235, -17.697792), (46.42331, -5.2264233, -17.820238), (47.292328, -5.2264233, -15.366208), (46.967373, -7.8217235, -15.260624), (46.967373, -7.8217235, -15.260624), (47.292328, -5.2264233, -15.366208), (48.03172, -5.2264233, -12.87006), (47.701683, -7.8217235, -12.781628), (47.701683, -7.8217235, -12.781628), (48.03172, -5.2264233, -12.87006), (48.63946, -5.2264233, -10.338636), (48.30525, -7.8217235, -10.267597), (48.30525, -7.8217235, -10.267597), (48.63946, -5.2264233, -10.338636), (49.113884, -5.2264233, -7.778875), (48.776413, -7.8217235, -7.725425), (48.776413, -7.8217235, -7.725425), (49.113884, -5.2264233, -7.778875), (49.45369, -5.2264233, -5.197792), (49.113884, -7.8217235, -5.1620774), (49.113884, -7.8217235, -5.1620774), (49.45369, -5.2264233, -5.197792), (49.657948, -5.2264233, -2.6024628), (49.31674, -7.8217235, -2.5845807), (49.31674, -7.8217235, -2.5845807), (49.657948, -5.2264233, -2.6024628), (49.726093, -5.2264233, 0), (49.38442, -7.8217235, 0), (49.726093, -5.2264233, 0), (49.931477, -2.616798, 0), (49.86305, -2.616798, 2.6132116), (49.657948, -5.2264233, 2.6024628), (49.657948, -5.2264233, 2.6024628), (49.86305, -2.616798, 2.6132116), (49.657948, -2.616798, 5.2192607), (49.45369, -5.2264233, 5.197792), (49.45369, -5.2264233, 5.197792), (49.657948, -2.616798, 5.2192607), (49.31674, -2.616798, 7.8110037), (49.113884, -5.2264233, 7.778875), (49.113884, -5.2264233, 7.778875), (49.31674, -2.616798, 7.8110037), (48.840355, -2.616798, 10.381338), (48.63946, -5.2264233, 10.338636), (48.63946, -5.2264233, 10.338636), (48.840355, -2.616798, 10.381338), (48.230103, -2.616798, 12.923217), (48.03172, -5.2264233, 12.87006), (48.03172, -5.2264233, 12.87006), (48.230103, -2.616798, 12.923217), (47.487656, -2.616798, 15.429675), (47.292328, -5.2264233, 15.366208), (47.292328, -5.2264233, 15.366208), (47.487656, -2.616798, 15.429675), (46.615047, -2.616798, 17.89384), (46.42331, -5.2264233, 17.820238), (46.42331, -5.2264233, 17.820238), (46.615047, -2.616798, 17.89384), (45.614674, -2.616798, 20.308962), (45.427048, -5.2264233, 20.225426), (45.427048, -5.2264233, 20.225426), (45.614674, -2.616798, 20.308962), (44.489273, -2.616798, 22.668417), (44.306274, -5.2264233, 22.575174), (44.306274, -5.2264233, 22.575174), (44.489273, -2.616798, 22.668417), (43.24193, -2.616798, 24.965738), (43.06406, -5.2264233, 24.863047), (43.06406, -5.2264233, 24.863047), (43.24193, -2.616798, 24.965738), (41.87606, -2.616798, 27.194632), (41.70381, -5.2264233, 27.082773), (41.70381, -5.2264233, 27.082773), (41.87606, -2.616798, 27.194632), (40.395412, -2.616798, 29.348986), (40.229256, -5.2264233, 29.228266), (40.229256, -5.2264233, 29.228266), (40.395412, -2.616798, 29.348986), (38.804047, -2.616798, 31.422897), (38.644432, -5.2264233, 31.293646), (38.644432, -5.2264233, 31.293646), (38.804047, -2.616798, 31.422897), (37.10632, -2.616798, 33.41068), (36.95369, -5.2264233, 33.27325), (36.95369, -5.2264233, 33.27325), (37.10632, -2.616798, 33.41068), (35.306885, -2.616798, 35.306885), (35.16166, -5.2264233, 35.16166), (35.16166, -5.2264233, 35.16166), (35.306885, -2.616798, 35.306885), (33.41068, -2.616798, 37.10632), (33.27325, -5.2264233, 36.95369), (33.27325, -5.2264233, 36.95369), (33.41068, -2.616798, 37.10632), (31.422897, -2.616798, 38.804047), (31.293646, -5.2264233, 38.644432), (31.293646, -5.2264233, 38.644432), (31.422897, -2.616798, 38.804047), (29.348986, -2.616798, 40.395412), (29.228266, -5.2264233, 40.229256), (29.228266, -5.2264233, 40.229256), (29.348986, -2.616798, 40.395412), (27.194632, -2.616798, 41.87606), (27.082773, -5.2264233, 41.70381), (27.082773, -5.2264233, 41.70381), (27.194632, -2.616798, 41.87606), (24.965738, -2.616798, 43.24193), (24.863047, -5.2264233, 43.06406), (24.863047, -5.2264233, 43.06406), (24.965738, -2.616798, 43.24193), (22.668417, -2.616798, 44.489273), (22.575174, -5.2264233, 44.306274), (22.575174, -5.2264233, 44.306274), (22.668417, -2.616798, 44.489273), (20.308962, -2.616798, 45.614674), (20.225426, -5.2264233, 45.427048), (20.225426, -5.2264233, 45.427048), (20.308962, -2.616798, 45.614674), (17.89384, -2.616798, 46.615047), (17.820238, -5.2264233, 46.42331), (17.820238, -5.2264233, 46.42331), (17.89384, -2.616798, 46.615047), (15.429675, -2.616798, 47.487656), (15.366208, -5.2264233, 47.292328), (15.366208, -5.2264233, 47.292328), (15.429675, -2.616798, 47.487656), (12.923217, -2.616798, 48.230103), (12.87006, -5.2264233, 48.03172), (12.87006, -5.2264233, 48.03172), (12.923217, -2.616798, 48.230103), (10.381338, -2.616798, 48.840355), (10.338636, -5.2264233, 48.63946), (10.338636, -5.2264233, 48.63946), (10.381338, -2.616798, 48.840355), (7.8110037, -2.616798, 49.31674), (7.778875, -5.2264233, 49.113884), (7.778875, -5.2264233, 49.113884), (7.8110037, -2.616798, 49.31674), (5.2192607, -2.616798, 49.657948), (5.197792, -5.2264233, 49.45369), (5.197792, -5.2264233, 49.45369), (5.2192607, -2.616798, 49.657948), (2.6132116, -2.616798, 49.86305), (2.6024628, -5.2264233, 49.657948), (2.6024628, -5.2264233, 49.657948), (2.6132116, -2.616798, 49.86305), (3.0574211e-15, -2.616798, 49.931477), (3.0448452e-15, -5.2264233, 49.726093), (3.0448452e-15, -5.2264233, 49.726093), (3.0574211e-15, -2.616798, 49.931477), (-2.6132116, -2.616798, 49.86305), (-2.6024628, -5.2264233, 49.657948), (-2.6024628, -5.2264233, 49.657948), (-2.6132116, -2.616798, 49.86305), (-5.2192607, -2.616798, 49.657948), (-5.197792, -5.2264233, 49.45369), (-5.197792, -5.2264233, 49.45369), (-5.2192607, -2.616798, 49.657948), (-7.8110037, -2.616798, 49.31674), (-7.778875, -5.2264233, 49.113884), (-7.778875, -5.2264233, 49.113884), (-7.8110037, -2.616798, 49.31674), (-10.381338, -2.616798, 48.840355), (-10.338636, -5.2264233, 48.63946), (-10.338636, -5.2264233, 48.63946), (-10.381338, -2.616798, 48.840355), (-12.923217, -2.616798, 48.230103), (-12.87006, -5.2264233, 48.03172), (-12.87006, -5.2264233, 48.03172), (-12.923217, -2.616798, 48.230103), (-15.429675, -2.616798, 47.487656), (-15.366208, -5.2264233, 47.292328), (-15.366208, -5.2264233, 47.292328), (-15.429675, -2.616798, 47.487656), (-17.89384, -2.616798, 46.615047), (-17.820238, -5.2264233, 46.42331), (-17.820238, -5.2264233, 46.42331), (-17.89384, -2.616798, 46.615047), (-20.308962, -2.616798, 45.614674), (-20.225426, -5.2264233, 45.427048), (-20.225426, -5.2264233, 45.427048), (-20.308962, -2.616798, 45.614674), (-22.668417, -2.616798, 44.489273), (-22.575174, -5.2264233, 44.306274), (-22.575174, -5.2264233, 44.306274), (-22.668417, -2.616798, 44.489273), (-24.965738, -2.616798, 43.24193), (-24.863047, -5.2264233, 43.06406), (-24.863047, -5.2264233, 43.06406), (-24.965738, -2.616798, 43.24193), (-27.194632, -2.616798, 41.87606), (-27.082773, -5.2264233, 41.70381), (-27.082773, -5.2264233, 41.70381), (-27.194632, -2.616798, 41.87606), (-29.348986, -2.616798, 40.395412), (-29.228266, -5.2264233, 40.229256), (-29.228266, -5.2264233, 40.229256), (-29.348986, -2.616798, 40.395412), (-31.422897, -2.616798, 38.804047), (-31.293646, -5.2264233, 38.644432), (-31.293646, -5.2264233, 38.644432), (-31.422897, -2.616798, 38.804047), (-33.41068, -2.616798, 37.10632), (-33.27325, -5.2264233, 36.95369), (-33.27325, -5.2264233, 36.95369), (-33.41068, -2.616798, 37.10632), (-35.306885, -2.616798, 35.306885), (-35.16166, -5.2264233, 35.16166), (-35.16166, -5.2264233, 35.16166), (-35.306885, -2.616798, 35.306885), (-37.10632, -2.616798, 33.41068), (-36.95369, -5.2264233, 33.27325), (-36.95369, -5.2264233, 33.27325), (-37.10632, -2.616798, 33.41068), (-38.804047, -2.616798, 31.422897), (-38.644432, -5.2264233, 31.293646), (-38.644432, -5.2264233, 31.293646), (-38.804047, -2.616798, 31.422897), (-40.395412, -2.616798, 29.348986), (-40.229256, -5.2264233, 29.228266), (-40.229256, -5.2264233, 29.228266), (-40.395412, -2.616798, 29.348986), (-41.87606, -2.616798, 27.194632), (-41.70381, -5.2264233, 27.082773), (-41.70381, -5.2264233, 27.082773), (-41.87606, -2.616798, 27.194632), (-43.24193, -2.616798, 24.965738), (-43.06406, -5.2264233, 24.863047), (-43.06406, -5.2264233, 24.863047), (-43.24193, -2.616798, 24.965738), (-44.489273, -2.616798, 22.668417), (-44.306274, -5.2264233, 22.575174), (-44.306274, -5.2264233, 22.575174), (-44.489273, -2.616798, 22.668417), (-45.614674, -2.616798, 20.308962), (-45.427048, -5.2264233, 20.225426), (-45.427048, -5.2264233, 20.225426), (-45.614674, -2.616798, 20.308962), (-46.615047, -2.616798, 17.89384), (-46.42331, -5.2264233, 17.820238), (-46.42331, -5.2264233, 17.820238), (-46.615047, -2.616798, 17.89384), (-47.487656, -2.616798, 15.429675), (-47.292328, -5.2264233, 15.366208), (-47.292328, -5.2264233, 15.366208), (-47.487656, -2.616798, 15.429675), (-48.230103, -2.616798, 12.923217), (-48.03172, -5.2264233, 12.87006), (-48.03172, -5.2264233, 12.87006), (-48.230103, -2.616798, 12.923217), (-48.840355, -2.616798, 10.381338), (-48.63946, -5.2264233, 10.338636), (-48.63946, -5.2264233, 10.338636), (-48.840355, -2.616798, 10.381338), (-49.31674, -2.616798, 7.8110037), (-49.113884, -5.2264233, 7.778875), (-49.113884, -5.2264233, 7.778875), (-49.31674, -2.616798, 7.8110037), (-49.657948, -2.616798, 5.2192607), (-49.45369, -5.2264233, 5.197792), (-49.45369, -5.2264233, 5.197792), (-49.657948, -2.616798, 5.2192607), (-49.86305, -2.616798, 2.6132116), (-49.657948, -5.2264233, 2.6024628), (-49.657948, -5.2264233, 2.6024628), (-49.86305, -2.616798, 2.6132116), (-49.931477, -2.616798, 6.1148422e-15), (-49.726093, -5.2264233, 6.0896904e-15), (-49.726093, -5.2264233, 6.0896904e-15), (-49.931477, -2.616798, 6.1148422e-15), (-49.86305, -2.616798, -2.6132116), (-49.657948, -5.2264233, -2.6024628), (-49.657948, -5.2264233, -2.6024628), (-49.86305, -2.616798, -2.6132116), (-49.657948, -2.616798, -5.2192607), (-49.45369, -5.2264233, -5.197792), (-49.45369, -5.2264233, -5.197792), (-49.657948, -2.616798, -5.2192607), (-49.31674, -2.616798, -7.8110037), (-49.113884, -5.2264233, -7.778875), (-49.113884, -5.2264233, -7.778875), (-49.31674, -2.616798, -7.8110037), (-48.840355, -2.616798, -10.381338), (-48.63946, -5.2264233, -10.338636), (-48.63946, -5.2264233, -10.338636), (-48.840355, -2.616798, -10.381338), (-48.230103, -2.616798, -12.923217), (-48.03172, -5.2264233, -12.87006), (-48.03172, -5.2264233, -12.87006), (-48.230103, -2.616798, -12.923217), (-47.487656, -2.616798, -15.429675), (-47.292328, -5.2264233, -15.366208), (-47.292328, -5.2264233, -15.366208), (-47.487656, -2.616798, -15.429675), (-46.615047, -2.616798, -17.89384), (-46.42331, -5.2264233, -17.820238), (-46.42331, -5.2264233, -17.820238), (-46.615047, -2.616798, -17.89384), (-45.614674, -2.616798, -20.308962), (-45.427048, -5.2264233, -20.225426), (-45.427048, -5.2264233, -20.225426), (-45.614674, -2.616798, -20.308962), (-44.489273, -2.616798, -22.668417), (-44.306274, -5.2264233, -22.575174), (-44.306274, -5.2264233, -22.575174), (-44.489273, -2.616798, -22.668417), (-43.24193, -2.616798, -24.965738), (-43.06406, -5.2264233, -24.863047), (-43.06406, -5.2264233, -24.863047), (-43.24193, -2.616798, -24.965738), (-41.87606, -2.616798, -27.194632), (-41.70381, -5.2264233, -27.082773), (-41.70381, -5.2264233, -27.082773), (-41.87606, -2.616798, -27.194632), (-40.395412, -2.616798, -29.348986), (-40.229256, -5.2264233, -29.228266), (-40.229256, -5.2264233, -29.228266), (-40.395412, -2.616798, -29.348986), (-38.804047, -2.616798, -31.422897), (-38.644432, -5.2264233, -31.293646), (-38.644432, -5.2264233, -31.293646), (-38.804047, -2.616798, -31.422897), (-37.10632, -2.616798, -33.41068), (-36.95369, -5.2264233, -33.27325), (-36.95369, -5.2264233, -33.27325), (-37.10632, -2.616798, -33.41068), (-35.306885, -2.616798, -35.306885), (-35.16166, -5.2264233, -35.16166), (-35.16166, -5.2264233, -35.16166), (-35.306885, -2.616798, -35.306885), (-33.41068, -2.616798, -37.10632), (-33.27325, -5.2264233, -36.95369), (-33.27325, -5.2264233, -36.95369), (-33.41068, -2.616798, -37.10632), (-31.422897, -2.616798, -38.804047), (-31.293646, -5.2264233, -38.644432), (-31.293646, -5.2264233, -38.644432), (-31.422897, -2.616798, -38.804047), (-29.348986, -2.616798, -40.395412), (-29.228266, -5.2264233, -40.229256), (-29.228266, -5.2264233, -40.229256), (-29.348986, -2.616798, -40.395412), (-27.194632, -2.616798, -41.87606), (-27.082773, -5.2264233, -41.70381), (-27.082773, -5.2264233, -41.70381), (-27.194632, -2.616798, -41.87606), (-24.965738, -2.616798, -43.24193), (-24.863047, -5.2264233, -43.06406), (-24.863047, -5.2264233, -43.06406), (-24.965738, -2.616798, -43.24193), (-22.668417, -2.616798, -44.489273), (-22.575174, -5.2264233, -44.306274), (-22.575174, -5.2264233, -44.306274), (-22.668417, -2.616798, -44.489273), (-20.308962, -2.616798, -45.614674), (-20.225426, -5.2264233, -45.427048), (-20.225426, -5.2264233, -45.427048), (-20.308962, -2.616798, -45.614674), (-17.89384, -2.616798, -46.615047), (-17.820238, -5.2264233, -46.42331), (-17.820238, -5.2264233, -46.42331), (-17.89384, -2.616798, -46.615047), (-15.429675, -2.616798, -47.487656), (-15.366208, -5.2264233, -47.292328), (-15.366208, -5.2264233, -47.292328), (-15.429675, -2.616798, -47.487656), (-12.923217, -2.616798, -48.230103), (-12.87006, -5.2264233, -48.03172), (-12.87006, -5.2264233, -48.03172), (-12.923217, -2.616798, -48.230103), (-10.381338, -2.616798, -48.840355), (-10.338636, -5.2264233, -48.63946), (-10.338636, -5.2264233, -48.63946), (-10.381338, -2.616798, -48.840355), (-7.8110037, -2.616798, -49.31674), (-7.778875, -5.2264233, -49.113884), (-7.778875, -5.2264233, -49.113884), (-7.8110037, -2.616798, -49.31674), (-5.2192607, -2.616798, -49.657948), (-5.197792, -5.2264233, -49.45369), (-5.197792, -5.2264233, -49.45369), (-5.2192607, -2.616798, -49.657948), (-2.6132116, -2.616798, -49.86305), (-2.6024628, -5.2264233, -49.657948), (-2.6024628, -5.2264233, -49.657948), (-2.6132116, -2.616798, -49.86305), (-9.172263e-15, -2.616798, -49.931477), (-9.1345354e-15, -5.2264233, -49.726093), (-9.1345354e-15, -5.2264233, -49.726093), (-9.172263e-15, -2.616798, -49.931477), (2.6132116, -2.616798, -49.86305), (2.6024628, -5.2264233, -49.657948), (2.6024628, -5.2264233, -49.657948), (2.6132116, -2.616798, -49.86305), (5.2192607, -2.616798, -49.657948), (5.197792, -5.2264233, -49.45369), (5.197792, -5.2264233, -49.45369), (5.2192607, -2.616798, -49.657948), (7.8110037, -2.616798, -49.31674), (7.778875, -5.2264233, -49.113884), (7.778875, -5.2264233, -49.113884), (7.8110037, -2.616798, -49.31674), (10.381338, -2.616798, -48.840355), (10.338636, -5.2264233, -48.63946), (10.338636, -5.2264233, -48.63946), (10.381338, -2.616798, -48.840355), (12.923217, -2.616798, -48.230103), (12.87006, -5.2264233, -48.03172), (12.87006, -5.2264233, -48.03172), (12.923217, -2.616798, -48.230103), (15.429675, -2.616798, -47.487656), (15.366208, -5.2264233, -47.292328), (15.366208, -5.2264233, -47.292328), (15.429675, -2.616798, -47.487656), (17.89384, -2.616798, -46.615047), (17.820238, -5.2264233, -46.42331), (17.820238, -5.2264233, -46.42331), (17.89384, -2.616798, -46.615047), (20.308962, -2.616798, -45.614674), (20.225426, -5.2264233, -45.427048), (20.225426, -5.2264233, -45.427048), (20.308962, -2.616798, -45.614674), (22.668417, -2.616798, -44.489273), (22.575174, -5.2264233, -44.306274), (22.575174, -5.2264233, -44.306274), (22.668417, -2.616798, -44.489273), (24.965738, -2.616798, -43.24193), (24.863047, -5.2264233, -43.06406), (24.863047, -5.2264233, -43.06406), (24.965738, -2.616798, -43.24193), (27.194632, -2.616798, -41.87606), (27.082773, -5.2264233, -41.70381), (27.082773, -5.2264233, -41.70381), (27.194632, -2.616798, -41.87606), (29.348986, -2.616798, -40.395412), (29.228266, -5.2264233, -40.229256), (29.228266, -5.2264233, -40.229256), (29.348986, -2.616798, -40.395412), (31.422897, -2.616798, -38.804047), (31.293646, -5.2264233, -38.644432), (31.293646, -5.2264233, -38.644432), (31.422897, -2.616798, -38.804047), (33.41068, -2.616798, -37.10632), (33.27325, -5.2264233, -36.95369), (33.27325, -5.2264233, -36.95369), (33.41068, -2.616798, -37.10632), (35.306885, -2.616798, -35.306885), (35.16166, -5.2264233, -35.16166), (35.16166, -5.2264233, -35.16166), (35.306885, -2.616798, -35.306885), (37.10632, -2.616798, -33.41068), (36.95369, -5.2264233, -33.27325), (36.95369, -5.2264233, -33.27325), (37.10632, -2.616798, -33.41068), (38.804047, -2.616798, -31.422897), (38.644432, -5.2264233, -31.293646), (38.644432, -5.2264233, -31.293646), (38.804047, -2.616798, -31.422897), (40.395412, -2.616798, -29.348986), (40.229256, -5.2264233, -29.228266), (40.229256, -5.2264233, -29.228266), (40.395412, -2.616798, -29.348986), (41.87606, -2.616798, -27.194632), (41.70381, -5.2264233, -27.082773), (41.70381, -5.2264233, -27.082773), (41.87606, -2.616798, -27.194632), (43.24193, -2.616798, -24.965738), (43.06406, -5.2264233, -24.863047), (43.06406, -5.2264233, -24.863047), (43.24193, -2.616798, -24.965738), (44.489273, -2.616798, -22.668417), (44.306274, -5.2264233, -22.575174), (44.306274, -5.2264233, -22.575174), (44.489273, -2.616798, -22.668417), (45.614674, -2.616798, -20.308962), (45.427048, -5.2264233, -20.225426), (45.427048, -5.2264233, -20.225426), (45.614674, -2.616798, -20.308962), (46.615047, -2.616798, -17.89384), (46.42331, -5.2264233, -17.820238), (46.42331, -5.2264233, -17.820238), (46.615047, -2.616798, -17.89384), (47.487656, -2.616798, -15.429675), (47.292328, -5.2264233, -15.366208), (47.292328, -5.2264233, -15.366208), (47.487656, -2.616798, -15.429675), (48.230103, -2.616798, -12.923217), (48.03172, -5.2264233, -12.87006), (48.03172, -5.2264233, -12.87006), (48.230103, -2.616798, -12.923217), (48.840355, -2.616798, -10.381338), (48.63946, -5.2264233, -10.338636), (48.63946, -5.2264233, -10.338636), (48.840355, -2.616798, -10.381338), (49.31674, -2.616798, -7.8110037), (49.113884, -5.2264233, -7.778875), (49.113884, -5.2264233, -7.778875), (49.31674, -2.616798, -7.8110037), (49.657948, -2.616798, -5.2192607), (49.45369, -5.2264233, -5.197792), (49.45369, -5.2264233, -5.197792), (49.657948, -2.616798, -5.2192607), (49.86305, -2.616798, -2.6132116), (49.657948, -5.2264233, -2.6024628), (49.657948, -5.2264233, -2.6024628), (49.86305, -2.616798, -2.6132116), (49.931477, -2.616798, 0), (49.726093, -5.2264233, 0), (49.931477, -2.616798, 0), (50, 0, 0), (49.931477, 0, 2.616798), (49.86305, -2.616798, 2.6132116), (49.86305, -2.616798, 2.6132116), (49.931477, 0, 2.616798), (49.726093, 0, 5.2264233), (49.657948, -2.616798, 5.2192607), (49.657948, -2.616798, 5.2192607), (49.726093, 0, 5.2264233), (49.38442, 0, 7.8217235), (49.31674, -2.616798, 7.8110037), (49.31674, -2.616798, 7.8110037), (49.38442, 0, 7.8217235), (48.90738, 0, 10.395584), (48.840355, -2.616798, 10.381338), (48.840355, -2.616798, 10.381338), (48.90738, 0, 10.395584), (48.29629, 0, 12.940952), (48.230103, -2.616798, 12.923217), (48.230103, -2.616798, 12.923217), (48.29629, 0, 12.940952), (47.552826, 0, 15.45085), (47.487656, -2.616798, 15.429675), (47.487656, -2.616798, 15.429675), (47.552826, 0, 15.45085), (46.67902, 0, 17.918398), (46.615047, -2.616798, 17.89384), (46.615047, -2.616798, 17.89384), (46.67902, 0, 17.918398), (45.677273, 0, 20.336832), (45.614674, -2.616798, 20.308962), (45.614674, -2.616798, 20.308962), (45.677273, 0, 20.336832), (44.550327, 0, 22.699526), (44.489273, -2.616798, 22.668417), (44.489273, -2.616798, 22.668417), (44.550327, 0, 22.699526), (43.30127, 0, 25), (43.24193, -2.616798, 24.965738), (43.24193, -2.616798, 24.965738), (43.30127, 0, 25), (41.93353, 0, 27.231953), (41.87606, -2.616798, 27.194632), (41.87606, -2.616798, 27.194632), (41.93353, 0, 27.231953), (40.45085, 0, 29.389263), (40.395412, -2.616798, 29.348986), (40.395412, -2.616798, 29.348986), (40.45085, 0, 29.389263), (38.8573, 0, 31.466019), (38.804047, -2.616798, 31.422897), (38.804047, -2.616798, 31.422897), (38.8573, 0, 31.466019), (37.15724, 0, 33.45653), (37.10632, -2.616798, 33.41068), (37.10632, -2.616798, 33.41068), (37.15724, 0, 33.45653), (35.35534, 0, 35.35534), (35.306885, -2.616798, 35.306885), (35.306885, -2.616798, 35.306885), (35.35534, 0, 35.35534), (33.45653, 0, 37.15724), (33.41068, -2.616798, 37.10632), (33.41068, -2.616798, 37.10632), (33.45653, 0, 37.15724), (31.466019, 0, 38.8573), (31.422897, -2.616798, 38.804047), (31.422897, -2.616798, 38.804047), (31.466019, 0, 38.8573), (29.389263, 0, 40.45085), (29.348986, -2.616798, 40.395412), (29.348986, -2.616798, 40.395412), (29.389263, 0, 40.45085), (27.231953, 0, 41.93353), (27.194632, -2.616798, 41.87606), (27.194632, -2.616798, 41.87606), (27.231953, 0, 41.93353), (25, 0, 43.30127), (24.965738, -2.616798, 43.24193), (24.965738, -2.616798, 43.24193), (25, 0, 43.30127), (22.699526, 0, 44.550327), (22.668417, -2.616798, 44.489273), (22.668417, -2.616798, 44.489273), (22.699526, 0, 44.550327), (20.336832, 0, 45.677273), (20.308962, -2.616798, 45.614674), (20.308962, -2.616798, 45.614674), (20.336832, 0, 45.677273), (17.918398, 0, 46.67902), (17.89384, -2.616798, 46.615047), (17.89384, -2.616798, 46.615047), (17.918398, 0, 46.67902), (15.45085, 0, 47.552826), (15.429675, -2.616798, 47.487656), (15.429675, -2.616798, 47.487656), (15.45085, 0, 47.552826), (12.940952, 0, 48.29629), (12.923217, -2.616798, 48.230103), (12.923217, -2.616798, 48.230103), (12.940952, 0, 48.29629), (10.395584, 0, 48.90738), (10.381338, -2.616798, 48.840355), (10.381338, -2.616798, 48.840355), (10.395584, 0, 48.90738), (7.8217235, 0, 49.38442), (7.8110037, -2.616798, 49.31674), (7.8110037, -2.616798, 49.31674), (7.8217235, 0, 49.38442), (5.2264233, 0, 49.726093), (5.2192607, -2.616798, 49.657948), (5.2192607, -2.616798, 49.657948), (5.2264233, 0, 49.726093), (2.616798, 0, 49.931477), (2.6132116, -2.616798, 49.86305), (2.6132116, -2.616798, 49.86305), (2.616798, 0, 49.931477), (3.0616169e-15, 0, 50), (3.0574211e-15, -2.616798, 49.931477), (3.0574211e-15, -2.616798, 49.931477), (3.0616169e-15, 0, 50), (-2.616798, 0, 49.931477), (-2.6132116, -2.616798, 49.86305), (-2.6132116, -2.616798, 49.86305), (-2.616798, 0, 49.931477), (-5.2264233, 0, 49.726093), (-5.2192607, -2.616798, 49.657948), (-5.2192607, -2.616798, 49.657948), (-5.2264233, 0, 49.726093), (-7.8217235, 0, 49.38442), (-7.8110037, -2.616798, 49.31674), (-7.8110037, -2.616798, 49.31674), (-7.8217235, 0, 49.38442), (-10.395584, 0, 48.90738), (-10.381338, -2.616798, 48.840355), (-10.381338, -2.616798, 48.840355), (-10.395584, 0, 48.90738), (-12.940952, 0, 48.29629), (-12.923217, -2.616798, 48.230103), (-12.923217, -2.616798, 48.230103), (-12.940952, 0, 48.29629), (-15.45085, 0, 47.552826), (-15.429675, -2.616798, 47.487656), (-15.429675, -2.616798, 47.487656), (-15.45085, 0, 47.552826), (-17.918398, 0, 46.67902), (-17.89384, -2.616798, 46.615047), (-17.89384, -2.616798, 46.615047), (-17.918398, 0, 46.67902), (-20.336832, 0, 45.677273), (-20.308962, -2.616798, 45.614674), (-20.308962, -2.616798, 45.614674), (-20.336832, 0, 45.677273), (-22.699526, 0, 44.550327), (-22.668417, -2.616798, 44.489273), (-22.668417, -2.616798, 44.489273), (-22.699526, 0, 44.550327), (-25, 0, 43.30127), (-24.965738, -2.616798, 43.24193), (-24.965738, -2.616798, 43.24193), (-25, 0, 43.30127), (-27.231953, 0, 41.93353), (-27.194632, -2.616798, 41.87606), (-27.194632, -2.616798, 41.87606), (-27.231953, 0, 41.93353), (-29.389263, 0, 40.45085), (-29.348986, -2.616798, 40.395412), (-29.348986, -2.616798, 40.395412), (-29.389263, 0, 40.45085), (-31.466019, 0, 38.8573), (-31.422897, -2.616798, 38.804047), (-31.422897, -2.616798, 38.804047), (-31.466019, 0, 38.8573), (-33.45653, 0, 37.15724), (-33.41068, -2.616798, 37.10632), (-33.41068, -2.616798, 37.10632), (-33.45653, 0, 37.15724), (-35.35534, 0, 35.35534), (-35.306885, -2.616798, 35.306885), (-35.306885, -2.616798, 35.306885), (-35.35534, 0, 35.35534), (-37.15724, 0, 33.45653), (-37.10632, -2.616798, 33.41068), (-37.10632, -2.616798, 33.41068), (-37.15724, 0, 33.45653), (-38.8573, 0, 31.466019), (-38.804047, -2.616798, 31.422897), (-38.804047, -2.616798, 31.422897), (-38.8573, 0, 31.466019), (-40.45085, 0, 29.389263), (-40.395412, -2.616798, 29.348986), (-40.395412, -2.616798, 29.348986), (-40.45085, 0, 29.389263), (-41.93353, 0, 27.231953), (-41.87606, -2.616798, 27.194632), (-41.87606, -2.616798, 27.194632), (-41.93353, 0, 27.231953), (-43.30127, 0, 25), (-43.24193, -2.616798, 24.965738), (-43.24193, -2.616798, 24.965738), (-43.30127, 0, 25), (-44.550327, 0, 22.699526), (-44.489273, -2.616798, 22.668417), (-44.489273, -2.616798, 22.668417), (-44.550327, 0, 22.699526), (-45.677273, 0, 20.336832), (-45.614674, -2.616798, 20.308962), (-45.614674, -2.616798, 20.308962), (-45.677273, 0, 20.336832), (-46.67902, 0, 17.918398), (-46.615047, -2.616798, 17.89384), (-46.615047, -2.616798, 17.89384), (-46.67902, 0, 17.918398), (-47.552826, 0, 15.45085), (-47.487656, -2.616798, 15.429675), (-47.487656, -2.616798, 15.429675), (-47.552826, 0, 15.45085), (-48.29629, 0, 12.940952), (-48.230103, -2.616798, 12.923217), (-48.230103, -2.616798, 12.923217), (-48.29629, 0, 12.940952), (-48.90738, 0, 10.395584), (-48.840355, -2.616798, 10.381338), (-48.840355, -2.616798, 10.381338), (-48.90738, 0, 10.395584), (-49.38442, 0, 7.8217235), (-49.31674, -2.616798, 7.8110037), (-49.31674, -2.616798, 7.8110037), (-49.38442, 0, 7.8217235), (-49.726093, 0, 5.2264233), (-49.657948, -2.616798, 5.2192607), (-49.657948, -2.616798, 5.2192607), (-49.726093, 0, 5.2264233), (-49.931477, 0, 2.616798), (-49.86305, -2.616798, 2.6132116), (-49.86305, -2.616798, 2.6132116), (-49.931477, 0, 2.616798), (-50, 0, 6.1232338e-15), (-49.931477, -2.616798, 6.1148422e-15), (-49.931477, -2.616798, 6.1148422e-15), (-50, 0, 6.1232338e-15), (-49.931477, 0, -2.616798), (-49.86305, -2.616798, -2.6132116), (-49.86305, -2.616798, -2.6132116), (-49.931477, 0, -2.616798), (-49.726093, 0, -5.2264233), (-49.657948, -2.616798, -5.2192607), (-49.657948, -2.616798, -5.2192607), (-49.726093, 0, -5.2264233), (-49.38442, 0, -7.8217235), (-49.31674, -2.616798, -7.8110037), (-49.31674, -2.616798, -7.8110037), (-49.38442, 0, -7.8217235), (-48.90738, 0, -10.395584), (-48.840355, -2.616798, -10.381338), (-48.840355, -2.616798, -10.381338), (-48.90738, 0, -10.395584), (-48.29629, 0, -12.940952), (-48.230103, -2.616798, -12.923217), (-48.230103, -2.616798, -12.923217), (-48.29629, 0, -12.940952), (-47.552826, 0, -15.45085), (-47.487656, -2.616798, -15.429675), (-47.487656, -2.616798, -15.429675), (-47.552826, 0, -15.45085), (-46.67902, 0, -17.918398), (-46.615047, -2.616798, -17.89384), (-46.615047, -2.616798, -17.89384), (-46.67902, 0, -17.918398), (-45.677273, 0, -20.336832), (-45.614674, -2.616798, -20.308962), (-45.614674, -2.616798, -20.308962), (-45.677273, 0, -20.336832), (-44.550327, 0, -22.699526), (-44.489273, -2.616798, -22.668417), (-44.489273, -2.616798, -22.668417), (-44.550327, 0, -22.699526), (-43.30127, 0, -25), (-43.24193, -2.616798, -24.965738), (-43.24193, -2.616798, -24.965738), (-43.30127, 0, -25), (-41.93353, 0, -27.231953), (-41.87606, -2.616798, -27.194632), (-41.87606, -2.616798, -27.194632), (-41.93353, 0, -27.231953), (-40.45085, 0, -29.389263), (-40.395412, -2.616798, -29.348986), (-40.395412, -2.616798, -29.348986), (-40.45085, 0, -29.389263), (-38.8573, 0, -31.466019), (-38.804047, -2.616798, -31.422897), (-38.804047, -2.616798, -31.422897), (-38.8573, 0, -31.466019), (-37.15724, 0, -33.45653), (-37.10632, -2.616798, -33.41068), (-37.10632, -2.616798, -33.41068), (-37.15724, 0, -33.45653), (-35.35534, 0, -35.35534), (-35.306885, -2.616798, -35.306885), (-35.306885, -2.616798, -35.306885), (-35.35534, 0, -35.35534), (-33.45653, 0, -37.15724), (-33.41068, -2.616798, -37.10632), (-33.41068, -2.616798, -37.10632), (-33.45653, 0, -37.15724), (-31.466019, 0, -38.8573), (-31.422897, -2.616798, -38.804047), (-31.422897, -2.616798, -38.804047), (-31.466019, 0, -38.8573), (-29.389263, 0, -40.45085), (-29.348986, -2.616798, -40.395412), (-29.348986, -2.616798, -40.395412), (-29.389263, 0, -40.45085), (-27.231953, 0, -41.93353), (-27.194632, -2.616798, -41.87606), (-27.194632, -2.616798, -41.87606), (-27.231953, 0, -41.93353), (-25, 0, -43.30127), (-24.965738, -2.616798, -43.24193), (-24.965738, -2.616798, -43.24193), (-25, 0, -43.30127), (-22.699526, 0, -44.550327), (-22.668417, -2.616798, -44.489273), (-22.668417, -2.616798, -44.489273), (-22.699526, 0, -44.550327), (-20.336832, 0, -45.677273), (-20.308962, -2.616798, -45.614674), (-20.308962, -2.616798, -45.614674), (-20.336832, 0, -45.677273), (-17.918398, 0, -46.67902), (-17.89384, -2.616798, -46.615047), (-17.89384, -2.616798, -46.615047), (-17.918398, 0, -46.67902), (-15.45085, 0, -47.552826), (-15.429675, -2.616798, -47.487656), (-15.429675, -2.616798, -47.487656), (-15.45085, 0, -47.552826), (-12.940952, 0, -48.29629), (-12.923217, -2.616798, -48.230103), (-12.923217, -2.616798, -48.230103), (-12.940952, 0, -48.29629), (-10.395584, 0, -48.90738), (-10.381338, -2.616798, -48.840355), (-10.381338, -2.616798, -48.840355), (-10.395584, 0, -48.90738), (-7.8217235, 0, -49.38442), (-7.8110037, -2.616798, -49.31674), (-7.8110037, -2.616798, -49.31674), (-7.8217235, 0, -49.38442), (-5.2264233, 0, -49.726093), (-5.2192607, -2.616798, -49.657948), (-5.2192607, -2.616798, -49.657948), (-5.2264233, 0, -49.726093), (-2.616798, 0, -49.931477), (-2.6132116, -2.616798, -49.86305), (-2.6132116, -2.616798, -49.86305), (-2.616798, 0, -49.931477), (-9.184851e-15, 0, -50), (-9.172263e-15, -2.616798, -49.931477), (-9.172263e-15, -2.616798, -49.931477), (-9.184851e-15, 0, -50), (2.616798, 0, -49.931477), (2.6132116, -2.616798, -49.86305), (2.6132116, -2.616798, -49.86305), (2.616798, 0, -49.931477), (5.2264233, 0, -49.726093), (5.2192607, -2.616798, -49.657948), (5.2192607, -2.616798, -49.657948), (5.2264233, 0, -49.726093), (7.8217235, 0, -49.38442), (7.8110037, -2.616798, -49.31674), (7.8110037, -2.616798, -49.31674), (7.8217235, 0, -49.38442), (10.395584, 0, -48.90738), (10.381338, -2.616798, -48.840355), (10.381338, -2.616798, -48.840355), (10.395584, 0, -48.90738), (12.940952, 0, -48.29629), (12.923217, -2.616798, -48.230103), (12.923217, -2.616798, -48.230103), (12.940952, 0, -48.29629), (15.45085, 0, -47.552826), (15.429675, -2.616798, -47.487656), (15.429675, -2.616798, -47.487656), (15.45085, 0, -47.552826), (17.918398, 0, -46.67902), (17.89384, -2.616798, -46.615047), (17.89384, -2.616798, -46.615047), (17.918398, 0, -46.67902), (20.336832, 0, -45.677273), (20.308962, -2.616798, -45.614674), (20.308962, -2.616798, -45.614674), (20.336832, 0, -45.677273), (22.699526, 0, -44.550327), (22.668417, -2.616798, -44.489273), (22.668417, -2.616798, -44.489273), (22.699526, 0, -44.550327), (25, 0, -43.30127), (24.965738, -2.616798, -43.24193), (24.965738, -2.616798, -43.24193), (25, 0, -43.30127), (27.231953, 0, -41.93353), (27.194632, -2.616798, -41.87606), (27.194632, -2.616798, -41.87606), (27.231953, 0, -41.93353), (29.389263, 0, -40.45085), (29.348986, -2.616798, -40.395412), (29.348986, -2.616798, -40.395412), (29.389263, 0, -40.45085), (31.466019, 0, -38.8573), (31.422897, -2.616798, -38.804047), (31.422897, -2.616798, -38.804047), (31.466019, 0, -38.8573), (33.45653, 0, -37.15724), (33.41068, -2.616798, -37.10632), (33.41068, -2.616798, -37.10632), (33.45653, 0, -37.15724), (35.35534, 0, -35.35534), (35.306885, -2.616798, -35.306885), (35.306885, -2.616798, -35.306885), (35.35534, 0, -35.35534), (37.15724, 0, -33.45653), (37.10632, -2.616798, -33.41068), (37.10632, -2.616798, -33.41068), (37.15724, 0, -33.45653), (38.8573, 0, -31.466019), (38.804047, -2.616798, -31.422897), (38.804047, -2.616798, -31.422897), (38.8573, 0, -31.466019), (40.45085, 0, -29.389263), (40.395412, -2.616798, -29.348986), (40.395412, -2.616798, -29.348986), (40.45085, 0, -29.389263), (41.93353, 0, -27.231953), (41.87606, -2.616798, -27.194632), (41.87606, -2.616798, -27.194632), (41.93353, 0, -27.231953), (43.30127, 0, -25), (43.24193, -2.616798, -24.965738), (43.24193, -2.616798, -24.965738), (43.30127, 0, -25), (44.550327, 0, -22.699526), (44.489273, -2.616798, -22.668417), (44.489273, -2.616798, -22.668417), (44.550327, 0, -22.699526), (45.677273, 0, -20.336832), (45.614674, -2.616798, -20.308962), (45.614674, -2.616798, -20.308962), (45.677273, 0, -20.336832), (46.67902, 0, -17.918398), (46.615047, -2.616798, -17.89384), (46.615047, -2.616798, -17.89384), (46.67902, 0, -17.918398), (47.552826, 0, -15.45085), (47.487656, -2.616798, -15.429675), (47.487656, -2.616798, -15.429675), (47.552826, 0, -15.45085), (48.29629, 0, -12.940952), (48.230103, -2.616798, -12.923217), (48.230103, -2.616798, -12.923217), (48.29629, 0, -12.940952), (48.90738, 0, -10.395584), (48.840355, -2.616798, -10.381338), (48.840355, -2.616798, -10.381338), (48.90738, 0, -10.395584), (49.38442, 0, -7.8217235), (49.31674, -2.616798, -7.8110037), (49.31674, -2.616798, -7.8110037), (49.38442, 0, -7.8217235), (49.726093, 0, -5.2264233), (49.657948, -2.616798, -5.2192607), (49.657948, -2.616798, -5.2192607), (49.726093, 0, -5.2264233), (49.931477, 0, -2.616798), (49.86305, -2.616798, -2.6132116), (49.86305, -2.616798, -2.6132116), (49.931477, 0, -2.616798), (50, 0, 0), (49.931477, -2.616798, 0), (50, 0, 0), (49.931477, 2.616798, 0), (49.86305, 2.616798, 2.6132116), (49.931477, 0, 2.616798), (49.931477, 0, 2.616798), (49.86305, 2.616798, 2.6132116), (49.657948, 2.616798, 5.2192607), (49.726093, 0, 5.2264233), (49.726093, 0, 5.2264233), (49.657948, 2.616798, 5.2192607), (49.31674, 2.616798, 7.8110037), (49.38442, 0, 7.8217235), (49.38442, 0, 7.8217235), (49.31674, 2.616798, 7.8110037), (48.840355, 2.616798, 10.381338), (48.90738, 0, 10.395584), (48.90738, 0, 10.395584), (48.840355, 2.616798, 10.381338), (48.230103, 2.616798, 12.923217), (48.29629, 0, 12.940952), (48.29629, 0, 12.940952), (48.230103, 2.616798, 12.923217), (47.487656, 2.616798, 15.429675), (47.552826, 0, 15.45085), (47.552826, 0, 15.45085), (47.487656, 2.616798, 15.429675), (46.615047, 2.616798, 17.89384), (46.67902, 0, 17.918398), (46.67902, 0, 17.918398), (46.615047, 2.616798, 17.89384), (45.614674, 2.616798, 20.308962), (45.677273, 0, 20.336832), (45.677273, 0, 20.336832), (45.614674, 2.616798, 20.308962), (44.489273, 2.616798, 22.668417), (44.550327, 0, 22.699526), (44.550327, 0, 22.699526), (44.489273, 2.616798, 22.668417), (43.24193, 2.616798, 24.965738), (43.30127, 0, 25), (43.30127, 0, 25), (43.24193, 2.616798, 24.965738), (41.87606, 2.616798, 27.194632), (41.93353, 0, 27.231953), (41.93353, 0, 27.231953), (41.87606, 2.616798, 27.194632), (40.395412, 2.616798, 29.348986), (40.45085, 0, 29.389263), (40.45085, 0, 29.389263), (40.395412, 2.616798, 29.348986), (38.804047, 2.616798, 31.422897), (38.8573, 0, 31.466019), (38.8573, 0, 31.466019), (38.804047, 2.616798, 31.422897), (37.10632, 2.616798, 33.41068), (37.15724, 0, 33.45653), (37.15724, 0, 33.45653), (37.10632, 2.616798, 33.41068), (35.306885, 2.616798, 35.306885), (35.35534, 0, 35.35534), (35.35534, 0, 35.35534), (35.306885, 2.616798, 35.306885), (33.41068, 2.616798, 37.10632), (33.45653, 0, 37.15724), (33.45653, 0, 37.15724), (33.41068, 2.616798, 37.10632), (31.422897, 2.616798, 38.804047), (31.466019, 0, 38.8573), (31.466019, 0, 38.8573), (31.422897, 2.616798, 38.804047), (29.348986, 2.616798, 40.395412), (29.389263, 0, 40.45085), (29.389263, 0, 40.45085), (29.348986, 2.616798, 40.395412), (27.194632, 2.616798, 41.87606), (27.231953, 0, 41.93353), (27.231953, 0, 41.93353), (27.194632, 2.616798, 41.87606), (24.965738, 2.616798, 43.24193), (25, 0, 43.30127), (25, 0, 43.30127), (24.965738, 2.616798, 43.24193), (22.668417, 2.616798, 44.489273), (22.699526, 0, 44.550327), (22.699526, 0, 44.550327), (22.668417, 2.616798, 44.489273), (20.308962, 2.616798, 45.614674), (20.336832, 0, 45.677273), (20.336832, 0, 45.677273), (20.308962, 2.616798, 45.614674), (17.89384, 2.616798, 46.615047), (17.918398, 0, 46.67902), (17.918398, 0, 46.67902), (17.89384, 2.616798, 46.615047), (15.429675, 2.616798, 47.487656), (15.45085, 0, 47.552826), (15.45085, 0, 47.552826), (15.429675, 2.616798, 47.487656), (12.923217, 2.616798, 48.230103), (12.940952, 0, 48.29629), (12.940952, 0, 48.29629), (12.923217, 2.616798, 48.230103), (10.381338, 2.616798, 48.840355), (10.395584, 0, 48.90738), (10.395584, 0, 48.90738), (10.381338, 2.616798, 48.840355), (7.8110037, 2.616798, 49.31674), (7.8217235, 0, 49.38442), (7.8217235, 0, 49.38442), (7.8110037, 2.616798, 49.31674), (5.2192607, 2.616798, 49.657948), (5.2264233, 0, 49.726093), (5.2264233, 0, 49.726093), (5.2192607, 2.616798, 49.657948), (2.6132116, 2.616798, 49.86305), (2.616798, 0, 49.931477), (2.616798, 0, 49.931477), (2.6132116, 2.616798, 49.86305), (3.0574211e-15, 2.616798, 49.931477), (3.0616169e-15, 0, 50), (3.0616169e-15, 0, 50), (3.0574211e-15, 2.616798, 49.931477), (-2.6132116, 2.616798, 49.86305), (-2.616798, 0, 49.931477), (-2.616798, 0, 49.931477), (-2.6132116, 2.616798, 49.86305), (-5.2192607, 2.616798, 49.657948), (-5.2264233, 0, 49.726093), (-5.2264233, 0, 49.726093), (-5.2192607, 2.616798, 49.657948), (-7.8110037, 2.616798, 49.31674), (-7.8217235, 0, 49.38442), (-7.8217235, 0, 49.38442), (-7.8110037, 2.616798, 49.31674), (-10.381338, 2.616798, 48.840355), (-10.395584, 0, 48.90738), (-10.395584, 0, 48.90738), (-10.381338, 2.616798, 48.840355), (-12.923217, 2.616798, 48.230103), (-12.940952, 0, 48.29629), (-12.940952, 0, 48.29629), (-12.923217, 2.616798, 48.230103), (-15.429675, 2.616798, 47.487656), (-15.45085, 0, 47.552826), (-15.45085, 0, 47.552826), (-15.429675, 2.616798, 47.487656), (-17.89384, 2.616798, 46.615047), (-17.918398, 0, 46.67902), (-17.918398, 0, 46.67902), (-17.89384, 2.616798, 46.615047), (-20.308962, 2.616798, 45.614674), (-20.336832, 0, 45.677273), (-20.336832, 0, 45.677273), (-20.308962, 2.616798, 45.614674), (-22.668417, 2.616798, 44.489273), (-22.699526, 0, 44.550327), (-22.699526, 0, 44.550327), (-22.668417, 2.616798, 44.489273), (-24.965738, 2.616798, 43.24193), (-25, 0, 43.30127), (-25, 0, 43.30127), (-24.965738, 2.616798, 43.24193), (-27.194632, 2.616798, 41.87606), (-27.231953, 0, 41.93353), (-27.231953, 0, 41.93353), (-27.194632, 2.616798, 41.87606), (-29.348986, 2.616798, 40.395412), (-29.389263, 0, 40.45085), (-29.389263, 0, 40.45085), (-29.348986, 2.616798, 40.395412), (-31.422897, 2.616798, 38.804047), (-31.466019, 0, 38.8573), (-31.466019, 0, 38.8573), (-31.422897, 2.616798, 38.804047), (-33.41068, 2.616798, 37.10632), (-33.45653, 0, 37.15724), (-33.45653, 0, 37.15724), (-33.41068, 2.616798, 37.10632), (-35.306885, 2.616798, 35.306885), (-35.35534, 0, 35.35534), (-35.35534, 0, 35.35534), (-35.306885, 2.616798, 35.306885), (-37.10632, 2.616798, 33.41068), (-37.15724, 0, 33.45653), (-37.15724, 0, 33.45653), (-37.10632, 2.616798, 33.41068), (-38.804047, 2.616798, 31.422897), (-38.8573, 0, 31.466019), (-38.8573, 0, 31.466019), (-38.804047, 2.616798, 31.422897), (-40.395412, 2.616798, 29.348986), (-40.45085, 0, 29.389263), (-40.45085, 0, 29.389263), (-40.395412, 2.616798, 29.348986), (-41.87606, 2.616798, 27.194632), (-41.93353, 0, 27.231953), (-41.93353, 0, 27.231953), (-41.87606, 2.616798, 27.194632), (-43.24193, 2.616798, 24.965738), (-43.30127, 0, 25), (-43.30127, 0, 25), (-43.24193, 2.616798, 24.965738), (-44.489273, 2.616798, 22.668417), (-44.550327, 0, 22.699526), (-44.550327, 0, 22.699526), (-44.489273, 2.616798, 22.668417), (-45.614674, 2.616798, 20.308962), (-45.677273, 0, 20.336832), (-45.677273, 0, 20.336832), (-45.614674, 2.616798, 20.308962), (-46.615047, 2.616798, 17.89384), (-46.67902, 0, 17.918398), (-46.67902, 0, 17.918398), (-46.615047, 2.616798, 17.89384), (-47.487656, 2.616798, 15.429675), (-47.552826, 0, 15.45085), (-47.552826, 0, 15.45085), (-47.487656, 2.616798, 15.429675), (-48.230103, 2.616798, 12.923217), (-48.29629, 0, 12.940952), (-48.29629, 0, 12.940952), (-48.230103, 2.616798, 12.923217), (-48.840355, 2.616798, 10.381338), (-48.90738, 0, 10.395584), (-48.90738, 0, 10.395584), (-48.840355, 2.616798, 10.381338), (-49.31674, 2.616798, 7.8110037), (-49.38442, 0, 7.8217235), (-49.38442, 0, 7.8217235), (-49.31674, 2.616798, 7.8110037), (-49.657948, 2.616798, 5.2192607), (-49.726093, 0, 5.2264233), (-49.726093, 0, 5.2264233), (-49.657948, 2.616798, 5.2192607), (-49.86305, 2.616798, 2.6132116), (-49.931477, 0, 2.616798), (-49.931477, 0, 2.616798), (-49.86305, 2.616798, 2.6132116), (-49.931477, 2.616798, 6.1148422e-15), (-50, 0, 6.1232338e-15), (-50, 0, 6.1232338e-15), (-49.931477, 2.616798, 6.1148422e-15), (-49.86305, 2.616798, -2.6132116), (-49.931477, 0, -2.616798), (-49.931477, 0, -2.616798), (-49.86305, 2.616798, -2.6132116), (-49.657948, 2.616798, -5.2192607), (-49.726093, 0, -5.2264233), (-49.726093, 0, -5.2264233), (-49.657948, 2.616798, -5.2192607), (-49.31674, 2.616798, -7.8110037), (-49.38442, 0, -7.8217235), (-49.38442, 0, -7.8217235), (-49.31674, 2.616798, -7.8110037), (-48.840355, 2.616798, -10.381338), (-48.90738, 0, -10.395584), (-48.90738, 0, -10.395584), (-48.840355, 2.616798, -10.381338), (-48.230103, 2.616798, -12.923217), (-48.29629, 0, -12.940952), (-48.29629, 0, -12.940952), (-48.230103, 2.616798, -12.923217), (-47.487656, 2.616798, -15.429675), (-47.552826, 0, -15.45085), (-47.552826, 0, -15.45085), (-47.487656, 2.616798, -15.429675), (-46.615047, 2.616798, -17.89384), (-46.67902, 0, -17.918398), (-46.67902, 0, -17.918398), (-46.615047, 2.616798, -17.89384), (-45.614674, 2.616798, -20.308962), (-45.677273, 0, -20.336832), (-45.677273, 0, -20.336832), (-45.614674, 2.616798, -20.308962), (-44.489273, 2.616798, -22.668417), (-44.550327, 0, -22.699526), (-44.550327, 0, -22.699526), (-44.489273, 2.616798, -22.668417), (-43.24193, 2.616798, -24.965738), (-43.30127, 0, -25), (-43.30127, 0, -25), (-43.24193, 2.616798, -24.965738), (-41.87606, 2.616798, -27.194632), (-41.93353, 0, -27.231953), (-41.93353, 0, -27.231953), (-41.87606, 2.616798, -27.194632), (-40.395412, 2.616798, -29.348986), (-40.45085, 0, -29.389263), (-40.45085, 0, -29.389263), (-40.395412, 2.616798, -29.348986), (-38.804047, 2.616798, -31.422897), (-38.8573, 0, -31.466019), (-38.8573, 0, -31.466019), (-38.804047, 2.616798, -31.422897), (-37.10632, 2.616798, -33.41068), (-37.15724, 0, -33.45653), (-37.15724, 0, -33.45653), (-37.10632, 2.616798, -33.41068), (-35.306885, 2.616798, -35.306885), (-35.35534, 0, -35.35534), (-35.35534, 0, -35.35534), (-35.306885, 2.616798, -35.306885), (-33.41068, 2.616798, -37.10632), (-33.45653, 0, -37.15724), (-33.45653, 0, -37.15724), (-33.41068, 2.616798, -37.10632), (-31.422897, 2.616798, -38.804047), (-31.466019, 0, -38.8573), (-31.466019, 0, -38.8573), (-31.422897, 2.616798, -38.804047), (-29.348986, 2.616798, -40.395412), (-29.389263, 0, -40.45085), (-29.389263, 0, -40.45085), (-29.348986, 2.616798, -40.395412), (-27.194632, 2.616798, -41.87606), (-27.231953, 0, -41.93353), (-27.231953, 0, -41.93353), (-27.194632, 2.616798, -41.87606), (-24.965738, 2.616798, -43.24193), (-25, 0, -43.30127), (-25, 0, -43.30127), (-24.965738, 2.616798, -43.24193), (-22.668417, 2.616798, -44.489273), (-22.699526, 0, -44.550327), (-22.699526, 0, -44.550327), (-22.668417, 2.616798, -44.489273), (-20.308962, 2.616798, -45.614674), (-20.336832, 0, -45.677273), (-20.336832, 0, -45.677273), (-20.308962, 2.616798, -45.614674), (-17.89384, 2.616798, -46.615047), (-17.918398, 0, -46.67902), (-17.918398, 0, -46.67902), (-17.89384, 2.616798, -46.615047), (-15.429675, 2.616798, -47.487656), (-15.45085, 0, -47.552826), (-15.45085, 0, -47.552826), (-15.429675, 2.616798, -47.487656), (-12.923217, 2.616798, -48.230103), (-12.940952, 0, -48.29629), (-12.940952, 0, -48.29629), (-12.923217, 2.616798, -48.230103), (-10.381338, 2.616798, -48.840355), (-10.395584, 0, -48.90738), (-10.395584, 0, -48.90738), (-10.381338, 2.616798, -48.840355), (-7.8110037, 2.616798, -49.31674), (-7.8217235, 0, -49.38442), (-7.8217235, 0, -49.38442), (-7.8110037, 2.616798, -49.31674), (-5.2192607, 2.616798, -49.657948), (-5.2264233, 0, -49.726093), (-5.2264233, 0, -49.726093), (-5.2192607, 2.616798, -49.657948), (-2.6132116, 2.616798, -49.86305), (-2.616798, 0, -49.931477), (-2.616798, 0, -49.931477), (-2.6132116, 2.616798, -49.86305), (-9.172263e-15, 2.616798, -49.931477), (-9.184851e-15, 0, -50), (-9.184851e-15, 0, -50), (-9.172263e-15, 2.616798, -49.931477), (2.6132116, 2.616798, -49.86305), (2.616798, 0, -49.931477), (2.616798, 0, -49.931477), (2.6132116, 2.616798, -49.86305), (5.2192607, 2.616798, -49.657948), (5.2264233, 0, -49.726093), (5.2264233, 0, -49.726093), (5.2192607, 2.616798, -49.657948), (7.8110037, 2.616798, -49.31674), (7.8217235, 0, -49.38442), (7.8217235, 0, -49.38442), (7.8110037, 2.616798, -49.31674), (10.381338, 2.616798, -48.840355), (10.395584, 0, -48.90738), (10.395584, 0, -48.90738), (10.381338, 2.616798, -48.840355), (12.923217, 2.616798, -48.230103), (12.940952, 0, -48.29629), (12.940952, 0, -48.29629), (12.923217, 2.616798, -48.230103), (15.429675, 2.616798, -47.487656), (15.45085, 0, -47.552826), (15.45085, 0, -47.552826), (15.429675, 2.616798, -47.487656), (17.89384, 2.616798, -46.615047), (17.918398, 0, -46.67902), (17.918398, 0, -46.67902), (17.89384, 2.616798, -46.615047), (20.308962, 2.616798, -45.614674), (20.336832, 0, -45.677273), (20.336832, 0, -45.677273), (20.308962, 2.616798, -45.614674), (22.668417, 2.616798, -44.489273), (22.699526, 0, -44.550327), (22.699526, 0, -44.550327), (22.668417, 2.616798, -44.489273), (24.965738, 2.616798, -43.24193), (25, 0, -43.30127), (25, 0, -43.30127), (24.965738, 2.616798, -43.24193), (27.194632, 2.616798, -41.87606), (27.231953, 0, -41.93353), (27.231953, 0, -41.93353), (27.194632, 2.616798, -41.87606), (29.348986, 2.616798, -40.395412), (29.389263, 0, -40.45085), (29.389263, 0, -40.45085), (29.348986, 2.616798, -40.395412), (31.422897, 2.616798, -38.804047), (31.466019, 0, -38.8573), (31.466019, 0, -38.8573), (31.422897, 2.616798, -38.804047), (33.41068, 2.616798, -37.10632), (33.45653, 0, -37.15724), (33.45653, 0, -37.15724), (33.41068, 2.616798, -37.10632), (35.306885, 2.616798, -35.306885), (35.35534, 0, -35.35534), (35.35534, 0, -35.35534), (35.306885, 2.616798, -35.306885), (37.10632, 2.616798, -33.41068), (37.15724, 0, -33.45653), (37.15724, 0, -33.45653), (37.10632, 2.616798, -33.41068), (38.804047, 2.616798, -31.422897), (38.8573, 0, -31.466019), (38.8573, 0, -31.466019), (38.804047, 2.616798, -31.422897), (40.395412, 2.616798, -29.348986), (40.45085, 0, -29.389263), (40.45085, 0, -29.389263), (40.395412, 2.616798, -29.348986), (41.87606, 2.616798, -27.194632), (41.93353, 0, -27.231953), (41.93353, 0, -27.231953), (41.87606, 2.616798, -27.194632), (43.24193, 2.616798, -24.965738), (43.30127, 0, -25), (43.30127, 0, -25), (43.24193, 2.616798, -24.965738), (44.489273, 2.616798, -22.668417), (44.550327, 0, -22.699526), (44.550327, 0, -22.699526), (44.489273, 2.616798, -22.668417), (45.614674, 2.616798, -20.308962), (45.677273, 0, -20.336832), (45.677273, 0, -20.336832), (45.614674, 2.616798, -20.308962), (46.615047, 2.616798, -17.89384), (46.67902, 0, -17.918398), (46.67902, 0, -17.918398), (46.615047, 2.616798, -17.89384), (47.487656, 2.616798, -15.429675), (47.552826, 0, -15.45085), (47.552826, 0, -15.45085), (47.487656, 2.616798, -15.429675), (48.230103, 2.616798, -12.923217), (48.29629, 0, -12.940952), (48.29629, 0, -12.940952), (48.230103, 2.616798, -12.923217), (48.840355, 2.616798, -10.381338), (48.90738, 0, -10.395584), (48.90738, 0, -10.395584), (48.840355, 2.616798, -10.381338), (49.31674, 2.616798, -7.8110037), (49.38442, 0, -7.8217235), (49.38442, 0, -7.8217235), (49.31674, 2.616798, -7.8110037), (49.657948, 2.616798, -5.2192607), (49.726093, 0, -5.2264233), (49.726093, 0, -5.2264233), (49.657948, 2.616798, -5.2192607), (49.86305, 2.616798, -2.6132116), (49.931477, 0, -2.616798), (49.931477, 0, -2.616798), (49.86305, 2.616798, -2.6132116), (49.931477, 2.616798, 0), (50, 0, 0), (49.931477, 2.616798, 0), (49.726093, 5.2264233, 0), (49.657948, 5.2264233, 2.6024628), (49.86305, 2.616798, 2.6132116), (49.86305, 2.616798, 2.6132116), (49.657948, 5.2264233, 2.6024628), (49.45369, 5.2264233, 5.197792), (49.657948, 2.616798, 5.2192607), (49.657948, 2.616798, 5.2192607), (49.45369, 5.2264233, 5.197792), (49.113884, 5.2264233, 7.778875), (49.31674, 2.616798, 7.8110037), (49.31674, 2.616798, 7.8110037), (49.113884, 5.2264233, 7.778875), (48.63946, 5.2264233, 10.338636), (48.840355, 2.616798, 10.381338), (48.840355, 2.616798, 10.381338), (48.63946, 5.2264233, 10.338636), (48.03172, 5.2264233, 12.87006), (48.230103, 2.616798, 12.923217), (48.230103, 2.616798, 12.923217), (48.03172, 5.2264233, 12.87006), (47.292328, 5.2264233, 15.366208), (47.487656, 2.616798, 15.429675), (47.487656, 2.616798, 15.429675), (47.292328, 5.2264233, 15.366208), (46.42331, 5.2264233, 17.820238), (46.615047, 2.616798, 17.89384), (46.615047, 2.616798, 17.89384), (46.42331, 5.2264233, 17.820238), (45.427048, 5.2264233, 20.225426), (45.614674, 2.616798, 20.308962), (45.614674, 2.616798, 20.308962), (45.427048, 5.2264233, 20.225426), (44.306274, 5.2264233, 22.575174), (44.489273, 2.616798, 22.668417), (44.489273, 2.616798, 22.668417), (44.306274, 5.2264233, 22.575174), (43.06406, 5.2264233, 24.863047), (43.24193, 2.616798, 24.965738), (43.24193, 2.616798, 24.965738), (43.06406, 5.2264233, 24.863047), (41.70381, 5.2264233, 27.082773), (41.87606, 2.616798, 27.194632), (41.87606, 2.616798, 27.194632), (41.70381, 5.2264233, 27.082773), (40.229256, 5.2264233, 29.228266), (40.395412, 2.616798, 29.348986), (40.395412, 2.616798, 29.348986), (40.229256, 5.2264233, 29.228266), (38.644432, 5.2264233, 31.293646), (38.804047, 2.616798, 31.422897), (38.804047, 2.616798, 31.422897), (38.644432, 5.2264233, 31.293646), (36.95369, 5.2264233, 33.27325), (37.10632, 2.616798, 33.41068), (37.10632, 2.616798, 33.41068), (36.95369, 5.2264233, 33.27325), (35.16166, 5.2264233, 35.16166), (35.306885, 2.616798, 35.306885), (35.306885, 2.616798, 35.306885), (35.16166, 5.2264233, 35.16166), (33.27325, 5.2264233, 36.95369), (33.41068, 2.616798, 37.10632), (33.41068, 2.616798, 37.10632), (33.27325, 5.2264233, 36.95369), (31.293646, 5.2264233, 38.644432), (31.422897, 2.616798, 38.804047), (31.422897, 2.616798, 38.804047), (31.293646, 5.2264233, 38.644432), (29.228266, 5.2264233, 40.229256), (29.348986, 2.616798, 40.395412), (29.348986, 2.616798, 40.395412), (29.228266, 5.2264233, 40.229256), (27.082773, 5.2264233, 41.70381), (27.194632, 2.616798, 41.87606), (27.194632, 2.616798, 41.87606), (27.082773, 5.2264233, 41.70381), (24.863047, 5.2264233, 43.06406), (24.965738, 2.616798, 43.24193), (24.965738, 2.616798, 43.24193), (24.863047, 5.2264233, 43.06406), (22.575174, 5.2264233, 44.306274), (22.668417, 2.616798, 44.489273), (22.668417, 2.616798, 44.489273), (22.575174, 5.2264233, 44.306274), (20.225426, 5.2264233, 45.427048), (20.308962, 2.616798, 45.614674), (20.308962, 2.616798, 45.614674), (20.225426, 5.2264233, 45.427048), (17.820238, 5.2264233, 46.42331), (17.89384, 2.616798, 46.615047), (17.89384, 2.616798, 46.615047), (17.820238, 5.2264233, 46.42331), (15.366208, 5.2264233, 47.292328), (15.429675, 2.616798, 47.487656), (15.429675, 2.616798, 47.487656), (15.366208, 5.2264233, 47.292328), (12.87006, 5.2264233, 48.03172), (12.923217, 2.616798, 48.230103), (12.923217, 2.616798, 48.230103), (12.87006, 5.2264233, 48.03172), (10.338636, 5.2264233, 48.63946), (10.381338, 2.616798, 48.840355), (10.381338, 2.616798, 48.840355), (10.338636, 5.2264233, 48.63946), (7.778875, 5.2264233, 49.113884), (7.8110037, 2.616798, 49.31674), (7.8110037, 2.616798, 49.31674), (7.778875, 5.2264233, 49.113884), (5.197792, 5.2264233, 49.45369), (5.2192607, 2.616798, 49.657948), (5.2192607, 2.616798, 49.657948), (5.197792, 5.2264233, 49.45369), (2.6024628, 5.2264233, 49.657948), (2.6132116, 2.616798, 49.86305), (2.6132116, 2.616798, 49.86305), (2.6024628, 5.2264233, 49.657948), (3.0448452e-15, 5.2264233, 49.726093), (3.0574211e-15, 2.616798, 49.931477), (3.0574211e-15, 2.616798, 49.931477), (3.0448452e-15, 5.2264233, 49.726093), (-2.6024628, 5.2264233, 49.657948), (-2.6132116, 2.616798, 49.86305), (-2.6132116, 2.616798, 49.86305), (-2.6024628, 5.2264233, 49.657948), (-5.197792, 5.2264233, 49.45369), (-5.2192607, 2.616798, 49.657948), (-5.2192607, 2.616798, 49.657948), (-5.197792, 5.2264233, 49.45369), (-7.778875, 5.2264233, 49.113884), (-7.8110037, 2.616798, 49.31674), (-7.8110037, 2.616798, 49.31674), (-7.778875, 5.2264233, 49.113884), (-10.338636, 5.2264233, 48.63946), (-10.381338, 2.616798, 48.840355), (-10.381338, 2.616798, 48.840355), (-10.338636, 5.2264233, 48.63946), (-12.87006, 5.2264233, 48.03172), (-12.923217, 2.616798, 48.230103), (-12.923217, 2.616798, 48.230103), (-12.87006, 5.2264233, 48.03172), (-15.366208, 5.2264233, 47.292328), (-15.429675, 2.616798, 47.487656), (-15.429675, 2.616798, 47.487656), (-15.366208, 5.2264233, 47.292328), (-17.820238, 5.2264233, 46.42331), (-17.89384, 2.616798, 46.615047), (-17.89384, 2.616798, 46.615047), (-17.820238, 5.2264233, 46.42331), (-20.225426, 5.2264233, 45.427048), (-20.308962, 2.616798, 45.614674), (-20.308962, 2.616798, 45.614674), (-20.225426, 5.2264233, 45.427048), (-22.575174, 5.2264233, 44.306274), (-22.668417, 2.616798, 44.489273), (-22.668417, 2.616798, 44.489273), (-22.575174, 5.2264233, 44.306274), (-24.863047, 5.2264233, 43.06406), (-24.965738, 2.616798, 43.24193), (-24.965738, 2.616798, 43.24193), (-24.863047, 5.2264233, 43.06406), (-27.082773, 5.2264233, 41.70381), (-27.194632, 2.616798, 41.87606), (-27.194632, 2.616798, 41.87606), (-27.082773, 5.2264233, 41.70381), (-29.228266, 5.2264233, 40.229256), (-29.348986, 2.616798, 40.395412), (-29.348986, 2.616798, 40.395412), (-29.228266, 5.2264233, 40.229256), (-31.293646, 5.2264233, 38.644432), (-31.422897, 2.616798, 38.804047), (-31.422897, 2.616798, 38.804047), (-31.293646, 5.2264233, 38.644432), (-33.27325, 5.2264233, 36.95369), (-33.41068, 2.616798, 37.10632), (-33.41068, 2.616798, 37.10632), (-33.27325, 5.2264233, 36.95369), (-35.16166, 5.2264233, 35.16166), (-35.306885, 2.616798, 35.306885), (-35.306885, 2.616798, 35.306885), (-35.16166, 5.2264233, 35.16166), (-36.95369, 5.2264233, 33.27325), (-37.10632, 2.616798, 33.41068), (-37.10632, 2.616798, 33.41068), (-36.95369, 5.2264233, 33.27325), (-38.644432, 5.2264233, 31.293646), (-38.804047, 2.616798, 31.422897), (-38.804047, 2.616798, 31.422897), (-38.644432, 5.2264233, 31.293646), (-40.229256, 5.2264233, 29.228266), (-40.395412, 2.616798, 29.348986), (-40.395412, 2.616798, 29.348986), (-40.229256, 5.2264233, 29.228266), (-41.70381, 5.2264233, 27.082773), (-41.87606, 2.616798, 27.194632), (-41.87606, 2.616798, 27.194632), (-41.70381, 5.2264233, 27.082773), (-43.06406, 5.2264233, 24.863047), (-43.24193, 2.616798, 24.965738), (-43.24193, 2.616798, 24.965738), (-43.06406, 5.2264233, 24.863047), (-44.306274, 5.2264233, 22.575174), (-44.489273, 2.616798, 22.668417), (-44.489273, 2.616798, 22.668417), (-44.306274, 5.2264233, 22.575174), (-45.427048, 5.2264233, 20.225426), (-45.614674, 2.616798, 20.308962), (-45.614674, 2.616798, 20.308962), (-45.427048, 5.2264233, 20.225426), (-46.42331, 5.2264233, 17.820238), (-46.615047, 2.616798, 17.89384), (-46.615047, 2.616798, 17.89384), (-46.42331, 5.2264233, 17.820238), (-47.292328, 5.2264233, 15.366208), (-47.487656, 2.616798, 15.429675), (-47.487656, 2.616798, 15.429675), (-47.292328, 5.2264233, 15.366208), (-48.03172, 5.2264233, 12.87006), (-48.230103, 2.616798, 12.923217), (-48.230103, 2.616798, 12.923217), (-48.03172, 5.2264233, 12.87006), (-48.63946, 5.2264233, 10.338636), (-48.840355, 2.616798, 10.381338), (-48.840355, 2.616798, 10.381338), (-48.63946, 5.2264233, 10.338636), (-49.113884, 5.2264233, 7.778875), (-49.31674, 2.616798, 7.8110037), (-49.31674, 2.616798, 7.8110037), (-49.113884, 5.2264233, 7.778875), (-49.45369, 5.2264233, 5.197792), (-49.657948, 2.616798, 5.2192607), (-49.657948, 2.616798, 5.2192607), (-49.45369, 5.2264233, 5.197792), (-49.657948, 5.2264233, 2.6024628), (-49.86305, 2.616798, 2.6132116), (-49.86305, 2.616798, 2.6132116), (-49.657948, 5.2264233, 2.6024628), (-49.726093, 5.2264233, 6.0896904e-15), (-49.931477, 2.616798, 6.1148422e-15), (-49.931477, 2.616798, 6.1148422e-15), (-49.726093, 5.2264233, 6.0896904e-15), (-49.657948, 5.2264233, -2.6024628), (-49.86305, 2.616798, -2.6132116), (-49.86305, 2.616798, -2.6132116), (-49.657948, 5.2264233, -2.6024628), (-49.45369, 5.2264233, -5.197792), (-49.657948, 2.616798, -5.2192607), (-49.657948, 2.616798, -5.2192607), (-49.45369, 5.2264233, -5.197792), (-49.113884, 5.2264233, -7.778875), (-49.31674, 2.616798, -7.8110037), (-49.31674, 2.616798, -7.8110037), (-49.113884, 5.2264233, -7.778875), (-48.63946, 5.2264233, -10.338636), (-48.840355, 2.616798, -10.381338), (-48.840355, 2.616798, -10.381338), (-48.63946, 5.2264233, -10.338636), (-48.03172, 5.2264233, -12.87006), (-48.230103, 2.616798, -12.923217), (-48.230103, 2.616798, -12.923217), (-48.03172, 5.2264233, -12.87006), (-47.292328, 5.2264233, -15.366208), (-47.487656, 2.616798, -15.429675), (-47.487656, 2.616798, -15.429675), (-47.292328, 5.2264233, -15.366208), (-46.42331, 5.2264233, -17.820238), (-46.615047, 2.616798, -17.89384), (-46.615047, 2.616798, -17.89384), (-46.42331, 5.2264233, -17.820238), (-45.427048, 5.2264233, -20.225426), (-45.614674, 2.616798, -20.308962), (-45.614674, 2.616798, -20.308962), (-45.427048, 5.2264233, -20.225426), (-44.306274, 5.2264233, -22.575174), (-44.489273, 2.616798, -22.668417), (-44.489273, 2.616798, -22.668417), (-44.306274, 5.2264233, -22.575174), (-43.06406, 5.2264233, -24.863047), (-43.24193, 2.616798, -24.965738), (-43.24193, 2.616798, -24.965738), (-43.06406, 5.2264233, -24.863047), (-41.70381, 5.2264233, -27.082773), (-41.87606, 2.616798, -27.194632), (-41.87606, 2.616798, -27.194632), (-41.70381, 5.2264233, -27.082773), (-40.229256, 5.2264233, -29.228266), (-40.395412, 2.616798, -29.348986), (-40.395412, 2.616798, -29.348986), (-40.229256, 5.2264233, -29.228266), (-38.644432, 5.2264233, -31.293646), (-38.804047, 2.616798, -31.422897), (-38.804047, 2.616798, -31.422897), (-38.644432, 5.2264233, -31.293646), (-36.95369, 5.2264233, -33.27325), (-37.10632, 2.616798, -33.41068), (-37.10632, 2.616798, -33.41068), (-36.95369, 5.2264233, -33.27325), (-35.16166, 5.2264233, -35.16166), (-35.306885, 2.616798, -35.306885), (-35.306885, 2.616798, -35.306885), (-35.16166, 5.2264233, -35.16166), (-33.27325, 5.2264233, -36.95369), (-33.41068, 2.616798, -37.10632), (-33.41068, 2.616798, -37.10632), (-33.27325, 5.2264233, -36.95369), (-31.293646, 5.2264233, -38.644432), (-31.422897, 2.616798, -38.804047), (-31.422897, 2.616798, -38.804047), (-31.293646, 5.2264233, -38.644432), (-29.228266, 5.2264233, -40.229256), (-29.348986, 2.616798, -40.395412), (-29.348986, 2.616798, -40.395412), (-29.228266, 5.2264233, -40.229256), (-27.082773, 5.2264233, -41.70381), (-27.194632, 2.616798, -41.87606), (-27.194632, 2.616798, -41.87606), (-27.082773, 5.2264233, -41.70381), (-24.863047, 5.2264233, -43.06406), (-24.965738, 2.616798, -43.24193), (-24.965738, 2.616798, -43.24193), (-24.863047, 5.2264233, -43.06406), (-22.575174, 5.2264233, -44.306274), (-22.668417, 2.616798, -44.489273), (-22.668417, 2.616798, -44.489273), (-22.575174, 5.2264233, -44.306274), (-20.225426, 5.2264233, -45.427048), (-20.308962, 2.616798, -45.614674), (-20.308962, 2.616798, -45.614674), (-20.225426, 5.2264233, -45.427048), (-17.820238, 5.2264233, -46.42331), (-17.89384, 2.616798, -46.615047), (-17.89384, 2.616798, -46.615047), (-17.820238, 5.2264233, -46.42331), (-15.366208, 5.2264233, -47.292328), (-15.429675, 2.616798, -47.487656), (-15.429675, 2.616798, -47.487656), (-15.366208, 5.2264233, -47.292328), (-12.87006, 5.2264233, -48.03172), (-12.923217, 2.616798, -48.230103), (-12.923217, 2.616798, -48.230103), (-12.87006, 5.2264233, -48.03172), (-10.338636, 5.2264233, -48.63946), (-10.381338, 2.616798, -48.840355), (-10.381338, 2.616798, -48.840355), (-10.338636, 5.2264233, -48.63946), (-7.778875, 5.2264233, -49.113884), (-7.8110037, 2.616798, -49.31674), (-7.8110037, 2.616798, -49.31674), (-7.778875, 5.2264233, -49.113884), (-5.197792, 5.2264233, -49.45369), (-5.2192607, 2.616798, -49.657948), (-5.2192607, 2.616798, -49.657948), (-5.197792, 5.2264233, -49.45369), (-2.6024628, 5.2264233, -49.657948), (-2.6132116, 2.616798, -49.86305), (-2.6132116, 2.616798, -49.86305), (-2.6024628, 5.2264233, -49.657948), (-9.1345354e-15, 5.2264233, -49.726093), (-9.172263e-15, 2.616798, -49.931477), (-9.172263e-15, 2.616798, -49.931477), (-9.1345354e-15, 5.2264233, -49.726093), (2.6024628, 5.2264233, -49.657948), (2.6132116, 2.616798, -49.86305), (2.6132116, 2.616798, -49.86305), (2.6024628, 5.2264233, -49.657948), (5.197792, 5.2264233, -49.45369), (5.2192607, 2.616798, -49.657948), (5.2192607, 2.616798, -49.657948), (5.197792, 5.2264233, -49.45369), (7.778875, 5.2264233, -49.113884), (7.8110037, 2.616798, -49.31674), (7.8110037, 2.616798, -49.31674), (7.778875, 5.2264233, -49.113884), (10.338636, 5.2264233, -48.63946), (10.381338, 2.616798, -48.840355), (10.381338, 2.616798, -48.840355), (10.338636, 5.2264233, -48.63946), (12.87006, 5.2264233, -48.03172), (12.923217, 2.616798, -48.230103), (12.923217, 2.616798, -48.230103), (12.87006, 5.2264233, -48.03172), (15.366208, 5.2264233, -47.292328), (15.429675, 2.616798, -47.487656), (15.429675, 2.616798, -47.487656), (15.366208, 5.2264233, -47.292328), (17.820238, 5.2264233, -46.42331), (17.89384, 2.616798, -46.615047), (17.89384, 2.616798, -46.615047), (17.820238, 5.2264233, -46.42331), (20.225426, 5.2264233, -45.427048), (20.308962, 2.616798, -45.614674), (20.308962, 2.616798, -45.614674), (20.225426, 5.2264233, -45.427048), (22.575174, 5.2264233, -44.306274), (22.668417, 2.616798, -44.489273), (22.668417, 2.616798, -44.489273), (22.575174, 5.2264233, -44.306274), (24.863047, 5.2264233, -43.06406), (24.965738, 2.616798, -43.24193), (24.965738, 2.616798, -43.24193), (24.863047, 5.2264233, -43.06406), (27.082773, 5.2264233, -41.70381), (27.194632, 2.616798, -41.87606), (27.194632, 2.616798, -41.87606), (27.082773, 5.2264233, -41.70381), (29.228266, 5.2264233, -40.229256), (29.348986, 2.616798, -40.395412), (29.348986, 2.616798, -40.395412), (29.228266, 5.2264233, -40.229256), (31.293646, 5.2264233, -38.644432), (31.422897, 2.616798, -38.804047), (31.422897, 2.616798, -38.804047), (31.293646, 5.2264233, -38.644432), (33.27325, 5.2264233, -36.95369), (33.41068, 2.616798, -37.10632), (33.41068, 2.616798, -37.10632), (33.27325, 5.2264233, -36.95369), (35.16166, 5.2264233, -35.16166), (35.306885, 2.616798, -35.306885), (35.306885, 2.616798, -35.306885), (35.16166, 5.2264233, -35.16166), (36.95369, 5.2264233, -33.27325), (37.10632, 2.616798, -33.41068), (37.10632, 2.616798, -33.41068), (36.95369, 5.2264233, -33.27325), (38.644432, 5.2264233, -31.293646), (38.804047, 2.616798, -31.422897), (38.804047, 2.616798, -31.422897), (38.644432, 5.2264233, -31.293646), (40.229256, 5.2264233, -29.228266), (40.395412, 2.616798, -29.348986), (40.395412, 2.616798, -29.348986), (40.229256, 5.2264233, -29.228266), (41.70381, 5.2264233, -27.082773), (41.87606, 2.616798, -27.194632), (41.87606, 2.616798, -27.194632), (41.70381, 5.2264233, -27.082773), (43.06406, 5.2264233, -24.863047), (43.24193, 2.616798, -24.965738), (43.24193, 2.616798, -24.965738), (43.06406, 5.2264233, -24.863047), (44.306274, 5.2264233, -22.575174), (44.489273, 2.616798, -22.668417), (44.489273, 2.616798, -22.668417), (44.306274, 5.2264233, -22.575174), (45.427048, 5.2264233, -20.225426), (45.614674, 2.616798, -20.308962), (45.614674, 2.616798, -20.308962), (45.427048, 5.2264233, -20.225426), (46.42331, 5.2264233, -17.820238), (46.615047, 2.616798, -17.89384), (46.615047, 2.616798, -17.89384), (46.42331, 5.2264233, -17.820238), (47.292328, 5.2264233, -15.366208), (47.487656, 2.616798, -15.429675), (47.487656, 2.616798, -15.429675), (47.292328, 5.2264233, -15.366208), (48.03172, 5.2264233, -12.87006), (48.230103, 2.616798, -12.923217), (48.230103, 2.616798, -12.923217), (48.03172, 5.2264233, -12.87006), (48.63946, 5.2264233, -10.338636), (48.840355, 2.616798, -10.381338), (48.840355, 2.616798, -10.381338), (48.63946, 5.2264233, -10.338636), (49.113884, 5.2264233, -7.778875), (49.31674, 2.616798, -7.8110037), (49.31674, 2.616798, -7.8110037), (49.113884, 5.2264233, -7.778875), (49.45369, 5.2264233, -5.197792), (49.657948, 2.616798, -5.2192607), (49.657948, 2.616798, -5.2192607), (49.45369, 5.2264233, -5.197792), (49.657948, 5.2264233, -2.6024628), (49.86305, 2.616798, -2.6132116), (49.86305, 2.616798, -2.6132116), (49.657948, 5.2264233, -2.6024628), (49.726093, 5.2264233, 0), (49.931477, 2.616798, 0), (49.726093, 5.2264233, 0), (49.38442, 7.8217235, 0), (49.31674, 7.8217235, 2.5845807), (49.657948, 5.2264233, 2.6024628), (49.657948, 5.2264233, 2.6024628), (49.31674, 7.8217235, 2.5845807), (49.113884, 7.8217235, 5.1620774), (49.45369, 5.2264233, 5.197792), (49.45369, 5.2264233, 5.197792), (49.113884, 7.8217235, 5.1620774), (48.776413, 7.8217235, 7.725425), (49.113884, 5.2264233, 7.778875), (49.113884, 5.2264233, 7.778875), (48.776413, 7.8217235, 7.725425), (48.30525, 7.8217235, 10.267597), (48.63946, 5.2264233, 10.338636), (48.63946, 5.2264233, 10.338636), (48.30525, 7.8217235, 10.267597), (47.701683, 7.8217235, 12.781628), (48.03172, 5.2264233, 12.87006), (48.03172, 5.2264233, 12.87006), (47.701683, 7.8217235, 12.781628), (46.967373, 7.8217235, 15.260624), (47.292328, 5.2264233, 15.366208), (47.292328, 5.2264233, 15.366208), (46.967373, 7.8217235, 15.260624), (46.104324, 7.8217235, 17.697792), (46.42331, 5.2264233, 17.820238), (46.42331, 5.2264233, 17.820238), (46.104324, 7.8217235, 17.697792), (45.11491, 7.8217235, 20.086452), (45.427048, 5.2264233, 20.225426), (45.427048, 5.2264233, 20.225426), (45.11491, 7.8217235, 20.086452), (44.00184, 7.8217235, 22.420055), (44.306274, 5.2264233, 22.575174), (44.306274, 5.2264233, 22.575174), (44.00184, 7.8217235, 22.420055), (42.768158, 7.8217235, 24.69221), (43.06406, 5.2264233, 24.863047), (43.06406, 5.2264233, 24.863047), (42.768158, 7.8217235, 24.69221), (41.417255, 7.8217235, 26.89668), (41.70381, 5.2264233, 27.082773), (41.70381, 5.2264233, 27.082773), (41.417255, 7.8217235, 26.89668), (39.95283, 7.8217235, 29.027431), (40.229256, 5.2264233, 29.228266), (40.229256, 5.2264233, 29.228266), (39.95283, 7.8217235, 29.027431), (38.3789, 7.8217235, 31.07862), (38.644432, 5.2264233, 31.293646), (38.644432, 5.2264233, 31.293646), (38.3789, 7.8217235, 31.07862), (36.699776, 7.8217235, 33.044624), (36.95369, 5.2264233, 33.27325), (36.95369, 5.2264233, 33.27325), (36.699776, 7.8217235, 33.044624), (34.920055, 7.8217235, 34.920055), (35.16166, 5.2264233, 35.16166), (35.16166, 5.2264233, 35.16166), (34.920055, 7.8217235, 34.920055), (33.044624, 7.8217235, 36.699776), (33.27325, 5.2264233, 36.95369), (33.27325, 5.2264233, 36.95369), (33.044624, 7.8217235, 36.699776), (31.07862, 7.8217235, 38.3789), (31.293646, 5.2264233, 38.644432), (31.293646, 5.2264233, 38.644432), (31.07862, 7.8217235, 38.3789), (29.027431, 7.8217235, 39.95283), (29.228266, 5.2264233, 40.229256), (29.228266, 5.2264233, 40.229256), (29.027431, 7.8217235, 39.95283), (26.89668, 7.8217235, 41.417255), (27.082773, 5.2264233, 41.70381), (27.082773, 5.2264233, 41.70381), (26.89668, 7.8217235, 41.417255), (24.69221, 7.8217235, 42.768158), (24.863047, 5.2264233, 43.06406), (24.863047, 5.2264233, 43.06406), (24.69221, 7.8217235, 42.768158), (22.420055, 7.8217235, 44.00184), (22.575174, 5.2264233, 44.306274), (22.575174, 5.2264233, 44.306274), (22.420055, 7.8217235, 44.00184), (20.086452, 7.8217235, 45.11491), (20.225426, 5.2264233, 45.427048), (20.225426, 5.2264233, 45.427048), (20.086452, 7.8217235, 45.11491), (17.697792, 7.8217235, 46.104324), (17.820238, 5.2264233, 46.42331), (17.820238, 5.2264233, 46.42331), (17.697792, 7.8217235, 46.104324), (15.260624, 7.8217235, 46.967373), (15.366208, 5.2264233, 47.292328), (15.366208, 5.2264233, 47.292328), (15.260624, 7.8217235, 46.967373), (12.781628, 7.8217235, 47.701683), (12.87006, 5.2264233, 48.03172), (12.87006, 5.2264233, 48.03172), (12.781628, 7.8217235, 47.701683), (10.267597, 7.8217235, 48.30525), (10.338636, 5.2264233, 48.63946), (10.338636, 5.2264233, 48.63946), (10.267597, 7.8217235, 48.30525), (7.725425, 7.8217235, 48.776413), (7.778875, 5.2264233, 49.113884), (7.778875, 5.2264233, 49.113884), (7.725425, 7.8217235, 48.776413), (5.1620774, 7.8217235, 49.113884), (5.197792, 5.2264233, 49.45369), (5.197792, 5.2264233, 49.45369), (5.1620774, 7.8217235, 49.113884), (2.5845807, 7.8217235, 49.31674), (2.6024628, 5.2264233, 49.657948), (2.6024628, 5.2264233, 49.657948), (2.5845807, 7.8217235, 49.31674), (3.0239235e-15, 7.8217235, 49.38442), (3.0448452e-15, 5.2264233, 49.726093), (3.0448452e-15, 5.2264233, 49.726093), (3.0239235e-15, 7.8217235, 49.38442), (-2.5845807, 7.8217235, 49.31674), (-2.6024628, 5.2264233, 49.657948), (-2.6024628, 5.2264233, 49.657948), (-2.5845807, 7.8217235, 49.31674), (-5.1620774, 7.8217235, 49.113884), (-5.197792, 5.2264233, 49.45369), (-5.197792, 5.2264233, 49.45369), (-5.1620774, 7.8217235, 49.113884), (-7.725425, 7.8217235, 48.776413), (-7.778875, 5.2264233, 49.113884), (-7.778875, 5.2264233, 49.113884), (-7.725425, 7.8217235, 48.776413), (-10.267597, 7.8217235, 48.30525), (-10.338636, 5.2264233, 48.63946), (-10.338636, 5.2264233, 48.63946), (-10.267597, 7.8217235, 48.30525), (-12.781628, 7.8217235, 47.701683), (-12.87006, 5.2264233, 48.03172), (-12.87006, 5.2264233, 48.03172), (-12.781628, 7.8217235, 47.701683), (-15.260624, 7.8217235, 46.967373), (-15.366208, 5.2264233, 47.292328), (-15.366208, 5.2264233, 47.292328), (-15.260624, 7.8217235, 46.967373), (-17.697792, 7.8217235, 46.104324), (-17.820238, 5.2264233, 46.42331), (-17.820238, 5.2264233, 46.42331), (-17.697792, 7.8217235, 46.104324), (-20.086452, 7.8217235, 45.11491), (-20.225426, 5.2264233, 45.427048), (-20.225426, 5.2264233, 45.427048), (-20.086452, 7.8217235, 45.11491), (-22.420055, 7.8217235, 44.00184), (-22.575174, 5.2264233, 44.306274), (-22.575174, 5.2264233, 44.306274), (-22.420055, 7.8217235, 44.00184), (-24.69221, 7.8217235, 42.768158), (-24.863047, 5.2264233, 43.06406), (-24.863047, 5.2264233, 43.06406), (-24.69221, 7.8217235, 42.768158), (-26.89668, 7.8217235, 41.417255), (-27.082773, 5.2264233, 41.70381), (-27.082773, 5.2264233, 41.70381), (-26.89668, 7.8217235, 41.417255), (-29.027431, 7.8217235, 39.95283), (-29.228266, 5.2264233, 40.229256), (-29.228266, 5.2264233, 40.229256), (-29.027431, 7.8217235, 39.95283), (-31.07862, 7.8217235, 38.3789), (-31.293646, 5.2264233, 38.644432), (-31.293646, 5.2264233, 38.644432), (-31.07862, 7.8217235, 38.3789), (-33.044624, 7.8217235, 36.699776), (-33.27325, 5.2264233, 36.95369), (-33.27325, 5.2264233, 36.95369), (-33.044624, 7.8217235, 36.699776), (-34.920055, 7.8217235, 34.920055), (-35.16166, 5.2264233, 35.16166), (-35.16166, 5.2264233, 35.16166), (-34.920055, 7.8217235, 34.920055), (-36.699776, 7.8217235, 33.044624), (-36.95369, 5.2264233, 33.27325), (-36.95369, 5.2264233, 33.27325), (-36.699776, 7.8217235, 33.044624), (-38.3789, 7.8217235, 31.07862), (-38.644432, 5.2264233, 31.293646), (-38.644432, 5.2264233, 31.293646), (-38.3789, 7.8217235, 31.07862), (-39.95283, 7.8217235, 29.027431), (-40.229256, 5.2264233, 29.228266), (-40.229256, 5.2264233, 29.228266), (-39.95283, 7.8217235, 29.027431), (-41.417255, 7.8217235, 26.89668), (-41.70381, 5.2264233, 27.082773), (-41.70381, 5.2264233, 27.082773), (-41.417255, 7.8217235, 26.89668), (-42.768158, 7.8217235, 24.69221), (-43.06406, 5.2264233, 24.863047), (-43.06406, 5.2264233, 24.863047), (-42.768158, 7.8217235, 24.69221), (-44.00184, 7.8217235, 22.420055), (-44.306274, 5.2264233, 22.575174), (-44.306274, 5.2264233, 22.575174), (-44.00184, 7.8217235, 22.420055), (-45.11491, 7.8217235, 20.086452), (-45.427048, 5.2264233, 20.225426), (-45.427048, 5.2264233, 20.225426), (-45.11491, 7.8217235, 20.086452), (-46.104324, 7.8217235, 17.697792), (-46.42331, 5.2264233, 17.820238), (-46.42331, 5.2264233, 17.820238), (-46.104324, 7.8217235, 17.697792), (-46.967373, 7.8217235, 15.260624), (-47.292328, 5.2264233, 15.366208), (-47.292328, 5.2264233, 15.366208), (-46.967373, 7.8217235, 15.260624), (-47.701683, 7.8217235, 12.781628), (-48.03172, 5.2264233, 12.87006), (-48.03172, 5.2264233, 12.87006), (-47.701683, 7.8217235, 12.781628), (-48.30525, 7.8217235, 10.267597), (-48.63946, 5.2264233, 10.338636), (-48.63946, 5.2264233, 10.338636), (-48.30525, 7.8217235, 10.267597), (-48.776413, 7.8217235, 7.725425), (-49.113884, 5.2264233, 7.778875), (-49.113884, 5.2264233, 7.778875), (-48.776413, 7.8217235, 7.725425), (-49.113884, 7.8217235, 5.1620774), (-49.45369, 5.2264233, 5.197792), (-49.45369, 5.2264233, 5.197792), (-49.113884, 7.8217235, 5.1620774), (-49.31674, 7.8217235, 2.5845807), (-49.657948, 5.2264233, 2.6024628), (-49.657948, 5.2264233, 2.6024628), (-49.31674, 7.8217235, 2.5845807), (-49.38442, 7.8217235, 6.047847e-15), (-49.726093, 5.2264233, 6.0896904e-15), (-49.726093, 5.2264233, 6.0896904e-15), (-49.38442, 7.8217235, 6.047847e-15), (-49.31674, 7.8217235, -2.5845807), (-49.657948, 5.2264233, -2.6024628), (-49.657948, 5.2264233, -2.6024628), (-49.31674, 7.8217235, -2.5845807), (-49.113884, 7.8217235, -5.1620774), (-49.45369, 5.2264233, -5.197792), (-49.45369, 5.2264233, -5.197792), (-49.113884, 7.8217235, -5.1620774), (-48.776413, 7.8217235, -7.725425), (-49.113884, 5.2264233, -7.778875), (-49.113884, 5.2264233, -7.778875), (-48.776413, 7.8217235, -7.725425), (-48.30525, 7.8217235, -10.267597), (-48.63946, 5.2264233, -10.338636), (-48.63946, 5.2264233, -10.338636), (-48.30525, 7.8217235, -10.267597), (-47.701683, 7.8217235, -12.781628), (-48.03172, 5.2264233, -12.87006), (-48.03172, 5.2264233, -12.87006), (-47.701683, 7.8217235, -12.781628), (-46.967373, 7.8217235, -15.260624), (-47.292328, 5.2264233, -15.366208), (-47.292328, 5.2264233, -15.366208), (-46.967373, 7.8217235, -15.260624), (-46.104324, 7.8217235, -17.697792), (-46.42331, 5.2264233, -17.820238), (-46.42331, 5.2264233, -17.820238), (-46.104324, 7.8217235, -17.697792), (-45.11491, 7.8217235, -20.086452), (-45.427048, 5.2264233, -20.225426), (-45.427048, 5.2264233, -20.225426), (-45.11491, 7.8217235, -20.086452), (-44.00184, 7.8217235, -22.420055), (-44.306274, 5.2264233, -22.575174), (-44.306274, 5.2264233, -22.575174), (-44.00184, 7.8217235, -22.420055), (-42.768158, 7.8217235, -24.69221), (-43.06406, 5.2264233, -24.863047), (-43.06406, 5.2264233, -24.863047), (-42.768158, 7.8217235, -24.69221), (-41.417255, 7.8217235, -26.89668), (-41.70381, 5.2264233, -27.082773), (-41.70381, 5.2264233, -27.082773), (-41.417255, 7.8217235, -26.89668), (-39.95283, 7.8217235, -29.027431), (-40.229256, 5.2264233, -29.228266), (-40.229256, 5.2264233, -29.228266), (-39.95283, 7.8217235, -29.027431), (-38.3789, 7.8217235, -31.07862), (-38.644432, 5.2264233, -31.293646), (-38.644432, 5.2264233, -31.293646), (-38.3789, 7.8217235, -31.07862), (-36.699776, 7.8217235, -33.044624), (-36.95369, 5.2264233, -33.27325), (-36.95369, 5.2264233, -33.27325), (-36.699776, 7.8217235, -33.044624), (-34.920055, 7.8217235, -34.920055), (-35.16166, 5.2264233, -35.16166), (-35.16166, 5.2264233, -35.16166), (-34.920055, 7.8217235, -34.920055), (-33.044624, 7.8217235, -36.699776), (-33.27325, 5.2264233, -36.95369), (-33.27325, 5.2264233, -36.95369), (-33.044624, 7.8217235, -36.699776), (-31.07862, 7.8217235, -38.3789), (-31.293646, 5.2264233, -38.644432), (-31.293646, 5.2264233, -38.644432), (-31.07862, 7.8217235, -38.3789), (-29.027431, 7.8217235, -39.95283), (-29.228266, 5.2264233, -40.229256), (-29.228266, 5.2264233, -40.229256), (-29.027431, 7.8217235, -39.95283), (-26.89668, 7.8217235, -41.417255), (-27.082773, 5.2264233, -41.70381), (-27.082773, 5.2264233, -41.70381), (-26.89668, 7.8217235, -41.417255), (-24.69221, 7.8217235, -42.768158), (-24.863047, 5.2264233, -43.06406), (-24.863047, 5.2264233, -43.06406), (-24.69221, 7.8217235, -42.768158), (-22.420055, 7.8217235, -44.00184), (-22.575174, 5.2264233, -44.306274), (-22.575174, 5.2264233, -44.306274), (-22.420055, 7.8217235, -44.00184), (-20.086452, 7.8217235, -45.11491), (-20.225426, 5.2264233, -45.427048), (-20.225426, 5.2264233, -45.427048), (-20.086452, 7.8217235, -45.11491), (-17.697792, 7.8217235, -46.104324), (-17.820238, 5.2264233, -46.42331), (-17.820238, 5.2264233, -46.42331), (-17.697792, 7.8217235, -46.104324), (-15.260624, 7.8217235, -46.967373), (-15.366208, 5.2264233, -47.292328), (-15.366208, 5.2264233, -47.292328), (-15.260624, 7.8217235, -46.967373), (-12.781628, 7.8217235, -47.701683), (-12.87006, 5.2264233, -48.03172), (-12.87006, 5.2264233, -48.03172), (-12.781628, 7.8217235, -47.701683), (-10.267597, 7.8217235, -48.30525), (-10.338636, 5.2264233, -48.63946), (-10.338636, 5.2264233, -48.63946), (-10.267597, 7.8217235, -48.30525), (-7.725425, 7.8217235, -48.776413), (-7.778875, 5.2264233, -49.113884), (-7.778875, 5.2264233, -49.113884), (-7.725425, 7.8217235, -48.776413), (-5.1620774, 7.8217235, -49.113884), (-5.197792, 5.2264233, -49.45369), (-5.197792, 5.2264233, -49.45369), (-5.1620774, 7.8217235, -49.113884), (-2.5845807, 7.8217235, -49.31674), (-2.6024628, 5.2264233, -49.657948), (-2.6024628, 5.2264233, -49.657948), (-2.5845807, 7.8217235, -49.31674), (-9.07177e-15, 7.8217235, -49.38442), (-9.1345354e-15, 5.2264233, -49.726093), (-9.1345354e-15, 5.2264233, -49.726093), (-9.07177e-15, 7.8217235, -49.38442), (2.5845807, 7.8217235, -49.31674), (2.6024628, 5.2264233, -49.657948), (2.6024628, 5.2264233, -49.657948), (2.5845807, 7.8217235, -49.31674), (5.1620774, 7.8217235, -49.113884), (5.197792, 5.2264233, -49.45369), (5.197792, 5.2264233, -49.45369), (5.1620774, 7.8217235, -49.113884), (7.725425, 7.8217235, -48.776413), (7.778875, 5.2264233, -49.113884), (7.778875, 5.2264233, -49.113884), (7.725425, 7.8217235, -48.776413), (10.267597, 7.8217235, -48.30525), (10.338636, 5.2264233, -48.63946), (10.338636, 5.2264233, -48.63946), (10.267597, 7.8217235, -48.30525), (12.781628, 7.8217235, -47.701683), (12.87006, 5.2264233, -48.03172), (12.87006, 5.2264233, -48.03172), (12.781628, 7.8217235, -47.701683), (15.260624, 7.8217235, -46.967373), (15.366208, 5.2264233, -47.292328), (15.366208, 5.2264233, -47.292328), (15.260624, 7.8217235, -46.967373), (17.697792, 7.8217235, -46.104324), (17.820238, 5.2264233, -46.42331), (17.820238, 5.2264233, -46.42331), (17.697792, 7.8217235, -46.104324), (20.086452, 7.8217235, -45.11491), (20.225426, 5.2264233, -45.427048), (20.225426, 5.2264233, -45.427048), (20.086452, 7.8217235, -45.11491), (22.420055, 7.8217235, -44.00184), (22.575174, 5.2264233, -44.306274), (22.575174, 5.2264233, -44.306274), (22.420055, 7.8217235, -44.00184), (24.69221, 7.8217235, -42.768158), (24.863047, 5.2264233, -43.06406), (24.863047, 5.2264233, -43.06406), (24.69221, 7.8217235, -42.768158), (26.89668, 7.8217235, -41.417255), (27.082773, 5.2264233, -41.70381), (27.082773, 5.2264233, -41.70381), (26.89668, 7.8217235, -41.417255), (29.027431, 7.8217235, -39.95283), (29.228266, 5.2264233, -40.229256), (29.228266, 5.2264233, -40.229256), (29.027431, 7.8217235, -39.95283), (31.07862, 7.8217235, -38.3789), (31.293646, 5.2264233, -38.644432), (31.293646, 5.2264233, -38.644432), (31.07862, 7.8217235, -38.3789), (33.044624, 7.8217235, -36.699776), (33.27325, 5.2264233, -36.95369), (33.27325, 5.2264233, -36.95369), (33.044624, 7.8217235, -36.699776), (34.920055, 7.8217235, -34.920055), (35.16166, 5.2264233, -35.16166), (35.16166, 5.2264233, -35.16166), (34.920055, 7.8217235, -34.920055), (36.699776, 7.8217235, -33.044624), (36.95369, 5.2264233, -33.27325), (36.95369, 5.2264233, -33.27325), (36.699776, 7.8217235, -33.044624), (38.3789, 7.8217235, -31.07862), (38.644432, 5.2264233, -31.293646), (38.644432, 5.2264233, -31.293646), (38.3789, 7.8217235, -31.07862), (39.95283, 7.8217235, -29.027431), (40.229256, 5.2264233, -29.228266), (40.229256, 5.2264233, -29.228266), (39.95283, 7.8217235, -29.027431), (41.417255, 7.8217235, -26.89668), (41.70381, 5.2264233, -27.082773), (41.70381, 5.2264233, -27.082773), (41.417255, 7.8217235, -26.89668), (42.768158, 7.8217235, -24.69221), (43.06406, 5.2264233, -24.863047), (43.06406, 5.2264233, -24.863047), (42.768158, 7.8217235, -24.69221), (44.00184, 7.8217235, -22.420055), (44.306274, 5.2264233, -22.575174), (44.306274, 5.2264233, -22.575174), (44.00184, 7.8217235, -22.420055), (45.11491, 7.8217235, -20.086452), (45.427048, 5.2264233, -20.225426), (45.427048, 5.2264233, -20.225426), (45.11491, 7.8217235, -20.086452), (46.104324, 7.8217235, -17.697792), (46.42331, 5.2264233, -17.820238), (46.42331, 5.2264233, -17.820238), (46.104324, 7.8217235, -17.697792), (46.967373, 7.8217235, -15.260624), (47.292328, 5.2264233, -15.366208), (47.292328, 5.2264233, -15.366208), (46.967373, 7.8217235, -15.260624), (47.701683, 7.8217235, -12.781628), (48.03172, 5.2264233, -12.87006), (48.03172, 5.2264233, -12.87006), (47.701683, 7.8217235, -12.781628), (48.30525, 7.8217235, -10.267597), (48.63946, 5.2264233, -10.338636), (48.63946, 5.2264233, -10.338636), (48.30525, 7.8217235, -10.267597), (48.776413, 7.8217235, -7.725425), (49.113884, 5.2264233, -7.778875), (49.113884, 5.2264233, -7.778875), (48.776413, 7.8217235, -7.725425), (49.113884, 7.8217235, -5.1620774), (49.45369, 5.2264233, -5.197792), (49.45369, 5.2264233, -5.197792), (49.113884, 7.8217235, -5.1620774), (49.31674, 7.8217235, -2.5845807), (49.657948, 5.2264233, -2.6024628), (49.657948, 5.2264233, -2.6024628), (49.31674, 7.8217235, -2.5845807), (49.38442, 7.8217235, 0), (49.726093, 5.2264233, 0), (49.38442, 7.8217235, 0), (48.90738, 10.395584, 0), (48.840355, 10.395584, 2.5596144), (49.31674, 7.8217235, 2.5845807), (49.31674, 7.8217235, 2.5845807), (48.840355, 10.395584, 2.5596144), (48.63946, 10.395584, 5.112213), (49.113884, 7.8217235, 5.1620774), (49.113884, 7.8217235, 5.1620774), (48.63946, 10.395584, 5.112213), (48.30525, 10.395584, 7.6507998), (48.776413, 7.8217235, 7.725425), (48.776413, 7.8217235, 7.725425), (48.30525, 10.395584, 7.6507998), (47.83864, 10.395584, 10.168416), (48.30525, 7.8217235, 10.267597), (48.30525, 7.8217235, 10.267597), (47.83864, 10.395584, 10.168416), (47.240902, 10.395584, 12.658161), (47.701683, 7.8217235, 12.781628), (47.701683, 7.8217235, 12.781628), (47.240902, 10.395584, 12.658161), (46.513683, 10.395584, 15.113212), (46.967373, 7.8217235, 15.260624), (46.967373, 7.8217235, 15.260624), (46.513683, 10.395584, 15.113212), (45.658974, 10.395584, 17.526838), (46.104324, 7.8217235, 17.697792), (46.104324, 7.8217235, 17.697792), (45.658974, 10.395584, 17.526838), (44.679115, 10.395584, 19.892424), (45.11491, 7.8217235, 20.086452), (45.11491, 7.8217235, 20.086452), (44.679115, 10.395584, 19.892424), (43.576794, 10.395584, 22.203485), (44.00184, 7.8217235, 22.420055), (44.00184, 7.8217235, 22.420055), (43.576794, 10.395584, 22.203485), (42.355034, 10.395584, 24.45369), (42.768158, 7.8217235, 24.69221), (42.768158, 7.8217235, 24.69221), (42.355034, 10.395584, 24.45369), (41.01718, 10.395584, 26.636868), (41.417255, 7.8217235, 26.89668), (41.417255, 7.8217235, 26.89668), (41.01718, 10.395584, 26.636868), (39.566902, 10.395584, 28.747036), (39.95283, 7.8217235, 29.027431), (39.95283, 7.8217235, 29.027431), (39.566902, 10.395584, 28.747036), (38.00817, 10.395584, 30.778412), (38.3789, 7.8217235, 31.07862), (38.3789, 7.8217235, 31.07862), (38.00817, 10.395584, 30.778412), (36.34527, 10.395584, 32.725426), (36.699776, 7.8217235, 33.044624), (36.699776, 7.8217235, 33.044624), (36.34527, 10.395584, 32.725426), (34.58274, 10.395584, 34.58274), (34.920055, 7.8217235, 34.920055), (34.920055, 7.8217235, 34.920055), (34.58274, 10.395584, 34.58274), (32.725426, 10.395584, 36.34527), (33.044624, 7.8217235, 36.699776), (33.044624, 7.8217235, 36.699776), (32.725426, 10.395584, 36.34527), (30.778412, 10.395584, 38.00817), (31.07862, 7.8217235, 38.3789), (31.07862, 7.8217235, 38.3789), (30.778412, 10.395584, 38.00817), (28.747036, 10.395584, 39.566902), (29.027431, 7.8217235, 39.95283), (29.027431, 7.8217235, 39.95283), (28.747036, 10.395584, 39.566902), (26.636868, 10.395584, 41.01718), (26.89668, 7.8217235, 41.417255), (26.89668, 7.8217235, 41.417255), (26.636868, 10.395584, 41.01718), (24.45369, 10.395584, 42.355034), (24.69221, 7.8217235, 42.768158), (24.69221, 7.8217235, 42.768158), (24.45369, 10.395584, 42.355034), (22.203485, 10.395584, 43.576794), (22.420055, 7.8217235, 44.00184), (22.420055, 7.8217235, 44.00184), (22.203485, 10.395584, 43.576794), (19.892424, 10.395584, 44.679115), (20.086452, 7.8217235, 45.11491), (20.086452, 7.8217235, 45.11491), (19.892424, 10.395584, 44.679115), (17.526838, 10.395584, 45.658974), (17.697792, 7.8217235, 46.104324), (17.697792, 7.8217235, 46.104324), (17.526838, 10.395584, 45.658974), (15.113212, 10.395584, 46.513683), (15.260624, 7.8217235, 46.967373), (15.260624, 7.8217235, 46.967373), (15.113212, 10.395584, 46.513683), (12.658161, 10.395584, 47.240902), (12.781628, 7.8217235, 47.701683), (12.781628, 7.8217235, 47.701683), (12.658161, 10.395584, 47.240902), (10.168416, 10.395584, 47.83864), (10.267597, 7.8217235, 48.30525), (10.267597, 7.8217235, 48.30525), (10.168416, 10.395584, 47.83864), (7.6507998, 10.395584, 48.30525), (7.725425, 7.8217235, 48.776413), (7.725425, 7.8217235, 48.776413), (7.6507998, 10.395584, 48.30525), (5.112213, 10.395584, 48.63946), (5.1620774, 7.8217235, 49.113884), (5.1620774, 7.8217235, 49.113884), (5.112213, 10.395584, 48.63946), (2.5596144, 10.395584, 48.840355), (2.5845807, 7.8217235, 49.31674), (2.5845807, 7.8217235, 49.31674), (2.5596144, 10.395584, 48.840355), (2.9947134e-15, 10.395584, 48.90738), (3.0239235e-15, 7.8217235, 49.38442), (3.0239235e-15, 7.8217235, 49.38442), (2.9947134e-15, 10.395584, 48.90738), (-2.5596144, 10.395584, 48.840355), (-2.5845807, 7.8217235, 49.31674), (-2.5845807, 7.8217235, 49.31674), (-2.5596144, 10.395584, 48.840355), (-5.112213, 10.395584, 48.63946), (-5.1620774, 7.8217235, 49.113884), (-5.1620774, 7.8217235, 49.113884), (-5.112213, 10.395584, 48.63946), (-7.6507998, 10.395584, 48.30525), (-7.725425, 7.8217235, 48.776413), (-7.725425, 7.8217235, 48.776413), (-7.6507998, 10.395584, 48.30525), (-10.168416, 10.395584, 47.83864), (-10.267597, 7.8217235, 48.30525), (-10.267597, 7.8217235, 48.30525), (-10.168416, 10.395584, 47.83864), (-12.658161, 10.395584, 47.240902), (-12.781628, 7.8217235, 47.701683), (-12.781628, 7.8217235, 47.701683), (-12.658161, 10.395584, 47.240902), (-15.113212, 10.395584, 46.513683), (-15.260624, 7.8217235, 46.967373), (-15.260624, 7.8217235, 46.967373), (-15.113212, 10.395584, 46.513683), (-17.526838, 10.395584, 45.658974), (-17.697792, 7.8217235, 46.104324), (-17.697792, 7.8217235, 46.104324), (-17.526838, 10.395584, 45.658974), (-19.892424, 10.395584, 44.679115), (-20.086452, 7.8217235, 45.11491), (-20.086452, 7.8217235, 45.11491), (-19.892424, 10.395584, 44.679115), (-22.203485, 10.395584, 43.576794), (-22.420055, 7.8217235, 44.00184), (-22.420055, 7.8217235, 44.00184), (-22.203485, 10.395584, 43.576794), (-24.45369, 10.395584, 42.355034), (-24.69221, 7.8217235, 42.768158), (-24.69221, 7.8217235, 42.768158), (-24.45369, 10.395584, 42.355034), (-26.636868, 10.395584, 41.01718), (-26.89668, 7.8217235, 41.417255), (-26.89668, 7.8217235, 41.417255), (-26.636868, 10.395584, 41.01718), (-28.747036, 10.395584, 39.566902), (-29.027431, 7.8217235, 39.95283), (-29.027431, 7.8217235, 39.95283), (-28.747036, 10.395584, 39.566902), (-30.778412, 10.395584, 38.00817), (-31.07862, 7.8217235, 38.3789), (-31.07862, 7.8217235, 38.3789), (-30.778412, 10.395584, 38.00817), (-32.725426, 10.395584, 36.34527), (-33.044624, 7.8217235, 36.699776), (-33.044624, 7.8217235, 36.699776), (-32.725426, 10.395584, 36.34527), (-34.58274, 10.395584, 34.58274), (-34.920055, 7.8217235, 34.920055), (-34.920055, 7.8217235, 34.920055), (-34.58274, 10.395584, 34.58274), (-36.34527, 10.395584, 32.725426), (-36.699776, 7.8217235, 33.044624), (-36.699776, 7.8217235, 33.044624), (-36.34527, 10.395584, 32.725426), (-38.00817, 10.395584, 30.778412), (-38.3789, 7.8217235, 31.07862), (-38.3789, 7.8217235, 31.07862), (-38.00817, 10.395584, 30.778412), (-39.566902, 10.395584, 28.747036), (-39.95283, 7.8217235, 29.027431), (-39.95283, 7.8217235, 29.027431), (-39.566902, 10.395584, 28.747036), (-41.01718, 10.395584, 26.636868), (-41.417255, 7.8217235, 26.89668), (-41.417255, 7.8217235, 26.89668), (-41.01718, 10.395584, 26.636868), (-42.355034, 10.395584, 24.45369), (-42.768158, 7.8217235, 24.69221), (-42.768158, 7.8217235, 24.69221), (-42.355034, 10.395584, 24.45369), (-43.576794, 10.395584, 22.203485), (-44.00184, 7.8217235, 22.420055), (-44.00184, 7.8217235, 22.420055), (-43.576794, 10.395584, 22.203485), (-44.679115, 10.395584, 19.892424), (-45.11491, 7.8217235, 20.086452), (-45.11491, 7.8217235, 20.086452), (-44.679115, 10.395584, 19.892424), (-45.658974, 10.395584, 17.526838), (-46.104324, 7.8217235, 17.697792), (-46.104324, 7.8217235, 17.697792), (-45.658974, 10.395584, 17.526838), (-46.513683, 10.395584, 15.113212), (-46.967373, 7.8217235, 15.260624), (-46.967373, 7.8217235, 15.260624), (-46.513683, 10.395584, 15.113212), (-47.240902, 10.395584, 12.658161), (-47.701683, 7.8217235, 12.781628), (-47.701683, 7.8217235, 12.781628), (-47.240902, 10.395584, 12.658161), (-47.83864, 10.395584, 10.168416), (-48.30525, 7.8217235, 10.267597), (-48.30525, 7.8217235, 10.267597), (-47.83864, 10.395584, 10.168416), (-48.30525, 10.395584, 7.6507998), (-48.776413, 7.8217235, 7.725425), (-48.776413, 7.8217235, 7.725425), (-48.30525, 10.395584, 7.6507998), (-48.63946, 10.395584, 5.112213), (-49.113884, 7.8217235, 5.1620774), (-49.113884, 7.8217235, 5.1620774), (-48.63946, 10.395584, 5.112213), (-48.840355, 10.395584, 2.5596144), (-49.31674, 7.8217235, 2.5845807), (-49.31674, 7.8217235, 2.5845807), (-48.840355, 10.395584, 2.5596144), (-48.90738, 10.395584, 5.9894267e-15), (-49.38442, 7.8217235, 6.047847e-15), (-49.38442, 7.8217235, 6.047847e-15), (-48.90738, 10.395584, 5.9894267e-15), (-48.840355, 10.395584, -2.5596144), (-49.31674, 7.8217235, -2.5845807), (-49.31674, 7.8217235, -2.5845807), (-48.840355, 10.395584, -2.5596144), (-48.63946, 10.395584, -5.112213), (-49.113884, 7.8217235, -5.1620774), (-49.113884, 7.8217235, -5.1620774), (-48.63946, 10.395584, -5.112213), (-48.30525, 10.395584, -7.6507998), (-48.776413, 7.8217235, -7.725425), (-48.776413, 7.8217235, -7.725425), (-48.30525, 10.395584, -7.6507998), (-47.83864, 10.395584, -10.168416), (-48.30525, 7.8217235, -10.267597), (-48.30525, 7.8217235, -10.267597), (-47.83864, 10.395584, -10.168416), (-47.240902, 10.395584, -12.658161), (-47.701683, 7.8217235, -12.781628), (-47.701683, 7.8217235, -12.781628), (-47.240902, 10.395584, -12.658161), (-46.513683, 10.395584, -15.113212), (-46.967373, 7.8217235, -15.260624), (-46.967373, 7.8217235, -15.260624), (-46.513683, 10.395584, -15.113212), (-45.658974, 10.395584, -17.526838), (-46.104324, 7.8217235, -17.697792), (-46.104324, 7.8217235, -17.697792), (-45.658974, 10.395584, -17.526838), (-44.679115, 10.395584, -19.892424), (-45.11491, 7.8217235, -20.086452), (-45.11491, 7.8217235, -20.086452), (-44.679115, 10.395584, -19.892424), (-43.576794, 10.395584, -22.203485), (-44.00184, 7.8217235, -22.420055), (-44.00184, 7.8217235, -22.420055), (-43.576794, 10.395584, -22.203485), (-42.355034, 10.395584, -24.45369), (-42.768158, 7.8217235, -24.69221), (-42.768158, 7.8217235, -24.69221), (-42.355034, 10.395584, -24.45369), (-41.01718, 10.395584, -26.636868), (-41.417255, 7.8217235, -26.89668), (-41.417255, 7.8217235, -26.89668), (-41.01718, 10.395584, -26.636868), (-39.566902, 10.395584, -28.747036), (-39.95283, 7.8217235, -29.027431), (-39.95283, 7.8217235, -29.027431), (-39.566902, 10.395584, -28.747036), (-38.00817, 10.395584, -30.778412), (-38.3789, 7.8217235, -31.07862), (-38.3789, 7.8217235, -31.07862), (-38.00817, 10.395584, -30.778412), (-36.34527, 10.395584, -32.725426), (-36.699776, 7.8217235, -33.044624), (-36.699776, 7.8217235, -33.044624), (-36.34527, 10.395584, -32.725426), (-34.58274, 10.395584, -34.58274), (-34.920055, 7.8217235, -34.920055), (-34.920055, 7.8217235, -34.920055), (-34.58274, 10.395584, -34.58274), (-32.725426, 10.395584, -36.34527), (-33.044624, 7.8217235, -36.699776), (-33.044624, 7.8217235, -36.699776), (-32.725426, 10.395584, -36.34527), (-30.778412, 10.395584, -38.00817), (-31.07862, 7.8217235, -38.3789), (-31.07862, 7.8217235, -38.3789), (-30.778412, 10.395584, -38.00817), (-28.747036, 10.395584, -39.566902), (-29.027431, 7.8217235, -39.95283), (-29.027431, 7.8217235, -39.95283), (-28.747036, 10.395584, -39.566902), (-26.636868, 10.395584, -41.01718), (-26.89668, 7.8217235, -41.417255), (-26.89668, 7.8217235, -41.417255), (-26.636868, 10.395584, -41.01718), (-24.45369, 10.395584, -42.355034), (-24.69221, 7.8217235, -42.768158), (-24.69221, 7.8217235, -42.768158), (-24.45369, 10.395584, -42.355034), (-22.203485, 10.395584, -43.576794), (-22.420055, 7.8217235, -44.00184), (-22.420055, 7.8217235, -44.00184), (-22.203485, 10.395584, -43.576794), (-19.892424, 10.395584, -44.679115), (-20.086452, 7.8217235, -45.11491), (-20.086452, 7.8217235, -45.11491), (-19.892424, 10.395584, -44.679115), (-17.526838, 10.395584, -45.658974), (-17.697792, 7.8217235, -46.104324), (-17.697792, 7.8217235, -46.104324), (-17.526838, 10.395584, -45.658974), (-15.113212, 10.395584, -46.513683), (-15.260624, 7.8217235, -46.967373), (-15.260624, 7.8217235, -46.967373), (-15.113212, 10.395584, -46.513683), (-12.658161, 10.395584, -47.240902), (-12.781628, 7.8217235, -47.701683), (-12.781628, 7.8217235, -47.701683), (-12.658161, 10.395584, -47.240902), (-10.168416, 10.395584, -47.83864), (-10.267597, 7.8217235, -48.30525), (-10.267597, 7.8217235, -48.30525), (-10.168416, 10.395584, -47.83864), (-7.6507998, 10.395584, -48.30525), (-7.725425, 7.8217235, -48.776413), (-7.725425, 7.8217235, -48.776413), (-7.6507998, 10.395584, -48.30525), (-5.112213, 10.395584, -48.63946), (-5.1620774, 7.8217235, -49.113884), (-5.1620774, 7.8217235, -49.113884), (-5.112213, 10.395584, -48.63946), (-2.5596144, 10.395584, -48.840355), (-2.5845807, 7.8217235, -49.31674), (-2.5845807, 7.8217235, -49.31674), (-2.5596144, 10.395584, -48.840355), (-8.98414e-15, 10.395584, -48.90738), (-9.07177e-15, 7.8217235, -49.38442), (-9.07177e-15, 7.8217235, -49.38442), (-8.98414e-15, 10.395584, -48.90738), (2.5596144, 10.395584, -48.840355), (2.5845807, 7.8217235, -49.31674), (2.5845807, 7.8217235, -49.31674), (2.5596144, 10.395584, -48.840355), (5.112213, 10.395584, -48.63946), (5.1620774, 7.8217235, -49.113884), (5.1620774, 7.8217235, -49.113884), (5.112213, 10.395584, -48.63946), (7.6507998, 10.395584, -48.30525), (7.725425, 7.8217235, -48.776413), (7.725425, 7.8217235, -48.776413), (7.6507998, 10.395584, -48.30525), (10.168416, 10.395584, -47.83864), (10.267597, 7.8217235, -48.30525), (10.267597, 7.8217235, -48.30525), (10.168416, 10.395584, -47.83864), (12.658161, 10.395584, -47.240902), (12.781628, 7.8217235, -47.701683), (12.781628, 7.8217235, -47.701683), (12.658161, 10.395584, -47.240902), (15.113212, 10.395584, -46.513683), (15.260624, 7.8217235, -46.967373), (15.260624, 7.8217235, -46.967373), (15.113212, 10.395584, -46.513683), (17.526838, 10.395584, -45.658974), (17.697792, 7.8217235, -46.104324), (17.697792, 7.8217235, -46.104324), (17.526838, 10.395584, -45.658974), (19.892424, 10.395584, -44.679115), (20.086452, 7.8217235, -45.11491), (20.086452, 7.8217235, -45.11491), (19.892424, 10.395584, -44.679115), (22.203485, 10.395584, -43.576794), (22.420055, 7.8217235, -44.00184), (22.420055, 7.8217235, -44.00184), (22.203485, 10.395584, -43.576794), (24.45369, 10.395584, -42.355034), (24.69221, 7.8217235, -42.768158), (24.69221, 7.8217235, -42.768158), (24.45369, 10.395584, -42.355034), (26.636868, 10.395584, -41.01718), (26.89668, 7.8217235, -41.417255), (26.89668, 7.8217235, -41.417255), (26.636868, 10.395584, -41.01718), (28.747036, 10.395584, -39.566902), (29.027431, 7.8217235, -39.95283), (29.027431, 7.8217235, -39.95283), (28.747036, 10.395584, -39.566902), (30.778412, 10.395584, -38.00817), (31.07862, 7.8217235, -38.3789), (31.07862, 7.8217235, -38.3789), (30.778412, 10.395584, -38.00817), (32.725426, 10.395584, -36.34527), (33.044624, 7.8217235, -36.699776), (33.044624, 7.8217235, -36.699776), (32.725426, 10.395584, -36.34527), (34.58274, 10.395584, -34.58274), (34.920055, 7.8217235, -34.920055), (34.920055, 7.8217235, -34.920055), (34.58274, 10.395584, -34.58274), (36.34527, 10.395584, -32.725426), (36.699776, 7.8217235, -33.044624), (36.699776, 7.8217235, -33.044624), (36.34527, 10.395584, -32.725426), (38.00817, 10.395584, -30.778412), (38.3789, 7.8217235, -31.07862), (38.3789, 7.8217235, -31.07862), (38.00817, 10.395584, -30.778412), (39.566902, 10.395584, -28.747036), (39.95283, 7.8217235, -29.027431), (39.95283, 7.8217235, -29.027431), (39.566902, 10.395584, -28.747036), (41.01718, 10.395584, -26.636868), (41.417255, 7.8217235, -26.89668), (41.417255, 7.8217235, -26.89668), (41.01718, 10.395584, -26.636868), (42.355034, 10.395584, -24.45369), (42.768158, 7.8217235, -24.69221), (42.768158, 7.8217235, -24.69221), (42.355034, 10.395584, -24.45369), (43.576794, 10.395584, -22.203485), (44.00184, 7.8217235, -22.420055), (44.00184, 7.8217235, -22.420055), (43.576794, 10.395584, -22.203485), (44.679115, 10.395584, -19.892424), (45.11491, 7.8217235, -20.086452), (45.11491, 7.8217235, -20.086452), (44.679115, 10.395584, -19.892424), (45.658974, 10.395584, -17.526838), (46.104324, 7.8217235, -17.697792), (46.104324, 7.8217235, -17.697792), (45.658974, 10.395584, -17.526838), (46.513683, 10.395584, -15.113212), (46.967373, 7.8217235, -15.260624), (46.967373, 7.8217235, -15.260624), (46.513683, 10.395584, -15.113212), (47.240902, 10.395584, -12.658161), (47.701683, 7.8217235, -12.781628), (47.701683, 7.8217235, -12.781628), (47.240902, 10.395584, -12.658161), (47.83864, 10.395584, -10.168416), (48.30525, 7.8217235, -10.267597), (48.30525, 7.8217235, -10.267597), (47.83864, 10.395584, -10.168416), (48.30525, 10.395584, -7.6507998), (48.776413, 7.8217235, -7.725425), (48.776413, 7.8217235, -7.725425), (48.30525, 10.395584, -7.6507998), (48.63946, 10.395584, -5.112213), (49.113884, 7.8217235, -5.1620774), (49.113884, 7.8217235, -5.1620774), (48.63946, 10.395584, -5.112213), (48.840355, 10.395584, -2.5596144), (49.31674, 7.8217235, -2.5845807), (49.31674, 7.8217235, -2.5845807), (48.840355, 10.395584, -2.5596144), (48.90738, 10.395584, 0), (49.38442, 7.8217235, 0), (48.90738, 10.395584, 0), (48.29629, 12.940952, 0), (48.230103, 12.940952, 2.5276325), (48.840355, 10.395584, 2.5596144), (48.840355, 10.395584, 2.5596144), (48.230103, 12.940952, 2.5276325), (48.03172, 12.940952, 5.048337), (48.63946, 10.395584, 5.112213), (48.63946, 10.395584, 5.112213), (48.03172, 12.940952, 5.048337), (47.701683, 12.940952, 7.5552044), (48.30525, 10.395584, 7.6507998), (48.30525, 10.395584, 7.6507998), (47.701683, 12.940952, 7.5552044), (47.240902, 12.940952, 10.041364), (47.83864, 10.395584, 10.168416), (47.83864, 10.395584, 10.168416), (47.240902, 12.940952, 10.041364), (46.650635, 12.940952, 12.5), (47.240902, 10.395584, 12.658161), (47.240902, 10.395584, 12.658161), (46.650635, 12.940952, 12.5), (45.932503, 12.940952, 14.924375), (46.513683, 10.395584, 15.113212), (46.513683, 10.395584, 15.113212), (45.932503, 12.940952, 14.924375), (45.08847, 12.940952, 17.307842), (45.658974, 10.395584, 17.526838), (45.658974, 10.395584, 17.526838), (45.08847, 12.940952, 17.307842), (44.120857, 12.940952, 19.643871), (44.679115, 10.395584, 19.892424), (44.679115, 10.395584, 19.892424), (44.120857, 12.940952, 19.643871), (43.03231, 12.940952, 21.926058), (43.576794, 10.395584, 22.203485), (43.576794, 10.395584, 22.203485), (43.03231, 12.940952, 21.926058), (41.825813, 12.940952, 24.148146), (42.355034, 10.395584, 24.45369), (42.355034, 10.395584, 24.45369), (41.825813, 12.940952, 24.148146), (40.504677, 12.940952, 26.304045), (41.01718, 10.395584, 26.636868), (41.01718, 10.395584, 26.636868), (40.504677, 12.940952, 26.304045), (39.07252, 12.940952, 28.387848), (39.566902, 10.395584, 28.747036), (39.566902, 10.395584, 28.747036), (39.07252, 12.940952, 28.387848), (37.533268, 12.940952, 30.39384), (38.00817, 10.395584, 30.778412), (38.00817, 10.395584, 30.778412), (37.533268, 12.940952, 30.39384), (35.89114, 12.940952, 32.31653), (36.34527, 10.395584, 32.725426), (36.34527, 10.395584, 32.725426), (35.89114, 12.940952, 32.31653), (34.150635, 12.940952, 34.150635), (34.58274, 10.395584, 34.58274), (34.58274, 10.395584, 34.58274), (34.150635, 12.940952, 34.150635), (32.31653, 12.940952, 35.89114), (32.725426, 10.395584, 36.34527), (32.725426, 10.395584, 36.34527), (32.31653, 12.940952, 35.89114), (30.39384, 12.940952, 37.533268), (30.778412, 10.395584, 38.00817), (30.778412, 10.395584, 38.00817), (30.39384, 12.940952, 37.533268), (28.387848, 12.940952, 39.07252), (28.747036, 10.395584, 39.566902), (28.747036, 10.395584, 39.566902), (28.387848, 12.940952, 39.07252), (26.304045, 12.940952, 40.504677), (26.636868, 10.395584, 41.01718), (26.636868, 10.395584, 41.01718), (26.304045, 12.940952, 40.504677), (24.148146, 12.940952, 41.825813), (24.45369, 10.395584, 42.355034), (24.45369, 10.395584, 42.355034), (24.148146, 12.940952, 41.825813), (21.926058, 12.940952, 43.03231), (22.203485, 10.395584, 43.576794), (22.203485, 10.395584, 43.576794), (21.926058, 12.940952, 43.03231), (19.643871, 12.940952, 44.120857), (19.892424, 10.395584, 44.679115), (19.892424, 10.395584, 44.679115), (19.643871, 12.940952, 44.120857), (17.307842, 12.940952, 45.08847), (17.526838, 10.395584, 45.658974), (17.526838, 10.395584, 45.658974), (17.307842, 12.940952, 45.08847), (14.924375, 12.940952, 45.932503), (15.113212, 10.395584, 46.513683), (15.113212, 10.395584, 46.513683), (14.924375, 12.940952, 45.932503), (12.5, 12.940952, 46.650635), (12.658161, 10.395584, 47.240902), (12.658161, 10.395584, 47.240902), (12.5, 12.940952, 46.650635), (10.041364, 12.940952, 47.240902), (10.168416, 10.395584, 47.83864), (10.168416, 10.395584, 47.83864), (10.041364, 12.940952, 47.240902), (7.5552044, 12.940952, 47.701683), (7.6507998, 10.395584, 48.30525), (7.6507998, 10.395584, 48.30525), (7.5552044, 12.940952, 47.701683), (5.048337, 12.940952, 48.03172), (5.112213, 10.395584, 48.63946), (5.112213, 10.395584, 48.63946), (5.048337, 12.940952, 48.03172), (2.5276325, 12.940952, 48.230103), (2.5596144, 10.395584, 48.840355), (2.5596144, 10.395584, 48.840355), (2.5276325, 12.940952, 48.230103), (2.9572948e-15, 12.940952, 48.29629), (2.9947134e-15, 10.395584, 48.90738), (2.9947134e-15, 10.395584, 48.90738), (2.9572948e-15, 12.940952, 48.29629), (-2.5276325, 12.940952, 48.230103), (-2.5596144, 10.395584, 48.840355), (-2.5596144, 10.395584, 48.840355), (-2.5276325, 12.940952, 48.230103), (-5.048337, 12.940952, 48.03172), (-5.112213, 10.395584, 48.63946), (-5.112213, 10.395584, 48.63946), (-5.048337, 12.940952, 48.03172), (-7.5552044, 12.940952, 47.701683), (-7.6507998, 10.395584, 48.30525), (-7.6507998, 10.395584, 48.30525), (-7.5552044, 12.940952, 47.701683), (-10.041364, 12.940952, 47.240902), (-10.168416, 10.395584, 47.83864), (-10.168416, 10.395584, 47.83864), (-10.041364, 12.940952, 47.240902), (-12.5, 12.940952, 46.650635), (-12.658161, 10.395584, 47.240902), (-12.658161, 10.395584, 47.240902), (-12.5, 12.940952, 46.650635), (-14.924375, 12.940952, 45.932503), (-15.113212, 10.395584, 46.513683), (-15.113212, 10.395584, 46.513683), (-14.924375, 12.940952, 45.932503), (-17.307842, 12.940952, 45.08847), (-17.526838, 10.395584, 45.658974), (-17.526838, 10.395584, 45.658974), (-17.307842, 12.940952, 45.08847), (-19.643871, 12.940952, 44.120857), (-19.892424, 10.395584, 44.679115), (-19.892424, 10.395584, 44.679115), (-19.643871, 12.940952, 44.120857), (-21.926058, 12.940952, 43.03231), (-22.203485, 10.395584, 43.576794), (-22.203485, 10.395584, 43.576794), (-21.926058, 12.940952, 43.03231), (-24.148146, 12.940952, 41.825813), (-24.45369, 10.395584, 42.355034), (-24.45369, 10.395584, 42.355034), (-24.148146, 12.940952, 41.825813), (-26.304045, 12.940952, 40.504677), (-26.636868, 10.395584, 41.01718), (-26.636868, 10.395584, 41.01718), (-26.304045, 12.940952, 40.504677), (-28.387848, 12.940952, 39.07252), (-28.747036, 10.395584, 39.566902), (-28.747036, 10.395584, 39.566902), (-28.387848, 12.940952, 39.07252), (-30.39384, 12.940952, 37.533268), (-30.778412, 10.395584, 38.00817), (-30.778412, 10.395584, 38.00817), (-30.39384, 12.940952, 37.533268), (-32.31653, 12.940952, 35.89114), (-32.725426, 10.395584, 36.34527), (-32.725426, 10.395584, 36.34527), (-32.31653, 12.940952, 35.89114), (-34.150635, 12.940952, 34.150635), (-34.58274, 10.395584, 34.58274), (-34.58274, 10.395584, 34.58274), (-34.150635, 12.940952, 34.150635), (-35.89114, 12.940952, 32.31653), (-36.34527, 10.395584, 32.725426), (-36.34527, 10.395584, 32.725426), (-35.89114, 12.940952, 32.31653), (-37.533268, 12.940952, 30.39384), (-38.00817, 10.395584, 30.778412), (-38.00817, 10.395584, 30.778412), (-37.533268, 12.940952, 30.39384), (-39.07252, 12.940952, 28.387848), (-39.566902, 10.395584, 28.747036), (-39.566902, 10.395584, 28.747036), (-39.07252, 12.940952, 28.387848), (-40.504677, 12.940952, 26.304045), (-41.01718, 10.395584, 26.636868), (-41.01718, 10.395584, 26.636868), (-40.504677, 12.940952, 26.304045), (-41.825813, 12.940952, 24.148146), (-42.355034, 10.395584, 24.45369), (-42.355034, 10.395584, 24.45369), (-41.825813, 12.940952, 24.148146), (-43.03231, 12.940952, 21.926058), (-43.576794, 10.395584, 22.203485), (-43.576794, 10.395584, 22.203485), (-43.03231, 12.940952, 21.926058), (-44.120857, 12.940952, 19.643871), (-44.679115, 10.395584, 19.892424), (-44.679115, 10.395584, 19.892424), (-44.120857, 12.940952, 19.643871), (-45.08847, 12.940952, 17.307842), (-45.658974, 10.395584, 17.526838), (-45.658974, 10.395584, 17.526838), (-45.08847, 12.940952, 17.307842), (-45.932503, 12.940952, 14.924375), (-46.513683, 10.395584, 15.113212), (-46.513683, 10.395584, 15.113212), (-45.932503, 12.940952, 14.924375), (-46.650635, 12.940952, 12.5), (-47.240902, 10.395584, 12.658161), (-47.240902, 10.395584, 12.658161), (-46.650635, 12.940952, 12.5), (-47.240902, 12.940952, 10.041364), (-47.83864, 10.395584, 10.168416), (-47.83864, 10.395584, 10.168416), (-47.240902, 12.940952, 10.041364), (-47.701683, 12.940952, 7.5552044), (-48.30525, 10.395584, 7.6507998), (-48.30525, 10.395584, 7.6507998), (-47.701683, 12.940952, 7.5552044), (-48.03172, 12.940952, 5.048337), (-48.63946, 10.395584, 5.112213), (-48.63946, 10.395584, 5.112213), (-48.03172, 12.940952, 5.048337), (-48.230103, 12.940952, 2.5276325), (-48.840355, 10.395584, 2.5596144), (-48.840355, 10.395584, 2.5596144), (-48.230103, 12.940952, 2.5276325), (-48.29629, 12.940952, 5.9145897e-15), (-48.90738, 10.395584, 5.9894267e-15), (-48.90738, 10.395584, 5.9894267e-15), (-48.29629, 12.940952, 5.9145897e-15), (-48.230103, 12.940952, -2.5276325), (-48.840355, 10.395584, -2.5596144), (-48.840355, 10.395584, -2.5596144), (-48.230103, 12.940952, -2.5276325), (-48.03172, 12.940952, -5.048337), (-48.63946, 10.395584, -5.112213), (-48.63946, 10.395584, -5.112213), (-48.03172, 12.940952, -5.048337), (-47.701683, 12.940952, -7.5552044), (-48.30525, 10.395584, -7.6507998), (-48.30525, 10.395584, -7.6507998), (-47.701683, 12.940952, -7.5552044), (-47.240902, 12.940952, -10.041364), (-47.83864, 10.395584, -10.168416), (-47.83864, 10.395584, -10.168416), (-47.240902, 12.940952, -10.041364), (-46.650635, 12.940952, -12.5), (-47.240902, 10.395584, -12.658161), (-47.240902, 10.395584, -12.658161), (-46.650635, 12.940952, -12.5), (-45.932503, 12.940952, -14.924375), (-46.513683, 10.395584, -15.113212), (-46.513683, 10.395584, -15.113212), (-45.932503, 12.940952, -14.924375), (-45.08847, 12.940952, -17.307842), (-45.658974, 10.395584, -17.526838), (-45.658974, 10.395584, -17.526838), (-45.08847, 12.940952, -17.307842), (-44.120857, 12.940952, -19.643871), (-44.679115, 10.395584, -19.892424), (-44.679115, 10.395584, -19.892424), (-44.120857, 12.940952, -19.643871), (-43.03231, 12.940952, -21.926058), (-43.576794, 10.395584, -22.203485), (-43.576794, 10.395584, -22.203485), (-43.03231, 12.940952, -21.926058), (-41.825813, 12.940952, -24.148146), (-42.355034, 10.395584, -24.45369), (-42.355034, 10.395584, -24.45369), (-41.825813, 12.940952, -24.148146), (-40.504677, 12.940952, -26.304045), (-41.01718, 10.395584, -26.636868), (-41.01718, 10.395584, -26.636868), (-40.504677, 12.940952, -26.304045), (-39.07252, 12.940952, -28.387848), (-39.566902, 10.395584, -28.747036), (-39.566902, 10.395584, -28.747036), (-39.07252, 12.940952, -28.387848), (-37.533268, 12.940952, -30.39384), (-38.00817, 10.395584, -30.778412), (-38.00817, 10.395584, -30.778412), (-37.533268, 12.940952, -30.39384), (-35.89114, 12.940952, -32.31653), (-36.34527, 10.395584, -32.725426), (-36.34527, 10.395584, -32.725426), (-35.89114, 12.940952, -32.31653), (-34.150635, 12.940952, -34.150635), (-34.58274, 10.395584, -34.58274), (-34.58274, 10.395584, -34.58274), (-34.150635, 12.940952, -34.150635), (-32.31653, 12.940952, -35.89114), (-32.725426, 10.395584, -36.34527), (-32.725426, 10.395584, -36.34527), (-32.31653, 12.940952, -35.89114), (-30.39384, 12.940952, -37.533268), (-30.778412, 10.395584, -38.00817), (-30.778412, 10.395584, -38.00817), (-30.39384, 12.940952, -37.533268), (-28.387848, 12.940952, -39.07252), (-28.747036, 10.395584, -39.566902), (-28.747036, 10.395584, -39.566902), (-28.387848, 12.940952, -39.07252), (-26.304045, 12.940952, -40.504677), (-26.636868, 10.395584, -41.01718), (-26.636868, 10.395584, -41.01718), (-26.304045, 12.940952, -40.504677), (-24.148146, 12.940952, -41.825813), (-24.45369, 10.395584, -42.355034), (-24.45369, 10.395584, -42.355034), (-24.148146, 12.940952, -41.825813), (-21.926058, 12.940952, -43.03231), (-22.203485, 10.395584, -43.576794), (-22.203485, 10.395584, -43.576794), (-21.926058, 12.940952, -43.03231), (-19.643871, 12.940952, -44.120857), (-19.892424, 10.395584, -44.679115), (-19.892424, 10.395584, -44.679115), (-19.643871, 12.940952, -44.120857), (-17.307842, 12.940952, -45.08847), (-17.526838, 10.395584, -45.658974), (-17.526838, 10.395584, -45.658974), (-17.307842, 12.940952, -45.08847), (-14.924375, 12.940952, -45.932503), (-15.113212, 10.395584, -46.513683), (-15.113212, 10.395584, -46.513683), (-14.924375, 12.940952, -45.932503), (-12.5, 12.940952, -46.650635), (-12.658161, 10.395584, -47.240902), (-12.658161, 10.395584, -47.240902), (-12.5, 12.940952, -46.650635), (-10.041364, 12.940952, -47.240902), (-10.168416, 10.395584, -47.83864), (-10.168416, 10.395584, -47.83864), (-10.041364, 12.940952, -47.240902), (-7.5552044, 12.940952, -47.701683), (-7.6507998, 10.395584, -48.30525), (-7.6507998, 10.395584, -48.30525), (-7.5552044, 12.940952, -47.701683), (-5.048337, 12.940952, -48.03172), (-5.112213, 10.395584, -48.63946), (-5.112213, 10.395584, -48.63946), (-5.048337, 12.940952, -48.03172), (-2.5276325, 12.940952, -48.230103), (-2.5596144, 10.395584, -48.840355), (-2.5596144, 10.395584, -48.840355), (-2.5276325, 12.940952, -48.230103), (-8.871885e-15, 12.940952, -48.29629), (-8.98414e-15, 10.395584, -48.90738), (-8.98414e-15, 10.395584, -48.90738), (-8.871885e-15, 12.940952, -48.29629), (2.5276325, 12.940952, -48.230103), (2.5596144, 10.395584, -48.840355), (2.5596144, 10.395584, -48.840355), (2.5276325, 12.940952, -48.230103), (5.048337, 12.940952, -48.03172), (5.112213, 10.395584, -48.63946), (5.112213, 10.395584, -48.63946), (5.048337, 12.940952, -48.03172), (7.5552044, 12.940952, -47.701683), (7.6507998, 10.395584, -48.30525), (7.6507998, 10.395584, -48.30525), (7.5552044, 12.940952, -47.701683), (10.041364, 12.940952, -47.240902), (10.168416, 10.395584, -47.83864), (10.168416, 10.395584, -47.83864), (10.041364, 12.940952, -47.240902), (12.5, 12.940952, -46.650635), (12.658161, 10.395584, -47.240902), (12.658161, 10.395584, -47.240902), (12.5, 12.940952, -46.650635), (14.924375, 12.940952, -45.932503), (15.113212, 10.395584, -46.513683), (15.113212, 10.395584, -46.513683), (14.924375, 12.940952, -45.932503), (17.307842, 12.940952, -45.08847), (17.526838, 10.395584, -45.658974), (17.526838, 10.395584, -45.658974), (17.307842, 12.940952, -45.08847), (19.643871, 12.940952, -44.120857), (19.892424, 10.395584, -44.679115), (19.892424, 10.395584, -44.679115), (19.643871, 12.940952, -44.120857), (21.926058, 12.940952, -43.03231), (22.203485, 10.395584, -43.576794), (22.203485, 10.395584, -43.576794), (21.926058, 12.940952, -43.03231), (24.148146, 12.940952, -41.825813), (24.45369, 10.395584, -42.355034), (24.45369, 10.395584, -42.355034), (24.148146, 12.940952, -41.825813), (26.304045, 12.940952, -40.504677), (26.636868, 10.395584, -41.01718), (26.636868, 10.395584, -41.01718), (26.304045, 12.940952, -40.504677), (28.387848, 12.940952, -39.07252), (28.747036, 10.395584, -39.566902), (28.747036, 10.395584, -39.566902), (28.387848, 12.940952, -39.07252), (30.39384, 12.940952, -37.533268), (30.778412, 10.395584, -38.00817), (30.778412, 10.395584, -38.00817), (30.39384, 12.940952, -37.533268), (32.31653, 12.940952, -35.89114), (32.725426, 10.395584, -36.34527), (32.725426, 10.395584, -36.34527), (32.31653, 12.940952, -35.89114), (34.150635, 12.940952, -34.150635), (34.58274, 10.395584, -34.58274), (34.58274, 10.395584, -34.58274), (34.150635, 12.940952, -34.150635), (35.89114, 12.940952, -32.31653), (36.34527, 10.395584, -32.725426), (36.34527, 10.395584, -32.725426), (35.89114, 12.940952, -32.31653), (37.533268, 12.940952, -30.39384), (38.00817, 10.395584, -30.778412), (38.00817, 10.395584, -30.778412), (37.533268, 12.940952, -30.39384), (39.07252, 12.940952, -28.387848), (39.566902, 10.395584, -28.747036), (39.566902, 10.395584, -28.747036), (39.07252, 12.940952, -28.387848), (40.504677, 12.940952, -26.304045), (41.01718, 10.395584, -26.636868), (41.01718, 10.395584, -26.636868), (40.504677, 12.940952, -26.304045), (41.825813, 12.940952, -24.148146), (42.355034, 10.395584, -24.45369), (42.355034, 10.395584, -24.45369), (41.825813, 12.940952, -24.148146), (43.03231, 12.940952, -21.926058), (43.576794, 10.395584, -22.203485), (43.576794, 10.395584, -22.203485), (43.03231, 12.940952, -21.926058), (44.120857, 12.940952, -19.643871), (44.679115, 10.395584, -19.892424), (44.679115, 10.395584, -19.892424), (44.120857, 12.940952, -19.643871), (45.08847, 12.940952, -17.307842), (45.658974, 10.395584, -17.526838), (45.658974, 10.395584, -17.526838), (45.08847, 12.940952, -17.307842), (45.932503, 12.940952, -14.924375), (46.513683, 10.395584, -15.113212), (46.513683, 10.395584, -15.113212), (45.932503, 12.940952, -14.924375), (46.650635, 12.940952, -12.5), (47.240902, 10.395584, -12.658161), (47.240902, 10.395584, -12.658161), (46.650635, 12.940952, -12.5), (47.240902, 12.940952, -10.041364), (47.83864, 10.395584, -10.168416), (47.83864, 10.395584, -10.168416), (47.240902, 12.940952, -10.041364), (47.701683, 12.940952, -7.5552044), (48.30525, 10.395584, -7.6507998), (48.30525, 10.395584, -7.6507998), (47.701683, 12.940952, -7.5552044), (48.03172, 12.940952, -5.048337), (48.63946, 10.395584, -5.112213), (48.63946, 10.395584, -5.112213), (48.03172, 12.940952, -5.048337), (48.230103, 12.940952, -2.5276325), (48.840355, 10.395584, -2.5596144), (48.840355, 10.395584, -2.5596144), (48.230103, 12.940952, -2.5276325), (48.29629, 12.940952, 0), (48.90738, 10.395584, 0), (48.29629, 12.940952, 0), (47.552826, 15.45085, 0), (47.487656, 15.45085, 2.4887226), (48.230103, 12.940952, 2.5276325), (48.230103, 12.940952, 2.5276325), (47.487656, 15.45085, 2.4887226), (47.292328, 15.45085, 4.970624), (48.03172, 12.940952, 5.048337), (48.03172, 12.940952, 5.048337), (47.292328, 15.45085, 4.970624), (46.967373, 15.45085, 7.438901), (47.701683, 12.940952, 7.5552044), (47.701683, 12.940952, 7.5552044), (46.967373, 15.45085, 7.438901), (46.513683, 15.45085, 9.886788), (47.240902, 12.940952, 10.041364), (47.240902, 12.940952, 10.041364), (46.513683, 15.45085, 9.886788), (45.932503, 15.45085, 12.307577), (46.650635, 12.940952, 12.5), (46.650635, 12.940952, 12.5), (45.932503, 15.45085, 12.307577), (45.225426, 15.45085, 14.694632), (45.932503, 12.940952, 14.924375), (45.932503, 12.940952, 14.924375), (45.225426, 15.45085, 14.694632), (44.394386, 15.45085, 17.041409), (45.08847, 12.940952, 17.307842), (45.08847, 12.940952, 17.307842), (44.394386, 15.45085, 17.041409), (43.44167, 15.45085, 19.341476), (44.120857, 12.940952, 19.643871), (44.120857, 12.940952, 19.643871), (43.44167, 15.45085, 19.341476), (42.369877, 15.45085, 21.588531), (43.03231, 12.940952, 21.926058), (43.03231, 12.940952, 21.926058), (42.369877, 15.45085, 21.588531), (41.181953, 15.45085, 23.776413), (41.825813, 12.940952, 24.148146), (41.825813, 12.940952, 24.148146), (41.181953, 15.45085, 23.776413), (39.881157, 15.45085, 25.899126), (40.504677, 12.940952, 26.304045), (40.504677, 12.940952, 26.304045), (39.881157, 15.45085, 25.899126), (38.471043, 15.45085, 27.95085), (39.07252, 12.940952, 28.387848), (39.07252, 12.940952, 28.387848), (38.471043, 15.45085, 27.95085), (36.955486, 15.45085, 29.925962), (37.533268, 12.940952, 30.39384), (37.533268, 12.940952, 30.39384), (36.955486, 15.45085, 29.925962), (35.33864, 15.45085, 31.819052), (35.89114, 12.940952, 32.31653), (35.89114, 12.940952, 32.31653), (35.33864, 15.45085, 31.819052), (33.624924, 15.45085, 33.624924), (34.150635, 12.940952, 34.150635), (34.150635, 12.940952, 34.150635), (33.624924, 15.45085, 33.624924), (31.819052, 15.45085, 35.33864), (32.31653, 12.940952, 35.89114), (32.31653, 12.940952, 35.89114), (31.819052, 15.45085, 35.33864), (29.925962, 15.45085, 36.955486), (30.39384, 12.940952, 37.533268), (30.39384, 12.940952, 37.533268), (29.925962, 15.45085, 36.955486), (27.95085, 15.45085, 38.471043), (28.387848, 12.940952, 39.07252), (28.387848, 12.940952, 39.07252), (27.95085, 15.45085, 38.471043), (25.899126, 15.45085, 39.881157), (26.304045, 12.940952, 40.504677), (26.304045, 12.940952, 40.504677), (25.899126, 15.45085, 39.881157), (23.776413, 15.45085, 41.181953), (24.148146, 12.940952, 41.825813), (24.148146, 12.940952, 41.825813), (23.776413, 15.45085, 41.181953), (21.588531, 15.45085, 42.369877), (21.926058, 12.940952, 43.03231), (21.926058, 12.940952, 43.03231), (21.588531, 15.45085, 42.369877), (19.341476, 15.45085, 43.44167), (19.643871, 12.940952, 44.120857), (19.643871, 12.940952, 44.120857), (19.341476, 15.45085, 43.44167), (17.041409, 15.45085, 44.394386), (17.307842, 12.940952, 45.08847), (17.307842, 12.940952, 45.08847), (17.041409, 15.45085, 44.394386), (14.694632, 15.45085, 45.225426), (14.924375, 12.940952, 45.932503), (14.924375, 12.940952, 45.932503), (14.694632, 15.45085, 45.225426), (12.307577, 15.45085, 45.932503), (12.5, 12.940952, 46.650635), (12.5, 12.940952, 46.650635), (12.307577, 15.45085, 45.932503), (9.886788, 15.45085, 46.513683), (10.041364, 12.940952, 47.240902), (10.041364, 12.940952, 47.240902), (9.886788, 15.45085, 46.513683), (7.438901, 15.45085, 46.967373), (7.5552044, 12.940952, 47.701683), (7.5552044, 12.940952, 47.701683), (7.438901, 15.45085, 46.967373), (4.970624, 15.45085, 47.292328), (5.048337, 12.940952, 48.03172), (5.048337, 12.940952, 48.03172), (4.970624, 15.45085, 47.292328), (2.4887226, 15.45085, 47.487656), (2.5276325, 12.940952, 48.230103), (2.5276325, 12.940952, 48.230103), (2.4887226, 15.45085, 47.487656), (2.9117708e-15, 15.45085, 47.552826), (2.9572948e-15, 12.940952, 48.29629), (2.9572948e-15, 12.940952, 48.29629), (2.9117708e-15, 15.45085, 47.552826), (-2.4887226, 15.45085, 47.487656), (-2.5276325, 12.940952, 48.230103), (-2.5276325, 12.940952, 48.230103), (-2.4887226, 15.45085, 47.487656), (-4.970624, 15.45085, 47.292328), (-5.048337, 12.940952, 48.03172), (-5.048337, 12.940952, 48.03172), (-4.970624, 15.45085, 47.292328), (-7.438901, 15.45085, 46.967373), (-7.5552044, 12.940952, 47.701683), (-7.5552044, 12.940952, 47.701683), (-7.438901, 15.45085, 46.967373), (-9.886788, 15.45085, 46.513683), (-10.041364, 12.940952, 47.240902), (-10.041364, 12.940952, 47.240902), (-9.886788, 15.45085, 46.513683), (-12.307577, 15.45085, 45.932503), (-12.5, 12.940952, 46.650635), (-12.5, 12.940952, 46.650635), (-12.307577, 15.45085, 45.932503), (-14.694632, 15.45085, 45.225426), (-14.924375, 12.940952, 45.932503), (-14.924375, 12.940952, 45.932503), (-14.694632, 15.45085, 45.225426), (-17.041409, 15.45085, 44.394386), (-17.307842, 12.940952, 45.08847), (-17.307842, 12.940952, 45.08847), (-17.041409, 15.45085, 44.394386), (-19.341476, 15.45085, 43.44167), (-19.643871, 12.940952, 44.120857), (-19.643871, 12.940952, 44.120857), (-19.341476, 15.45085, 43.44167), (-21.588531, 15.45085, 42.369877), (-21.926058, 12.940952, 43.03231), (-21.926058, 12.940952, 43.03231), (-21.588531, 15.45085, 42.369877), (-23.776413, 15.45085, 41.181953), (-24.148146, 12.940952, 41.825813), (-24.148146, 12.940952, 41.825813), (-23.776413, 15.45085, 41.181953), (-25.899126, 15.45085, 39.881157), (-26.304045, 12.940952, 40.504677), (-26.304045, 12.940952, 40.504677), (-25.899126, 15.45085, 39.881157), (-27.95085, 15.45085, 38.471043), (-28.387848, 12.940952, 39.07252), (-28.387848, 12.940952, 39.07252), (-27.95085, 15.45085, 38.471043), (-29.925962, 15.45085, 36.955486), (-30.39384, 12.940952, 37.533268), (-30.39384, 12.940952, 37.533268), (-29.925962, 15.45085, 36.955486), (-31.819052, 15.45085, 35.33864), (-32.31653, 12.940952, 35.89114), (-32.31653, 12.940952, 35.89114), (-31.819052, 15.45085, 35.33864), (-33.624924, 15.45085, 33.624924), (-34.150635, 12.940952, 34.150635), (-34.150635, 12.940952, 34.150635), (-33.624924, 15.45085, 33.624924), (-35.33864, 15.45085, 31.819052), (-35.89114, 12.940952, 32.31653), (-35.89114, 12.940952, 32.31653), (-35.33864, 15.45085, 31.819052), (-36.955486, 15.45085, 29.925962), (-37.533268, 12.940952, 30.39384), (-37.533268, 12.940952, 30.39384), (-36.955486, 15.45085, 29.925962), (-38.471043, 15.45085, 27.95085), (-39.07252, 12.940952, 28.387848), (-39.07252, 12.940952, 28.387848), (-38.471043, 15.45085, 27.95085), (-39.881157, 15.45085, 25.899126), (-40.504677, 12.940952, 26.304045), (-40.504677, 12.940952, 26.304045), (-39.881157, 15.45085, 25.899126), (-41.181953, 15.45085, 23.776413), (-41.825813, 12.940952, 24.148146), (-41.825813, 12.940952, 24.148146), (-41.181953, 15.45085, 23.776413), (-42.369877, 15.45085, 21.588531), (-43.03231, 12.940952, 21.926058), (-43.03231, 12.940952, 21.926058), (-42.369877, 15.45085, 21.588531), (-43.44167, 15.45085, 19.341476), (-44.120857, 12.940952, 19.643871), (-44.120857, 12.940952, 19.643871), (-43.44167, 15.45085, 19.341476), (-44.394386, 15.45085, 17.041409), (-45.08847, 12.940952, 17.307842), (-45.08847, 12.940952, 17.307842), (-44.394386, 15.45085, 17.041409), (-45.225426, 15.45085, 14.694632), (-45.932503, 12.940952, 14.924375), (-45.932503, 12.940952, 14.924375), (-45.225426, 15.45085, 14.694632), (-45.932503, 15.45085, 12.307577), (-46.650635, 12.940952, 12.5), (-46.650635, 12.940952, 12.5), (-45.932503, 15.45085, 12.307577), (-46.513683, 15.45085, 9.886788), (-47.240902, 12.940952, 10.041364), (-47.240902, 12.940952, 10.041364), (-46.513683, 15.45085, 9.886788), (-46.967373, 15.45085, 7.438901), (-47.701683, 12.940952, 7.5552044), (-47.701683, 12.940952, 7.5552044), (-46.967373, 15.45085, 7.438901), (-47.292328, 15.45085, 4.970624), (-48.03172, 12.940952, 5.048337), (-48.03172, 12.940952, 5.048337), (-47.292328, 15.45085, 4.970624), (-47.487656, 15.45085, 2.4887226), (-48.230103, 12.940952, 2.5276325), (-48.230103, 12.940952, 2.5276325), (-47.487656, 15.45085, 2.4887226), (-47.552826, 15.45085, 5.8235417e-15), (-48.29629, 12.940952, 5.9145897e-15), (-48.29629, 12.940952, 5.9145897e-15), (-47.552826, 15.45085, 5.8235417e-15), (-47.487656, 15.45085, -2.4887226), (-48.230103, 12.940952, -2.5276325), (-48.230103, 12.940952, -2.5276325), (-47.487656, 15.45085, -2.4887226), (-47.292328, 15.45085, -4.970624), (-48.03172, 12.940952, -5.048337), (-48.03172, 12.940952, -5.048337), (-47.292328, 15.45085, -4.970624), (-46.967373, 15.45085, -7.438901), (-47.701683, 12.940952, -7.5552044), (-47.701683, 12.940952, -7.5552044), (-46.967373, 15.45085, -7.438901), (-46.513683, 15.45085, -9.886788), (-47.240902, 12.940952, -10.041364), (-47.240902, 12.940952, -10.041364), (-46.513683, 15.45085, -9.886788), (-45.932503, 15.45085, -12.307577), (-46.650635, 12.940952, -12.5), (-46.650635, 12.940952, -12.5), (-45.932503, 15.45085, -12.307577), (-45.225426, 15.45085, -14.694632), (-45.932503, 12.940952, -14.924375), (-45.932503, 12.940952, -14.924375), (-45.225426, 15.45085, -14.694632), (-44.394386, 15.45085, -17.041409), (-45.08847, 12.940952, -17.307842), (-45.08847, 12.940952, -17.307842), (-44.394386, 15.45085, -17.041409), (-43.44167, 15.45085, -19.341476), (-44.120857, 12.940952, -19.643871), (-44.120857, 12.940952, -19.643871), (-43.44167, 15.45085, -19.341476), (-42.369877, 15.45085, -21.588531), (-43.03231, 12.940952, -21.926058), (-43.03231, 12.940952, -21.926058), (-42.369877, 15.45085, -21.588531), (-41.181953, 15.45085, -23.776413), (-41.825813, 12.940952, -24.148146), (-41.825813, 12.940952, -24.148146), (-41.181953, 15.45085, -23.776413), (-39.881157, 15.45085, -25.899126), (-40.504677, 12.940952, -26.304045), (-40.504677, 12.940952, -26.304045), (-39.881157, 15.45085, -25.899126), (-38.471043, 15.45085, -27.95085), (-39.07252, 12.940952, -28.387848), (-39.07252, 12.940952, -28.387848), (-38.471043, 15.45085, -27.95085), (-36.955486, 15.45085, -29.925962), (-37.533268, 12.940952, -30.39384), (-37.533268, 12.940952, -30.39384), (-36.955486, 15.45085, -29.925962), (-35.33864, 15.45085, -31.819052), (-35.89114, 12.940952, -32.31653), (-35.89114, 12.940952, -32.31653), (-35.33864, 15.45085, -31.819052), (-33.624924, 15.45085, -33.624924), (-34.150635, 12.940952, -34.150635), (-34.150635, 12.940952, -34.150635), (-33.624924, 15.45085, -33.624924), (-31.819052, 15.45085, -35.33864), (-32.31653, 12.940952, -35.89114), (-32.31653, 12.940952, -35.89114), (-31.819052, 15.45085, -35.33864), (-29.925962, 15.45085, -36.955486), (-30.39384, 12.940952, -37.533268), (-30.39384, 12.940952, -37.533268), (-29.925962, 15.45085, -36.955486), (-27.95085, 15.45085, -38.471043), (-28.387848, 12.940952, -39.07252), (-28.387848, 12.940952, -39.07252), (-27.95085, 15.45085, -38.471043), (-25.899126, 15.45085, -39.881157), (-26.304045, 12.940952, -40.504677), (-26.304045, 12.940952, -40.504677), (-25.899126, 15.45085, -39.881157), (-23.776413, 15.45085, -41.181953), (-24.148146, 12.940952, -41.825813), (-24.148146, 12.940952, -41.825813), (-23.776413, 15.45085, -41.181953), (-21.588531, 15.45085, -42.369877), (-21.926058, 12.940952, -43.03231), (-21.926058, 12.940952, -43.03231), (-21.588531, 15.45085, -42.369877), (-19.341476, 15.45085, -43.44167), (-19.643871, 12.940952, -44.120857), (-19.643871, 12.940952, -44.120857), (-19.341476, 15.45085, -43.44167), (-17.041409, 15.45085, -44.394386), (-17.307842, 12.940952, -45.08847), (-17.307842, 12.940952, -45.08847), (-17.041409, 15.45085, -44.394386), (-14.694632, 15.45085, -45.225426), (-14.924375, 12.940952, -45.932503), (-14.924375, 12.940952, -45.932503), (-14.694632, 15.45085, -45.225426), (-12.307577, 15.45085, -45.932503), (-12.5, 12.940952, -46.650635), (-12.5, 12.940952, -46.650635), (-12.307577, 15.45085, -45.932503), (-9.886788, 15.45085, -46.513683), (-10.041364, 12.940952, -47.240902), (-10.041364, 12.940952, -47.240902), (-9.886788, 15.45085, -46.513683), (-7.438901, 15.45085, -46.967373), (-7.5552044, 12.940952, -47.701683), (-7.5552044, 12.940952, -47.701683), (-7.438901, 15.45085, -46.967373), (-4.970624, 15.45085, -47.292328), (-5.048337, 12.940952, -48.03172), (-5.048337, 12.940952, -48.03172), (-4.970624, 15.45085, -47.292328), (-2.4887226, 15.45085, -47.487656), (-2.5276325, 12.940952, -48.230103), (-2.5276325, 12.940952, -48.230103), (-2.4887226, 15.45085, -47.487656), (-8.735313e-15, 15.45085, -47.552826), (-8.871885e-15, 12.940952, -48.29629), (-8.871885e-15, 12.940952, -48.29629), (-8.735313e-15, 15.45085, -47.552826), (2.4887226, 15.45085, -47.487656), (2.5276325, 12.940952, -48.230103), (2.5276325, 12.940952, -48.230103), (2.4887226, 15.45085, -47.487656), (4.970624, 15.45085, -47.292328), (5.048337, 12.940952, -48.03172), (5.048337, 12.940952, -48.03172), (4.970624, 15.45085, -47.292328), (7.438901, 15.45085, -46.967373), (7.5552044, 12.940952, -47.701683), (7.5552044, 12.940952, -47.701683), (7.438901, 15.45085, -46.967373), (9.886788, 15.45085, -46.513683), (10.041364, 12.940952, -47.240902), (10.041364, 12.940952, -47.240902), (9.886788, 15.45085, -46.513683), (12.307577, 15.45085, -45.932503), (12.5, 12.940952, -46.650635), (12.5, 12.940952, -46.650635), (12.307577, 15.45085, -45.932503), (14.694632, 15.45085, -45.225426), (14.924375, 12.940952, -45.932503), (14.924375, 12.940952, -45.932503), (14.694632, 15.45085, -45.225426), (17.041409, 15.45085, -44.394386), (17.307842, 12.940952, -45.08847), (17.307842, 12.940952, -45.08847), (17.041409, 15.45085, -44.394386), (19.341476, 15.45085, -43.44167), (19.643871, 12.940952, -44.120857), (19.643871, 12.940952, -44.120857), (19.341476, 15.45085, -43.44167), (21.588531, 15.45085, -42.369877), (21.926058, 12.940952, -43.03231), (21.926058, 12.940952, -43.03231), (21.588531, 15.45085, -42.369877), (23.776413, 15.45085, -41.181953), (24.148146, 12.940952, -41.825813), (24.148146, 12.940952, -41.825813), (23.776413, 15.45085, -41.181953), (25.899126, 15.45085, -39.881157), (26.304045, 12.940952, -40.504677), (26.304045, 12.940952, -40.504677), (25.899126, 15.45085, -39.881157), (27.95085, 15.45085, -38.471043), (28.387848, 12.940952, -39.07252), (28.387848, 12.940952, -39.07252), (27.95085, 15.45085, -38.471043), (29.925962, 15.45085, -36.955486), (30.39384, 12.940952, -37.533268), (30.39384, 12.940952, -37.533268), (29.925962, 15.45085, -36.955486), (31.819052, 15.45085, -35.33864), (32.31653, 12.940952, -35.89114), (32.31653, 12.940952, -35.89114), (31.819052, 15.45085, -35.33864), (33.624924, 15.45085, -33.624924), (34.150635, 12.940952, -34.150635), (34.150635, 12.940952, -34.150635), (33.624924, 15.45085, -33.624924), (35.33864, 15.45085, -31.819052), (35.89114, 12.940952, -32.31653), (35.89114, 12.940952, -32.31653), (35.33864, 15.45085, -31.819052), (36.955486, 15.45085, -29.925962), (37.533268, 12.940952, -30.39384), (37.533268, 12.940952, -30.39384), (36.955486, 15.45085, -29.925962), (38.471043, 15.45085, -27.95085), (39.07252, 12.940952, -28.387848), (39.07252, 12.940952, -28.387848), (38.471043, 15.45085, -27.95085), (39.881157, 15.45085, -25.899126), (40.504677, 12.940952, -26.304045), (40.504677, 12.940952, -26.304045), (39.881157, 15.45085, -25.899126), (41.181953, 15.45085, -23.776413), (41.825813, 12.940952, -24.148146), (41.825813, 12.940952, -24.148146), (41.181953, 15.45085, -23.776413), (42.369877, 15.45085, -21.588531), (43.03231, 12.940952, -21.926058), (43.03231, 12.940952, -21.926058), (42.369877, 15.45085, -21.588531), (43.44167, 15.45085, -19.341476), (44.120857, 12.940952, -19.643871), (44.120857, 12.940952, -19.643871), (43.44167, 15.45085, -19.341476), (44.394386, 15.45085, -17.041409), (45.08847, 12.940952, -17.307842), (45.08847, 12.940952, -17.307842), (44.394386, 15.45085, -17.041409), (45.225426, 15.45085, -14.694632), (45.932503, 12.940952, -14.924375), (45.932503, 12.940952, -14.924375), (45.225426, 15.45085, -14.694632), (45.932503, 15.45085, -12.307577), (46.650635, 12.940952, -12.5), (46.650635, 12.940952, -12.5), (45.932503, 15.45085, -12.307577), (46.513683, 15.45085, -9.886788), (47.240902, 12.940952, -10.041364), (47.240902, 12.940952, -10.041364), (46.513683, 15.45085, -9.886788), (46.967373, 15.45085, -7.438901), (47.701683, 12.940952, -7.5552044), (47.701683, 12.940952, -7.5552044), (46.967373, 15.45085, -7.438901), (47.292328, 15.45085, -4.970624), (48.03172, 12.940952, -5.048337), (48.03172, 12.940952, -5.048337), (47.292328, 15.45085, -4.970624), (47.487656, 15.45085, -2.4887226), (48.230103, 12.940952, -2.5276325), (48.230103, 12.940952, -2.5276325), (47.487656, 15.45085, -2.4887226), (47.552826, 15.45085, 0), (48.29629, 12.940952, 0), (47.552826, 15.45085, 0), (46.67902, 17.918398, 0), (46.615047, 17.918398, 2.4429913), (47.487656, 15.45085, 2.4887226), (47.487656, 15.45085, 2.4887226), (46.615047, 17.918398, 2.4429913), (46.42331, 17.918398, 4.8792863), (47.292328, 15.45085, 4.970624), (47.292328, 15.45085, 4.970624), (46.42331, 17.918398, 4.8792863), (46.104324, 17.918398, 7.302208), (46.967373, 15.45085, 7.438901), (46.967373, 15.45085, 7.438901), (46.104324, 17.918398, 7.302208), (45.658974, 17.918398, 9.705114), (46.513683, 15.45085, 9.886788), (46.513683, 15.45085, 9.886788), (45.658974, 17.918398, 9.705114), (45.08847, 17.918398, 12.08142), (45.932503, 15.45085, 12.307577), (45.932503, 15.45085, 12.307577), (45.08847, 17.918398, 12.08142), (44.394386, 17.918398, 14.424611), (45.225426, 15.45085, 14.694632), (45.225426, 15.45085, 14.694632), (44.394386, 17.918398, 14.424611), (43.57862, 17.918398, 16.728266), (44.394386, 15.45085, 17.041409), (44.394386, 15.45085, 17.041409), (43.57862, 17.918398, 16.728266), (42.64341, 17.918398, 18.986069), (43.44167, 15.45085, 19.341476), (43.44167, 15.45085, 19.341476), (42.64341, 17.918398, 18.986069), (41.591312, 17.918398, 21.191832), (42.369877, 15.45085, 21.588531), (42.369877, 15.45085, 21.588531), (41.591312, 17.918398, 21.191832), (40.425217, 17.918398, 23.33951), (41.181953, 15.45085, 23.776413), (41.181953, 15.45085, 23.776413), (40.425217, 17.918398, 23.33951), (39.148323, 17.918398, 25.423218), (39.881157, 15.45085, 25.899126), (39.881157, 15.45085, 25.899126), (39.148323, 17.918398, 25.423218), (37.764122, 17.918398, 27.43724), (38.471043, 15.45085, 27.95085), (38.471043, 15.45085, 27.95085), (37.764122, 17.918398, 27.43724), (36.276413, 17.918398, 29.37606), (36.955486, 15.45085, 29.925962), (36.955486, 15.45085, 29.925962), (36.276413, 17.918398, 29.37606), (34.689274, 17.918398, 31.234362), (35.33864, 15.45085, 31.819052), (35.33864, 15.45085, 31.819052), (34.689274, 17.918398, 31.234362), (33.007053, 17.918398, 33.007053), (33.624924, 15.45085, 33.624924), (33.624924, 15.45085, 33.624924), (33.007053, 17.918398, 33.007053), (31.234362, 17.918398, 34.689274), (31.819052, 15.45085, 35.33864), (31.819052, 15.45085, 35.33864), (31.234362, 17.918398, 34.689274), (29.37606, 17.918398, 36.276413), (29.925962, 15.45085, 36.955486), (29.925962, 15.45085, 36.955486), (29.37606, 17.918398, 36.276413), (27.43724, 17.918398, 37.764122), (27.95085, 15.45085, 38.471043), (27.95085, 15.45085, 38.471043), (27.43724, 17.918398, 37.764122), (25.423218, 17.918398, 39.148323), (25.899126, 15.45085, 39.881157), (25.899126, 15.45085, 39.881157), (25.423218, 17.918398, 39.148323), (23.33951, 17.918398, 40.425217), (23.776413, 15.45085, 41.181953), (23.776413, 15.45085, 41.181953), (23.33951, 17.918398, 40.425217), (21.191832, 17.918398, 41.591312), (21.588531, 15.45085, 42.369877), (21.588531, 15.45085, 42.369877), (21.191832, 17.918398, 41.591312), (18.986069, 17.918398, 42.64341), (19.341476, 15.45085, 43.44167), (19.341476, 15.45085, 43.44167), (18.986069, 17.918398, 42.64341), (16.728266, 17.918398, 43.57862), (17.041409, 15.45085, 44.394386), (17.041409, 15.45085, 44.394386), (16.728266, 17.918398, 43.57862), (14.424611, 17.918398, 44.394386), (14.694632, 15.45085, 45.225426), (14.694632, 15.45085, 45.225426), (14.424611, 17.918398, 44.394386), (12.08142, 17.918398, 45.08847), (12.307577, 15.45085, 45.932503), (12.307577, 15.45085, 45.932503), (12.08142, 17.918398, 45.08847), (9.705114, 17.918398, 45.658974), (9.886788, 15.45085, 46.513683), (9.886788, 15.45085, 46.513683), (9.705114, 17.918398, 45.658974), (7.302208, 17.918398, 46.104324), (7.438901, 15.45085, 46.967373), (7.438901, 15.45085, 46.967373), (7.302208, 17.918398, 46.104324), (4.8792863, 17.918398, 46.42331), (4.970624, 15.45085, 47.292328), (4.970624, 15.45085, 47.292328), (4.8792863, 17.918398, 46.42331), (2.4429913, 17.918398, 46.615047), (2.4887226, 15.45085, 47.487656), (2.4887226, 15.45085, 47.487656), (2.4429913, 17.918398, 46.615047), (2.8582657e-15, 17.918398, 46.67902), (2.9117708e-15, 15.45085, 47.552826), (2.9117708e-15, 15.45085, 47.552826), (2.8582657e-15, 17.918398, 46.67902), (-2.4429913, 17.918398, 46.615047), (-2.4887226, 15.45085, 47.487656), (-2.4887226, 15.45085, 47.487656), (-2.4429913, 17.918398, 46.615047), (-4.8792863, 17.918398, 46.42331), (-4.970624, 15.45085, 47.292328), (-4.970624, 15.45085, 47.292328), (-4.8792863, 17.918398, 46.42331), (-7.302208, 17.918398, 46.104324), (-7.438901, 15.45085, 46.967373), (-7.438901, 15.45085, 46.967373), (-7.302208, 17.918398, 46.104324), (-9.705114, 17.918398, 45.658974), (-9.886788, 15.45085, 46.513683), (-9.886788, 15.45085, 46.513683), (-9.705114, 17.918398, 45.658974), (-12.08142, 17.918398, 45.08847), (-12.307577, 15.45085, 45.932503), (-12.307577, 15.45085, 45.932503), (-12.08142, 17.918398, 45.08847), (-14.424611, 17.918398, 44.394386), (-14.694632, 15.45085, 45.225426), (-14.694632, 15.45085, 45.225426), (-14.424611, 17.918398, 44.394386), (-16.728266, 17.918398, 43.57862), (-17.041409, 15.45085, 44.394386), (-17.041409, 15.45085, 44.394386), (-16.728266, 17.918398, 43.57862), (-18.986069, 17.918398, 42.64341), (-19.341476, 15.45085, 43.44167), (-19.341476, 15.45085, 43.44167), (-18.986069, 17.918398, 42.64341), (-21.191832, 17.918398, 41.591312), (-21.588531, 15.45085, 42.369877), (-21.588531, 15.45085, 42.369877), (-21.191832, 17.918398, 41.591312), (-23.33951, 17.918398, 40.425217), (-23.776413, 15.45085, 41.181953), (-23.776413, 15.45085, 41.181953), (-23.33951, 17.918398, 40.425217), (-25.423218, 17.918398, 39.148323), (-25.899126, 15.45085, 39.881157), (-25.899126, 15.45085, 39.881157), (-25.423218, 17.918398, 39.148323), (-27.43724, 17.918398, 37.764122), (-27.95085, 15.45085, 38.471043), (-27.95085, 15.45085, 38.471043), (-27.43724, 17.918398, 37.764122), (-29.37606, 17.918398, 36.276413), (-29.925962, 15.45085, 36.955486), (-29.925962, 15.45085, 36.955486), (-29.37606, 17.918398, 36.276413), (-31.234362, 17.918398, 34.689274), (-31.819052, 15.45085, 35.33864), (-31.819052, 15.45085, 35.33864), (-31.234362, 17.918398, 34.689274), (-33.007053, 17.918398, 33.007053), (-33.624924, 15.45085, 33.624924), (-33.624924, 15.45085, 33.624924), (-33.007053, 17.918398, 33.007053), (-34.689274, 17.918398, 31.234362), (-35.33864, 15.45085, 31.819052), (-35.33864, 15.45085, 31.819052), (-34.689274, 17.918398, 31.234362), (-36.276413, 17.918398, 29.37606), (-36.955486, 15.45085, 29.925962), (-36.955486, 15.45085, 29.925962), (-36.276413, 17.918398, 29.37606), (-37.764122, 17.918398, 27.43724), (-38.471043, 15.45085, 27.95085), (-38.471043, 15.45085, 27.95085), (-37.764122, 17.918398, 27.43724), (-39.148323, 17.918398, 25.423218), (-39.881157, 15.45085, 25.899126), (-39.881157, 15.45085, 25.899126), (-39.148323, 17.918398, 25.423218), (-40.425217, 17.918398, 23.33951), (-41.181953, 15.45085, 23.776413), (-41.181953, 15.45085, 23.776413), (-40.425217, 17.918398, 23.33951), (-41.591312, 17.918398, 21.191832), (-42.369877, 15.45085, 21.588531), (-42.369877, 15.45085, 21.588531), (-41.591312, 17.918398, 21.191832), (-42.64341, 17.918398, 18.986069), (-43.44167, 15.45085, 19.341476), (-43.44167, 15.45085, 19.341476), (-42.64341, 17.918398, 18.986069), (-43.57862, 17.918398, 16.728266), (-44.394386, 15.45085, 17.041409), (-44.394386, 15.45085, 17.041409), (-43.57862, 17.918398, 16.728266), (-44.394386, 17.918398, 14.424611), (-45.225426, 15.45085, 14.694632), (-45.225426, 15.45085, 14.694632), (-44.394386, 17.918398, 14.424611), (-45.08847, 17.918398, 12.08142), (-45.932503, 15.45085, 12.307577), (-45.932503, 15.45085, 12.307577), (-45.08847, 17.918398, 12.08142), (-45.658974, 17.918398, 9.705114), (-46.513683, 15.45085, 9.886788), (-46.513683, 15.45085, 9.886788), (-45.658974, 17.918398, 9.705114), (-46.104324, 17.918398, 7.302208), (-46.967373, 15.45085, 7.438901), (-46.967373, 15.45085, 7.438901), (-46.104324, 17.918398, 7.302208), (-46.42331, 17.918398, 4.8792863), (-47.292328, 15.45085, 4.970624), (-47.292328, 15.45085, 4.970624), (-46.42331, 17.918398, 4.8792863), (-46.615047, 17.918398, 2.4429913), (-47.487656, 15.45085, 2.4887226), (-47.487656, 15.45085, 2.4887226), (-46.615047, 17.918398, 2.4429913), (-46.67902, 17.918398, 5.7165313e-15), (-47.552826, 15.45085, 5.8235417e-15), (-47.552826, 15.45085, 5.8235417e-15), (-46.67902, 17.918398, 5.7165313e-15), (-46.615047, 17.918398, -2.4429913), (-47.487656, 15.45085, -2.4887226), (-47.487656, 15.45085, -2.4887226), (-46.615047, 17.918398, -2.4429913), (-46.42331, 17.918398, -4.8792863), (-47.292328, 15.45085, -4.970624), (-47.292328, 15.45085, -4.970624), (-46.42331, 17.918398, -4.8792863), (-46.104324, 17.918398, -7.302208), (-46.967373, 15.45085, -7.438901), (-46.967373, 15.45085, -7.438901), (-46.104324, 17.918398, -7.302208), (-45.658974, 17.918398, -9.705114), (-46.513683, 15.45085, -9.886788), (-46.513683, 15.45085, -9.886788), (-45.658974, 17.918398, -9.705114), (-45.08847, 17.918398, -12.08142), (-45.932503, 15.45085, -12.307577), (-45.932503, 15.45085, -12.307577), (-45.08847, 17.918398, -12.08142), (-44.394386, 17.918398, -14.424611), (-45.225426, 15.45085, -14.694632), (-45.225426, 15.45085, -14.694632), (-44.394386, 17.918398, -14.424611), (-43.57862, 17.918398, -16.728266), (-44.394386, 15.45085, -17.041409), (-44.394386, 15.45085, -17.041409), (-43.57862, 17.918398, -16.728266), (-42.64341, 17.918398, -18.986069), (-43.44167, 15.45085, -19.341476), (-43.44167, 15.45085, -19.341476), (-42.64341, 17.918398, -18.986069), (-41.591312, 17.918398, -21.191832), (-42.369877, 15.45085, -21.588531), (-42.369877, 15.45085, -21.588531), (-41.591312, 17.918398, -21.191832), (-40.425217, 17.918398, -23.33951), (-41.181953, 15.45085, -23.776413), (-41.181953, 15.45085, -23.776413), (-40.425217, 17.918398, -23.33951), (-39.148323, 17.918398, -25.423218), (-39.881157, 15.45085, -25.899126), (-39.881157, 15.45085, -25.899126), (-39.148323, 17.918398, -25.423218), (-37.764122, 17.918398, -27.43724), (-38.471043, 15.45085, -27.95085), (-38.471043, 15.45085, -27.95085), (-37.764122, 17.918398, -27.43724), (-36.276413, 17.918398, -29.37606), (-36.955486, 15.45085, -29.925962), (-36.955486, 15.45085, -29.925962), (-36.276413, 17.918398, -29.37606), (-34.689274, 17.918398, -31.234362), (-35.33864, 15.45085, -31.819052), (-35.33864, 15.45085, -31.819052), (-34.689274, 17.918398, -31.234362), (-33.007053, 17.918398, -33.007053), (-33.624924, 15.45085, -33.624924), (-33.624924, 15.45085, -33.624924), (-33.007053, 17.918398, -33.007053), (-31.234362, 17.918398, -34.689274), (-31.819052, 15.45085, -35.33864), (-31.819052, 15.45085, -35.33864), (-31.234362, 17.918398, -34.689274), (-29.37606, 17.918398, -36.276413), (-29.925962, 15.45085, -36.955486), (-29.925962, 15.45085, -36.955486), (-29.37606, 17.918398, -36.276413), (-27.43724, 17.918398, -37.764122), (-27.95085, 15.45085, -38.471043), (-27.95085, 15.45085, -38.471043), (-27.43724, 17.918398, -37.764122), (-25.423218, 17.918398, -39.148323), (-25.899126, 15.45085, -39.881157), (-25.899126, 15.45085, -39.881157), (-25.423218, 17.918398, -39.148323), (-23.33951, 17.918398, -40.425217), (-23.776413, 15.45085, -41.181953), (-23.776413, 15.45085, -41.181953), (-23.33951, 17.918398, -40.425217), (-21.191832, 17.918398, -41.591312), (-21.588531, 15.45085, -42.369877), (-21.588531, 15.45085, -42.369877), (-21.191832, 17.918398, -41.591312), (-18.986069, 17.918398, -42.64341), (-19.341476, 15.45085, -43.44167), (-19.341476, 15.45085, -43.44167), (-18.986069, 17.918398, -42.64341), (-16.728266, 17.918398, -43.57862), (-17.041409, 15.45085, -44.394386), (-17.041409, 15.45085, -44.394386), (-16.728266, 17.918398, -43.57862), (-14.424611, 17.918398, -44.394386), (-14.694632, 15.45085, -45.225426), (-14.694632, 15.45085, -45.225426), (-14.424611, 17.918398, -44.394386), (-12.08142, 17.918398, -45.08847), (-12.307577, 15.45085, -45.932503), (-12.307577, 15.45085, -45.932503), (-12.08142, 17.918398, -45.08847), (-9.705114, 17.918398, -45.658974), (-9.886788, 15.45085, -46.513683), (-9.886788, 15.45085, -46.513683), (-9.705114, 17.918398, -45.658974), (-7.302208, 17.918398, -46.104324), (-7.438901, 15.45085, -46.967373), (-7.438901, 15.45085, -46.967373), (-7.302208, 17.918398, -46.104324), (-4.8792863, 17.918398, -46.42331), (-4.970624, 15.45085, -47.292328), (-4.970624, 15.45085, -47.292328), (-4.8792863, 17.918398, -46.42331), (-2.4429913, 17.918398, -46.615047), (-2.4887226, 15.45085, -47.487656), (-2.4887226, 15.45085, -47.487656), (-2.4429913, 17.918398, -46.615047), (-8.5747974e-15, 17.918398, -46.67902), (-8.735313e-15, 15.45085, -47.552826), (-8.735313e-15, 15.45085, -47.552826), (-8.5747974e-15, 17.918398, -46.67902), (2.4429913, 17.918398, -46.615047), (2.4887226, 15.45085, -47.487656), (2.4887226, 15.45085, -47.487656), (2.4429913, 17.918398, -46.615047), (4.8792863, 17.918398, -46.42331), (4.970624, 15.45085, -47.292328), (4.970624, 15.45085, -47.292328), (4.8792863, 17.918398, -46.42331), (7.302208, 17.918398, -46.104324), (7.438901, 15.45085, -46.967373), (7.438901, 15.45085, -46.967373), (7.302208, 17.918398, -46.104324), (9.705114, 17.918398, -45.658974), (9.886788, 15.45085, -46.513683), (9.886788, 15.45085, -46.513683), (9.705114, 17.918398, -45.658974), (12.08142, 17.918398, -45.08847), (12.307577, 15.45085, -45.932503), (12.307577, 15.45085, -45.932503), (12.08142, 17.918398, -45.08847), (14.424611, 17.918398, -44.394386), (14.694632, 15.45085, -45.225426), (14.694632, 15.45085, -45.225426), (14.424611, 17.918398, -44.394386), (16.728266, 17.918398, -43.57862), (17.041409, 15.45085, -44.394386), (17.041409, 15.45085, -44.394386), (16.728266, 17.918398, -43.57862), (18.986069, 17.918398, -42.64341), (19.341476, 15.45085, -43.44167), (19.341476, 15.45085, -43.44167), (18.986069, 17.918398, -42.64341), (21.191832, 17.918398, -41.591312), (21.588531, 15.45085, -42.369877), (21.588531, 15.45085, -42.369877), (21.191832, 17.918398, -41.591312), (23.33951, 17.918398, -40.425217), (23.776413, 15.45085, -41.181953), (23.776413, 15.45085, -41.181953), (23.33951, 17.918398, -40.425217), (25.423218, 17.918398, -39.148323), (25.899126, 15.45085, -39.881157), (25.899126, 15.45085, -39.881157), (25.423218, 17.918398, -39.148323), (27.43724, 17.918398, -37.764122), (27.95085, 15.45085, -38.471043), (27.95085, 15.45085, -38.471043), (27.43724, 17.918398, -37.764122), (29.37606, 17.918398, -36.276413), (29.925962, 15.45085, -36.955486), (29.925962, 15.45085, -36.955486), (29.37606, 17.918398, -36.276413), (31.234362, 17.918398, -34.689274), (31.819052, 15.45085, -35.33864), (31.819052, 15.45085, -35.33864), (31.234362, 17.918398, -34.689274), (33.007053, 17.918398, -33.007053), (33.624924, 15.45085, -33.624924), (33.624924, 15.45085, -33.624924), (33.007053, 17.918398, -33.007053), (34.689274, 17.918398, -31.234362), (35.33864, 15.45085, -31.819052), (35.33864, 15.45085, -31.819052), (34.689274, 17.918398, -31.234362), (36.276413, 17.918398, -29.37606), (36.955486, 15.45085, -29.925962), (36.955486, 15.45085, -29.925962), (36.276413, 17.918398, -29.37606), (37.764122, 17.918398, -27.43724), (38.471043, 15.45085, -27.95085), (38.471043, 15.45085, -27.95085), (37.764122, 17.918398, -27.43724), (39.148323, 17.918398, -25.423218), (39.881157, 15.45085, -25.899126), (39.881157, 15.45085, -25.899126), (39.148323, 17.918398, -25.423218), (40.425217, 17.918398, -23.33951), (41.181953, 15.45085, -23.776413), (41.181953, 15.45085, -23.776413), (40.425217, 17.918398, -23.33951), (41.591312, 17.918398, -21.191832), (42.369877, 15.45085, -21.588531), (42.369877, 15.45085, -21.588531), (41.591312, 17.918398, -21.191832), (42.64341, 17.918398, -18.986069), (43.44167, 15.45085, -19.341476), (43.44167, 15.45085, -19.341476), (42.64341, 17.918398, -18.986069), (43.57862, 17.918398, -16.728266), (44.394386, 15.45085, -17.041409), (44.394386, 15.45085, -17.041409), (43.57862, 17.918398, -16.728266), (44.394386, 17.918398, -14.424611), (45.225426, 15.45085, -14.694632), (45.225426, 15.45085, -14.694632), (44.394386, 17.918398, -14.424611), (45.08847, 17.918398, -12.08142), (45.932503, 15.45085, -12.307577), (45.932503, 15.45085, -12.307577), (45.08847, 17.918398, -12.08142), (45.658974, 17.918398, -9.705114), (46.513683, 15.45085, -9.886788), (46.513683, 15.45085, -9.886788), (45.658974, 17.918398, -9.705114), (46.104324, 17.918398, -7.302208), (46.967373, 15.45085, -7.438901), (46.967373, 15.45085, -7.438901), (46.104324, 17.918398, -7.302208), (46.42331, 17.918398, -4.8792863), (47.292328, 15.45085, -4.970624), (47.292328, 15.45085, -4.970624), (46.42331, 17.918398, -4.8792863), (46.615047, 17.918398, -2.4429913), (47.487656, 15.45085, -2.4887226), (47.487656, 15.45085, -2.4887226), (46.615047, 17.918398, -2.4429913), (46.67902, 17.918398, 0), (47.552826, 15.45085, 0), (46.67902, 17.918398, 0), (45.677273, 20.336832, 0), (45.614674, 20.336832, 2.3905637), (46.615047, 17.918398, 2.4429913), (46.615047, 17.918398, 2.4429913), (45.614674, 20.336832, 2.3905637), (45.427048, 20.336832, 4.774575), (46.42331, 17.918398, 4.8792863), (46.42331, 17.918398, 4.8792863), (45.427048, 20.336832, 4.774575), (45.11491, 20.336832, 7.1454997), (46.104324, 17.918398, 7.302208), (46.104324, 17.918398, 7.302208), (45.11491, 20.336832, 7.1454997), (44.679115, 20.336832, 9.496839), (45.658974, 17.918398, 9.705114), (45.658974, 17.918398, 9.705114), (44.679115, 20.336832, 9.496839), (44.120857, 20.336832, 11.822148), (45.08847, 17.918398, 12.08142), (45.08847, 17.918398, 12.08142), (44.120857, 20.336832, 11.822148), (43.44167, 20.336832, 14.115053), (44.394386, 17.918398, 14.424611), (44.394386, 17.918398, 14.424611), (43.44167, 20.336832, 14.115053), (42.64341, 20.336832, 16.36927), (43.57862, 17.918398, 16.728266), (43.57862, 17.918398, 16.728266), (42.64341, 20.336832, 16.36927), (41.728264, 20.336832, 18.57862), (42.64341, 17.918398, 18.986069), (42.64341, 17.918398, 18.986069), (41.728264, 20.336832, 18.57862), (40.69875, 20.336832, 20.737047), (41.591312, 17.918398, 21.191832), (41.591312, 17.918398, 21.191832), (40.69875, 20.336832, 20.737047), (39.55768, 20.336832, 22.838636), (40.425217, 17.918398, 23.33951), (40.425217, 17.918398, 23.33951), (39.55768, 20.336832, 22.838636), (38.308186, 20.336832, 24.877626), (39.148323, 17.918398, 25.423218), (39.148323, 17.918398, 25.423218), (38.308186, 20.336832, 24.877626), (36.95369, 20.336832, 26.848427), (37.764122, 17.918398, 27.43724), (37.764122, 17.918398, 27.43724), (36.95369, 20.336832, 26.848427), (35.49791, 20.336832, 28.74564), (36.276413, 17.918398, 29.37606), (36.276413, 17.918398, 29.37606), (35.49791, 20.336832, 28.74564), (33.944828, 20.336832, 30.564062), (34.689274, 17.918398, 31.234362), (34.689274, 17.918398, 31.234362), (33.944828, 20.336832, 30.564062), (32.29871, 20.336832, 32.29871), (33.007053, 17.918398, 33.007053), (33.007053, 17.918398, 33.007053), (32.29871, 20.336832, 32.29871), (30.564062, 20.336832, 33.944828), (31.234362, 17.918398, 34.689274), (31.234362, 17.918398, 34.689274), (30.564062, 20.336832, 33.944828), (28.74564, 20.336832, 35.49791), (29.37606, 17.918398, 36.276413), (29.37606, 17.918398, 36.276413), (28.74564, 20.336832, 35.49791), (26.848427, 20.336832, 36.95369), (27.43724, 17.918398, 37.764122), (27.43724, 17.918398, 37.764122), (26.848427, 20.336832, 36.95369), (24.877626, 20.336832, 38.308186), (25.423218, 17.918398, 39.148323), (25.423218, 17.918398, 39.148323), (24.877626, 20.336832, 38.308186), (22.838636, 20.336832, 39.55768), (23.33951, 17.918398, 40.425217), (23.33951, 17.918398, 40.425217), (22.838636, 20.336832, 39.55768), (20.737047, 20.336832, 40.69875), (21.191832, 17.918398, 41.591312), (21.191832, 17.918398, 41.591312), (20.737047, 20.336832, 40.69875), (18.57862, 20.336832, 41.728264), (18.986069, 17.918398, 42.64341), (18.986069, 17.918398, 42.64341), (18.57862, 20.336832, 41.728264), (16.36927, 20.336832, 42.64341), (16.728266, 17.918398, 43.57862), (16.728266, 17.918398, 43.57862), (16.36927, 20.336832, 42.64341), (14.115053, 20.336832, 43.44167), (14.424611, 17.918398, 44.394386), (14.424611, 17.918398, 44.394386), (14.115053, 20.336832, 43.44167), (11.822148, 20.336832, 44.120857), (12.08142, 17.918398, 45.08847), (12.08142, 17.918398, 45.08847), (11.822148, 20.336832, 44.120857), (9.496839, 20.336832, 44.679115), (9.705114, 17.918398, 45.658974), (9.705114, 17.918398, 45.658974), (9.496839, 20.336832, 44.679115), (7.1454997, 20.336832, 45.11491), (7.302208, 17.918398, 46.104324), (7.302208, 17.918398, 46.104324), (7.1454997, 20.336832, 45.11491), (4.774575, 20.336832, 45.427048), (4.8792863, 17.918398, 46.42331), (4.8792863, 17.918398, 46.42331), (4.774575, 20.336832, 45.427048), (2.3905637, 20.336832, 45.614674), (2.4429913, 17.918398, 46.615047), (2.4429913, 17.918398, 46.615047), (2.3905637, 20.336832, 45.614674), (2.7969263e-15, 20.336832, 45.677273), (2.8582657e-15, 17.918398, 46.67902), (2.8582657e-15, 17.918398, 46.67902), (2.7969263e-15, 20.336832, 45.677273), (-2.3905637, 20.336832, 45.614674), (-2.4429913, 17.918398, 46.615047), (-2.4429913, 17.918398, 46.615047), (-2.3905637, 20.336832, 45.614674), (-4.774575, 20.336832, 45.427048), (-4.8792863, 17.918398, 46.42331), (-4.8792863, 17.918398, 46.42331), (-4.774575, 20.336832, 45.427048), (-7.1454997, 20.336832, 45.11491), (-7.302208, 17.918398, 46.104324), (-7.302208, 17.918398, 46.104324), (-7.1454997, 20.336832, 45.11491), (-9.496839, 20.336832, 44.679115), (-9.705114, 17.918398, 45.658974), (-9.705114, 17.918398, 45.658974), (-9.496839, 20.336832, 44.679115), (-11.822148, 20.336832, 44.120857), (-12.08142, 17.918398, 45.08847), (-12.08142, 17.918398, 45.08847), (-11.822148, 20.336832, 44.120857), (-14.115053, 20.336832, 43.44167), (-14.424611, 17.918398, 44.394386), (-14.424611, 17.918398, 44.394386), (-14.115053, 20.336832, 43.44167), (-16.36927, 20.336832, 42.64341), (-16.728266, 17.918398, 43.57862), (-16.728266, 17.918398, 43.57862), (-16.36927, 20.336832, 42.64341), (-18.57862, 20.336832, 41.728264), (-18.986069, 17.918398, 42.64341), (-18.986069, 17.918398, 42.64341), (-18.57862, 20.336832, 41.728264), (-20.737047, 20.336832, 40.69875), (-21.191832, 17.918398, 41.591312), (-21.191832, 17.918398, 41.591312), (-20.737047, 20.336832, 40.69875), (-22.838636, 20.336832, 39.55768), (-23.33951, 17.918398, 40.425217), (-23.33951, 17.918398, 40.425217), (-22.838636, 20.336832, 39.55768), (-24.877626, 20.336832, 38.308186), (-25.423218, 17.918398, 39.148323), (-25.423218, 17.918398, 39.148323), (-24.877626, 20.336832, 38.308186), (-26.848427, 20.336832, 36.95369), (-27.43724, 17.918398, 37.764122), (-27.43724, 17.918398, 37.764122), (-26.848427, 20.336832, 36.95369), (-28.74564, 20.336832, 35.49791), (-29.37606, 17.918398, 36.276413), (-29.37606, 17.918398, 36.276413), (-28.74564, 20.336832, 35.49791), (-30.564062, 20.336832, 33.944828), (-31.234362, 17.918398, 34.689274), (-31.234362, 17.918398, 34.689274), (-30.564062, 20.336832, 33.944828), (-32.29871, 20.336832, 32.29871), (-33.007053, 17.918398, 33.007053), (-33.007053, 17.918398, 33.007053), (-32.29871, 20.336832, 32.29871), (-33.944828, 20.336832, 30.564062), (-34.689274, 17.918398, 31.234362), (-34.689274, 17.918398, 31.234362), (-33.944828, 20.336832, 30.564062), (-35.49791, 20.336832, 28.74564), (-36.276413, 17.918398, 29.37606), (-36.276413, 17.918398, 29.37606), (-35.49791, 20.336832, 28.74564), (-36.95369, 20.336832, 26.848427), (-37.764122, 17.918398, 27.43724), (-37.764122, 17.918398, 27.43724), (-36.95369, 20.336832, 26.848427), (-38.308186, 20.336832, 24.877626), (-39.148323, 17.918398, 25.423218), (-39.148323, 17.918398, 25.423218), (-38.308186, 20.336832, 24.877626), (-39.55768, 20.336832, 22.838636), (-40.425217, 17.918398, 23.33951), (-40.425217, 17.918398, 23.33951), (-39.55768, 20.336832, 22.838636), (-40.69875, 20.336832, 20.737047), (-41.591312, 17.918398, 21.191832), (-41.591312, 17.918398, 21.191832), (-40.69875, 20.336832, 20.737047), (-41.728264, 20.336832, 18.57862), (-42.64341, 17.918398, 18.986069), (-42.64341, 17.918398, 18.986069), (-41.728264, 20.336832, 18.57862), (-42.64341, 20.336832, 16.36927), (-43.57862, 17.918398, 16.728266), (-43.57862, 17.918398, 16.728266), (-42.64341, 20.336832, 16.36927), (-43.44167, 20.336832, 14.115053), (-44.394386, 17.918398, 14.424611), (-44.394386, 17.918398, 14.424611), (-43.44167, 20.336832, 14.115053), (-44.120857, 20.336832, 11.822148), (-45.08847, 17.918398, 12.08142), (-45.08847, 17.918398, 12.08142), (-44.120857, 20.336832, 11.822148), (-44.679115, 20.336832, 9.496839), (-45.658974, 17.918398, 9.705114), (-45.658974, 17.918398, 9.705114), (-44.679115, 20.336832, 9.496839), (-45.11491, 20.336832, 7.1454997), (-46.104324, 17.918398, 7.302208), (-46.104324, 17.918398, 7.302208), (-45.11491, 20.336832, 7.1454997), (-45.427048, 20.336832, 4.774575), (-46.42331, 17.918398, 4.8792863), (-46.42331, 17.918398, 4.8792863), (-45.427048, 20.336832, 4.774575), (-45.614674, 20.336832, 2.3905637), (-46.615047, 17.918398, 2.4429913), (-46.615047, 17.918398, 2.4429913), (-45.614674, 20.336832, 2.3905637), (-45.677273, 20.336832, 5.5938526e-15), (-46.67902, 17.918398, 5.7165313e-15), (-46.67902, 17.918398, 5.7165313e-15), (-45.677273, 20.336832, 5.5938526e-15), (-45.614674, 20.336832, -2.3905637), (-46.615047, 17.918398, -2.4429913), (-46.615047, 17.918398, -2.4429913), (-45.614674, 20.336832, -2.3905637), (-45.427048, 20.336832, -4.774575), (-46.42331, 17.918398, -4.8792863), (-46.42331, 17.918398, -4.8792863), (-45.427048, 20.336832, -4.774575), (-45.11491, 20.336832, -7.1454997), (-46.104324, 17.918398, -7.302208), (-46.104324, 17.918398, -7.302208), (-45.11491, 20.336832, -7.1454997), (-44.679115, 20.336832, -9.496839), (-45.658974, 17.918398, -9.705114), (-45.658974, 17.918398, -9.705114), (-44.679115, 20.336832, -9.496839), (-44.120857, 20.336832, -11.822148), (-45.08847, 17.918398, -12.08142), (-45.08847, 17.918398, -12.08142), (-44.120857, 20.336832, -11.822148), (-43.44167, 20.336832, -14.115053), (-44.394386, 17.918398, -14.424611), (-44.394386, 17.918398, -14.424611), (-43.44167, 20.336832, -14.115053), (-42.64341, 20.336832, -16.36927), (-43.57862, 17.918398, -16.728266), (-43.57862, 17.918398, -16.728266), (-42.64341, 20.336832, -16.36927), (-41.728264, 20.336832, -18.57862), (-42.64341, 17.918398, -18.986069), (-42.64341, 17.918398, -18.986069), (-41.728264, 20.336832, -18.57862), (-40.69875, 20.336832, -20.737047), (-41.591312, 17.918398, -21.191832), (-41.591312, 17.918398, -21.191832), (-40.69875, 20.336832, -20.737047), (-39.55768, 20.336832, -22.838636), (-40.425217, 17.918398, -23.33951), (-40.425217, 17.918398, -23.33951), (-39.55768, 20.336832, -22.838636), (-38.308186, 20.336832, -24.877626), (-39.148323, 17.918398, -25.423218), (-39.148323, 17.918398, -25.423218), (-38.308186, 20.336832, -24.877626), (-36.95369, 20.336832, -26.848427), (-37.764122, 17.918398, -27.43724), (-37.764122, 17.918398, -27.43724), (-36.95369, 20.336832, -26.848427), (-35.49791, 20.336832, -28.74564), (-36.276413, 17.918398, -29.37606), (-36.276413, 17.918398, -29.37606), (-35.49791, 20.336832, -28.74564), (-33.944828, 20.336832, -30.564062), (-34.689274, 17.918398, -31.234362), (-34.689274, 17.918398, -31.234362), (-33.944828, 20.336832, -30.564062), (-32.29871, 20.336832, -32.29871), (-33.007053, 17.918398, -33.007053), (-33.007053, 17.918398, -33.007053), (-32.29871, 20.336832, -32.29871), (-30.564062, 20.336832, -33.944828), (-31.234362, 17.918398, -34.689274), (-31.234362, 17.918398, -34.689274), (-30.564062, 20.336832, -33.944828), (-28.74564, 20.336832, -35.49791), (-29.37606, 17.918398, -36.276413), (-29.37606, 17.918398, -36.276413), (-28.74564, 20.336832, -35.49791), (-26.848427, 20.336832, -36.95369), (-27.43724, 17.918398, -37.764122), (-27.43724, 17.918398, -37.764122), (-26.848427, 20.336832, -36.95369), (-24.877626, 20.336832, -38.308186), (-25.423218, 17.918398, -39.148323), (-25.423218, 17.918398, -39.148323), (-24.877626, 20.336832, -38.308186), (-22.838636, 20.336832, -39.55768), (-23.33951, 17.918398, -40.425217), (-23.33951, 17.918398, -40.425217), (-22.838636, 20.336832, -39.55768), (-20.737047, 20.336832, -40.69875), (-21.191832, 17.918398, -41.591312), (-21.191832, 17.918398, -41.591312), (-20.737047, 20.336832, -40.69875), (-18.57862, 20.336832, -41.728264), (-18.986069, 17.918398, -42.64341), (-18.986069, 17.918398, -42.64341), (-18.57862, 20.336832, -41.728264), (-16.36927, 20.336832, -42.64341), (-16.728266, 17.918398, -43.57862), (-16.728266, 17.918398, -43.57862), (-16.36927, 20.336832, -42.64341), (-14.115053, 20.336832, -43.44167), (-14.424611, 17.918398, -44.394386), (-14.424611, 17.918398, -44.394386), (-14.115053, 20.336832, -43.44167), (-11.822148, 20.336832, -44.120857), (-12.08142, 17.918398, -45.08847), (-12.08142, 17.918398, -45.08847), (-11.822148, 20.336832, -44.120857), (-9.496839, 20.336832, -44.679115), (-9.705114, 17.918398, -45.658974), (-9.705114, 17.918398, -45.658974), (-9.496839, 20.336832, -44.679115), (-7.1454997, 20.336832, -45.11491), (-7.302208, 17.918398, -46.104324), (-7.302208, 17.918398, -46.104324), (-7.1454997, 20.336832, -45.11491), (-4.774575, 20.336832, -45.427048), (-4.8792863, 17.918398, -46.42331), (-4.8792863, 17.918398, -46.42331), (-4.774575, 20.336832, -45.427048), (-2.3905637, 20.336832, -45.614674), (-2.4429913, 17.918398, -46.615047), (-2.4429913, 17.918398, -46.615047), (-2.3905637, 20.336832, -45.614674), (-8.390779e-15, 20.336832, -45.677273), (-8.5747974e-15, 17.918398, -46.67902), (-8.5747974e-15, 17.918398, -46.67902), (-8.390779e-15, 20.336832, -45.677273), (2.3905637, 20.336832, -45.614674), (2.4429913, 17.918398, -46.615047), (2.4429913, 17.918398, -46.615047), (2.3905637, 20.336832, -45.614674), (4.774575, 20.336832, -45.427048), (4.8792863, 17.918398, -46.42331), (4.8792863, 17.918398, -46.42331), (4.774575, 20.336832, -45.427048), (7.1454997, 20.336832, -45.11491), (7.302208, 17.918398, -46.104324), (7.302208, 17.918398, -46.104324), (7.1454997, 20.336832, -45.11491), (9.496839, 20.336832, -44.679115), (9.705114, 17.918398, -45.658974), (9.705114, 17.918398, -45.658974), (9.496839, 20.336832, -44.679115), (11.822148, 20.336832, -44.120857), (12.08142, 17.918398, -45.08847), (12.08142, 17.918398, -45.08847), (11.822148, 20.336832, -44.120857), (14.115053, 20.336832, -43.44167), (14.424611, 17.918398, -44.394386), (14.424611, 17.918398, -44.394386), (14.115053, 20.336832, -43.44167), (16.36927, 20.336832, -42.64341), (16.728266, 17.918398, -43.57862), (16.728266, 17.918398, -43.57862), (16.36927, 20.336832, -42.64341), (18.57862, 20.336832, -41.728264), (18.986069, 17.918398, -42.64341), (18.986069, 17.918398, -42.64341), (18.57862, 20.336832, -41.728264), (20.737047, 20.336832, -40.69875), (21.191832, 17.918398, -41.591312), (21.191832, 17.918398, -41.591312), (20.737047, 20.336832, -40.69875), (22.838636, 20.336832, -39.55768), (23.33951, 17.918398, -40.425217), (23.33951, 17.918398, -40.425217), (22.838636, 20.336832, -39.55768), (24.877626, 20.336832, -38.308186), (25.423218, 17.918398, -39.148323), (25.423218, 17.918398, -39.148323), (24.877626, 20.336832, -38.308186), (26.848427, 20.336832, -36.95369), (27.43724, 17.918398, -37.764122), (27.43724, 17.918398, -37.764122), (26.848427, 20.336832, -36.95369), (28.74564, 20.336832, -35.49791), (29.37606, 17.918398, -36.276413), (29.37606, 17.918398, -36.276413), (28.74564, 20.336832, -35.49791), (30.564062, 20.336832, -33.944828), (31.234362, 17.918398, -34.689274), (31.234362, 17.918398, -34.689274), (30.564062, 20.336832, -33.944828), (32.29871, 20.336832, -32.29871), (33.007053, 17.918398, -33.007053), (33.007053, 17.918398, -33.007053), (32.29871, 20.336832, -32.29871), (33.944828, 20.336832, -30.564062), (34.689274, 17.918398, -31.234362), (34.689274, 17.918398, -31.234362), (33.944828, 20.336832, -30.564062), (35.49791, 20.336832, -28.74564), (36.276413, 17.918398, -29.37606), (36.276413, 17.918398, -29.37606), (35.49791, 20.336832, -28.74564), (36.95369, 20.336832, -26.848427), (37.764122, 17.918398, -27.43724), (37.764122, 17.918398, -27.43724), (36.95369, 20.336832, -26.848427), (38.308186, 20.336832, -24.877626), (39.148323, 17.918398, -25.423218), (39.148323, 17.918398, -25.423218), (38.308186, 20.336832, -24.877626), (39.55768, 20.336832, -22.838636), (40.425217, 17.918398, -23.33951), (40.425217, 17.918398, -23.33951), (39.55768, 20.336832, -22.838636), (40.69875, 20.336832, -20.737047), (41.591312, 17.918398, -21.191832), (41.591312, 17.918398, -21.191832), (40.69875, 20.336832, -20.737047), (41.728264, 20.336832, -18.57862), (42.64341, 17.918398, -18.986069), (42.64341, 17.918398, -18.986069), (41.728264, 20.336832, -18.57862), (42.64341, 20.336832, -16.36927), (43.57862, 17.918398, -16.728266), (43.57862, 17.918398, -16.728266), (42.64341, 20.336832, -16.36927), (43.44167, 20.336832, -14.115053), (44.394386, 17.918398, -14.424611), (44.394386, 17.918398, -14.424611), (43.44167, 20.336832, -14.115053), (44.120857, 20.336832, -11.822148), (45.08847, 17.918398, -12.08142), (45.08847, 17.918398, -12.08142), (44.120857, 20.336832, -11.822148), (44.679115, 20.336832, -9.496839), (45.658974, 17.918398, -9.705114), (45.658974, 17.918398, -9.705114), (44.679115, 20.336832, -9.496839), (45.11491, 20.336832, -7.1454997), (46.104324, 17.918398, -7.302208), (46.104324, 17.918398, -7.302208), (45.11491, 20.336832, -7.1454997), (45.427048, 20.336832, -4.774575), (46.42331, 17.918398, -4.8792863), (46.42331, 17.918398, -4.8792863), (45.427048, 20.336832, -4.774575), (45.614674, 20.336832, -2.3905637), (46.615047, 17.918398, -2.4429913), (46.615047, 17.918398, -2.4429913), (45.614674, 20.336832, -2.3905637), (45.677273, 20.336832, 0), (46.67902, 17.918398, 0), (45.677273, 20.336832, 0), (44.550327, 22.699526, 0), (44.489273, 22.699526, 2.331584), (45.614674, 20.336832, 2.3905637), (45.614674, 20.336832, 2.3905637), (44.489273, 22.699526, 2.331584), (44.306274, 22.699526, 4.656777), (45.427048, 20.336832, 4.774575), (45.427048, 20.336832, 4.774575), (44.306274, 22.699526, 4.656777), (44.00184, 22.699526, 6.9692063), (45.11491, 20.336832, 7.1454997), (45.11491, 20.336832, 7.1454997), (44.00184, 22.699526, 6.9692063), (43.576794, 22.699526, 9.262533), (44.679115, 20.336832, 9.496839), (44.679115, 20.336832, 9.496839), (43.576794, 22.699526, 9.262533), (43.03231, 22.699526, 11.530473), (44.120857, 20.336832, 11.822148), (44.120857, 20.336832, 11.822148), (43.03231, 22.699526, 11.530473), (42.369877, 22.699526, 13.766808), (43.44167, 20.336832, 14.115053), (43.44167, 20.336832, 14.115053), (42.369877, 22.699526, 13.766808), (41.591312, 22.699526, 15.965409), (42.64341, 20.336832, 16.36927), (42.64341, 20.336832, 16.36927), (41.591312, 22.699526, 15.965409), (40.69875, 22.699526, 18.12025), (41.728264, 20.336832, 18.57862), (41.728264, 20.336832, 18.57862), (40.69875, 22.699526, 18.12025), (39.69463, 22.699526, 20.225426), (40.69875, 20.336832, 20.737047), (40.69875, 20.336832, 20.737047), (39.69463, 22.699526, 20.225426), (38.581715, 22.699526, 22.275164), (39.55768, 20.336832, 22.838636), (39.55768, 20.336832, 22.838636), (38.581715, 22.699526, 22.275164), (37.36305, 22.699526, 24.263847), (38.308186, 20.336832, 24.877626), (38.308186, 20.336832, 24.877626), (37.36305, 22.699526, 24.263847), (36.04197, 22.699526, 26.186026), (36.95369, 20.336832, 26.848427), (36.95369, 20.336832, 26.848427), (36.04197, 22.699526, 26.186026), (34.622105, 22.699526, 28.036428), (35.49791, 20.336832, 28.74564), (35.49791, 20.336832, 28.74564), (34.622105, 22.699526, 28.036428), (33.107346, 22.699526, 29.809986), (33.944828, 20.336832, 30.564062), (33.944828, 20.336832, 30.564062), (33.107346, 22.699526, 29.809986), (31.501839, 22.699526, 31.501839), (32.29871, 20.336832, 32.29871), (32.29871, 20.336832, 32.29871), (31.501839, 22.699526, 31.501839), (29.809986, 22.699526, 33.107346), (30.564062, 20.336832, 33.944828), (30.564062, 20.336832, 33.944828), (29.809986, 22.699526, 33.107346), (28.036428, 22.699526, 34.622105), (28.74564, 20.336832, 35.49791), (28.74564, 20.336832, 35.49791), (28.036428, 22.699526, 34.622105), (26.186026, 22.699526, 36.04197), (26.848427, 20.336832, 36.95369), (26.848427, 20.336832, 36.95369), (26.186026, 22.699526, 36.04197), (24.263847, 22.699526, 37.36305), (24.877626, 20.336832, 38.308186), (24.877626, 20.336832, 38.308186), (24.263847, 22.699526, 37.36305), (22.275164, 22.699526, 38.581715), (22.838636, 20.336832, 39.55768), (22.838636, 20.336832, 39.55768), (22.275164, 22.699526, 38.581715), (20.225426, 22.699526, 39.69463), (20.737047, 20.336832, 40.69875), (20.737047, 20.336832, 40.69875), (20.225426, 22.699526, 39.69463), (18.12025, 22.699526, 40.69875), (18.57862, 20.336832, 41.728264), (18.57862, 20.336832, 41.728264), (18.12025, 22.699526, 40.69875), (15.965409, 22.699526, 41.591312), (16.36927, 20.336832, 42.64341), (16.36927, 20.336832, 42.64341), (15.965409, 22.699526, 41.591312), (13.766808, 22.699526, 42.369877), (14.115053, 20.336832, 43.44167), (14.115053, 20.336832, 43.44167), (13.766808, 22.699526, 42.369877), (11.530473, 22.699526, 43.03231), (11.822148, 20.336832, 44.120857), (11.822148, 20.336832, 44.120857), (11.530473, 22.699526, 43.03231), (9.262533, 22.699526, 43.576794), (9.496839, 20.336832, 44.679115), (9.496839, 20.336832, 44.679115), (9.262533, 22.699526, 43.576794), (6.9692063, 22.699526, 44.00184), (7.1454997, 20.336832, 45.11491), (7.1454997, 20.336832, 45.11491), (6.9692063, 22.699526, 44.00184), (4.656777, 22.699526, 44.306274), (4.774575, 20.336832, 45.427048), (4.774575, 20.336832, 45.427048), (4.656777, 22.699526, 44.306274), (2.331584, 22.699526, 44.489273), (2.3905637, 20.336832, 45.614674), (2.3905637, 20.336832, 45.614674), (2.331584, 22.699526, 44.489273), (2.7279206e-15, 22.699526, 44.550327), (2.7969263e-15, 20.336832, 45.677273), (2.7969263e-15, 20.336832, 45.677273), (2.7279206e-15, 22.699526, 44.550327), (-2.331584, 22.699526, 44.489273), (-2.3905637, 20.336832, 45.614674), (-2.3905637, 20.336832, 45.614674), (-2.331584, 22.699526, 44.489273), (-4.656777, 22.699526, 44.306274), (-4.774575, 20.336832, 45.427048), (-4.774575, 20.336832, 45.427048), (-4.656777, 22.699526, 44.306274), (-6.9692063, 22.699526, 44.00184), (-7.1454997, 20.336832, 45.11491), (-7.1454997, 20.336832, 45.11491), (-6.9692063, 22.699526, 44.00184), (-9.262533, 22.699526, 43.576794), (-9.496839, 20.336832, 44.679115), (-9.496839, 20.336832, 44.679115), (-9.262533, 22.699526, 43.576794), (-11.530473, 22.699526, 43.03231), (-11.822148, 20.336832, 44.120857), (-11.822148, 20.336832, 44.120857), (-11.530473, 22.699526, 43.03231), (-13.766808, 22.699526, 42.369877), (-14.115053, 20.336832, 43.44167), (-14.115053, 20.336832, 43.44167), (-13.766808, 22.699526, 42.369877), (-15.965409, 22.699526, 41.591312), (-16.36927, 20.336832, 42.64341), (-16.36927, 20.336832, 42.64341), (-15.965409, 22.699526, 41.591312), (-18.12025, 22.699526, 40.69875), (-18.57862, 20.336832, 41.728264), (-18.57862, 20.336832, 41.728264), (-18.12025, 22.699526, 40.69875), (-20.225426, 22.699526, 39.69463), (-20.737047, 20.336832, 40.69875), (-20.737047, 20.336832, 40.69875), (-20.225426, 22.699526, 39.69463), (-22.275164, 22.699526, 38.581715), (-22.838636, 20.336832, 39.55768), (-22.838636, 20.336832, 39.55768), (-22.275164, 22.699526, 38.581715), (-24.263847, 22.699526, 37.36305), (-24.877626, 20.336832, 38.308186), (-24.877626, 20.336832, 38.308186), (-24.263847, 22.699526, 37.36305), (-26.186026, 22.699526, 36.04197), (-26.848427, 20.336832, 36.95369), (-26.848427, 20.336832, 36.95369), (-26.186026, 22.699526, 36.04197), (-28.036428, 22.699526, 34.622105), (-28.74564, 20.336832, 35.49791), (-28.74564, 20.336832, 35.49791), (-28.036428, 22.699526, 34.622105), (-29.809986, 22.699526, 33.107346), (-30.564062, 20.336832, 33.944828), (-30.564062, 20.336832, 33.944828), (-29.809986, 22.699526, 33.107346), (-31.501839, 22.699526, 31.501839), (-32.29871, 20.336832, 32.29871), (-32.29871, 20.336832, 32.29871), (-31.501839, 22.699526, 31.501839), (-33.107346, 22.699526, 29.809986), (-33.944828, 20.336832, 30.564062), (-33.944828, 20.336832, 30.564062), (-33.107346, 22.699526, 29.809986), (-34.622105, 22.699526, 28.036428), (-35.49791, 20.336832, 28.74564), (-35.49791, 20.336832, 28.74564), (-34.622105, 22.699526, 28.036428), (-36.04197, 22.699526, 26.186026), (-36.95369, 20.336832, 26.848427), (-36.95369, 20.336832, 26.848427), (-36.04197, 22.699526, 26.186026), (-37.36305, 22.699526, 24.263847), (-38.308186, 20.336832, 24.877626), (-38.308186, 20.336832, 24.877626), (-37.36305, 22.699526, 24.263847), (-38.581715, 22.699526, 22.275164), (-39.55768, 20.336832, 22.838636), (-39.55768, 20.336832, 22.838636), (-38.581715, 22.699526, 22.275164), (-39.69463, 22.699526, 20.225426), (-40.69875, 20.336832, 20.737047), (-40.69875, 20.336832, 20.737047), (-39.69463, 22.699526, 20.225426), (-40.69875, 22.699526, 18.12025), (-41.728264, 20.336832, 18.57862), (-41.728264, 20.336832, 18.57862), (-40.69875, 22.699526, 18.12025), (-41.591312, 22.699526, 15.965409), (-42.64341, 20.336832, 16.36927), (-42.64341, 20.336832, 16.36927), (-41.591312, 22.699526, 15.965409), (-42.369877, 22.699526, 13.766808), (-43.44167, 20.336832, 14.115053), (-43.44167, 20.336832, 14.115053), (-42.369877, 22.699526, 13.766808), (-43.03231, 22.699526, 11.530473), (-44.120857, 20.336832, 11.822148), (-44.120857, 20.336832, 11.822148), (-43.03231, 22.699526, 11.530473), (-43.576794, 22.699526, 9.262533), (-44.679115, 20.336832, 9.496839), (-44.679115, 20.336832, 9.496839), (-43.576794, 22.699526, 9.262533), (-44.00184, 22.699526, 6.9692063), (-45.11491, 20.336832, 7.1454997), (-45.11491, 20.336832, 7.1454997), (-44.00184, 22.699526, 6.9692063), (-44.306274, 22.699526, 4.656777), (-45.427048, 20.336832, 4.774575), (-45.427048, 20.336832, 4.774575), (-44.306274, 22.699526, 4.656777), (-44.489273, 22.699526, 2.331584), (-45.614674, 20.336832, 2.3905637), (-45.614674, 20.336832, 2.3905637), (-44.489273, 22.699526, 2.331584), (-44.550327, 22.699526, 5.4558413e-15), (-45.677273, 20.336832, 5.5938526e-15), (-45.677273, 20.336832, 5.5938526e-15), (-44.550327, 22.699526, 5.4558413e-15), (-44.489273, 22.699526, -2.331584), (-45.614674, 20.336832, -2.3905637), (-45.614674, 20.336832, -2.3905637), (-44.489273, 22.699526, -2.331584), (-44.306274, 22.699526, -4.656777), (-45.427048, 20.336832, -4.774575), (-45.427048, 20.336832, -4.774575), (-44.306274, 22.699526, -4.656777), (-44.00184, 22.699526, -6.9692063), (-45.11491, 20.336832, -7.1454997), (-45.11491, 20.336832, -7.1454997), (-44.00184, 22.699526, -6.9692063), (-43.576794, 22.699526, -9.262533), (-44.679115, 20.336832, -9.496839), (-44.679115, 20.336832, -9.496839), (-43.576794, 22.699526, -9.262533), (-43.03231, 22.699526, -11.530473), (-44.120857, 20.336832, -11.822148), (-44.120857, 20.336832, -11.822148), (-43.03231, 22.699526, -11.530473), (-42.369877, 22.699526, -13.766808), (-43.44167, 20.336832, -14.115053), (-43.44167, 20.336832, -14.115053), (-42.369877, 22.699526, -13.766808), (-41.591312, 22.699526, -15.965409), (-42.64341, 20.336832, -16.36927), (-42.64341, 20.336832, -16.36927), (-41.591312, 22.699526, -15.965409), (-40.69875, 22.699526, -18.12025), (-41.728264, 20.336832, -18.57862), (-41.728264, 20.336832, -18.57862), (-40.69875, 22.699526, -18.12025), (-39.69463, 22.699526, -20.225426), (-40.69875, 20.336832, -20.737047), (-40.69875, 20.336832, -20.737047), (-39.69463, 22.699526, -20.225426), (-38.581715, 22.699526, -22.275164), (-39.55768, 20.336832, -22.838636), (-39.55768, 20.336832, -22.838636), (-38.581715, 22.699526, -22.275164), (-37.36305, 22.699526, -24.263847), (-38.308186, 20.336832, -24.877626), (-38.308186, 20.336832, -24.877626), (-37.36305, 22.699526, -24.263847), (-36.04197, 22.699526, -26.186026), (-36.95369, 20.336832, -26.848427), (-36.95369, 20.336832, -26.848427), (-36.04197, 22.699526, -26.186026), (-34.622105, 22.699526, -28.036428), (-35.49791, 20.336832, -28.74564), (-35.49791, 20.336832, -28.74564), (-34.622105, 22.699526, -28.036428), (-33.107346, 22.699526, -29.809986), (-33.944828, 20.336832, -30.564062), (-33.944828, 20.336832, -30.564062), (-33.107346, 22.699526, -29.809986), (-31.501839, 22.699526, -31.501839), (-32.29871, 20.336832, -32.29871), (-32.29871, 20.336832, -32.29871), (-31.501839, 22.699526, -31.501839), (-29.809986, 22.699526, -33.107346), (-30.564062, 20.336832, -33.944828), (-30.564062, 20.336832, -33.944828), (-29.809986, 22.699526, -33.107346), (-28.036428, 22.699526, -34.622105), (-28.74564, 20.336832, -35.49791), (-28.74564, 20.336832, -35.49791), (-28.036428, 22.699526, -34.622105), (-26.186026, 22.699526, -36.04197), (-26.848427, 20.336832, -36.95369), (-26.848427, 20.336832, -36.95369), (-26.186026, 22.699526, -36.04197), (-24.263847, 22.699526, -37.36305), (-24.877626, 20.336832, -38.308186), (-24.877626, 20.336832, -38.308186), (-24.263847, 22.699526, -37.36305), (-22.275164, 22.699526, -38.581715), (-22.838636, 20.336832, -39.55768), (-22.838636, 20.336832, -39.55768), (-22.275164, 22.699526, -38.581715), (-20.225426, 22.699526, -39.69463), (-20.737047, 20.336832, -40.69875), (-20.737047, 20.336832, -40.69875), (-20.225426, 22.699526, -39.69463), (-18.12025, 22.699526, -40.69875), (-18.57862, 20.336832, -41.728264), (-18.57862, 20.336832, -41.728264), (-18.12025, 22.699526, -40.69875), (-15.965409, 22.699526, -41.591312), (-16.36927, 20.336832, -42.64341), (-16.36927, 20.336832, -42.64341), (-15.965409, 22.699526, -41.591312), (-13.766808, 22.699526, -42.369877), (-14.115053, 20.336832, -43.44167), (-14.115053, 20.336832, -43.44167), (-13.766808, 22.699526, -42.369877), (-11.530473, 22.699526, -43.03231), (-11.822148, 20.336832, -44.120857), (-11.822148, 20.336832, -44.120857), (-11.530473, 22.699526, -43.03231), (-9.262533, 22.699526, -43.576794), (-9.496839, 20.336832, -44.679115), (-9.496839, 20.336832, -44.679115), (-9.262533, 22.699526, -43.576794), (-6.9692063, 22.699526, -44.00184), (-7.1454997, 20.336832, -45.11491), (-7.1454997, 20.336832, -45.11491), (-6.9692063, 22.699526, -44.00184), (-4.656777, 22.699526, -44.306274), (-4.774575, 20.336832, -45.427048), (-4.774575, 20.336832, -45.427048), (-4.656777, 22.699526, -44.306274), (-2.331584, 22.699526, -44.489273), (-2.3905637, 20.336832, -45.614674), (-2.3905637, 20.336832, -45.614674), (-2.331584, 22.699526, -44.489273), (-8.183762e-15, 22.699526, -44.550327), (-8.390779e-15, 20.336832, -45.677273), (-8.390779e-15, 20.336832, -45.677273), (-8.183762e-15, 22.699526, -44.550327), (2.331584, 22.699526, -44.489273), (2.3905637, 20.336832, -45.614674), (2.3905637, 20.336832, -45.614674), (2.331584, 22.699526, -44.489273), (4.656777, 22.699526, -44.306274), (4.774575, 20.336832, -45.427048), (4.774575, 20.336832, -45.427048), (4.656777, 22.699526, -44.306274), (6.9692063, 22.699526, -44.00184), (7.1454997, 20.336832, -45.11491), (7.1454997, 20.336832, -45.11491), (6.9692063, 22.699526, -44.00184), (9.262533, 22.699526, -43.576794), (9.496839, 20.336832, -44.679115), (9.496839, 20.336832, -44.679115), (9.262533, 22.699526, -43.576794), (11.530473, 22.699526, -43.03231), (11.822148, 20.336832, -44.120857), (11.822148, 20.336832, -44.120857), (11.530473, 22.699526, -43.03231), (13.766808, 22.699526, -42.369877), (14.115053, 20.336832, -43.44167), (14.115053, 20.336832, -43.44167), (13.766808, 22.699526, -42.369877), (15.965409, 22.699526, -41.591312), (16.36927, 20.336832, -42.64341), (16.36927, 20.336832, -42.64341), (15.965409, 22.699526, -41.591312), (18.12025, 22.699526, -40.69875), (18.57862, 20.336832, -41.728264), (18.57862, 20.336832, -41.728264), (18.12025, 22.699526, -40.69875), (20.225426, 22.699526, -39.69463), (20.737047, 20.336832, -40.69875), (20.737047, 20.336832, -40.69875), (20.225426, 22.699526, -39.69463), (22.275164, 22.699526, -38.581715), (22.838636, 20.336832, -39.55768), (22.838636, 20.336832, -39.55768), (22.275164, 22.699526, -38.581715), (24.263847, 22.699526, -37.36305), (24.877626, 20.336832, -38.308186), (24.877626, 20.336832, -38.308186), (24.263847, 22.699526, -37.36305), (26.186026, 22.699526, -36.04197), (26.848427, 20.336832, -36.95369), (26.848427, 20.336832, -36.95369), (26.186026, 22.699526, -36.04197), (28.036428, 22.699526, -34.622105), (28.74564, 20.336832, -35.49791), (28.74564, 20.336832, -35.49791), (28.036428, 22.699526, -34.622105), (29.809986, 22.699526, -33.107346), (30.564062, 20.336832, -33.944828), (30.564062, 20.336832, -33.944828), (29.809986, 22.699526, -33.107346), (31.501839, 22.699526, -31.501839), (32.29871, 20.336832, -32.29871), (32.29871, 20.336832, -32.29871), (31.501839, 22.699526, -31.501839), (33.107346, 22.699526, -29.809986), (33.944828, 20.336832, -30.564062), (33.944828, 20.336832, -30.564062), (33.107346, 22.699526, -29.809986), (34.622105, 22.699526, -28.036428), (35.49791, 20.336832, -28.74564), (35.49791, 20.336832, -28.74564), (34.622105, 22.699526, -28.036428), (36.04197, 22.699526, -26.186026), (36.95369, 20.336832, -26.848427), (36.95369, 20.336832, -26.848427), (36.04197, 22.699526, -26.186026), (37.36305, 22.699526, -24.263847), (38.308186, 20.336832, -24.877626), (38.308186, 20.336832, -24.877626), (37.36305, 22.699526, -24.263847), (38.581715, 22.699526, -22.275164), (39.55768, 20.336832, -22.838636), (39.55768, 20.336832, -22.838636), (38.581715, 22.699526, -22.275164), (39.69463, 22.699526, -20.225426), (40.69875, 20.336832, -20.737047), (40.69875, 20.336832, -20.737047), (39.69463, 22.699526, -20.225426), (40.69875, 22.699526, -18.12025), (41.728264, 20.336832, -18.57862), (41.728264, 20.336832, -18.57862), (40.69875, 22.699526, -18.12025), (41.591312, 22.699526, -15.965409), (42.64341, 20.336832, -16.36927), (42.64341, 20.336832, -16.36927), (41.591312, 22.699526, -15.965409), (42.369877, 22.699526, -13.766808), (43.44167, 20.336832, -14.115053), (43.44167, 20.336832, -14.115053), (42.369877, 22.699526, -13.766808), (43.03231, 22.699526, -11.530473), (44.120857, 20.336832, -11.822148), (44.120857, 20.336832, -11.822148), (43.03231, 22.699526, -11.530473), (43.576794, 22.699526, -9.262533), (44.679115, 20.336832, -9.496839), (44.679115, 20.336832, -9.496839), (43.576794, 22.699526, -9.262533), (44.00184, 22.699526, -6.9692063), (45.11491, 20.336832, -7.1454997), (45.11491, 20.336832, -7.1454997), (44.00184, 22.699526, -6.9692063), (44.306274, 22.699526, -4.656777), (45.427048, 20.336832, -4.774575), (45.427048, 20.336832, -4.774575), (44.306274, 22.699526, -4.656777), (44.489273, 22.699526, -2.331584), (45.614674, 20.336832, -2.3905637), (45.614674, 20.336832, -2.3905637), (44.489273, 22.699526, -2.331584), (44.550327, 22.699526, 0), (45.677273, 20.336832, 0), (44.550327, 22.699526, 0), (43.30127, 25, 0), (43.24193, 25, 2.2662134), (44.489273, 22.699526, 2.331584), (44.489273, 22.699526, 2.331584), (43.24193, 25, 2.2662134), (43.06406, 25, 4.526215), (44.306274, 22.699526, 4.656777), (44.306274, 22.699526, 4.656777), (43.06406, 25, 4.526215), (42.768158, 25, 6.773811), (44.00184, 22.699526, 6.9692063), (44.00184, 22.699526, 6.9692063), (42.768158, 25, 6.773811), (42.355034, 25, 9.00284), (43.576794, 22.699526, 9.262533), (43.576794, 22.699526, 9.262533), (42.355034, 25, 9.00284), (41.825813, 25, 11.207193), (43.03231, 22.699526, 11.530473), (43.03231, 22.699526, 11.530473), (41.825813, 25, 11.207193), (41.181953, 25, 13.380828), (42.369877, 22.699526, 13.766808), (42.369877, 22.699526, 13.766808), (41.181953, 25, 13.380828), (40.425217, 25, 15.517787), (41.591312, 22.699526, 15.965409), (41.591312, 22.699526, 15.965409), (40.425217, 25, 15.517787), (39.55768, 25, 17.612213), (40.69875, 22.699526, 18.12025), (40.69875, 22.699526, 18.12025), (39.55768, 25, 17.612213), (38.581715, 25, 19.658365), (39.69463, 22.699526, 20.225426), (39.69463, 22.699526, 20.225426), (38.581715, 25, 19.658365), (37.5, 25, 21.650635), (38.581715, 22.699526, 22.275164), (38.581715, 22.699526, 22.275164), (37.5, 25, 21.650635), (36.315502, 25, 23.583563), (37.36305, 22.699526, 24.263847), (37.36305, 22.699526, 24.263847), (36.315502, 25, 23.583563), (35.031464, 25, 25.451847), (36.04197, 22.699526, 26.186026), (36.04197, 22.699526, 26.186026), (35.031464, 25, 25.451847), (33.65141, 25, 27.250372), (34.622105, 22.699526, 28.036428), (34.622105, 22.699526, 28.036428), (33.65141, 25, 27.250372), (32.179115, 25, 28.974205), (33.107346, 22.699526, 29.809986), (33.107346, 22.699526, 29.809986), (32.179115, 25, 28.974205), (30.618622, 25, 30.618622), (31.501839, 22.699526, 31.501839), (31.501839, 22.699526, 31.501839), (30.618622, 25, 30.618622), (28.974205, 25, 32.179115), (29.809986, 22.699526, 33.107346), (29.809986, 22.699526, 33.107346), (28.974205, 25, 32.179115), (27.250372, 25, 33.65141), (28.036428, 22.699526, 34.622105), (28.036428, 22.699526, 34.622105), (27.250372, 25, 33.65141), (25.451847, 25, 35.031464), (26.186026, 22.699526, 36.04197), (26.186026, 22.699526, 36.04197), (25.451847, 25, 35.031464), (23.583563, 25, 36.315502), (24.263847, 22.699526, 37.36305), (24.263847, 22.699526, 37.36305), (23.583563, 25, 36.315502), (21.650635, 25, 37.5), (22.275164, 22.699526, 38.581715), (22.275164, 22.699526, 38.581715), (21.650635, 25, 37.5), (19.658365, 25, 38.581715), (20.225426, 22.699526, 39.69463), (20.225426, 22.699526, 39.69463), (19.658365, 25, 38.581715), (17.612213, 25, 39.55768), (18.12025, 22.699526, 40.69875), (18.12025, 22.699526, 40.69875), (17.612213, 25, 39.55768), (15.517787, 25, 40.425217), (15.965409, 22.699526, 41.591312), (15.965409, 22.699526, 41.591312), (15.517787, 25, 40.425217), (13.380828, 25, 41.181953), (13.766808, 22.699526, 42.369877), (13.766808, 22.699526, 42.369877), (13.380828, 25, 41.181953), (11.207193, 25, 41.825813), (11.530473, 22.699526, 43.03231), (11.530473, 22.699526, 43.03231), (11.207193, 25, 41.825813), (9.00284, 25, 42.355034), (9.262533, 22.699526, 43.576794), (9.262533, 22.699526, 43.576794), (9.00284, 25, 42.355034), (6.773811, 25, 42.768158), (6.9692063, 22.699526, 44.00184), (6.9692063, 22.699526, 44.00184), (6.773811, 25, 42.768158), (4.526215, 25, 43.06406), (4.656777, 22.699526, 44.306274), (4.656777, 22.699526, 44.306274), (4.526215, 25, 43.06406), (2.2662134, 25, 43.24193), (2.331584, 22.699526, 44.489273), (2.331584, 22.699526, 44.489273), (2.2662134, 25, 43.24193), (2.651438e-15, 25, 43.30127), (2.7279206e-15, 22.699526, 44.550327), (2.7279206e-15, 22.699526, 44.550327), (2.651438e-15, 25, 43.30127), (-2.2662134, 25, 43.24193), (-2.331584, 22.699526, 44.489273), (-2.331584, 22.699526, 44.489273), (-2.2662134, 25, 43.24193), (-4.526215, 25, 43.06406), (-4.656777, 22.699526, 44.306274), (-4.656777, 22.699526, 44.306274), (-4.526215, 25, 43.06406), (-6.773811, 25, 42.768158), (-6.9692063, 22.699526, 44.00184), (-6.9692063, 22.699526, 44.00184), (-6.773811, 25, 42.768158), (-9.00284, 25, 42.355034), (-9.262533, 22.699526, 43.576794), (-9.262533, 22.699526, 43.576794), (-9.00284, 25, 42.355034), (-11.207193, 25, 41.825813), (-11.530473, 22.699526, 43.03231), (-11.530473, 22.699526, 43.03231), (-11.207193, 25, 41.825813), (-13.380828, 25, 41.181953), (-13.766808, 22.699526, 42.369877), (-13.766808, 22.699526, 42.369877), (-13.380828, 25, 41.181953), (-15.517787, 25, 40.425217), (-15.965409, 22.699526, 41.591312), (-15.965409, 22.699526, 41.591312), (-15.517787, 25, 40.425217), (-17.612213, 25, 39.55768), (-18.12025, 22.699526, 40.69875), (-18.12025, 22.699526, 40.69875), (-17.612213, 25, 39.55768), (-19.658365, 25, 38.581715), (-20.225426, 22.699526, 39.69463), (-20.225426, 22.699526, 39.69463), (-19.658365, 25, 38.581715), (-21.650635, 25, 37.5), (-22.275164, 22.699526, 38.581715), (-22.275164, 22.699526, 38.581715), (-21.650635, 25, 37.5), (-23.583563, 25, 36.315502), (-24.263847, 22.699526, 37.36305), (-24.263847, 22.699526, 37.36305), (-23.583563, 25, 36.315502), (-25.451847, 25, 35.031464), (-26.186026, 22.699526, 36.04197), (-26.186026, 22.699526, 36.04197), (-25.451847, 25, 35.031464), (-27.250372, 25, 33.65141), (-28.036428, 22.699526, 34.622105), (-28.036428, 22.699526, 34.622105), (-27.250372, 25, 33.65141), (-28.974205, 25, 32.179115), (-29.809986, 22.699526, 33.107346), (-29.809986, 22.699526, 33.107346), (-28.974205, 25, 32.179115), (-30.618622, 25, 30.618622), (-31.501839, 22.699526, 31.501839), (-31.501839, 22.699526, 31.501839), (-30.618622, 25, 30.618622), (-32.179115, 25, 28.974205), (-33.107346, 22.699526, 29.809986), (-33.107346, 22.699526, 29.809986), (-32.179115, 25, 28.974205), (-33.65141, 25, 27.250372), (-34.622105, 22.699526, 28.036428), (-34.622105, 22.699526, 28.036428), (-33.65141, 25, 27.250372), (-35.031464, 25, 25.451847), (-36.04197, 22.699526, 26.186026), (-36.04197, 22.699526, 26.186026), (-35.031464, 25, 25.451847), (-36.315502, 25, 23.583563), (-37.36305, 22.699526, 24.263847), (-37.36305, 22.699526, 24.263847), (-36.315502, 25, 23.583563), (-37.5, 25, 21.650635), (-38.581715, 22.699526, 22.275164), (-38.581715, 22.699526, 22.275164), (-37.5, 25, 21.650635), (-38.581715, 25, 19.658365), (-39.69463, 22.699526, 20.225426), (-39.69463, 22.699526, 20.225426), (-38.581715, 25, 19.658365), (-39.55768, 25, 17.612213), (-40.69875, 22.699526, 18.12025), (-40.69875, 22.699526, 18.12025), (-39.55768, 25, 17.612213), (-40.425217, 25, 15.517787), (-41.591312, 22.699526, 15.965409), (-41.591312, 22.699526, 15.965409), (-40.425217, 25, 15.517787), (-41.181953, 25, 13.380828), (-42.369877, 22.699526, 13.766808), (-42.369877, 22.699526, 13.766808), (-41.181953, 25, 13.380828), (-41.825813, 25, 11.207193), (-43.03231, 22.699526, 11.530473), (-43.03231, 22.699526, 11.530473), (-41.825813, 25, 11.207193), (-42.355034, 25, 9.00284), (-43.576794, 22.699526, 9.262533), (-43.576794, 22.699526, 9.262533), (-42.355034, 25, 9.00284), (-42.768158, 25, 6.773811), (-44.00184, 22.699526, 6.9692063), (-44.00184, 22.699526, 6.9692063), (-42.768158, 25, 6.773811), (-43.06406, 25, 4.526215), (-44.306274, 22.699526, 4.656777), (-44.306274, 22.699526, 4.656777), (-43.06406, 25, 4.526215), (-43.24193, 25, 2.2662134), (-44.489273, 22.699526, 2.331584), (-44.489273, 22.699526, 2.331584), (-43.24193, 25, 2.2662134), (-43.30127, 25, 5.302876e-15), (-44.550327, 22.699526, 5.4558413e-15), (-44.550327, 22.699526, 5.4558413e-15), (-43.30127, 25, 5.302876e-15), (-43.24193, 25, -2.2662134), (-44.489273, 22.699526, -2.331584), (-44.489273, 22.699526, -2.331584), (-43.24193, 25, -2.2662134), (-43.06406, 25, -4.526215), (-44.306274, 22.699526, -4.656777), (-44.306274, 22.699526, -4.656777), (-43.06406, 25, -4.526215), (-42.768158, 25, -6.773811), (-44.00184, 22.699526, -6.9692063), (-44.00184, 22.699526, -6.9692063), (-42.768158, 25, -6.773811), (-42.355034, 25, -9.00284), (-43.576794, 22.699526, -9.262533), (-43.576794, 22.699526, -9.262533), (-42.355034, 25, -9.00284), (-41.825813, 25, -11.207193), (-43.03231, 22.699526, -11.530473), (-43.03231, 22.699526, -11.530473), (-41.825813, 25, -11.207193), (-41.181953, 25, -13.380828), (-42.369877, 22.699526, -13.766808), (-42.369877, 22.699526, -13.766808), (-41.181953, 25, -13.380828), (-40.425217, 25, -15.517787), (-41.591312, 22.699526, -15.965409), (-41.591312, 22.699526, -15.965409), (-40.425217, 25, -15.517787), (-39.55768, 25, -17.612213), (-40.69875, 22.699526, -18.12025), (-40.69875, 22.699526, -18.12025), (-39.55768, 25, -17.612213), (-38.581715, 25, -19.658365), (-39.69463, 22.699526, -20.225426), (-39.69463, 22.699526, -20.225426), (-38.581715, 25, -19.658365), (-37.5, 25, -21.650635), (-38.581715, 22.699526, -22.275164), (-38.581715, 22.699526, -22.275164), (-37.5, 25, -21.650635), (-36.315502, 25, -23.583563), (-37.36305, 22.699526, -24.263847), (-37.36305, 22.699526, -24.263847), (-36.315502, 25, -23.583563), (-35.031464, 25, -25.451847), (-36.04197, 22.699526, -26.186026), (-36.04197, 22.699526, -26.186026), (-35.031464, 25, -25.451847), (-33.65141, 25, -27.250372), (-34.622105, 22.699526, -28.036428), (-34.622105, 22.699526, -28.036428), (-33.65141, 25, -27.250372), (-32.179115, 25, -28.974205), (-33.107346, 22.699526, -29.809986), (-33.107346, 22.699526, -29.809986), (-32.179115, 25, -28.974205), (-30.618622, 25, -30.618622), (-31.501839, 22.699526, -31.501839), (-31.501839, 22.699526, -31.501839), (-30.618622, 25, -30.618622), (-28.974205, 25, -32.179115), (-29.809986, 22.699526, -33.107346), (-29.809986, 22.699526, -33.107346), (-28.974205, 25, -32.179115), (-27.250372, 25, -33.65141), (-28.036428, 22.699526, -34.622105), (-28.036428, 22.699526, -34.622105), (-27.250372, 25, -33.65141), (-25.451847, 25, -35.031464), (-26.186026, 22.699526, -36.04197), (-26.186026, 22.699526, -36.04197), (-25.451847, 25, -35.031464), (-23.583563, 25, -36.315502), (-24.263847, 22.699526, -37.36305), (-24.263847, 22.699526, -37.36305), (-23.583563, 25, -36.315502), (-21.650635, 25, -37.5), (-22.275164, 22.699526, -38.581715), (-22.275164, 22.699526, -38.581715), (-21.650635, 25, -37.5), (-19.658365, 25, -38.581715), (-20.225426, 22.699526, -39.69463), (-20.225426, 22.699526, -39.69463), (-19.658365, 25, -38.581715), (-17.612213, 25, -39.55768), (-18.12025, 22.699526, -40.69875), (-18.12025, 22.699526, -40.69875), (-17.612213, 25, -39.55768), (-15.517787, 25, -40.425217), (-15.965409, 22.699526, -41.591312), (-15.965409, 22.699526, -41.591312), (-15.517787, 25, -40.425217), (-13.380828, 25, -41.181953), (-13.766808, 22.699526, -42.369877), (-13.766808, 22.699526, -42.369877), (-13.380828, 25, -41.181953), (-11.207193, 25, -41.825813), (-11.530473, 22.699526, -43.03231), (-11.530473, 22.699526, -43.03231), (-11.207193, 25, -41.825813), (-9.00284, 25, -42.355034), (-9.262533, 22.699526, -43.576794), (-9.262533, 22.699526, -43.576794), (-9.00284, 25, -42.355034), (-6.773811, 25, -42.768158), (-6.9692063, 22.699526, -44.00184), (-6.9692063, 22.699526, -44.00184), (-6.773811, 25, -42.768158), (-4.526215, 25, -43.06406), (-4.656777, 22.699526, -44.306274), (-4.656777, 22.699526, -44.306274), (-4.526215, 25, -43.06406), (-2.2662134, 25, -43.24193), (-2.331584, 22.699526, -44.489273), (-2.331584, 22.699526, -44.489273), (-2.2662134, 25, -43.24193), (-7.9543145e-15, 25, -43.30127), (-8.183762e-15, 22.699526, -44.550327), (-8.183762e-15, 22.699526, -44.550327), (-7.9543145e-15, 25, -43.30127), (2.2662134, 25, -43.24193), (2.331584, 22.699526, -44.489273), (2.331584, 22.699526, -44.489273), (2.2662134, 25, -43.24193), (4.526215, 25, -43.06406), (4.656777, 22.699526, -44.306274), (4.656777, 22.699526, -44.306274), (4.526215, 25, -43.06406), (6.773811, 25, -42.768158), (6.9692063, 22.699526, -44.00184), (6.9692063, 22.699526, -44.00184), (6.773811, 25, -42.768158), (9.00284, 25, -42.355034), (9.262533, 22.699526, -43.576794), (9.262533, 22.699526, -43.576794), (9.00284, 25, -42.355034), (11.207193, 25, -41.825813), (11.530473, 22.699526, -43.03231), (11.530473, 22.699526, -43.03231), (11.207193, 25, -41.825813), (13.380828, 25, -41.181953), (13.766808, 22.699526, -42.369877), (13.766808, 22.699526, -42.369877), (13.380828, 25, -41.181953), (15.517787, 25, -40.425217), (15.965409, 22.699526, -41.591312), (15.965409, 22.699526, -41.591312), (15.517787, 25, -40.425217), (17.612213, 25, -39.55768), (18.12025, 22.699526, -40.69875), (18.12025, 22.699526, -40.69875), (17.612213, 25, -39.55768), (19.658365, 25, -38.581715), (20.225426, 22.699526, -39.69463), (20.225426, 22.699526, -39.69463), (19.658365, 25, -38.581715), (21.650635, 25, -37.5), (22.275164, 22.699526, -38.581715), (22.275164, 22.699526, -38.581715), (21.650635, 25, -37.5), (23.583563, 25, -36.315502), (24.263847, 22.699526, -37.36305), (24.263847, 22.699526, -37.36305), (23.583563, 25, -36.315502), (25.451847, 25, -35.031464), (26.186026, 22.699526, -36.04197), (26.186026, 22.699526, -36.04197), (25.451847, 25, -35.031464), (27.250372, 25, -33.65141), (28.036428, 22.699526, -34.622105), (28.036428, 22.699526, -34.622105), (27.250372, 25, -33.65141), (28.974205, 25, -32.179115), (29.809986, 22.699526, -33.107346), (29.809986, 22.699526, -33.107346), (28.974205, 25, -32.179115), (30.618622, 25, -30.618622), (31.501839, 22.699526, -31.501839), (31.501839, 22.699526, -31.501839), (30.618622, 25, -30.618622), (32.179115, 25, -28.974205), (33.107346, 22.699526, -29.809986), (33.107346, 22.699526, -29.809986), (32.179115, 25, -28.974205), (33.65141, 25, -27.250372), (34.622105, 22.699526, -28.036428), (34.622105, 22.699526, -28.036428), (33.65141, 25, -27.250372), (35.031464, 25, -25.451847), (36.04197, 22.699526, -26.186026), (36.04197, 22.699526, -26.186026), (35.031464, 25, -25.451847), (36.315502, 25, -23.583563), (37.36305, 22.699526, -24.263847), (37.36305, 22.699526, -24.263847), (36.315502, 25, -23.583563), (37.5, 25, -21.650635), (38.581715, 22.699526, -22.275164), (38.581715, 22.699526, -22.275164), (37.5, 25, -21.650635), (38.581715, 25, -19.658365), (39.69463, 22.699526, -20.225426), (39.69463, 22.699526, -20.225426), (38.581715, 25, -19.658365), (39.55768, 25, -17.612213), (40.69875, 22.699526, -18.12025), (40.69875, 22.699526, -18.12025), (39.55768, 25, -17.612213), (40.425217, 25, -15.517787), (41.591312, 22.699526, -15.965409), (41.591312, 22.699526, -15.965409), (40.425217, 25, -15.517787), (41.181953, 25, -13.380828), (42.369877, 22.699526, -13.766808), (42.369877, 22.699526, -13.766808), (41.181953, 25, -13.380828), (41.825813, 25, -11.207193), (43.03231, 22.699526, -11.530473), (43.03231, 22.699526, -11.530473), (41.825813, 25, -11.207193), (42.355034, 25, -9.00284), (43.576794, 22.699526, -9.262533), (43.576794, 22.699526, -9.262533), (42.355034, 25, -9.00284), (42.768158, 25, -6.773811), (44.00184, 22.699526, -6.9692063), (44.00184, 22.699526, -6.9692063), (42.768158, 25, -6.773811), (43.06406, 25, -4.526215), (44.306274, 22.699526, -4.656777), (44.306274, 22.699526, -4.656777), (43.06406, 25, -4.526215), (43.24193, 25, -2.2662134), (44.489273, 22.699526, -2.331584), (44.489273, 22.699526, -2.331584), (43.24193, 25, -2.2662134), (43.30127, 25, 0), (44.550327, 22.699526, 0), (43.30127, 25, 0), (41.93353, 27.231953, 0), (41.87606, 27.231953, 2.1946313), (43.24193, 25, 2.2662134), (43.24193, 25, 2.2662134), (41.87606, 27.231953, 2.1946313), (41.70381, 27.231953, 4.3832474), (43.06406, 25, 4.526215), (43.06406, 25, 4.526215), (41.70381, 27.231953, 4.3832474), (41.417255, 27.231953, 6.5598493), (42.768158, 25, 6.773811), (42.768158, 25, 6.773811), (41.417255, 27.231953, 6.5598493), (41.01718, 27.231953, 8.718471), (42.355034, 25, 9.00284), (42.355034, 25, 9.00284), (41.01718, 27.231953, 8.718471), (40.504677, 27.231953, 10.853196), (41.825813, 25, 11.207193), (41.825813, 25, 11.207193), (40.504677, 27.231953, 10.853196), (39.881157, 27.231953, 12.958173), (41.181953, 25, 13.380828), (41.181953, 25, 13.380828), (39.881157, 27.231953, 12.958173), (39.148323, 27.231953, 15.027633), (40.425217, 25, 15.517787), (40.425217, 25, 15.517787), (39.148323, 27.231953, 15.027633), (38.308186, 27.231953, 17.055902), (39.55768, 25, 17.612213), (39.55768, 25, 17.612213), (38.308186, 27.231953, 17.055902), (37.36305, 27.231953, 19.037424), (38.581715, 25, 19.658365), (38.581715, 25, 19.658365), (37.36305, 27.231953, 19.037424), (36.315502, 27.231953, 20.966764), (37.5, 25, 21.650635), (37.5, 25, 21.650635), (36.315502, 27.231953, 20.966764), (35.168415, 27.231953, 22.838636), (36.315502, 25, 23.583563), (36.315502, 25, 23.583563), (35.168415, 27.231953, 22.838636), (33.92494, 27.231953, 24.64791), (35.031464, 25, 25.451847), (35.031464, 25, 25.451847), (33.92494, 27.231953, 24.64791), (32.58847, 27.231953, 26.389624), (33.65141, 25, 27.250372), (33.65141, 25, 27.250372), (32.58847, 27.231953, 26.389624), (31.162685, 27.231953, 28.059008), (32.179115, 25, 28.974205), (32.179115, 25, 28.974205), (31.162685, 27.231953, 28.059008), (29.651482, 27.231953, 29.651482), (30.618622, 25, 30.618622), (30.618622, 25, 30.618622), (29.651482, 27.231953, 29.651482), (28.059008, 27.231953, 31.162685), (28.974205, 25, 32.179115), (28.974205, 25, 32.179115), (28.059008, 27.231953, 31.162685), (26.389624, 27.231953, 32.58847), (27.250372, 25, 33.65141), (27.250372, 25, 33.65141), (26.389624, 27.231953, 32.58847), (24.64791, 27.231953, 33.92494), (25.451847, 25, 35.031464), (25.451847, 25, 35.031464), (24.64791, 27.231953, 33.92494), (22.838636, 27.231953, 35.168415), (23.583563, 25, 36.315502), (23.583563, 25, 36.315502), (22.838636, 27.231953, 35.168415), (20.966764, 27.231953, 36.315502), (21.650635, 25, 37.5), (21.650635, 25, 37.5), (20.966764, 27.231953, 36.315502), (19.037424, 27.231953, 37.36305), (19.658365, 25, 38.581715), (19.658365, 25, 38.581715), (19.037424, 27.231953, 37.36305), (17.055902, 27.231953, 38.308186), (17.612213, 25, 39.55768), (17.612213, 25, 39.55768), (17.055902, 27.231953, 38.308186), (15.027633, 27.231953, 39.148323), (15.517787, 25, 40.425217), (15.517787, 25, 40.425217), (15.027633, 27.231953, 39.148323), (12.958173, 27.231953, 39.881157), (13.380828, 25, 41.181953), (13.380828, 25, 41.181953), (12.958173, 27.231953, 39.881157), (10.853196, 27.231953, 40.504677), (11.207193, 25, 41.825813), (11.207193, 25, 41.825813), (10.853196, 27.231953, 40.504677), (8.718471, 27.231953, 41.01718), (9.00284, 25, 42.355034), (9.00284, 25, 42.355034), (8.718471, 27.231953, 41.01718), (6.5598493, 27.231953, 41.417255), (6.773811, 25, 42.768158), (6.773811, 25, 42.768158), (6.5598493, 27.231953, 41.417255), (4.3832474, 27.231953, 41.70381), (4.526215, 25, 43.06406), (4.526215, 25, 43.06406), (4.3832474, 27.231953, 41.70381), (2.1946313, 27.231953, 41.87606), (2.2662134, 25, 43.24193), (2.2662134, 25, 43.24193), (2.1946313, 27.231953, 41.87606), (2.567688e-15, 27.231953, 41.93353), (2.651438e-15, 25, 43.30127), (2.651438e-15, 25, 43.30127), (2.567688e-15, 27.231953, 41.93353), (-2.1946313, 27.231953, 41.87606), (-2.2662134, 25, 43.24193), (-2.2662134, 25, 43.24193), (-2.1946313, 27.231953, 41.87606), (-4.3832474, 27.231953, 41.70381), (-4.526215, 25, 43.06406), (-4.526215, 25, 43.06406), (-4.3832474, 27.231953, 41.70381), (-6.5598493, 27.231953, 41.417255), (-6.773811, 25, 42.768158), (-6.773811, 25, 42.768158), (-6.5598493, 27.231953, 41.417255), (-8.718471, 27.231953, 41.01718), (-9.00284, 25, 42.355034), (-9.00284, 25, 42.355034), (-8.718471, 27.231953, 41.01718), (-10.853196, 27.231953, 40.504677), (-11.207193, 25, 41.825813), (-11.207193, 25, 41.825813), (-10.853196, 27.231953, 40.504677), (-12.958173, 27.231953, 39.881157), (-13.380828, 25, 41.181953), (-13.380828, 25, 41.181953), (-12.958173, 27.231953, 39.881157), (-15.027633, 27.231953, 39.148323), (-15.517787, 25, 40.425217), (-15.517787, 25, 40.425217), (-15.027633, 27.231953, 39.148323), (-17.055902, 27.231953, 38.308186), (-17.612213, 25, 39.55768), (-17.612213, 25, 39.55768), (-17.055902, 27.231953, 38.308186), (-19.037424, 27.231953, 37.36305), (-19.658365, 25, 38.581715), (-19.658365, 25, 38.581715), (-19.037424, 27.231953, 37.36305), (-20.966764, 27.231953, 36.315502), (-21.650635, 25, 37.5), (-21.650635, 25, 37.5), (-20.966764, 27.231953, 36.315502), (-22.838636, 27.231953, 35.168415), (-23.583563, 25, 36.315502), (-23.583563, 25, 36.315502), (-22.838636, 27.231953, 35.168415), (-24.64791, 27.231953, 33.92494), (-25.451847, 25, 35.031464), (-25.451847, 25, 35.031464), (-24.64791, 27.231953, 33.92494), (-26.389624, 27.231953, 32.58847), (-27.250372, 25, 33.65141), (-27.250372, 25, 33.65141), (-26.389624, 27.231953, 32.58847), (-28.059008, 27.231953, 31.162685), (-28.974205, 25, 32.179115), (-28.974205, 25, 32.179115), (-28.059008, 27.231953, 31.162685), (-29.651482, 27.231953, 29.651482), (-30.618622, 25, 30.618622), (-30.618622, 25, 30.618622), (-29.651482, 27.231953, 29.651482), (-31.162685, 27.231953, 28.059008), (-32.179115, 25, 28.974205), (-32.179115, 25, 28.974205), (-31.162685, 27.231953, 28.059008), (-32.58847, 27.231953, 26.389624), (-33.65141, 25, 27.250372), (-33.65141, 25, 27.250372), (-32.58847, 27.231953, 26.389624), (-33.92494, 27.231953, 24.64791), (-35.031464, 25, 25.451847), (-35.031464, 25, 25.451847), (-33.92494, 27.231953, 24.64791), (-35.168415, 27.231953, 22.838636), (-36.315502, 25, 23.583563), (-36.315502, 25, 23.583563), (-35.168415, 27.231953, 22.838636), (-36.315502, 27.231953, 20.966764), (-37.5, 25, 21.650635), (-37.5, 25, 21.650635), (-36.315502, 27.231953, 20.966764), (-37.36305, 27.231953, 19.037424), (-38.581715, 25, 19.658365), (-38.581715, 25, 19.658365), (-37.36305, 27.231953, 19.037424), (-38.308186, 27.231953, 17.055902), (-39.55768, 25, 17.612213), (-39.55768, 25, 17.612213), (-38.308186, 27.231953, 17.055902), (-39.148323, 27.231953, 15.027633), (-40.425217, 25, 15.517787), (-40.425217, 25, 15.517787), (-39.148323, 27.231953, 15.027633), (-39.881157, 27.231953, 12.958173), (-41.181953, 25, 13.380828), (-41.181953, 25, 13.380828), (-39.881157, 27.231953, 12.958173), (-40.504677, 27.231953, 10.853196), (-41.825813, 25, 11.207193), (-41.825813, 25, 11.207193), (-40.504677, 27.231953, 10.853196), (-41.01718, 27.231953, 8.718471), (-42.355034, 25, 9.00284), (-42.355034, 25, 9.00284), (-41.01718, 27.231953, 8.718471), (-41.417255, 27.231953, 6.5598493), (-42.768158, 25, 6.773811), (-42.768158, 25, 6.773811), (-41.417255, 27.231953, 6.5598493), (-41.70381, 27.231953, 4.3832474), (-43.06406, 25, 4.526215), (-43.06406, 25, 4.526215), (-41.70381, 27.231953, 4.3832474), (-41.87606, 27.231953, 2.1946313), (-43.24193, 25, 2.2662134), (-43.24193, 25, 2.2662134), (-41.87606, 27.231953, 2.1946313), (-41.93353, 27.231953, 5.135376e-15), (-43.30127, 25, 5.302876e-15), (-43.30127, 25, 5.302876e-15), (-41.93353, 27.231953, 5.135376e-15), (-41.87606, 27.231953, -2.1946313), (-43.24193, 25, -2.2662134), (-43.24193, 25, -2.2662134), (-41.87606, 27.231953, -2.1946313), (-41.70381, 27.231953, -4.3832474), (-43.06406, 25, -4.526215), (-43.06406, 25, -4.526215), (-41.70381, 27.231953, -4.3832474), (-41.417255, 27.231953, -6.5598493), (-42.768158, 25, -6.773811), (-42.768158, 25, -6.773811), (-41.417255, 27.231953, -6.5598493), (-41.01718, 27.231953, -8.718471), (-42.355034, 25, -9.00284), (-42.355034, 25, -9.00284), (-41.01718, 27.231953, -8.718471), (-40.504677, 27.231953, -10.853196), (-41.825813, 25, -11.207193), (-41.825813, 25, -11.207193), (-40.504677, 27.231953, -10.853196), (-39.881157, 27.231953, -12.958173), (-41.181953, 25, -13.380828), (-41.181953, 25, -13.380828), (-39.881157, 27.231953, -12.958173), (-39.148323, 27.231953, -15.027633), (-40.425217, 25, -15.517787), (-40.425217, 25, -15.517787), (-39.148323, 27.231953, -15.027633), (-38.308186, 27.231953, -17.055902), (-39.55768, 25, -17.612213), (-39.55768, 25, -17.612213), (-38.308186, 27.231953, -17.055902), (-37.36305, 27.231953, -19.037424), (-38.581715, 25, -19.658365), (-38.581715, 25, -19.658365), (-37.36305, 27.231953, -19.037424), (-36.315502, 27.231953, -20.966764), (-37.5, 25, -21.650635), (-37.5, 25, -21.650635), (-36.315502, 27.231953, -20.966764), (-35.168415, 27.231953, -22.838636), (-36.315502, 25, -23.583563), (-36.315502, 25, -23.583563), (-35.168415, 27.231953, -22.838636), (-33.92494, 27.231953, -24.64791), (-35.031464, 25, -25.451847), (-35.031464, 25, -25.451847), (-33.92494, 27.231953, -24.64791), (-32.58847, 27.231953, -26.389624), (-33.65141, 25, -27.250372), (-33.65141, 25, -27.250372), (-32.58847, 27.231953, -26.389624), (-31.162685, 27.231953, -28.059008), (-32.179115, 25, -28.974205), (-32.179115, 25, -28.974205), (-31.162685, 27.231953, -28.059008), (-29.651482, 27.231953, -29.651482), (-30.618622, 25, -30.618622), (-30.618622, 25, -30.618622), (-29.651482, 27.231953, -29.651482), (-28.059008, 27.231953, -31.162685), (-28.974205, 25, -32.179115), (-28.974205, 25, -32.179115), (-28.059008, 27.231953, -31.162685), (-26.389624, 27.231953, -32.58847), (-27.250372, 25, -33.65141), (-27.250372, 25, -33.65141), (-26.389624, 27.231953, -32.58847), (-24.64791, 27.231953, -33.92494), (-25.451847, 25, -35.031464), (-25.451847, 25, -35.031464), (-24.64791, 27.231953, -33.92494), (-22.838636, 27.231953, -35.168415), (-23.583563, 25, -36.315502), (-23.583563, 25, -36.315502), (-22.838636, 27.231953, -35.168415), (-20.966764, 27.231953, -36.315502), (-21.650635, 25, -37.5), (-21.650635, 25, -37.5), (-20.966764, 27.231953, -36.315502), (-19.037424, 27.231953, -37.36305), (-19.658365, 25, -38.581715), (-19.658365, 25, -38.581715), (-19.037424, 27.231953, -37.36305), (-17.055902, 27.231953, -38.308186), (-17.612213, 25, -39.55768), (-17.612213, 25, -39.55768), (-17.055902, 27.231953, -38.308186), (-15.027633, 27.231953, -39.148323), (-15.517787, 25, -40.425217), (-15.517787, 25, -40.425217), (-15.027633, 27.231953, -39.148323), (-12.958173, 27.231953, -39.881157), (-13.380828, 25, -41.181953), (-13.380828, 25, -41.181953), (-12.958173, 27.231953, -39.881157), (-10.853196, 27.231953, -40.504677), (-11.207193, 25, -41.825813), (-11.207193, 25, -41.825813), (-10.853196, 27.231953, -40.504677), (-8.718471, 27.231953, -41.01718), (-9.00284, 25, -42.355034), (-9.00284, 25, -42.355034), (-8.718471, 27.231953, -41.01718), (-6.5598493, 27.231953, -41.417255), (-6.773811, 25, -42.768158), (-6.773811, 25, -42.768158), (-6.5598493, 27.231953, -41.417255), (-4.3832474, 27.231953, -41.70381), (-4.526215, 25, -43.06406), (-4.526215, 25, -43.06406), (-4.3832474, 27.231953, -41.70381), (-2.1946313, 27.231953, -41.87606), (-2.2662134, 25, -43.24193), (-2.2662134, 25, -43.24193), (-2.1946313, 27.231953, -41.87606), (-7.703064e-15, 27.231953, -41.93353), (-7.9543145e-15, 25, -43.30127), (-7.9543145e-15, 25, -43.30127), (-7.703064e-15, 27.231953, -41.93353), (2.1946313, 27.231953, -41.87606), (2.2662134, 25, -43.24193), (2.2662134, 25, -43.24193), (2.1946313, 27.231953, -41.87606), (4.3832474, 27.231953, -41.70381), (4.526215, 25, -43.06406), (4.526215, 25, -43.06406), (4.3832474, 27.231953, -41.70381), (6.5598493, 27.231953, -41.417255), (6.773811, 25, -42.768158), (6.773811, 25, -42.768158), (6.5598493, 27.231953, -41.417255), (8.718471, 27.231953, -41.01718), (9.00284, 25, -42.355034), (9.00284, 25, -42.355034), (8.718471, 27.231953, -41.01718), (10.853196, 27.231953, -40.504677), (11.207193, 25, -41.825813), (11.207193, 25, -41.825813), (10.853196, 27.231953, -40.504677), (12.958173, 27.231953, -39.881157), (13.380828, 25, -41.181953), (13.380828, 25, -41.181953), (12.958173, 27.231953, -39.881157), (15.027633, 27.231953, -39.148323), (15.517787, 25, -40.425217), (15.517787, 25, -40.425217), (15.027633, 27.231953, -39.148323), (17.055902, 27.231953, -38.308186), (17.612213, 25, -39.55768), (17.612213, 25, -39.55768), (17.055902, 27.231953, -38.308186), (19.037424, 27.231953, -37.36305), (19.658365, 25, -38.581715), (19.658365, 25, -38.581715), (19.037424, 27.231953, -37.36305), (20.966764, 27.231953, -36.315502), (21.650635, 25, -37.5), (21.650635, 25, -37.5), (20.966764, 27.231953, -36.315502), (22.838636, 27.231953, -35.168415), (23.583563, 25, -36.315502), (23.583563, 25, -36.315502), (22.838636, 27.231953, -35.168415), (24.64791, 27.231953, -33.92494), (25.451847, 25, -35.031464), (25.451847, 25, -35.031464), (24.64791, 27.231953, -33.92494), (26.389624, 27.231953, -32.58847), (27.250372, 25, -33.65141), (27.250372, 25, -33.65141), (26.389624, 27.231953, -32.58847), (28.059008, 27.231953, -31.162685), (28.974205, 25, -32.179115), (28.974205, 25, -32.179115), (28.059008, 27.231953, -31.162685), (29.651482, 27.231953, -29.651482), (30.618622, 25, -30.618622), (30.618622, 25, -30.618622), (29.651482, 27.231953, -29.651482), (31.162685, 27.231953, -28.059008), (32.179115, 25, -28.974205), (32.179115, 25, -28.974205), (31.162685, 27.231953, -28.059008), (32.58847, 27.231953, -26.389624), (33.65141, 25, -27.250372), (33.65141, 25, -27.250372), (32.58847, 27.231953, -26.389624), (33.92494, 27.231953, -24.64791), (35.031464, 25, -25.451847), (35.031464, 25, -25.451847), (33.92494, 27.231953, -24.64791), (35.168415, 27.231953, -22.838636), (36.315502, 25, -23.583563), (36.315502, 25, -23.583563), (35.168415, 27.231953, -22.838636), (36.315502, 27.231953, -20.966764), (37.5, 25, -21.650635), (37.5, 25, -21.650635), (36.315502, 27.231953, -20.966764), (37.36305, 27.231953, -19.037424), (38.581715, 25, -19.658365), (38.581715, 25, -19.658365), (37.36305, 27.231953, -19.037424), (38.308186, 27.231953, -17.055902), (39.55768, 25, -17.612213), (39.55768, 25, -17.612213), (38.308186, 27.231953, -17.055902), (39.148323, 27.231953, -15.027633), (40.425217, 25, -15.517787), (40.425217, 25, -15.517787), (39.148323, 27.231953, -15.027633), (39.881157, 27.231953, -12.958173), (41.181953, 25, -13.380828), (41.181953, 25, -13.380828), (39.881157, 27.231953, -12.958173), (40.504677, 27.231953, -10.853196), (41.825813, 25, -11.207193), (41.825813, 25, -11.207193), (40.504677, 27.231953, -10.853196), (41.01718, 27.231953, -8.718471), (42.355034, 25, -9.00284), (42.355034, 25, -9.00284), (41.01718, 27.231953, -8.718471), (41.417255, 27.231953, -6.5598493), (42.768158, 25, -6.773811), (42.768158, 25, -6.773811), (41.417255, 27.231953, -6.5598493), (41.70381, 27.231953, -4.3832474), (43.06406, 25, -4.526215), (43.06406, 25, -4.526215), (41.70381, 27.231953, -4.3832474), (41.87606, 27.231953, -2.1946313), (43.24193, 25, -2.2662134), (43.24193, 25, -2.2662134), (41.87606, 27.231953, -2.1946313), (41.93353, 27.231953, 0), (43.30127, 25, 0), (41.93353, 27.231953, 0), (40.45085, 29.389263, 0), (40.395412, 29.389263, 2.117034), (41.87606, 27.231953, 2.1946313), (41.87606, 27.231953, 2.1946313), (40.395412, 29.389263, 2.117034), (40.229256, 29.389263, 4.2282653), (41.70381, 27.231953, 4.3832474), (41.70381, 27.231953, 4.3832474), (40.229256, 29.389263, 4.2282653), (39.95283, 29.389263, 6.327907), (41.417255, 27.231953, 6.5598493), (41.417255, 27.231953, 6.5598493), (39.95283, 29.389263, 6.327907), (39.566902, 29.389263, 8.410205), (41.01718, 27.231953, 8.718471), (41.01718, 27.231953, 8.718471), (39.566902, 29.389263, 8.410205), (39.07252, 29.389263, 10.46945), (40.504677, 27.231953, 10.853196), (40.504677, 27.231953, 10.853196), (39.07252, 29.389263, 10.46945), (38.471043, 29.389263, 12.5), (39.881157, 27.231953, 12.958173), (39.881157, 27.231953, 12.958173), (38.471043, 29.389263, 12.5), (37.764122, 29.389263, 14.496288), (39.148323, 27.231953, 15.027633), (39.148323, 27.231953, 15.027633), (37.764122, 29.389263, 14.496288), (36.95369, 29.389263, 16.452843), (38.308186, 27.231953, 17.055902), (38.308186, 27.231953, 17.055902), (36.95369, 29.389263, 16.452843), (36.04197, 29.389263, 18.364302), (37.36305, 27.231953, 19.037424), (37.36305, 27.231953, 19.037424), (36.04197, 29.389263, 18.364302), (35.031464, 29.389263, 20.225426), (36.315502, 27.231953, 20.966764), (36.315502, 27.231953, 20.966764), (35.031464, 29.389263, 20.225426), (33.92494, 29.389263, 22.031113), (35.168415, 27.231953, 22.838636), (35.168415, 27.231953, 22.838636), (33.92494, 29.389263, 22.031113), (32.725426, 29.389263, 23.776413), (33.92494, 27.231953, 24.64791), (33.92494, 27.231953, 24.64791), (32.725426, 29.389263, 23.776413), (31.436214, 29.389263, 25.456545), (32.58847, 27.231953, 26.389624), (32.58847, 27.231953, 26.389624), (31.436214, 29.389263, 25.456545), (30.06084, 29.389263, 27.066902), (31.162685, 27.231953, 28.059008), (31.162685, 27.231953, 28.059008), (30.06084, 29.389263, 27.066902), (28.60307, 29.389263, 28.60307), (29.651482, 27.231953, 29.651482), (29.651482, 27.231953, 29.651482), (28.60307, 29.389263, 28.60307), (27.066902, 29.389263, 30.06084), (28.059008, 27.231953, 31.162685), (28.059008, 27.231953, 31.162685), (27.066902, 29.389263, 30.06084), (25.456545, 29.389263, 31.436214), (26.389624, 27.231953, 32.58847), (26.389624, 27.231953, 32.58847), (25.456545, 29.389263, 31.436214), (23.776413, 29.389263, 32.725426), (24.64791, 27.231953, 33.92494), (24.64791, 27.231953, 33.92494), (23.776413, 29.389263, 32.725426), (22.031113, 29.389263, 33.92494), (22.838636, 27.231953, 35.168415), (22.838636, 27.231953, 35.168415), (22.031113, 29.389263, 33.92494), (20.225426, 29.389263, 35.031464), (20.966764, 27.231953, 36.315502), (20.966764, 27.231953, 36.315502), (20.225426, 29.389263, 35.031464), (18.364302, 29.389263, 36.04197), (19.037424, 27.231953, 37.36305), (19.037424, 27.231953, 37.36305), (18.364302, 29.389263, 36.04197), (16.452843, 29.389263, 36.95369), (17.055902, 27.231953, 38.308186), (17.055902, 27.231953, 38.308186), (16.452843, 29.389263, 36.95369), (14.496288, 29.389263, 37.764122), (15.027633, 27.231953, 39.148323), (15.027633, 27.231953, 39.148323), (14.496288, 29.389263, 37.764122), (12.5, 29.389263, 38.471043), (12.958173, 27.231953, 39.881157), (12.958173, 27.231953, 39.881157), (12.5, 29.389263, 38.471043), (10.46945, 29.389263, 39.07252), (10.853196, 27.231953, 40.504677), (10.853196, 27.231953, 40.504677), (10.46945, 29.389263, 39.07252), (8.410205, 29.389263, 39.566902), (8.718471, 27.231953, 41.01718), (8.718471, 27.231953, 41.01718), (8.410205, 29.389263, 39.566902), (6.327907, 29.389263, 39.95283), (6.5598493, 27.231953, 41.417255), (6.5598493, 27.231953, 41.417255), (6.327907, 29.389263, 39.95283), (4.2282653, 29.389263, 40.229256), (4.3832474, 27.231953, 41.70381), (4.3832474, 27.231953, 41.70381), (4.2282653, 29.389263, 40.229256), (2.117034, 29.389263, 40.395412), (2.1946313, 27.231953, 41.87606), (2.1946313, 27.231953, 41.87606), (2.117034, 29.389263, 40.395412), (2.4769e-15, 29.389263, 40.45085), (2.567688e-15, 27.231953, 41.93353), (2.567688e-15, 27.231953, 41.93353), (2.4769e-15, 29.389263, 40.45085), (-2.117034, 29.389263, 40.395412), (-2.1946313, 27.231953, 41.87606), (-2.1946313, 27.231953, 41.87606), (-2.117034, 29.389263, 40.395412), (-4.2282653, 29.389263, 40.229256), (-4.3832474, 27.231953, 41.70381), (-4.3832474, 27.231953, 41.70381), (-4.2282653, 29.389263, 40.229256), (-6.327907, 29.389263, 39.95283), (-6.5598493, 27.231953, 41.417255), (-6.5598493, 27.231953, 41.417255), (-6.327907, 29.389263, 39.95283), (-8.410205, 29.389263, 39.566902), (-8.718471, 27.231953, 41.01718), (-8.718471, 27.231953, 41.01718), (-8.410205, 29.389263, 39.566902), (-10.46945, 29.389263, 39.07252), (-10.853196, 27.231953, 40.504677), (-10.853196, 27.231953, 40.504677), (-10.46945, 29.389263, 39.07252), (-12.5, 29.389263, 38.471043), (-12.958173, 27.231953, 39.881157), (-12.958173, 27.231953, 39.881157), (-12.5, 29.389263, 38.471043), (-14.496288, 29.389263, 37.764122), (-15.027633, 27.231953, 39.148323), (-15.027633, 27.231953, 39.148323), (-14.496288, 29.389263, 37.764122), (-16.452843, 29.389263, 36.95369), (-17.055902, 27.231953, 38.308186), (-17.055902, 27.231953, 38.308186), (-16.452843, 29.389263, 36.95369), (-18.364302, 29.389263, 36.04197), (-19.037424, 27.231953, 37.36305), (-19.037424, 27.231953, 37.36305), (-18.364302, 29.389263, 36.04197), (-20.225426, 29.389263, 35.031464), (-20.966764, 27.231953, 36.315502), (-20.966764, 27.231953, 36.315502), (-20.225426, 29.389263, 35.031464), (-22.031113, 29.389263, 33.92494), (-22.838636, 27.231953, 35.168415), (-22.838636, 27.231953, 35.168415), (-22.031113, 29.389263, 33.92494), (-23.776413, 29.389263, 32.725426), (-24.64791, 27.231953, 33.92494), (-24.64791, 27.231953, 33.92494), (-23.776413, 29.389263, 32.725426), (-25.456545, 29.389263, 31.436214), (-26.389624, 27.231953, 32.58847), (-26.389624, 27.231953, 32.58847), (-25.456545, 29.389263, 31.436214), (-27.066902, 29.389263, 30.06084), (-28.059008, 27.231953, 31.162685), (-28.059008, 27.231953, 31.162685), (-27.066902, 29.389263, 30.06084), (-28.60307, 29.389263, 28.60307), (-29.651482, 27.231953, 29.651482), (-29.651482, 27.231953, 29.651482), (-28.60307, 29.389263, 28.60307), (-30.06084, 29.389263, 27.066902), (-31.162685, 27.231953, 28.059008), (-31.162685, 27.231953, 28.059008), (-30.06084, 29.389263, 27.066902), (-31.436214, 29.389263, 25.456545), (-32.58847, 27.231953, 26.389624), (-32.58847, 27.231953, 26.389624), (-31.436214, 29.389263, 25.456545), (-32.725426, 29.389263, 23.776413), (-33.92494, 27.231953, 24.64791), (-33.92494, 27.231953, 24.64791), (-32.725426, 29.389263, 23.776413), (-33.92494, 29.389263, 22.031113), (-35.168415, 27.231953, 22.838636), (-35.168415, 27.231953, 22.838636), (-33.92494, 29.389263, 22.031113), (-35.031464, 29.389263, 20.225426), (-36.315502, 27.231953, 20.966764), (-36.315502, 27.231953, 20.966764), (-35.031464, 29.389263, 20.225426), (-36.04197, 29.389263, 18.364302), (-37.36305, 27.231953, 19.037424), (-37.36305, 27.231953, 19.037424), (-36.04197, 29.389263, 18.364302), (-36.95369, 29.389263, 16.452843), (-38.308186, 27.231953, 17.055902), (-38.308186, 27.231953, 17.055902), (-36.95369, 29.389263, 16.452843), (-37.764122, 29.389263, 14.496288), (-39.148323, 27.231953, 15.027633), (-39.148323, 27.231953, 15.027633), (-37.764122, 29.389263, 14.496288), (-38.471043, 29.389263, 12.5), (-39.881157, 27.231953, 12.958173), (-39.881157, 27.231953, 12.958173), (-38.471043, 29.389263, 12.5), (-39.07252, 29.389263, 10.46945), (-40.504677, 27.231953, 10.853196), (-40.504677, 27.231953, 10.853196), (-39.07252, 29.389263, 10.46945), (-39.566902, 29.389263, 8.410205), (-41.01718, 27.231953, 8.718471), (-41.01718, 27.231953, 8.718471), (-39.566902, 29.389263, 8.410205), (-39.95283, 29.389263, 6.327907), (-41.417255, 27.231953, 6.5598493), (-41.417255, 27.231953, 6.5598493), (-39.95283, 29.389263, 6.327907), (-40.229256, 29.389263, 4.2282653), (-41.70381, 27.231953, 4.3832474), (-41.70381, 27.231953, 4.3832474), (-40.229256, 29.389263, 4.2282653), (-40.395412, 29.389263, 2.117034), (-41.87606, 27.231953, 2.1946313), (-41.87606, 27.231953, 2.1946313), (-40.395412, 29.389263, 2.117034), (-40.45085, 29.389263, 4.9538e-15), (-41.93353, 27.231953, 5.135376e-15), (-41.93353, 27.231953, 5.135376e-15), (-40.45085, 29.389263, 4.9538e-15), (-40.395412, 29.389263, -2.117034), (-41.87606, 27.231953, -2.1946313), (-41.87606, 27.231953, -2.1946313), (-40.395412, 29.389263, -2.117034), (-40.229256, 29.389263, -4.2282653), (-41.70381, 27.231953, -4.3832474), (-41.70381, 27.231953, -4.3832474), (-40.229256, 29.389263, -4.2282653), (-39.95283, 29.389263, -6.327907), (-41.417255, 27.231953, -6.5598493), (-41.417255, 27.231953, -6.5598493), (-39.95283, 29.389263, -6.327907), (-39.566902, 29.389263, -8.410205), (-41.01718, 27.231953, -8.718471), (-41.01718, 27.231953, -8.718471), (-39.566902, 29.389263, -8.410205), (-39.07252, 29.389263, -10.46945), (-40.504677, 27.231953, -10.853196), (-40.504677, 27.231953, -10.853196), (-39.07252, 29.389263, -10.46945), (-38.471043, 29.389263, -12.5), (-39.881157, 27.231953, -12.958173), (-39.881157, 27.231953, -12.958173), (-38.471043, 29.389263, -12.5), (-37.764122, 29.389263, -14.496288), (-39.148323, 27.231953, -15.027633), (-39.148323, 27.231953, -15.027633), (-37.764122, 29.389263, -14.496288), (-36.95369, 29.389263, -16.452843), (-38.308186, 27.231953, -17.055902), (-38.308186, 27.231953, -17.055902), (-36.95369, 29.389263, -16.452843), (-36.04197, 29.389263, -18.364302), (-37.36305, 27.231953, -19.037424), (-37.36305, 27.231953, -19.037424), (-36.04197, 29.389263, -18.364302), (-35.031464, 29.389263, -20.225426), (-36.315502, 27.231953, -20.966764), (-36.315502, 27.231953, -20.966764), (-35.031464, 29.389263, -20.225426), (-33.92494, 29.389263, -22.031113), (-35.168415, 27.231953, -22.838636), (-35.168415, 27.231953, -22.838636), (-33.92494, 29.389263, -22.031113), (-32.725426, 29.389263, -23.776413), (-33.92494, 27.231953, -24.64791), (-33.92494, 27.231953, -24.64791), (-32.725426, 29.389263, -23.776413), (-31.436214, 29.389263, -25.456545), (-32.58847, 27.231953, -26.389624), (-32.58847, 27.231953, -26.389624), (-31.436214, 29.389263, -25.456545), (-30.06084, 29.389263, -27.066902), (-31.162685, 27.231953, -28.059008), (-31.162685, 27.231953, -28.059008), (-30.06084, 29.389263, -27.066902), (-28.60307, 29.389263, -28.60307), (-29.651482, 27.231953, -29.651482), (-29.651482, 27.231953, -29.651482), (-28.60307, 29.389263, -28.60307), (-27.066902, 29.389263, -30.06084), (-28.059008, 27.231953, -31.162685), (-28.059008, 27.231953, -31.162685), (-27.066902, 29.389263, -30.06084), (-25.456545, 29.389263, -31.436214), (-26.389624, 27.231953, -32.58847), (-26.389624, 27.231953, -32.58847), (-25.456545, 29.389263, -31.436214), (-23.776413, 29.389263, -32.725426), (-24.64791, 27.231953, -33.92494), (-24.64791, 27.231953, -33.92494), (-23.776413, 29.389263, -32.725426), (-22.031113, 29.389263, -33.92494), (-22.838636, 27.231953, -35.168415), (-22.838636, 27.231953, -35.168415), (-22.031113, 29.389263, -33.92494), (-20.225426, 29.389263, -35.031464), (-20.966764, 27.231953, -36.315502), (-20.966764, 27.231953, -36.315502), (-20.225426, 29.389263, -35.031464), (-18.364302, 29.389263, -36.04197), (-19.037424, 27.231953, -37.36305), (-19.037424, 27.231953, -37.36305), (-18.364302, 29.389263, -36.04197), (-16.452843, 29.389263, -36.95369), (-17.055902, 27.231953, -38.308186), (-17.055902, 27.231953, -38.308186), (-16.452843, 29.389263, -36.95369), (-14.496288, 29.389263, -37.764122), (-15.027633, 27.231953, -39.148323), (-15.027633, 27.231953, -39.148323), (-14.496288, 29.389263, -37.764122), (-12.5, 29.389263, -38.471043), (-12.958173, 27.231953, -39.881157), (-12.958173, 27.231953, -39.881157), (-12.5, 29.389263, -38.471043), (-10.46945, 29.389263, -39.07252), (-10.853196, 27.231953, -40.504677), (-10.853196, 27.231953, -40.504677), (-10.46945, 29.389263, -39.07252), (-8.410205, 29.389263, -39.566902), (-8.718471, 27.231953, -41.01718), (-8.718471, 27.231953, -41.01718), (-8.410205, 29.389263, -39.566902), (-6.327907, 29.389263, -39.95283), (-6.5598493, 27.231953, -41.417255), (-6.5598493, 27.231953, -41.417255), (-6.327907, 29.389263, -39.95283), (-4.2282653, 29.389263, -40.229256), (-4.3832474, 27.231953, -41.70381), (-4.3832474, 27.231953, -41.70381), (-4.2282653, 29.389263, -40.229256), (-2.117034, 29.389263, -40.395412), (-2.1946313, 27.231953, -41.87606), (-2.1946313, 27.231953, -41.87606), (-2.117034, 29.389263, -40.395412), (-7.430701e-15, 29.389263, -40.45085), (-7.703064e-15, 27.231953, -41.93353), (-7.703064e-15, 27.231953, -41.93353), (-7.430701e-15, 29.389263, -40.45085), (2.117034, 29.389263, -40.395412), (2.1946313, 27.231953, -41.87606), (2.1946313, 27.231953, -41.87606), (2.117034, 29.389263, -40.395412), (4.2282653, 29.389263, -40.229256), (4.3832474, 27.231953, -41.70381), (4.3832474, 27.231953, -41.70381), (4.2282653, 29.389263, -40.229256), (6.327907, 29.389263, -39.95283), (6.5598493, 27.231953, -41.417255), (6.5598493, 27.231953, -41.417255), (6.327907, 29.389263, -39.95283), (8.410205, 29.389263, -39.566902), (8.718471, 27.231953, -41.01718), (8.718471, 27.231953, -41.01718), (8.410205, 29.389263, -39.566902), (10.46945, 29.389263, -39.07252), (10.853196, 27.231953, -40.504677), (10.853196, 27.231953, -40.504677), (10.46945, 29.389263, -39.07252), (12.5, 29.389263, -38.471043), (12.958173, 27.231953, -39.881157), (12.958173, 27.231953, -39.881157), (12.5, 29.389263, -38.471043), (14.496288, 29.389263, -37.764122), (15.027633, 27.231953, -39.148323), (15.027633, 27.231953, -39.148323), (14.496288, 29.389263, -37.764122), (16.452843, 29.389263, -36.95369), (17.055902, 27.231953, -38.308186), (17.055902, 27.231953, -38.308186), (16.452843, 29.389263, -36.95369), (18.364302, 29.389263, -36.04197), (19.037424, 27.231953, -37.36305), (19.037424, 27.231953, -37.36305), (18.364302, 29.389263, -36.04197), (20.225426, 29.389263, -35.031464), (20.966764, 27.231953, -36.315502), (20.966764, 27.231953, -36.315502), (20.225426, 29.389263, -35.031464), (22.031113, 29.389263, -33.92494), (22.838636, 27.231953, -35.168415), (22.838636, 27.231953, -35.168415), (22.031113, 29.389263, -33.92494), (23.776413, 29.389263, -32.725426), (24.64791, 27.231953, -33.92494), (24.64791, 27.231953, -33.92494), (23.776413, 29.389263, -32.725426), (25.456545, 29.389263, -31.436214), (26.389624, 27.231953, -32.58847), (26.389624, 27.231953, -32.58847), (25.456545, 29.389263, -31.436214), (27.066902, 29.389263, -30.06084), (28.059008, 27.231953, -31.162685), (28.059008, 27.231953, -31.162685), (27.066902, 29.389263, -30.06084), (28.60307, 29.389263, -28.60307), (29.651482, 27.231953, -29.651482), (29.651482, 27.231953, -29.651482), (28.60307, 29.389263, -28.60307), (30.06084, 29.389263, -27.066902), (31.162685, 27.231953, -28.059008), (31.162685, 27.231953, -28.059008), (30.06084, 29.389263, -27.066902), (31.436214, 29.389263, -25.456545), (32.58847, 27.231953, -26.389624), (32.58847, 27.231953, -26.389624), (31.436214, 29.389263, -25.456545), (32.725426, 29.389263, -23.776413), (33.92494, 27.231953, -24.64791), (33.92494, 27.231953, -24.64791), (32.725426, 29.389263, -23.776413), (33.92494, 29.389263, -22.031113), (35.168415, 27.231953, -22.838636), (35.168415, 27.231953, -22.838636), (33.92494, 29.389263, -22.031113), (35.031464, 29.389263, -20.225426), (36.315502, 27.231953, -20.966764), (36.315502, 27.231953, -20.966764), (35.031464, 29.389263, -20.225426), (36.04197, 29.389263, -18.364302), (37.36305, 27.231953, -19.037424), (37.36305, 27.231953, -19.037424), (36.04197, 29.389263, -18.364302), (36.95369, 29.389263, -16.452843), (38.308186, 27.231953, -17.055902), (38.308186, 27.231953, -17.055902), (36.95369, 29.389263, -16.452843), (37.764122, 29.389263, -14.496288), (39.148323, 27.231953, -15.027633), (39.148323, 27.231953, -15.027633), (37.764122, 29.389263, -14.496288), (38.471043, 29.389263, -12.5), (39.881157, 27.231953, -12.958173), (39.881157, 27.231953, -12.958173), (38.471043, 29.389263, -12.5), (39.07252, 29.389263, -10.46945), (40.504677, 27.231953, -10.853196), (40.504677, 27.231953, -10.853196), (39.07252, 29.389263, -10.46945), (39.566902, 29.389263, -8.410205), (41.01718, 27.231953, -8.718471), (41.01718, 27.231953, -8.718471), (39.566902, 29.389263, -8.410205), (39.95283, 29.389263, -6.327907), (41.417255, 27.231953, -6.5598493), (41.417255, 27.231953, -6.5598493), (39.95283, 29.389263, -6.327907), (40.229256, 29.389263, -4.2282653), (41.70381, 27.231953, -4.3832474), (41.70381, 27.231953, -4.3832474), (40.229256, 29.389263, -4.2282653), (40.395412, 29.389263, -2.117034), (41.87606, 27.231953, -2.1946313), (41.87606, 27.231953, -2.1946313), (40.395412, 29.389263, -2.117034), (40.45085, 29.389263, 0), (41.93353, 27.231953, 0), (40.45085, 29.389263, 0), (38.8573, 31.466019, 0), (38.804047, 31.466019, 2.033634), (40.395412, 29.389263, 2.117034), (40.395412, 29.389263, 2.117034), (38.804047, 31.466019, 2.033634), (38.644432, 31.466019, 4.0616937), (40.229256, 29.389263, 4.2282653), (40.229256, 29.389263, 4.2282653), (38.644432, 31.466019, 4.0616937), (38.3789, 31.466019, 6.0786204), (39.95283, 29.389263, 6.327907), (39.95283, 29.389263, 6.327907), (38.3789, 31.466019, 6.0786204), (38.00817, 31.466019, 8.078887), (39.566902, 29.389263, 8.410205), (39.566902, 29.389263, 8.410205), (38.00817, 31.466019, 8.078887), (37.533268, 31.466019, 10.057009), (39.07252, 29.389263, 10.46945), (39.07252, 29.389263, 10.46945), (37.533268, 31.466019, 10.057009), (36.955486, 31.466019, 12.0075655), (38.471043, 29.389263, 12.5), (38.471043, 29.389263, 12.5), (36.955486, 31.466019, 12.0075655), (36.276413, 31.466019, 13.92521), (37.764122, 29.389263, 14.496288), (37.764122, 29.389263, 14.496288), (36.276413, 31.466019, 13.92521), (35.49791, 31.466019, 15.804687), (36.95369, 29.389263, 16.452843), (36.95369, 29.389263, 16.452843), (35.49791, 31.466019, 15.804687), (34.622105, 31.466019, 17.640844), (36.04197, 29.389263, 18.364302), (36.04197, 29.389263, 18.364302), (34.622105, 31.466019, 17.640844), (33.65141, 31.466019, 19.42865), (35.031464, 29.389263, 20.225426), (35.031464, 29.389263, 20.225426), (33.65141, 31.466019, 19.42865), (32.58847, 31.466019, 21.1632), (33.92494, 29.389263, 22.031113), (33.92494, 29.389263, 22.031113), (32.58847, 31.466019, 21.1632), (31.436214, 31.466019, 22.839746), (32.725426, 29.389263, 23.776413), (32.725426, 29.389263, 23.776413), (31.436214, 31.466019, 22.839746), (30.197792, 31.466019, 24.45369), (31.436214, 29.389263, 25.456545), (31.436214, 29.389263, 25.456545), (30.197792, 31.466019, 24.45369), (28.8766, 31.466019, 26.000607), (30.06084, 29.389263, 27.066902), (30.06084, 29.389263, 27.066902), (28.8766, 31.466019, 26.000607), (27.47626, 31.466019, 27.47626), (28.60307, 29.389263, 28.60307), (28.60307, 29.389263, 28.60307), (27.47626, 31.466019, 27.47626), (26.000607, 31.466019, 28.8766), (27.066902, 29.389263, 30.06084), (27.066902, 29.389263, 30.06084), (26.000607, 31.466019, 28.8766), (24.45369, 31.466019, 30.197792), (25.456545, 29.389263, 31.436214), (25.456545, 29.389263, 31.436214), (24.45369, 31.466019, 30.197792), (22.839746, 31.466019, 31.436214), (23.776413, 29.389263, 32.725426), (23.776413, 29.389263, 32.725426), (22.839746, 31.466019, 31.436214), (21.1632, 31.466019, 32.58847), (22.031113, 29.389263, 33.92494), (22.031113, 29.389263, 33.92494), (21.1632, 31.466019, 32.58847), (19.42865, 31.466019, 33.65141), (20.225426, 29.389263, 35.031464), (20.225426, 29.389263, 35.031464), (19.42865, 31.466019, 33.65141), (17.640844, 31.466019, 34.622105), (18.364302, 29.389263, 36.04197), (18.364302, 29.389263, 36.04197), (17.640844, 31.466019, 34.622105), (15.804687, 31.466019, 35.49791), (16.452843, 29.389263, 36.95369), (16.452843, 29.389263, 36.95369), (15.804687, 31.466019, 35.49791), (13.92521, 31.466019, 36.276413), (14.496288, 29.389263, 37.764122), (14.496288, 29.389263, 37.764122), (13.92521, 31.466019, 36.276413), (12.0075655, 31.466019, 36.955486), (12.5, 29.389263, 38.471043), (12.5, 29.389263, 38.471043), (12.0075655, 31.466019, 36.955486), (10.057009, 31.466019, 37.533268), (10.46945, 29.389263, 39.07252), (10.46945, 29.389263, 39.07252), (10.057009, 31.466019, 37.533268), (8.078887, 31.466019, 38.00817), (8.410205, 29.389263, 39.566902), (8.410205, 29.389263, 39.566902), (8.078887, 31.466019, 38.00817), (6.0786204, 31.466019, 38.3789), (6.327907, 29.389263, 39.95283), (6.327907, 29.389263, 39.95283), (6.0786204, 31.466019, 38.3789), (4.0616937, 31.466019, 38.644432), (4.2282653, 29.389263, 40.229256), (4.2282653, 29.389263, 40.229256), (4.0616937, 31.466019, 38.644432), (2.033634, 31.466019, 38.804047), (2.117034, 29.389263, 40.395412), (2.117034, 29.389263, 40.395412), (2.033634, 31.466019, 38.804047), (2.3793234e-15, 31.466019, 38.8573), (2.4769e-15, 29.389263, 40.45085), (2.4769e-15, 29.389263, 40.45085), (2.3793234e-15, 31.466019, 38.8573), (-2.033634, 31.466019, 38.804047), (-2.117034, 29.389263, 40.395412), (-2.117034, 29.389263, 40.395412), (-2.033634, 31.466019, 38.804047), (-4.0616937, 31.466019, 38.644432), (-4.2282653, 29.389263, 40.229256), (-4.2282653, 29.389263, 40.229256), (-4.0616937, 31.466019, 38.644432), (-6.0786204, 31.466019, 38.3789), (-6.327907, 29.389263, 39.95283), (-6.327907, 29.389263, 39.95283), (-6.0786204, 31.466019, 38.3789), (-8.078887, 31.466019, 38.00817), (-8.410205, 29.389263, 39.566902), (-8.410205, 29.389263, 39.566902), (-8.078887, 31.466019, 38.00817), (-10.057009, 31.466019, 37.533268), (-10.46945, 29.389263, 39.07252), (-10.46945, 29.389263, 39.07252), (-10.057009, 31.466019, 37.533268), (-12.0075655, 31.466019, 36.955486), (-12.5, 29.389263, 38.471043), (-12.5, 29.389263, 38.471043), (-12.0075655, 31.466019, 36.955486), (-13.92521, 31.466019, 36.276413), (-14.496288, 29.389263, 37.764122), (-14.496288, 29.389263, 37.764122), (-13.92521, 31.466019, 36.276413), (-15.804687, 31.466019, 35.49791), (-16.452843, 29.389263, 36.95369), (-16.452843, 29.389263, 36.95369), (-15.804687, 31.466019, 35.49791), (-17.640844, 31.466019, 34.622105), (-18.364302, 29.389263, 36.04197), (-18.364302, 29.389263, 36.04197), (-17.640844, 31.466019, 34.622105), (-19.42865, 31.466019, 33.65141), (-20.225426, 29.389263, 35.031464), (-20.225426, 29.389263, 35.031464), (-19.42865, 31.466019, 33.65141), (-21.1632, 31.466019, 32.58847), (-22.031113, 29.389263, 33.92494), (-22.031113, 29.389263, 33.92494), (-21.1632, 31.466019, 32.58847), (-22.839746, 31.466019, 31.436214), (-23.776413, 29.389263, 32.725426), (-23.776413, 29.389263, 32.725426), (-22.839746, 31.466019, 31.436214), (-24.45369, 31.466019, 30.197792), (-25.456545, 29.389263, 31.436214), (-25.456545, 29.389263, 31.436214), (-24.45369, 31.466019, 30.197792), (-26.000607, 31.466019, 28.8766), (-27.066902, 29.389263, 30.06084), (-27.066902, 29.389263, 30.06084), (-26.000607, 31.466019, 28.8766), (-27.47626, 31.466019, 27.47626), (-28.60307, 29.389263, 28.60307), (-28.60307, 29.389263, 28.60307), (-27.47626, 31.466019, 27.47626), (-28.8766, 31.466019, 26.000607), (-30.06084, 29.389263, 27.066902), (-30.06084, 29.389263, 27.066902), (-28.8766, 31.466019, 26.000607), (-30.197792, 31.466019, 24.45369), (-31.436214, 29.389263, 25.456545), (-31.436214, 29.389263, 25.456545), (-30.197792, 31.466019, 24.45369), (-31.436214, 31.466019, 22.839746), (-32.725426, 29.389263, 23.776413), (-32.725426, 29.389263, 23.776413), (-31.436214, 31.466019, 22.839746), (-32.58847, 31.466019, 21.1632), (-33.92494, 29.389263, 22.031113), (-33.92494, 29.389263, 22.031113), (-32.58847, 31.466019, 21.1632), (-33.65141, 31.466019, 19.42865), (-35.031464, 29.389263, 20.225426), (-35.031464, 29.389263, 20.225426), (-33.65141, 31.466019, 19.42865), (-34.622105, 31.466019, 17.640844), (-36.04197, 29.389263, 18.364302), (-36.04197, 29.389263, 18.364302), (-34.622105, 31.466019, 17.640844), (-35.49791, 31.466019, 15.804687), (-36.95369, 29.389263, 16.452843), (-36.95369, 29.389263, 16.452843), (-35.49791, 31.466019, 15.804687), (-36.276413, 31.466019, 13.92521), (-37.764122, 29.389263, 14.496288), (-37.764122, 29.389263, 14.496288), (-36.276413, 31.466019, 13.92521), (-36.955486, 31.466019, 12.0075655), (-38.471043, 29.389263, 12.5), (-38.471043, 29.389263, 12.5), (-36.955486, 31.466019, 12.0075655), (-37.533268, 31.466019, 10.057009), (-39.07252, 29.389263, 10.46945), (-39.07252, 29.389263, 10.46945), (-37.533268, 31.466019, 10.057009), (-38.00817, 31.466019, 8.078887), (-39.566902, 29.389263, 8.410205), (-39.566902, 29.389263, 8.410205), (-38.00817, 31.466019, 8.078887), (-38.3789, 31.466019, 6.0786204), (-39.95283, 29.389263, 6.327907), (-39.95283, 29.389263, 6.327907), (-38.3789, 31.466019, 6.0786204), (-38.644432, 31.466019, 4.0616937), (-40.229256, 29.389263, 4.2282653), (-40.229256, 29.389263, 4.2282653), (-38.644432, 31.466019, 4.0616937), (-38.804047, 31.466019, 2.033634), (-40.395412, 29.389263, 2.117034), (-40.395412, 29.389263, 2.117034), (-38.804047, 31.466019, 2.033634), (-38.8573, 31.466019, 4.7586468e-15), (-40.45085, 29.389263, 4.9538e-15), (-40.45085, 29.389263, 4.9538e-15), (-38.8573, 31.466019, 4.7586468e-15), (-38.804047, 31.466019, -2.033634), (-40.395412, 29.389263, -2.117034), (-40.395412, 29.389263, -2.117034), (-38.804047, 31.466019, -2.033634), (-38.644432, 31.466019, -4.0616937), (-40.229256, 29.389263, -4.2282653), (-40.229256, 29.389263, -4.2282653), (-38.644432, 31.466019, -4.0616937), (-38.3789, 31.466019, -6.0786204), (-39.95283, 29.389263, -6.327907), (-39.95283, 29.389263, -6.327907), (-38.3789, 31.466019, -6.0786204), (-38.00817, 31.466019, -8.078887), (-39.566902, 29.389263, -8.410205), (-39.566902, 29.389263, -8.410205), (-38.00817, 31.466019, -8.078887), (-37.533268, 31.466019, -10.057009), (-39.07252, 29.389263, -10.46945), (-39.07252, 29.389263, -10.46945), (-37.533268, 31.466019, -10.057009), (-36.955486, 31.466019, -12.0075655), (-38.471043, 29.389263, -12.5), (-38.471043, 29.389263, -12.5), (-36.955486, 31.466019, -12.0075655), (-36.276413, 31.466019, -13.92521), (-37.764122, 29.389263, -14.496288), (-37.764122, 29.389263, -14.496288), (-36.276413, 31.466019, -13.92521), (-35.49791, 31.466019, -15.804687), (-36.95369, 29.389263, -16.452843), (-36.95369, 29.389263, -16.452843), (-35.49791, 31.466019, -15.804687), (-34.622105, 31.466019, -17.640844), (-36.04197, 29.389263, -18.364302), (-36.04197, 29.389263, -18.364302), (-34.622105, 31.466019, -17.640844), (-33.65141, 31.466019, -19.42865), (-35.031464, 29.389263, -20.225426), (-35.031464, 29.389263, -20.225426), (-33.65141, 31.466019, -19.42865), (-32.58847, 31.466019, -21.1632), (-33.92494, 29.389263, -22.031113), (-33.92494, 29.389263, -22.031113), (-32.58847, 31.466019, -21.1632), (-31.436214, 31.466019, -22.839746), (-32.725426, 29.389263, -23.776413), (-32.725426, 29.389263, -23.776413), (-31.436214, 31.466019, -22.839746), (-30.197792, 31.466019, -24.45369), (-31.436214, 29.389263, -25.456545), (-31.436214, 29.389263, -25.456545), (-30.197792, 31.466019, -24.45369), (-28.8766, 31.466019, -26.000607), (-30.06084, 29.389263, -27.066902), (-30.06084, 29.389263, -27.066902), (-28.8766, 31.466019, -26.000607), (-27.47626, 31.466019, -27.47626), (-28.60307, 29.389263, -28.60307), (-28.60307, 29.389263, -28.60307), (-27.47626, 31.466019, -27.47626), (-26.000607, 31.466019, -28.8766), (-27.066902, 29.389263, -30.06084), (-27.066902, 29.389263, -30.06084), (-26.000607, 31.466019, -28.8766), (-24.45369, 31.466019, -30.197792), (-25.456545, 29.389263, -31.436214), (-25.456545, 29.389263, -31.436214), (-24.45369, 31.466019, -30.197792), (-22.839746, 31.466019, -31.436214), (-23.776413, 29.389263, -32.725426), (-23.776413, 29.389263, -32.725426), (-22.839746, 31.466019, -31.436214), (-21.1632, 31.466019, -32.58847), (-22.031113, 29.389263, -33.92494), (-22.031113, 29.389263, -33.92494), (-21.1632, 31.466019, -32.58847), (-19.42865, 31.466019, -33.65141), (-20.225426, 29.389263, -35.031464), (-20.225426, 29.389263, -35.031464), (-19.42865, 31.466019, -33.65141), (-17.640844, 31.466019, -34.622105), (-18.364302, 29.389263, -36.04197), (-18.364302, 29.389263, -36.04197), (-17.640844, 31.466019, -34.622105), (-15.804687, 31.466019, -35.49791), (-16.452843, 29.389263, -36.95369), (-16.452843, 29.389263, -36.95369), (-15.804687, 31.466019, -35.49791), (-13.92521, 31.466019, -36.276413), (-14.496288, 29.389263, -37.764122), (-14.496288, 29.389263, -37.764122), (-13.92521, 31.466019, -36.276413), (-12.0075655, 31.466019, -36.955486), (-12.5, 29.389263, -38.471043), (-12.5, 29.389263, -38.471043), (-12.0075655, 31.466019, -36.955486), (-10.057009, 31.466019, -37.533268), (-10.46945, 29.389263, -39.07252), (-10.46945, 29.389263, -39.07252), (-10.057009, 31.466019, -37.533268), (-8.078887, 31.466019, -38.00817), (-8.410205, 29.389263, -39.566902), (-8.410205, 29.389263, -39.566902), (-8.078887, 31.466019, -38.00817), (-6.0786204, 31.466019, -38.3789), (-6.327907, 29.389263, -39.95283), (-6.327907, 29.389263, -39.95283), (-6.0786204, 31.466019, -38.3789), (-4.0616937, 31.466019, -38.644432), (-4.2282653, 29.389263, -40.229256), (-4.2282653, 29.389263, -40.229256), (-4.0616937, 31.466019, -38.644432), (-2.033634, 31.466019, -38.804047), (-2.117034, 29.389263, -40.395412), (-2.117034, 29.389263, -40.395412), (-2.033634, 31.466019, -38.804047), (-7.1379695e-15, 31.466019, -38.8573), (-7.430701e-15, 29.389263, -40.45085), (-7.430701e-15, 29.389263, -40.45085), (-7.1379695e-15, 31.466019, -38.8573), (2.033634, 31.466019, -38.804047), (2.117034, 29.389263, -40.395412), (2.117034, 29.389263, -40.395412), (2.033634, 31.466019, -38.804047), (4.0616937, 31.466019, -38.644432), (4.2282653, 29.389263, -40.229256), (4.2282653, 29.389263, -40.229256), (4.0616937, 31.466019, -38.644432), (6.0786204, 31.466019, -38.3789), (6.327907, 29.389263, -39.95283), (6.327907, 29.389263, -39.95283), (6.0786204, 31.466019, -38.3789), (8.078887, 31.466019, -38.00817), (8.410205, 29.389263, -39.566902), (8.410205, 29.389263, -39.566902), (8.078887, 31.466019, -38.00817), (10.057009, 31.466019, -37.533268), (10.46945, 29.389263, -39.07252), (10.46945, 29.389263, -39.07252), (10.057009, 31.466019, -37.533268), (12.0075655, 31.466019, -36.955486), (12.5, 29.389263, -38.471043), (12.5, 29.389263, -38.471043), (12.0075655, 31.466019, -36.955486), (13.92521, 31.466019, -36.276413), (14.496288, 29.389263, -37.764122), (14.496288, 29.389263, -37.764122), (13.92521, 31.466019, -36.276413), (15.804687, 31.466019, -35.49791), (16.452843, 29.389263, -36.95369), (16.452843, 29.389263, -36.95369), (15.804687, 31.466019, -35.49791), (17.640844, 31.466019, -34.622105), (18.364302, 29.389263, -36.04197), (18.364302, 29.389263, -36.04197), (17.640844, 31.466019, -34.622105), (19.42865, 31.466019, -33.65141), (20.225426, 29.389263, -35.031464), (20.225426, 29.389263, -35.031464), (19.42865, 31.466019, -33.65141), (21.1632, 31.466019, -32.58847), (22.031113, 29.389263, -33.92494), (22.031113, 29.389263, -33.92494), (21.1632, 31.466019, -32.58847), (22.839746, 31.466019, -31.436214), (23.776413, 29.389263, -32.725426), (23.776413, 29.389263, -32.725426), (22.839746, 31.466019, -31.436214), (24.45369, 31.466019, -30.197792), (25.456545, 29.389263, -31.436214), (25.456545, 29.389263, -31.436214), (24.45369, 31.466019, -30.197792), (26.000607, 31.466019, -28.8766), (27.066902, 29.389263, -30.06084), (27.066902, 29.389263, -30.06084), (26.000607, 31.466019, -28.8766), (27.47626, 31.466019, -27.47626), (28.60307, 29.389263, -28.60307), (28.60307, 29.389263, -28.60307), (27.47626, 31.466019, -27.47626), (28.8766, 31.466019, -26.000607), (30.06084, 29.389263, -27.066902), (30.06084, 29.389263, -27.066902), (28.8766, 31.466019, -26.000607), (30.197792, 31.466019, -24.45369), (31.436214, 29.389263, -25.456545), (31.436214, 29.389263, -25.456545), (30.197792, 31.466019, -24.45369), (31.436214, 31.466019, -22.839746), (32.725426, 29.389263, -23.776413), (32.725426, 29.389263, -23.776413), (31.436214, 31.466019, -22.839746), (32.58847, 31.466019, -21.1632), (33.92494, 29.389263, -22.031113), (33.92494, 29.389263, -22.031113), (32.58847, 31.466019, -21.1632), (33.65141, 31.466019, -19.42865), (35.031464, 29.389263, -20.225426), (35.031464, 29.389263, -20.225426), (33.65141, 31.466019, -19.42865), (34.622105, 31.466019, -17.640844), (36.04197, 29.389263, -18.364302), (36.04197, 29.389263, -18.364302), (34.622105, 31.466019, -17.640844), (35.49791, 31.466019, -15.804687), (36.95369, 29.389263, -16.452843), (36.95369, 29.389263, -16.452843), (35.49791, 31.466019, -15.804687), (36.276413, 31.466019, -13.92521), (37.764122, 29.389263, -14.496288), (37.764122, 29.389263, -14.496288), (36.276413, 31.466019, -13.92521), (36.955486, 31.466019, -12.0075655), (38.471043, 29.389263, -12.5), (38.471043, 29.389263, -12.5), (36.955486, 31.466019, -12.0075655), (37.533268, 31.466019, -10.057009), (39.07252, 29.389263, -10.46945), (39.07252, 29.389263, -10.46945), (37.533268, 31.466019, -10.057009), (38.00817, 31.466019, -8.078887), (39.566902, 29.389263, -8.410205), (39.566902, 29.389263, -8.410205), (38.00817, 31.466019, -8.078887), (38.3789, 31.466019, -6.0786204), (39.95283, 29.389263, -6.327907), (39.95283, 29.389263, -6.327907), (38.3789, 31.466019, -6.0786204), (38.644432, 31.466019, -4.0616937), (40.229256, 29.389263, -4.2282653), (40.229256, 29.389263, -4.2282653), (38.644432, 31.466019, -4.0616937), (38.804047, 31.466019, -2.033634), (40.395412, 29.389263, -2.117034), (40.395412, 29.389263, -2.117034), (38.804047, 31.466019, -2.033634), (38.8573, 31.466019, 0), (40.45085, 29.389263, 0), (38.8573, 31.466019, 0), (37.15724, 33.45653, 0), (37.10632, 33.45653, 1.9446597), (38.804047, 31.466019, 2.033634), (38.804047, 31.466019, 2.033634), (37.10632, 33.45653, 1.9446597), (36.95369, 33.45653, 3.8839893), (38.644432, 31.466019, 4.0616937), (38.644432, 31.466019, 4.0616937), (36.95369, 33.45653, 3.8839893), (36.699776, 33.45653, 5.812673), (38.3789, 31.466019, 6.0786204), (38.3789, 31.466019, 6.0786204), (36.699776, 33.45653, 5.812673), (36.34527, 33.45653, 7.725425), (38.00817, 31.466019, 8.078887), (38.00817, 31.466019, 8.078887), (36.34527, 33.45653, 7.725425), (35.89114, 33.45653, 9.617002), (37.533268, 31.466019, 10.057009), (37.533268, 31.466019, 10.057009), (35.89114, 33.45653, 9.617002), (35.33864, 33.45653, 11.482219), (36.955486, 31.466019, 12.0075655), (36.955486, 31.466019, 12.0075655), (35.33864, 33.45653, 11.482219), (34.689274, 33.45653, 13.315965), (36.276413, 31.466019, 13.92521), (36.276413, 31.466019, 13.92521), (34.689274, 33.45653, 13.315965), (33.944828, 33.45653, 15.113212), (35.49791, 31.466019, 15.804687), (35.49791, 31.466019, 15.804687), (33.944828, 33.45653, 15.113212), (33.107346, 33.45653, 16.869034), (34.622105, 31.466019, 17.640844), (34.622105, 31.466019, 17.640844), (33.107346, 33.45653, 16.869034), (32.179115, 33.45653, 18.57862), (33.65141, 31.466019, 19.42865), (33.65141, 31.466019, 19.42865), (32.179115, 33.45653, 18.57862), (31.162685, 33.45653, 20.237284), (32.58847, 31.466019, 21.1632), (32.58847, 31.466019, 21.1632), (31.162685, 33.45653, 20.237284), (30.06084, 33.45653, 21.840479), (31.436214, 31.466019, 22.839746), (31.436214, 31.466019, 22.839746), (30.06084, 33.45653, 21.840479), (28.8766, 33.45653, 23.38381), (30.197792, 31.466019, 24.45369), (30.197792, 31.466019, 24.45369), (28.8766, 33.45653, 23.38381), (27.61321, 33.45653, 24.863047), (28.8766, 31.466019, 26.000607), (28.8766, 31.466019, 26.000607), (27.61321, 33.45653, 24.863047), (26.274137, 33.45653, 26.274137), (27.47626, 31.466019, 27.47626), (27.47626, 31.466019, 27.47626), (26.274137, 33.45653, 26.274137), (24.863047, 33.45653, 27.61321), (26.000607, 31.466019, 28.8766), (26.000607, 31.466019, 28.8766), (24.863047, 33.45653, 27.61321), (23.38381, 33.45653, 28.8766), (24.45369, 31.466019, 30.197792), (24.45369, 31.466019, 30.197792), (23.38381, 33.45653, 28.8766), (21.840479, 33.45653, 30.06084), (22.839746, 31.466019, 31.436214), (22.839746, 31.466019, 31.436214), (21.840479, 33.45653, 30.06084), (20.237284, 33.45653, 31.162685), (21.1632, 31.466019, 32.58847), (21.1632, 31.466019, 32.58847), (20.237284, 33.45653, 31.162685), (18.57862, 33.45653, 32.179115), (19.42865, 31.466019, 33.65141), (19.42865, 31.466019, 33.65141), (18.57862, 33.45653, 32.179115), (16.869034, 33.45653, 33.107346), (17.640844, 31.466019, 34.622105), (17.640844, 31.466019, 34.622105), (16.869034, 33.45653, 33.107346), (15.113212, 33.45653, 33.944828), (15.804687, 31.466019, 35.49791), (15.804687, 31.466019, 35.49791), (15.113212, 33.45653, 33.944828), (13.315965, 33.45653, 34.689274), (13.92521, 31.466019, 36.276413), (13.92521, 31.466019, 36.276413), (13.315965, 33.45653, 34.689274), (11.482219, 33.45653, 35.33864), (12.0075655, 31.466019, 36.955486), (12.0075655, 31.466019, 36.955486), (11.482219, 33.45653, 35.33864), (9.617002, 33.45653, 35.89114), (10.057009, 31.466019, 37.533268), (10.057009, 31.466019, 37.533268), (9.617002, 33.45653, 35.89114), (7.725425, 33.45653, 36.34527), (8.078887, 31.466019, 38.00817), (8.078887, 31.466019, 38.00817), (7.725425, 33.45653, 36.34527), (5.812673, 33.45653, 36.699776), (6.0786204, 31.466019, 38.3789), (6.0786204, 31.466019, 38.3789), (5.812673, 33.45653, 36.699776), (3.8839893, 33.45653, 36.95369), (4.0616937, 31.466019, 38.644432), (4.0616937, 31.466019, 38.644432), (3.8839893, 33.45653, 36.95369), (1.9446597, 33.45653, 37.10632), (2.033634, 31.466019, 38.804047), (2.033634, 31.466019, 38.804047), (1.9446597, 33.45653, 37.10632), (2.2752247e-15, 33.45653, 37.15724), (2.3793234e-15, 31.466019, 38.8573), (2.3793234e-15, 31.466019, 38.8573), (2.2752247e-15, 33.45653, 37.15724), (-1.9446597, 33.45653, 37.10632), (-2.033634, 31.466019, 38.804047), (-2.033634, 31.466019, 38.804047), (-1.9446597, 33.45653, 37.10632), (-3.8839893, 33.45653, 36.95369), (-4.0616937, 31.466019, 38.644432), (-4.0616937, 31.466019, 38.644432), (-3.8839893, 33.45653, 36.95369), (-5.812673, 33.45653, 36.699776), (-6.0786204, 31.466019, 38.3789), (-6.0786204, 31.466019, 38.3789), (-5.812673, 33.45653, 36.699776), (-7.725425, 33.45653, 36.34527), (-8.078887, 31.466019, 38.00817), (-8.078887, 31.466019, 38.00817), (-7.725425, 33.45653, 36.34527), (-9.617002, 33.45653, 35.89114), (-10.057009, 31.466019, 37.533268), (-10.057009, 31.466019, 37.533268), (-9.617002, 33.45653, 35.89114), (-11.482219, 33.45653, 35.33864), (-12.0075655, 31.466019, 36.955486), (-12.0075655, 31.466019, 36.955486), (-11.482219, 33.45653, 35.33864), (-13.315965, 33.45653, 34.689274), (-13.92521, 31.466019, 36.276413), (-13.92521, 31.466019, 36.276413), (-13.315965, 33.45653, 34.689274), (-15.113212, 33.45653, 33.944828), (-15.804687, 31.466019, 35.49791), (-15.804687, 31.466019, 35.49791), (-15.113212, 33.45653, 33.944828), (-16.869034, 33.45653, 33.107346), (-17.640844, 31.466019, 34.622105), (-17.640844, 31.466019, 34.622105), (-16.869034, 33.45653, 33.107346), (-18.57862, 33.45653, 32.179115), (-19.42865, 31.466019, 33.65141), (-19.42865, 31.466019, 33.65141), (-18.57862, 33.45653, 32.179115), (-20.237284, 33.45653, 31.162685), (-21.1632, 31.466019, 32.58847), (-21.1632, 31.466019, 32.58847), (-20.237284, 33.45653, 31.162685), (-21.840479, 33.45653, 30.06084), (-22.839746, 31.466019, 31.436214), (-22.839746, 31.466019, 31.436214), (-21.840479, 33.45653, 30.06084), (-23.38381, 33.45653, 28.8766), (-24.45369, 31.466019, 30.197792), (-24.45369, 31.466019, 30.197792), (-23.38381, 33.45653, 28.8766), (-24.863047, 33.45653, 27.61321), (-26.000607, 31.466019, 28.8766), (-26.000607, 31.466019, 28.8766), (-24.863047, 33.45653, 27.61321), (-26.274137, 33.45653, 26.274137), (-27.47626, 31.466019, 27.47626), (-27.47626, 31.466019, 27.47626), (-26.274137, 33.45653, 26.274137), (-27.61321, 33.45653, 24.863047), (-28.8766, 31.466019, 26.000607), (-28.8766, 31.466019, 26.000607), (-27.61321, 33.45653, 24.863047), (-28.8766, 33.45653, 23.38381), (-30.197792, 31.466019, 24.45369), (-30.197792, 31.466019, 24.45369), (-28.8766, 33.45653, 23.38381), (-30.06084, 33.45653, 21.840479), (-31.436214, 31.466019, 22.839746), (-31.436214, 31.466019, 22.839746), (-30.06084, 33.45653, 21.840479), (-31.162685, 33.45653, 20.237284), (-32.58847, 31.466019, 21.1632), (-32.58847, 31.466019, 21.1632), (-31.162685, 33.45653, 20.237284), (-32.179115, 33.45653, 18.57862), (-33.65141, 31.466019, 19.42865), (-33.65141, 31.466019, 19.42865), (-32.179115, 33.45653, 18.57862), (-33.107346, 33.45653, 16.869034), (-34.622105, 31.466019, 17.640844), (-34.622105, 31.466019, 17.640844), (-33.107346, 33.45653, 16.869034), (-33.944828, 33.45653, 15.113212), (-35.49791, 31.466019, 15.804687), (-35.49791, 31.466019, 15.804687), (-33.944828, 33.45653, 15.113212), (-34.689274, 33.45653, 13.315965), (-36.276413, 31.466019, 13.92521), (-36.276413, 31.466019, 13.92521), (-34.689274, 33.45653, 13.315965), (-35.33864, 33.45653, 11.482219), (-36.955486, 31.466019, 12.0075655), (-36.955486, 31.466019, 12.0075655), (-35.33864, 33.45653, 11.482219), (-35.89114, 33.45653, 9.617002), (-37.533268, 31.466019, 10.057009), (-37.533268, 31.466019, 10.057009), (-35.89114, 33.45653, 9.617002), (-36.34527, 33.45653, 7.725425), (-38.00817, 31.466019, 8.078887), (-38.00817, 31.466019, 8.078887), (-36.34527, 33.45653, 7.725425), (-36.699776, 33.45653, 5.812673), (-38.3789, 31.466019, 6.0786204), (-38.3789, 31.466019, 6.0786204), (-36.699776, 33.45653, 5.812673), (-36.95369, 33.45653, 3.8839893), (-38.644432, 31.466019, 4.0616937), (-38.644432, 31.466019, 4.0616937), (-36.95369, 33.45653, 3.8839893), (-37.10632, 33.45653, 1.9446597), (-38.804047, 31.466019, 2.033634), (-38.804047, 31.466019, 2.033634), (-37.10632, 33.45653, 1.9446597), (-37.15724, 33.45653, 4.5504495e-15), (-38.8573, 31.466019, 4.7586468e-15), (-38.8573, 31.466019, 4.7586468e-15), (-37.15724, 33.45653, 4.5504495e-15), (-37.10632, 33.45653, -1.9446597), (-38.804047, 31.466019, -2.033634), (-38.804047, 31.466019, -2.033634), (-37.10632, 33.45653, -1.9446597), (-36.95369, 33.45653, -3.8839893), (-38.644432, 31.466019, -4.0616937), (-38.644432, 31.466019, -4.0616937), (-36.95369, 33.45653, -3.8839893), (-36.699776, 33.45653, -5.812673), (-38.3789, 31.466019, -6.0786204), (-38.3789, 31.466019, -6.0786204), (-36.699776, 33.45653, -5.812673), (-36.34527, 33.45653, -7.725425), (-38.00817, 31.466019, -8.078887), (-38.00817, 31.466019, -8.078887), (-36.34527, 33.45653, -7.725425), (-35.89114, 33.45653, -9.617002), (-37.533268, 31.466019, -10.057009), (-37.533268, 31.466019, -10.057009), (-35.89114, 33.45653, -9.617002), (-35.33864, 33.45653, -11.482219), (-36.955486, 31.466019, -12.0075655), (-36.955486, 31.466019, -12.0075655), (-35.33864, 33.45653, -11.482219), (-34.689274, 33.45653, -13.315965), (-36.276413, 31.466019, -13.92521), (-36.276413, 31.466019, -13.92521), (-34.689274, 33.45653, -13.315965), (-33.944828, 33.45653, -15.113212), (-35.49791, 31.466019, -15.804687), (-35.49791, 31.466019, -15.804687), (-33.944828, 33.45653, -15.113212), (-33.107346, 33.45653, -16.869034), (-34.622105, 31.466019, -17.640844), (-34.622105, 31.466019, -17.640844), (-33.107346, 33.45653, -16.869034), (-32.179115, 33.45653, -18.57862), (-33.65141, 31.466019, -19.42865), (-33.65141, 31.466019, -19.42865), (-32.179115, 33.45653, -18.57862), (-31.162685, 33.45653, -20.237284), (-32.58847, 31.466019, -21.1632), (-32.58847, 31.466019, -21.1632), (-31.162685, 33.45653, -20.237284), (-30.06084, 33.45653, -21.840479), (-31.436214, 31.466019, -22.839746), (-31.436214, 31.466019, -22.839746), (-30.06084, 33.45653, -21.840479), (-28.8766, 33.45653, -23.38381), (-30.197792, 31.466019, -24.45369), (-30.197792, 31.466019, -24.45369), (-28.8766, 33.45653, -23.38381), (-27.61321, 33.45653, -24.863047), (-28.8766, 31.466019, -26.000607), (-28.8766, 31.466019, -26.000607), (-27.61321, 33.45653, -24.863047), (-26.274137, 33.45653, -26.274137), (-27.47626, 31.466019, -27.47626), (-27.47626, 31.466019, -27.47626), (-26.274137, 33.45653, -26.274137), (-24.863047, 33.45653, -27.61321), (-26.000607, 31.466019, -28.8766), (-26.000607, 31.466019, -28.8766), (-24.863047, 33.45653, -27.61321), (-23.38381, 33.45653, -28.8766), (-24.45369, 31.466019, -30.197792), (-24.45369, 31.466019, -30.197792), (-23.38381, 33.45653, -28.8766), (-21.840479, 33.45653, -30.06084), (-22.839746, 31.466019, -31.436214), (-22.839746, 31.466019, -31.436214), (-21.840479, 33.45653, -30.06084), (-20.237284, 33.45653, -31.162685), (-21.1632, 31.466019, -32.58847), (-21.1632, 31.466019, -32.58847), (-20.237284, 33.45653, -31.162685), (-18.57862, 33.45653, -32.179115), (-19.42865, 31.466019, -33.65141), (-19.42865, 31.466019, -33.65141), (-18.57862, 33.45653, -32.179115), (-16.869034, 33.45653, -33.107346), (-17.640844, 31.466019, -34.622105), (-17.640844, 31.466019, -34.622105), (-16.869034, 33.45653, -33.107346), (-15.113212, 33.45653, -33.944828), (-15.804687, 31.466019, -35.49791), (-15.804687, 31.466019, -35.49791), (-15.113212, 33.45653, -33.944828), (-13.315965, 33.45653, -34.689274), (-13.92521, 31.466019, -36.276413), (-13.92521, 31.466019, -36.276413), (-13.315965, 33.45653, -34.689274), (-11.482219, 33.45653, -35.33864), (-12.0075655, 31.466019, -36.955486), (-12.0075655, 31.466019, -36.955486), (-11.482219, 33.45653, -35.33864), (-9.617002, 33.45653, -35.89114), (-10.057009, 31.466019, -37.533268), (-10.057009, 31.466019, -37.533268), (-9.617002, 33.45653, -35.89114), (-7.725425, 33.45653, -36.34527), (-8.078887, 31.466019, -38.00817), (-8.078887, 31.466019, -38.00817), (-7.725425, 33.45653, -36.34527), (-5.812673, 33.45653, -36.699776), (-6.0786204, 31.466019, -38.3789), (-6.0786204, 31.466019, -38.3789), (-5.812673, 33.45653, -36.699776), (-3.8839893, 33.45653, -36.95369), (-4.0616937, 31.466019, -38.644432), (-4.0616937, 31.466019, -38.644432), (-3.8839893, 33.45653, -36.95369), (-1.9446597, 33.45653, -37.10632), (-2.033634, 31.466019, -38.804047), (-2.033634, 31.466019, -38.804047), (-1.9446597, 33.45653, -37.10632), (-6.8256744e-15, 33.45653, -37.15724), (-7.1379695e-15, 31.466019, -38.8573), (-7.1379695e-15, 31.466019, -38.8573), (-6.8256744e-15, 33.45653, -37.15724), (1.9446597, 33.45653, -37.10632), (2.033634, 31.466019, -38.804047), (2.033634, 31.466019, -38.804047), (1.9446597, 33.45653, -37.10632), (3.8839893, 33.45653, -36.95369), (4.0616937, 31.466019, -38.644432), (4.0616937, 31.466019, -38.644432), (3.8839893, 33.45653, -36.95369), (5.812673, 33.45653, -36.699776), (6.0786204, 31.466019, -38.3789), (6.0786204, 31.466019, -38.3789), (5.812673, 33.45653, -36.699776), (7.725425, 33.45653, -36.34527), (8.078887, 31.466019, -38.00817), (8.078887, 31.466019, -38.00817), (7.725425, 33.45653, -36.34527), (9.617002, 33.45653, -35.89114), (10.057009, 31.466019, -37.533268), (10.057009, 31.466019, -37.533268), (9.617002, 33.45653, -35.89114), (11.482219, 33.45653, -35.33864), (12.0075655, 31.466019, -36.955486), (12.0075655, 31.466019, -36.955486), (11.482219, 33.45653, -35.33864), (13.315965, 33.45653, -34.689274), (13.92521, 31.466019, -36.276413), (13.92521, 31.466019, -36.276413), (13.315965, 33.45653, -34.689274), (15.113212, 33.45653, -33.944828), (15.804687, 31.466019, -35.49791), (15.804687, 31.466019, -35.49791), (15.113212, 33.45653, -33.944828), (16.869034, 33.45653, -33.107346), (17.640844, 31.466019, -34.622105), (17.640844, 31.466019, -34.622105), (16.869034, 33.45653, -33.107346), (18.57862, 33.45653, -32.179115), (19.42865, 31.466019, -33.65141), (19.42865, 31.466019, -33.65141), (18.57862, 33.45653, -32.179115), (20.237284, 33.45653, -31.162685), (21.1632, 31.466019, -32.58847), (21.1632, 31.466019, -32.58847), (20.237284, 33.45653, -31.162685), (21.840479, 33.45653, -30.06084), (22.839746, 31.466019, -31.436214), (22.839746, 31.466019, -31.436214), (21.840479, 33.45653, -30.06084), (23.38381, 33.45653, -28.8766), (24.45369, 31.466019, -30.197792), (24.45369, 31.466019, -30.197792), (23.38381, 33.45653, -28.8766), (24.863047, 33.45653, -27.61321), (26.000607, 31.466019, -28.8766), (26.000607, 31.466019, -28.8766), (24.863047, 33.45653, -27.61321), (26.274137, 33.45653, -26.274137), (27.47626, 31.466019, -27.47626), (27.47626, 31.466019, -27.47626), (26.274137, 33.45653, -26.274137), (27.61321, 33.45653, -24.863047), (28.8766, 31.466019, -26.000607), (28.8766, 31.466019, -26.000607), (27.61321, 33.45653, -24.863047), (28.8766, 33.45653, -23.38381), (30.197792, 31.466019, -24.45369), (30.197792, 31.466019, -24.45369), (28.8766, 33.45653, -23.38381), (30.06084, 33.45653, -21.840479), (31.436214, 31.466019, -22.839746), (31.436214, 31.466019, -22.839746), (30.06084, 33.45653, -21.840479), (31.162685, 33.45653, -20.237284), (32.58847, 31.466019, -21.1632), (32.58847, 31.466019, -21.1632), (31.162685, 33.45653, -20.237284), (32.179115, 33.45653, -18.57862), (33.65141, 31.466019, -19.42865), (33.65141, 31.466019, -19.42865), (32.179115, 33.45653, -18.57862), (33.107346, 33.45653, -16.869034), (34.622105, 31.466019, -17.640844), (34.622105, 31.466019, -17.640844), (33.107346, 33.45653, -16.869034), (33.944828, 33.45653, -15.113212), (35.49791, 31.466019, -15.804687), (35.49791, 31.466019, -15.804687), (33.944828, 33.45653, -15.113212), (34.689274, 33.45653, -13.315965), (36.276413, 31.466019, -13.92521), (36.276413, 31.466019, -13.92521), (34.689274, 33.45653, -13.315965), (35.33864, 33.45653, -11.482219), (36.955486, 31.466019, -12.0075655), (36.955486, 31.466019, -12.0075655), (35.33864, 33.45653, -11.482219), (35.89114, 33.45653, -9.617002), (37.533268, 31.466019, -10.057009), (37.533268, 31.466019, -10.057009), (35.89114, 33.45653, -9.617002), (36.34527, 33.45653, -7.725425), (38.00817, 31.466019, -8.078887), (38.00817, 31.466019, -8.078887), (36.34527, 33.45653, -7.725425), (36.699776, 33.45653, -5.812673), (38.3789, 31.466019, -6.0786204), (38.3789, 31.466019, -6.0786204), (36.699776, 33.45653, -5.812673), (36.95369, 33.45653, -3.8839893), (38.644432, 31.466019, -4.0616937), (38.644432, 31.466019, -4.0616937), (36.95369, 33.45653, -3.8839893), (37.10632, 33.45653, -1.9446597), (38.804047, 31.466019, -2.033634), (38.804047, 31.466019, -2.033634), (37.10632, 33.45653, -1.9446597), (37.15724, 33.45653, 0), (38.8573, 31.466019, 0), (37.15724, 33.45653, 0), (35.35534, 35.35534, 0), (35.306885, 35.35534, 1.8503555), (37.10632, 33.45653, 1.9446597), (37.10632, 33.45653, 1.9446597), (35.306885, 35.35534, 1.8503555), (35.16166, 35.35534, 3.6956394), (36.95369, 33.45653, 3.8839893), (36.95369, 33.45653, 3.8839893), (35.16166, 35.35534, 3.6956394), (34.920055, 35.35534, 5.5307937), (36.699776, 33.45653, 5.812673), (36.699776, 33.45653, 5.812673), (34.920055, 35.35534, 5.5307937), (34.58274, 35.35534, 7.350788), (36.34527, 33.45653, 7.725425), (36.34527, 33.45653, 7.725425), (34.58274, 35.35534, 7.350788), (34.150635, 35.35534, 9.150635), (35.89114, 33.45653, 9.617002), (35.89114, 33.45653, 9.617002), (34.150635, 35.35534, 9.150635), (33.624924, 35.35534, 10.925401), (35.33864, 33.45653, 11.482219), (35.33864, 33.45653, 11.482219), (33.624924, 35.35534, 10.925401), (33.007053, 35.35534, 12.67022), (34.689274, 33.45653, 13.315965), (34.689274, 33.45653, 13.315965), (33.007053, 35.35534, 12.67022), (32.29871, 35.35534, 14.380312), (33.944828, 33.45653, 15.113212), (33.944828, 33.45653, 15.113212), (32.29871, 35.35534, 14.380312), (31.501839, 35.35534, 16.050987), (33.107346, 33.45653, 16.869034), (33.107346, 33.45653, 16.869034), (31.501839, 35.35534, 16.050987), (30.618622, 35.35534, 17.67767), (32.179115, 33.45653, 18.57862), (32.179115, 33.45653, 18.57862), (30.618622, 35.35534, 17.67767), (29.651482, 35.35534, 19.255898), (31.162685, 33.45653, 20.237284), (31.162685, 33.45653, 20.237284), (29.651482, 35.35534, 19.255898), (28.60307, 35.35534, 20.781347), (30.06084, 33.45653, 21.840479), (30.06084, 33.45653, 21.840479), (28.60307, 35.35534, 20.781347), (27.47626, 35.35534, 22.249836), (28.8766, 33.45653, 23.38381), (28.8766, 33.45653, 23.38381), (27.47626, 35.35534, 22.249836), (26.274137, 35.35534, 23.65734), (27.61321, 33.45653, 24.863047), (27.61321, 33.45653, 24.863047), (26.274137, 35.35534, 23.65734), (25, 35.35534, 25), (26.274137, 33.45653, 26.274137), (26.274137, 33.45653, 26.274137), (25, 35.35534, 25), (23.65734, 35.35534, 26.274137), (24.863047, 33.45653, 27.61321), (24.863047, 33.45653, 27.61321), (23.65734, 35.35534, 26.274137), (22.249836, 35.35534, 27.47626), (23.38381, 33.45653, 28.8766), (23.38381, 33.45653, 28.8766), (22.249836, 35.35534, 27.47626), (20.781347, 35.35534, 28.60307), (21.840479, 33.45653, 30.06084), (21.840479, 33.45653, 30.06084), (20.781347, 35.35534, 28.60307), (19.255898, 35.35534, 29.651482), (20.237284, 33.45653, 31.162685), (20.237284, 33.45653, 31.162685), (19.255898, 35.35534, 29.651482), (17.67767, 35.35534, 30.618622), (18.57862, 33.45653, 32.179115), (18.57862, 33.45653, 32.179115), (17.67767, 35.35534, 30.618622), (16.050987, 35.35534, 31.501839), (16.869034, 33.45653, 33.107346), (16.869034, 33.45653, 33.107346), (16.050987, 35.35534, 31.501839), (14.380312, 35.35534, 32.29871), (15.113212, 33.45653, 33.944828), (15.113212, 33.45653, 33.944828), (14.380312, 35.35534, 32.29871), (12.67022, 35.35534, 33.007053), (13.315965, 33.45653, 34.689274), (13.315965, 33.45653, 34.689274), (12.67022, 35.35534, 33.007053), (10.925401, 35.35534, 33.624924), (11.482219, 33.45653, 35.33864), (11.482219, 33.45653, 35.33864), (10.925401, 35.35534, 33.624924), (9.150635, 35.35534, 34.150635), (9.617002, 33.45653, 35.89114), (9.617002, 33.45653, 35.89114), (9.150635, 35.35534, 34.150635), (7.350788, 35.35534, 34.58274), (7.725425, 33.45653, 36.34527), (7.725425, 33.45653, 36.34527), (7.350788, 35.35534, 34.58274), (5.5307937, 35.35534, 34.920055), (5.812673, 33.45653, 36.699776), (5.812673, 33.45653, 36.699776), (5.5307937, 35.35534, 34.920055), (3.6956394, 35.35534, 35.16166), (3.8839893, 33.45653, 36.95369), (3.8839893, 33.45653, 36.95369), (3.6956394, 35.35534, 35.16166), (1.8503555, 35.35534, 35.306885), (1.9446597, 33.45653, 37.10632), (1.9446597, 33.45653, 37.10632), (1.8503555, 35.35534, 35.306885), (2.1648902e-15, 35.35534, 35.35534), (2.2752247e-15, 33.45653, 37.15724), (2.2752247e-15, 33.45653, 37.15724), (2.1648902e-15, 35.35534, 35.35534), (-1.8503555, 35.35534, 35.306885), (-1.9446597, 33.45653, 37.10632), (-1.9446597, 33.45653, 37.10632), (-1.8503555, 35.35534, 35.306885), (-3.6956394, 35.35534, 35.16166), (-3.8839893, 33.45653, 36.95369), (-3.8839893, 33.45653, 36.95369), (-3.6956394, 35.35534, 35.16166), (-5.5307937, 35.35534, 34.920055), (-5.812673, 33.45653, 36.699776), (-5.812673, 33.45653, 36.699776), (-5.5307937, 35.35534, 34.920055), (-7.350788, 35.35534, 34.58274), (-7.725425, 33.45653, 36.34527), (-7.725425, 33.45653, 36.34527), (-7.350788, 35.35534, 34.58274), (-9.150635, 35.35534, 34.150635), (-9.617002, 33.45653, 35.89114), (-9.617002, 33.45653, 35.89114), (-9.150635, 35.35534, 34.150635), (-10.925401, 35.35534, 33.624924), (-11.482219, 33.45653, 35.33864), (-11.482219, 33.45653, 35.33864), (-10.925401, 35.35534, 33.624924), (-12.67022, 35.35534, 33.007053), (-13.315965, 33.45653, 34.689274), (-13.315965, 33.45653, 34.689274), (-12.67022, 35.35534, 33.007053), (-14.380312, 35.35534, 32.29871), (-15.113212, 33.45653, 33.944828), (-15.113212, 33.45653, 33.944828), (-14.380312, 35.35534, 32.29871), (-16.050987, 35.35534, 31.501839), (-16.869034, 33.45653, 33.107346), (-16.869034, 33.45653, 33.107346), (-16.050987, 35.35534, 31.501839), (-17.67767, 35.35534, 30.618622), (-18.57862, 33.45653, 32.179115), (-18.57862, 33.45653, 32.179115), (-17.67767, 35.35534, 30.618622), (-19.255898, 35.35534, 29.651482), (-20.237284, 33.45653, 31.162685), (-20.237284, 33.45653, 31.162685), (-19.255898, 35.35534, 29.651482), (-20.781347, 35.35534, 28.60307), (-21.840479, 33.45653, 30.06084), (-21.840479, 33.45653, 30.06084), (-20.781347, 35.35534, 28.60307), (-22.249836, 35.35534, 27.47626), (-23.38381, 33.45653, 28.8766), (-23.38381, 33.45653, 28.8766), (-22.249836, 35.35534, 27.47626), (-23.65734, 35.35534, 26.274137), (-24.863047, 33.45653, 27.61321), (-24.863047, 33.45653, 27.61321), (-23.65734, 35.35534, 26.274137), (-25, 35.35534, 25), (-26.274137, 33.45653, 26.274137), (-26.274137, 33.45653, 26.274137), (-25, 35.35534, 25), (-26.274137, 35.35534, 23.65734), (-27.61321, 33.45653, 24.863047), (-27.61321, 33.45653, 24.863047), (-26.274137, 35.35534, 23.65734), (-27.47626, 35.35534, 22.249836), (-28.8766, 33.45653, 23.38381), (-28.8766, 33.45653, 23.38381), (-27.47626, 35.35534, 22.249836), (-28.60307, 35.35534, 20.781347), (-30.06084, 33.45653, 21.840479), (-30.06084, 33.45653, 21.840479), (-28.60307, 35.35534, 20.781347), (-29.651482, 35.35534, 19.255898), (-31.162685, 33.45653, 20.237284), (-31.162685, 33.45653, 20.237284), (-29.651482, 35.35534, 19.255898), (-30.618622, 35.35534, 17.67767), (-32.179115, 33.45653, 18.57862), (-32.179115, 33.45653, 18.57862), (-30.618622, 35.35534, 17.67767), (-31.501839, 35.35534, 16.050987), (-33.107346, 33.45653, 16.869034), (-33.107346, 33.45653, 16.869034), (-31.501839, 35.35534, 16.050987), (-32.29871, 35.35534, 14.380312), (-33.944828, 33.45653, 15.113212), (-33.944828, 33.45653, 15.113212), (-32.29871, 35.35534, 14.380312), (-33.007053, 35.35534, 12.67022), (-34.689274, 33.45653, 13.315965), (-34.689274, 33.45653, 13.315965), (-33.007053, 35.35534, 12.67022), (-33.624924, 35.35534, 10.925401), (-35.33864, 33.45653, 11.482219), (-35.33864, 33.45653, 11.482219), (-33.624924, 35.35534, 10.925401), (-34.150635, 35.35534, 9.150635), (-35.89114, 33.45653, 9.617002), (-35.89114, 33.45653, 9.617002), (-34.150635, 35.35534, 9.150635), (-34.58274, 35.35534, 7.350788), (-36.34527, 33.45653, 7.725425), (-36.34527, 33.45653, 7.725425), (-34.58274, 35.35534, 7.350788), (-34.920055, 35.35534, 5.5307937), (-36.699776, 33.45653, 5.812673), (-36.699776, 33.45653, 5.812673), (-34.920055, 35.35534, 5.5307937), (-35.16166, 35.35534, 3.6956394), (-36.95369, 33.45653, 3.8839893), (-36.95369, 33.45653, 3.8839893), (-35.16166, 35.35534, 3.6956394), (-35.306885, 35.35534, 1.8503555), (-37.10632, 33.45653, 1.9446597), (-37.10632, 33.45653, 1.9446597), (-35.306885, 35.35534, 1.8503555), (-35.35534, 35.35534, 4.3297804e-15), (-37.15724, 33.45653, 4.5504495e-15), (-37.15724, 33.45653, 4.5504495e-15), (-35.35534, 35.35534, 4.3297804e-15), (-35.306885, 35.35534, -1.8503555), (-37.10632, 33.45653, -1.9446597), (-37.10632, 33.45653, -1.9446597), (-35.306885, 35.35534, -1.8503555), (-35.16166, 35.35534, -3.6956394), (-36.95369, 33.45653, -3.8839893), (-36.95369, 33.45653, -3.8839893), (-35.16166, 35.35534, -3.6956394), (-34.920055, 35.35534, -5.5307937), (-36.699776, 33.45653, -5.812673), (-36.699776, 33.45653, -5.812673), (-34.920055, 35.35534, -5.5307937), (-34.58274, 35.35534, -7.350788), (-36.34527, 33.45653, -7.725425), (-36.34527, 33.45653, -7.725425), (-34.58274, 35.35534, -7.350788), (-34.150635, 35.35534, -9.150635), (-35.89114, 33.45653, -9.617002), (-35.89114, 33.45653, -9.617002), (-34.150635, 35.35534, -9.150635), (-33.624924, 35.35534, -10.925401), (-35.33864, 33.45653, -11.482219), (-35.33864, 33.45653, -11.482219), (-33.624924, 35.35534, -10.925401), (-33.007053, 35.35534, -12.67022), (-34.689274, 33.45653, -13.315965), (-34.689274, 33.45653, -13.315965), (-33.007053, 35.35534, -12.67022), (-32.29871, 35.35534, -14.380312), (-33.944828, 33.45653, -15.113212), (-33.944828, 33.45653, -15.113212), (-32.29871, 35.35534, -14.380312), (-31.501839, 35.35534, -16.050987), (-33.107346, 33.45653, -16.869034), (-33.107346, 33.45653, -16.869034), (-31.501839, 35.35534, -16.050987), (-30.618622, 35.35534, -17.67767), (-32.179115, 33.45653, -18.57862), (-32.179115, 33.45653, -18.57862), (-30.618622, 35.35534, -17.67767), (-29.651482, 35.35534, -19.255898), (-31.162685, 33.45653, -20.237284), (-31.162685, 33.45653, -20.237284), (-29.651482, 35.35534, -19.255898), (-28.60307, 35.35534, -20.781347), (-30.06084, 33.45653, -21.840479), (-30.06084, 33.45653, -21.840479), (-28.60307, 35.35534, -20.781347), (-27.47626, 35.35534, -22.249836), (-28.8766, 33.45653, -23.38381), (-28.8766, 33.45653, -23.38381), (-27.47626, 35.35534, -22.249836), (-26.274137, 35.35534, -23.65734), (-27.61321, 33.45653, -24.863047), (-27.61321, 33.45653, -24.863047), (-26.274137, 35.35534, -23.65734), (-25, 35.35534, -25), (-26.274137, 33.45653, -26.274137), (-26.274137, 33.45653, -26.274137), (-25, 35.35534, -25), (-23.65734, 35.35534, -26.274137), (-24.863047, 33.45653, -27.61321), (-24.863047, 33.45653, -27.61321), (-23.65734, 35.35534, -26.274137), (-22.249836, 35.35534, -27.47626), (-23.38381, 33.45653, -28.8766), (-23.38381, 33.45653, -28.8766), (-22.249836, 35.35534, -27.47626), (-20.781347, 35.35534, -28.60307), (-21.840479, 33.45653, -30.06084), (-21.840479, 33.45653, -30.06084), (-20.781347, 35.35534, -28.60307), (-19.255898, 35.35534, -29.651482), (-20.237284, 33.45653, -31.162685), (-20.237284, 33.45653, -31.162685), (-19.255898, 35.35534, -29.651482), (-17.67767, 35.35534, -30.618622), (-18.57862, 33.45653, -32.179115), (-18.57862, 33.45653, -32.179115), (-17.67767, 35.35534, -30.618622), (-16.050987, 35.35534, -31.501839), (-16.869034, 33.45653, -33.107346), (-16.869034, 33.45653, -33.107346), (-16.050987, 35.35534, -31.501839), (-14.380312, 35.35534, -32.29871), (-15.113212, 33.45653, -33.944828), (-15.113212, 33.45653, -33.944828), (-14.380312, 35.35534, -32.29871), (-12.67022, 35.35534, -33.007053), (-13.315965, 33.45653, -34.689274), (-13.315965, 33.45653, -34.689274), (-12.67022, 35.35534, -33.007053), (-10.925401, 35.35534, -33.624924), (-11.482219, 33.45653, -35.33864), (-11.482219, 33.45653, -35.33864), (-10.925401, 35.35534, -33.624924), (-9.150635, 35.35534, -34.150635), (-9.617002, 33.45653, -35.89114), (-9.617002, 33.45653, -35.89114), (-9.150635, 35.35534, -34.150635), (-7.350788, 35.35534, -34.58274), (-7.725425, 33.45653, -36.34527), (-7.725425, 33.45653, -36.34527), (-7.350788, 35.35534, -34.58274), (-5.5307937, 35.35534, -34.920055), (-5.812673, 33.45653, -36.699776), (-5.812673, 33.45653, -36.699776), (-5.5307937, 35.35534, -34.920055), (-3.6956394, 35.35534, -35.16166), (-3.8839893, 33.45653, -36.95369), (-3.8839893, 33.45653, -36.95369), (-3.6956394, 35.35534, -35.16166), (-1.8503555, 35.35534, -35.306885), (-1.9446597, 33.45653, -37.10632), (-1.9446597, 33.45653, -37.10632), (-1.8503555, 35.35534, -35.306885), (-6.4946704e-15, 35.35534, -35.35534), (-6.8256744e-15, 33.45653, -37.15724), (-6.8256744e-15, 33.45653, -37.15724), (-6.4946704e-15, 35.35534, -35.35534), (1.8503555, 35.35534, -35.306885), (1.9446597, 33.45653, -37.10632), (1.9446597, 33.45653, -37.10632), (1.8503555, 35.35534, -35.306885), (3.6956394, 35.35534, -35.16166), (3.8839893, 33.45653, -36.95369), (3.8839893, 33.45653, -36.95369), (3.6956394, 35.35534, -35.16166), (5.5307937, 35.35534, -34.920055), (5.812673, 33.45653, -36.699776), (5.812673, 33.45653, -36.699776), (5.5307937, 35.35534, -34.920055), (7.350788, 35.35534, -34.58274), (7.725425, 33.45653, -36.34527), (7.725425, 33.45653, -36.34527), (7.350788, 35.35534, -34.58274), (9.150635, 35.35534, -34.150635), (9.617002, 33.45653, -35.89114), (9.617002, 33.45653, -35.89114), (9.150635, 35.35534, -34.150635), (10.925401, 35.35534, -33.624924), (11.482219, 33.45653, -35.33864), (11.482219, 33.45653, -35.33864), (10.925401, 35.35534, -33.624924), (12.67022, 35.35534, -33.007053), (13.315965, 33.45653, -34.689274), (13.315965, 33.45653, -34.689274), (12.67022, 35.35534, -33.007053), (14.380312, 35.35534, -32.29871), (15.113212, 33.45653, -33.944828), (15.113212, 33.45653, -33.944828), (14.380312, 35.35534, -32.29871), (16.050987, 35.35534, -31.501839), (16.869034, 33.45653, -33.107346), (16.869034, 33.45653, -33.107346), (16.050987, 35.35534, -31.501839), (17.67767, 35.35534, -30.618622), (18.57862, 33.45653, -32.179115), (18.57862, 33.45653, -32.179115), (17.67767, 35.35534, -30.618622), (19.255898, 35.35534, -29.651482), (20.237284, 33.45653, -31.162685), (20.237284, 33.45653, -31.162685), (19.255898, 35.35534, -29.651482), (20.781347, 35.35534, -28.60307), (21.840479, 33.45653, -30.06084), (21.840479, 33.45653, -30.06084), (20.781347, 35.35534, -28.60307), (22.249836, 35.35534, -27.47626), (23.38381, 33.45653, -28.8766), (23.38381, 33.45653, -28.8766), (22.249836, 35.35534, -27.47626), (23.65734, 35.35534, -26.274137), (24.863047, 33.45653, -27.61321), (24.863047, 33.45653, -27.61321), (23.65734, 35.35534, -26.274137), (25, 35.35534, -25), (26.274137, 33.45653, -26.274137), (26.274137, 33.45653, -26.274137), (25, 35.35534, -25), (26.274137, 35.35534, -23.65734), (27.61321, 33.45653, -24.863047), (27.61321, 33.45653, -24.863047), (26.274137, 35.35534, -23.65734), (27.47626, 35.35534, -22.249836), (28.8766, 33.45653, -23.38381), (28.8766, 33.45653, -23.38381), (27.47626, 35.35534, -22.249836), (28.60307, 35.35534, -20.781347), (30.06084, 33.45653, -21.840479), (30.06084, 33.45653, -21.840479), (28.60307, 35.35534, -20.781347), (29.651482, 35.35534, -19.255898), (31.162685, 33.45653, -20.237284), (31.162685, 33.45653, -20.237284), (29.651482, 35.35534, -19.255898), (30.618622, 35.35534, -17.67767), (32.179115, 33.45653, -18.57862), (32.179115, 33.45653, -18.57862), (30.618622, 35.35534, -17.67767), (31.501839, 35.35534, -16.050987), (33.107346, 33.45653, -16.869034), (33.107346, 33.45653, -16.869034), (31.501839, 35.35534, -16.050987), (32.29871, 35.35534, -14.380312), (33.944828, 33.45653, -15.113212), (33.944828, 33.45653, -15.113212), (32.29871, 35.35534, -14.380312), (33.007053, 35.35534, -12.67022), (34.689274, 33.45653, -13.315965), (34.689274, 33.45653, -13.315965), (33.007053, 35.35534, -12.67022), (33.624924, 35.35534, -10.925401), (35.33864, 33.45653, -11.482219), (35.33864, 33.45653, -11.482219), (33.624924, 35.35534, -10.925401), (34.150635, 35.35534, -9.150635), (35.89114, 33.45653, -9.617002), (35.89114, 33.45653, -9.617002), (34.150635, 35.35534, -9.150635), (34.58274, 35.35534, -7.350788), (36.34527, 33.45653, -7.725425), (36.34527, 33.45653, -7.725425), (34.58274, 35.35534, -7.350788), (34.920055, 35.35534, -5.5307937), (36.699776, 33.45653, -5.812673), (36.699776, 33.45653, -5.812673), (34.920055, 35.35534, -5.5307937), (35.16166, 35.35534, -3.6956394), (36.95369, 33.45653, -3.8839893), (36.95369, 33.45653, -3.8839893), (35.16166, 35.35534, -3.6956394), (35.306885, 35.35534, -1.8503555), (37.10632, 33.45653, -1.9446597), (37.10632, 33.45653, -1.9446597), (35.306885, 35.35534, -1.8503555), (35.35534, 35.35534, 0), (37.15724, 33.45653, 0), (35.35534, 35.35534, 0), (33.45653, 37.15724, 0), (33.41068, 37.15724, 1.7509795), (35.306885, 35.35534, 1.8503555), (35.306885, 35.35534, 1.8503555), (33.41068, 37.15724, 1.7509795), (33.27325, 37.15724, 3.4971597), (35.16166, 35.35534, 3.6956394), (35.16166, 35.35534, 3.6956394), (33.27325, 37.15724, 3.4971597), (33.044624, 37.15724, 5.2337546), (34.920055, 35.35534, 5.5307937), (34.920055, 35.35534, 5.5307937), (33.044624, 37.15724, 5.2337546), (32.725426, 37.15724, 6.9560037), (34.58274, 35.35534, 7.350788), (34.58274, 35.35534, 7.350788), (32.725426, 37.15724, 6.9560037), (32.31653, 37.15724, 8.659187), (34.150635, 35.35534, 9.150635), (34.150635, 35.35534, 9.150635), (32.31653, 37.15724, 8.659187), (31.819052, 37.15724, 10.338636), (33.624924, 35.35534, 10.925401), (33.624924, 35.35534, 10.925401), (31.819052, 37.15724, 10.338636), (31.234362, 37.15724, 11.989748), (33.007053, 35.35534, 12.67022), (33.007053, 35.35534, 12.67022), (31.234362, 37.15724, 11.989748), (30.564062, 37.15724, 13.607997), (32.29871, 35.35534, 14.380312), (32.29871, 35.35534, 14.380312), (30.564062, 37.15724, 13.607997), (29.809986, 37.15724, 15.188947), (31.501839, 35.35534, 16.050987), (31.501839, 35.35534, 16.050987), (29.809986, 37.15724, 15.188947), (28.974205, 37.15724, 16.728266), (30.618622, 35.35534, 17.67767), (30.618622, 35.35534, 17.67767), (28.974205, 37.15724, 16.728266), (28.059008, 37.15724, 18.221733), (29.651482, 35.35534, 19.255898), (29.651482, 35.35534, 19.255898), (28.059008, 37.15724, 18.221733), (27.066902, 37.15724, 19.665255), (28.60307, 35.35534, 20.781347), (28.60307, 35.35534, 20.781347), (27.066902, 37.15724, 19.665255), (26.000607, 37.15724, 21.054876), (27.47626, 35.35534, 22.249836), (27.47626, 35.35534, 22.249836), (26.000607, 37.15724, 21.054876), (24.863047, 37.15724, 22.38679), (26.274137, 35.35534, 23.65734), (26.274137, 35.35534, 23.65734), (24.863047, 37.15724, 22.38679), (23.65734, 37.15724, 23.65734), (25, 35.35534, 25), (25, 35.35534, 25), (23.65734, 37.15724, 23.65734), (22.38679, 37.15724, 24.863047), (23.65734, 35.35534, 26.274137), (23.65734, 35.35534, 26.274137), (22.38679, 37.15724, 24.863047), (21.054876, 37.15724, 26.000607), (22.249836, 35.35534, 27.47626), (22.249836, 35.35534, 27.47626), (21.054876, 37.15724, 26.000607), (19.665255, 37.15724, 27.066902), (20.781347, 35.35534, 28.60307), (20.781347, 35.35534, 28.60307), (19.665255, 37.15724, 27.066902), (18.221733, 37.15724, 28.059008), (19.255898, 35.35534, 29.651482), (19.255898, 35.35534, 29.651482), (18.221733, 37.15724, 28.059008), (16.728266, 37.15724, 28.974205), (17.67767, 35.35534, 30.618622), (17.67767, 35.35534, 30.618622), (16.728266, 37.15724, 28.974205), (15.188947, 37.15724, 29.809986), (16.050987, 35.35534, 31.501839), (16.050987, 35.35534, 31.501839), (15.188947, 37.15724, 29.809986), (13.607997, 37.15724, 30.564062), (14.380312, 35.35534, 32.29871), (14.380312, 35.35534, 32.29871), (13.607997, 37.15724, 30.564062), (11.989748, 37.15724, 31.234362), (12.67022, 35.35534, 33.007053), (12.67022, 35.35534, 33.007053), (11.989748, 37.15724, 31.234362), (10.338636, 37.15724, 31.819052), (10.925401, 35.35534, 33.624924), (10.925401, 35.35534, 33.624924), (10.338636, 37.15724, 31.819052), (8.659187, 37.15724, 32.31653), (9.150635, 35.35534, 34.150635), (9.150635, 35.35534, 34.150635), (8.659187, 37.15724, 32.31653), (6.9560037, 37.15724, 32.725426), (7.350788, 35.35534, 34.58274), (7.350788, 35.35534, 34.58274), (6.9560037, 37.15724, 32.725426), (5.2337546, 37.15724, 33.044624), (5.5307937, 35.35534, 34.920055), (5.5307937, 35.35534, 34.920055), (5.2337546, 37.15724, 33.044624), (3.4971597, 37.15724, 33.27325), (3.6956394, 35.35534, 35.16166), (3.6956394, 35.35534, 35.16166), (3.4971597, 37.15724, 33.27325), (1.7509795, 37.15724, 33.41068), (1.8503555, 35.35534, 35.306885), (1.8503555, 35.35534, 35.306885), (1.7509795, 37.15724, 33.41068), (2.0486216e-15, 37.15724, 33.45653), (2.1648902e-15, 35.35534, 35.35534), (2.1648902e-15, 35.35534, 35.35534), (2.0486216e-15, 37.15724, 33.45653), (-1.7509795, 37.15724, 33.41068), (-1.8503555, 35.35534, 35.306885), (-1.8503555, 35.35534, 35.306885), (-1.7509795, 37.15724, 33.41068), (-3.4971597, 37.15724, 33.27325), (-3.6956394, 35.35534, 35.16166), (-3.6956394, 35.35534, 35.16166), (-3.4971597, 37.15724, 33.27325), (-5.2337546, 37.15724, 33.044624), (-5.5307937, 35.35534, 34.920055), (-5.5307937, 35.35534, 34.920055), (-5.2337546, 37.15724, 33.044624), (-6.9560037, 37.15724, 32.725426), (-7.350788, 35.35534, 34.58274), (-7.350788, 35.35534, 34.58274), (-6.9560037, 37.15724, 32.725426), (-8.659187, 37.15724, 32.31653), (-9.150635, 35.35534, 34.150635), (-9.150635, 35.35534, 34.150635), (-8.659187, 37.15724, 32.31653), (-10.338636, 37.15724, 31.819052), (-10.925401, 35.35534, 33.624924), (-10.925401, 35.35534, 33.624924), (-10.338636, 37.15724, 31.819052), (-11.989748, 37.15724, 31.234362), (-12.67022, 35.35534, 33.007053), (-12.67022, 35.35534, 33.007053), (-11.989748, 37.15724, 31.234362), (-13.607997, 37.15724, 30.564062), (-14.380312, 35.35534, 32.29871), (-14.380312, 35.35534, 32.29871), (-13.607997, 37.15724, 30.564062), (-15.188947, 37.15724, 29.809986), (-16.050987, 35.35534, 31.501839), (-16.050987, 35.35534, 31.501839), (-15.188947, 37.15724, 29.809986), (-16.728266, 37.15724, 28.974205), (-17.67767, 35.35534, 30.618622), (-17.67767, 35.35534, 30.618622), (-16.728266, 37.15724, 28.974205), (-18.221733, 37.15724, 28.059008), (-19.255898, 35.35534, 29.651482), (-19.255898, 35.35534, 29.651482), (-18.221733, 37.15724, 28.059008), (-19.665255, 37.15724, 27.066902), (-20.781347, 35.35534, 28.60307), (-20.781347, 35.35534, 28.60307), (-19.665255, 37.15724, 27.066902), (-21.054876, 37.15724, 26.000607), (-22.249836, 35.35534, 27.47626), (-22.249836, 35.35534, 27.47626), (-21.054876, 37.15724, 26.000607), (-22.38679, 37.15724, 24.863047), (-23.65734, 35.35534, 26.274137), (-23.65734, 35.35534, 26.274137), (-22.38679, 37.15724, 24.863047), (-23.65734, 37.15724, 23.65734), (-25, 35.35534, 25), (-25, 35.35534, 25), (-23.65734, 37.15724, 23.65734), (-24.863047, 37.15724, 22.38679), (-26.274137, 35.35534, 23.65734), (-26.274137, 35.35534, 23.65734), (-24.863047, 37.15724, 22.38679), (-26.000607, 37.15724, 21.054876), (-27.47626, 35.35534, 22.249836), (-27.47626, 35.35534, 22.249836), (-26.000607, 37.15724, 21.054876), (-27.066902, 37.15724, 19.665255), (-28.60307, 35.35534, 20.781347), (-28.60307, 35.35534, 20.781347), (-27.066902, 37.15724, 19.665255), (-28.059008, 37.15724, 18.221733), (-29.651482, 35.35534, 19.255898), (-29.651482, 35.35534, 19.255898), (-28.059008, 37.15724, 18.221733), (-28.974205, 37.15724, 16.728266), (-30.618622, 35.35534, 17.67767), (-30.618622, 35.35534, 17.67767), (-28.974205, 37.15724, 16.728266), (-29.809986, 37.15724, 15.188947), (-31.501839, 35.35534, 16.050987), (-31.501839, 35.35534, 16.050987), (-29.809986, 37.15724, 15.188947), (-30.564062, 37.15724, 13.607997), (-32.29871, 35.35534, 14.380312), (-32.29871, 35.35534, 14.380312), (-30.564062, 37.15724, 13.607997), (-31.234362, 37.15724, 11.989748), (-33.007053, 35.35534, 12.67022), (-33.007053, 35.35534, 12.67022), (-31.234362, 37.15724, 11.989748), (-31.819052, 37.15724, 10.338636), (-33.624924, 35.35534, 10.925401), (-33.624924, 35.35534, 10.925401), (-31.819052, 37.15724, 10.338636), (-32.31653, 37.15724, 8.659187), (-34.150635, 35.35534, 9.150635), (-34.150635, 35.35534, 9.150635), (-32.31653, 37.15724, 8.659187), (-32.725426, 37.15724, 6.9560037), (-34.58274, 35.35534, 7.350788), (-34.58274, 35.35534, 7.350788), (-32.725426, 37.15724, 6.9560037), (-33.044624, 37.15724, 5.2337546), (-34.920055, 35.35534, 5.5307937), (-34.920055, 35.35534, 5.5307937), (-33.044624, 37.15724, 5.2337546), (-33.27325, 37.15724, 3.4971597), (-35.16166, 35.35534, 3.6956394), (-35.16166, 35.35534, 3.6956394), (-33.27325, 37.15724, 3.4971597), (-33.41068, 37.15724, 1.7509795), (-35.306885, 35.35534, 1.8503555), (-35.306885, 35.35534, 1.8503555), (-33.41068, 37.15724, 1.7509795), (-33.45653, 37.15724, 4.097243e-15), (-35.35534, 35.35534, 4.3297804e-15), (-35.35534, 35.35534, 4.3297804e-15), (-33.45653, 37.15724, 4.097243e-15), (-33.41068, 37.15724, -1.7509795), (-35.306885, 35.35534, -1.8503555), (-35.306885, 35.35534, -1.8503555), (-33.41068, 37.15724, -1.7509795), (-33.27325, 37.15724, -3.4971597), (-35.16166, 35.35534, -3.6956394), (-35.16166, 35.35534, -3.6956394), (-33.27325, 37.15724, -3.4971597), (-33.044624, 37.15724, -5.2337546), (-34.920055, 35.35534, -5.5307937), (-34.920055, 35.35534, -5.5307937), (-33.044624, 37.15724, -5.2337546), (-32.725426, 37.15724, -6.9560037), (-34.58274, 35.35534, -7.350788), (-34.58274, 35.35534, -7.350788), (-32.725426, 37.15724, -6.9560037), (-32.31653, 37.15724, -8.659187), (-34.150635, 35.35534, -9.150635), (-34.150635, 35.35534, -9.150635), (-32.31653, 37.15724, -8.659187), (-31.819052, 37.15724, -10.338636), (-33.624924, 35.35534, -10.925401), (-33.624924, 35.35534, -10.925401), (-31.819052, 37.15724, -10.338636), (-31.234362, 37.15724, -11.989748), (-33.007053, 35.35534, -12.67022), (-33.007053, 35.35534, -12.67022), (-31.234362, 37.15724, -11.989748), (-30.564062, 37.15724, -13.607997), (-32.29871, 35.35534, -14.380312), (-32.29871, 35.35534, -14.380312), (-30.564062, 37.15724, -13.607997), (-29.809986, 37.15724, -15.188947), (-31.501839, 35.35534, -16.050987), (-31.501839, 35.35534, -16.050987), (-29.809986, 37.15724, -15.188947), (-28.974205, 37.15724, -16.728266), (-30.618622, 35.35534, -17.67767), (-30.618622, 35.35534, -17.67767), (-28.974205, 37.15724, -16.728266), (-28.059008, 37.15724, -18.221733), (-29.651482, 35.35534, -19.255898), (-29.651482, 35.35534, -19.255898), (-28.059008, 37.15724, -18.221733), (-27.066902, 37.15724, -19.665255), (-28.60307, 35.35534, -20.781347), (-28.60307, 35.35534, -20.781347), (-27.066902, 37.15724, -19.665255), (-26.000607, 37.15724, -21.054876), (-27.47626, 35.35534, -22.249836), (-27.47626, 35.35534, -22.249836), (-26.000607, 37.15724, -21.054876), (-24.863047, 37.15724, -22.38679), (-26.274137, 35.35534, -23.65734), (-26.274137, 35.35534, -23.65734), (-24.863047, 37.15724, -22.38679), (-23.65734, 37.15724, -23.65734), (-25, 35.35534, -25), (-25, 35.35534, -25), (-23.65734, 37.15724, -23.65734), (-22.38679, 37.15724, -24.863047), (-23.65734, 35.35534, -26.274137), (-23.65734, 35.35534, -26.274137), (-22.38679, 37.15724, -24.863047), (-21.054876, 37.15724, -26.000607), (-22.249836, 35.35534, -27.47626), (-22.249836, 35.35534, -27.47626), (-21.054876, 37.15724, -26.000607), (-19.665255, 37.15724, -27.066902), (-20.781347, 35.35534, -28.60307), (-20.781347, 35.35534, -28.60307), (-19.665255, 37.15724, -27.066902), (-18.221733, 37.15724, -28.059008), (-19.255898, 35.35534, -29.651482), (-19.255898, 35.35534, -29.651482), (-18.221733, 37.15724, -28.059008), (-16.728266, 37.15724, -28.974205), (-17.67767, 35.35534, -30.618622), (-17.67767, 35.35534, -30.618622), (-16.728266, 37.15724, -28.974205), (-15.188947, 37.15724, -29.809986), (-16.050987, 35.35534, -31.501839), (-16.050987, 35.35534, -31.501839), (-15.188947, 37.15724, -29.809986), (-13.607997, 37.15724, -30.564062), (-14.380312, 35.35534, -32.29871), (-14.380312, 35.35534, -32.29871), (-13.607997, 37.15724, -30.564062), (-11.989748, 37.15724, -31.234362), (-12.67022, 35.35534, -33.007053), (-12.67022, 35.35534, -33.007053), (-11.989748, 37.15724, -31.234362), (-10.338636, 37.15724, -31.819052), (-10.925401, 35.35534, -33.624924), (-10.925401, 35.35534, -33.624924), (-10.338636, 37.15724, -31.819052), (-8.659187, 37.15724, -32.31653), (-9.150635, 35.35534, -34.150635), (-9.150635, 35.35534, -34.150635), (-8.659187, 37.15724, -32.31653), (-6.9560037, 37.15724, -32.725426), (-7.350788, 35.35534, -34.58274), (-7.350788, 35.35534, -34.58274), (-6.9560037, 37.15724, -32.725426), (-5.2337546, 37.15724, -33.044624), (-5.5307937, 35.35534, -34.920055), (-5.5307937, 35.35534, -34.920055), (-5.2337546, 37.15724, -33.044624), (-3.4971597, 37.15724, -33.27325), (-3.6956394, 35.35534, -35.16166), (-3.6956394, 35.35534, -35.16166), (-3.4971597, 37.15724, -33.27325), (-1.7509795, 37.15724, -33.41068), (-1.8503555, 35.35534, -35.306885), (-1.8503555, 35.35534, -35.306885), (-1.7509795, 37.15724, -33.41068), (-6.145865e-15, 37.15724, -33.45653), (-6.4946704e-15, 35.35534, -35.35534), (-6.4946704e-15, 35.35534, -35.35534), (-6.145865e-15, 37.15724, -33.45653), (1.7509795, 37.15724, -33.41068), (1.8503555, 35.35534, -35.306885), (1.8503555, 35.35534, -35.306885), (1.7509795, 37.15724, -33.41068), (3.4971597, 37.15724, -33.27325), (3.6956394, 35.35534, -35.16166), (3.6956394, 35.35534, -35.16166), (3.4971597, 37.15724, -33.27325), (5.2337546, 37.15724, -33.044624), (5.5307937, 35.35534, -34.920055), (5.5307937, 35.35534, -34.920055), (5.2337546, 37.15724, -33.044624), (6.9560037, 37.15724, -32.725426), (7.350788, 35.35534, -34.58274), (7.350788, 35.35534, -34.58274), (6.9560037, 37.15724, -32.725426), (8.659187, 37.15724, -32.31653), (9.150635, 35.35534, -34.150635), (9.150635, 35.35534, -34.150635), (8.659187, 37.15724, -32.31653), (10.338636, 37.15724, -31.819052), (10.925401, 35.35534, -33.624924), (10.925401, 35.35534, -33.624924), (10.338636, 37.15724, -31.819052), (11.989748, 37.15724, -31.234362), (12.67022, 35.35534, -33.007053), (12.67022, 35.35534, -33.007053), (11.989748, 37.15724, -31.234362), (13.607997, 37.15724, -30.564062), (14.380312, 35.35534, -32.29871), (14.380312, 35.35534, -32.29871), (13.607997, 37.15724, -30.564062), (15.188947, 37.15724, -29.809986), (16.050987, 35.35534, -31.501839), (16.050987, 35.35534, -31.501839), (15.188947, 37.15724, -29.809986), (16.728266, 37.15724, -28.974205), (17.67767, 35.35534, -30.618622), (17.67767, 35.35534, -30.618622), (16.728266, 37.15724, -28.974205), (18.221733, 37.15724, -28.059008), (19.255898, 35.35534, -29.651482), (19.255898, 35.35534, -29.651482), (18.221733, 37.15724, -28.059008), (19.665255, 37.15724, -27.066902), (20.781347, 35.35534, -28.60307), (20.781347, 35.35534, -28.60307), (19.665255, 37.15724, -27.066902), (21.054876, 37.15724, -26.000607), (22.249836, 35.35534, -27.47626), (22.249836, 35.35534, -27.47626), (21.054876, 37.15724, -26.000607), (22.38679, 37.15724, -24.863047), (23.65734, 35.35534, -26.274137), (23.65734, 35.35534, -26.274137), (22.38679, 37.15724, -24.863047), (23.65734, 37.15724, -23.65734), (25, 35.35534, -25), (25, 35.35534, -25), (23.65734, 37.15724, -23.65734), (24.863047, 37.15724, -22.38679), (26.274137, 35.35534, -23.65734), (26.274137, 35.35534, -23.65734), (24.863047, 37.15724, -22.38679), (26.000607, 37.15724, -21.054876), (27.47626, 35.35534, -22.249836), (27.47626, 35.35534, -22.249836), (26.000607, 37.15724, -21.054876), (27.066902, 37.15724, -19.665255), (28.60307, 35.35534, -20.781347), (28.60307, 35.35534, -20.781347), (27.066902, 37.15724, -19.665255), (28.059008, 37.15724, -18.221733), (29.651482, 35.35534, -19.255898), (29.651482, 35.35534, -19.255898), (28.059008, 37.15724, -18.221733), (28.974205, 37.15724, -16.728266), (30.618622, 35.35534, -17.67767), (30.618622, 35.35534, -17.67767), (28.974205, 37.15724, -16.728266), (29.809986, 37.15724, -15.188947), (31.501839, 35.35534, -16.050987), (31.501839, 35.35534, -16.050987), (29.809986, 37.15724, -15.188947), (30.564062, 37.15724, -13.607997), (32.29871, 35.35534, -14.380312), (32.29871, 35.35534, -14.380312), (30.564062, 37.15724, -13.607997), (31.234362, 37.15724, -11.989748), (33.007053, 35.35534, -12.67022), (33.007053, 35.35534, -12.67022), (31.234362, 37.15724, -11.989748), (31.819052, 37.15724, -10.338636), (33.624924, 35.35534, -10.925401), (33.624924, 35.35534, -10.925401), (31.819052, 37.15724, -10.338636), (32.31653, 37.15724, -8.659187), (34.150635, 35.35534, -9.150635), (34.150635, 35.35534, -9.150635), (32.31653, 37.15724, -8.659187), (32.725426, 37.15724, -6.9560037), (34.58274, 35.35534, -7.350788), (34.58274, 35.35534, -7.350788), (32.725426, 37.15724, -6.9560037), (33.044624, 37.15724, -5.2337546), (34.920055, 35.35534, -5.5307937), (34.920055, 35.35534, -5.5307937), (33.044624, 37.15724, -5.2337546), (33.27325, 37.15724, -3.4971597), (35.16166, 35.35534, -3.6956394), (35.16166, 35.35534, -3.6956394), (33.27325, 37.15724, -3.4971597), (33.41068, 37.15724, -1.7509795), (35.306885, 35.35534, -1.8503555), (35.306885, 35.35534, -1.8503555), (33.41068, 37.15724, -1.7509795), (33.45653, 37.15724, 0), (35.35534, 35.35534, 0), (33.45653, 37.15724, 0), (31.466019, 38.8573, 0), (31.422897, 38.8573, 1.6468042), (33.41068, 37.15724, 1.7509795), (33.41068, 37.15724, 1.7509795), (31.422897, 38.8573, 1.6468042), (31.293646, 38.8573, 3.2890947), (33.27325, 37.15724, 3.4971597), (33.27325, 37.15724, 3.4971597), (31.293646, 38.8573, 3.2890947), (31.07862, 38.8573, 4.92237), (33.044624, 37.15724, 5.2337546), (33.044624, 37.15724, 5.2337546), (31.07862, 38.8573, 4.92237), (30.778412, 38.8573, 6.5421534), (32.725426, 37.15724, 6.9560037), (32.725426, 37.15724, 6.9560037), (30.778412, 38.8573, 6.5421534), (30.39384, 38.8573, 8.144005), (32.31653, 37.15724, 8.659187), (32.31653, 37.15724, 8.659187), (30.39384, 38.8573, 8.144005), (29.925962, 38.8573, 9.723535), (31.819052, 37.15724, 10.338636), (31.819052, 37.15724, 10.338636), (29.925962, 38.8573, 9.723535), (29.37606, 38.8573, 11.276413), (31.234362, 37.15724, 11.989748), (31.234362, 37.15724, 11.989748), (29.37606, 38.8573, 11.276413), (28.74564, 38.8573, 12.798383), (30.564062, 37.15724, 13.607997), (30.564062, 37.15724, 13.607997), (28.74564, 38.8573, 12.798383), (28.036428, 38.8573, 14.285274), (29.809986, 37.15724, 15.188947), (29.809986, 37.15724, 15.188947), (28.036428, 38.8573, 14.285274), (27.250372, 38.8573, 15.733009), (28.974205, 37.15724, 16.728266), (28.974205, 37.15724, 16.728266), (27.250372, 38.8573, 15.733009), (26.389624, 38.8573, 17.137623), (28.059008, 37.15724, 18.221733), (28.059008, 37.15724, 18.221733), (26.389624, 38.8573, 17.137623), (25.456545, 38.8573, 18.495262), (27.066902, 37.15724, 19.665255), (27.066902, 37.15724, 19.665255), (25.456545, 38.8573, 18.495262), (24.45369, 38.8573, 19.802208), (26.000607, 37.15724, 21.054876), (26.000607, 37.15724, 21.054876), (24.45369, 38.8573, 19.802208), (23.38381, 38.8573, 21.054876), (24.863047, 37.15724, 22.38679), (24.863047, 37.15724, 22.38679), (23.38381, 38.8573, 21.054876), (22.249836, 38.8573, 22.249836), (23.65734, 37.15724, 23.65734), (23.65734, 37.15724, 23.65734), (22.249836, 38.8573, 22.249836), (21.054876, 38.8573, 23.38381), (22.38679, 37.15724, 24.863047), (22.38679, 37.15724, 24.863047), (21.054876, 38.8573, 23.38381), (19.802208, 38.8573, 24.45369), (21.054876, 37.15724, 26.000607), (21.054876, 37.15724, 26.000607), (19.802208, 38.8573, 24.45369), (18.495262, 38.8573, 25.456545), (19.665255, 37.15724, 27.066902), (19.665255, 37.15724, 27.066902), (18.495262, 38.8573, 25.456545), (17.137623, 38.8573, 26.389624), (18.221733, 37.15724, 28.059008), (18.221733, 37.15724, 28.059008), (17.137623, 38.8573, 26.389624), (15.733009, 38.8573, 27.250372), (16.728266, 37.15724, 28.974205), (16.728266, 37.15724, 28.974205), (15.733009, 38.8573, 27.250372), (14.285274, 38.8573, 28.036428), (15.188947, 37.15724, 29.809986), (15.188947, 37.15724, 29.809986), (14.285274, 38.8573, 28.036428), (12.798383, 38.8573, 28.74564), (13.607997, 37.15724, 30.564062), (13.607997, 37.15724, 30.564062), (12.798383, 38.8573, 28.74564), (11.276413, 38.8573, 29.37606), (11.989748, 37.15724, 31.234362), (11.989748, 37.15724, 31.234362), (11.276413, 38.8573, 29.37606), (9.723535, 38.8573, 29.925962), (10.338636, 37.15724, 31.819052), (10.338636, 37.15724, 31.819052), (9.723535, 38.8573, 29.925962), (8.144005, 38.8573, 30.39384), (8.659187, 37.15724, 32.31653), (8.659187, 37.15724, 32.31653), (8.144005, 38.8573, 30.39384), (6.5421534, 38.8573, 30.778412), (6.9560037, 37.15724, 32.725426), (6.9560037, 37.15724, 32.725426), (6.5421534, 38.8573, 30.778412), (4.92237, 38.8573, 31.07862), (5.2337546, 37.15724, 33.044624), (5.2337546, 37.15724, 33.044624), (4.92237, 38.8573, 31.07862), (3.2890947, 38.8573, 31.293646), (3.4971597, 37.15724, 33.27325), (3.4971597, 37.15724, 33.27325), (3.2890947, 38.8573, 31.293646), (1.6468042, 38.8573, 31.422897), (1.7509795, 37.15724, 33.41068), (1.7509795, 37.15724, 33.41068), (1.6468042, 38.8573, 31.422897), (1.926738e-15, 38.8573, 31.466019), (2.0486216e-15, 37.15724, 33.45653), (2.0486216e-15, 37.15724, 33.45653), (1.926738e-15, 38.8573, 31.466019), (-1.6468042, 38.8573, 31.422897), (-1.7509795, 37.15724, 33.41068), (-1.7509795, 37.15724, 33.41068), (-1.6468042, 38.8573, 31.422897), (-3.2890947, 38.8573, 31.293646), (-3.4971597, 37.15724, 33.27325), (-3.4971597, 37.15724, 33.27325), (-3.2890947, 38.8573, 31.293646), (-4.92237, 38.8573, 31.07862), (-5.2337546, 37.15724, 33.044624), (-5.2337546, 37.15724, 33.044624), (-4.92237, 38.8573, 31.07862), (-6.5421534, 38.8573, 30.778412), (-6.9560037, 37.15724, 32.725426), (-6.9560037, 37.15724, 32.725426), (-6.5421534, 38.8573, 30.778412), (-8.144005, 38.8573, 30.39384), (-8.659187, 37.15724, 32.31653), (-8.659187, 37.15724, 32.31653), (-8.144005, 38.8573, 30.39384), (-9.723535, 38.8573, 29.925962), (-10.338636, 37.15724, 31.819052), (-10.338636, 37.15724, 31.819052), (-9.723535, 38.8573, 29.925962), (-11.276413, 38.8573, 29.37606), (-11.989748, 37.15724, 31.234362), (-11.989748, 37.15724, 31.234362), (-11.276413, 38.8573, 29.37606), (-12.798383, 38.8573, 28.74564), (-13.607997, 37.15724, 30.564062), (-13.607997, 37.15724, 30.564062), (-12.798383, 38.8573, 28.74564), (-14.285274, 38.8573, 28.036428), (-15.188947, 37.15724, 29.809986), (-15.188947, 37.15724, 29.809986), (-14.285274, 38.8573, 28.036428), (-15.733009, 38.8573, 27.250372), (-16.728266, 37.15724, 28.974205), (-16.728266, 37.15724, 28.974205), (-15.733009, 38.8573, 27.250372), (-17.137623, 38.8573, 26.389624), (-18.221733, 37.15724, 28.059008), (-18.221733, 37.15724, 28.059008), (-17.137623, 38.8573, 26.389624), (-18.495262, 38.8573, 25.456545), (-19.665255, 37.15724, 27.066902), (-19.665255, 37.15724, 27.066902), (-18.495262, 38.8573, 25.456545), (-19.802208, 38.8573, 24.45369), (-21.054876, 37.15724, 26.000607), (-21.054876, 37.15724, 26.000607), (-19.802208, 38.8573, 24.45369), (-21.054876, 38.8573, 23.38381), (-22.38679, 37.15724, 24.863047), (-22.38679, 37.15724, 24.863047), (-21.054876, 38.8573, 23.38381), (-22.249836, 38.8573, 22.249836), (-23.65734, 37.15724, 23.65734), (-23.65734, 37.15724, 23.65734), (-22.249836, 38.8573, 22.249836), (-23.38381, 38.8573, 21.054876), (-24.863047, 37.15724, 22.38679), (-24.863047, 37.15724, 22.38679), (-23.38381, 38.8573, 21.054876), (-24.45369, 38.8573, 19.802208), (-26.000607, 37.15724, 21.054876), (-26.000607, 37.15724, 21.054876), (-24.45369, 38.8573, 19.802208), (-25.456545, 38.8573, 18.495262), (-27.066902, 37.15724, 19.665255), (-27.066902, 37.15724, 19.665255), (-25.456545, 38.8573, 18.495262), (-26.389624, 38.8573, 17.137623), (-28.059008, 37.15724, 18.221733), (-28.059008, 37.15724, 18.221733), (-26.389624, 38.8573, 17.137623), (-27.250372, 38.8573, 15.733009), (-28.974205, 37.15724, 16.728266), (-28.974205, 37.15724, 16.728266), (-27.250372, 38.8573, 15.733009), (-28.036428, 38.8573, 14.285274), (-29.809986, 37.15724, 15.188947), (-29.809986, 37.15724, 15.188947), (-28.036428, 38.8573, 14.285274), (-28.74564, 38.8573, 12.798383), (-30.564062, 37.15724, 13.607997), (-30.564062, 37.15724, 13.607997), (-28.74564, 38.8573, 12.798383), (-29.37606, 38.8573, 11.276413), (-31.234362, 37.15724, 11.989748), (-31.234362, 37.15724, 11.989748), (-29.37606, 38.8573, 11.276413), (-29.925962, 38.8573, 9.723535), (-31.819052, 37.15724, 10.338636), (-31.819052, 37.15724, 10.338636), (-29.925962, 38.8573, 9.723535), (-30.39384, 38.8573, 8.144005), (-32.31653, 37.15724, 8.659187), (-32.31653, 37.15724, 8.659187), (-30.39384, 38.8573, 8.144005), (-30.778412, 38.8573, 6.5421534), (-32.725426, 37.15724, 6.9560037), (-32.725426, 37.15724, 6.9560037), (-30.778412, 38.8573, 6.5421534), (-31.07862, 38.8573, 4.92237), (-33.044624, 37.15724, 5.2337546), (-33.044624, 37.15724, 5.2337546), (-31.07862, 38.8573, 4.92237), (-31.293646, 38.8573, 3.2890947), (-33.27325, 37.15724, 3.4971597), (-33.27325, 37.15724, 3.4971597), (-31.293646, 38.8573, 3.2890947), (-31.422897, 38.8573, 1.6468042), (-33.41068, 37.15724, 1.7509795), (-33.41068, 37.15724, 1.7509795), (-31.422897, 38.8573, 1.6468042), (-31.466019, 38.8573, 3.853476e-15), (-33.45653, 37.15724, 4.097243e-15), (-33.45653, 37.15724, 4.097243e-15), (-31.466019, 38.8573, 3.853476e-15), (-31.422897, 38.8573, -1.6468042), (-33.41068, 37.15724, -1.7509795), (-33.41068, 37.15724, -1.7509795), (-31.422897, 38.8573, -1.6468042), (-31.293646, 38.8573, -3.2890947), (-33.27325, 37.15724, -3.4971597), (-33.27325, 37.15724, -3.4971597), (-31.293646, 38.8573, -3.2890947), (-31.07862, 38.8573, -4.92237), (-33.044624, 37.15724, -5.2337546), (-33.044624, 37.15724, -5.2337546), (-31.07862, 38.8573, -4.92237), (-30.778412, 38.8573, -6.5421534), (-32.725426, 37.15724, -6.9560037), (-32.725426, 37.15724, -6.9560037), (-30.778412, 38.8573, -6.5421534), (-30.39384, 38.8573, -8.144005), (-32.31653, 37.15724, -8.659187), (-32.31653, 37.15724, -8.659187), (-30.39384, 38.8573, -8.144005), (-29.925962, 38.8573, -9.723535), (-31.819052, 37.15724, -10.338636), (-31.819052, 37.15724, -10.338636), (-29.925962, 38.8573, -9.723535), (-29.37606, 38.8573, -11.276413), (-31.234362, 37.15724, -11.989748), (-31.234362, 37.15724, -11.989748), (-29.37606, 38.8573, -11.276413), (-28.74564, 38.8573, -12.798383), (-30.564062, 37.15724, -13.607997), (-30.564062, 37.15724, -13.607997), (-28.74564, 38.8573, -12.798383), (-28.036428, 38.8573, -14.285274), (-29.809986, 37.15724, -15.188947), (-29.809986, 37.15724, -15.188947), (-28.036428, 38.8573, -14.285274), (-27.250372, 38.8573, -15.733009), (-28.974205, 37.15724, -16.728266), (-28.974205, 37.15724, -16.728266), (-27.250372, 38.8573, -15.733009), (-26.389624, 38.8573, -17.137623), (-28.059008, 37.15724, -18.221733), (-28.059008, 37.15724, -18.221733), (-26.389624, 38.8573, -17.137623), (-25.456545, 38.8573, -18.495262), (-27.066902, 37.15724, -19.665255), (-27.066902, 37.15724, -19.665255), (-25.456545, 38.8573, -18.495262), (-24.45369, 38.8573, -19.802208), (-26.000607, 37.15724, -21.054876), (-26.000607, 37.15724, -21.054876), (-24.45369, 38.8573, -19.802208), (-23.38381, 38.8573, -21.054876), (-24.863047, 37.15724, -22.38679), (-24.863047, 37.15724, -22.38679), (-23.38381, 38.8573, -21.054876), (-22.249836, 38.8573, -22.249836), (-23.65734, 37.15724, -23.65734), (-23.65734, 37.15724, -23.65734), (-22.249836, 38.8573, -22.249836), (-21.054876, 38.8573, -23.38381), (-22.38679, 37.15724, -24.863047), (-22.38679, 37.15724, -24.863047), (-21.054876, 38.8573, -23.38381), (-19.802208, 38.8573, -24.45369), (-21.054876, 37.15724, -26.000607), (-21.054876, 37.15724, -26.000607), (-19.802208, 38.8573, -24.45369), (-18.495262, 38.8573, -25.456545), (-19.665255, 37.15724, -27.066902), (-19.665255, 37.15724, -27.066902), (-18.495262, 38.8573, -25.456545), (-17.137623, 38.8573, -26.389624), (-18.221733, 37.15724, -28.059008), (-18.221733, 37.15724, -28.059008), (-17.137623, 38.8573, -26.389624), (-15.733009, 38.8573, -27.250372), (-16.728266, 37.15724, -28.974205), (-16.728266, 37.15724, -28.974205), (-15.733009, 38.8573, -27.250372), (-14.285274, 38.8573, -28.036428), (-15.188947, 37.15724, -29.809986), (-15.188947, 37.15724, -29.809986), (-14.285274, 38.8573, -28.036428), (-12.798383, 38.8573, -28.74564), (-13.607997, 37.15724, -30.564062), (-13.607997, 37.15724, -30.564062), (-12.798383, 38.8573, -28.74564), (-11.276413, 38.8573, -29.37606), (-11.989748, 37.15724, -31.234362), (-11.989748, 37.15724, -31.234362), (-11.276413, 38.8573, -29.37606), (-9.723535, 38.8573, -29.925962), (-10.338636, 37.15724, -31.819052), (-10.338636, 37.15724, -31.819052), (-9.723535, 38.8573, -29.925962), (-8.144005, 38.8573, -30.39384), (-8.659187, 37.15724, -32.31653), (-8.659187, 37.15724, -32.31653), (-8.144005, 38.8573, -30.39384), (-6.5421534, 38.8573, -30.778412), (-6.9560037, 37.15724, -32.725426), (-6.9560037, 37.15724, -32.725426), (-6.5421534, 38.8573, -30.778412), (-4.92237, 38.8573, -31.07862), (-5.2337546, 37.15724, -33.044624), (-5.2337546, 37.15724, -33.044624), (-4.92237, 38.8573, -31.07862), (-3.2890947, 38.8573, -31.293646), (-3.4971597, 37.15724, -33.27325), (-3.4971597, 37.15724, -33.27325), (-3.2890947, 38.8573, -31.293646), (-1.6468042, 38.8573, -31.422897), (-1.7509795, 37.15724, -33.41068), (-1.7509795, 37.15724, -33.41068), (-1.6468042, 38.8573, -31.422897), (-5.780214e-15, 38.8573, -31.466019), (-6.145865e-15, 37.15724, -33.45653), (-6.145865e-15, 37.15724, -33.45653), (-5.780214e-15, 38.8573, -31.466019), (1.6468042, 38.8573, -31.422897), (1.7509795, 37.15724, -33.41068), (1.7509795, 37.15724, -33.41068), (1.6468042, 38.8573, -31.422897), (3.2890947, 38.8573, -31.293646), (3.4971597, 37.15724, -33.27325), (3.4971597, 37.15724, -33.27325), (3.2890947, 38.8573, -31.293646), (4.92237, 38.8573, -31.07862), (5.2337546, 37.15724, -33.044624), (5.2337546, 37.15724, -33.044624), (4.92237, 38.8573, -31.07862), (6.5421534, 38.8573, -30.778412), (6.9560037, 37.15724, -32.725426), (6.9560037, 37.15724, -32.725426), (6.5421534, 38.8573, -30.778412), (8.144005, 38.8573, -30.39384), (8.659187, 37.15724, -32.31653), (8.659187, 37.15724, -32.31653), (8.144005, 38.8573, -30.39384), (9.723535, 38.8573, -29.925962), (10.338636, 37.15724, -31.819052), (10.338636, 37.15724, -31.819052), (9.723535, 38.8573, -29.925962), (11.276413, 38.8573, -29.37606), (11.989748, 37.15724, -31.234362), (11.989748, 37.15724, -31.234362), (11.276413, 38.8573, -29.37606), (12.798383, 38.8573, -28.74564), (13.607997, 37.15724, -30.564062), (13.607997, 37.15724, -30.564062), (12.798383, 38.8573, -28.74564), (14.285274, 38.8573, -28.036428), (15.188947, 37.15724, -29.809986), (15.188947, 37.15724, -29.809986), (14.285274, 38.8573, -28.036428), (15.733009, 38.8573, -27.250372), (16.728266, 37.15724, -28.974205), (16.728266, 37.15724, -28.974205), (15.733009, 38.8573, -27.250372), (17.137623, 38.8573, -26.389624), (18.221733, 37.15724, -28.059008), (18.221733, 37.15724, -28.059008), (17.137623, 38.8573, -26.389624), (18.495262, 38.8573, -25.456545), (19.665255, 37.15724, -27.066902), (19.665255, 37.15724, -27.066902), (18.495262, 38.8573, -25.456545), (19.802208, 38.8573, -24.45369), (21.054876, 37.15724, -26.000607), (21.054876, 37.15724, -26.000607), (19.802208, 38.8573, -24.45369), (21.054876, 38.8573, -23.38381), (22.38679, 37.15724, -24.863047), (22.38679, 37.15724, -24.863047), (21.054876, 38.8573, -23.38381), (22.249836, 38.8573, -22.249836), (23.65734, 37.15724, -23.65734), (23.65734, 37.15724, -23.65734), (22.249836, 38.8573, -22.249836), (23.38381, 38.8573, -21.054876), (24.863047, 37.15724, -22.38679), (24.863047, 37.15724, -22.38679), (23.38381, 38.8573, -21.054876), (24.45369, 38.8573, -19.802208), (26.000607, 37.15724, -21.054876), (26.000607, 37.15724, -21.054876), (24.45369, 38.8573, -19.802208), (25.456545, 38.8573, -18.495262), (27.066902, 37.15724, -19.665255), (27.066902, 37.15724, -19.665255), (25.456545, 38.8573, -18.495262), (26.389624, 38.8573, -17.137623), (28.059008, 37.15724, -18.221733), (28.059008, 37.15724, -18.221733), (26.389624, 38.8573, -17.137623), (27.250372, 38.8573, -15.733009), (28.974205, 37.15724, -16.728266), (28.974205, 37.15724, -16.728266), (27.250372, 38.8573, -15.733009), (28.036428, 38.8573, -14.285274), (29.809986, 37.15724, -15.188947), (29.809986, 37.15724, -15.188947), (28.036428, 38.8573, -14.285274), (28.74564, 38.8573, -12.798383), (30.564062, 37.15724, -13.607997), (30.564062, 37.15724, -13.607997), (28.74564, 38.8573, -12.798383), (29.37606, 38.8573, -11.276413), (31.234362, 37.15724, -11.989748), (31.234362, 37.15724, -11.989748), (29.37606, 38.8573, -11.276413), (29.925962, 38.8573, -9.723535), (31.819052, 37.15724, -10.338636), (31.819052, 37.15724, -10.338636), (29.925962, 38.8573, -9.723535), (30.39384, 38.8573, -8.144005), (32.31653, 37.15724, -8.659187), (32.31653, 37.15724, -8.659187), (30.39384, 38.8573, -8.144005), (30.778412, 38.8573, -6.5421534), (32.725426, 37.15724, -6.9560037), (32.725426, 37.15724, -6.9560037), (30.778412, 38.8573, -6.5421534), (31.07862, 38.8573, -4.92237), (33.044624, 37.15724, -5.2337546), (33.044624, 37.15724, -5.2337546), (31.07862, 38.8573, -4.92237), (31.293646, 38.8573, -3.2890947), (33.27325, 37.15724, -3.4971597), (33.27325, 37.15724, -3.4971597), (31.293646, 38.8573, -3.2890947), (31.422897, 38.8573, -1.6468042), (33.41068, 37.15724, -1.7509795), (33.41068, 37.15724, -1.7509795), (31.422897, 38.8573, -1.6468042), (31.466019, 38.8573, 0), (33.45653, 37.15724, 0), (31.466019, 38.8573, 0), (29.389263, 40.45085, 0), (29.348986, 40.45085, 1.5381151), (31.422897, 38.8573, 1.6468042), (31.422897, 38.8573, 1.6468042), (29.348986, 40.45085, 1.5381151), (29.228266, 40.45085, 3.0720146), (31.293646, 38.8573, 3.2890947), (31.293646, 38.8573, 3.2890947), (29.228266, 40.45085, 3.0720146), (29.027431, 40.45085, 4.5974936), (31.07862, 38.8573, 4.92237), (31.07862, 38.8573, 4.92237), (29.027431, 40.45085, 4.5974936), (28.747036, 40.45085, 6.110371), (30.778412, 38.8573, 6.5421534), (30.778412, 38.8573, 6.5421534), (28.747036, 40.45085, 6.110371), (28.387848, 40.45085, 7.606501), (30.39384, 38.8573, 8.144005), (30.39384, 38.8573, 8.144005), (28.387848, 40.45085, 7.606501), (27.95085, 40.45085, 9.081781), (29.925962, 38.8573, 9.723535), (29.925962, 38.8573, 9.723535), (27.95085, 40.45085, 9.081781), (27.43724, 40.45085, 10.532169), (29.37606, 38.8573, 11.276413), (29.37606, 38.8573, 11.276413), (27.43724, 40.45085, 10.532169), (26.848427, 40.45085, 11.95369), (28.74564, 38.8573, 12.798383), (28.74564, 38.8573, 12.798383), (26.848427, 40.45085, 11.95369), (26.186026, 40.45085, 13.342446), (28.036428, 38.8573, 14.285274), (28.036428, 38.8573, 14.285274), (26.186026, 40.45085, 13.342446), (25.451847, 40.45085, 14.694632), (27.250372, 38.8573, 15.733009), (27.250372, 38.8573, 15.733009), (25.451847, 40.45085, 14.694632), (24.64791, 40.45085, 16.00654), (26.389624, 38.8573, 17.137623), (26.389624, 38.8573, 17.137623), (24.64791, 40.45085, 16.00654), (23.776413, 40.45085, 17.274574), (25.456545, 38.8573, 18.495262), (25.456545, 38.8573, 18.495262), (23.776413, 40.45085, 17.274574), (22.839746, 40.45085, 18.495262), (24.45369, 38.8573, 19.802208), (24.45369, 38.8573, 19.802208), (22.839746, 40.45085, 18.495262), (21.840479, 40.45085, 19.665255), (23.38381, 38.8573, 21.054876), (23.38381, 38.8573, 21.054876), (21.840479, 40.45085, 19.665255), (20.781347, 40.45085, 20.781347), (22.249836, 38.8573, 22.249836), (22.249836, 38.8573, 22.249836), (20.781347, 40.45085, 20.781347), (19.665255, 40.45085, 21.840479), (21.054876, 38.8573, 23.38381), (21.054876, 38.8573, 23.38381), (19.665255, 40.45085, 21.840479), (18.495262, 40.45085, 22.839746), (19.802208, 38.8573, 24.45369), (19.802208, 38.8573, 24.45369), (18.495262, 40.45085, 22.839746), (17.274574, 40.45085, 23.776413), (18.495262, 38.8573, 25.456545), (18.495262, 38.8573, 25.456545), (17.274574, 40.45085, 23.776413), (16.00654, 40.45085, 24.64791), (17.137623, 38.8573, 26.389624), (17.137623, 38.8573, 26.389624), (16.00654, 40.45085, 24.64791), (14.694632, 40.45085, 25.451847), (15.733009, 38.8573, 27.250372), (15.733009, 38.8573, 27.250372), (14.694632, 40.45085, 25.451847), (13.342446, 40.45085, 26.186026), (14.285274, 38.8573, 28.036428), (14.285274, 38.8573, 28.036428), (13.342446, 40.45085, 26.186026), (11.95369, 40.45085, 26.848427), (12.798383, 38.8573, 28.74564), (12.798383, 38.8573, 28.74564), (11.95369, 40.45085, 26.848427), (10.532169, 40.45085, 27.43724), (11.276413, 38.8573, 29.37606), (11.276413, 38.8573, 29.37606), (10.532169, 40.45085, 27.43724), (9.081781, 40.45085, 27.95085), (9.723535, 38.8573, 29.925962), (9.723535, 38.8573, 29.925962), (9.081781, 40.45085, 27.95085), (7.606501, 40.45085, 28.387848), (8.144005, 38.8573, 30.39384), (8.144005, 38.8573, 30.39384), (7.606501, 40.45085, 28.387848), (6.110371, 40.45085, 28.747036), (6.5421534, 38.8573, 30.778412), (6.5421534, 38.8573, 30.778412), (6.110371, 40.45085, 28.747036), (4.5974936, 40.45085, 29.027431), (4.92237, 38.8573, 31.07862), (4.92237, 38.8573, 31.07862), (4.5974936, 40.45085, 29.027431), (3.0720146, 40.45085, 29.228266), (3.2890947, 38.8573, 31.293646), (3.2890947, 38.8573, 31.293646), (3.0720146, 40.45085, 29.228266), (1.5381151, 40.45085, 29.348986), (1.6468042, 38.8573, 31.422897), (1.6468042, 38.8573, 31.422897), (1.5381151, 40.45085, 29.348986), (1.7995734e-15, 40.45085, 29.389263), (1.926738e-15, 38.8573, 31.466019), (1.926738e-15, 38.8573, 31.466019), (1.7995734e-15, 40.45085, 29.389263), (-1.5381151, 40.45085, 29.348986), (-1.6468042, 38.8573, 31.422897), (-1.6468042, 38.8573, 31.422897), (-1.5381151, 40.45085, 29.348986), (-3.0720146, 40.45085, 29.228266), (-3.2890947, 38.8573, 31.293646), (-3.2890947, 38.8573, 31.293646), (-3.0720146, 40.45085, 29.228266), (-4.5974936, 40.45085, 29.027431), (-4.92237, 38.8573, 31.07862), (-4.92237, 38.8573, 31.07862), (-4.5974936, 40.45085, 29.027431), (-6.110371, 40.45085, 28.747036), (-6.5421534, 38.8573, 30.778412), (-6.5421534, 38.8573, 30.778412), (-6.110371, 40.45085, 28.747036), (-7.606501, 40.45085, 28.387848), (-8.144005, 38.8573, 30.39384), (-8.144005, 38.8573, 30.39384), (-7.606501, 40.45085, 28.387848), (-9.081781, 40.45085, 27.95085), (-9.723535, 38.8573, 29.925962), (-9.723535, 38.8573, 29.925962), (-9.081781, 40.45085, 27.95085), (-10.532169, 40.45085, 27.43724), (-11.276413, 38.8573, 29.37606), (-11.276413, 38.8573, 29.37606), (-10.532169, 40.45085, 27.43724), (-11.95369, 40.45085, 26.848427), (-12.798383, 38.8573, 28.74564), (-12.798383, 38.8573, 28.74564), (-11.95369, 40.45085, 26.848427), (-13.342446, 40.45085, 26.186026), (-14.285274, 38.8573, 28.036428), (-14.285274, 38.8573, 28.036428), (-13.342446, 40.45085, 26.186026), (-14.694632, 40.45085, 25.451847), (-15.733009, 38.8573, 27.250372), (-15.733009, 38.8573, 27.250372), (-14.694632, 40.45085, 25.451847), (-16.00654, 40.45085, 24.64791), (-17.137623, 38.8573, 26.389624), (-17.137623, 38.8573, 26.389624), (-16.00654, 40.45085, 24.64791), (-17.274574, 40.45085, 23.776413), (-18.495262, 38.8573, 25.456545), (-18.495262, 38.8573, 25.456545), (-17.274574, 40.45085, 23.776413), (-18.495262, 40.45085, 22.839746), (-19.802208, 38.8573, 24.45369), (-19.802208, 38.8573, 24.45369), (-18.495262, 40.45085, 22.839746), (-19.665255, 40.45085, 21.840479), (-21.054876, 38.8573, 23.38381), (-21.054876, 38.8573, 23.38381), (-19.665255, 40.45085, 21.840479), (-20.781347, 40.45085, 20.781347), (-22.249836, 38.8573, 22.249836), (-22.249836, 38.8573, 22.249836), (-20.781347, 40.45085, 20.781347), (-21.840479, 40.45085, 19.665255), (-23.38381, 38.8573, 21.054876), (-23.38381, 38.8573, 21.054876), (-21.840479, 40.45085, 19.665255), (-22.839746, 40.45085, 18.495262), (-24.45369, 38.8573, 19.802208), (-24.45369, 38.8573, 19.802208), (-22.839746, 40.45085, 18.495262), (-23.776413, 40.45085, 17.274574), (-25.456545, 38.8573, 18.495262), (-25.456545, 38.8573, 18.495262), (-23.776413, 40.45085, 17.274574), (-24.64791, 40.45085, 16.00654), (-26.389624, 38.8573, 17.137623), (-26.389624, 38.8573, 17.137623), (-24.64791, 40.45085, 16.00654), (-25.451847, 40.45085, 14.694632), (-27.250372, 38.8573, 15.733009), (-27.250372, 38.8573, 15.733009), (-25.451847, 40.45085, 14.694632), (-26.186026, 40.45085, 13.342446), (-28.036428, 38.8573, 14.285274), (-28.036428, 38.8573, 14.285274), (-26.186026, 40.45085, 13.342446), (-26.848427, 40.45085, 11.95369), (-28.74564, 38.8573, 12.798383), (-28.74564, 38.8573, 12.798383), (-26.848427, 40.45085, 11.95369), (-27.43724, 40.45085, 10.532169), (-29.37606, 38.8573, 11.276413), (-29.37606, 38.8573, 11.276413), (-27.43724, 40.45085, 10.532169), (-27.95085, 40.45085, 9.081781), (-29.925962, 38.8573, 9.723535), (-29.925962, 38.8573, 9.723535), (-27.95085, 40.45085, 9.081781), (-28.387848, 40.45085, 7.606501), (-30.39384, 38.8573, 8.144005), (-30.39384, 38.8573, 8.144005), (-28.387848, 40.45085, 7.606501), (-28.747036, 40.45085, 6.110371), (-30.778412, 38.8573, 6.5421534), (-30.778412, 38.8573, 6.5421534), (-28.747036, 40.45085, 6.110371), (-29.027431, 40.45085, 4.5974936), (-31.07862, 38.8573, 4.92237), (-31.07862, 38.8573, 4.92237), (-29.027431, 40.45085, 4.5974936), (-29.228266, 40.45085, 3.0720146), (-31.293646, 38.8573, 3.2890947), (-31.293646, 38.8573, 3.2890947), (-29.228266, 40.45085, 3.0720146), (-29.348986, 40.45085, 1.5381151), (-31.422897, 38.8573, 1.6468042), (-31.422897, 38.8573, 1.6468042), (-29.348986, 40.45085, 1.5381151), (-29.389263, 40.45085, 3.5991468e-15), (-31.466019, 38.8573, 3.853476e-15), (-31.466019, 38.8573, 3.853476e-15), (-29.389263, 40.45085, 3.5991468e-15), (-29.348986, 40.45085, -1.5381151), (-31.422897, 38.8573, -1.6468042), (-31.422897, 38.8573, -1.6468042), (-29.348986, 40.45085, -1.5381151), (-29.228266, 40.45085, -3.0720146), (-31.293646, 38.8573, -3.2890947), (-31.293646, 38.8573, -3.2890947), (-29.228266, 40.45085, -3.0720146), (-29.027431, 40.45085, -4.5974936), (-31.07862, 38.8573, -4.92237), (-31.07862, 38.8573, -4.92237), (-29.027431, 40.45085, -4.5974936), (-28.747036, 40.45085, -6.110371), (-30.778412, 38.8573, -6.5421534), (-30.778412, 38.8573, -6.5421534), (-28.747036, 40.45085, -6.110371), (-28.387848, 40.45085, -7.606501), (-30.39384, 38.8573, -8.144005), (-30.39384, 38.8573, -8.144005), (-28.387848, 40.45085, -7.606501), (-27.95085, 40.45085, -9.081781), (-29.925962, 38.8573, -9.723535), (-29.925962, 38.8573, -9.723535), (-27.95085, 40.45085, -9.081781), (-27.43724, 40.45085, -10.532169), (-29.37606, 38.8573, -11.276413), (-29.37606, 38.8573, -11.276413), (-27.43724, 40.45085, -10.532169), (-26.848427, 40.45085, -11.95369), (-28.74564, 38.8573, -12.798383), (-28.74564, 38.8573, -12.798383), (-26.848427, 40.45085, -11.95369), (-26.186026, 40.45085, -13.342446), (-28.036428, 38.8573, -14.285274), (-28.036428, 38.8573, -14.285274), (-26.186026, 40.45085, -13.342446), (-25.451847, 40.45085, -14.694632), (-27.250372, 38.8573, -15.733009), (-27.250372, 38.8573, -15.733009), (-25.451847, 40.45085, -14.694632), (-24.64791, 40.45085, -16.00654), (-26.389624, 38.8573, -17.137623), (-26.389624, 38.8573, -17.137623), (-24.64791, 40.45085, -16.00654), (-23.776413, 40.45085, -17.274574), (-25.456545, 38.8573, -18.495262), (-25.456545, 38.8573, -18.495262), (-23.776413, 40.45085, -17.274574), (-22.839746, 40.45085, -18.495262), (-24.45369, 38.8573, -19.802208), (-24.45369, 38.8573, -19.802208), (-22.839746, 40.45085, -18.495262), (-21.840479, 40.45085, -19.665255), (-23.38381, 38.8573, -21.054876), (-23.38381, 38.8573, -21.054876), (-21.840479, 40.45085, -19.665255), (-20.781347, 40.45085, -20.781347), (-22.249836, 38.8573, -22.249836), (-22.249836, 38.8573, -22.249836), (-20.781347, 40.45085, -20.781347), (-19.665255, 40.45085, -21.840479), (-21.054876, 38.8573, -23.38381), (-21.054876, 38.8573, -23.38381), (-19.665255, 40.45085, -21.840479), (-18.495262, 40.45085, -22.839746), (-19.802208, 38.8573, -24.45369), (-19.802208, 38.8573, -24.45369), (-18.495262, 40.45085, -22.839746), (-17.274574, 40.45085, -23.776413), (-18.495262, 38.8573, -25.456545), (-18.495262, 38.8573, -25.456545), (-17.274574, 40.45085, -23.776413), (-16.00654, 40.45085, -24.64791), (-17.137623, 38.8573, -26.389624), (-17.137623, 38.8573, -26.389624), (-16.00654, 40.45085, -24.64791), (-14.694632, 40.45085, -25.451847), (-15.733009, 38.8573, -27.250372), (-15.733009, 38.8573, -27.250372), (-14.694632, 40.45085, -25.451847), (-13.342446, 40.45085, -26.186026), (-14.285274, 38.8573, -28.036428), (-14.285274, 38.8573, -28.036428), (-13.342446, 40.45085, -26.186026), (-11.95369, 40.45085, -26.848427), (-12.798383, 38.8573, -28.74564), (-12.798383, 38.8573, -28.74564), (-11.95369, 40.45085, -26.848427), (-10.532169, 40.45085, -27.43724), (-11.276413, 38.8573, -29.37606), (-11.276413, 38.8573, -29.37606), (-10.532169, 40.45085, -27.43724), (-9.081781, 40.45085, -27.95085), (-9.723535, 38.8573, -29.925962), (-9.723535, 38.8573, -29.925962), (-9.081781, 40.45085, -27.95085), (-7.606501, 40.45085, -28.387848), (-8.144005, 38.8573, -30.39384), (-8.144005, 38.8573, -30.39384), (-7.606501, 40.45085, -28.387848), (-6.110371, 40.45085, -28.747036), (-6.5421534, 38.8573, -30.778412), (-6.5421534, 38.8573, -30.778412), (-6.110371, 40.45085, -28.747036), (-4.5974936, 40.45085, -29.027431), (-4.92237, 38.8573, -31.07862), (-4.92237, 38.8573, -31.07862), (-4.5974936, 40.45085, -29.027431), (-3.0720146, 40.45085, -29.228266), (-3.2890947, 38.8573, -31.293646), (-3.2890947, 38.8573, -31.293646), (-3.0720146, 40.45085, -29.228266), (-1.5381151, 40.45085, -29.348986), (-1.6468042, 38.8573, -31.422897), (-1.6468042, 38.8573, -31.422897), (-1.5381151, 40.45085, -29.348986), (-5.39872e-15, 40.45085, -29.389263), (-5.780214e-15, 38.8573, -31.466019), (-5.780214e-15, 38.8573, -31.466019), (-5.39872e-15, 40.45085, -29.389263), (1.5381151, 40.45085, -29.348986), (1.6468042, 38.8573, -31.422897), (1.6468042, 38.8573, -31.422897), (1.5381151, 40.45085, -29.348986), (3.0720146, 40.45085, -29.228266), (3.2890947, 38.8573, -31.293646), (3.2890947, 38.8573, -31.293646), (3.0720146, 40.45085, -29.228266), (4.5974936, 40.45085, -29.027431), (4.92237, 38.8573, -31.07862), (4.92237, 38.8573, -31.07862), (4.5974936, 40.45085, -29.027431), (6.110371, 40.45085, -28.747036), (6.5421534, 38.8573, -30.778412), (6.5421534, 38.8573, -30.778412), (6.110371, 40.45085, -28.747036), (7.606501, 40.45085, -28.387848), (8.144005, 38.8573, -30.39384), (8.144005, 38.8573, -30.39384), (7.606501, 40.45085, -28.387848), (9.081781, 40.45085, -27.95085), (9.723535, 38.8573, -29.925962), (9.723535, 38.8573, -29.925962), (9.081781, 40.45085, -27.95085), (10.532169, 40.45085, -27.43724), (11.276413, 38.8573, -29.37606), (11.276413, 38.8573, -29.37606), (10.532169, 40.45085, -27.43724), (11.95369, 40.45085, -26.848427), (12.798383, 38.8573, -28.74564), (12.798383, 38.8573, -28.74564), (11.95369, 40.45085, -26.848427), (13.342446, 40.45085, -26.186026), (14.285274, 38.8573, -28.036428), (14.285274, 38.8573, -28.036428), (13.342446, 40.45085, -26.186026), (14.694632, 40.45085, -25.451847), (15.733009, 38.8573, -27.250372), (15.733009, 38.8573, -27.250372), (14.694632, 40.45085, -25.451847), (16.00654, 40.45085, -24.64791), (17.137623, 38.8573, -26.389624), (17.137623, 38.8573, -26.389624), (16.00654, 40.45085, -24.64791), (17.274574, 40.45085, -23.776413), (18.495262, 38.8573, -25.456545), (18.495262, 38.8573, -25.456545), (17.274574, 40.45085, -23.776413), (18.495262, 40.45085, -22.839746), (19.802208, 38.8573, -24.45369), (19.802208, 38.8573, -24.45369), (18.495262, 40.45085, -22.839746), (19.665255, 40.45085, -21.840479), (21.054876, 38.8573, -23.38381), (21.054876, 38.8573, -23.38381), (19.665255, 40.45085, -21.840479), (20.781347, 40.45085, -20.781347), (22.249836, 38.8573, -22.249836), (22.249836, 38.8573, -22.249836), (20.781347, 40.45085, -20.781347), (21.840479, 40.45085, -19.665255), (23.38381, 38.8573, -21.054876), (23.38381, 38.8573, -21.054876), (21.840479, 40.45085, -19.665255), (22.839746, 40.45085, -18.495262), (24.45369, 38.8573, -19.802208), (24.45369, 38.8573, -19.802208), (22.839746, 40.45085, -18.495262), (23.776413, 40.45085, -17.274574), (25.456545, 38.8573, -18.495262), (25.456545, 38.8573, -18.495262), (23.776413, 40.45085, -17.274574), (24.64791, 40.45085, -16.00654), (26.389624, 38.8573, -17.137623), (26.389624, 38.8573, -17.137623), (24.64791, 40.45085, -16.00654), (25.451847, 40.45085, -14.694632), (27.250372, 38.8573, -15.733009), (27.250372, 38.8573, -15.733009), (25.451847, 40.45085, -14.694632), (26.186026, 40.45085, -13.342446), (28.036428, 38.8573, -14.285274), (28.036428, 38.8573, -14.285274), (26.186026, 40.45085, -13.342446), (26.848427, 40.45085, -11.95369), (28.74564, 38.8573, -12.798383), (28.74564, 38.8573, -12.798383), (26.848427, 40.45085, -11.95369), (27.43724, 40.45085, -10.532169), (29.37606, 38.8573, -11.276413), (29.37606, 38.8573, -11.276413), (27.43724, 40.45085, -10.532169), (27.95085, 40.45085, -9.081781), (29.925962, 38.8573, -9.723535), (29.925962, 38.8573, -9.723535), (27.95085, 40.45085, -9.081781), (28.387848, 40.45085, -7.606501), (30.39384, 38.8573, -8.144005), (30.39384, 38.8573, -8.144005), (28.387848, 40.45085, -7.606501), (28.747036, 40.45085, -6.110371), (30.778412, 38.8573, -6.5421534), (30.778412, 38.8573, -6.5421534), (28.747036, 40.45085, -6.110371), (29.027431, 40.45085, -4.5974936), (31.07862, 38.8573, -4.92237), (31.07862, 38.8573, -4.92237), (29.027431, 40.45085, -4.5974936), (29.228266, 40.45085, -3.0720146), (31.293646, 38.8573, -3.2890947), (31.293646, 38.8573, -3.2890947), (29.228266, 40.45085, -3.0720146), (29.348986, 40.45085, -1.5381151), (31.422897, 38.8573, -1.6468042), (31.422897, 38.8573, -1.6468042), (29.348986, 40.45085, -1.5381151), (29.389263, 40.45085, 0), (31.466019, 38.8573, 0), (29.389263, 40.45085, 0), (27.231953, 41.93353, 0), (27.194632, 41.93353, 1.4252102), (29.348986, 40.45085, 1.5381151), (29.348986, 40.45085, 1.5381151), (27.194632, 41.93353, 1.4252102), (27.082773, 41.93353, 2.846514), (29.228266, 40.45085, 3.0720146), (29.228266, 40.45085, 3.0720146), (27.082773, 41.93353, 2.846514), (26.89668, 41.93353, 4.260016), (29.027431, 40.45085, 4.5974936), (29.027431, 40.45085, 4.5974936), (26.89668, 41.93353, 4.260016), (26.636868, 41.93353, 5.661841), (28.747036, 40.45085, 6.110371), (28.747036, 40.45085, 6.110371), (26.636868, 41.93353, 5.661841), (26.304045, 41.93353, 7.0481477), (28.387848, 40.45085, 7.606501), (28.387848, 40.45085, 7.606501), (26.304045, 41.93353, 7.0481477), (25.899126, 41.93353, 8.415136), (27.95085, 40.45085, 9.081781), (27.95085, 40.45085, 9.081781), (25.899126, 41.93353, 8.415136), (25.423218, 41.93353, 9.759059), (27.43724, 40.45085, 10.532169), (27.43724, 40.45085, 10.532169), (25.423218, 41.93353, 9.759059), (24.877626, 41.93353, 11.076233), (26.848427, 40.45085, 11.95369), (26.848427, 40.45085, 11.95369), (24.877626, 41.93353, 11.076233), (24.263847, 41.93353, 12.363048), (26.186026, 40.45085, 13.342446), (26.186026, 40.45085, 13.342446), (24.263847, 41.93353, 12.363048), (23.583563, 41.93353, 13.615976), (25.451847, 40.45085, 14.694632), (25.451847, 40.45085, 14.694632), (23.583563, 41.93353, 13.615976), (22.838636, 41.93353, 14.831584), (24.64791, 40.45085, 16.00654), (24.64791, 40.45085, 16.00654), (22.838636, 41.93353, 14.831584), (22.031113, 41.93353, 16.00654), (23.776413, 40.45085, 17.274574), (23.776413, 40.45085, 17.274574), (22.031113, 41.93353, 16.00654), (21.1632, 41.93353, 17.137623), (22.839746, 40.45085, 18.495262), (22.839746, 40.45085, 18.495262), (21.1632, 41.93353, 17.137623), (20.237284, 41.93353, 18.221733), (21.840479, 40.45085, 19.665255), (21.840479, 40.45085, 19.665255), (20.237284, 41.93353, 18.221733), (19.255898, 41.93353, 19.255898), (20.781347, 40.45085, 20.781347), (20.781347, 40.45085, 20.781347), (19.255898, 41.93353, 19.255898), (18.221733, 41.93353, 20.237284), (19.665255, 40.45085, 21.840479), (19.665255, 40.45085, 21.840479), (18.221733, 41.93353, 20.237284), (17.137623, 41.93353, 21.1632), (18.495262, 40.45085, 22.839746), (18.495262, 40.45085, 22.839746), (17.137623, 41.93353, 21.1632), (16.00654, 41.93353, 22.031113), (17.274574, 40.45085, 23.776413), (17.274574, 40.45085, 23.776413), (16.00654, 41.93353, 22.031113), (14.831584, 41.93353, 22.838636), (16.00654, 40.45085, 24.64791), (16.00654, 40.45085, 24.64791), (14.831584, 41.93353, 22.838636), (13.615976, 41.93353, 23.583563), (14.694632, 40.45085, 25.451847), (14.694632, 40.45085, 25.451847), (13.615976, 41.93353, 23.583563), (12.363048, 41.93353, 24.263847), (13.342446, 40.45085, 26.186026), (13.342446, 40.45085, 26.186026), (12.363048, 41.93353, 24.263847), (11.076233, 41.93353, 24.877626), (11.95369, 40.45085, 26.848427), (11.95369, 40.45085, 26.848427), (11.076233, 41.93353, 24.877626), (9.759059, 41.93353, 25.423218), (10.532169, 40.45085, 27.43724), (10.532169, 40.45085, 27.43724), (9.759059, 41.93353, 25.423218), (8.415136, 41.93353, 25.899126), (9.081781, 40.45085, 27.95085), (9.081781, 40.45085, 27.95085), (8.415136, 41.93353, 25.899126), (7.0481477, 41.93353, 26.304045), (7.606501, 40.45085, 28.387848), (7.606501, 40.45085, 28.387848), (7.0481477, 41.93353, 26.304045), (5.661841, 41.93353, 26.636868), (6.110371, 40.45085, 28.747036), (6.110371, 40.45085, 28.747036), (5.661841, 41.93353, 26.636868), (4.260016, 41.93353, 26.89668), (4.5974936, 40.45085, 29.027431), (4.5974936, 40.45085, 29.027431), (4.260016, 41.93353, 26.89668), (2.846514, 41.93353, 27.082773), (3.0720146, 40.45085, 29.228266), (3.0720146, 40.45085, 29.228266), (2.846514, 41.93353, 27.082773), (1.4252102, 41.93353, 27.194632), (1.5381151, 40.45085, 29.348986), (1.5381151, 40.45085, 29.348986), (1.4252102, 41.93353, 27.194632), (1.6674762e-15, 41.93353, 27.231953), (1.7995734e-15, 40.45085, 29.389263), (1.7995734e-15, 40.45085, 29.389263), (1.6674762e-15, 41.93353, 27.231953), (-1.4252102, 41.93353, 27.194632), (-1.5381151, 40.45085, 29.348986), (-1.5381151, 40.45085, 29.348986), (-1.4252102, 41.93353, 27.194632), (-2.846514, 41.93353, 27.082773), (-3.0720146, 40.45085, 29.228266), (-3.0720146, 40.45085, 29.228266), (-2.846514, 41.93353, 27.082773), (-4.260016, 41.93353, 26.89668), (-4.5974936, 40.45085, 29.027431), (-4.5974936, 40.45085, 29.027431), (-4.260016, 41.93353, 26.89668), (-5.661841, 41.93353, 26.636868), (-6.110371, 40.45085, 28.747036), (-6.110371, 40.45085, 28.747036), (-5.661841, 41.93353, 26.636868), (-7.0481477, 41.93353, 26.304045), (-7.606501, 40.45085, 28.387848), (-7.606501, 40.45085, 28.387848), (-7.0481477, 41.93353, 26.304045), (-8.415136, 41.93353, 25.899126), (-9.081781, 40.45085, 27.95085), (-9.081781, 40.45085, 27.95085), (-8.415136, 41.93353, 25.899126), (-9.759059, 41.93353, 25.423218), (-10.532169, 40.45085, 27.43724), (-10.532169, 40.45085, 27.43724), (-9.759059, 41.93353, 25.423218), (-11.076233, 41.93353, 24.877626), (-11.95369, 40.45085, 26.848427), (-11.95369, 40.45085, 26.848427), (-11.076233, 41.93353, 24.877626), (-12.363048, 41.93353, 24.263847), (-13.342446, 40.45085, 26.186026), (-13.342446, 40.45085, 26.186026), (-12.363048, 41.93353, 24.263847), (-13.615976, 41.93353, 23.583563), (-14.694632, 40.45085, 25.451847), (-14.694632, 40.45085, 25.451847), (-13.615976, 41.93353, 23.583563), (-14.831584, 41.93353, 22.838636), (-16.00654, 40.45085, 24.64791), (-16.00654, 40.45085, 24.64791), (-14.831584, 41.93353, 22.838636), (-16.00654, 41.93353, 22.031113), (-17.274574, 40.45085, 23.776413), (-17.274574, 40.45085, 23.776413), (-16.00654, 41.93353, 22.031113), (-17.137623, 41.93353, 21.1632), (-18.495262, 40.45085, 22.839746), (-18.495262, 40.45085, 22.839746), (-17.137623, 41.93353, 21.1632), (-18.221733, 41.93353, 20.237284), (-19.665255, 40.45085, 21.840479), (-19.665255, 40.45085, 21.840479), (-18.221733, 41.93353, 20.237284), (-19.255898, 41.93353, 19.255898), (-20.781347, 40.45085, 20.781347), (-20.781347, 40.45085, 20.781347), (-19.255898, 41.93353, 19.255898), (-20.237284, 41.93353, 18.221733), (-21.840479, 40.45085, 19.665255), (-21.840479, 40.45085, 19.665255), (-20.237284, 41.93353, 18.221733), (-21.1632, 41.93353, 17.137623), (-22.839746, 40.45085, 18.495262), (-22.839746, 40.45085, 18.495262), (-21.1632, 41.93353, 17.137623), (-22.031113, 41.93353, 16.00654), (-23.776413, 40.45085, 17.274574), (-23.776413, 40.45085, 17.274574), (-22.031113, 41.93353, 16.00654), (-22.838636, 41.93353, 14.831584), (-24.64791, 40.45085, 16.00654), (-24.64791, 40.45085, 16.00654), (-22.838636, 41.93353, 14.831584), (-23.583563, 41.93353, 13.615976), (-25.451847, 40.45085, 14.694632), (-25.451847, 40.45085, 14.694632), (-23.583563, 41.93353, 13.615976), (-24.263847, 41.93353, 12.363048), (-26.186026, 40.45085, 13.342446), (-26.186026, 40.45085, 13.342446), (-24.263847, 41.93353, 12.363048), (-24.877626, 41.93353, 11.076233), (-26.848427, 40.45085, 11.95369), (-26.848427, 40.45085, 11.95369), (-24.877626, 41.93353, 11.076233), (-25.423218, 41.93353, 9.759059), (-27.43724, 40.45085, 10.532169), (-27.43724, 40.45085, 10.532169), (-25.423218, 41.93353, 9.759059), (-25.899126, 41.93353, 8.415136), (-27.95085, 40.45085, 9.081781), (-27.95085, 40.45085, 9.081781), (-25.899126, 41.93353, 8.415136), (-26.304045, 41.93353, 7.0481477), (-28.387848, 40.45085, 7.606501), (-28.387848, 40.45085, 7.606501), (-26.304045, 41.93353, 7.0481477), (-26.636868, 41.93353, 5.661841), (-28.747036, 40.45085, 6.110371), (-28.747036, 40.45085, 6.110371), (-26.636868, 41.93353, 5.661841), (-26.89668, 41.93353, 4.260016), (-29.027431, 40.45085, 4.5974936), (-29.027431, 40.45085, 4.5974936), (-26.89668, 41.93353, 4.260016), (-27.082773, 41.93353, 2.846514), (-29.228266, 40.45085, 3.0720146), (-29.228266, 40.45085, 3.0720146), (-27.082773, 41.93353, 2.846514), (-27.194632, 41.93353, 1.4252102), (-29.348986, 40.45085, 1.5381151), (-29.348986, 40.45085, 1.5381151), (-27.194632, 41.93353, 1.4252102), (-27.231953, 41.93353, 3.3349523e-15), (-29.389263, 40.45085, 3.5991468e-15), (-29.389263, 40.45085, 3.5991468e-15), (-27.231953, 41.93353, 3.3349523e-15), (-27.194632, 41.93353, -1.4252102), (-29.348986, 40.45085, -1.5381151), (-29.348986, 40.45085, -1.5381151), (-27.194632, 41.93353, -1.4252102), (-27.082773, 41.93353, -2.846514), (-29.228266, 40.45085, -3.0720146), (-29.228266, 40.45085, -3.0720146), (-27.082773, 41.93353, -2.846514), (-26.89668, 41.93353, -4.260016), (-29.027431, 40.45085, -4.5974936), (-29.027431, 40.45085, -4.5974936), (-26.89668, 41.93353, -4.260016), (-26.636868, 41.93353, -5.661841), (-28.747036, 40.45085, -6.110371), (-28.747036, 40.45085, -6.110371), (-26.636868, 41.93353, -5.661841), (-26.304045, 41.93353, -7.0481477), (-28.387848, 40.45085, -7.606501), (-28.387848, 40.45085, -7.606501), (-26.304045, 41.93353, -7.0481477), (-25.899126, 41.93353, -8.415136), (-27.95085, 40.45085, -9.081781), (-27.95085, 40.45085, -9.081781), (-25.899126, 41.93353, -8.415136), (-25.423218, 41.93353, -9.759059), (-27.43724, 40.45085, -10.532169), (-27.43724, 40.45085, -10.532169), (-25.423218, 41.93353, -9.759059), (-24.877626, 41.93353, -11.076233), (-26.848427, 40.45085, -11.95369), (-26.848427, 40.45085, -11.95369), (-24.877626, 41.93353, -11.076233), (-24.263847, 41.93353, -12.363048), (-26.186026, 40.45085, -13.342446), (-26.186026, 40.45085, -13.342446), (-24.263847, 41.93353, -12.363048), (-23.583563, 41.93353, -13.615976), (-25.451847, 40.45085, -14.694632), (-25.451847, 40.45085, -14.694632), (-23.583563, 41.93353, -13.615976), (-22.838636, 41.93353, -14.831584), (-24.64791, 40.45085, -16.00654), (-24.64791, 40.45085, -16.00654), (-22.838636, 41.93353, -14.831584), (-22.031113, 41.93353, -16.00654), (-23.776413, 40.45085, -17.274574), (-23.776413, 40.45085, -17.274574), (-22.031113, 41.93353, -16.00654), (-21.1632, 41.93353, -17.137623), (-22.839746, 40.45085, -18.495262), (-22.839746, 40.45085, -18.495262), (-21.1632, 41.93353, -17.137623), (-20.237284, 41.93353, -18.221733), (-21.840479, 40.45085, -19.665255), (-21.840479, 40.45085, -19.665255), (-20.237284, 41.93353, -18.221733), (-19.255898, 41.93353, -19.255898), (-20.781347, 40.45085, -20.781347), (-20.781347, 40.45085, -20.781347), (-19.255898, 41.93353, -19.255898), (-18.221733, 41.93353, -20.237284), (-19.665255, 40.45085, -21.840479), (-19.665255, 40.45085, -21.840479), (-18.221733, 41.93353, -20.237284), (-17.137623, 41.93353, -21.1632), (-18.495262, 40.45085, -22.839746), (-18.495262, 40.45085, -22.839746), (-17.137623, 41.93353, -21.1632), (-16.00654, 41.93353, -22.031113), (-17.274574, 40.45085, -23.776413), (-17.274574, 40.45085, -23.776413), (-16.00654, 41.93353, -22.031113), (-14.831584, 41.93353, -22.838636), (-16.00654, 40.45085, -24.64791), (-16.00654, 40.45085, -24.64791), (-14.831584, 41.93353, -22.838636), (-13.615976, 41.93353, -23.583563), (-14.694632, 40.45085, -25.451847), (-14.694632, 40.45085, -25.451847), (-13.615976, 41.93353, -23.583563), (-12.363048, 41.93353, -24.263847), (-13.342446, 40.45085, -26.186026), (-13.342446, 40.45085, -26.186026), (-12.363048, 41.93353, -24.263847), (-11.076233, 41.93353, -24.877626), (-11.95369, 40.45085, -26.848427), (-11.95369, 40.45085, -26.848427), (-11.076233, 41.93353, -24.877626), (-9.759059, 41.93353, -25.423218), (-10.532169, 40.45085, -27.43724), (-10.532169, 40.45085, -27.43724), (-9.759059, 41.93353, -25.423218), (-8.415136, 41.93353, -25.899126), (-9.081781, 40.45085, -27.95085), (-9.081781, 40.45085, -27.95085), (-8.415136, 41.93353, -25.899126), (-7.0481477, 41.93353, -26.304045), (-7.606501, 40.45085, -28.387848), (-7.606501, 40.45085, -28.387848), (-7.0481477, 41.93353, -26.304045), (-5.661841, 41.93353, -26.636868), (-6.110371, 40.45085, -28.747036), (-6.110371, 40.45085, -28.747036), (-5.661841, 41.93353, -26.636868), (-4.260016, 41.93353, -26.89668), (-4.5974936, 40.45085, -29.027431), (-4.5974936, 40.45085, -29.027431), (-4.260016, 41.93353, -26.89668), (-2.846514, 41.93353, -27.082773), (-3.0720146, 40.45085, -29.228266), (-3.0720146, 40.45085, -29.228266), (-2.846514, 41.93353, -27.082773), (-1.4252102, 41.93353, -27.194632), (-1.5381151, 40.45085, -29.348986), (-1.5381151, 40.45085, -29.348986), (-1.4252102, 41.93353, -27.194632), (-5.0024284e-15, 41.93353, -27.231953), (-5.39872e-15, 40.45085, -29.389263), (-5.39872e-15, 40.45085, -29.389263), (-5.0024284e-15, 41.93353, -27.231953), (1.4252102, 41.93353, -27.194632), (1.5381151, 40.45085, -29.348986), (1.5381151, 40.45085, -29.348986), (1.4252102, 41.93353, -27.194632), (2.846514, 41.93353, -27.082773), (3.0720146, 40.45085, -29.228266), (3.0720146, 40.45085, -29.228266), (2.846514, 41.93353, -27.082773), (4.260016, 41.93353, -26.89668), (4.5974936, 40.45085, -29.027431), (4.5974936, 40.45085, -29.027431), (4.260016, 41.93353, -26.89668), (5.661841, 41.93353, -26.636868), (6.110371, 40.45085, -28.747036), (6.110371, 40.45085, -28.747036), (5.661841, 41.93353, -26.636868), (7.0481477, 41.93353, -26.304045), (7.606501, 40.45085, -28.387848), (7.606501, 40.45085, -28.387848), (7.0481477, 41.93353, -26.304045), (8.415136, 41.93353, -25.899126), (9.081781, 40.45085, -27.95085), (9.081781, 40.45085, -27.95085), (8.415136, 41.93353, -25.899126), (9.759059, 41.93353, -25.423218), (10.532169, 40.45085, -27.43724), (10.532169, 40.45085, -27.43724), (9.759059, 41.93353, -25.423218), (11.076233, 41.93353, -24.877626), (11.95369, 40.45085, -26.848427), (11.95369, 40.45085, -26.848427), (11.076233, 41.93353, -24.877626), (12.363048, 41.93353, -24.263847), (13.342446, 40.45085, -26.186026), (13.342446, 40.45085, -26.186026), (12.363048, 41.93353, -24.263847), (13.615976, 41.93353, -23.583563), (14.694632, 40.45085, -25.451847), (14.694632, 40.45085, -25.451847), (13.615976, 41.93353, -23.583563), (14.831584, 41.93353, -22.838636), (16.00654, 40.45085, -24.64791), (16.00654, 40.45085, -24.64791), (14.831584, 41.93353, -22.838636), (16.00654, 41.93353, -22.031113), (17.274574, 40.45085, -23.776413), (17.274574, 40.45085, -23.776413), (16.00654, 41.93353, -22.031113), (17.137623, 41.93353, -21.1632), (18.495262, 40.45085, -22.839746), (18.495262, 40.45085, -22.839746), (17.137623, 41.93353, -21.1632), (18.221733, 41.93353, -20.237284), (19.665255, 40.45085, -21.840479), (19.665255, 40.45085, -21.840479), (18.221733, 41.93353, -20.237284), (19.255898, 41.93353, -19.255898), (20.781347, 40.45085, -20.781347), (20.781347, 40.45085, -20.781347), (19.255898, 41.93353, -19.255898), (20.237284, 41.93353, -18.221733), (21.840479, 40.45085, -19.665255), (21.840479, 40.45085, -19.665255), (20.237284, 41.93353, -18.221733), (21.1632, 41.93353, -17.137623), (22.839746, 40.45085, -18.495262), (22.839746, 40.45085, -18.495262), (21.1632, 41.93353, -17.137623), (22.031113, 41.93353, -16.00654), (23.776413, 40.45085, -17.274574), (23.776413, 40.45085, -17.274574), (22.031113, 41.93353, -16.00654), (22.838636, 41.93353, -14.831584), (24.64791, 40.45085, -16.00654), (24.64791, 40.45085, -16.00654), (22.838636, 41.93353, -14.831584), (23.583563, 41.93353, -13.615976), (25.451847, 40.45085, -14.694632), (25.451847, 40.45085, -14.694632), (23.583563, 41.93353, -13.615976), (24.263847, 41.93353, -12.363048), (26.186026, 40.45085, -13.342446), (26.186026, 40.45085, -13.342446), (24.263847, 41.93353, -12.363048), (24.877626, 41.93353, -11.076233), (26.848427, 40.45085, -11.95369), (26.848427, 40.45085, -11.95369), (24.877626, 41.93353, -11.076233), (25.423218, 41.93353, -9.759059), (27.43724, 40.45085, -10.532169), (27.43724, 40.45085, -10.532169), (25.423218, 41.93353, -9.759059), (25.899126, 41.93353, -8.415136), (27.95085, 40.45085, -9.081781), (27.95085, 40.45085, -9.081781), (25.899126, 41.93353, -8.415136), (26.304045, 41.93353, -7.0481477), (28.387848, 40.45085, -7.606501), (28.387848, 40.45085, -7.606501), (26.304045, 41.93353, -7.0481477), (26.636868, 41.93353, -5.661841), (28.747036, 40.45085, -6.110371), (28.747036, 40.45085, -6.110371), (26.636868, 41.93353, -5.661841), (26.89668, 41.93353, -4.260016), (29.027431, 40.45085, -4.5974936), (29.027431, 40.45085, -4.5974936), (26.89668, 41.93353, -4.260016), (27.082773, 41.93353, -2.846514), (29.228266, 40.45085, -3.0720146), (29.228266, 40.45085, -3.0720146), (27.082773, 41.93353, -2.846514), (27.194632, 41.93353, -1.4252102), (29.348986, 40.45085, -1.5381151), (29.348986, 40.45085, -1.5381151), (27.194632, 41.93353, -1.4252102), (27.231953, 41.93353, 0), (29.389263, 40.45085, 0), (27.231953, 41.93353, 0), (25, 43.30127, 0), (24.965738, 43.30127, 1.308399), (27.194632, 41.93353, 1.4252102), (27.194632, 41.93353, 1.4252102), (24.965738, 43.30127, 1.308399), (24.863047, 43.30127, 2.6132116), (27.082773, 41.93353, 2.846514), (27.082773, 41.93353, 2.846514), (24.863047, 43.30127, 2.6132116), (24.69221, 43.30127, 3.9108617), (26.89668, 41.93353, 4.260016), (26.89668, 41.93353, 4.260016), (24.69221, 43.30127, 3.9108617), (24.45369, 43.30127, 5.197792), (26.636868, 41.93353, 5.661841), (26.636868, 41.93353, 5.661841), (24.45369, 43.30127, 5.197792), (24.148146, 43.30127, 6.470476), (26.304045, 41.93353, 7.0481477), (26.304045, 41.93353, 7.0481477), (24.148146, 43.30127, 6.470476), (23.776413, 43.30127, 7.725425), (25.899126, 41.93353, 8.415136), (25.899126, 41.93353, 8.415136), (23.776413, 43.30127, 7.725425), (23.33951, 43.30127, 8.959199), (25.423218, 41.93353, 9.759059), (25.423218, 41.93353, 9.759059), (23.33951, 43.30127, 8.959199), (22.838636, 43.30127, 10.168416), (24.877626, 41.93353, 11.076233), (24.877626, 41.93353, 11.076233), (22.838636, 43.30127, 10.168416), (22.275164, 43.30127, 11.349763), (24.263847, 41.93353, 12.363048), (24.263847, 41.93353, 12.363048), (22.275164, 43.30127, 11.349763), (21.650635, 43.30127, 12.5), (23.583563, 41.93353, 13.615976), (23.583563, 41.93353, 13.615976), (21.650635, 43.30127, 12.5), (20.966764, 43.30127, 13.615976), (22.838636, 41.93353, 14.831584), (22.838636, 41.93353, 14.831584), (20.966764, 43.30127, 13.615976), (20.225426, 43.30127, 14.694632), (22.031113, 41.93353, 16.00654), (22.031113, 41.93353, 16.00654), (20.225426, 43.30127, 14.694632), (19.42865, 43.30127, 15.733009), (21.1632, 41.93353, 17.137623), (21.1632, 41.93353, 17.137623), (19.42865, 43.30127, 15.733009), (18.57862, 43.30127, 16.728266), (20.237284, 41.93353, 18.221733), (20.237284, 41.93353, 18.221733), (18.57862, 43.30127, 16.728266), (17.67767, 43.30127, 17.67767), (19.255898, 41.93353, 19.255898), (19.255898, 41.93353, 19.255898), (17.67767, 43.30127, 17.67767), (16.728266, 43.30127, 18.57862), (18.221733, 41.93353, 20.237284), (18.221733, 41.93353, 20.237284), (16.728266, 43.30127, 18.57862), (15.733009, 43.30127, 19.42865), (17.137623, 41.93353, 21.1632), (17.137623, 41.93353, 21.1632), (15.733009, 43.30127, 19.42865), (14.694632, 43.30127, 20.225426), (16.00654, 41.93353, 22.031113), (16.00654, 41.93353, 22.031113), (14.694632, 43.30127, 20.225426), (13.615976, 43.30127, 20.966764), (14.831584, 41.93353, 22.838636), (14.831584, 41.93353, 22.838636), (13.615976, 43.30127, 20.966764), (12.5, 43.30127, 21.650635), (13.615976, 41.93353, 23.583563), (13.615976, 41.93353, 23.583563), (12.5, 43.30127, 21.650635), (11.349763, 43.30127, 22.275164), (12.363048, 41.93353, 24.263847), (12.363048, 41.93353, 24.263847), (11.349763, 43.30127, 22.275164), (10.168416, 43.30127, 22.838636), (11.076233, 41.93353, 24.877626), (11.076233, 41.93353, 24.877626), (10.168416, 43.30127, 22.838636), (8.959199, 43.30127, 23.33951), (9.759059, 41.93353, 25.423218), (9.759059, 41.93353, 25.423218), (8.959199, 43.30127, 23.33951), (7.725425, 43.30127, 23.776413), (8.415136, 41.93353, 25.899126), (8.415136, 41.93353, 25.899126), (7.725425, 43.30127, 23.776413), (6.470476, 43.30127, 24.148146), (7.0481477, 41.93353, 26.304045), (7.0481477, 41.93353, 26.304045), (6.470476, 43.30127, 24.148146), (5.197792, 43.30127, 24.45369), (5.661841, 41.93353, 26.636868), (5.661841, 41.93353, 26.636868), (5.197792, 43.30127, 24.45369), (3.9108617, 43.30127, 24.69221), (4.260016, 41.93353, 26.89668), (4.260016, 41.93353, 26.89668), (3.9108617, 43.30127, 24.69221), (2.6132116, 43.30127, 24.863047), (2.846514, 41.93353, 27.082773), (2.846514, 41.93353, 27.082773), (2.6132116, 43.30127, 24.863047), (1.308399, 43.30127, 24.965738), (1.4252102, 41.93353, 27.194632), (1.4252102, 41.93353, 27.194632), (1.308399, 43.30127, 24.965738), (1.5308084e-15, 43.30127, 25), (1.6674762e-15, 41.93353, 27.231953), (1.6674762e-15, 41.93353, 27.231953), (1.5308084e-15, 43.30127, 25), (-1.308399, 43.30127, 24.965738), (-1.4252102, 41.93353, 27.194632), (-1.4252102, 41.93353, 27.194632), (-1.308399, 43.30127, 24.965738), (-2.6132116, 43.30127, 24.863047), (-2.846514, 41.93353, 27.082773), (-2.846514, 41.93353, 27.082773), (-2.6132116, 43.30127, 24.863047), (-3.9108617, 43.30127, 24.69221), (-4.260016, 41.93353, 26.89668), (-4.260016, 41.93353, 26.89668), (-3.9108617, 43.30127, 24.69221), (-5.197792, 43.30127, 24.45369), (-5.661841, 41.93353, 26.636868), (-5.661841, 41.93353, 26.636868), (-5.197792, 43.30127, 24.45369), (-6.470476, 43.30127, 24.148146), (-7.0481477, 41.93353, 26.304045), (-7.0481477, 41.93353, 26.304045), (-6.470476, 43.30127, 24.148146), (-7.725425, 43.30127, 23.776413), (-8.415136, 41.93353, 25.899126), (-8.415136, 41.93353, 25.899126), (-7.725425, 43.30127, 23.776413), (-8.959199, 43.30127, 23.33951), (-9.759059, 41.93353, 25.423218), (-9.759059, 41.93353, 25.423218), (-8.959199, 43.30127, 23.33951), (-10.168416, 43.30127, 22.838636), (-11.076233, 41.93353, 24.877626), (-11.076233, 41.93353, 24.877626), (-10.168416, 43.30127, 22.838636), (-11.349763, 43.30127, 22.275164), (-12.363048, 41.93353, 24.263847), (-12.363048, 41.93353, 24.263847), (-11.349763, 43.30127, 22.275164), (-12.5, 43.30127, 21.650635), (-13.615976, 41.93353, 23.583563), (-13.615976, 41.93353, 23.583563), (-12.5, 43.30127, 21.650635), (-13.615976, 43.30127, 20.966764), (-14.831584, 41.93353, 22.838636), (-14.831584, 41.93353, 22.838636), (-13.615976, 43.30127, 20.966764), (-14.694632, 43.30127, 20.225426), (-16.00654, 41.93353, 22.031113), (-16.00654, 41.93353, 22.031113), (-14.694632, 43.30127, 20.225426), (-15.733009, 43.30127, 19.42865), (-17.137623, 41.93353, 21.1632), (-17.137623, 41.93353, 21.1632), (-15.733009, 43.30127, 19.42865), (-16.728266, 43.30127, 18.57862), (-18.221733, 41.93353, 20.237284), (-18.221733, 41.93353, 20.237284), (-16.728266, 43.30127, 18.57862), (-17.67767, 43.30127, 17.67767), (-19.255898, 41.93353, 19.255898), (-19.255898, 41.93353, 19.255898), (-17.67767, 43.30127, 17.67767), (-18.57862, 43.30127, 16.728266), (-20.237284, 41.93353, 18.221733), (-20.237284, 41.93353, 18.221733), (-18.57862, 43.30127, 16.728266), (-19.42865, 43.30127, 15.733009), (-21.1632, 41.93353, 17.137623), (-21.1632, 41.93353, 17.137623), (-19.42865, 43.30127, 15.733009), (-20.225426, 43.30127, 14.694632), (-22.031113, 41.93353, 16.00654), (-22.031113, 41.93353, 16.00654), (-20.225426, 43.30127, 14.694632), (-20.966764, 43.30127, 13.615976), (-22.838636, 41.93353, 14.831584), (-22.838636, 41.93353, 14.831584), (-20.966764, 43.30127, 13.615976), (-21.650635, 43.30127, 12.5), (-23.583563, 41.93353, 13.615976), (-23.583563, 41.93353, 13.615976), (-21.650635, 43.30127, 12.5), (-22.275164, 43.30127, 11.349763), (-24.263847, 41.93353, 12.363048), (-24.263847, 41.93353, 12.363048), (-22.275164, 43.30127, 11.349763), (-22.838636, 43.30127, 10.168416), (-24.877626, 41.93353, 11.076233), (-24.877626, 41.93353, 11.076233), (-22.838636, 43.30127, 10.168416), (-23.33951, 43.30127, 8.959199), (-25.423218, 41.93353, 9.759059), (-25.423218, 41.93353, 9.759059), (-23.33951, 43.30127, 8.959199), (-23.776413, 43.30127, 7.725425), (-25.899126, 41.93353, 8.415136), (-25.899126, 41.93353, 8.415136), (-23.776413, 43.30127, 7.725425), (-24.148146, 43.30127, 6.470476), (-26.304045, 41.93353, 7.0481477), (-26.304045, 41.93353, 7.0481477), (-24.148146, 43.30127, 6.470476), (-24.45369, 43.30127, 5.197792), (-26.636868, 41.93353, 5.661841), (-26.636868, 41.93353, 5.661841), (-24.45369, 43.30127, 5.197792), (-24.69221, 43.30127, 3.9108617), (-26.89668, 41.93353, 4.260016), (-26.89668, 41.93353, 4.260016), (-24.69221, 43.30127, 3.9108617), (-24.863047, 43.30127, 2.6132116), (-27.082773, 41.93353, 2.846514), (-27.082773, 41.93353, 2.846514), (-24.863047, 43.30127, 2.6132116), (-24.965738, 43.30127, 1.308399), (-27.194632, 41.93353, 1.4252102), (-27.194632, 41.93353, 1.4252102), (-24.965738, 43.30127, 1.308399), (-25, 43.30127, 3.0616169e-15), (-27.231953, 41.93353, 3.3349523e-15), (-27.231953, 41.93353, 3.3349523e-15), (-25, 43.30127, 3.0616169e-15), (-24.965738, 43.30127, -1.308399), (-27.194632, 41.93353, -1.4252102), (-27.194632, 41.93353, -1.4252102), (-24.965738, 43.30127, -1.308399), (-24.863047, 43.30127, -2.6132116), (-27.082773, 41.93353, -2.846514), (-27.082773, 41.93353, -2.846514), (-24.863047, 43.30127, -2.6132116), (-24.69221, 43.30127, -3.9108617), (-26.89668, 41.93353, -4.260016), (-26.89668, 41.93353, -4.260016), (-24.69221, 43.30127, -3.9108617), (-24.45369, 43.30127, -5.197792), (-26.636868, 41.93353, -5.661841), (-26.636868, 41.93353, -5.661841), (-24.45369, 43.30127, -5.197792), (-24.148146, 43.30127, -6.470476), (-26.304045, 41.93353, -7.0481477), (-26.304045, 41.93353, -7.0481477), (-24.148146, 43.30127, -6.470476), (-23.776413, 43.30127, -7.725425), (-25.899126, 41.93353, -8.415136), (-25.899126, 41.93353, -8.415136), (-23.776413, 43.30127, -7.725425), (-23.33951, 43.30127, -8.959199), (-25.423218, 41.93353, -9.759059), (-25.423218, 41.93353, -9.759059), (-23.33951, 43.30127, -8.959199), (-22.838636, 43.30127, -10.168416), (-24.877626, 41.93353, -11.076233), (-24.877626, 41.93353, -11.076233), (-22.838636, 43.30127, -10.168416), (-22.275164, 43.30127, -11.349763), (-24.263847, 41.93353, -12.363048), (-24.263847, 41.93353, -12.363048), (-22.275164, 43.30127, -11.349763), (-21.650635, 43.30127, -12.5), (-23.583563, 41.93353, -13.615976), (-23.583563, 41.93353, -13.615976), (-21.650635, 43.30127, -12.5), (-20.966764, 43.30127, -13.615976), (-22.838636, 41.93353, -14.831584), (-22.838636, 41.93353, -14.831584), (-20.966764, 43.30127, -13.615976), (-20.225426, 43.30127, -14.694632), (-22.031113, 41.93353, -16.00654), (-22.031113, 41.93353, -16.00654), (-20.225426, 43.30127, -14.694632), (-19.42865, 43.30127, -15.733009), (-21.1632, 41.93353, -17.137623), (-21.1632, 41.93353, -17.137623), (-19.42865, 43.30127, -15.733009), (-18.57862, 43.30127, -16.728266), (-20.237284, 41.93353, -18.221733), (-20.237284, 41.93353, -18.221733), (-18.57862, 43.30127, -16.728266), (-17.67767, 43.30127, -17.67767), (-19.255898, 41.93353, -19.255898), (-19.255898, 41.93353, -19.255898), (-17.67767, 43.30127, -17.67767), (-16.728266, 43.30127, -18.57862), (-18.221733, 41.93353, -20.237284), (-18.221733, 41.93353, -20.237284), (-16.728266, 43.30127, -18.57862), (-15.733009, 43.30127, -19.42865), (-17.137623, 41.93353, -21.1632), (-17.137623, 41.93353, -21.1632), (-15.733009, 43.30127, -19.42865), (-14.694632, 43.30127, -20.225426), (-16.00654, 41.93353, -22.031113), (-16.00654, 41.93353, -22.031113), (-14.694632, 43.30127, -20.225426), (-13.615976, 43.30127, -20.966764), (-14.831584, 41.93353, -22.838636), (-14.831584, 41.93353, -22.838636), (-13.615976, 43.30127, -20.966764), (-12.5, 43.30127, -21.650635), (-13.615976, 41.93353, -23.583563), (-13.615976, 41.93353, -23.583563), (-12.5, 43.30127, -21.650635), (-11.349763, 43.30127, -22.275164), (-12.363048, 41.93353, -24.263847), (-12.363048, 41.93353, -24.263847), (-11.349763, 43.30127, -22.275164), (-10.168416, 43.30127, -22.838636), (-11.076233, 41.93353, -24.877626), (-11.076233, 41.93353, -24.877626), (-10.168416, 43.30127, -22.838636), (-8.959199, 43.30127, -23.33951), (-9.759059, 41.93353, -25.423218), (-9.759059, 41.93353, -25.423218), (-8.959199, 43.30127, -23.33951), (-7.725425, 43.30127, -23.776413), (-8.415136, 41.93353, -25.899126), (-8.415136, 41.93353, -25.899126), (-7.725425, 43.30127, -23.776413), (-6.470476, 43.30127, -24.148146), (-7.0481477, 41.93353, -26.304045), (-7.0481477, 41.93353, -26.304045), (-6.470476, 43.30127, -24.148146), (-5.197792, 43.30127, -24.45369), (-5.661841, 41.93353, -26.636868), (-5.661841, 41.93353, -26.636868), (-5.197792, 43.30127, -24.45369), (-3.9108617, 43.30127, -24.69221), (-4.260016, 41.93353, -26.89668), (-4.260016, 41.93353, -26.89668), (-3.9108617, 43.30127, -24.69221), (-2.6132116, 43.30127, -24.863047), (-2.846514, 41.93353, -27.082773), (-2.846514, 41.93353, -27.082773), (-2.6132116, 43.30127, -24.863047), (-1.308399, 43.30127, -24.965738), (-1.4252102, 41.93353, -27.194632), (-1.4252102, 41.93353, -27.194632), (-1.308399, 43.30127, -24.965738), (-4.5924254e-15, 43.30127, -25), (-5.0024284e-15, 41.93353, -27.231953), (-5.0024284e-15, 41.93353, -27.231953), (-4.5924254e-15, 43.30127, -25), (1.308399, 43.30127, -24.965738), (1.4252102, 41.93353, -27.194632), (1.4252102, 41.93353, -27.194632), (1.308399, 43.30127, -24.965738), (2.6132116, 43.30127, -24.863047), (2.846514, 41.93353, -27.082773), (2.846514, 41.93353, -27.082773), (2.6132116, 43.30127, -24.863047), (3.9108617, 43.30127, -24.69221), (4.260016, 41.93353, -26.89668), (4.260016, 41.93353, -26.89668), (3.9108617, 43.30127, -24.69221), (5.197792, 43.30127, -24.45369), (5.661841, 41.93353, -26.636868), (5.661841, 41.93353, -26.636868), (5.197792, 43.30127, -24.45369), (6.470476, 43.30127, -24.148146), (7.0481477, 41.93353, -26.304045), (7.0481477, 41.93353, -26.304045), (6.470476, 43.30127, -24.148146), (7.725425, 43.30127, -23.776413), (8.415136, 41.93353, -25.899126), (8.415136, 41.93353, -25.899126), (7.725425, 43.30127, -23.776413), (8.959199, 43.30127, -23.33951), (9.759059, 41.93353, -25.423218), (9.759059, 41.93353, -25.423218), (8.959199, 43.30127, -23.33951), (10.168416, 43.30127, -22.838636), (11.076233, 41.93353, -24.877626), (11.076233, 41.93353, -24.877626), (10.168416, 43.30127, -22.838636), (11.349763, 43.30127, -22.275164), (12.363048, 41.93353, -24.263847), (12.363048, 41.93353, -24.263847), (11.349763, 43.30127, -22.275164), (12.5, 43.30127, -21.650635), (13.615976, 41.93353, -23.583563), (13.615976, 41.93353, -23.583563), (12.5, 43.30127, -21.650635), (13.615976, 43.30127, -20.966764), (14.831584, 41.93353, -22.838636), (14.831584, 41.93353, -22.838636), (13.615976, 43.30127, -20.966764), (14.694632, 43.30127, -20.225426), (16.00654, 41.93353, -22.031113), (16.00654, 41.93353, -22.031113), (14.694632, 43.30127, -20.225426), (15.733009, 43.30127, -19.42865), (17.137623, 41.93353, -21.1632), (17.137623, 41.93353, -21.1632), (15.733009, 43.30127, -19.42865), (16.728266, 43.30127, -18.57862), (18.221733, 41.93353, -20.237284), (18.221733, 41.93353, -20.237284), (16.728266, 43.30127, -18.57862), (17.67767, 43.30127, -17.67767), (19.255898, 41.93353, -19.255898), (19.255898, 41.93353, -19.255898), (17.67767, 43.30127, -17.67767), (18.57862, 43.30127, -16.728266), (20.237284, 41.93353, -18.221733), (20.237284, 41.93353, -18.221733), (18.57862, 43.30127, -16.728266), (19.42865, 43.30127, -15.733009), (21.1632, 41.93353, -17.137623), (21.1632, 41.93353, -17.137623), (19.42865, 43.30127, -15.733009), (20.225426, 43.30127, -14.694632), (22.031113, 41.93353, -16.00654), (22.031113, 41.93353, -16.00654), (20.225426, 43.30127, -14.694632), (20.966764, 43.30127, -13.615976), (22.838636, 41.93353, -14.831584), (22.838636, 41.93353, -14.831584), (20.966764, 43.30127, -13.615976), (21.650635, 43.30127, -12.5), (23.583563, 41.93353, -13.615976), (23.583563, 41.93353, -13.615976), (21.650635, 43.30127, -12.5), (22.275164, 43.30127, -11.349763), (24.263847, 41.93353, -12.363048), (24.263847, 41.93353, -12.363048), (22.275164, 43.30127, -11.349763), (22.838636, 43.30127, -10.168416), (24.877626, 41.93353, -11.076233), (24.877626, 41.93353, -11.076233), (22.838636, 43.30127, -10.168416), (23.33951, 43.30127, -8.959199), (25.423218, 41.93353, -9.759059), (25.423218, 41.93353, -9.759059), (23.33951, 43.30127, -8.959199), (23.776413, 43.30127, -7.725425), (25.899126, 41.93353, -8.415136), (25.899126, 41.93353, -8.415136), (23.776413, 43.30127, -7.725425), (24.148146, 43.30127, -6.470476), (26.304045, 41.93353, -7.0481477), (26.304045, 41.93353, -7.0481477), (24.148146, 43.30127, -6.470476), (24.45369, 43.30127, -5.197792), (26.636868, 41.93353, -5.661841), (26.636868, 41.93353, -5.661841), (24.45369, 43.30127, -5.197792), (24.69221, 43.30127, -3.9108617), (26.89668, 41.93353, -4.260016), (26.89668, 41.93353, -4.260016), (24.69221, 43.30127, -3.9108617), (24.863047, 43.30127, -2.6132116), (27.082773, 41.93353, -2.846514), (27.082773, 41.93353, -2.846514), (24.863047, 43.30127, -2.6132116), (24.965738, 43.30127, -1.308399), (27.194632, 41.93353, -1.4252102), (27.194632, 41.93353, -1.4252102), (24.965738, 43.30127, -1.308399), (25, 43.30127, 0), (27.231953, 41.93353, 0), (25, 43.30127, 0), (22.699526, 44.550327, 0), (22.668417, 44.550327, 1.1880014), (24.965738, 43.30127, 1.308399), (24.965738, 43.30127, 1.308399), (22.668417, 44.550327, 1.1880014), (22.575174, 44.550327, 2.3727465), (24.863047, 43.30127, 2.6132116), (24.863047, 43.30127, 2.6132116), (22.575174, 44.550327, 2.3727465), (22.420055, 44.550327, 3.550988), (24.69221, 43.30127, 3.9108617), (24.69221, 43.30127, 3.9108617), (22.420055, 44.550327, 3.550988), (22.203485, 44.550327, 4.7194967), (24.45369, 43.30127, 5.197792), (24.45369, 43.30127, 5.197792), (22.203485, 44.550327, 4.7194967), (21.926058, 44.550327, 5.8750696), (24.148146, 43.30127, 6.470476), (24.148146, 43.30127, 6.470476), (21.926058, 44.550327, 5.8750696), (21.588531, 44.550327, 7.014539), (23.776413, 43.30127, 7.725425), (23.776413, 43.30127, 7.725425), (21.588531, 44.550327, 7.014539), (21.191832, 44.550327, 8.134782), (23.33951, 43.30127, 8.959199), (23.33951, 43.30127, 8.959199), (21.191832, 44.550327, 8.134782), (20.737047, 44.550327, 9.232729), (22.838636, 43.30127, 10.168416), (22.838636, 43.30127, 10.168416), (20.737047, 44.550327, 9.232729), (20.225426, 44.550327, 10.305368), (22.275164, 43.30127, 11.349763), (22.275164, 43.30127, 11.349763), (20.225426, 44.550327, 10.305368), (19.658365, 44.550327, 11.349763), (21.650635, 43.30127, 12.5), (21.650635, 43.30127, 12.5), (19.658365, 44.550327, 11.349763), (19.037424, 44.550327, 12.363048), (20.966764, 43.30127, 13.615976), (20.966764, 43.30127, 13.615976), (19.037424, 44.550327, 12.363048), (18.364302, 44.550327, 13.342446), (20.225426, 43.30127, 14.694632), (20.225426, 43.30127, 14.694632), (18.364302, 44.550327, 13.342446), (17.640844, 44.550327, 14.285274), (19.42865, 43.30127, 15.733009), (19.42865, 43.30127, 15.733009), (17.640844, 44.550327, 14.285274), (16.869034, 44.550327, 15.188947), (18.57862, 43.30127, 16.728266), (18.57862, 43.30127, 16.728266), (16.869034, 44.550327, 15.188947), (16.050987, 44.550327, 16.050987), (17.67767, 43.30127, 17.67767), (17.67767, 43.30127, 17.67767), (16.050987, 44.550327, 16.050987), (15.188947, 44.550327, 16.869034), (16.728266, 43.30127, 18.57862), (16.728266, 43.30127, 18.57862), (15.188947, 44.550327, 16.869034), (14.285274, 44.550327, 17.640844), (15.733009, 43.30127, 19.42865), (15.733009, 43.30127, 19.42865), (14.285274, 44.550327, 17.640844), (13.342446, 44.550327, 18.364302), (14.694632, 43.30127, 20.225426), (14.694632, 43.30127, 20.225426), (13.342446, 44.550327, 18.364302), (12.363048, 44.550327, 19.037424), (13.615976, 43.30127, 20.966764), (13.615976, 43.30127, 20.966764), (12.363048, 44.550327, 19.037424), (11.349763, 44.550327, 19.658365), (12.5, 43.30127, 21.650635), (12.5, 43.30127, 21.650635), (11.349763, 44.550327, 19.658365), (10.305368, 44.550327, 20.225426), (11.349763, 43.30127, 22.275164), (11.349763, 43.30127, 22.275164), (10.305368, 44.550327, 20.225426), (9.232729, 44.550327, 20.737047), (10.168416, 43.30127, 22.838636), (10.168416, 43.30127, 22.838636), (9.232729, 44.550327, 20.737047), (8.134782, 44.550327, 21.191832), (8.959199, 43.30127, 23.33951), (8.959199, 43.30127, 23.33951), (8.134782, 44.550327, 21.191832), (7.014539, 44.550327, 21.588531), (7.725425, 43.30127, 23.776413), (7.725425, 43.30127, 23.776413), (7.014539, 44.550327, 21.588531), (5.8750696, 44.550327, 21.926058), (6.470476, 43.30127, 24.148146), (6.470476, 43.30127, 24.148146), (5.8750696, 44.550327, 21.926058), (4.7194967, 44.550327, 22.203485), (5.197792, 43.30127, 24.45369), (5.197792, 43.30127, 24.45369), (4.7194967, 44.550327, 22.203485), (3.550988, 44.550327, 22.420055), (3.9108617, 43.30127, 24.69221), (3.9108617, 43.30127, 24.69221), (3.550988, 44.550327, 22.420055), (2.3727465, 44.550327, 22.575174), (2.6132116, 43.30127, 24.863047), (2.6132116, 43.30127, 24.863047), (2.3727465, 44.550327, 22.575174), (1.1880014, 44.550327, 22.668417), (1.308399, 43.30127, 24.965738), (1.308399, 43.30127, 24.965738), (1.1880014, 44.550327, 22.668417), (1.3899451e-15, 44.550327, 22.699526), (1.5308084e-15, 43.30127, 25), (1.5308084e-15, 43.30127, 25), (1.3899451e-15, 44.550327, 22.699526), (-1.1880014, 44.550327, 22.668417), (-1.308399, 43.30127, 24.965738), (-1.308399, 43.30127, 24.965738), (-1.1880014, 44.550327, 22.668417), (-2.3727465, 44.550327, 22.575174), (-2.6132116, 43.30127, 24.863047), (-2.6132116, 43.30127, 24.863047), (-2.3727465, 44.550327, 22.575174), (-3.550988, 44.550327, 22.420055), (-3.9108617, 43.30127, 24.69221), (-3.9108617, 43.30127, 24.69221), (-3.550988, 44.550327, 22.420055), (-4.7194967, 44.550327, 22.203485), (-5.197792, 43.30127, 24.45369), (-5.197792, 43.30127, 24.45369), (-4.7194967, 44.550327, 22.203485), (-5.8750696, 44.550327, 21.926058), (-6.470476, 43.30127, 24.148146), (-6.470476, 43.30127, 24.148146), (-5.8750696, 44.550327, 21.926058), (-7.014539, 44.550327, 21.588531), (-7.725425, 43.30127, 23.776413), (-7.725425, 43.30127, 23.776413), (-7.014539, 44.550327, 21.588531), (-8.134782, 44.550327, 21.191832), (-8.959199, 43.30127, 23.33951), (-8.959199, 43.30127, 23.33951), (-8.134782, 44.550327, 21.191832), (-9.232729, 44.550327, 20.737047), (-10.168416, 43.30127, 22.838636), (-10.168416, 43.30127, 22.838636), (-9.232729, 44.550327, 20.737047), (-10.305368, 44.550327, 20.225426), (-11.349763, 43.30127, 22.275164), (-11.349763, 43.30127, 22.275164), (-10.305368, 44.550327, 20.225426), (-11.349763, 44.550327, 19.658365), (-12.5, 43.30127, 21.650635), (-12.5, 43.30127, 21.650635), (-11.349763, 44.550327, 19.658365), (-12.363048, 44.550327, 19.037424), (-13.615976, 43.30127, 20.966764), (-13.615976, 43.30127, 20.966764), (-12.363048, 44.550327, 19.037424), (-13.342446, 44.550327, 18.364302), (-14.694632, 43.30127, 20.225426), (-14.694632, 43.30127, 20.225426), (-13.342446, 44.550327, 18.364302), (-14.285274, 44.550327, 17.640844), (-15.733009, 43.30127, 19.42865), (-15.733009, 43.30127, 19.42865), (-14.285274, 44.550327, 17.640844), (-15.188947, 44.550327, 16.869034), (-16.728266, 43.30127, 18.57862), (-16.728266, 43.30127, 18.57862), (-15.188947, 44.550327, 16.869034), (-16.050987, 44.550327, 16.050987), (-17.67767, 43.30127, 17.67767), (-17.67767, 43.30127, 17.67767), (-16.050987, 44.550327, 16.050987), (-16.869034, 44.550327, 15.188947), (-18.57862, 43.30127, 16.728266), (-18.57862, 43.30127, 16.728266), (-16.869034, 44.550327, 15.188947), (-17.640844, 44.550327, 14.285274), (-19.42865, 43.30127, 15.733009), (-19.42865, 43.30127, 15.733009), (-17.640844, 44.550327, 14.285274), (-18.364302, 44.550327, 13.342446), (-20.225426, 43.30127, 14.694632), (-20.225426, 43.30127, 14.694632), (-18.364302, 44.550327, 13.342446), (-19.037424, 44.550327, 12.363048), (-20.966764, 43.30127, 13.615976), (-20.966764, 43.30127, 13.615976), (-19.037424, 44.550327, 12.363048), (-19.658365, 44.550327, 11.349763), (-21.650635, 43.30127, 12.5), (-21.650635, 43.30127, 12.5), (-19.658365, 44.550327, 11.349763), (-20.225426, 44.550327, 10.305368), (-22.275164, 43.30127, 11.349763), (-22.275164, 43.30127, 11.349763), (-20.225426, 44.550327, 10.305368), (-20.737047, 44.550327, 9.232729), (-22.838636, 43.30127, 10.168416), (-22.838636, 43.30127, 10.168416), (-20.737047, 44.550327, 9.232729), (-21.191832, 44.550327, 8.134782), (-23.33951, 43.30127, 8.959199), (-23.33951, 43.30127, 8.959199), (-21.191832, 44.550327, 8.134782), (-21.588531, 44.550327, 7.014539), (-23.776413, 43.30127, 7.725425), (-23.776413, 43.30127, 7.725425), (-21.588531, 44.550327, 7.014539), (-21.926058, 44.550327, 5.8750696), (-24.148146, 43.30127, 6.470476), (-24.148146, 43.30127, 6.470476), (-21.926058, 44.550327, 5.8750696), (-22.203485, 44.550327, 4.7194967), (-24.45369, 43.30127, 5.197792), (-24.45369, 43.30127, 5.197792), (-22.203485, 44.550327, 4.7194967), (-22.420055, 44.550327, 3.550988), (-24.69221, 43.30127, 3.9108617), (-24.69221, 43.30127, 3.9108617), (-22.420055, 44.550327, 3.550988), (-22.575174, 44.550327, 2.3727465), (-24.863047, 43.30127, 2.6132116), (-24.863047, 43.30127, 2.6132116), (-22.575174, 44.550327, 2.3727465), (-22.668417, 44.550327, 1.1880014), (-24.965738, 43.30127, 1.308399), (-24.965738, 43.30127, 1.308399), (-22.668417, 44.550327, 1.1880014), (-22.699526, 44.550327, 2.7798901e-15), (-25, 43.30127, 3.0616169e-15), (-25, 43.30127, 3.0616169e-15), (-22.699526, 44.550327, 2.7798901e-15), (-22.668417, 44.550327, -1.1880014), (-24.965738, 43.30127, -1.308399), (-24.965738, 43.30127, -1.308399), (-22.668417, 44.550327, -1.1880014), (-22.575174, 44.550327, -2.3727465), (-24.863047, 43.30127, -2.6132116), (-24.863047, 43.30127, -2.6132116), (-22.575174, 44.550327, -2.3727465), (-22.420055, 44.550327, -3.550988), (-24.69221, 43.30127, -3.9108617), (-24.69221, 43.30127, -3.9108617), (-22.420055, 44.550327, -3.550988), (-22.203485, 44.550327, -4.7194967), (-24.45369, 43.30127, -5.197792), (-24.45369, 43.30127, -5.197792), (-22.203485, 44.550327, -4.7194967), (-21.926058, 44.550327, -5.8750696), (-24.148146, 43.30127, -6.470476), (-24.148146, 43.30127, -6.470476), (-21.926058, 44.550327, -5.8750696), (-21.588531, 44.550327, -7.014539), (-23.776413, 43.30127, -7.725425), (-23.776413, 43.30127, -7.725425), (-21.588531, 44.550327, -7.014539), (-21.191832, 44.550327, -8.134782), (-23.33951, 43.30127, -8.959199), (-23.33951, 43.30127, -8.959199), (-21.191832, 44.550327, -8.134782), (-20.737047, 44.550327, -9.232729), (-22.838636, 43.30127, -10.168416), (-22.838636, 43.30127, -10.168416), (-20.737047, 44.550327, -9.232729), (-20.225426, 44.550327, -10.305368), (-22.275164, 43.30127, -11.349763), (-22.275164, 43.30127, -11.349763), (-20.225426, 44.550327, -10.305368), (-19.658365, 44.550327, -11.349763), (-21.650635, 43.30127, -12.5), (-21.650635, 43.30127, -12.5), (-19.658365, 44.550327, -11.349763), (-19.037424, 44.550327, -12.363048), (-20.966764, 43.30127, -13.615976), (-20.966764, 43.30127, -13.615976), (-19.037424, 44.550327, -12.363048), (-18.364302, 44.550327, -13.342446), (-20.225426, 43.30127, -14.694632), (-20.225426, 43.30127, -14.694632), (-18.364302, 44.550327, -13.342446), (-17.640844, 44.550327, -14.285274), (-19.42865, 43.30127, -15.733009), (-19.42865, 43.30127, -15.733009), (-17.640844, 44.550327, -14.285274), (-16.869034, 44.550327, -15.188947), (-18.57862, 43.30127, -16.728266), (-18.57862, 43.30127, -16.728266), (-16.869034, 44.550327, -15.188947), (-16.050987, 44.550327, -16.050987), (-17.67767, 43.30127, -17.67767), (-17.67767, 43.30127, -17.67767), (-16.050987, 44.550327, -16.050987), (-15.188947, 44.550327, -16.869034), (-16.728266, 43.30127, -18.57862), (-16.728266, 43.30127, -18.57862), (-15.188947, 44.550327, -16.869034), (-14.285274, 44.550327, -17.640844), (-15.733009, 43.30127, -19.42865), (-15.733009, 43.30127, -19.42865), (-14.285274, 44.550327, -17.640844), (-13.342446, 44.550327, -18.364302), (-14.694632, 43.30127, -20.225426), (-14.694632, 43.30127, -20.225426), (-13.342446, 44.550327, -18.364302), (-12.363048, 44.550327, -19.037424), (-13.615976, 43.30127, -20.966764), (-13.615976, 43.30127, -20.966764), (-12.363048, 44.550327, -19.037424), (-11.349763, 44.550327, -19.658365), (-12.5, 43.30127, -21.650635), (-12.5, 43.30127, -21.650635), (-11.349763, 44.550327, -19.658365), (-10.305368, 44.550327, -20.225426), (-11.349763, 43.30127, -22.275164), (-11.349763, 43.30127, -22.275164), (-10.305368, 44.550327, -20.225426), (-9.232729, 44.550327, -20.737047), (-10.168416, 43.30127, -22.838636), (-10.168416, 43.30127, -22.838636), (-9.232729, 44.550327, -20.737047), (-8.134782, 44.550327, -21.191832), (-8.959199, 43.30127, -23.33951), (-8.959199, 43.30127, -23.33951), (-8.134782, 44.550327, -21.191832), (-7.014539, 44.550327, -21.588531), (-7.725425, 43.30127, -23.776413), (-7.725425, 43.30127, -23.776413), (-7.014539, 44.550327, -21.588531), (-5.8750696, 44.550327, -21.926058), (-6.470476, 43.30127, -24.148146), (-6.470476, 43.30127, -24.148146), (-5.8750696, 44.550327, -21.926058), (-4.7194967, 44.550327, -22.203485), (-5.197792, 43.30127, -24.45369), (-5.197792, 43.30127, -24.45369), (-4.7194967, 44.550327, -22.203485), (-3.550988, 44.550327, -22.420055), (-3.9108617, 43.30127, -24.69221), (-3.9108617, 43.30127, -24.69221), (-3.550988, 44.550327, -22.420055), (-2.3727465, 44.550327, -22.575174), (-2.6132116, 43.30127, -24.863047), (-2.6132116, 43.30127, -24.863047), (-2.3727465, 44.550327, -22.575174), (-1.1880014, 44.550327, -22.668417), (-1.308399, 43.30127, -24.965738), (-1.308399, 43.30127, -24.965738), (-1.1880014, 44.550327, -22.668417), (-4.169835e-15, 44.550327, -22.699526), (-4.5924254e-15, 43.30127, -25), (-4.5924254e-15, 43.30127, -25), (-4.169835e-15, 44.550327, -22.699526), (1.1880014, 44.550327, -22.668417), (1.308399, 43.30127, -24.965738), (1.308399, 43.30127, -24.965738), (1.1880014, 44.550327, -22.668417), (2.3727465, 44.550327, -22.575174), (2.6132116, 43.30127, -24.863047), (2.6132116, 43.30127, -24.863047), (2.3727465, 44.550327, -22.575174), (3.550988, 44.550327, -22.420055), (3.9108617, 43.30127, -24.69221), (3.9108617, 43.30127, -24.69221), (3.550988, 44.550327, -22.420055), (4.7194967, 44.550327, -22.203485), (5.197792, 43.30127, -24.45369), (5.197792, 43.30127, -24.45369), (4.7194967, 44.550327, -22.203485), (5.8750696, 44.550327, -21.926058), (6.470476, 43.30127, -24.148146), (6.470476, 43.30127, -24.148146), (5.8750696, 44.550327, -21.926058), (7.014539, 44.550327, -21.588531), (7.725425, 43.30127, -23.776413), (7.725425, 43.30127, -23.776413), (7.014539, 44.550327, -21.588531), (8.134782, 44.550327, -21.191832), (8.959199, 43.30127, -23.33951), (8.959199, 43.30127, -23.33951), (8.134782, 44.550327, -21.191832), (9.232729, 44.550327, -20.737047), (10.168416, 43.30127, -22.838636), (10.168416, 43.30127, -22.838636), (9.232729, 44.550327, -20.737047), (10.305368, 44.550327, -20.225426), (11.349763, 43.30127, -22.275164), (11.349763, 43.30127, -22.275164), (10.305368, 44.550327, -20.225426), (11.349763, 44.550327, -19.658365), (12.5, 43.30127, -21.650635), (12.5, 43.30127, -21.650635), (11.349763, 44.550327, -19.658365), (12.363048, 44.550327, -19.037424), (13.615976, 43.30127, -20.966764), (13.615976, 43.30127, -20.966764), (12.363048, 44.550327, -19.037424), (13.342446, 44.550327, -18.364302), (14.694632, 43.30127, -20.225426), (14.694632, 43.30127, -20.225426), (13.342446, 44.550327, -18.364302), (14.285274, 44.550327, -17.640844), (15.733009, 43.30127, -19.42865), (15.733009, 43.30127, -19.42865), (14.285274, 44.550327, -17.640844), (15.188947, 44.550327, -16.869034), (16.728266, 43.30127, -18.57862), (16.728266, 43.30127, -18.57862), (15.188947, 44.550327, -16.869034), (16.050987, 44.550327, -16.050987), (17.67767, 43.30127, -17.67767), (17.67767, 43.30127, -17.67767), (16.050987, 44.550327, -16.050987), (16.869034, 44.550327, -15.188947), (18.57862, 43.30127, -16.728266), (18.57862, 43.30127, -16.728266), (16.869034, 44.550327, -15.188947), (17.640844, 44.550327, -14.285274), (19.42865, 43.30127, -15.733009), (19.42865, 43.30127, -15.733009), (17.640844, 44.550327, -14.285274), (18.364302, 44.550327, -13.342446), (20.225426, 43.30127, -14.694632), (20.225426, 43.30127, -14.694632), (18.364302, 44.550327, -13.342446), (19.037424, 44.550327, -12.363048), (20.966764, 43.30127, -13.615976), (20.966764, 43.30127, -13.615976), (19.037424, 44.550327, -12.363048), (19.658365, 44.550327, -11.349763), (21.650635, 43.30127, -12.5), (21.650635, 43.30127, -12.5), (19.658365, 44.550327, -11.349763), (20.225426, 44.550327, -10.305368), (22.275164, 43.30127, -11.349763), (22.275164, 43.30127, -11.349763), (20.225426, 44.550327, -10.305368), (20.737047, 44.550327, -9.232729), (22.838636, 43.30127, -10.168416), (22.838636, 43.30127, -10.168416), (20.737047, 44.550327, -9.232729), (21.191832, 44.550327, -8.134782), (23.33951, 43.30127, -8.959199), (23.33951, 43.30127, -8.959199), (21.191832, 44.550327, -8.134782), (21.588531, 44.550327, -7.014539), (23.776413, 43.30127, -7.725425), (23.776413, 43.30127, -7.725425), (21.588531, 44.550327, -7.014539), (21.926058, 44.550327, -5.8750696), (24.148146, 43.30127, -6.470476), (24.148146, 43.30127, -6.470476), (21.926058, 44.550327, -5.8750696), (22.203485, 44.550327, -4.7194967), (24.45369, 43.30127, -5.197792), (24.45369, 43.30127, -5.197792), (22.203485, 44.550327, -4.7194967), (22.420055, 44.550327, -3.550988), (24.69221, 43.30127, -3.9108617), (24.69221, 43.30127, -3.9108617), (22.420055, 44.550327, -3.550988), (22.575174, 44.550327, -2.3727465), (24.863047, 43.30127, -2.6132116), (24.863047, 43.30127, -2.6132116), (22.575174, 44.550327, -2.3727465), (22.668417, 44.550327, -1.1880014), (24.965738, 43.30127, -1.308399), (24.965738, 43.30127, -1.308399), (22.668417, 44.550327, -1.1880014), (22.699526, 44.550327, 0), (25, 43.30127, 0), (22.699526, 44.550327, 0), (20.336832, 45.677273, 0), (20.308962, 45.677273, 1.0643475), (22.668417, 44.550327, 1.1880014), (22.668417, 44.550327, 1.1880014), (20.308962, 45.677273, 1.0643475), (20.225426, 45.677273, 2.1257777), (22.575174, 44.550327, 2.3727465), (22.575174, 44.550327, 2.3727465), (20.225426, 45.677273, 2.1257777), (20.086452, 45.677273, 3.1813815), (22.420055, 44.550327, 3.550988), (22.420055, 44.550327, 3.550988), (20.086452, 45.677273, 3.1813815), (19.892424, 45.677273, 4.2282653), (22.203485, 44.550327, 4.7194967), (22.203485, 44.550327, 4.7194967), (19.892424, 45.677273, 4.2282653), (19.643871, 45.677273, 5.2635593), (21.926058, 44.550327, 5.8750696), (21.926058, 44.550327, 5.8750696), (19.643871, 45.677273, 5.2635593), (19.341476, 45.677273, 6.2844267), (21.588531, 44.550327, 7.014539), (21.588531, 44.550327, 7.014539), (19.341476, 45.677273, 6.2844267), (18.986069, 45.677273, 7.288069), (21.191832, 44.550327, 8.134782), (21.191832, 44.550327, 8.134782), (18.986069, 45.677273, 7.288069), (18.57862, 45.677273, 8.271735), (20.737047, 44.550327, 9.232729), (20.737047, 44.550327, 9.232729), (18.57862, 45.677273, 8.271735), (18.12025, 45.677273, 9.232729), (20.225426, 44.550327, 10.305368), (20.225426, 44.550327, 10.305368), (18.12025, 45.677273, 9.232729), (17.612213, 45.677273, 10.168416), (19.658365, 44.550327, 11.349763), (19.658365, 44.550327, 11.349763), (17.612213, 45.677273, 10.168416), (17.055902, 45.677273, 11.076233), (19.037424, 44.550327, 12.363048), (19.037424, 44.550327, 12.363048), (17.055902, 45.677273, 11.076233), (16.452843, 45.677273, 11.95369), (18.364302, 44.550327, 13.342446), (18.364302, 44.550327, 13.342446), (16.452843, 45.677273, 11.95369), (15.804687, 45.677273, 12.798383), (17.640844, 44.550327, 14.285274), (17.640844, 44.550327, 14.285274), (15.804687, 45.677273, 12.798383), (15.113212, 45.677273, 13.607997), (16.869034, 44.550327, 15.188947), (16.869034, 44.550327, 15.188947), (15.113212, 45.677273, 13.607997), (14.380312, 45.677273, 14.380312), (16.050987, 44.550327, 16.050987), (16.050987, 44.550327, 16.050987), (14.380312, 45.677273, 14.380312), (13.607997, 45.677273, 15.113212), (15.188947, 44.550327, 16.869034), (15.188947, 44.550327, 16.869034), (13.607997, 45.677273, 15.113212), (12.798383, 45.677273, 15.804687), (14.285274, 44.550327, 17.640844), (14.285274, 44.550327, 17.640844), (12.798383, 45.677273, 15.804687), (11.95369, 45.677273, 16.452843), (13.342446, 44.550327, 18.364302), (13.342446, 44.550327, 18.364302), (11.95369, 45.677273, 16.452843), (11.076233, 45.677273, 17.055902), (12.363048, 44.550327, 19.037424), (12.363048, 44.550327, 19.037424), (11.076233, 45.677273, 17.055902), (10.168416, 45.677273, 17.612213), (11.349763, 44.550327, 19.658365), (11.349763, 44.550327, 19.658365), (10.168416, 45.677273, 17.612213), (9.232729, 45.677273, 18.12025), (10.305368, 44.550327, 20.225426), (10.305368, 44.550327, 20.225426), (9.232729, 45.677273, 18.12025), (8.271735, 45.677273, 18.57862), (9.232729, 44.550327, 20.737047), (9.232729, 44.550327, 20.737047), (8.271735, 45.677273, 18.57862), (7.288069, 45.677273, 18.986069), (8.134782, 44.550327, 21.191832), (8.134782, 44.550327, 21.191832), (7.288069, 45.677273, 18.986069), (6.2844267, 45.677273, 19.341476), (7.014539, 44.550327, 21.588531), (7.014539, 44.550327, 21.588531), (6.2844267, 45.677273, 19.341476), (5.2635593, 45.677273, 19.643871), (5.8750696, 44.550327, 21.926058), (5.8750696, 44.550327, 21.926058), (5.2635593, 45.677273, 19.643871), (4.2282653, 45.677273, 19.892424), (4.7194967, 44.550327, 22.203485), (4.7194967, 44.550327, 22.203485), (4.2282653, 45.677273, 19.892424), (3.1813815, 45.677273, 20.086452), (3.550988, 44.550327, 22.420055), (3.550988, 44.550327, 22.420055), (3.1813815, 45.677273, 20.086452), (2.1257777, 45.677273, 20.225426), (2.3727465, 44.550327, 22.575174), (2.3727465, 44.550327, 22.575174), (2.1257777, 45.677273, 20.225426), (1.0643475, 45.677273, 20.308962), (1.1880014, 44.550327, 22.668417), (1.1880014, 44.550327, 22.668417), (1.0643475, 45.677273, 20.308962), (1.2452718e-15, 45.677273, 20.336832), (1.3899451e-15, 44.550327, 22.699526), (1.3899451e-15, 44.550327, 22.699526), (1.2452718e-15, 45.677273, 20.336832), (-1.0643475, 45.677273, 20.308962), (-1.1880014, 44.550327, 22.668417), (-1.1880014, 44.550327, 22.668417), (-1.0643475, 45.677273, 20.308962), (-2.1257777, 45.677273, 20.225426), (-2.3727465, 44.550327, 22.575174), (-2.3727465, 44.550327, 22.575174), (-2.1257777, 45.677273, 20.225426), (-3.1813815, 45.677273, 20.086452), (-3.550988, 44.550327, 22.420055), (-3.550988, 44.550327, 22.420055), (-3.1813815, 45.677273, 20.086452), (-4.2282653, 45.677273, 19.892424), (-4.7194967, 44.550327, 22.203485), (-4.7194967, 44.550327, 22.203485), (-4.2282653, 45.677273, 19.892424), (-5.2635593, 45.677273, 19.643871), (-5.8750696, 44.550327, 21.926058), (-5.8750696, 44.550327, 21.926058), (-5.2635593, 45.677273, 19.643871), (-6.2844267, 45.677273, 19.341476), (-7.014539, 44.550327, 21.588531), (-7.014539, 44.550327, 21.588531), (-6.2844267, 45.677273, 19.341476), (-7.288069, 45.677273, 18.986069), (-8.134782, 44.550327, 21.191832), (-8.134782, 44.550327, 21.191832), (-7.288069, 45.677273, 18.986069), (-8.271735, 45.677273, 18.57862), (-9.232729, 44.550327, 20.737047), (-9.232729, 44.550327, 20.737047), (-8.271735, 45.677273, 18.57862), (-9.232729, 45.677273, 18.12025), (-10.305368, 44.550327, 20.225426), (-10.305368, 44.550327, 20.225426), (-9.232729, 45.677273, 18.12025), (-10.168416, 45.677273, 17.612213), (-11.349763, 44.550327, 19.658365), (-11.349763, 44.550327, 19.658365), (-10.168416, 45.677273, 17.612213), (-11.076233, 45.677273, 17.055902), (-12.363048, 44.550327, 19.037424), (-12.363048, 44.550327, 19.037424), (-11.076233, 45.677273, 17.055902), (-11.95369, 45.677273, 16.452843), (-13.342446, 44.550327, 18.364302), (-13.342446, 44.550327, 18.364302), (-11.95369, 45.677273, 16.452843), (-12.798383, 45.677273, 15.804687), (-14.285274, 44.550327, 17.640844), (-14.285274, 44.550327, 17.640844), (-12.798383, 45.677273, 15.804687), (-13.607997, 45.677273, 15.113212), (-15.188947, 44.550327, 16.869034), (-15.188947, 44.550327, 16.869034), (-13.607997, 45.677273, 15.113212), (-14.380312, 45.677273, 14.380312), (-16.050987, 44.550327, 16.050987), (-16.050987, 44.550327, 16.050987), (-14.380312, 45.677273, 14.380312), (-15.113212, 45.677273, 13.607997), (-16.869034, 44.550327, 15.188947), (-16.869034, 44.550327, 15.188947), (-15.113212, 45.677273, 13.607997), (-15.804687, 45.677273, 12.798383), (-17.640844, 44.550327, 14.285274), (-17.640844, 44.550327, 14.285274), (-15.804687, 45.677273, 12.798383), (-16.452843, 45.677273, 11.95369), (-18.364302, 44.550327, 13.342446), (-18.364302, 44.550327, 13.342446), (-16.452843, 45.677273, 11.95369), (-17.055902, 45.677273, 11.076233), (-19.037424, 44.550327, 12.363048), (-19.037424, 44.550327, 12.363048), (-17.055902, 45.677273, 11.076233), (-17.612213, 45.677273, 10.168416), (-19.658365, 44.550327, 11.349763), (-19.658365, 44.550327, 11.349763), (-17.612213, 45.677273, 10.168416), (-18.12025, 45.677273, 9.232729), (-20.225426, 44.550327, 10.305368), (-20.225426, 44.550327, 10.305368), (-18.12025, 45.677273, 9.232729), (-18.57862, 45.677273, 8.271735), (-20.737047, 44.550327, 9.232729), (-20.737047, 44.550327, 9.232729), (-18.57862, 45.677273, 8.271735), (-18.986069, 45.677273, 7.288069), (-21.191832, 44.550327, 8.134782), (-21.191832, 44.550327, 8.134782), (-18.986069, 45.677273, 7.288069), (-19.341476, 45.677273, 6.2844267), (-21.588531, 44.550327, 7.014539), (-21.588531, 44.550327, 7.014539), (-19.341476, 45.677273, 6.2844267), (-19.643871, 45.677273, 5.2635593), (-21.926058, 44.550327, 5.8750696), (-21.926058, 44.550327, 5.8750696), (-19.643871, 45.677273, 5.2635593), (-19.892424, 45.677273, 4.2282653), (-22.203485, 44.550327, 4.7194967), (-22.203485, 44.550327, 4.7194967), (-19.892424, 45.677273, 4.2282653), (-20.086452, 45.677273, 3.1813815), (-22.420055, 44.550327, 3.550988), (-22.420055, 44.550327, 3.550988), (-20.086452, 45.677273, 3.1813815), (-20.225426, 45.677273, 2.1257777), (-22.575174, 44.550327, 2.3727465), (-22.575174, 44.550327, 2.3727465), (-20.225426, 45.677273, 2.1257777), (-20.308962, 45.677273, 1.0643475), (-22.668417, 44.550327, 1.1880014), (-22.668417, 44.550327, 1.1880014), (-20.308962, 45.677273, 1.0643475), (-20.336832, 45.677273, 2.4905437e-15), (-22.699526, 44.550327, 2.7798901e-15), (-22.699526, 44.550327, 2.7798901e-15), (-20.336832, 45.677273, 2.4905437e-15), (-20.308962, 45.677273, -1.0643475), (-22.668417, 44.550327, -1.1880014), (-22.668417, 44.550327, -1.1880014), (-20.308962, 45.677273, -1.0643475), (-20.225426, 45.677273, -2.1257777), (-22.575174, 44.550327, -2.3727465), (-22.575174, 44.550327, -2.3727465), (-20.225426, 45.677273, -2.1257777), (-20.086452, 45.677273, -3.1813815), (-22.420055, 44.550327, -3.550988), (-22.420055, 44.550327, -3.550988), (-20.086452, 45.677273, -3.1813815), (-19.892424, 45.677273, -4.2282653), (-22.203485, 44.550327, -4.7194967), (-22.203485, 44.550327, -4.7194967), (-19.892424, 45.677273, -4.2282653), (-19.643871, 45.677273, -5.2635593), (-21.926058, 44.550327, -5.8750696), (-21.926058, 44.550327, -5.8750696), (-19.643871, 45.677273, -5.2635593), (-19.341476, 45.677273, -6.2844267), (-21.588531, 44.550327, -7.014539), (-21.588531, 44.550327, -7.014539), (-19.341476, 45.677273, -6.2844267), (-18.986069, 45.677273, -7.288069), (-21.191832, 44.550327, -8.134782), (-21.191832, 44.550327, -8.134782), (-18.986069, 45.677273, -7.288069), (-18.57862, 45.677273, -8.271735), (-20.737047, 44.550327, -9.232729), (-20.737047, 44.550327, -9.232729), (-18.57862, 45.677273, -8.271735), (-18.12025, 45.677273, -9.232729), (-20.225426, 44.550327, -10.305368), (-20.225426, 44.550327, -10.305368), (-18.12025, 45.677273, -9.232729), (-17.612213, 45.677273, -10.168416), (-19.658365, 44.550327, -11.349763), (-19.658365, 44.550327, -11.349763), (-17.612213, 45.677273, -10.168416), (-17.055902, 45.677273, -11.076233), (-19.037424, 44.550327, -12.363048), (-19.037424, 44.550327, -12.363048), (-17.055902, 45.677273, -11.076233), (-16.452843, 45.677273, -11.95369), (-18.364302, 44.550327, -13.342446), (-18.364302, 44.550327, -13.342446), (-16.452843, 45.677273, -11.95369), (-15.804687, 45.677273, -12.798383), (-17.640844, 44.550327, -14.285274), (-17.640844, 44.550327, -14.285274), (-15.804687, 45.677273, -12.798383), (-15.113212, 45.677273, -13.607997), (-16.869034, 44.550327, -15.188947), (-16.869034, 44.550327, -15.188947), (-15.113212, 45.677273, -13.607997), (-14.380312, 45.677273, -14.380312), (-16.050987, 44.550327, -16.050987), (-16.050987, 44.550327, -16.050987), (-14.380312, 45.677273, -14.380312), (-13.607997, 45.677273, -15.113212), (-15.188947, 44.550327, -16.869034), (-15.188947, 44.550327, -16.869034), (-13.607997, 45.677273, -15.113212), (-12.798383, 45.677273, -15.804687), (-14.285274, 44.550327, -17.640844), (-14.285274, 44.550327, -17.640844), (-12.798383, 45.677273, -15.804687), (-11.95369, 45.677273, -16.452843), (-13.342446, 44.550327, -18.364302), (-13.342446, 44.550327, -18.364302), (-11.95369, 45.677273, -16.452843), (-11.076233, 45.677273, -17.055902), (-12.363048, 44.550327, -19.037424), (-12.363048, 44.550327, -19.037424), (-11.076233, 45.677273, -17.055902), (-10.168416, 45.677273, -17.612213), (-11.349763, 44.550327, -19.658365), (-11.349763, 44.550327, -19.658365), (-10.168416, 45.677273, -17.612213), (-9.232729, 45.677273, -18.12025), (-10.305368, 44.550327, -20.225426), (-10.305368, 44.550327, -20.225426), (-9.232729, 45.677273, -18.12025), (-8.271735, 45.677273, -18.57862), (-9.232729, 44.550327, -20.737047), (-9.232729, 44.550327, -20.737047), (-8.271735, 45.677273, -18.57862), (-7.288069, 45.677273, -18.986069), (-8.134782, 44.550327, -21.191832), (-8.134782, 44.550327, -21.191832), (-7.288069, 45.677273, -18.986069), (-6.2844267, 45.677273, -19.341476), (-7.014539, 44.550327, -21.588531), (-7.014539, 44.550327, -21.588531), (-6.2844267, 45.677273, -19.341476), (-5.2635593, 45.677273, -19.643871), (-5.8750696, 44.550327, -21.926058), (-5.8750696, 44.550327, -21.926058), (-5.2635593, 45.677273, -19.643871), (-4.2282653, 45.677273, -19.892424), (-4.7194967, 44.550327, -22.203485), (-4.7194967, 44.550327, -22.203485), (-4.2282653, 45.677273, -19.892424), (-3.1813815, 45.677273, -20.086452), (-3.550988, 44.550327, -22.420055), (-3.550988, 44.550327, -22.420055), (-3.1813815, 45.677273, -20.086452), (-2.1257777, 45.677273, -20.225426), (-2.3727465, 44.550327, -22.575174), (-2.3727465, 44.550327, -22.575174), (-2.1257777, 45.677273, -20.225426), (-1.0643475, 45.677273, -20.308962), (-1.1880014, 44.550327, -22.668417), (-1.1880014, 44.550327, -22.668417), (-1.0643475, 45.677273, -20.308962), (-3.7358155e-15, 45.677273, -20.336832), (-4.169835e-15, 44.550327, -22.699526), (-4.169835e-15, 44.550327, -22.699526), (-3.7358155e-15, 45.677273, -20.336832), (1.0643475, 45.677273, -20.308962), (1.1880014, 44.550327, -22.668417), (1.1880014, 44.550327, -22.668417), (1.0643475, 45.677273, -20.308962), (2.1257777, 45.677273, -20.225426), (2.3727465, 44.550327, -22.575174), (2.3727465, 44.550327, -22.575174), (2.1257777, 45.677273, -20.225426), (3.1813815, 45.677273, -20.086452), (3.550988, 44.550327, -22.420055), (3.550988, 44.550327, -22.420055), (3.1813815, 45.677273, -20.086452), (4.2282653, 45.677273, -19.892424), (4.7194967, 44.550327, -22.203485), (4.7194967, 44.550327, -22.203485), (4.2282653, 45.677273, -19.892424), (5.2635593, 45.677273, -19.643871), (5.8750696, 44.550327, -21.926058), (5.8750696, 44.550327, -21.926058), (5.2635593, 45.677273, -19.643871), (6.2844267, 45.677273, -19.341476), (7.014539, 44.550327, -21.588531), (7.014539, 44.550327, -21.588531), (6.2844267, 45.677273, -19.341476), (7.288069, 45.677273, -18.986069), (8.134782, 44.550327, -21.191832), (8.134782, 44.550327, -21.191832), (7.288069, 45.677273, -18.986069), (8.271735, 45.677273, -18.57862), (9.232729, 44.550327, -20.737047), (9.232729, 44.550327, -20.737047), (8.271735, 45.677273, -18.57862), (9.232729, 45.677273, -18.12025), (10.305368, 44.550327, -20.225426), (10.305368, 44.550327, -20.225426), (9.232729, 45.677273, -18.12025), (10.168416, 45.677273, -17.612213), (11.349763, 44.550327, -19.658365), (11.349763, 44.550327, -19.658365), (10.168416, 45.677273, -17.612213), (11.076233, 45.677273, -17.055902), (12.363048, 44.550327, -19.037424), (12.363048, 44.550327, -19.037424), (11.076233, 45.677273, -17.055902), (11.95369, 45.677273, -16.452843), (13.342446, 44.550327, -18.364302), (13.342446, 44.550327, -18.364302), (11.95369, 45.677273, -16.452843), (12.798383, 45.677273, -15.804687), (14.285274, 44.550327, -17.640844), (14.285274, 44.550327, -17.640844), (12.798383, 45.677273, -15.804687), (13.607997, 45.677273, -15.113212), (15.188947, 44.550327, -16.869034), (15.188947, 44.550327, -16.869034), (13.607997, 45.677273, -15.113212), (14.380312, 45.677273, -14.380312), (16.050987, 44.550327, -16.050987), (16.050987, 44.550327, -16.050987), (14.380312, 45.677273, -14.380312), (15.113212, 45.677273, -13.607997), (16.869034, 44.550327, -15.188947), (16.869034, 44.550327, -15.188947), (15.113212, 45.677273, -13.607997), (15.804687, 45.677273, -12.798383), (17.640844, 44.550327, -14.285274), (17.640844, 44.550327, -14.285274), (15.804687, 45.677273, -12.798383), (16.452843, 45.677273, -11.95369), (18.364302, 44.550327, -13.342446), (18.364302, 44.550327, -13.342446), (16.452843, 45.677273, -11.95369), (17.055902, 45.677273, -11.076233), (19.037424, 44.550327, -12.363048), (19.037424, 44.550327, -12.363048), (17.055902, 45.677273, -11.076233), (17.612213, 45.677273, -10.168416), (19.658365, 44.550327, -11.349763), (19.658365, 44.550327, -11.349763), (17.612213, 45.677273, -10.168416), (18.12025, 45.677273, -9.232729), (20.225426, 44.550327, -10.305368), (20.225426, 44.550327, -10.305368), (18.12025, 45.677273, -9.232729), (18.57862, 45.677273, -8.271735), (20.737047, 44.550327, -9.232729), (20.737047, 44.550327, -9.232729), (18.57862, 45.677273, -8.271735), (18.986069, 45.677273, -7.288069), (21.191832, 44.550327, -8.134782), (21.191832, 44.550327, -8.134782), (18.986069, 45.677273, -7.288069), (19.341476, 45.677273, -6.2844267), (21.588531, 44.550327, -7.014539), (21.588531, 44.550327, -7.014539), (19.341476, 45.677273, -6.2844267), (19.643871, 45.677273, -5.2635593), (21.926058, 44.550327, -5.8750696), (21.926058, 44.550327, -5.8750696), (19.643871, 45.677273, -5.2635593), (19.892424, 45.677273, -4.2282653), (22.203485, 44.550327, -4.7194967), (22.203485, 44.550327, -4.7194967), (19.892424, 45.677273, -4.2282653), (20.086452, 45.677273, -3.1813815), (22.420055, 44.550327, -3.550988), (22.420055, 44.550327, -3.550988), (20.086452, 45.677273, -3.1813815), (20.225426, 45.677273, -2.1257777), (22.575174, 44.550327, -2.3727465), (22.575174, 44.550327, -2.3727465), (20.225426, 45.677273, -2.1257777), (20.308962, 45.677273, -1.0643475), (22.668417, 44.550327, -1.1880014), (22.668417, 44.550327, -1.1880014), (20.308962, 45.677273, -1.0643475), (20.336832, 45.677273, 0), (22.699526, 44.550327, 0), (20.336832, 45.677273, 0), (17.918398, 46.67902, 0), (17.89384, 46.67902, 0.93777645), (20.308962, 45.677273, 1.0643475), (20.308962, 45.677273, 1.0643475), (17.89384, 46.67902, 0.93777645), (17.820238, 46.67902, 1.8729825), (20.225426, 45.677273, 2.1257777), (20.225426, 45.677273, 2.1257777), (17.820238, 46.67902, 1.8729825), (17.697792, 46.67902, 2.8030548), (20.086452, 45.677273, 3.1813815), (20.086452, 45.677273, 3.1813815), (17.697792, 46.67902, 2.8030548), (17.526838, 46.67902, 3.7254443), (19.892424, 45.677273, 4.2282653), (19.892424, 45.677273, 4.2282653), (17.526838, 46.67902, 3.7254443), (17.307842, 46.67902, 4.6376224), (19.643871, 45.677273, 5.2635593), (19.643871, 45.677273, 5.2635593), (17.307842, 46.67902, 4.6376224), (17.041409, 46.67902, 5.5370893), (19.341476, 45.677273, 6.2844267), (19.341476, 45.677273, 6.2844267), (17.041409, 46.67902, 5.5370893), (16.728266, 46.67902, 6.4213796), (18.986069, 45.677273, 7.288069), (18.986069, 45.677273, 7.288069), (16.728266, 46.67902, 6.4213796), (16.36927, 46.67902, 7.288069), (18.57862, 45.677273, 8.271735), (18.57862, 45.677273, 8.271735), (16.36927, 46.67902, 7.288069), (15.965409, 46.67902, 8.134782), (18.12025, 45.677273, 9.232729), (18.12025, 45.677273, 9.232729), (15.965409, 46.67902, 8.134782), (15.517787, 46.67902, 8.959199), (17.612213, 45.677273, 10.168416), (17.612213, 45.677273, 10.168416), (15.517787, 46.67902, 8.959199), (15.027633, 46.67902, 9.759059), (17.055902, 45.677273, 11.076233), (17.055902, 45.677273, 11.076233), (15.027633, 46.67902, 9.759059), (14.496288, 46.67902, 10.532169), (16.452843, 45.677273, 11.95369), (16.452843, 45.677273, 11.95369), (14.496288, 46.67902, 10.532169), (13.92521, 46.67902, 11.276413), (15.804687, 45.677273, 12.798383), (15.804687, 45.677273, 12.798383), (13.92521, 46.67902, 11.276413), (13.315965, 46.67902, 11.989748), (15.113212, 45.677273, 13.607997), (15.113212, 45.677273, 13.607997), (13.315965, 46.67902, 11.989748), (12.67022, 46.67902, 12.67022), (14.380312, 45.677273, 14.380312), (14.380312, 45.677273, 14.380312), (12.67022, 46.67902, 12.67022), (11.989748, 46.67902, 13.315965), (13.607997, 45.677273, 15.113212), (13.607997, 45.677273, 15.113212), (11.989748, 46.67902, 13.315965), (11.276413, 46.67902, 13.92521), (12.798383, 45.677273, 15.804687), (12.798383, 45.677273, 15.804687), (11.276413, 46.67902, 13.92521), (10.532169, 46.67902, 14.496288), (11.95369, 45.677273, 16.452843), (11.95369, 45.677273, 16.452843), (10.532169, 46.67902, 14.496288), (9.759059, 46.67902, 15.027633), (11.076233, 45.677273, 17.055902), (11.076233, 45.677273, 17.055902), (9.759059, 46.67902, 15.027633), (8.959199, 46.67902, 15.517787), (10.168416, 45.677273, 17.612213), (10.168416, 45.677273, 17.612213), (8.959199, 46.67902, 15.517787), (8.134782, 46.67902, 15.965409), (9.232729, 45.677273, 18.12025), (9.232729, 45.677273, 18.12025), (8.134782, 46.67902, 15.965409), (7.288069, 46.67902, 16.36927), (8.271735, 45.677273, 18.57862), (8.271735, 45.677273, 18.57862), (7.288069, 46.67902, 16.36927), (6.4213796, 46.67902, 16.728266), (7.288069, 45.677273, 18.986069), (7.288069, 45.677273, 18.986069), (6.4213796, 46.67902, 16.728266), (5.5370893, 46.67902, 17.041409), (6.2844267, 45.677273, 19.341476), (6.2844267, 45.677273, 19.341476), (5.5370893, 46.67902, 17.041409), (4.6376224, 46.67902, 17.307842), (5.2635593, 45.677273, 19.643871), (5.2635593, 45.677273, 19.643871), (4.6376224, 46.67902, 17.307842), (3.7254443, 46.67902, 17.526838), (4.2282653, 45.677273, 19.892424), (4.2282653, 45.677273, 19.892424), (3.7254443, 46.67902, 17.526838), (2.8030548, 46.67902, 17.697792), (3.1813815, 45.677273, 20.086452), (3.1813815, 45.677273, 20.086452), (2.8030548, 46.67902, 17.697792), (1.8729825, 46.67902, 17.820238), (2.1257777, 45.677273, 20.225426), (2.1257777, 45.677273, 20.225426), (1.8729825, 46.67902, 17.820238), (0.93777645, 46.67902, 17.89384), (1.0643475, 45.677273, 20.308962), (1.0643475, 45.677273, 20.308962), (0.93777645, 46.67902, 17.89384), (1.0971854e-15, 46.67902, 17.918398), (1.2452718e-15, 45.677273, 20.336832), (1.2452718e-15, 45.677273, 20.336832), (1.0971854e-15, 46.67902, 17.918398), (-0.93777645, 46.67902, 17.89384), (-1.0643475, 45.677273, 20.308962), (-1.0643475, 45.677273, 20.308962), (-0.93777645, 46.67902, 17.89384), (-1.8729825, 46.67902, 17.820238), (-2.1257777, 45.677273, 20.225426), (-2.1257777, 45.677273, 20.225426), (-1.8729825, 46.67902, 17.820238), (-2.8030548, 46.67902, 17.697792), (-3.1813815, 45.677273, 20.086452), (-3.1813815, 45.677273, 20.086452), (-2.8030548, 46.67902, 17.697792), (-3.7254443, 46.67902, 17.526838), (-4.2282653, 45.677273, 19.892424), (-4.2282653, 45.677273, 19.892424), (-3.7254443, 46.67902, 17.526838), (-4.6376224, 46.67902, 17.307842), (-5.2635593, 45.677273, 19.643871), (-5.2635593, 45.677273, 19.643871), (-4.6376224, 46.67902, 17.307842), (-5.5370893, 46.67902, 17.041409), (-6.2844267, 45.677273, 19.341476), (-6.2844267, 45.677273, 19.341476), (-5.5370893, 46.67902, 17.041409), (-6.4213796, 46.67902, 16.728266), (-7.288069, 45.677273, 18.986069), (-7.288069, 45.677273, 18.986069), (-6.4213796, 46.67902, 16.728266), (-7.288069, 46.67902, 16.36927), (-8.271735, 45.677273, 18.57862), (-8.271735, 45.677273, 18.57862), (-7.288069, 46.67902, 16.36927), (-8.134782, 46.67902, 15.965409), (-9.232729, 45.677273, 18.12025), (-9.232729, 45.677273, 18.12025), (-8.134782, 46.67902, 15.965409), (-8.959199, 46.67902, 15.517787), (-10.168416, 45.677273, 17.612213), (-10.168416, 45.677273, 17.612213), (-8.959199, 46.67902, 15.517787), (-9.759059, 46.67902, 15.027633), (-11.076233, 45.677273, 17.055902), (-11.076233, 45.677273, 17.055902), (-9.759059, 46.67902, 15.027633), (-10.532169, 46.67902, 14.496288), (-11.95369, 45.677273, 16.452843), (-11.95369, 45.677273, 16.452843), (-10.532169, 46.67902, 14.496288), (-11.276413, 46.67902, 13.92521), (-12.798383, 45.677273, 15.804687), (-12.798383, 45.677273, 15.804687), (-11.276413, 46.67902, 13.92521), (-11.989748, 46.67902, 13.315965), (-13.607997, 45.677273, 15.113212), (-13.607997, 45.677273, 15.113212), (-11.989748, 46.67902, 13.315965), (-12.67022, 46.67902, 12.67022), (-14.380312, 45.677273, 14.380312), (-14.380312, 45.677273, 14.380312), (-12.67022, 46.67902, 12.67022), (-13.315965, 46.67902, 11.989748), (-15.113212, 45.677273, 13.607997), (-15.113212, 45.677273, 13.607997), (-13.315965, 46.67902, 11.989748), (-13.92521, 46.67902, 11.276413), (-15.804687, 45.677273, 12.798383), (-15.804687, 45.677273, 12.798383), (-13.92521, 46.67902, 11.276413), (-14.496288, 46.67902, 10.532169), (-16.452843, 45.677273, 11.95369), (-16.452843, 45.677273, 11.95369), (-14.496288, 46.67902, 10.532169), (-15.027633, 46.67902, 9.759059), (-17.055902, 45.677273, 11.076233), (-17.055902, 45.677273, 11.076233), (-15.027633, 46.67902, 9.759059), (-15.517787, 46.67902, 8.959199), (-17.612213, 45.677273, 10.168416), (-17.612213, 45.677273, 10.168416), (-15.517787, 46.67902, 8.959199), (-15.965409, 46.67902, 8.134782), (-18.12025, 45.677273, 9.232729), (-18.12025, 45.677273, 9.232729), (-15.965409, 46.67902, 8.134782), (-16.36927, 46.67902, 7.288069), (-18.57862, 45.677273, 8.271735), (-18.57862, 45.677273, 8.271735), (-16.36927, 46.67902, 7.288069), (-16.728266, 46.67902, 6.4213796), (-18.986069, 45.677273, 7.288069), (-18.986069, 45.677273, 7.288069), (-16.728266, 46.67902, 6.4213796), (-17.041409, 46.67902, 5.5370893), (-19.341476, 45.677273, 6.2844267), (-19.341476, 45.677273, 6.2844267), (-17.041409, 46.67902, 5.5370893), (-17.307842, 46.67902, 4.6376224), (-19.643871, 45.677273, 5.2635593), (-19.643871, 45.677273, 5.2635593), (-17.307842, 46.67902, 4.6376224), (-17.526838, 46.67902, 3.7254443), (-19.892424, 45.677273, 4.2282653), (-19.892424, 45.677273, 4.2282653), (-17.526838, 46.67902, 3.7254443), (-17.697792, 46.67902, 2.8030548), (-20.086452, 45.677273, 3.1813815), (-20.086452, 45.677273, 3.1813815), (-17.697792, 46.67902, 2.8030548), (-17.820238, 46.67902, 1.8729825), (-20.225426, 45.677273, 2.1257777), (-20.225426, 45.677273, 2.1257777), (-17.820238, 46.67902, 1.8729825), (-17.89384, 46.67902, 0.93777645), (-20.308962, 45.677273, 1.0643475), (-20.308962, 45.677273, 1.0643475), (-17.89384, 46.67902, 0.93777645), (-17.918398, 46.67902, 2.1943708e-15), (-20.336832, 45.677273, 2.4905437e-15), (-20.336832, 45.677273, 2.4905437e-15), (-17.918398, 46.67902, 2.1943708e-15), (-17.89384, 46.67902, -0.93777645), (-20.308962, 45.677273, -1.0643475), (-20.308962, 45.677273, -1.0643475), (-17.89384, 46.67902, -0.93777645), (-17.820238, 46.67902, -1.8729825), (-20.225426, 45.677273, -2.1257777), (-20.225426, 45.677273, -2.1257777), (-17.820238, 46.67902, -1.8729825), (-17.697792, 46.67902, -2.8030548), (-20.086452, 45.677273, -3.1813815), (-20.086452, 45.677273, -3.1813815), (-17.697792, 46.67902, -2.8030548), (-17.526838, 46.67902, -3.7254443), (-19.892424, 45.677273, -4.2282653), (-19.892424, 45.677273, -4.2282653), (-17.526838, 46.67902, -3.7254443), (-17.307842, 46.67902, -4.6376224), (-19.643871, 45.677273, -5.2635593), (-19.643871, 45.677273, -5.2635593), (-17.307842, 46.67902, -4.6376224), (-17.041409, 46.67902, -5.5370893), (-19.341476, 45.677273, -6.2844267), (-19.341476, 45.677273, -6.2844267), (-17.041409, 46.67902, -5.5370893), (-16.728266, 46.67902, -6.4213796), (-18.986069, 45.677273, -7.288069), (-18.986069, 45.677273, -7.288069), (-16.728266, 46.67902, -6.4213796), (-16.36927, 46.67902, -7.288069), (-18.57862, 45.677273, -8.271735), (-18.57862, 45.677273, -8.271735), (-16.36927, 46.67902, -7.288069), (-15.965409, 46.67902, -8.134782), (-18.12025, 45.677273, -9.232729), (-18.12025, 45.677273, -9.232729), (-15.965409, 46.67902, -8.134782), (-15.517787, 46.67902, -8.959199), (-17.612213, 45.677273, -10.168416), (-17.612213, 45.677273, -10.168416), (-15.517787, 46.67902, -8.959199), (-15.027633, 46.67902, -9.759059), (-17.055902, 45.677273, -11.076233), (-17.055902, 45.677273, -11.076233), (-15.027633, 46.67902, -9.759059), (-14.496288, 46.67902, -10.532169), (-16.452843, 45.677273, -11.95369), (-16.452843, 45.677273, -11.95369), (-14.496288, 46.67902, -10.532169), (-13.92521, 46.67902, -11.276413), (-15.804687, 45.677273, -12.798383), (-15.804687, 45.677273, -12.798383), (-13.92521, 46.67902, -11.276413), (-13.315965, 46.67902, -11.989748), (-15.113212, 45.677273, -13.607997), (-15.113212, 45.677273, -13.607997), (-13.315965, 46.67902, -11.989748), (-12.67022, 46.67902, -12.67022), (-14.380312, 45.677273, -14.380312), (-14.380312, 45.677273, -14.380312), (-12.67022, 46.67902, -12.67022), (-11.989748, 46.67902, -13.315965), (-13.607997, 45.677273, -15.113212), (-13.607997, 45.677273, -15.113212), (-11.989748, 46.67902, -13.315965), (-11.276413, 46.67902, -13.92521), (-12.798383, 45.677273, -15.804687), (-12.798383, 45.677273, -15.804687), (-11.276413, 46.67902, -13.92521), (-10.532169, 46.67902, -14.496288), (-11.95369, 45.677273, -16.452843), (-11.95369, 45.677273, -16.452843), (-10.532169, 46.67902, -14.496288), (-9.759059, 46.67902, -15.027633), (-11.076233, 45.677273, -17.055902), (-11.076233, 45.677273, -17.055902), (-9.759059, 46.67902, -15.027633), (-8.959199, 46.67902, -15.517787), (-10.168416, 45.677273, -17.612213), (-10.168416, 45.677273, -17.612213), (-8.959199, 46.67902, -15.517787), (-8.134782, 46.67902, -15.965409), (-9.232729, 45.677273, -18.12025), (-9.232729, 45.677273, -18.12025), (-8.134782, 46.67902, -15.965409), (-7.288069, 46.67902, -16.36927), (-8.271735, 45.677273, -18.57862), (-8.271735, 45.677273, -18.57862), (-7.288069, 46.67902, -16.36927), (-6.4213796, 46.67902, -16.728266), (-7.288069, 45.677273, -18.986069), (-7.288069, 45.677273, -18.986069), (-6.4213796, 46.67902, -16.728266), (-5.5370893, 46.67902, -17.041409), (-6.2844267, 45.677273, -19.341476), (-6.2844267, 45.677273, -19.341476), (-5.5370893, 46.67902, -17.041409), (-4.6376224, 46.67902, -17.307842), (-5.2635593, 45.677273, -19.643871), (-5.2635593, 45.677273, -19.643871), (-4.6376224, 46.67902, -17.307842), (-3.7254443, 46.67902, -17.526838), (-4.2282653, 45.677273, -19.892424), (-4.2282653, 45.677273, -19.892424), (-3.7254443, 46.67902, -17.526838), (-2.8030548, 46.67902, -17.697792), (-3.1813815, 45.677273, -20.086452), (-3.1813815, 45.677273, -20.086452), (-2.8030548, 46.67902, -17.697792), (-1.8729825, 46.67902, -17.820238), (-2.1257777, 45.677273, -20.225426), (-2.1257777, 45.677273, -20.225426), (-1.8729825, 46.67902, -17.820238), (-0.93777645, 46.67902, -17.89384), (-1.0643475, 45.677273, -20.308962), (-1.0643475, 45.677273, -20.308962), (-0.93777645, 46.67902, -17.89384), (-3.2915563e-15, 46.67902, -17.918398), (-3.7358155e-15, 45.677273, -20.336832), (-3.7358155e-15, 45.677273, -20.336832), (-3.2915563e-15, 46.67902, -17.918398), (0.93777645, 46.67902, -17.89384), (1.0643475, 45.677273, -20.308962), (1.0643475, 45.677273, -20.308962), (0.93777645, 46.67902, -17.89384), (1.8729825, 46.67902, -17.820238), (2.1257777, 45.677273, -20.225426), (2.1257777, 45.677273, -20.225426), (1.8729825, 46.67902, -17.820238), (2.8030548, 46.67902, -17.697792), (3.1813815, 45.677273, -20.086452), (3.1813815, 45.677273, -20.086452), (2.8030548, 46.67902, -17.697792), (3.7254443, 46.67902, -17.526838), (4.2282653, 45.677273, -19.892424), (4.2282653, 45.677273, -19.892424), (3.7254443, 46.67902, -17.526838), (4.6376224, 46.67902, -17.307842), (5.2635593, 45.677273, -19.643871), (5.2635593, 45.677273, -19.643871), (4.6376224, 46.67902, -17.307842), (5.5370893, 46.67902, -17.041409), (6.2844267, 45.677273, -19.341476), (6.2844267, 45.677273, -19.341476), (5.5370893, 46.67902, -17.041409), (6.4213796, 46.67902, -16.728266), (7.288069, 45.677273, -18.986069), (7.288069, 45.677273, -18.986069), (6.4213796, 46.67902, -16.728266), (7.288069, 46.67902, -16.36927), (8.271735, 45.677273, -18.57862), (8.271735, 45.677273, -18.57862), (7.288069, 46.67902, -16.36927), (8.134782, 46.67902, -15.965409), (9.232729, 45.677273, -18.12025), (9.232729, 45.677273, -18.12025), (8.134782, 46.67902, -15.965409), (8.959199, 46.67902, -15.517787), (10.168416, 45.677273, -17.612213), (10.168416, 45.677273, -17.612213), (8.959199, 46.67902, -15.517787), (9.759059, 46.67902, -15.027633), (11.076233, 45.677273, -17.055902), (11.076233, 45.677273, -17.055902), (9.759059, 46.67902, -15.027633), (10.532169, 46.67902, -14.496288), (11.95369, 45.677273, -16.452843), (11.95369, 45.677273, -16.452843), (10.532169, 46.67902, -14.496288), (11.276413, 46.67902, -13.92521), (12.798383, 45.677273, -15.804687), (12.798383, 45.677273, -15.804687), (11.276413, 46.67902, -13.92521), (11.989748, 46.67902, -13.315965), (13.607997, 45.677273, -15.113212), (13.607997, 45.677273, -15.113212), (11.989748, 46.67902, -13.315965), (12.67022, 46.67902, -12.67022), (14.380312, 45.677273, -14.380312), (14.380312, 45.677273, -14.380312), (12.67022, 46.67902, -12.67022), (13.315965, 46.67902, -11.989748), (15.113212, 45.677273, -13.607997), (15.113212, 45.677273, -13.607997), (13.315965, 46.67902, -11.989748), (13.92521, 46.67902, -11.276413), (15.804687, 45.677273, -12.798383), (15.804687, 45.677273, -12.798383), (13.92521, 46.67902, -11.276413), (14.496288, 46.67902, -10.532169), (16.452843, 45.677273, -11.95369), (16.452843, 45.677273, -11.95369), (14.496288, 46.67902, -10.532169), (15.027633, 46.67902, -9.759059), (17.055902, 45.677273, -11.076233), (17.055902, 45.677273, -11.076233), (15.027633, 46.67902, -9.759059), (15.517787, 46.67902, -8.959199), (17.612213, 45.677273, -10.168416), (17.612213, 45.677273, -10.168416), (15.517787, 46.67902, -8.959199), (15.965409, 46.67902, -8.134782), (18.12025, 45.677273, -9.232729), (18.12025, 45.677273, -9.232729), (15.965409, 46.67902, -8.134782), (16.36927, 46.67902, -7.288069), (18.57862, 45.677273, -8.271735), (18.57862, 45.677273, -8.271735), (16.36927, 46.67902, -7.288069), (16.728266, 46.67902, -6.4213796), (18.986069, 45.677273, -7.288069), (18.986069, 45.677273, -7.288069), (16.728266, 46.67902, -6.4213796), (17.041409, 46.67902, -5.5370893), (19.341476, 45.677273, -6.2844267), (19.341476, 45.677273, -6.2844267), (17.041409, 46.67902, -5.5370893), (17.307842, 46.67902, -4.6376224), (19.643871, 45.677273, -5.2635593), (19.643871, 45.677273, -5.2635593), (17.307842, 46.67902, -4.6376224), (17.526838, 46.67902, -3.7254443), (19.892424, 45.677273, -4.2282653), (19.892424, 45.677273, -4.2282653), (17.526838, 46.67902, -3.7254443), (17.697792, 46.67902, -2.8030548), (20.086452, 45.677273, -3.1813815), (20.086452, 45.677273, -3.1813815), (17.697792, 46.67902, -2.8030548), (17.820238, 46.67902, -1.8729825), (20.225426, 45.677273, -2.1257777), (20.225426, 45.677273, -2.1257777), (17.820238, 46.67902, -1.8729825), (17.89384, 46.67902, -0.93777645), (20.308962, 45.677273, -1.0643475), (20.308962, 45.677273, -1.0643475), (17.89384, 46.67902, -0.93777645), (17.918398, 46.67902, 0), (20.336832, 45.677273, 0), (17.918398, 46.67902, 0), (15.45085, 47.552826, 0), (15.429675, 47.552826, 0.808635), (17.89384, 46.67902, 0.93777645), (17.89384, 46.67902, 0.93777645), (15.429675, 47.552826, 0.808635), (15.366208, 47.552826, 1.6150535), (17.820238, 46.67902, 1.8729825), (17.820238, 46.67902, 1.8729825), (15.366208, 47.552826, 1.6150535), (15.260624, 47.552826, 2.4170454), (17.697792, 46.67902, 2.8030548), (17.697792, 46.67902, 2.8030548), (15.260624, 47.552826, 2.4170454), (15.113212, 47.552826, 3.2124124), (17.526838, 46.67902, 3.7254443), (17.526838, 46.67902, 3.7254443), (15.113212, 47.552826, 3.2124124), (14.924375, 47.552826, 3.998974), (17.307842, 46.67902, 4.6376224), (17.307842, 46.67902, 4.6376224), (14.924375, 47.552826, 3.998974), (14.694632, 47.552826, 4.774575), (17.041409, 46.67902, 5.5370893), (17.041409, 46.67902, 5.5370893), (14.694632, 47.552826, 4.774575), (14.424611, 47.552826, 5.5370893), (16.728266, 46.67902, 6.4213796), (16.728266, 46.67902, 6.4213796), (14.424611, 47.552826, 5.5370893), (14.115053, 47.552826, 6.2844267), (16.36927, 46.67902, 7.288069), (16.36927, 46.67902, 7.288069), (14.115053, 47.552826, 6.2844267), (13.766808, 47.552826, 7.014539), (15.965409, 46.67902, 8.134782), (15.965409, 46.67902, 8.134782), (13.766808, 47.552826, 7.014539), (13.380828, 47.552826, 7.725425), (15.517787, 46.67902, 8.959199), (15.517787, 46.67902, 8.959199), (13.380828, 47.552826, 7.725425), (12.958173, 47.552826, 8.415136), (15.027633, 46.67902, 9.759059), (15.027633, 46.67902, 9.759059), (12.958173, 47.552826, 8.415136), (12.5, 47.552826, 9.081781), (14.496288, 46.67902, 10.532169), (14.496288, 46.67902, 10.532169), (12.5, 47.552826, 9.081781), (12.0075655, 47.552826, 9.723535), (13.92521, 46.67902, 11.276413), (13.92521, 46.67902, 11.276413), (12.0075655, 47.552826, 9.723535), (11.482219, 47.552826, 10.338636), (13.315965, 46.67902, 11.989748), (13.315965, 46.67902, 11.989748), (11.482219, 47.552826, 10.338636), (10.925401, 47.552826, 10.925401), (12.67022, 46.67902, 12.67022), (12.67022, 46.67902, 12.67022), (10.925401, 47.552826, 10.925401), (10.338636, 47.552826, 11.482219), (11.989748, 46.67902, 13.315965), (11.989748, 46.67902, 13.315965), (10.338636, 47.552826, 11.482219), (9.723535, 47.552826, 12.0075655), (11.276413, 46.67902, 13.92521), (11.276413, 46.67902, 13.92521), (9.723535, 47.552826, 12.0075655), (9.081781, 47.552826, 12.5), (10.532169, 46.67902, 14.496288), (10.532169, 46.67902, 14.496288), (9.081781, 47.552826, 12.5), (8.415136, 47.552826, 12.958173), (9.759059, 46.67902, 15.027633), (9.759059, 46.67902, 15.027633), (8.415136, 47.552826, 12.958173), (7.725425, 47.552826, 13.380828), (8.959199, 46.67902, 15.517787), (8.959199, 46.67902, 15.517787), (7.725425, 47.552826, 13.380828), (7.014539, 47.552826, 13.766808), (8.134782, 46.67902, 15.965409), (8.134782, 46.67902, 15.965409), (7.014539, 47.552826, 13.766808), (6.2844267, 47.552826, 14.115053), (7.288069, 46.67902, 16.36927), (7.288069, 46.67902, 16.36927), (6.2844267, 47.552826, 14.115053), (5.5370893, 47.552826, 14.424611), (6.4213796, 46.67902, 16.728266), (6.4213796, 46.67902, 16.728266), (5.5370893, 47.552826, 14.424611), (4.774575, 47.552826, 14.694632), (5.5370893, 46.67902, 17.041409), (5.5370893, 46.67902, 17.041409), (4.774575, 47.552826, 14.694632), (3.998974, 47.552826, 14.924375), (4.6376224, 46.67902, 17.307842), (4.6376224, 46.67902, 17.307842), (3.998974, 47.552826, 14.924375), (3.2124124, 47.552826, 15.113212), (3.7254443, 46.67902, 17.526838), (3.7254443, 46.67902, 17.526838), (3.2124124, 47.552826, 15.113212), (2.4170454, 47.552826, 15.260624), (2.8030548, 46.67902, 17.697792), (2.8030548, 46.67902, 17.697792), (2.4170454, 47.552826, 15.260624), (1.6150535, 47.552826, 15.366208), (1.8729825, 46.67902, 17.820238), (1.8729825, 46.67902, 17.820238), (1.6150535, 47.552826, 15.366208), (0.808635, 47.552826, 15.429675), (0.93777645, 46.67902, 17.89384), (0.93777645, 46.67902, 17.89384), (0.808635, 47.552826, 15.429675), (9.460917e-16, 47.552826, 15.45085), (1.0971854e-15, 46.67902, 17.918398), (1.0971854e-15, 46.67902, 17.918398), (9.460917e-16, 47.552826, 15.45085), (-0.808635, 47.552826, 15.429675), (-0.93777645, 46.67902, 17.89384), (-0.93777645, 46.67902, 17.89384), (-0.808635, 47.552826, 15.429675), (-1.6150535, 47.552826, 15.366208), (-1.8729825, 46.67902, 17.820238), (-1.8729825, 46.67902, 17.820238), (-1.6150535, 47.552826, 15.366208), (-2.4170454, 47.552826, 15.260624), (-2.8030548, 46.67902, 17.697792), (-2.8030548, 46.67902, 17.697792), (-2.4170454, 47.552826, 15.260624), (-3.2124124, 47.552826, 15.113212), (-3.7254443, 46.67902, 17.526838), (-3.7254443, 46.67902, 17.526838), (-3.2124124, 47.552826, 15.113212), (-3.998974, 47.552826, 14.924375), (-4.6376224, 46.67902, 17.307842), (-4.6376224, 46.67902, 17.307842), (-3.998974, 47.552826, 14.924375), (-4.774575, 47.552826, 14.694632), (-5.5370893, 46.67902, 17.041409), (-5.5370893, 46.67902, 17.041409), (-4.774575, 47.552826, 14.694632), (-5.5370893, 47.552826, 14.424611), (-6.4213796, 46.67902, 16.728266), (-6.4213796, 46.67902, 16.728266), (-5.5370893, 47.552826, 14.424611), (-6.2844267, 47.552826, 14.115053), (-7.288069, 46.67902, 16.36927), (-7.288069, 46.67902, 16.36927), (-6.2844267, 47.552826, 14.115053), (-7.014539, 47.552826, 13.766808), (-8.134782, 46.67902, 15.965409), (-8.134782, 46.67902, 15.965409), (-7.014539, 47.552826, 13.766808), (-7.725425, 47.552826, 13.380828), (-8.959199, 46.67902, 15.517787), (-8.959199, 46.67902, 15.517787), (-7.725425, 47.552826, 13.380828), (-8.415136, 47.552826, 12.958173), (-9.759059, 46.67902, 15.027633), (-9.759059, 46.67902, 15.027633), (-8.415136, 47.552826, 12.958173), (-9.081781, 47.552826, 12.5), (-10.532169, 46.67902, 14.496288), (-10.532169, 46.67902, 14.496288), (-9.081781, 47.552826, 12.5), (-9.723535, 47.552826, 12.0075655), (-11.276413, 46.67902, 13.92521), (-11.276413, 46.67902, 13.92521), (-9.723535, 47.552826, 12.0075655), (-10.338636, 47.552826, 11.482219), (-11.989748, 46.67902, 13.315965), (-11.989748, 46.67902, 13.315965), (-10.338636, 47.552826, 11.482219), (-10.925401, 47.552826, 10.925401), (-12.67022, 46.67902, 12.67022), (-12.67022, 46.67902, 12.67022), (-10.925401, 47.552826, 10.925401), (-11.482219, 47.552826, 10.338636), (-13.315965, 46.67902, 11.989748), (-13.315965, 46.67902, 11.989748), (-11.482219, 47.552826, 10.338636), (-12.0075655, 47.552826, 9.723535), (-13.92521, 46.67902, 11.276413), (-13.92521, 46.67902, 11.276413), (-12.0075655, 47.552826, 9.723535), (-12.5, 47.552826, 9.081781), (-14.496288, 46.67902, 10.532169), (-14.496288, 46.67902, 10.532169), (-12.5, 47.552826, 9.081781), (-12.958173, 47.552826, 8.415136), (-15.027633, 46.67902, 9.759059), (-15.027633, 46.67902, 9.759059), (-12.958173, 47.552826, 8.415136), (-13.380828, 47.552826, 7.725425), (-15.517787, 46.67902, 8.959199), (-15.517787, 46.67902, 8.959199), (-13.380828, 47.552826, 7.725425), (-13.766808, 47.552826, 7.014539), (-15.965409, 46.67902, 8.134782), (-15.965409, 46.67902, 8.134782), (-13.766808, 47.552826, 7.014539), (-14.115053, 47.552826, 6.2844267), (-16.36927, 46.67902, 7.288069), (-16.36927, 46.67902, 7.288069), (-14.115053, 47.552826, 6.2844267), (-14.424611, 47.552826, 5.5370893), (-16.728266, 46.67902, 6.4213796), (-16.728266, 46.67902, 6.4213796), (-14.424611, 47.552826, 5.5370893), (-14.694632, 47.552826, 4.774575), (-17.041409, 46.67902, 5.5370893), (-17.041409, 46.67902, 5.5370893), (-14.694632, 47.552826, 4.774575), (-14.924375, 47.552826, 3.998974), (-17.307842, 46.67902, 4.6376224), (-17.307842, 46.67902, 4.6376224), (-14.924375, 47.552826, 3.998974), (-15.113212, 47.552826, 3.2124124), (-17.526838, 46.67902, 3.7254443), (-17.526838, 46.67902, 3.7254443), (-15.113212, 47.552826, 3.2124124), (-15.260624, 47.552826, 2.4170454), (-17.697792, 46.67902, 2.8030548), (-17.697792, 46.67902, 2.8030548), (-15.260624, 47.552826, 2.4170454), (-15.366208, 47.552826, 1.6150535), (-17.820238, 46.67902, 1.8729825), (-17.820238, 46.67902, 1.8729825), (-15.366208, 47.552826, 1.6150535), (-15.429675, 47.552826, 0.808635), (-17.89384, 46.67902, 0.93777645), (-17.89384, 46.67902, 0.93777645), (-15.429675, 47.552826, 0.808635), (-15.45085, 47.552826, 1.8921833e-15), (-17.918398, 46.67902, 2.1943708e-15), (-17.918398, 46.67902, 2.1943708e-15), (-15.45085, 47.552826, 1.8921833e-15), (-15.429675, 47.552826, -0.808635), (-17.89384, 46.67902, -0.93777645), (-17.89384, 46.67902, -0.93777645), (-15.429675, 47.552826, -0.808635), (-15.366208, 47.552826, -1.6150535), (-17.820238, 46.67902, -1.8729825), (-17.820238, 46.67902, -1.8729825), (-15.366208, 47.552826, -1.6150535), (-15.260624, 47.552826, -2.4170454), (-17.697792, 46.67902, -2.8030548), (-17.697792, 46.67902, -2.8030548), (-15.260624, 47.552826, -2.4170454), (-15.113212, 47.552826, -3.2124124), (-17.526838, 46.67902, -3.7254443), (-17.526838, 46.67902, -3.7254443), (-15.113212, 47.552826, -3.2124124), (-14.924375, 47.552826, -3.998974), (-17.307842, 46.67902, -4.6376224), (-17.307842, 46.67902, -4.6376224), (-14.924375, 47.552826, -3.998974), (-14.694632, 47.552826, -4.774575), (-17.041409, 46.67902, -5.5370893), (-17.041409, 46.67902, -5.5370893), (-14.694632, 47.552826, -4.774575), (-14.424611, 47.552826, -5.5370893), (-16.728266, 46.67902, -6.4213796), (-16.728266, 46.67902, -6.4213796), (-14.424611, 47.552826, -5.5370893), (-14.115053, 47.552826, -6.2844267), (-16.36927, 46.67902, -7.288069), (-16.36927, 46.67902, -7.288069), (-14.115053, 47.552826, -6.2844267), (-13.766808, 47.552826, -7.014539), (-15.965409, 46.67902, -8.134782), (-15.965409, 46.67902, -8.134782), (-13.766808, 47.552826, -7.014539), (-13.380828, 47.552826, -7.725425), (-15.517787, 46.67902, -8.959199), (-15.517787, 46.67902, -8.959199), (-13.380828, 47.552826, -7.725425), (-12.958173, 47.552826, -8.415136), (-15.027633, 46.67902, -9.759059), (-15.027633, 46.67902, -9.759059), (-12.958173, 47.552826, -8.415136), (-12.5, 47.552826, -9.081781), (-14.496288, 46.67902, -10.532169), (-14.496288, 46.67902, -10.532169), (-12.5, 47.552826, -9.081781), (-12.0075655, 47.552826, -9.723535), (-13.92521, 46.67902, -11.276413), (-13.92521, 46.67902, -11.276413), (-12.0075655, 47.552826, -9.723535), (-11.482219, 47.552826, -10.338636), (-13.315965, 46.67902, -11.989748), (-13.315965, 46.67902, -11.989748), (-11.482219, 47.552826, -10.338636), (-10.925401, 47.552826, -10.925401), (-12.67022, 46.67902, -12.67022), (-12.67022, 46.67902, -12.67022), (-10.925401, 47.552826, -10.925401), (-10.338636, 47.552826, -11.482219), (-11.989748, 46.67902, -13.315965), (-11.989748, 46.67902, -13.315965), (-10.338636, 47.552826, -11.482219), (-9.723535, 47.552826, -12.0075655), (-11.276413, 46.67902, -13.92521), (-11.276413, 46.67902, -13.92521), (-9.723535, 47.552826, -12.0075655), (-9.081781, 47.552826, -12.5), (-10.532169, 46.67902, -14.496288), (-10.532169, 46.67902, -14.496288), (-9.081781, 47.552826, -12.5), (-8.415136, 47.552826, -12.958173), (-9.759059, 46.67902, -15.027633), (-9.759059, 46.67902, -15.027633), (-8.415136, 47.552826, -12.958173), (-7.725425, 47.552826, -13.380828), (-8.959199, 46.67902, -15.517787), (-8.959199, 46.67902, -15.517787), (-7.725425, 47.552826, -13.380828), (-7.014539, 47.552826, -13.766808), (-8.134782, 46.67902, -15.965409), (-8.134782, 46.67902, -15.965409), (-7.014539, 47.552826, -13.766808), (-6.2844267, 47.552826, -14.115053), (-7.288069, 46.67902, -16.36927), (-7.288069, 46.67902, -16.36927), (-6.2844267, 47.552826, -14.115053), (-5.5370893, 47.552826, -14.424611), (-6.4213796, 46.67902, -16.728266), (-6.4213796, 46.67902, -16.728266), (-5.5370893, 47.552826, -14.424611), (-4.774575, 47.552826, -14.694632), (-5.5370893, 46.67902, -17.041409), (-5.5370893, 46.67902, -17.041409), (-4.774575, 47.552826, -14.694632), (-3.998974, 47.552826, -14.924375), (-4.6376224, 46.67902, -17.307842), (-4.6376224, 46.67902, -17.307842), (-3.998974, 47.552826, -14.924375), (-3.2124124, 47.552826, -15.113212), (-3.7254443, 46.67902, -17.526838), (-3.7254443, 46.67902, -17.526838), (-3.2124124, 47.552826, -15.113212), (-2.4170454, 47.552826, -15.260624), (-2.8030548, 46.67902, -17.697792), (-2.8030548, 46.67902, -17.697792), (-2.4170454, 47.552826, -15.260624), (-1.6150535, 47.552826, -15.366208), (-1.8729825, 46.67902, -17.820238), (-1.8729825, 46.67902, -17.820238), (-1.6150535, 47.552826, -15.366208), (-0.808635, 47.552826, -15.429675), (-0.93777645, 46.67902, -17.89384), (-0.93777645, 46.67902, -17.89384), (-0.808635, 47.552826, -15.429675), (-2.838275e-15, 47.552826, -15.45085), (-3.2915563e-15, 46.67902, -17.918398), (-3.2915563e-15, 46.67902, -17.918398), (-2.838275e-15, 47.552826, -15.45085), (0.808635, 47.552826, -15.429675), (0.93777645, 46.67902, -17.89384), (0.93777645, 46.67902, -17.89384), (0.808635, 47.552826, -15.429675), (1.6150535, 47.552826, -15.366208), (1.8729825, 46.67902, -17.820238), (1.8729825, 46.67902, -17.820238), (1.6150535, 47.552826, -15.366208), (2.4170454, 47.552826, -15.260624), (2.8030548, 46.67902, -17.697792), (2.8030548, 46.67902, -17.697792), (2.4170454, 47.552826, -15.260624), (3.2124124, 47.552826, -15.113212), (3.7254443, 46.67902, -17.526838), (3.7254443, 46.67902, -17.526838), (3.2124124, 47.552826, -15.113212), (3.998974, 47.552826, -14.924375), (4.6376224, 46.67902, -17.307842), (4.6376224, 46.67902, -17.307842), (3.998974, 47.552826, -14.924375), (4.774575, 47.552826, -14.694632), (5.5370893, 46.67902, -17.041409), (5.5370893, 46.67902, -17.041409), (4.774575, 47.552826, -14.694632), (5.5370893, 47.552826, -14.424611), (6.4213796, 46.67902, -16.728266), (6.4213796, 46.67902, -16.728266), (5.5370893, 47.552826, -14.424611), (6.2844267, 47.552826, -14.115053), (7.288069, 46.67902, -16.36927), (7.288069, 46.67902, -16.36927), (6.2844267, 47.552826, -14.115053), (7.014539, 47.552826, -13.766808), (8.134782, 46.67902, -15.965409), (8.134782, 46.67902, -15.965409), (7.014539, 47.552826, -13.766808), (7.725425, 47.552826, -13.380828), (8.959199, 46.67902, -15.517787), (8.959199, 46.67902, -15.517787), (7.725425, 47.552826, -13.380828), (8.415136, 47.552826, -12.958173), (9.759059, 46.67902, -15.027633), (9.759059, 46.67902, -15.027633), (8.415136, 47.552826, -12.958173), (9.081781, 47.552826, -12.5), (10.532169, 46.67902, -14.496288), (10.532169, 46.67902, -14.496288), (9.081781, 47.552826, -12.5), (9.723535, 47.552826, -12.0075655), (11.276413, 46.67902, -13.92521), (11.276413, 46.67902, -13.92521), (9.723535, 47.552826, -12.0075655), (10.338636, 47.552826, -11.482219), (11.989748, 46.67902, -13.315965), (11.989748, 46.67902, -13.315965), (10.338636, 47.552826, -11.482219), (10.925401, 47.552826, -10.925401), (12.67022, 46.67902, -12.67022), (12.67022, 46.67902, -12.67022), (10.925401, 47.552826, -10.925401), (11.482219, 47.552826, -10.338636), (13.315965, 46.67902, -11.989748), (13.315965, 46.67902, -11.989748), (11.482219, 47.552826, -10.338636), (12.0075655, 47.552826, -9.723535), (13.92521, 46.67902, -11.276413), (13.92521, 46.67902, -11.276413), (12.0075655, 47.552826, -9.723535), (12.5, 47.552826, -9.081781), (14.496288, 46.67902, -10.532169), (14.496288, 46.67902, -10.532169), (12.5, 47.552826, -9.081781), (12.958173, 47.552826, -8.415136), (15.027633, 46.67902, -9.759059), (15.027633, 46.67902, -9.759059), (12.958173, 47.552826, -8.415136), (13.380828, 47.552826, -7.725425), (15.517787, 46.67902, -8.959199), (15.517787, 46.67902, -8.959199), (13.380828, 47.552826, -7.725425), (13.766808, 47.552826, -7.014539), (15.965409, 46.67902, -8.134782), (15.965409, 46.67902, -8.134782), (13.766808, 47.552826, -7.014539), (14.115053, 47.552826, -6.2844267), (16.36927, 46.67902, -7.288069), (16.36927, 46.67902, -7.288069), (14.115053, 47.552826, -6.2844267), (14.424611, 47.552826, -5.5370893), (16.728266, 46.67902, -6.4213796), (16.728266, 46.67902, -6.4213796), (14.424611, 47.552826, -5.5370893), (14.694632, 47.552826, -4.774575), (17.041409, 46.67902, -5.5370893), (17.041409, 46.67902, -5.5370893), (14.694632, 47.552826, -4.774575), (14.924375, 47.552826, -3.998974), (17.307842, 46.67902, -4.6376224), (17.307842, 46.67902, -4.6376224), (14.924375, 47.552826, -3.998974), (15.113212, 47.552826, -3.2124124), (17.526838, 46.67902, -3.7254443), (17.526838, 46.67902, -3.7254443), (15.113212, 47.552826, -3.2124124), (15.260624, 47.552826, -2.4170454), (17.697792, 46.67902, -2.8030548), (17.697792, 46.67902, -2.8030548), (15.260624, 47.552826, -2.4170454), (15.366208, 47.552826, -1.6150535), (17.820238, 46.67902, -1.8729825), (17.820238, 46.67902, -1.8729825), (15.366208, 47.552826, -1.6150535), (15.429675, 47.552826, -0.808635), (17.89384, 46.67902, -0.93777645), (17.89384, 46.67902, -0.93777645), (15.429675, 47.552826, -0.808635), (15.45085, 47.552826, 0), (17.918398, 46.67902, 0), (15.45085, 47.552826, 0), (12.940952, 48.29629, 0), (12.923217, 48.29629, 0.6772771), (15.429675, 47.552826, 0.808635), (15.429675, 47.552826, 0.808635), (12.923217, 48.29629, 0.6772771), (12.87006, 48.29629, 1.3526978), (15.366208, 47.552826, 1.6150535), (15.366208, 47.552826, 1.6150535), (12.87006, 48.29629, 1.3526978), (12.781628, 48.29629, 2.024411), (15.260624, 47.552826, 2.4170454), (15.260624, 47.552826, 2.4170454), (12.781628, 48.29629, 2.024411), (12.658161, 48.29629, 2.6905754), (15.113212, 47.552826, 3.2124124), (15.113212, 47.552826, 3.2124124), (12.658161, 48.29629, 2.6905754), (12.5, 48.29629, 3.349365), (14.924375, 47.552826, 3.998974), (14.924375, 47.552826, 3.998974), (12.5, 48.29629, 3.349365), (12.307577, 48.29629, 3.998974), (14.694632, 47.552826, 4.774575), (14.694632, 47.552826, 4.774575), (12.307577, 48.29629, 3.998974), (12.08142, 48.29629, 4.6376224), (14.424611, 47.552826, 5.5370893), (14.424611, 47.552826, 5.5370893), (12.08142, 48.29629, 4.6376224), (11.822148, 48.29629, 5.2635593), (14.115053, 47.552826, 6.2844267), (14.115053, 47.552826, 6.2844267), (11.822148, 48.29629, 5.2635593), (11.530473, 48.29629, 5.8750696), (13.766808, 47.552826, 7.014539), (13.766808, 47.552826, 7.014539), (11.530473, 48.29629, 5.8750696), (11.207193, 48.29629, 6.470476), (13.380828, 47.552826, 7.725425), (13.380828, 47.552826, 7.725425), (11.207193, 48.29629, 6.470476), (10.853196, 48.29629, 7.0481477), (12.958173, 47.552826, 8.415136), (12.958173, 47.552826, 8.415136), (10.853196, 48.29629, 7.0481477), (10.46945, 48.29629, 7.606501), (12.5, 47.552826, 9.081781), (12.5, 47.552826, 9.081781), (10.46945, 48.29629, 7.606501), (10.057009, 48.29629, 8.144005), (12.0075655, 47.552826, 9.723535), (12.0075655, 47.552826, 9.723535), (10.057009, 48.29629, 8.144005), (9.617002, 48.29629, 8.659187), (11.482219, 47.552826, 10.338636), (11.482219, 47.552826, 10.338636), (9.617002, 48.29629, 8.659187), (9.150635, 48.29629, 9.150635), (10.925401, 47.552826, 10.925401), (10.925401, 47.552826, 10.925401), (9.150635, 48.29629, 9.150635), (8.659187, 48.29629, 9.617002), (10.338636, 47.552826, 11.482219), (10.338636, 47.552826, 11.482219), (8.659187, 48.29629, 9.617002), (8.144005, 48.29629, 10.057009), (9.723535, 47.552826, 12.0075655), (9.723535, 47.552826, 12.0075655), (8.144005, 48.29629, 10.057009), (7.606501, 48.29629, 10.46945), (9.081781, 47.552826, 12.5), (9.081781, 47.552826, 12.5), (7.606501, 48.29629, 10.46945), (7.0481477, 48.29629, 10.853196), (8.415136, 47.552826, 12.958173), (8.415136, 47.552826, 12.958173), (7.0481477, 48.29629, 10.853196), (6.470476, 48.29629, 11.207193), (7.725425, 47.552826, 13.380828), (7.725425, 47.552826, 13.380828), (6.470476, 48.29629, 11.207193), (5.8750696, 48.29629, 11.530473), (7.014539, 47.552826, 13.766808), (7.014539, 47.552826, 13.766808), (5.8750696, 48.29629, 11.530473), (5.2635593, 48.29629, 11.822148), (6.2844267, 47.552826, 14.115053), (6.2844267, 47.552826, 14.115053), (5.2635593, 48.29629, 11.822148), (4.6376224, 48.29629, 12.08142), (5.5370893, 47.552826, 14.424611), (5.5370893, 47.552826, 14.424611), (4.6376224, 48.29629, 12.08142), (3.998974, 48.29629, 12.307577), (4.774575, 47.552826, 14.694632), (4.774575, 47.552826, 14.694632), (3.998974, 48.29629, 12.307577), (3.349365, 48.29629, 12.5), (3.998974, 47.552826, 14.924375), (3.998974, 47.552826, 14.924375), (3.349365, 48.29629, 12.5), (2.6905754, 48.29629, 12.658161), (3.2124124, 47.552826, 15.113212), (3.2124124, 47.552826, 15.113212), (2.6905754, 48.29629, 12.658161), (2.024411, 48.29629, 12.781628), (2.4170454, 47.552826, 15.260624), (2.4170454, 47.552826, 15.260624), (2.024411, 48.29629, 12.781628), (1.3526978, 48.29629, 12.87006), (1.6150535, 47.552826, 15.366208), (1.6150535, 47.552826, 15.366208), (1.3526978, 48.29629, 12.87006), (0.6772771, 48.29629, 12.923217), (0.808635, 47.552826, 15.429675), (0.808635, 47.552826, 15.429675), (0.6772771, 48.29629, 12.923217), (7.924048e-16, 48.29629, 12.940952), (9.460917e-16, 47.552826, 15.45085), (9.460917e-16, 47.552826, 15.45085), (7.924048e-16, 48.29629, 12.940952), (-0.6772771, 48.29629, 12.923217), (-0.808635, 47.552826, 15.429675), (-0.808635, 47.552826, 15.429675), (-0.6772771, 48.29629, 12.923217), (-1.3526978, 48.29629, 12.87006), (-1.6150535, 47.552826, 15.366208), (-1.6150535, 47.552826, 15.366208), (-1.3526978, 48.29629, 12.87006), (-2.024411, 48.29629, 12.781628), (-2.4170454, 47.552826, 15.260624), (-2.4170454, 47.552826, 15.260624), (-2.024411, 48.29629, 12.781628), (-2.6905754, 48.29629, 12.658161), (-3.2124124, 47.552826, 15.113212), (-3.2124124, 47.552826, 15.113212), (-2.6905754, 48.29629, 12.658161), (-3.349365, 48.29629, 12.5), (-3.998974, 47.552826, 14.924375), (-3.998974, 47.552826, 14.924375), (-3.349365, 48.29629, 12.5), (-3.998974, 48.29629, 12.307577), (-4.774575, 47.552826, 14.694632), (-4.774575, 47.552826, 14.694632), (-3.998974, 48.29629, 12.307577), (-4.6376224, 48.29629, 12.08142), (-5.5370893, 47.552826, 14.424611), (-5.5370893, 47.552826, 14.424611), (-4.6376224, 48.29629, 12.08142), (-5.2635593, 48.29629, 11.822148), (-6.2844267, 47.552826, 14.115053), (-6.2844267, 47.552826, 14.115053), (-5.2635593, 48.29629, 11.822148), (-5.8750696, 48.29629, 11.530473), (-7.014539, 47.552826, 13.766808), (-7.014539, 47.552826, 13.766808), (-5.8750696, 48.29629, 11.530473), (-6.470476, 48.29629, 11.207193), (-7.725425, 47.552826, 13.380828), (-7.725425, 47.552826, 13.380828), (-6.470476, 48.29629, 11.207193), (-7.0481477, 48.29629, 10.853196), (-8.415136, 47.552826, 12.958173), (-8.415136, 47.552826, 12.958173), (-7.0481477, 48.29629, 10.853196), (-7.606501, 48.29629, 10.46945), (-9.081781, 47.552826, 12.5), (-9.081781, 47.552826, 12.5), (-7.606501, 48.29629, 10.46945), (-8.144005, 48.29629, 10.057009), (-9.723535, 47.552826, 12.0075655), (-9.723535, 47.552826, 12.0075655), (-8.144005, 48.29629, 10.057009), (-8.659187, 48.29629, 9.617002), (-10.338636, 47.552826, 11.482219), (-10.338636, 47.552826, 11.482219), (-8.659187, 48.29629, 9.617002), (-9.150635, 48.29629, 9.150635), (-10.925401, 47.552826, 10.925401), (-10.925401, 47.552826, 10.925401), (-9.150635, 48.29629, 9.150635), (-9.617002, 48.29629, 8.659187), (-11.482219, 47.552826, 10.338636), (-11.482219, 47.552826, 10.338636), (-9.617002, 48.29629, 8.659187), (-10.057009, 48.29629, 8.144005), (-12.0075655, 47.552826, 9.723535), (-12.0075655, 47.552826, 9.723535), (-10.057009, 48.29629, 8.144005), (-10.46945, 48.29629, 7.606501), (-12.5, 47.552826, 9.081781), (-12.5, 47.552826, 9.081781), (-10.46945, 48.29629, 7.606501), (-10.853196, 48.29629, 7.0481477), (-12.958173, 47.552826, 8.415136), (-12.958173, 47.552826, 8.415136), (-10.853196, 48.29629, 7.0481477), (-11.207193, 48.29629, 6.470476), (-13.380828, 47.552826, 7.725425), (-13.380828, 47.552826, 7.725425), (-11.207193, 48.29629, 6.470476), (-11.530473, 48.29629, 5.8750696), (-13.766808, 47.552826, 7.014539), (-13.766808, 47.552826, 7.014539), (-11.530473, 48.29629, 5.8750696), (-11.822148, 48.29629, 5.2635593), (-14.115053, 47.552826, 6.2844267), (-14.115053, 47.552826, 6.2844267), (-11.822148, 48.29629, 5.2635593), (-12.08142, 48.29629, 4.6376224), (-14.424611, 47.552826, 5.5370893), (-14.424611, 47.552826, 5.5370893), (-12.08142, 48.29629, 4.6376224), (-12.307577, 48.29629, 3.998974), (-14.694632, 47.552826, 4.774575), (-14.694632, 47.552826, 4.774575), (-12.307577, 48.29629, 3.998974), (-12.5, 48.29629, 3.349365), (-14.924375, 47.552826, 3.998974), (-14.924375, 47.552826, 3.998974), (-12.5, 48.29629, 3.349365), (-12.658161, 48.29629, 2.6905754), (-15.113212, 47.552826, 3.2124124), (-15.113212, 47.552826, 3.2124124), (-12.658161, 48.29629, 2.6905754), (-12.781628, 48.29629, 2.024411), (-15.260624, 47.552826, 2.4170454), (-15.260624, 47.552826, 2.4170454), (-12.781628, 48.29629, 2.024411), (-12.87006, 48.29629, 1.3526978), (-15.366208, 47.552826, 1.6150535), (-15.366208, 47.552826, 1.6150535), (-12.87006, 48.29629, 1.3526978), (-12.923217, 48.29629, 0.6772771), (-15.429675, 47.552826, 0.808635), (-15.429675, 47.552826, 0.808635), (-12.923217, 48.29629, 0.6772771), (-12.940952, 48.29629, 1.5848095e-15), (-15.45085, 47.552826, 1.8921833e-15), (-15.45085, 47.552826, 1.8921833e-15), (-12.940952, 48.29629, 1.5848095e-15), (-12.923217, 48.29629, -0.6772771), (-15.429675, 47.552826, -0.808635), (-15.429675, 47.552826, -0.808635), (-12.923217, 48.29629, -0.6772771), (-12.87006, 48.29629, -1.3526978), (-15.366208, 47.552826, -1.6150535), (-15.366208, 47.552826, -1.6150535), (-12.87006, 48.29629, -1.3526978), (-12.781628, 48.29629, -2.024411), (-15.260624, 47.552826, -2.4170454), (-15.260624, 47.552826, -2.4170454), (-12.781628, 48.29629, -2.024411), (-12.658161, 48.29629, -2.6905754), (-15.113212, 47.552826, -3.2124124), (-15.113212, 47.552826, -3.2124124), (-12.658161, 48.29629, -2.6905754), (-12.5, 48.29629, -3.349365), (-14.924375, 47.552826, -3.998974), (-14.924375, 47.552826, -3.998974), (-12.5, 48.29629, -3.349365), (-12.307577, 48.29629, -3.998974), (-14.694632, 47.552826, -4.774575), (-14.694632, 47.552826, -4.774575), (-12.307577, 48.29629, -3.998974), (-12.08142, 48.29629, -4.6376224), (-14.424611, 47.552826, -5.5370893), (-14.424611, 47.552826, -5.5370893), (-12.08142, 48.29629, -4.6376224), (-11.822148, 48.29629, -5.2635593), (-14.115053, 47.552826, -6.2844267), (-14.115053, 47.552826, -6.2844267), (-11.822148, 48.29629, -5.2635593), (-11.530473, 48.29629, -5.8750696), (-13.766808, 47.552826, -7.014539), (-13.766808, 47.552826, -7.014539), (-11.530473, 48.29629, -5.8750696), (-11.207193, 48.29629, -6.470476), (-13.380828, 47.552826, -7.725425), (-13.380828, 47.552826, -7.725425), (-11.207193, 48.29629, -6.470476), (-10.853196, 48.29629, -7.0481477), (-12.958173, 47.552826, -8.415136), (-12.958173, 47.552826, -8.415136), (-10.853196, 48.29629, -7.0481477), (-10.46945, 48.29629, -7.606501), (-12.5, 47.552826, -9.081781), (-12.5, 47.552826, -9.081781), (-10.46945, 48.29629, -7.606501), (-10.057009, 48.29629, -8.144005), (-12.0075655, 47.552826, -9.723535), (-12.0075655, 47.552826, -9.723535), (-10.057009, 48.29629, -8.144005), (-9.617002, 48.29629, -8.659187), (-11.482219, 47.552826, -10.338636), (-11.482219, 47.552826, -10.338636), (-9.617002, 48.29629, -8.659187), (-9.150635, 48.29629, -9.150635), (-10.925401, 47.552826, -10.925401), (-10.925401, 47.552826, -10.925401), (-9.150635, 48.29629, -9.150635), (-8.659187, 48.29629, -9.617002), (-10.338636, 47.552826, -11.482219), (-10.338636, 47.552826, -11.482219), (-8.659187, 48.29629, -9.617002), (-8.144005, 48.29629, -10.057009), (-9.723535, 47.552826, -12.0075655), (-9.723535, 47.552826, -12.0075655), (-8.144005, 48.29629, -10.057009), (-7.606501, 48.29629, -10.46945), (-9.081781, 47.552826, -12.5), (-9.081781, 47.552826, -12.5), (-7.606501, 48.29629, -10.46945), (-7.0481477, 48.29629, -10.853196), (-8.415136, 47.552826, -12.958173), (-8.415136, 47.552826, -12.958173), (-7.0481477, 48.29629, -10.853196), (-6.470476, 48.29629, -11.207193), (-7.725425, 47.552826, -13.380828), (-7.725425, 47.552826, -13.380828), (-6.470476, 48.29629, -11.207193), (-5.8750696, 48.29629, -11.530473), (-7.014539, 47.552826, -13.766808), (-7.014539, 47.552826, -13.766808), (-5.8750696, 48.29629, -11.530473), (-5.2635593, 48.29629, -11.822148), (-6.2844267, 47.552826, -14.115053), (-6.2844267, 47.552826, -14.115053), (-5.2635593, 48.29629, -11.822148), (-4.6376224, 48.29629, -12.08142), (-5.5370893, 47.552826, -14.424611), (-5.5370893, 47.552826, -14.424611), (-4.6376224, 48.29629, -12.08142), (-3.998974, 48.29629, -12.307577), (-4.774575, 47.552826, -14.694632), (-4.774575, 47.552826, -14.694632), (-3.998974, 48.29629, -12.307577), (-3.349365, 48.29629, -12.5), (-3.998974, 47.552826, -14.924375), (-3.998974, 47.552826, -14.924375), (-3.349365, 48.29629, -12.5), (-2.6905754, 48.29629, -12.658161), (-3.2124124, 47.552826, -15.113212), (-3.2124124, 47.552826, -15.113212), (-2.6905754, 48.29629, -12.658161), (-2.024411, 48.29629, -12.781628), (-2.4170454, 47.552826, -15.260624), (-2.4170454, 47.552826, -15.260624), (-2.024411, 48.29629, -12.781628), (-1.3526978, 48.29629, -12.87006), (-1.6150535, 47.552826, -15.366208), (-1.6150535, 47.552826, -15.366208), (-1.3526978, 48.29629, -12.87006), (-0.6772771, 48.29629, -12.923217), (-0.808635, 47.552826, -15.429675), (-0.808635, 47.552826, -15.429675), (-0.6772771, 48.29629, -12.923217), (-2.3772143e-15, 48.29629, -12.940952), (-2.838275e-15, 47.552826, -15.45085), (-2.838275e-15, 47.552826, -15.45085), (-2.3772143e-15, 48.29629, -12.940952), (0.6772771, 48.29629, -12.923217), (0.808635, 47.552826, -15.429675), (0.808635, 47.552826, -15.429675), (0.6772771, 48.29629, -12.923217), (1.3526978, 48.29629, -12.87006), (1.6150535, 47.552826, -15.366208), (1.6150535, 47.552826, -15.366208), (1.3526978, 48.29629, -12.87006), (2.024411, 48.29629, -12.781628), (2.4170454, 47.552826, -15.260624), (2.4170454, 47.552826, -15.260624), (2.024411, 48.29629, -12.781628), (2.6905754, 48.29629, -12.658161), (3.2124124, 47.552826, -15.113212), (3.2124124, 47.552826, -15.113212), (2.6905754, 48.29629, -12.658161), (3.349365, 48.29629, -12.5), (3.998974, 47.552826, -14.924375), (3.998974, 47.552826, -14.924375), (3.349365, 48.29629, -12.5), (3.998974, 48.29629, -12.307577), (4.774575, 47.552826, -14.694632), (4.774575, 47.552826, -14.694632), (3.998974, 48.29629, -12.307577), (4.6376224, 48.29629, -12.08142), (5.5370893, 47.552826, -14.424611), (5.5370893, 47.552826, -14.424611), (4.6376224, 48.29629, -12.08142), (5.2635593, 48.29629, -11.822148), (6.2844267, 47.552826, -14.115053), (6.2844267, 47.552826, -14.115053), (5.2635593, 48.29629, -11.822148), (5.8750696, 48.29629, -11.530473), (7.014539, 47.552826, -13.766808), (7.014539, 47.552826, -13.766808), (5.8750696, 48.29629, -11.530473), (6.470476, 48.29629, -11.207193), (7.725425, 47.552826, -13.380828), (7.725425, 47.552826, -13.380828), (6.470476, 48.29629, -11.207193), (7.0481477, 48.29629, -10.853196), (8.415136, 47.552826, -12.958173), (8.415136, 47.552826, -12.958173), (7.0481477, 48.29629, -10.853196), (7.606501, 48.29629, -10.46945), (9.081781, 47.552826, -12.5), (9.081781, 47.552826, -12.5), (7.606501, 48.29629, -10.46945), (8.144005, 48.29629, -10.057009), (9.723535, 47.552826, -12.0075655), (9.723535, 47.552826, -12.0075655), (8.144005, 48.29629, -10.057009), (8.659187, 48.29629, -9.617002), (10.338636, 47.552826, -11.482219), (10.338636, 47.552826, -11.482219), (8.659187, 48.29629, -9.617002), (9.150635, 48.29629, -9.150635), (10.925401, 47.552826, -10.925401), (10.925401, 47.552826, -10.925401), (9.150635, 48.29629, -9.150635), (9.617002, 48.29629, -8.659187), (11.482219, 47.552826, -10.338636), (11.482219, 47.552826, -10.338636), (9.617002, 48.29629, -8.659187), (10.057009, 48.29629, -8.144005), (12.0075655, 47.552826, -9.723535), (12.0075655, 47.552826, -9.723535), (10.057009, 48.29629, -8.144005), (10.46945, 48.29629, -7.606501), (12.5, 47.552826, -9.081781), (12.5, 47.552826, -9.081781), (10.46945, 48.29629, -7.606501), (10.853196, 48.29629, -7.0481477), (12.958173, 47.552826, -8.415136), (12.958173, 47.552826, -8.415136), (10.853196, 48.29629, -7.0481477), (11.207193, 48.29629, -6.470476), (13.380828, 47.552826, -7.725425), (13.380828, 47.552826, -7.725425), (11.207193, 48.29629, -6.470476), (11.530473, 48.29629, -5.8750696), (13.766808, 47.552826, -7.014539), (13.766808, 47.552826, -7.014539), (11.530473, 48.29629, -5.8750696), (11.822148, 48.29629, -5.2635593), (14.115053, 47.552826, -6.2844267), (14.115053, 47.552826, -6.2844267), (11.822148, 48.29629, -5.2635593), (12.08142, 48.29629, -4.6376224), (14.424611, 47.552826, -5.5370893), (14.424611, 47.552826, -5.5370893), (12.08142, 48.29629, -4.6376224), (12.307577, 48.29629, -3.998974), (14.694632, 47.552826, -4.774575), (14.694632, 47.552826, -4.774575), (12.307577, 48.29629, -3.998974), (12.5, 48.29629, -3.349365), (14.924375, 47.552826, -3.998974), (14.924375, 47.552826, -3.998974), (12.5, 48.29629, -3.349365), (12.658161, 48.29629, -2.6905754), (15.113212, 47.552826, -3.2124124), (15.113212, 47.552826, -3.2124124), (12.658161, 48.29629, -2.6905754), (12.781628, 48.29629, -2.024411), (15.260624, 47.552826, -2.4170454), (15.260624, 47.552826, -2.4170454), (12.781628, 48.29629, -2.024411), (12.87006, 48.29629, -1.3526978), (15.366208, 47.552826, -1.6150535), (15.366208, 47.552826, -1.6150535), (12.87006, 48.29629, -1.3526978), (12.923217, 48.29629, -0.6772771), (15.429675, 47.552826, -0.808635), (15.429675, 47.552826, -0.808635), (12.923217, 48.29629, -0.6772771), (12.940952, 48.29629, 0), (15.45085, 47.552826, 0), (12.940952, 48.29629, 0), (10.395584, 48.90738, 0), (10.381338, 48.90738, 0.54406285), (12.923217, 48.29629, 0.6772771), (12.923217, 48.29629, 0.6772771), (10.381338, 48.90738, 0.54406285), (10.338636, 48.90738, 1.0866345), (12.87006, 48.29629, 1.3526978), (12.87006, 48.29629, 1.3526978), (10.338636, 48.90738, 1.0866345), (10.267597, 48.90738, 1.6262277), (12.781628, 48.29629, 2.024411), (12.781628, 48.29629, 2.024411), (10.267597, 48.90738, 1.6262277), (10.168416, 48.90738, 2.1613636), (12.658161, 48.29629, 2.6905754), (12.658161, 48.29629, 2.6905754), (10.168416, 48.90738, 2.1613636), (10.041364, 48.90738, 2.6905754), (12.5, 48.29629, 3.349365), (12.5, 48.29629, 3.349365), (10.041364, 48.90738, 2.6905754), (9.886788, 48.90738, 3.2124124), (12.307577, 48.29629, 3.998974), (12.307577, 48.29629, 3.998974), (9.886788, 48.90738, 3.2124124), (9.705114, 48.90738, 3.7254443), (12.08142, 48.29629, 4.6376224), (12.08142, 48.29629, 4.6376224), (9.705114, 48.90738, 3.7254443), (9.496839, 48.90738, 4.2282653), (11.822148, 48.29629, 5.2635593), (11.822148, 48.29629, 5.2635593), (9.496839, 48.90738, 4.2282653), (9.262533, 48.90738, 4.7194967), (11.530473, 48.29629, 5.8750696), (11.530473, 48.29629, 5.8750696), (9.262533, 48.90738, 4.7194967), (9.00284, 48.90738, 5.197792), (11.207193, 48.29629, 6.470476), (11.207193, 48.29629, 6.470476), (9.00284, 48.90738, 5.197792), (8.718471, 48.90738, 5.661841), (10.853196, 48.29629, 7.0481477), (10.853196, 48.29629, 7.0481477), (8.718471, 48.90738, 5.661841), (8.410205, 48.90738, 6.110371), (10.46945, 48.29629, 7.606501), (10.46945, 48.29629, 7.606501), (8.410205, 48.90738, 6.110371), (8.078887, 48.90738, 6.5421534), (10.057009, 48.29629, 8.144005), (10.057009, 48.29629, 8.144005), (8.078887, 48.90738, 6.5421534), (7.725425, 48.90738, 6.9560037), (9.617002, 48.29629, 8.659187), (9.617002, 48.29629, 8.659187), (7.725425, 48.90738, 6.9560037), (7.350788, 48.90738, 7.350788), (9.150635, 48.29629, 9.150635), (9.150635, 48.29629, 9.150635), (7.350788, 48.90738, 7.350788), (6.9560037, 48.90738, 7.725425), (8.659187, 48.29629, 9.617002), (8.659187, 48.29629, 9.617002), (6.9560037, 48.90738, 7.725425), (6.5421534, 48.90738, 8.078887), (8.144005, 48.29629, 10.057009), (8.144005, 48.29629, 10.057009), (6.5421534, 48.90738, 8.078887), (6.110371, 48.90738, 8.410205), (7.606501, 48.29629, 10.46945), (7.606501, 48.29629, 10.46945), (6.110371, 48.90738, 8.410205), (5.661841, 48.90738, 8.718471), (7.0481477, 48.29629, 10.853196), (7.0481477, 48.29629, 10.853196), (5.661841, 48.90738, 8.718471), (5.197792, 48.90738, 9.00284), (6.470476, 48.29629, 11.207193), (6.470476, 48.29629, 11.207193), (5.197792, 48.90738, 9.00284), (4.7194967, 48.90738, 9.262533), (5.8750696, 48.29629, 11.530473), (5.8750696, 48.29629, 11.530473), (4.7194967, 48.90738, 9.262533), (4.2282653, 48.90738, 9.496839), (5.2635593, 48.29629, 11.822148), (5.2635593, 48.29629, 11.822148), (4.2282653, 48.90738, 9.496839), (3.7254443, 48.90738, 9.705114), (4.6376224, 48.29629, 12.08142), (4.6376224, 48.29629, 12.08142), (3.7254443, 48.90738, 9.705114), (3.2124124, 48.90738, 9.886788), (3.998974, 48.29629, 12.307577), (3.998974, 48.29629, 12.307577), (3.2124124, 48.90738, 9.886788), (2.6905754, 48.90738, 10.041364), (3.349365, 48.29629, 12.5), (3.349365, 48.29629, 12.5), (2.6905754, 48.90738, 10.041364), (2.1613636, 48.90738, 10.168416), (2.6905754, 48.29629, 12.658161), (2.6905754, 48.29629, 12.658161), (2.1613636, 48.90738, 10.168416), (1.6262277, 48.90738, 10.267597), (2.024411, 48.29629, 12.781628), (2.024411, 48.29629, 12.781628), (1.6262277, 48.90738, 10.267597), (1.0866345, 48.90738, 10.338636), (1.3526978, 48.29629, 12.87006), (1.3526978, 48.29629, 12.87006), (1.0866345, 48.90738, 10.338636), (0.54406285, 48.90738, 10.381338), (0.6772771, 48.29629, 12.923217), (0.6772771, 48.29629, 12.923217), (0.54406285, 48.90738, 10.381338), (6.3654595e-16, 48.90738, 10.395584), (7.924048e-16, 48.29629, 12.940952), (7.924048e-16, 48.29629, 12.940952), (6.3654595e-16, 48.90738, 10.395584), (-0.54406285, 48.90738, 10.381338), (-0.6772771, 48.29629, 12.923217), (-0.6772771, 48.29629, 12.923217), (-0.54406285, 48.90738, 10.381338), (-1.0866345, 48.90738, 10.338636), (-1.3526978, 48.29629, 12.87006), (-1.3526978, 48.29629, 12.87006), (-1.0866345, 48.90738, 10.338636), (-1.6262277, 48.90738, 10.267597), (-2.024411, 48.29629, 12.781628), (-2.024411, 48.29629, 12.781628), (-1.6262277, 48.90738, 10.267597), (-2.1613636, 48.90738, 10.168416), (-2.6905754, 48.29629, 12.658161), (-2.6905754, 48.29629, 12.658161), (-2.1613636, 48.90738, 10.168416), (-2.6905754, 48.90738, 10.041364), (-3.349365, 48.29629, 12.5), (-3.349365, 48.29629, 12.5), (-2.6905754, 48.90738, 10.041364), (-3.2124124, 48.90738, 9.886788), (-3.998974, 48.29629, 12.307577), (-3.998974, 48.29629, 12.307577), (-3.2124124, 48.90738, 9.886788), (-3.7254443, 48.90738, 9.705114), (-4.6376224, 48.29629, 12.08142), (-4.6376224, 48.29629, 12.08142), (-3.7254443, 48.90738, 9.705114), (-4.2282653, 48.90738, 9.496839), (-5.2635593, 48.29629, 11.822148), (-5.2635593, 48.29629, 11.822148), (-4.2282653, 48.90738, 9.496839), (-4.7194967, 48.90738, 9.262533), (-5.8750696, 48.29629, 11.530473), (-5.8750696, 48.29629, 11.530473), (-4.7194967, 48.90738, 9.262533), (-5.197792, 48.90738, 9.00284), (-6.470476, 48.29629, 11.207193), (-6.470476, 48.29629, 11.207193), (-5.197792, 48.90738, 9.00284), (-5.661841, 48.90738, 8.718471), (-7.0481477, 48.29629, 10.853196), (-7.0481477, 48.29629, 10.853196), (-5.661841, 48.90738, 8.718471), (-6.110371, 48.90738, 8.410205), (-7.606501, 48.29629, 10.46945), (-7.606501, 48.29629, 10.46945), (-6.110371, 48.90738, 8.410205), (-6.5421534, 48.90738, 8.078887), (-8.144005, 48.29629, 10.057009), (-8.144005, 48.29629, 10.057009), (-6.5421534, 48.90738, 8.078887), (-6.9560037, 48.90738, 7.725425), (-8.659187, 48.29629, 9.617002), (-8.659187, 48.29629, 9.617002), (-6.9560037, 48.90738, 7.725425), (-7.350788, 48.90738, 7.350788), (-9.150635, 48.29629, 9.150635), (-9.150635, 48.29629, 9.150635), (-7.350788, 48.90738, 7.350788), (-7.725425, 48.90738, 6.9560037), (-9.617002, 48.29629, 8.659187), (-9.617002, 48.29629, 8.659187), (-7.725425, 48.90738, 6.9560037), (-8.078887, 48.90738, 6.5421534), (-10.057009, 48.29629, 8.144005), (-10.057009, 48.29629, 8.144005), (-8.078887, 48.90738, 6.5421534), (-8.410205, 48.90738, 6.110371), (-10.46945, 48.29629, 7.606501), (-10.46945, 48.29629, 7.606501), (-8.410205, 48.90738, 6.110371), (-8.718471, 48.90738, 5.661841), (-10.853196, 48.29629, 7.0481477), (-10.853196, 48.29629, 7.0481477), (-8.718471, 48.90738, 5.661841), (-9.00284, 48.90738, 5.197792), (-11.207193, 48.29629, 6.470476), (-11.207193, 48.29629, 6.470476), (-9.00284, 48.90738, 5.197792), (-9.262533, 48.90738, 4.7194967), (-11.530473, 48.29629, 5.8750696), (-11.530473, 48.29629, 5.8750696), (-9.262533, 48.90738, 4.7194967), (-9.496839, 48.90738, 4.2282653), (-11.822148, 48.29629, 5.2635593), (-11.822148, 48.29629, 5.2635593), (-9.496839, 48.90738, 4.2282653), (-9.705114, 48.90738, 3.7254443), (-12.08142, 48.29629, 4.6376224), (-12.08142, 48.29629, 4.6376224), (-9.705114, 48.90738, 3.7254443), (-9.886788, 48.90738, 3.2124124), (-12.307577, 48.29629, 3.998974), (-12.307577, 48.29629, 3.998974), (-9.886788, 48.90738, 3.2124124), (-10.041364, 48.90738, 2.6905754), (-12.5, 48.29629, 3.349365), (-12.5, 48.29629, 3.349365), (-10.041364, 48.90738, 2.6905754), (-10.168416, 48.90738, 2.1613636), (-12.658161, 48.29629, 2.6905754), (-12.658161, 48.29629, 2.6905754), (-10.168416, 48.90738, 2.1613636), (-10.267597, 48.90738, 1.6262277), (-12.781628, 48.29629, 2.024411), (-12.781628, 48.29629, 2.024411), (-10.267597, 48.90738, 1.6262277), (-10.338636, 48.90738, 1.0866345), (-12.87006, 48.29629, 1.3526978), (-12.87006, 48.29629, 1.3526978), (-10.338636, 48.90738, 1.0866345), (-10.381338, 48.90738, 0.54406285), (-12.923217, 48.29629, 0.6772771), (-12.923217, 48.29629, 0.6772771), (-10.381338, 48.90738, 0.54406285), (-10.395584, 48.90738, 1.2730919e-15), (-12.940952, 48.29629, 1.5848095e-15), (-12.940952, 48.29629, 1.5848095e-15), (-10.395584, 48.90738, 1.2730919e-15), (-10.381338, 48.90738, -0.54406285), (-12.923217, 48.29629, -0.6772771), (-12.923217, 48.29629, -0.6772771), (-10.381338, 48.90738, -0.54406285), (-10.338636, 48.90738, -1.0866345), (-12.87006, 48.29629, -1.3526978), (-12.87006, 48.29629, -1.3526978), (-10.338636, 48.90738, -1.0866345), (-10.267597, 48.90738, -1.6262277), (-12.781628, 48.29629, -2.024411), (-12.781628, 48.29629, -2.024411), (-10.267597, 48.90738, -1.6262277), (-10.168416, 48.90738, -2.1613636), (-12.658161, 48.29629, -2.6905754), (-12.658161, 48.29629, -2.6905754), (-10.168416, 48.90738, -2.1613636), (-10.041364, 48.90738, -2.6905754), (-12.5, 48.29629, -3.349365), (-12.5, 48.29629, -3.349365), (-10.041364, 48.90738, -2.6905754), (-9.886788, 48.90738, -3.2124124), (-12.307577, 48.29629, -3.998974), (-12.307577, 48.29629, -3.998974), (-9.886788, 48.90738, -3.2124124), (-9.705114, 48.90738, -3.7254443), (-12.08142, 48.29629, -4.6376224), (-12.08142, 48.29629, -4.6376224), (-9.705114, 48.90738, -3.7254443), (-9.496839, 48.90738, -4.2282653), (-11.822148, 48.29629, -5.2635593), (-11.822148, 48.29629, -5.2635593), (-9.496839, 48.90738, -4.2282653), (-9.262533, 48.90738, -4.7194967), (-11.530473, 48.29629, -5.8750696), (-11.530473, 48.29629, -5.8750696), (-9.262533, 48.90738, -4.7194967), (-9.00284, 48.90738, -5.197792), (-11.207193, 48.29629, -6.470476), (-11.207193, 48.29629, -6.470476), (-9.00284, 48.90738, -5.197792), (-8.718471, 48.90738, -5.661841), (-10.853196, 48.29629, -7.0481477), (-10.853196, 48.29629, -7.0481477), (-8.718471, 48.90738, -5.661841), (-8.410205, 48.90738, -6.110371), (-10.46945, 48.29629, -7.606501), (-10.46945, 48.29629, -7.606501), (-8.410205, 48.90738, -6.110371), (-8.078887, 48.90738, -6.5421534), (-10.057009, 48.29629, -8.144005), (-10.057009, 48.29629, -8.144005), (-8.078887, 48.90738, -6.5421534), (-7.725425, 48.90738, -6.9560037), (-9.617002, 48.29629, -8.659187), (-9.617002, 48.29629, -8.659187), (-7.725425, 48.90738, -6.9560037), (-7.350788, 48.90738, -7.350788), (-9.150635, 48.29629, -9.150635), (-9.150635, 48.29629, -9.150635), (-7.350788, 48.90738, -7.350788), (-6.9560037, 48.90738, -7.725425), (-8.659187, 48.29629, -9.617002), (-8.659187, 48.29629, -9.617002), (-6.9560037, 48.90738, -7.725425), (-6.5421534, 48.90738, -8.078887), (-8.144005, 48.29629, -10.057009), (-8.144005, 48.29629, -10.057009), (-6.5421534, 48.90738, -8.078887), (-6.110371, 48.90738, -8.410205), (-7.606501, 48.29629, -10.46945), (-7.606501, 48.29629, -10.46945), (-6.110371, 48.90738, -8.410205), (-5.661841, 48.90738, -8.718471), (-7.0481477, 48.29629, -10.853196), (-7.0481477, 48.29629, -10.853196), (-5.661841, 48.90738, -8.718471), (-5.197792, 48.90738, -9.00284), (-6.470476, 48.29629, -11.207193), (-6.470476, 48.29629, -11.207193), (-5.197792, 48.90738, -9.00284), (-4.7194967, 48.90738, -9.262533), (-5.8750696, 48.29629, -11.530473), (-5.8750696, 48.29629, -11.530473), (-4.7194967, 48.90738, -9.262533), (-4.2282653, 48.90738, -9.496839), (-5.2635593, 48.29629, -11.822148), (-5.2635593, 48.29629, -11.822148), (-4.2282653, 48.90738, -9.496839), (-3.7254443, 48.90738, -9.705114), (-4.6376224, 48.29629, -12.08142), (-4.6376224, 48.29629, -12.08142), (-3.7254443, 48.90738, -9.705114), (-3.2124124, 48.90738, -9.886788), (-3.998974, 48.29629, -12.307577), (-3.998974, 48.29629, -12.307577), (-3.2124124, 48.90738, -9.886788), (-2.6905754, 48.90738, -10.041364), (-3.349365, 48.29629, -12.5), (-3.349365, 48.29629, -12.5), (-2.6905754, 48.90738, -10.041364), (-2.1613636, 48.90738, -10.168416), (-2.6905754, 48.29629, -12.658161), (-2.6905754, 48.29629, -12.658161), (-2.1613636, 48.90738, -10.168416), (-1.6262277, 48.90738, -10.267597), (-2.024411, 48.29629, -12.781628), (-2.024411, 48.29629, -12.781628), (-1.6262277, 48.90738, -10.267597), (-1.0866345, 48.90738, -10.338636), (-1.3526978, 48.29629, -12.87006), (-1.3526978, 48.29629, -12.87006), (-1.0866345, 48.90738, -10.338636), (-0.54406285, 48.90738, -10.381338), (-0.6772771, 48.29629, -12.923217), (-0.6772771, 48.29629, -12.923217), (-0.54406285, 48.90738, -10.381338), (-1.909638e-15, 48.90738, -10.395584), (-2.3772143e-15, 48.29629, -12.940952), (-2.3772143e-15, 48.29629, -12.940952), (-1.909638e-15, 48.90738, -10.395584), (0.54406285, 48.90738, -10.381338), (0.6772771, 48.29629, -12.923217), (0.6772771, 48.29629, -12.923217), (0.54406285, 48.90738, -10.381338), (1.0866345, 48.90738, -10.338636), (1.3526978, 48.29629, -12.87006), (1.3526978, 48.29629, -12.87006), (1.0866345, 48.90738, -10.338636), (1.6262277, 48.90738, -10.267597), (2.024411, 48.29629, -12.781628), (2.024411, 48.29629, -12.781628), (1.6262277, 48.90738, -10.267597), (2.1613636, 48.90738, -10.168416), (2.6905754, 48.29629, -12.658161), (2.6905754, 48.29629, -12.658161), (2.1613636, 48.90738, -10.168416), (2.6905754, 48.90738, -10.041364), (3.349365, 48.29629, -12.5), (3.349365, 48.29629, -12.5), (2.6905754, 48.90738, -10.041364), (3.2124124, 48.90738, -9.886788), (3.998974, 48.29629, -12.307577), (3.998974, 48.29629, -12.307577), (3.2124124, 48.90738, -9.886788), (3.7254443, 48.90738, -9.705114), (4.6376224, 48.29629, -12.08142), (4.6376224, 48.29629, -12.08142), (3.7254443, 48.90738, -9.705114), (4.2282653, 48.90738, -9.496839), (5.2635593, 48.29629, -11.822148), (5.2635593, 48.29629, -11.822148), (4.2282653, 48.90738, -9.496839), (4.7194967, 48.90738, -9.262533), (5.8750696, 48.29629, -11.530473), (5.8750696, 48.29629, -11.530473), (4.7194967, 48.90738, -9.262533), (5.197792, 48.90738, -9.00284), (6.470476, 48.29629, -11.207193), (6.470476, 48.29629, -11.207193), (5.197792, 48.90738, -9.00284), (5.661841, 48.90738, -8.718471), (7.0481477, 48.29629, -10.853196), (7.0481477, 48.29629, -10.853196), (5.661841, 48.90738, -8.718471), (6.110371, 48.90738, -8.410205), (7.606501, 48.29629, -10.46945), (7.606501, 48.29629, -10.46945), (6.110371, 48.90738, -8.410205), (6.5421534, 48.90738, -8.078887), (8.144005, 48.29629, -10.057009), (8.144005, 48.29629, -10.057009), (6.5421534, 48.90738, -8.078887), (6.9560037, 48.90738, -7.725425), (8.659187, 48.29629, -9.617002), (8.659187, 48.29629, -9.617002), (6.9560037, 48.90738, -7.725425), (7.350788, 48.90738, -7.350788), (9.150635, 48.29629, -9.150635), (9.150635, 48.29629, -9.150635), (7.350788, 48.90738, -7.350788), (7.725425, 48.90738, -6.9560037), (9.617002, 48.29629, -8.659187), (9.617002, 48.29629, -8.659187), (7.725425, 48.90738, -6.9560037), (8.078887, 48.90738, -6.5421534), (10.057009, 48.29629, -8.144005), (10.057009, 48.29629, -8.144005), (8.078887, 48.90738, -6.5421534), (8.410205, 48.90738, -6.110371), (10.46945, 48.29629, -7.606501), (10.46945, 48.29629, -7.606501), (8.410205, 48.90738, -6.110371), (8.718471, 48.90738, -5.661841), (10.853196, 48.29629, -7.0481477), (10.853196, 48.29629, -7.0481477), (8.718471, 48.90738, -5.661841), (9.00284, 48.90738, -5.197792), (11.207193, 48.29629, -6.470476), (11.207193, 48.29629, -6.470476), (9.00284, 48.90738, -5.197792), (9.262533, 48.90738, -4.7194967), (11.530473, 48.29629, -5.8750696), (11.530473, 48.29629, -5.8750696), (9.262533, 48.90738, -4.7194967), (9.496839, 48.90738, -4.2282653), (11.822148, 48.29629, -5.2635593), (11.822148, 48.29629, -5.2635593), (9.496839, 48.90738, -4.2282653), (9.705114, 48.90738, -3.7254443), (12.08142, 48.29629, -4.6376224), (12.08142, 48.29629, -4.6376224), (9.705114, 48.90738, -3.7254443), (9.886788, 48.90738, -3.2124124), (12.307577, 48.29629, -3.998974), (12.307577, 48.29629, -3.998974), (9.886788, 48.90738, -3.2124124), (10.041364, 48.90738, -2.6905754), (12.5, 48.29629, -3.349365), (12.5, 48.29629, -3.349365), (10.041364, 48.90738, -2.6905754), (10.168416, 48.90738, -2.1613636), (12.658161, 48.29629, -2.6905754), (12.658161, 48.29629, -2.6905754), (10.168416, 48.90738, -2.1613636), (10.267597, 48.90738, -1.6262277), (12.781628, 48.29629, -2.024411), (12.781628, 48.29629, -2.024411), (10.267597, 48.90738, -1.6262277), (10.338636, 48.90738, -1.0866345), (12.87006, 48.29629, -1.3526978), (12.87006, 48.29629, -1.3526978), (10.338636, 48.90738, -1.0866345), (10.381338, 48.90738, -0.54406285), (12.923217, 48.29629, -0.6772771), (12.923217, 48.29629, -0.6772771), (10.381338, 48.90738, -0.54406285), (10.395584, 48.90738, 0), (12.940952, 48.29629, 0), (10.395584, 48.90738, 0), (7.8217235, 49.38442, 0), (7.8110037, 49.38442, 0.40935737), (10.381338, 48.90738, 0.54406285), (10.381338, 48.90738, 0.54406285), (7.8110037, 49.38442, 0.40935737), (7.778875, 49.38442, 0.81759274), (10.338636, 48.90738, 1.0866345), (10.338636, 48.90738, 1.0866345), (7.778875, 49.38442, 0.81759274), (7.725425, 49.38442, 1.223587), (10.267597, 48.90738, 1.6262277), (10.267597, 48.90738, 1.6262277), (7.725425, 49.38442, 1.223587), (7.6507998, 49.38442, 1.6262277), (10.168416, 48.90738, 2.1613636), (10.168416, 48.90738, 2.1613636), (7.6507998, 49.38442, 1.6262277), (7.5552044, 49.38442, 2.024411), (10.041364, 48.90738, 2.6905754), (10.041364, 48.90738, 2.6905754), (7.5552044, 49.38442, 2.024411), (7.438901, 49.38442, 2.4170454), (9.886788, 48.90738, 3.2124124), (9.886788, 48.90738, 3.2124124), (7.438901, 49.38442, 2.4170454), (7.302208, 49.38442, 2.8030548), (9.705114, 48.90738, 3.7254443), (9.705114, 48.90738, 3.7254443), (7.302208, 49.38442, 2.8030548), (7.1454997, 49.38442, 3.1813815), (9.496839, 48.90738, 4.2282653), (9.496839, 48.90738, 4.2282653), (7.1454997, 49.38442, 3.1813815), (6.9692063, 49.38442, 3.550988), (9.262533, 48.90738, 4.7194967), (9.262533, 48.90738, 4.7194967), (6.9692063, 49.38442, 3.550988), (6.773811, 49.38442, 3.9108617), (9.00284, 48.90738, 5.197792), (9.00284, 48.90738, 5.197792), (6.773811, 49.38442, 3.9108617), (6.5598493, 49.38442, 4.260016), (8.718471, 48.90738, 5.661841), (8.718471, 48.90738, 5.661841), (6.5598493, 49.38442, 4.260016), (6.327907, 49.38442, 4.5974936), (8.410205, 48.90738, 6.110371), (8.410205, 48.90738, 6.110371), (6.327907, 49.38442, 4.5974936), (6.0786204, 49.38442, 4.92237), (8.078887, 48.90738, 6.5421534), (8.078887, 48.90738, 6.5421534), (6.0786204, 49.38442, 4.92237), (5.812673, 49.38442, 5.2337546), (7.725425, 48.90738, 6.9560037), (7.725425, 48.90738, 6.9560037), (5.812673, 49.38442, 5.2337546), (5.5307937, 49.38442, 5.5307937), (7.350788, 48.90738, 7.350788), (7.350788, 48.90738, 7.350788), (5.5307937, 49.38442, 5.5307937), (5.2337546, 49.38442, 5.812673), (6.9560037, 48.90738, 7.725425), (6.9560037, 48.90738, 7.725425), (5.2337546, 49.38442, 5.812673), (4.92237, 49.38442, 6.0786204), (6.5421534, 48.90738, 8.078887), (6.5421534, 48.90738, 8.078887), (4.92237, 49.38442, 6.0786204), (4.5974936, 49.38442, 6.327907), (6.110371, 48.90738, 8.410205), (6.110371, 48.90738, 8.410205), (4.5974936, 49.38442, 6.327907), (4.260016, 49.38442, 6.5598493), (5.661841, 48.90738, 8.718471), (5.661841, 48.90738, 8.718471), (4.260016, 49.38442, 6.5598493), (3.9108617, 49.38442, 6.773811), (5.197792, 48.90738, 9.00284), (5.197792, 48.90738, 9.00284), (3.9108617, 49.38442, 6.773811), (3.550988, 49.38442, 6.9692063), (4.7194967, 48.90738, 9.262533), (4.7194967, 48.90738, 9.262533), (3.550988, 49.38442, 6.9692063), (3.1813815, 49.38442, 7.1454997), (4.2282653, 48.90738, 9.496839), (4.2282653, 48.90738, 9.496839), (3.1813815, 49.38442, 7.1454997), (2.8030548, 49.38442, 7.302208), (3.7254443, 48.90738, 9.705114), (3.7254443, 48.90738, 9.705114), (2.8030548, 49.38442, 7.302208), (2.4170454, 49.38442, 7.438901), (3.2124124, 48.90738, 9.886788), (3.2124124, 48.90738, 9.886788), (2.4170454, 49.38442, 7.438901), (2.024411, 49.38442, 7.5552044), (2.6905754, 48.90738, 10.041364), (2.6905754, 48.90738, 10.041364), (2.024411, 49.38442, 7.5552044), (1.6262277, 49.38442, 7.6507998), (2.1613636, 48.90738, 10.168416), (2.1613636, 48.90738, 10.168416), (1.6262277, 49.38442, 7.6507998), (1.223587, 49.38442, 7.725425), (1.6262277, 48.90738, 10.267597), (1.6262277, 48.90738, 10.267597), (1.223587, 49.38442, 7.725425), (0.81759274, 49.38442, 7.778875), (1.0866345, 48.90738, 10.338636), (1.0866345, 48.90738, 10.338636), (0.81759274, 49.38442, 7.778875), (0.40935737, 49.38442, 7.8110037), (0.54406285, 48.90738, 10.381338), (0.54406285, 48.90738, 10.381338), (0.40935737, 49.38442, 7.8110037), (4.789424e-16, 49.38442, 7.8217235), (6.3654595e-16, 48.90738, 10.395584), (6.3654595e-16, 48.90738, 10.395584), (4.789424e-16, 49.38442, 7.8217235), (-0.40935737, 49.38442, 7.8110037), (-0.54406285, 48.90738, 10.381338), (-0.54406285, 48.90738, 10.381338), (-0.40935737, 49.38442, 7.8110037), (-0.81759274, 49.38442, 7.778875), (-1.0866345, 48.90738, 10.338636), (-1.0866345, 48.90738, 10.338636), (-0.81759274, 49.38442, 7.778875), (-1.223587, 49.38442, 7.725425), (-1.6262277, 48.90738, 10.267597), (-1.6262277, 48.90738, 10.267597), (-1.223587, 49.38442, 7.725425), (-1.6262277, 49.38442, 7.6507998), (-2.1613636, 48.90738, 10.168416), (-2.1613636, 48.90738, 10.168416), (-1.6262277, 49.38442, 7.6507998), (-2.024411, 49.38442, 7.5552044), (-2.6905754, 48.90738, 10.041364), (-2.6905754, 48.90738, 10.041364), (-2.024411, 49.38442, 7.5552044), (-2.4170454, 49.38442, 7.438901), (-3.2124124, 48.90738, 9.886788), (-3.2124124, 48.90738, 9.886788), (-2.4170454, 49.38442, 7.438901), (-2.8030548, 49.38442, 7.302208), (-3.7254443, 48.90738, 9.705114), (-3.7254443, 48.90738, 9.705114), (-2.8030548, 49.38442, 7.302208), (-3.1813815, 49.38442, 7.1454997), (-4.2282653, 48.90738, 9.496839), (-4.2282653, 48.90738, 9.496839), (-3.1813815, 49.38442, 7.1454997), (-3.550988, 49.38442, 6.9692063), (-4.7194967, 48.90738, 9.262533), (-4.7194967, 48.90738, 9.262533), (-3.550988, 49.38442, 6.9692063), (-3.9108617, 49.38442, 6.773811), (-5.197792, 48.90738, 9.00284), (-5.197792, 48.90738, 9.00284), (-3.9108617, 49.38442, 6.773811), (-4.260016, 49.38442, 6.5598493), (-5.661841, 48.90738, 8.718471), (-5.661841, 48.90738, 8.718471), (-4.260016, 49.38442, 6.5598493), (-4.5974936, 49.38442, 6.327907), (-6.110371, 48.90738, 8.410205), (-6.110371, 48.90738, 8.410205), (-4.5974936, 49.38442, 6.327907), (-4.92237, 49.38442, 6.0786204), (-6.5421534, 48.90738, 8.078887), (-6.5421534, 48.90738, 8.078887), (-4.92237, 49.38442, 6.0786204), (-5.2337546, 49.38442, 5.812673), (-6.9560037, 48.90738, 7.725425), (-6.9560037, 48.90738, 7.725425), (-5.2337546, 49.38442, 5.812673), (-5.5307937, 49.38442, 5.5307937), (-7.350788, 48.90738, 7.350788), (-7.350788, 48.90738, 7.350788), (-5.5307937, 49.38442, 5.5307937), (-5.812673, 49.38442, 5.2337546), (-7.725425, 48.90738, 6.9560037), (-7.725425, 48.90738, 6.9560037), (-5.812673, 49.38442, 5.2337546), (-6.0786204, 49.38442, 4.92237), (-8.078887, 48.90738, 6.5421534), (-8.078887, 48.90738, 6.5421534), (-6.0786204, 49.38442, 4.92237), (-6.327907, 49.38442, 4.5974936), (-8.410205, 48.90738, 6.110371), (-8.410205, 48.90738, 6.110371), (-6.327907, 49.38442, 4.5974936), (-6.5598493, 49.38442, 4.260016), (-8.718471, 48.90738, 5.661841), (-8.718471, 48.90738, 5.661841), (-6.5598493, 49.38442, 4.260016), (-6.773811, 49.38442, 3.9108617), (-9.00284, 48.90738, 5.197792), (-9.00284, 48.90738, 5.197792), (-6.773811, 49.38442, 3.9108617), (-6.9692063, 49.38442, 3.550988), (-9.262533, 48.90738, 4.7194967), (-9.262533, 48.90738, 4.7194967), (-6.9692063, 49.38442, 3.550988), (-7.1454997, 49.38442, 3.1813815), (-9.496839, 48.90738, 4.2282653), (-9.496839, 48.90738, 4.2282653), (-7.1454997, 49.38442, 3.1813815), (-7.302208, 49.38442, 2.8030548), (-9.705114, 48.90738, 3.7254443), (-9.705114, 48.90738, 3.7254443), (-7.302208, 49.38442, 2.8030548), (-7.438901, 49.38442, 2.4170454), (-9.886788, 48.90738, 3.2124124), (-9.886788, 48.90738, 3.2124124), (-7.438901, 49.38442, 2.4170454), (-7.5552044, 49.38442, 2.024411), (-10.041364, 48.90738, 2.6905754), (-10.041364, 48.90738, 2.6905754), (-7.5552044, 49.38442, 2.024411), (-7.6507998, 49.38442, 1.6262277), (-10.168416, 48.90738, 2.1613636), (-10.168416, 48.90738, 2.1613636), (-7.6507998, 49.38442, 1.6262277), (-7.725425, 49.38442, 1.223587), (-10.267597, 48.90738, 1.6262277), (-10.267597, 48.90738, 1.6262277), (-7.725425, 49.38442, 1.223587), (-7.778875, 49.38442, 0.81759274), (-10.338636, 48.90738, 1.0866345), (-10.338636, 48.90738, 1.0866345), (-7.778875, 49.38442, 0.81759274), (-7.8110037, 49.38442, 0.40935737), (-10.381338, 48.90738, 0.54406285), (-10.381338, 48.90738, 0.54406285), (-7.8110037, 49.38442, 0.40935737), (-7.8217235, 49.38442, 9.578848e-16), (-10.395584, 48.90738, 1.2730919e-15), (-10.395584, 48.90738, 1.2730919e-15), (-7.8217235, 49.38442, 9.578848e-16), (-7.8110037, 49.38442, -0.40935737), (-10.381338, 48.90738, -0.54406285), (-10.381338, 48.90738, -0.54406285), (-7.8110037, 49.38442, -0.40935737), (-7.778875, 49.38442, -0.81759274), (-10.338636, 48.90738, -1.0866345), (-10.338636, 48.90738, -1.0866345), (-7.778875, 49.38442, -0.81759274), (-7.725425, 49.38442, -1.223587), (-10.267597, 48.90738, -1.6262277), (-10.267597, 48.90738, -1.6262277), (-7.725425, 49.38442, -1.223587), (-7.6507998, 49.38442, -1.6262277), (-10.168416, 48.90738, -2.1613636), (-10.168416, 48.90738, -2.1613636), (-7.6507998, 49.38442, -1.6262277), (-7.5552044, 49.38442, -2.024411), (-10.041364, 48.90738, -2.6905754), (-10.041364, 48.90738, -2.6905754), (-7.5552044, 49.38442, -2.024411), (-7.438901, 49.38442, -2.4170454), (-9.886788, 48.90738, -3.2124124), (-9.886788, 48.90738, -3.2124124), (-7.438901, 49.38442, -2.4170454), (-7.302208, 49.38442, -2.8030548), (-9.705114, 48.90738, -3.7254443), (-9.705114, 48.90738, -3.7254443), (-7.302208, 49.38442, -2.8030548), (-7.1454997, 49.38442, -3.1813815), (-9.496839, 48.90738, -4.2282653), (-9.496839, 48.90738, -4.2282653), (-7.1454997, 49.38442, -3.1813815), (-6.9692063, 49.38442, -3.550988), (-9.262533, 48.90738, -4.7194967), (-9.262533, 48.90738, -4.7194967), (-6.9692063, 49.38442, -3.550988), (-6.773811, 49.38442, -3.9108617), (-9.00284, 48.90738, -5.197792), (-9.00284, 48.90738, -5.197792), (-6.773811, 49.38442, -3.9108617), (-6.5598493, 49.38442, -4.260016), (-8.718471, 48.90738, -5.661841), (-8.718471, 48.90738, -5.661841), (-6.5598493, 49.38442, -4.260016), (-6.327907, 49.38442, -4.5974936), (-8.410205, 48.90738, -6.110371), (-8.410205, 48.90738, -6.110371), (-6.327907, 49.38442, -4.5974936), (-6.0786204, 49.38442, -4.92237), (-8.078887, 48.90738, -6.5421534), (-8.078887, 48.90738, -6.5421534), (-6.0786204, 49.38442, -4.92237), (-5.812673, 49.38442, -5.2337546), (-7.725425, 48.90738, -6.9560037), (-7.725425, 48.90738, -6.9560037), (-5.812673, 49.38442, -5.2337546), (-5.5307937, 49.38442, -5.5307937), (-7.350788, 48.90738, -7.350788), (-7.350788, 48.90738, -7.350788), (-5.5307937, 49.38442, -5.5307937), (-5.2337546, 49.38442, -5.812673), (-6.9560037, 48.90738, -7.725425), (-6.9560037, 48.90738, -7.725425), (-5.2337546, 49.38442, -5.812673), (-4.92237, 49.38442, -6.0786204), (-6.5421534, 48.90738, -8.078887), (-6.5421534, 48.90738, -8.078887), (-4.92237, 49.38442, -6.0786204), (-4.5974936, 49.38442, -6.327907), (-6.110371, 48.90738, -8.410205), (-6.110371, 48.90738, -8.410205), (-4.5974936, 49.38442, -6.327907), (-4.260016, 49.38442, -6.5598493), (-5.661841, 48.90738, -8.718471), (-5.661841, 48.90738, -8.718471), (-4.260016, 49.38442, -6.5598493), (-3.9108617, 49.38442, -6.773811), (-5.197792, 48.90738, -9.00284), (-5.197792, 48.90738, -9.00284), (-3.9108617, 49.38442, -6.773811), (-3.550988, 49.38442, -6.9692063), (-4.7194967, 48.90738, -9.262533), (-4.7194967, 48.90738, -9.262533), (-3.550988, 49.38442, -6.9692063), (-3.1813815, 49.38442, -7.1454997), (-4.2282653, 48.90738, -9.496839), (-4.2282653, 48.90738, -9.496839), (-3.1813815, 49.38442, -7.1454997), (-2.8030548, 49.38442, -7.302208), (-3.7254443, 48.90738, -9.705114), (-3.7254443, 48.90738, -9.705114), (-2.8030548, 49.38442, -7.302208), (-2.4170454, 49.38442, -7.438901), (-3.2124124, 48.90738, -9.886788), (-3.2124124, 48.90738, -9.886788), (-2.4170454, 49.38442, -7.438901), (-2.024411, 49.38442, -7.5552044), (-2.6905754, 48.90738, -10.041364), (-2.6905754, 48.90738, -10.041364), (-2.024411, 49.38442, -7.5552044), (-1.6262277, 49.38442, -7.6507998), (-2.1613636, 48.90738, -10.168416), (-2.1613636, 48.90738, -10.168416), (-1.6262277, 49.38442, -7.6507998), (-1.223587, 49.38442, -7.725425), (-1.6262277, 48.90738, -10.267597), (-1.6262277, 48.90738, -10.267597), (-1.223587, 49.38442, -7.725425), (-0.81759274, 49.38442, -7.778875), (-1.0866345, 48.90738, -10.338636), (-1.0866345, 48.90738, -10.338636), (-0.81759274, 49.38442, -7.778875), (-0.40935737, 49.38442, -7.8110037), (-0.54406285, 48.90738, -10.381338), (-0.54406285, 48.90738, -10.381338), (-0.40935737, 49.38442, -7.8110037), (-1.4368273e-15, 49.38442, -7.8217235), (-1.909638e-15, 48.90738, -10.395584), (-1.909638e-15, 48.90738, -10.395584), (-1.4368273e-15, 49.38442, -7.8217235), (0.40935737, 49.38442, -7.8110037), (0.54406285, 48.90738, -10.381338), (0.54406285, 48.90738, -10.381338), (0.40935737, 49.38442, -7.8110037), (0.81759274, 49.38442, -7.778875), (1.0866345, 48.90738, -10.338636), (1.0866345, 48.90738, -10.338636), (0.81759274, 49.38442, -7.778875), (1.223587, 49.38442, -7.725425), (1.6262277, 48.90738, -10.267597), (1.6262277, 48.90738, -10.267597), (1.223587, 49.38442, -7.725425), (1.6262277, 49.38442, -7.6507998), (2.1613636, 48.90738, -10.168416), (2.1613636, 48.90738, -10.168416), (1.6262277, 49.38442, -7.6507998), (2.024411, 49.38442, -7.5552044), (2.6905754, 48.90738, -10.041364), (2.6905754, 48.90738, -10.041364), (2.024411, 49.38442, -7.5552044), (2.4170454, 49.38442, -7.438901), (3.2124124, 48.90738, -9.886788), (3.2124124, 48.90738, -9.886788), (2.4170454, 49.38442, -7.438901), (2.8030548, 49.38442, -7.302208), (3.7254443, 48.90738, -9.705114), (3.7254443, 48.90738, -9.705114), (2.8030548, 49.38442, -7.302208), (3.1813815, 49.38442, -7.1454997), (4.2282653, 48.90738, -9.496839), (4.2282653, 48.90738, -9.496839), (3.1813815, 49.38442, -7.1454997), (3.550988, 49.38442, -6.9692063), (4.7194967, 48.90738, -9.262533), (4.7194967, 48.90738, -9.262533), (3.550988, 49.38442, -6.9692063), (3.9108617, 49.38442, -6.773811), (5.197792, 48.90738, -9.00284), (5.197792, 48.90738, -9.00284), (3.9108617, 49.38442, -6.773811), (4.260016, 49.38442, -6.5598493), (5.661841, 48.90738, -8.718471), (5.661841, 48.90738, -8.718471), (4.260016, 49.38442, -6.5598493), (4.5974936, 49.38442, -6.327907), (6.110371, 48.90738, -8.410205), (6.110371, 48.90738, -8.410205), (4.5974936, 49.38442, -6.327907), (4.92237, 49.38442, -6.0786204), (6.5421534, 48.90738, -8.078887), (6.5421534, 48.90738, -8.078887), (4.92237, 49.38442, -6.0786204), (5.2337546, 49.38442, -5.812673), (6.9560037, 48.90738, -7.725425), (6.9560037, 48.90738, -7.725425), (5.2337546, 49.38442, -5.812673), (5.5307937, 49.38442, -5.5307937), (7.350788, 48.90738, -7.350788), (7.350788, 48.90738, -7.350788), (5.5307937, 49.38442, -5.5307937), (5.812673, 49.38442, -5.2337546), (7.725425, 48.90738, -6.9560037), (7.725425, 48.90738, -6.9560037), (5.812673, 49.38442, -5.2337546), (6.0786204, 49.38442, -4.92237), (8.078887, 48.90738, -6.5421534), (8.078887, 48.90738, -6.5421534), (6.0786204, 49.38442, -4.92237), (6.327907, 49.38442, -4.5974936), (8.410205, 48.90738, -6.110371), (8.410205, 48.90738, -6.110371), (6.327907, 49.38442, -4.5974936), (6.5598493, 49.38442, -4.260016), (8.718471, 48.90738, -5.661841), (8.718471, 48.90738, -5.661841), (6.5598493, 49.38442, -4.260016), (6.773811, 49.38442, -3.9108617), (9.00284, 48.90738, -5.197792), (9.00284, 48.90738, -5.197792), (6.773811, 49.38442, -3.9108617), (6.9692063, 49.38442, -3.550988), (9.262533, 48.90738, -4.7194967), (9.262533, 48.90738, -4.7194967), (6.9692063, 49.38442, -3.550988), (7.1454997, 49.38442, -3.1813815), (9.496839, 48.90738, -4.2282653), (9.496839, 48.90738, -4.2282653), (7.1454997, 49.38442, -3.1813815), (7.302208, 49.38442, -2.8030548), (9.705114, 48.90738, -3.7254443), (9.705114, 48.90738, -3.7254443), (7.302208, 49.38442, -2.8030548), (7.438901, 49.38442, -2.4170454), (9.886788, 48.90738, -3.2124124), (9.886788, 48.90738, -3.2124124), (7.438901, 49.38442, -2.4170454), (7.5552044, 49.38442, -2.024411), (10.041364, 48.90738, -2.6905754), (10.041364, 48.90738, -2.6905754), (7.5552044, 49.38442, -2.024411), (7.6507998, 49.38442, -1.6262277), (10.168416, 48.90738, -2.1613636), (10.168416, 48.90738, -2.1613636), (7.6507998, 49.38442, -1.6262277), (7.725425, 49.38442, -1.223587), (10.267597, 48.90738, -1.6262277), (10.267597, 48.90738, -1.6262277), (7.725425, 49.38442, -1.223587), (7.778875, 49.38442, -0.81759274), (10.338636, 48.90738, -1.0866345), (10.338636, 48.90738, -1.0866345), (7.778875, 49.38442, -0.81759274), (7.8110037, 49.38442, -0.40935737), (10.381338, 48.90738, -0.54406285), (10.381338, 48.90738, -0.54406285), (7.8110037, 49.38442, -0.40935737), (7.8217235, 49.38442, 0), (10.395584, 48.90738, 0), (7.8217235, 49.38442, 0), (5.2264233, 49.726093, 0), (5.2192607, 49.726093, 0.27352986), (7.8110037, 49.38442, 0.40935737), (7.8110037, 49.38442, 0.40935737), (5.2192607, 49.726093, 0.27352986), (5.197792, 49.726093, 0.54631), (7.778875, 49.38442, 0.81759274), (7.778875, 49.38442, 0.81759274), (5.197792, 49.726093, 0.54631), (5.1620774, 49.726093, 0.81759274), (7.725425, 49.38442, 1.223587), (7.725425, 49.38442, 1.223587), (5.1620774, 49.726093, 0.81759274), (5.112213, 49.726093, 1.0866345), (7.6507998, 49.38442, 1.6262277), (7.6507998, 49.38442, 1.6262277), (5.112213, 49.726093, 1.0866345), (5.048337, 49.726093, 1.3526978), (7.5552044, 49.38442, 2.024411), (7.5552044, 49.38442, 2.024411), (5.048337, 49.726093, 1.3526978), (4.970624, 49.726093, 1.6150535), (7.438901, 49.38442, 2.4170454), (7.438901, 49.38442, 2.4170454), (4.970624, 49.726093, 1.6150535), (4.8792863, 49.726093, 1.8729825), (7.302208, 49.38442, 2.8030548), (7.302208, 49.38442, 2.8030548), (4.8792863, 49.726093, 1.8729825), (4.774575, 49.726093, 2.1257777), (7.1454997, 49.38442, 3.1813815), (7.1454997, 49.38442, 3.1813815), (4.774575, 49.726093, 2.1257777), (4.656777, 49.726093, 2.3727465), (6.9692063, 49.38442, 3.550988), (6.9692063, 49.38442, 3.550988), (4.656777, 49.726093, 2.3727465), (4.526215, 49.726093, 2.6132116), (6.773811, 49.38442, 3.9108617), (6.773811, 49.38442, 3.9108617), (4.526215, 49.726093, 2.6132116), (4.3832474, 49.726093, 2.846514), (6.5598493, 49.38442, 4.260016), (6.5598493, 49.38442, 4.260016), (4.3832474, 49.726093, 2.846514), (4.2282653, 49.726093, 3.0720146), (6.327907, 49.38442, 4.5974936), (6.327907, 49.38442, 4.5974936), (4.2282653, 49.726093, 3.0720146), (4.0616937, 49.726093, 3.2890947), (6.0786204, 49.38442, 4.92237), (6.0786204, 49.38442, 4.92237), (4.0616937, 49.726093, 3.2890947), (3.8839893, 49.726093, 3.4971597), (5.812673, 49.38442, 5.2337546), (5.812673, 49.38442, 5.2337546), (3.8839893, 49.726093, 3.4971597), (3.6956394, 49.726093, 3.6956394), (5.5307937, 49.38442, 5.5307937), (5.5307937, 49.38442, 5.5307937), (3.6956394, 49.726093, 3.6956394), (3.4971597, 49.726093, 3.8839893), (5.2337546, 49.38442, 5.812673), (5.2337546, 49.38442, 5.812673), (3.4971597, 49.726093, 3.8839893), (3.2890947, 49.726093, 4.0616937), (4.92237, 49.38442, 6.0786204), (4.92237, 49.38442, 6.0786204), (3.2890947, 49.726093, 4.0616937), (3.0720146, 49.726093, 4.2282653), (4.5974936, 49.38442, 6.327907), (4.5974936, 49.38442, 6.327907), (3.0720146, 49.726093, 4.2282653), (2.846514, 49.726093, 4.3832474), (4.260016, 49.38442, 6.5598493), (4.260016, 49.38442, 6.5598493), (2.846514, 49.726093, 4.3832474), (2.6132116, 49.726093, 4.526215), (3.9108617, 49.38442, 6.773811), (3.9108617, 49.38442, 6.773811), (2.6132116, 49.726093, 4.526215), (2.3727465, 49.726093, 4.656777), (3.550988, 49.38442, 6.9692063), (3.550988, 49.38442, 6.9692063), (2.3727465, 49.726093, 4.656777), (2.1257777, 49.726093, 4.774575), (3.1813815, 49.38442, 7.1454997), (3.1813815, 49.38442, 7.1454997), (2.1257777, 49.726093, 4.774575), (1.8729825, 49.726093, 4.8792863), (2.8030548, 49.38442, 7.302208), (2.8030548, 49.38442, 7.302208), (1.8729825, 49.726093, 4.8792863), (1.6150535, 49.726093, 4.970624), (2.4170454, 49.38442, 7.438901), (2.4170454, 49.38442, 7.438901), (1.6150535, 49.726093, 4.970624), (1.3526978, 49.726093, 5.048337), (2.024411, 49.38442, 7.5552044), (2.024411, 49.38442, 7.5552044), (1.3526978, 49.726093, 5.048337), (1.0866345, 49.726093, 5.112213), (1.6262277, 49.38442, 7.6507998), (1.6262277, 49.38442, 7.6507998), (1.0866345, 49.726093, 5.112213), (0.81759274, 49.726093, 5.1620774), (1.223587, 49.38442, 7.725425), (1.223587, 49.38442, 7.725425), (0.81759274, 49.726093, 5.1620774), (0.54631, 49.726093, 5.197792), (0.81759274, 49.38442, 7.778875), (0.81759274, 49.38442, 7.778875), (0.54631, 49.726093, 5.197792), (0.27352986, 49.726093, 5.2192607), (0.40935737, 49.38442, 7.8110037), (0.40935737, 49.38442, 7.8110037), (0.27352986, 49.726093, 5.2192607), (3.2002612e-16, 49.726093, 5.2264233), (4.789424e-16, 49.38442, 7.8217235), (4.789424e-16, 49.38442, 7.8217235), (3.2002612e-16, 49.726093, 5.2264233), (-0.27352986, 49.726093, 5.2192607), (-0.40935737, 49.38442, 7.8110037), (-0.40935737, 49.38442, 7.8110037), (-0.27352986, 49.726093, 5.2192607), (-0.54631, 49.726093, 5.197792), (-0.81759274, 49.38442, 7.778875), (-0.81759274, 49.38442, 7.778875), (-0.54631, 49.726093, 5.197792), (-0.81759274, 49.726093, 5.1620774), (-1.223587, 49.38442, 7.725425), (-1.223587, 49.38442, 7.725425), (-0.81759274, 49.726093, 5.1620774), (-1.0866345, 49.726093, 5.112213), (-1.6262277, 49.38442, 7.6507998), (-1.6262277, 49.38442, 7.6507998), (-1.0866345, 49.726093, 5.112213), (-1.3526978, 49.726093, 5.048337), (-2.024411, 49.38442, 7.5552044), (-2.024411, 49.38442, 7.5552044), (-1.3526978, 49.726093, 5.048337), (-1.6150535, 49.726093, 4.970624), (-2.4170454, 49.38442, 7.438901), (-2.4170454, 49.38442, 7.438901), (-1.6150535, 49.726093, 4.970624), (-1.8729825, 49.726093, 4.8792863), (-2.8030548, 49.38442, 7.302208), (-2.8030548, 49.38442, 7.302208), (-1.8729825, 49.726093, 4.8792863), (-2.1257777, 49.726093, 4.774575), (-3.1813815, 49.38442, 7.1454997), (-3.1813815, 49.38442, 7.1454997), (-2.1257777, 49.726093, 4.774575), (-2.3727465, 49.726093, 4.656777), (-3.550988, 49.38442, 6.9692063), (-3.550988, 49.38442, 6.9692063), (-2.3727465, 49.726093, 4.656777), (-2.6132116, 49.726093, 4.526215), (-3.9108617, 49.38442, 6.773811), (-3.9108617, 49.38442, 6.773811), (-2.6132116, 49.726093, 4.526215), (-2.846514, 49.726093, 4.3832474), (-4.260016, 49.38442, 6.5598493), (-4.260016, 49.38442, 6.5598493), (-2.846514, 49.726093, 4.3832474), (-3.0720146, 49.726093, 4.2282653), (-4.5974936, 49.38442, 6.327907), (-4.5974936, 49.38442, 6.327907), (-3.0720146, 49.726093, 4.2282653), (-3.2890947, 49.726093, 4.0616937), (-4.92237, 49.38442, 6.0786204), (-4.92237, 49.38442, 6.0786204), (-3.2890947, 49.726093, 4.0616937), (-3.4971597, 49.726093, 3.8839893), (-5.2337546, 49.38442, 5.812673), (-5.2337546, 49.38442, 5.812673), (-3.4971597, 49.726093, 3.8839893), (-3.6956394, 49.726093, 3.6956394), (-5.5307937, 49.38442, 5.5307937), (-5.5307937, 49.38442, 5.5307937), (-3.6956394, 49.726093, 3.6956394), (-3.8839893, 49.726093, 3.4971597), (-5.812673, 49.38442, 5.2337546), (-5.812673, 49.38442, 5.2337546), (-3.8839893, 49.726093, 3.4971597), (-4.0616937, 49.726093, 3.2890947), (-6.0786204, 49.38442, 4.92237), (-6.0786204, 49.38442, 4.92237), (-4.0616937, 49.726093, 3.2890947), (-4.2282653, 49.726093, 3.0720146), (-6.327907, 49.38442, 4.5974936), (-6.327907, 49.38442, 4.5974936), (-4.2282653, 49.726093, 3.0720146), (-4.3832474, 49.726093, 2.846514), (-6.5598493, 49.38442, 4.260016), (-6.5598493, 49.38442, 4.260016), (-4.3832474, 49.726093, 2.846514), (-4.526215, 49.726093, 2.6132116), (-6.773811, 49.38442, 3.9108617), (-6.773811, 49.38442, 3.9108617), (-4.526215, 49.726093, 2.6132116), (-4.656777, 49.726093, 2.3727465), (-6.9692063, 49.38442, 3.550988), (-6.9692063, 49.38442, 3.550988), (-4.656777, 49.726093, 2.3727465), (-4.774575, 49.726093, 2.1257777), (-7.1454997, 49.38442, 3.1813815), (-7.1454997, 49.38442, 3.1813815), (-4.774575, 49.726093, 2.1257777), (-4.8792863, 49.726093, 1.8729825), (-7.302208, 49.38442, 2.8030548), (-7.302208, 49.38442, 2.8030548), (-4.8792863, 49.726093, 1.8729825), (-4.970624, 49.726093, 1.6150535), (-7.438901, 49.38442, 2.4170454), (-7.438901, 49.38442, 2.4170454), (-4.970624, 49.726093, 1.6150535), (-5.048337, 49.726093, 1.3526978), (-7.5552044, 49.38442, 2.024411), (-7.5552044, 49.38442, 2.024411), (-5.048337, 49.726093, 1.3526978), (-5.112213, 49.726093, 1.0866345), (-7.6507998, 49.38442, 1.6262277), (-7.6507998, 49.38442, 1.6262277), (-5.112213, 49.726093, 1.0866345), (-5.1620774, 49.726093, 0.81759274), (-7.725425, 49.38442, 1.223587), (-7.725425, 49.38442, 1.223587), (-5.1620774, 49.726093, 0.81759274), (-5.197792, 49.726093, 0.54631), (-7.778875, 49.38442, 0.81759274), (-7.778875, 49.38442, 0.81759274), (-5.197792, 49.726093, 0.54631), (-5.2192607, 49.726093, 0.27352986), (-7.8110037, 49.38442, 0.40935737), (-7.8110037, 49.38442, 0.40935737), (-5.2192607, 49.726093, 0.27352986), (-5.2264233, 49.726093, 6.4005224e-16), (-7.8217235, 49.38442, 9.578848e-16), (-7.8217235, 49.38442, 9.578848e-16), (-5.2264233, 49.726093, 6.4005224e-16), (-5.2192607, 49.726093, -0.27352986), (-7.8110037, 49.38442, -0.40935737), (-7.8110037, 49.38442, -0.40935737), (-5.2192607, 49.726093, -0.27352986), (-5.197792, 49.726093, -0.54631), (-7.778875, 49.38442, -0.81759274), (-7.778875, 49.38442, -0.81759274), (-5.197792, 49.726093, -0.54631), (-5.1620774, 49.726093, -0.81759274), (-7.725425, 49.38442, -1.223587), (-7.725425, 49.38442, -1.223587), (-5.1620774, 49.726093, -0.81759274), (-5.112213, 49.726093, -1.0866345), (-7.6507998, 49.38442, -1.6262277), (-7.6507998, 49.38442, -1.6262277), (-5.112213, 49.726093, -1.0866345), (-5.048337, 49.726093, -1.3526978), (-7.5552044, 49.38442, -2.024411), (-7.5552044, 49.38442, -2.024411), (-5.048337, 49.726093, -1.3526978), (-4.970624, 49.726093, -1.6150535), (-7.438901, 49.38442, -2.4170454), (-7.438901, 49.38442, -2.4170454), (-4.970624, 49.726093, -1.6150535), (-4.8792863, 49.726093, -1.8729825), (-7.302208, 49.38442, -2.8030548), (-7.302208, 49.38442, -2.8030548), (-4.8792863, 49.726093, -1.8729825), (-4.774575, 49.726093, -2.1257777), (-7.1454997, 49.38442, -3.1813815), (-7.1454997, 49.38442, -3.1813815), (-4.774575, 49.726093, -2.1257777), (-4.656777, 49.726093, -2.3727465), (-6.9692063, 49.38442, -3.550988), (-6.9692063, 49.38442, -3.550988), (-4.656777, 49.726093, -2.3727465), (-4.526215, 49.726093, -2.6132116), (-6.773811, 49.38442, -3.9108617), (-6.773811, 49.38442, -3.9108617), (-4.526215, 49.726093, -2.6132116), (-4.3832474, 49.726093, -2.846514), (-6.5598493, 49.38442, -4.260016), (-6.5598493, 49.38442, -4.260016), (-4.3832474, 49.726093, -2.846514), (-4.2282653, 49.726093, -3.0720146), (-6.327907, 49.38442, -4.5974936), (-6.327907, 49.38442, -4.5974936), (-4.2282653, 49.726093, -3.0720146), (-4.0616937, 49.726093, -3.2890947), (-6.0786204, 49.38442, -4.92237), (-6.0786204, 49.38442, -4.92237), (-4.0616937, 49.726093, -3.2890947), (-3.8839893, 49.726093, -3.4971597), (-5.812673, 49.38442, -5.2337546), (-5.812673, 49.38442, -5.2337546), (-3.8839893, 49.726093, -3.4971597), (-3.6956394, 49.726093, -3.6956394), (-5.5307937, 49.38442, -5.5307937), (-5.5307937, 49.38442, -5.5307937), (-3.6956394, 49.726093, -3.6956394), (-3.4971597, 49.726093, -3.8839893), (-5.2337546, 49.38442, -5.812673), (-5.2337546, 49.38442, -5.812673), (-3.4971597, 49.726093, -3.8839893), (-3.2890947, 49.726093, -4.0616937), (-4.92237, 49.38442, -6.0786204), (-4.92237, 49.38442, -6.0786204), (-3.2890947, 49.726093, -4.0616937), (-3.0720146, 49.726093, -4.2282653), (-4.5974936, 49.38442, -6.327907), (-4.5974936, 49.38442, -6.327907), (-3.0720146, 49.726093, -4.2282653), (-2.846514, 49.726093, -4.3832474), (-4.260016, 49.38442, -6.5598493), (-4.260016, 49.38442, -6.5598493), (-2.846514, 49.726093, -4.3832474), (-2.6132116, 49.726093, -4.526215), (-3.9108617, 49.38442, -6.773811), (-3.9108617, 49.38442, -6.773811), (-2.6132116, 49.726093, -4.526215), (-2.3727465, 49.726093, -4.656777), (-3.550988, 49.38442, -6.9692063), (-3.550988, 49.38442, -6.9692063), (-2.3727465, 49.726093, -4.656777), (-2.1257777, 49.726093, -4.774575), (-3.1813815, 49.38442, -7.1454997), (-3.1813815, 49.38442, -7.1454997), (-2.1257777, 49.726093, -4.774575), (-1.8729825, 49.726093, -4.8792863), (-2.8030548, 49.38442, -7.302208), (-2.8030548, 49.38442, -7.302208), (-1.8729825, 49.726093, -4.8792863), (-1.6150535, 49.726093, -4.970624), (-2.4170454, 49.38442, -7.438901), (-2.4170454, 49.38442, -7.438901), (-1.6150535, 49.726093, -4.970624), (-1.3526978, 49.726093, -5.048337), (-2.024411, 49.38442, -7.5552044), (-2.024411, 49.38442, -7.5552044), (-1.3526978, 49.726093, -5.048337), (-1.0866345, 49.726093, -5.112213), (-1.6262277, 49.38442, -7.6507998), (-1.6262277, 49.38442, -7.6507998), (-1.0866345, 49.726093, -5.112213), (-0.81759274, 49.726093, -5.1620774), (-1.223587, 49.38442, -7.725425), (-1.223587, 49.38442, -7.725425), (-0.81759274, 49.726093, -5.1620774), (-0.54631, 49.726093, -5.197792), (-0.81759274, 49.38442, -7.778875), (-0.81759274, 49.38442, -7.778875), (-0.54631, 49.726093, -5.197792), (-0.27352986, 49.726093, -5.2192607), (-0.40935737, 49.38442, -7.8110037), (-0.40935737, 49.38442, -7.8110037), (-0.27352986, 49.726093, -5.2192607), (-9.600784e-16, 49.726093, -5.2264233), (-1.4368273e-15, 49.38442, -7.8217235), (-1.4368273e-15, 49.38442, -7.8217235), (-9.600784e-16, 49.726093, -5.2264233), (0.27352986, 49.726093, -5.2192607), (0.40935737, 49.38442, -7.8110037), (0.40935737, 49.38442, -7.8110037), (0.27352986, 49.726093, -5.2192607), (0.54631, 49.726093, -5.197792), (0.81759274, 49.38442, -7.778875), (0.81759274, 49.38442, -7.778875), (0.54631, 49.726093, -5.197792), (0.81759274, 49.726093, -5.1620774), (1.223587, 49.38442, -7.725425), (1.223587, 49.38442, -7.725425), (0.81759274, 49.726093, -5.1620774), (1.0866345, 49.726093, -5.112213), (1.6262277, 49.38442, -7.6507998), (1.6262277, 49.38442, -7.6507998), (1.0866345, 49.726093, -5.112213), (1.3526978, 49.726093, -5.048337), (2.024411, 49.38442, -7.5552044), (2.024411, 49.38442, -7.5552044), (1.3526978, 49.726093, -5.048337), (1.6150535, 49.726093, -4.970624), (2.4170454, 49.38442, -7.438901), (2.4170454, 49.38442, -7.438901), (1.6150535, 49.726093, -4.970624), (1.8729825, 49.726093, -4.8792863), (2.8030548, 49.38442, -7.302208), (2.8030548, 49.38442, -7.302208), (1.8729825, 49.726093, -4.8792863), (2.1257777, 49.726093, -4.774575), (3.1813815, 49.38442, -7.1454997), (3.1813815, 49.38442, -7.1454997), (2.1257777, 49.726093, -4.774575), (2.3727465, 49.726093, -4.656777), (3.550988, 49.38442, -6.9692063), (3.550988, 49.38442, -6.9692063), (2.3727465, 49.726093, -4.656777), (2.6132116, 49.726093, -4.526215), (3.9108617, 49.38442, -6.773811), (3.9108617, 49.38442, -6.773811), (2.6132116, 49.726093, -4.526215), (2.846514, 49.726093, -4.3832474), (4.260016, 49.38442, -6.5598493), (4.260016, 49.38442, -6.5598493), (2.846514, 49.726093, -4.3832474), (3.0720146, 49.726093, -4.2282653), (4.5974936, 49.38442, -6.327907), (4.5974936, 49.38442, -6.327907), (3.0720146, 49.726093, -4.2282653), (3.2890947, 49.726093, -4.0616937), (4.92237, 49.38442, -6.0786204), (4.92237, 49.38442, -6.0786204), (3.2890947, 49.726093, -4.0616937), (3.4971597, 49.726093, -3.8839893), (5.2337546, 49.38442, -5.812673), (5.2337546, 49.38442, -5.812673), (3.4971597, 49.726093, -3.8839893), (3.6956394, 49.726093, -3.6956394), (5.5307937, 49.38442, -5.5307937), (5.5307937, 49.38442, -5.5307937), (3.6956394, 49.726093, -3.6956394), (3.8839893, 49.726093, -3.4971597), (5.812673, 49.38442, -5.2337546), (5.812673, 49.38442, -5.2337546), (3.8839893, 49.726093, -3.4971597), (4.0616937, 49.726093, -3.2890947), (6.0786204, 49.38442, -4.92237), (6.0786204, 49.38442, -4.92237), (4.0616937, 49.726093, -3.2890947), (4.2282653, 49.726093, -3.0720146), (6.327907, 49.38442, -4.5974936), (6.327907, 49.38442, -4.5974936), (4.2282653, 49.726093, -3.0720146), (4.3832474, 49.726093, -2.846514), (6.5598493, 49.38442, -4.260016), (6.5598493, 49.38442, -4.260016), (4.3832474, 49.726093, -2.846514), (4.526215, 49.726093, -2.6132116), (6.773811, 49.38442, -3.9108617), (6.773811, 49.38442, -3.9108617), (4.526215, 49.726093, -2.6132116), (4.656777, 49.726093, -2.3727465), (6.9692063, 49.38442, -3.550988), (6.9692063, 49.38442, -3.550988), (4.656777, 49.726093, -2.3727465), (4.774575, 49.726093, -2.1257777), (7.1454997, 49.38442, -3.1813815), (7.1454997, 49.38442, -3.1813815), (4.774575, 49.726093, -2.1257777), (4.8792863, 49.726093, -1.8729825), (7.302208, 49.38442, -2.8030548), (7.302208, 49.38442, -2.8030548), (4.8792863, 49.726093, -1.8729825), (4.970624, 49.726093, -1.6150535), (7.438901, 49.38442, -2.4170454), (7.438901, 49.38442, -2.4170454), (4.970624, 49.726093, -1.6150535), (5.048337, 49.726093, -1.3526978), (7.5552044, 49.38442, -2.024411), (7.5552044, 49.38442, -2.024411), (5.048337, 49.726093, -1.3526978), (5.112213, 49.726093, -1.0866345), (7.6507998, 49.38442, -1.6262277), (7.6507998, 49.38442, -1.6262277), (5.112213, 49.726093, -1.0866345), (5.1620774, 49.726093, -0.81759274), (7.725425, 49.38442, -1.223587), (7.725425, 49.38442, -1.223587), (5.1620774, 49.726093, -0.81759274), (5.197792, 49.726093, -0.54631), (7.778875, 49.38442, -0.81759274), (7.778875, 49.38442, -0.81759274), (5.197792, 49.726093, -0.54631), (5.2192607, 49.726093, -0.27352986), (7.8110037, 49.38442, -0.40935737), (7.8110037, 49.38442, -0.40935737), (5.2192607, 49.726093, -0.27352986), (5.2264233, 49.726093, 0), (7.8217235, 49.38442, 0), (5.2264233, 49.726093, 0), (2.616798, 49.931477, 0), (2.6132116, 49.931477, 0.13695261), (5.2192607, 49.726093, 0.27352986), (5.2192607, 49.726093, 0.27352986), (2.6132116, 49.931477, 0.13695261), (2.6024628, 49.931477, 0.27352986), (5.197792, 49.726093, 0.54631), (5.197792, 49.726093, 0.54631), (2.6024628, 49.931477, 0.27352986), (2.5845807, 49.931477, 0.40935737), (5.1620774, 49.726093, 0.81759274), (5.1620774, 49.726093, 0.81759274), (2.5845807, 49.931477, 0.40935737), (2.5596144, 49.931477, 0.54406285), (5.112213, 49.726093, 1.0866345), (5.112213, 49.726093, 1.0866345), (2.5596144, 49.931477, 0.54406285), (2.5276325, 49.931477, 0.6772771), (5.048337, 49.726093, 1.3526978), (5.048337, 49.726093, 1.3526978), (2.5276325, 49.931477, 0.6772771), (2.4887226, 49.931477, 0.808635), (4.970624, 49.726093, 1.6150535), (4.970624, 49.726093, 1.6150535), (2.4887226, 49.931477, 0.808635), (2.4429913, 49.931477, 0.93777645), (4.8792863, 49.726093, 1.8729825), (4.8792863, 49.726093, 1.8729825), (2.4429913, 49.931477, 0.93777645), (2.3905637, 49.931477, 1.0643475), (4.774575, 49.726093, 2.1257777), (4.774575, 49.726093, 2.1257777), (2.3905637, 49.931477, 1.0643475), (2.331584, 49.931477, 1.1880014), (4.656777, 49.726093, 2.3727465), (4.656777, 49.726093, 2.3727465), (2.331584, 49.931477, 1.1880014), (2.2662134, 49.931477, 1.308399), (4.526215, 49.726093, 2.6132116), (4.526215, 49.726093, 2.6132116), (2.2662134, 49.931477, 1.308399), (2.1946313, 49.931477, 1.4252102), (4.3832474, 49.726093, 2.846514), (4.3832474, 49.726093, 2.846514), (2.1946313, 49.931477, 1.4252102), (2.117034, 49.931477, 1.5381151), (4.2282653, 49.726093, 3.0720146), (4.2282653, 49.726093, 3.0720146), (2.117034, 49.931477, 1.5381151), (2.033634, 49.931477, 1.6468042), (4.0616937, 49.726093, 3.2890947), (4.0616937, 49.726093, 3.2890947), (2.033634, 49.931477, 1.6468042), (1.9446597, 49.931477, 1.7509795), (3.8839893, 49.726093, 3.4971597), (3.8839893, 49.726093, 3.4971597), (1.9446597, 49.931477, 1.7509795), (1.8503555, 49.931477, 1.8503555), (3.6956394, 49.726093, 3.6956394), (3.6956394, 49.726093, 3.6956394), (1.8503555, 49.931477, 1.8503555), (1.7509795, 49.931477, 1.9446597), (3.4971597, 49.726093, 3.8839893), (3.4971597, 49.726093, 3.8839893), (1.7509795, 49.931477, 1.9446597), (1.6468042, 49.931477, 2.033634), (3.2890947, 49.726093, 4.0616937), (3.2890947, 49.726093, 4.0616937), (1.6468042, 49.931477, 2.033634), (1.5381151, 49.931477, 2.117034), (3.0720146, 49.726093, 4.2282653), (3.0720146, 49.726093, 4.2282653), (1.5381151, 49.931477, 2.117034), (1.4252102, 49.931477, 2.1946313), (2.846514, 49.726093, 4.3832474), (2.846514, 49.726093, 4.3832474), (1.4252102, 49.931477, 2.1946313), (1.308399, 49.931477, 2.2662134), (2.6132116, 49.726093, 4.526215), (2.6132116, 49.726093, 4.526215), (1.308399, 49.931477, 2.2662134), (1.1880014, 49.931477, 2.331584), (2.3727465, 49.726093, 4.656777), (2.3727465, 49.726093, 4.656777), (1.1880014, 49.931477, 2.331584), (1.0643475, 49.931477, 2.3905637), (2.1257777, 49.726093, 4.774575), (2.1257777, 49.726093, 4.774575), (1.0643475, 49.931477, 2.3905637), (0.93777645, 49.931477, 2.4429913), (1.8729825, 49.726093, 4.8792863), (1.8729825, 49.726093, 4.8792863), (0.93777645, 49.931477, 2.4429913), (0.808635, 49.931477, 2.4887226), (1.6150535, 49.726093, 4.970624), (1.6150535, 49.726093, 4.970624), (0.808635, 49.931477, 2.4887226), (0.6772771, 49.931477, 2.5276325), (1.3526978, 49.726093, 5.048337), (1.3526978, 49.726093, 5.048337), (0.6772771, 49.931477, 2.5276325), (0.54406285, 49.931477, 2.5596144), (1.0866345, 49.726093, 5.112213), (1.0866345, 49.726093, 5.112213), (0.54406285, 49.931477, 2.5596144), (0.40935737, 49.931477, 2.5845807), (0.81759274, 49.726093, 5.1620774), (0.81759274, 49.726093, 5.1620774), (0.40935737, 49.931477, 2.5845807), (0.27352986, 49.931477, 2.6024628), (0.54631, 49.726093, 5.197792), (0.54631, 49.726093, 5.197792), (0.27352986, 49.931477, 2.6024628), (0.13695261, 49.931477, 2.6132116), (0.27352986, 49.726093, 5.2192607), (0.27352986, 49.726093, 5.2192607), (0.13695261, 49.931477, 2.6132116), (1.6023265e-16, 49.931477, 2.616798), (3.2002612e-16, 49.726093, 5.2264233), (3.2002612e-16, 49.726093, 5.2264233), (1.6023265e-16, 49.931477, 2.616798), (-0.13695261, 49.931477, 2.6132116), (-0.27352986, 49.726093, 5.2192607), (-0.27352986, 49.726093, 5.2192607), (-0.13695261, 49.931477, 2.6132116), (-0.27352986, 49.931477, 2.6024628), (-0.54631, 49.726093, 5.197792), (-0.54631, 49.726093, 5.197792), (-0.27352986, 49.931477, 2.6024628), (-0.40935737, 49.931477, 2.5845807), (-0.81759274, 49.726093, 5.1620774), (-0.81759274, 49.726093, 5.1620774), (-0.40935737, 49.931477, 2.5845807), (-0.54406285, 49.931477, 2.5596144), (-1.0866345, 49.726093, 5.112213), (-1.0866345, 49.726093, 5.112213), (-0.54406285, 49.931477, 2.5596144), (-0.6772771, 49.931477, 2.5276325), (-1.3526978, 49.726093, 5.048337), (-1.3526978, 49.726093, 5.048337), (-0.6772771, 49.931477, 2.5276325), (-0.808635, 49.931477, 2.4887226), (-1.6150535, 49.726093, 4.970624), (-1.6150535, 49.726093, 4.970624), (-0.808635, 49.931477, 2.4887226), (-0.93777645, 49.931477, 2.4429913), (-1.8729825, 49.726093, 4.8792863), (-1.8729825, 49.726093, 4.8792863), (-0.93777645, 49.931477, 2.4429913), (-1.0643475, 49.931477, 2.3905637), (-2.1257777, 49.726093, 4.774575), (-2.1257777, 49.726093, 4.774575), (-1.0643475, 49.931477, 2.3905637), (-1.1880014, 49.931477, 2.331584), (-2.3727465, 49.726093, 4.656777), (-2.3727465, 49.726093, 4.656777), (-1.1880014, 49.931477, 2.331584), (-1.308399, 49.931477, 2.2662134), (-2.6132116, 49.726093, 4.526215), (-2.6132116, 49.726093, 4.526215), (-1.308399, 49.931477, 2.2662134), (-1.4252102, 49.931477, 2.1946313), (-2.846514, 49.726093, 4.3832474), (-2.846514, 49.726093, 4.3832474), (-1.4252102, 49.931477, 2.1946313), (-1.5381151, 49.931477, 2.117034), (-3.0720146, 49.726093, 4.2282653), (-3.0720146, 49.726093, 4.2282653), (-1.5381151, 49.931477, 2.117034), (-1.6468042, 49.931477, 2.033634), (-3.2890947, 49.726093, 4.0616937), (-3.2890947, 49.726093, 4.0616937), (-1.6468042, 49.931477, 2.033634), (-1.7509795, 49.931477, 1.9446597), (-3.4971597, 49.726093, 3.8839893), (-3.4971597, 49.726093, 3.8839893), (-1.7509795, 49.931477, 1.9446597), (-1.8503555, 49.931477, 1.8503555), (-3.6956394, 49.726093, 3.6956394), (-3.6956394, 49.726093, 3.6956394), (-1.8503555, 49.931477, 1.8503555), (-1.9446597, 49.931477, 1.7509795), (-3.8839893, 49.726093, 3.4971597), (-3.8839893, 49.726093, 3.4971597), (-1.9446597, 49.931477, 1.7509795), (-2.033634, 49.931477, 1.6468042), (-4.0616937, 49.726093, 3.2890947), (-4.0616937, 49.726093, 3.2890947), (-2.033634, 49.931477, 1.6468042), (-2.117034, 49.931477, 1.5381151), (-4.2282653, 49.726093, 3.0720146), (-4.2282653, 49.726093, 3.0720146), (-2.117034, 49.931477, 1.5381151), (-2.1946313, 49.931477, 1.4252102), (-4.3832474, 49.726093, 2.846514), (-4.3832474, 49.726093, 2.846514), (-2.1946313, 49.931477, 1.4252102), (-2.2662134, 49.931477, 1.308399), (-4.526215, 49.726093, 2.6132116), (-4.526215, 49.726093, 2.6132116), (-2.2662134, 49.931477, 1.308399), (-2.331584, 49.931477, 1.1880014), (-4.656777, 49.726093, 2.3727465), (-4.656777, 49.726093, 2.3727465), (-2.331584, 49.931477, 1.1880014), (-2.3905637, 49.931477, 1.0643475), (-4.774575, 49.726093, 2.1257777), (-4.774575, 49.726093, 2.1257777), (-2.3905637, 49.931477, 1.0643475), (-2.4429913, 49.931477, 0.93777645), (-4.8792863, 49.726093, 1.8729825), (-4.8792863, 49.726093, 1.8729825), (-2.4429913, 49.931477, 0.93777645), (-2.4887226, 49.931477, 0.808635), (-4.970624, 49.726093, 1.6150535), (-4.970624, 49.726093, 1.6150535), (-2.4887226, 49.931477, 0.808635), (-2.5276325, 49.931477, 0.6772771), (-5.048337, 49.726093, 1.3526978), (-5.048337, 49.726093, 1.3526978), (-2.5276325, 49.931477, 0.6772771), (-2.5596144, 49.931477, 0.54406285), (-5.112213, 49.726093, 1.0866345), (-5.112213, 49.726093, 1.0866345), (-2.5596144, 49.931477, 0.54406285), (-2.5845807, 49.931477, 0.40935737), (-5.1620774, 49.726093, 0.81759274), (-5.1620774, 49.726093, 0.81759274), (-2.5845807, 49.931477, 0.40935737), (-2.6024628, 49.931477, 0.27352986), (-5.197792, 49.726093, 0.54631), (-5.197792, 49.726093, 0.54631), (-2.6024628, 49.931477, 0.27352986), (-2.6132116, 49.931477, 0.13695261), (-5.2192607, 49.726093, 0.27352986), (-5.2192607, 49.726093, 0.27352986), (-2.6132116, 49.931477, 0.13695261), (-2.616798, 49.931477, 3.204653e-16), (-5.2264233, 49.726093, 6.4005224e-16), (-5.2264233, 49.726093, 6.4005224e-16), (-2.616798, 49.931477, 3.204653e-16), (-2.6132116, 49.931477, -0.13695261), (-5.2192607, 49.726093, -0.27352986), (-5.2192607, 49.726093, -0.27352986), (-2.6132116, 49.931477, -0.13695261), (-2.6024628, 49.931477, -0.27352986), (-5.197792, 49.726093, -0.54631), (-5.197792, 49.726093, -0.54631), (-2.6024628, 49.931477, -0.27352986), (-2.5845807, 49.931477, -0.40935737), (-5.1620774, 49.726093, -0.81759274), (-5.1620774, 49.726093, -0.81759274), (-2.5845807, 49.931477, -0.40935737), (-2.5596144, 49.931477, -0.54406285), (-5.112213, 49.726093, -1.0866345), (-5.112213, 49.726093, -1.0866345), (-2.5596144, 49.931477, -0.54406285), (-2.5276325, 49.931477, -0.6772771), (-5.048337, 49.726093, -1.3526978), (-5.048337, 49.726093, -1.3526978), (-2.5276325, 49.931477, -0.6772771), (-2.4887226, 49.931477, -0.808635), (-4.970624, 49.726093, -1.6150535), (-4.970624, 49.726093, -1.6150535), (-2.4887226, 49.931477, -0.808635), (-2.4429913, 49.931477, -0.93777645), (-4.8792863, 49.726093, -1.8729825), (-4.8792863, 49.726093, -1.8729825), (-2.4429913, 49.931477, -0.93777645), (-2.3905637, 49.931477, -1.0643475), (-4.774575, 49.726093, -2.1257777), (-4.774575, 49.726093, -2.1257777), (-2.3905637, 49.931477, -1.0643475), (-2.331584, 49.931477, -1.1880014), (-4.656777, 49.726093, -2.3727465), (-4.656777, 49.726093, -2.3727465), (-2.331584, 49.931477, -1.1880014), (-2.2662134, 49.931477, -1.308399), (-4.526215, 49.726093, -2.6132116), (-4.526215, 49.726093, -2.6132116), (-2.2662134, 49.931477, -1.308399), (-2.1946313, 49.931477, -1.4252102), (-4.3832474, 49.726093, -2.846514), (-4.3832474, 49.726093, -2.846514), (-2.1946313, 49.931477, -1.4252102), (-2.117034, 49.931477, -1.5381151), (-4.2282653, 49.726093, -3.0720146), (-4.2282653, 49.726093, -3.0720146), (-2.117034, 49.931477, -1.5381151), (-2.033634, 49.931477, -1.6468042), (-4.0616937, 49.726093, -3.2890947), (-4.0616937, 49.726093, -3.2890947), (-2.033634, 49.931477, -1.6468042), (-1.9446597, 49.931477, -1.7509795), (-3.8839893, 49.726093, -3.4971597), (-3.8839893, 49.726093, -3.4971597), (-1.9446597, 49.931477, -1.7509795), (-1.8503555, 49.931477, -1.8503555), (-3.6956394, 49.726093, -3.6956394), (-3.6956394, 49.726093, -3.6956394), (-1.8503555, 49.931477, -1.8503555), (-1.7509795, 49.931477, -1.9446597), (-3.4971597, 49.726093, -3.8839893), (-3.4971597, 49.726093, -3.8839893), (-1.7509795, 49.931477, -1.9446597), (-1.6468042, 49.931477, -2.033634), (-3.2890947, 49.726093, -4.0616937), (-3.2890947, 49.726093, -4.0616937), (-1.6468042, 49.931477, -2.033634), (-1.5381151, 49.931477, -2.117034), (-3.0720146, 49.726093, -4.2282653), (-3.0720146, 49.726093, -4.2282653), (-1.5381151, 49.931477, -2.117034), (-1.4252102, 49.931477, -2.1946313), (-2.846514, 49.726093, -4.3832474), (-2.846514, 49.726093, -4.3832474), (-1.4252102, 49.931477, -2.1946313), (-1.308399, 49.931477, -2.2662134), (-2.6132116, 49.726093, -4.526215), (-2.6132116, 49.726093, -4.526215), (-1.308399, 49.931477, -2.2662134), (-1.1880014, 49.931477, -2.331584), (-2.3727465, 49.726093, -4.656777), (-2.3727465, 49.726093, -4.656777), (-1.1880014, 49.931477, -2.331584), (-1.0643475, 49.931477, -2.3905637), (-2.1257777, 49.726093, -4.774575), (-2.1257777, 49.726093, -4.774575), (-1.0643475, 49.931477, -2.3905637), (-0.93777645, 49.931477, -2.4429913), (-1.8729825, 49.726093, -4.8792863), (-1.8729825, 49.726093, -4.8792863), (-0.93777645, 49.931477, -2.4429913), (-0.808635, 49.931477, -2.4887226), (-1.6150535, 49.726093, -4.970624), (-1.6150535, 49.726093, -4.970624), (-0.808635, 49.931477, -2.4887226), (-0.6772771, 49.931477, -2.5276325), (-1.3526978, 49.726093, -5.048337), (-1.3526978, 49.726093, -5.048337), (-0.6772771, 49.931477, -2.5276325), (-0.54406285, 49.931477, -2.5596144), (-1.0866345, 49.726093, -5.112213), (-1.0866345, 49.726093, -5.112213), (-0.54406285, 49.931477, -2.5596144), (-0.40935737, 49.931477, -2.5845807), (-0.81759274, 49.726093, -5.1620774), (-0.81759274, 49.726093, -5.1620774), (-0.40935737, 49.931477, -2.5845807), (-0.27352986, 49.931477, -2.6024628), (-0.54631, 49.726093, -5.197792), (-0.54631, 49.726093, -5.197792), (-0.27352986, 49.931477, -2.6024628), (-0.13695261, 49.931477, -2.6132116), (-0.27352986, 49.726093, -5.2192607), (-0.27352986, 49.726093, -5.2192607), (-0.13695261, 49.931477, -2.6132116), (-4.80698e-16, 49.931477, -2.616798), (-9.600784e-16, 49.726093, -5.2264233), (-9.600784e-16, 49.726093, -5.2264233), (-4.80698e-16, 49.931477, -2.616798), (0.13695261, 49.931477, -2.6132116), (0.27352986, 49.726093, -5.2192607), (0.27352986, 49.726093, -5.2192607), (0.13695261, 49.931477, -2.6132116), (0.27352986, 49.931477, -2.6024628), (0.54631, 49.726093, -5.197792), (0.54631, 49.726093, -5.197792), (0.27352986, 49.931477, -2.6024628), (0.40935737, 49.931477, -2.5845807), (0.81759274, 49.726093, -5.1620774), (0.81759274, 49.726093, -5.1620774), (0.40935737, 49.931477, -2.5845807), (0.54406285, 49.931477, -2.5596144), (1.0866345, 49.726093, -5.112213), (1.0866345, 49.726093, -5.112213), (0.54406285, 49.931477, -2.5596144), (0.6772771, 49.931477, -2.5276325), (1.3526978, 49.726093, -5.048337), (1.3526978, 49.726093, -5.048337), (0.6772771, 49.931477, -2.5276325), (0.808635, 49.931477, -2.4887226), (1.6150535, 49.726093, -4.970624), (1.6150535, 49.726093, -4.970624), (0.808635, 49.931477, -2.4887226), (0.93777645, 49.931477, -2.4429913), (1.8729825, 49.726093, -4.8792863), (1.8729825, 49.726093, -4.8792863), (0.93777645, 49.931477, -2.4429913), (1.0643475, 49.931477, -2.3905637), (2.1257777, 49.726093, -4.774575), (2.1257777, 49.726093, -4.774575), (1.0643475, 49.931477, -2.3905637), (1.1880014, 49.931477, -2.331584), (2.3727465, 49.726093, -4.656777), (2.3727465, 49.726093, -4.656777), (1.1880014, 49.931477, -2.331584), (1.308399, 49.931477, -2.2662134), (2.6132116, 49.726093, -4.526215), (2.6132116, 49.726093, -4.526215), (1.308399, 49.931477, -2.2662134), (1.4252102, 49.931477, -2.1946313), (2.846514, 49.726093, -4.3832474), (2.846514, 49.726093, -4.3832474), (1.4252102, 49.931477, -2.1946313), (1.5381151, 49.931477, -2.117034), (3.0720146, 49.726093, -4.2282653), (3.0720146, 49.726093, -4.2282653), (1.5381151, 49.931477, -2.117034), (1.6468042, 49.931477, -2.033634), (3.2890947, 49.726093, -4.0616937), (3.2890947, 49.726093, -4.0616937), (1.6468042, 49.931477, -2.033634), (1.7509795, 49.931477, -1.9446597), (3.4971597, 49.726093, -3.8839893), (3.4971597, 49.726093, -3.8839893), (1.7509795, 49.931477, -1.9446597), (1.8503555, 49.931477, -1.8503555), (3.6956394, 49.726093, -3.6956394), (3.6956394, 49.726093, -3.6956394), (1.8503555, 49.931477, -1.8503555), (1.9446597, 49.931477, -1.7509795), (3.8839893, 49.726093, -3.4971597), (3.8839893, 49.726093, -3.4971597), (1.9446597, 49.931477, -1.7509795), (2.033634, 49.931477, -1.6468042), (4.0616937, 49.726093, -3.2890947), (4.0616937, 49.726093, -3.2890947), (2.033634, 49.931477, -1.6468042), (2.117034, 49.931477, -1.5381151), (4.2282653, 49.726093, -3.0720146), (4.2282653, 49.726093, -3.0720146), (2.117034, 49.931477, -1.5381151), (2.1946313, 49.931477, -1.4252102), (4.3832474, 49.726093, -2.846514), (4.3832474, 49.726093, -2.846514), (2.1946313, 49.931477, -1.4252102), (2.2662134, 49.931477, -1.308399), (4.526215, 49.726093, -2.6132116), (4.526215, 49.726093, -2.6132116), (2.2662134, 49.931477, -1.308399), (2.331584, 49.931477, -1.1880014), (4.656777, 49.726093, -2.3727465), (4.656777, 49.726093, -2.3727465), (2.331584, 49.931477, -1.1880014), (2.3905637, 49.931477, -1.0643475), (4.774575, 49.726093, -2.1257777), (4.774575, 49.726093, -2.1257777), (2.3905637, 49.931477, -1.0643475), (2.4429913, 49.931477, -0.93777645), (4.8792863, 49.726093, -1.8729825), (4.8792863, 49.726093, -1.8729825), (2.4429913, 49.931477, -0.93777645), (2.4887226, 49.931477, -0.808635), (4.970624, 49.726093, -1.6150535), (4.970624, 49.726093, -1.6150535), (2.4887226, 49.931477, -0.808635), (2.5276325, 49.931477, -0.6772771), (5.048337, 49.726093, -1.3526978), (5.048337, 49.726093, -1.3526978), (2.5276325, 49.931477, -0.6772771), (2.5596144, 49.931477, -0.54406285), (5.112213, 49.726093, -1.0866345), (5.112213, 49.726093, -1.0866345), (2.5596144, 49.931477, -0.54406285), (2.5845807, 49.931477, -0.40935737), (5.1620774, 49.726093, -0.81759274), (5.1620774, 49.726093, -0.81759274), (2.5845807, 49.931477, -0.40935737), (2.6024628, 49.931477, -0.27352986), (5.197792, 49.726093, -0.54631), (5.197792, 49.726093, -0.54631), (2.6024628, 49.931477, -0.27352986), (2.6132116, 49.931477, -0.13695261), (5.2192607, 49.726093, -0.27352986), (5.2192607, 49.726093, -0.27352986), (2.6132116, 49.931477, -0.13695261), (2.616798, 49.931477, 0), (5.2264233, 49.726093, 0), (0, 50, 0), (2.6132116, 49.931477, 0.13695261), (2.616798, 49.931477, 0), (0, 50, 0), (2.6024628, 49.931477, 0.27352986), (2.6132116, 49.931477, 0.13695261), (0, 50, 0), (2.5845807, 49.931477, 0.40935737), (2.6024628, 49.931477, 0.27352986), (0, 50, 0), (2.5596144, 49.931477, 0.54406285), (2.5845807, 49.931477, 0.40935737), (0, 50, 0), (2.5276325, 49.931477, 0.6772771), (2.5596144, 49.931477, 0.54406285), (0, 50, 0), (2.4887226, 49.931477, 0.808635), (2.5276325, 49.931477, 0.6772771), (0, 50, 0), (2.4429913, 49.931477, 0.93777645), (2.4887226, 49.931477, 0.808635), (0, 50, 0), (2.3905637, 49.931477, 1.0643475), (2.4429913, 49.931477, 0.93777645), (0, 50, 0), (2.331584, 49.931477, 1.1880014), (2.3905637, 49.931477, 1.0643475), (0, 50, 0), (2.2662134, 49.931477, 1.308399), (2.331584, 49.931477, 1.1880014), (0, 50, 0), (2.1946313, 49.931477, 1.4252102), (2.2662134, 49.931477, 1.308399), (0, 50, 0), (2.117034, 49.931477, 1.5381151), (2.1946313, 49.931477, 1.4252102), (0, 50, 0), (2.033634, 49.931477, 1.6468042), (2.117034, 49.931477, 1.5381151), (0, 50, 0), (1.9446597, 49.931477, 1.7509795), (2.033634, 49.931477, 1.6468042), (0, 50, 0), (1.8503555, 49.931477, 1.8503555), (1.9446597, 49.931477, 1.7509795), (0, 50, 0), (1.7509795, 49.931477, 1.9446597), (1.8503555, 49.931477, 1.8503555), (0, 50, 0), (1.6468042, 49.931477, 2.033634), (1.7509795, 49.931477, 1.9446597), (0, 50, 0), (1.5381151, 49.931477, 2.117034), (1.6468042, 49.931477, 2.033634), (0, 50, 0), (1.4252102, 49.931477, 2.1946313), (1.5381151, 49.931477, 2.117034), (0, 50, 0), (1.308399, 49.931477, 2.2662134), (1.4252102, 49.931477, 2.1946313), (0, 50, 0), (1.1880014, 49.931477, 2.331584), (1.308399, 49.931477, 2.2662134), (0, 50, 0), (1.0643475, 49.931477, 2.3905637), (1.1880014, 49.931477, 2.331584), (0, 50, 0), (0.93777645, 49.931477, 2.4429913), (1.0643475, 49.931477, 2.3905637), (0, 50, 0), (0.808635, 49.931477, 2.4887226), (0.93777645, 49.931477, 2.4429913), (0, 50, 0), (0.6772771, 49.931477, 2.5276325), (0.808635, 49.931477, 2.4887226), (0, 50, 0), (0.54406285, 49.931477, 2.5596144), (0.6772771, 49.931477, 2.5276325), (0, 50, 0), (0.40935737, 49.931477, 2.5845807), (0.54406285, 49.931477, 2.5596144), (0, 50, 0), (0.27352986, 49.931477, 2.6024628), (0.40935737, 49.931477, 2.5845807), (0, 50, 0), (0.13695261, 49.931477, 2.6132116), (0.27352986, 49.931477, 2.6024628), (0, 50, 0), (1.6023265e-16, 49.931477, 2.616798), (0.13695261, 49.931477, 2.6132116), (0, 50, 0), (-0.13695261, 49.931477, 2.6132116), (1.6023265e-16, 49.931477, 2.616798), (0, 50, 0), (-0.27352986, 49.931477, 2.6024628), (-0.13695261, 49.931477, 2.6132116), (0, 50, 0), (-0.40935737, 49.931477, 2.5845807), (-0.27352986, 49.931477, 2.6024628), (0, 50, 0), (-0.54406285, 49.931477, 2.5596144), (-0.40935737, 49.931477, 2.5845807), (0, 50, 0), (-0.6772771, 49.931477, 2.5276325), (-0.54406285, 49.931477, 2.5596144), (0, 50, 0), (-0.808635, 49.931477, 2.4887226), (-0.6772771, 49.931477, 2.5276325), (0, 50, 0), (-0.93777645, 49.931477, 2.4429913), (-0.808635, 49.931477, 2.4887226), (0, 50, 0), (-1.0643475, 49.931477, 2.3905637), (-0.93777645, 49.931477, 2.4429913), (0, 50, 0), (-1.1880014, 49.931477, 2.331584), (-1.0643475, 49.931477, 2.3905637), (0, 50, 0), (-1.308399, 49.931477, 2.2662134), (-1.1880014, 49.931477, 2.331584), (0, 50, 0), (-1.4252102, 49.931477, 2.1946313), (-1.308399, 49.931477, 2.2662134), (0, 50, 0), (-1.5381151, 49.931477, 2.117034), (-1.4252102, 49.931477, 2.1946313), (0, 50, 0), (-1.6468042, 49.931477, 2.033634), (-1.5381151, 49.931477, 2.117034), (0, 50, 0), (-1.7509795, 49.931477, 1.9446597), (-1.6468042, 49.931477, 2.033634), (0, 50, 0), (-1.8503555, 49.931477, 1.8503555), (-1.7509795, 49.931477, 1.9446597), (0, 50, 0), (-1.9446597, 49.931477, 1.7509795), (-1.8503555, 49.931477, 1.8503555), (0, 50, 0), (-2.033634, 49.931477, 1.6468042), (-1.9446597, 49.931477, 1.7509795), (0, 50, 0), (-2.117034, 49.931477, 1.5381151), (-2.033634, 49.931477, 1.6468042), (0, 50, 0), (-2.1946313, 49.931477, 1.4252102), (-2.117034, 49.931477, 1.5381151), (0, 50, 0), (-2.2662134, 49.931477, 1.308399), (-2.1946313, 49.931477, 1.4252102), (0, 50, 0), (-2.331584, 49.931477, 1.1880014), (-2.2662134, 49.931477, 1.308399), (0, 50, 0), (-2.3905637, 49.931477, 1.0643475), (-2.331584, 49.931477, 1.1880014), (0, 50, 0), (-2.4429913, 49.931477, 0.93777645), (-2.3905637, 49.931477, 1.0643475), (0, 50, 0), (-2.4887226, 49.931477, 0.808635), (-2.4429913, 49.931477, 0.93777645), (0, 50, 0), (-2.5276325, 49.931477, 0.6772771), (-2.4887226, 49.931477, 0.808635), (0, 50, 0), (-2.5596144, 49.931477, 0.54406285), (-2.5276325, 49.931477, 0.6772771), (0, 50, 0), (-2.5845807, 49.931477, 0.40935737), (-2.5596144, 49.931477, 0.54406285), (0, 50, 0), (-2.6024628, 49.931477, 0.27352986), (-2.5845807, 49.931477, 0.40935737), (0, 50, 0), (-2.6132116, 49.931477, 0.13695261), (-2.6024628, 49.931477, 0.27352986), (0, 50, 0), (-2.616798, 49.931477, 3.204653e-16), (-2.6132116, 49.931477, 0.13695261), (0, 50, 0), (-2.6132116, 49.931477, -0.13695261), (-2.616798, 49.931477, 3.204653e-16), (0, 50, 0), (-2.6024628, 49.931477, -0.27352986), (-2.6132116, 49.931477, -0.13695261), (0, 50, 0), (-2.5845807, 49.931477, -0.40935737), (-2.6024628, 49.931477, -0.27352986), (0, 50, 0), (-2.5596144, 49.931477, -0.54406285), (-2.5845807, 49.931477, -0.40935737), (0, 50, 0), (-2.5276325, 49.931477, -0.6772771), (-2.5596144, 49.931477, -0.54406285), (0, 50, 0), (-2.4887226, 49.931477, -0.808635), (-2.5276325, 49.931477, -0.6772771), (0, 50, 0), (-2.4429913, 49.931477, -0.93777645), (-2.4887226, 49.931477, -0.808635), (0, 50, 0), (-2.3905637, 49.931477, -1.0643475), (-2.4429913, 49.931477, -0.93777645), (0, 50, 0), (-2.331584, 49.931477, -1.1880014), (-2.3905637, 49.931477, -1.0643475), (0, 50, 0), (-2.2662134, 49.931477, -1.308399), (-2.331584, 49.931477, -1.1880014), (0, 50, 0), (-2.1946313, 49.931477, -1.4252102), (-2.2662134, 49.931477, -1.308399), (0, 50, 0), (-2.117034, 49.931477, -1.5381151), (-2.1946313, 49.931477, -1.4252102), (0, 50, 0), (-2.033634, 49.931477, -1.6468042), (-2.117034, 49.931477, -1.5381151), (0, 50, 0), (-1.9446597, 49.931477, -1.7509795), (-2.033634, 49.931477, -1.6468042), (0, 50, 0), (-1.8503555, 49.931477, -1.8503555), (-1.9446597, 49.931477, -1.7509795), (0, 50, 0), (-1.7509795, 49.931477, -1.9446597), (-1.8503555, 49.931477, -1.8503555), (0, 50, 0), (-1.6468042, 49.931477, -2.033634), (-1.7509795, 49.931477, -1.9446597), (0, 50, 0), (-1.5381151, 49.931477, -2.117034), (-1.6468042, 49.931477, -2.033634), (0, 50, 0), (-1.4252102, 49.931477, -2.1946313), (-1.5381151, 49.931477, -2.117034), (0, 50, 0), (-1.308399, 49.931477, -2.2662134), (-1.4252102, 49.931477, -2.1946313), (0, 50, 0), (-1.1880014, 49.931477, -2.331584), (-1.308399, 49.931477, -2.2662134), (0, 50, 0), (-1.0643475, 49.931477, -2.3905637), (-1.1880014, 49.931477, -2.331584), (0, 50, 0), (-0.93777645, 49.931477, -2.4429913), (-1.0643475, 49.931477, -2.3905637), (0, 50, 0), (-0.808635, 49.931477, -2.4887226), (-0.93777645, 49.931477, -2.4429913), (0, 50, 0), (-0.6772771, 49.931477, -2.5276325), (-0.808635, 49.931477, -2.4887226), (0, 50, 0), (-0.54406285, 49.931477, -2.5596144), (-0.6772771, 49.931477, -2.5276325), (0, 50, 0), (-0.40935737, 49.931477, -2.5845807), (-0.54406285, 49.931477, -2.5596144), (0, 50, 0), (-0.27352986, 49.931477, -2.6024628), (-0.40935737, 49.931477, -2.5845807), (0, 50, 0), (-0.13695261, 49.931477, -2.6132116), (-0.27352986, 49.931477, -2.6024628), (0, 50, 0), (-4.80698e-16, 49.931477, -2.616798), (-0.13695261, 49.931477, -2.6132116), (0, 50, 0), (0.13695261, 49.931477, -2.6132116), (-4.80698e-16, 49.931477, -2.616798), (0, 50, 0), (0.27352986, 49.931477, -2.6024628), (0.13695261, 49.931477, -2.6132116), (0, 50, 0), (0.40935737, 49.931477, -2.5845807), (0.27352986, 49.931477, -2.6024628), (0, 50, 0), (0.54406285, 49.931477, -2.5596144), (0.40935737, 49.931477, -2.5845807), (0, 50, 0), (0.6772771, 49.931477, -2.5276325), (0.54406285, 49.931477, -2.5596144), (0, 50, 0), (0.808635, 49.931477, -2.4887226), (0.6772771, 49.931477, -2.5276325), (0, 50, 0), (0.93777645, 49.931477, -2.4429913), (0.808635, 49.931477, -2.4887226), (0, 50, 0), (1.0643475, 49.931477, -2.3905637), (0.93777645, 49.931477, -2.4429913), (0, 50, 0), (1.1880014, 49.931477, -2.331584), (1.0643475, 49.931477, -2.3905637), (0, 50, 0), (1.308399, 49.931477, -2.2662134), (1.1880014, 49.931477, -2.331584), (0, 50, 0), (1.4252102, 49.931477, -2.1946313), (1.308399, 49.931477, -2.2662134), (0, 50, 0), (1.5381151, 49.931477, -2.117034), (1.4252102, 49.931477, -2.1946313), (0, 50, 0), (1.6468042, 49.931477, -2.033634), (1.5381151, 49.931477, -2.117034), (0, 50, 0), (1.7509795, 49.931477, -1.9446597), (1.6468042, 49.931477, -2.033634), (0, 50, 0), (1.8503555, 49.931477, -1.8503555), (1.7509795, 49.931477, -1.9446597), (0, 50, 0), (1.9446597, 49.931477, -1.7509795), (1.8503555, 49.931477, -1.8503555), (0, 50, 0), (2.033634, 49.931477, -1.6468042), (1.9446597, 49.931477, -1.7509795), (0, 50, 0), (2.117034, 49.931477, -1.5381151), (2.033634, 49.931477, -1.6468042), (0, 50, 0), (2.1946313, 49.931477, -1.4252102), (2.117034, 49.931477, -1.5381151), (0, 50, 0), (2.2662134, 49.931477, -1.308399), (2.1946313, 49.931477, -1.4252102), (0, 50, 0), (2.331584, 49.931477, -1.1880014), (2.2662134, 49.931477, -1.308399), (0, 50, 0), (2.3905637, 49.931477, -1.0643475), (2.331584, 49.931477, -1.1880014), (0, 50, 0), (2.4429913, 49.931477, -0.93777645), (2.3905637, 49.931477, -1.0643475), (0, 50, 0), (2.4887226, 49.931477, -0.808635), (2.4429913, 49.931477, -0.93777645), (0, 50, 0), (2.5276325, 49.931477, -0.6772771), (2.4887226, 49.931477, -0.808635), (0, 50, 0), (2.5596144, 49.931477, -0.54406285), (2.5276325, 49.931477, -0.6772771), (0, 50, 0), (2.5845807, 49.931477, -0.40935737), (2.5596144, 49.931477, -0.54406285), (0, 50, 0), (2.6024628, 49.931477, -0.27352986), (2.5845807, 49.931477, -0.40935737), (0, 50, 0), (2.6132116, 49.931477, -0.13695261), (2.6024628, 49.931477, -0.27352986), (0, 50, 0), (2.616798, 49.931477, 0), (2.6132116, 49.931477, -0.13695261)] ( + interpolation = "faceVarying" + ) + point3f[] points = [(0, -50, 0), (2.616798, -49.931477, 0), (2.6132116, -49.931477, 0.13695261), (2.6024628, -49.931477, 0.27352986), (2.5845807, -49.931477, 0.40935737), (2.5596144, -49.931477, 0.54406285), (2.5276325, -49.931477, 0.6772771), (2.4887226, -49.931477, 0.808635), (2.4429913, -49.931477, 0.93777645), (2.3905637, -49.931477, 1.0643475), (2.331584, -49.931477, 1.1880014), (2.2662134, -49.931477, 1.308399), (2.1946313, -49.931477, 1.4252102), (2.117034, -49.931477, 1.5381151), (2.033634, -49.931477, 1.6468042), (1.9446597, -49.931477, 1.7509795), (1.8503555, -49.931477, 1.8503555), (1.7509795, -49.931477, 1.9446597), (1.6468042, -49.931477, 2.033634), (1.5381151, -49.931477, 2.117034), (1.4252102, -49.931477, 2.1946313), (1.308399, -49.931477, 2.2662134), (1.1880014, -49.931477, 2.331584), (1.0643475, -49.931477, 2.3905637), (0.93777645, -49.931477, 2.4429913), (0.808635, -49.931477, 2.4887226), (0.6772771, -49.931477, 2.5276325), (0.54406285, -49.931477, 2.5596144), (0.40935737, -49.931477, 2.5845807), (0.27352986, -49.931477, 2.6024628), (0.13695261, -49.931477, 2.6132116), (1.6023265e-16, -49.931477, 2.616798), (-0.13695261, -49.931477, 2.6132116), (-0.27352986, -49.931477, 2.6024628), (-0.40935737, -49.931477, 2.5845807), (-0.54406285, -49.931477, 2.5596144), (-0.6772771, -49.931477, 2.5276325), (-0.808635, -49.931477, 2.4887226), (-0.93777645, -49.931477, 2.4429913), (-1.0643475, -49.931477, 2.3905637), (-1.1880014, -49.931477, 2.331584), (-1.308399, -49.931477, 2.2662134), (-1.4252102, -49.931477, 2.1946313), (-1.5381151, -49.931477, 2.117034), (-1.6468042, -49.931477, 2.033634), (-1.7509795, -49.931477, 1.9446597), (-1.8503555, -49.931477, 1.8503555), (-1.9446597, -49.931477, 1.7509795), (-2.033634, -49.931477, 1.6468042), (-2.117034, -49.931477, 1.5381151), (-2.1946313, -49.931477, 1.4252102), (-2.2662134, -49.931477, 1.308399), (-2.331584, -49.931477, 1.1880014), (-2.3905637, -49.931477, 1.0643475), (-2.4429913, -49.931477, 0.93777645), (-2.4887226, -49.931477, 0.808635), (-2.5276325, -49.931477, 0.6772771), (-2.5596144, -49.931477, 0.54406285), (-2.5845807, -49.931477, 0.40935737), (-2.6024628, -49.931477, 0.27352986), (-2.6132116, -49.931477, 0.13695261), (-2.616798, -49.931477, 3.204653e-16), (-2.6132116, -49.931477, -0.13695261), (-2.6024628, -49.931477, -0.27352986), (-2.5845807, -49.931477, -0.40935737), (-2.5596144, -49.931477, -0.54406285), (-2.5276325, -49.931477, -0.6772771), (-2.4887226, -49.931477, -0.808635), (-2.4429913, -49.931477, -0.93777645), (-2.3905637, -49.931477, -1.0643475), (-2.331584, -49.931477, -1.1880014), (-2.2662134, -49.931477, -1.308399), (-2.1946313, -49.931477, -1.4252102), (-2.117034, -49.931477, -1.5381151), (-2.033634, -49.931477, -1.6468042), (-1.9446597, -49.931477, -1.7509795), (-1.8503555, -49.931477, -1.8503555), (-1.7509795, -49.931477, -1.9446597), (-1.6468042, -49.931477, -2.033634), (-1.5381151, -49.931477, -2.117034), (-1.4252102, -49.931477, -2.1946313), (-1.308399, -49.931477, -2.2662134), (-1.1880014, -49.931477, -2.331584), (-1.0643475, -49.931477, -2.3905637), (-0.93777645, -49.931477, -2.4429913), (-0.808635, -49.931477, -2.4887226), (-0.6772771, -49.931477, -2.5276325), (-0.54406285, -49.931477, -2.5596144), (-0.40935737, -49.931477, -2.5845807), (-0.27352986, -49.931477, -2.6024628), (-0.13695261, -49.931477, -2.6132116), (-4.80698e-16, -49.931477, -2.616798), (0.13695261, -49.931477, -2.6132116), (0.27352986, -49.931477, -2.6024628), (0.40935737, -49.931477, -2.5845807), (0.54406285, -49.931477, -2.5596144), (0.6772771, -49.931477, -2.5276325), (0.808635, -49.931477, -2.4887226), (0.93777645, -49.931477, -2.4429913), (1.0643475, -49.931477, -2.3905637), (1.1880014, -49.931477, -2.331584), (1.308399, -49.931477, -2.2662134), (1.4252102, -49.931477, -2.1946313), (1.5381151, -49.931477, -2.117034), (1.6468042, -49.931477, -2.033634), (1.7509795, -49.931477, -1.9446597), (1.8503555, -49.931477, -1.8503555), (1.9446597, -49.931477, -1.7509795), (2.033634, -49.931477, -1.6468042), (2.117034, -49.931477, -1.5381151), (2.1946313, -49.931477, -1.4252102), (2.2662134, -49.931477, -1.308399), (2.331584, -49.931477, -1.1880014), (2.3905637, -49.931477, -1.0643475), (2.4429913, -49.931477, -0.93777645), (2.4887226, -49.931477, -0.808635), (2.5276325, -49.931477, -0.6772771), (2.5596144, -49.931477, -0.54406285), (2.5845807, -49.931477, -0.40935737), (2.6024628, -49.931477, -0.27352986), (2.6132116, -49.931477, -0.13695261), (5.2264233, -49.726093, 0), (5.2192607, -49.726093, 0.27352986), (5.197792, -49.726093, 0.54631), (5.1620774, -49.726093, 0.81759274), (5.112213, -49.726093, 1.0866345), (5.048337, -49.726093, 1.3526978), (4.970624, -49.726093, 1.6150535), (4.8792863, -49.726093, 1.8729825), (4.774575, -49.726093, 2.1257777), (4.656777, -49.726093, 2.3727465), (4.526215, -49.726093, 2.6132116), (4.3832474, -49.726093, 2.846514), (4.2282653, -49.726093, 3.0720146), (4.0616937, -49.726093, 3.2890947), (3.8839893, -49.726093, 3.4971597), (3.6956394, -49.726093, 3.6956394), (3.4971597, -49.726093, 3.8839893), (3.2890947, -49.726093, 4.0616937), (3.0720146, -49.726093, 4.2282653), (2.846514, -49.726093, 4.3832474), (2.6132116, -49.726093, 4.526215), (2.3727465, -49.726093, 4.656777), (2.1257777, -49.726093, 4.774575), (1.8729825, -49.726093, 4.8792863), (1.6150535, -49.726093, 4.970624), (1.3526978, -49.726093, 5.048337), (1.0866345, -49.726093, 5.112213), (0.81759274, -49.726093, 5.1620774), (0.54631, -49.726093, 5.197792), (0.27352986, -49.726093, 5.2192607), (3.2002612e-16, -49.726093, 5.2264233), (-0.27352986, -49.726093, 5.2192607), (-0.54631, -49.726093, 5.197792), (-0.81759274, -49.726093, 5.1620774), (-1.0866345, -49.726093, 5.112213), (-1.3526978, -49.726093, 5.048337), (-1.6150535, -49.726093, 4.970624), (-1.8729825, -49.726093, 4.8792863), (-2.1257777, -49.726093, 4.774575), (-2.3727465, -49.726093, 4.656777), (-2.6132116, -49.726093, 4.526215), (-2.846514, -49.726093, 4.3832474), (-3.0720146, -49.726093, 4.2282653), (-3.2890947, -49.726093, 4.0616937), (-3.4971597, -49.726093, 3.8839893), (-3.6956394, -49.726093, 3.6956394), (-3.8839893, -49.726093, 3.4971597), (-4.0616937, -49.726093, 3.2890947), (-4.2282653, -49.726093, 3.0720146), (-4.3832474, -49.726093, 2.846514), (-4.526215, -49.726093, 2.6132116), (-4.656777, -49.726093, 2.3727465), (-4.774575, -49.726093, 2.1257777), (-4.8792863, -49.726093, 1.8729825), (-4.970624, -49.726093, 1.6150535), (-5.048337, -49.726093, 1.3526978), (-5.112213, -49.726093, 1.0866345), (-5.1620774, -49.726093, 0.81759274), (-5.197792, -49.726093, 0.54631), (-5.2192607, -49.726093, 0.27352986), (-5.2264233, -49.726093, 6.4005224e-16), (-5.2192607, -49.726093, -0.27352986), (-5.197792, -49.726093, -0.54631), (-5.1620774, -49.726093, -0.81759274), (-5.112213, -49.726093, -1.0866345), (-5.048337, -49.726093, -1.3526978), (-4.970624, -49.726093, -1.6150535), (-4.8792863, -49.726093, -1.8729825), (-4.774575, -49.726093, -2.1257777), (-4.656777, -49.726093, -2.3727465), (-4.526215, -49.726093, -2.6132116), (-4.3832474, -49.726093, -2.846514), (-4.2282653, -49.726093, -3.0720146), (-4.0616937, -49.726093, -3.2890947), (-3.8839893, -49.726093, -3.4971597), (-3.6956394, -49.726093, -3.6956394), (-3.4971597, -49.726093, -3.8839893), (-3.2890947, -49.726093, -4.0616937), (-3.0720146, -49.726093, -4.2282653), (-2.846514, -49.726093, -4.3832474), (-2.6132116, -49.726093, -4.526215), (-2.3727465, -49.726093, -4.656777), (-2.1257777, -49.726093, -4.774575), (-1.8729825, -49.726093, -4.8792863), (-1.6150535, -49.726093, -4.970624), (-1.3526978, -49.726093, -5.048337), (-1.0866345, -49.726093, -5.112213), (-0.81759274, -49.726093, -5.1620774), (-0.54631, -49.726093, -5.197792), (-0.27352986, -49.726093, -5.2192607), (-9.600784e-16, -49.726093, -5.2264233), (0.27352986, -49.726093, -5.2192607), (0.54631, -49.726093, -5.197792), (0.81759274, -49.726093, -5.1620774), (1.0866345, -49.726093, -5.112213), (1.3526978, -49.726093, -5.048337), (1.6150535, -49.726093, -4.970624), (1.8729825, -49.726093, -4.8792863), (2.1257777, -49.726093, -4.774575), (2.3727465, -49.726093, -4.656777), (2.6132116, -49.726093, -4.526215), (2.846514, -49.726093, -4.3832474), (3.0720146, -49.726093, -4.2282653), (3.2890947, -49.726093, -4.0616937), (3.4971597, -49.726093, -3.8839893), (3.6956394, -49.726093, -3.6956394), (3.8839893, -49.726093, -3.4971597), (4.0616937, -49.726093, -3.2890947), (4.2282653, -49.726093, -3.0720146), (4.3832474, -49.726093, -2.846514), (4.526215, -49.726093, -2.6132116), (4.656777, -49.726093, -2.3727465), (4.774575, -49.726093, -2.1257777), (4.8792863, -49.726093, -1.8729825), (4.970624, -49.726093, -1.6150535), (5.048337, -49.726093, -1.3526978), (5.112213, -49.726093, -1.0866345), (5.1620774, -49.726093, -0.81759274), (5.197792, -49.726093, -0.54631), (5.2192607, -49.726093, -0.27352986), (7.8217235, -49.38442, 0), (7.8110037, -49.38442, 0.40935737), (7.778875, -49.38442, 0.81759274), (7.725425, -49.38442, 1.223587), (7.6507998, -49.38442, 1.6262277), (7.5552044, -49.38442, 2.024411), (7.438901, -49.38442, 2.4170454), (7.302208, -49.38442, 2.8030548), (7.1454997, -49.38442, 3.1813815), (6.9692063, -49.38442, 3.550988), (6.773811, -49.38442, 3.9108617), (6.5598493, -49.38442, 4.260016), (6.327907, -49.38442, 4.5974936), (6.0786204, -49.38442, 4.92237), (5.812673, -49.38442, 5.2337546), (5.5307937, -49.38442, 5.5307937), (5.2337546, -49.38442, 5.812673), (4.92237, -49.38442, 6.0786204), (4.5974936, -49.38442, 6.327907), (4.260016, -49.38442, 6.5598493), (3.9108617, -49.38442, 6.773811), (3.550988, -49.38442, 6.9692063), (3.1813815, -49.38442, 7.1454997), (2.8030548, -49.38442, 7.302208), (2.4170454, -49.38442, 7.438901), (2.024411, -49.38442, 7.5552044), (1.6262277, -49.38442, 7.6507998), (1.223587, -49.38442, 7.725425), (0.81759274, -49.38442, 7.778875), (0.40935737, -49.38442, 7.8110037), (4.789424e-16, -49.38442, 7.8217235), (-0.40935737, -49.38442, 7.8110037), (-0.81759274, -49.38442, 7.778875), (-1.223587, -49.38442, 7.725425), (-1.6262277, -49.38442, 7.6507998), (-2.024411, -49.38442, 7.5552044), (-2.4170454, -49.38442, 7.438901), (-2.8030548, -49.38442, 7.302208), (-3.1813815, -49.38442, 7.1454997), (-3.550988, -49.38442, 6.9692063), (-3.9108617, -49.38442, 6.773811), (-4.260016, -49.38442, 6.5598493), (-4.5974936, -49.38442, 6.327907), (-4.92237, -49.38442, 6.0786204), (-5.2337546, -49.38442, 5.812673), (-5.5307937, -49.38442, 5.5307937), (-5.812673, -49.38442, 5.2337546), (-6.0786204, -49.38442, 4.92237), (-6.327907, -49.38442, 4.5974936), (-6.5598493, -49.38442, 4.260016), (-6.773811, -49.38442, 3.9108617), (-6.9692063, -49.38442, 3.550988), (-7.1454997, -49.38442, 3.1813815), (-7.302208, -49.38442, 2.8030548), (-7.438901, -49.38442, 2.4170454), (-7.5552044, -49.38442, 2.024411), (-7.6507998, -49.38442, 1.6262277), (-7.725425, -49.38442, 1.223587), (-7.778875, -49.38442, 0.81759274), (-7.8110037, -49.38442, 0.40935737), (-7.8217235, -49.38442, 9.578848e-16), (-7.8110037, -49.38442, -0.40935737), (-7.778875, -49.38442, -0.81759274), (-7.725425, -49.38442, -1.223587), (-7.6507998, -49.38442, -1.6262277), (-7.5552044, -49.38442, -2.024411), (-7.438901, -49.38442, -2.4170454), (-7.302208, -49.38442, -2.8030548), (-7.1454997, -49.38442, -3.1813815), (-6.9692063, -49.38442, -3.550988), (-6.773811, -49.38442, -3.9108617), (-6.5598493, -49.38442, -4.260016), (-6.327907, -49.38442, -4.5974936), (-6.0786204, -49.38442, -4.92237), (-5.812673, -49.38442, -5.2337546), (-5.5307937, -49.38442, -5.5307937), (-5.2337546, -49.38442, -5.812673), (-4.92237, -49.38442, -6.0786204), (-4.5974936, -49.38442, -6.327907), (-4.260016, -49.38442, -6.5598493), (-3.9108617, -49.38442, -6.773811), (-3.550988, -49.38442, -6.9692063), (-3.1813815, -49.38442, -7.1454997), (-2.8030548, -49.38442, -7.302208), (-2.4170454, -49.38442, -7.438901), (-2.024411, -49.38442, -7.5552044), (-1.6262277, -49.38442, -7.6507998), (-1.223587, -49.38442, -7.725425), (-0.81759274, -49.38442, -7.778875), (-0.40935737, -49.38442, -7.8110037), (-1.4368273e-15, -49.38442, -7.8217235), (0.40935737, -49.38442, -7.8110037), (0.81759274, -49.38442, -7.778875), (1.223587, -49.38442, -7.725425), (1.6262277, -49.38442, -7.6507998), (2.024411, -49.38442, -7.5552044), (2.4170454, -49.38442, -7.438901), (2.8030548, -49.38442, -7.302208), (3.1813815, -49.38442, -7.1454997), (3.550988, -49.38442, -6.9692063), (3.9108617, -49.38442, -6.773811), (4.260016, -49.38442, -6.5598493), (4.5974936, -49.38442, -6.327907), (4.92237, -49.38442, -6.0786204), (5.2337546, -49.38442, -5.812673), (5.5307937, -49.38442, -5.5307937), (5.812673, -49.38442, -5.2337546), (6.0786204, -49.38442, -4.92237), (6.327907, -49.38442, -4.5974936), (6.5598493, -49.38442, -4.260016), (6.773811, -49.38442, -3.9108617), (6.9692063, -49.38442, -3.550988), (7.1454997, -49.38442, -3.1813815), (7.302208, -49.38442, -2.8030548), (7.438901, -49.38442, -2.4170454), (7.5552044, -49.38442, -2.024411), (7.6507998, -49.38442, -1.6262277), (7.725425, -49.38442, -1.223587), (7.778875, -49.38442, -0.81759274), (7.8110037, -49.38442, -0.40935737), (10.395584, -48.90738, 0), (10.381338, -48.90738, 0.54406285), (10.338636, -48.90738, 1.0866345), (10.267597, -48.90738, 1.6262277), (10.168416, -48.90738, 2.1613636), (10.041364, -48.90738, 2.6905754), (9.886788, -48.90738, 3.2124124), (9.705114, -48.90738, 3.7254443), (9.496839, -48.90738, 4.2282653), (9.262533, -48.90738, 4.7194967), (9.00284, -48.90738, 5.197792), (8.718471, -48.90738, 5.661841), (8.410205, -48.90738, 6.110371), (8.078887, -48.90738, 6.5421534), (7.725425, -48.90738, 6.9560037), (7.350788, -48.90738, 7.350788), (6.9560037, -48.90738, 7.725425), (6.5421534, -48.90738, 8.078887), (6.110371, -48.90738, 8.410205), (5.661841, -48.90738, 8.718471), (5.197792, -48.90738, 9.00284), (4.7194967, -48.90738, 9.262533), (4.2282653, -48.90738, 9.496839), (3.7254443, -48.90738, 9.705114), (3.2124124, -48.90738, 9.886788), (2.6905754, -48.90738, 10.041364), (2.1613636, -48.90738, 10.168416), (1.6262277, -48.90738, 10.267597), (1.0866345, -48.90738, 10.338636), (0.54406285, -48.90738, 10.381338), (6.3654595e-16, -48.90738, 10.395584), (-0.54406285, -48.90738, 10.381338), (-1.0866345, -48.90738, 10.338636), (-1.6262277, -48.90738, 10.267597), (-2.1613636, -48.90738, 10.168416), (-2.6905754, -48.90738, 10.041364), (-3.2124124, -48.90738, 9.886788), (-3.7254443, -48.90738, 9.705114), (-4.2282653, -48.90738, 9.496839), (-4.7194967, -48.90738, 9.262533), (-5.197792, -48.90738, 9.00284), (-5.661841, -48.90738, 8.718471), (-6.110371, -48.90738, 8.410205), (-6.5421534, -48.90738, 8.078887), (-6.9560037, -48.90738, 7.725425), (-7.350788, -48.90738, 7.350788), (-7.725425, -48.90738, 6.9560037), (-8.078887, -48.90738, 6.5421534), (-8.410205, -48.90738, 6.110371), (-8.718471, -48.90738, 5.661841), (-9.00284, -48.90738, 5.197792), (-9.262533, -48.90738, 4.7194967), (-9.496839, -48.90738, 4.2282653), (-9.705114, -48.90738, 3.7254443), (-9.886788, -48.90738, 3.2124124), (-10.041364, -48.90738, 2.6905754), (-10.168416, -48.90738, 2.1613636), (-10.267597, -48.90738, 1.6262277), (-10.338636, -48.90738, 1.0866345), (-10.381338, -48.90738, 0.54406285), (-10.395584, -48.90738, 1.2730919e-15), (-10.381338, -48.90738, -0.54406285), (-10.338636, -48.90738, -1.0866345), (-10.267597, -48.90738, -1.6262277), (-10.168416, -48.90738, -2.1613636), (-10.041364, -48.90738, -2.6905754), (-9.886788, -48.90738, -3.2124124), (-9.705114, -48.90738, -3.7254443), (-9.496839, -48.90738, -4.2282653), (-9.262533, -48.90738, -4.7194967), (-9.00284, -48.90738, -5.197792), (-8.718471, -48.90738, -5.661841), (-8.410205, -48.90738, -6.110371), (-8.078887, -48.90738, -6.5421534), (-7.725425, -48.90738, -6.9560037), (-7.350788, -48.90738, -7.350788), (-6.9560037, -48.90738, -7.725425), (-6.5421534, -48.90738, -8.078887), (-6.110371, -48.90738, -8.410205), (-5.661841, -48.90738, -8.718471), (-5.197792, -48.90738, -9.00284), (-4.7194967, -48.90738, -9.262533), (-4.2282653, -48.90738, -9.496839), (-3.7254443, -48.90738, -9.705114), (-3.2124124, -48.90738, -9.886788), (-2.6905754, -48.90738, -10.041364), (-2.1613636, -48.90738, -10.168416), (-1.6262277, -48.90738, -10.267597), (-1.0866345, -48.90738, -10.338636), (-0.54406285, -48.90738, -10.381338), (-1.909638e-15, -48.90738, -10.395584), (0.54406285, -48.90738, -10.381338), (1.0866345, -48.90738, -10.338636), (1.6262277, -48.90738, -10.267597), (2.1613636, -48.90738, -10.168416), (2.6905754, -48.90738, -10.041364), (3.2124124, -48.90738, -9.886788), (3.7254443, -48.90738, -9.705114), (4.2282653, -48.90738, -9.496839), (4.7194967, -48.90738, -9.262533), (5.197792, -48.90738, -9.00284), (5.661841, -48.90738, -8.718471), (6.110371, -48.90738, -8.410205), (6.5421534, -48.90738, -8.078887), (6.9560037, -48.90738, -7.725425), (7.350788, -48.90738, -7.350788), (7.725425, -48.90738, -6.9560037), (8.078887, -48.90738, -6.5421534), (8.410205, -48.90738, -6.110371), (8.718471, -48.90738, -5.661841), (9.00284, -48.90738, -5.197792), (9.262533, -48.90738, -4.7194967), (9.496839, -48.90738, -4.2282653), (9.705114, -48.90738, -3.7254443), (9.886788, -48.90738, -3.2124124), (10.041364, -48.90738, -2.6905754), (10.168416, -48.90738, -2.1613636), (10.267597, -48.90738, -1.6262277), (10.338636, -48.90738, -1.0866345), (10.381338, -48.90738, -0.54406285), (12.940952, -48.29629, 0), (12.923217, -48.29629, 0.6772771), (12.87006, -48.29629, 1.3526978), (12.781628, -48.29629, 2.024411), (12.658161, -48.29629, 2.6905754), (12.5, -48.29629, 3.349365), (12.307577, -48.29629, 3.998974), (12.08142, -48.29629, 4.6376224), (11.822148, -48.29629, 5.2635593), (11.530473, -48.29629, 5.8750696), (11.207193, -48.29629, 6.470476), (10.853196, -48.29629, 7.0481477), (10.46945, -48.29629, 7.606501), (10.057009, -48.29629, 8.144005), (9.617002, -48.29629, 8.659187), (9.150635, -48.29629, 9.150635), (8.659187, -48.29629, 9.617002), (8.144005, -48.29629, 10.057009), (7.606501, -48.29629, 10.46945), (7.0481477, -48.29629, 10.853196), (6.470476, -48.29629, 11.207193), (5.8750696, -48.29629, 11.530473), (5.2635593, -48.29629, 11.822148), (4.6376224, -48.29629, 12.08142), (3.998974, -48.29629, 12.307577), (3.349365, -48.29629, 12.5), (2.6905754, -48.29629, 12.658161), (2.024411, -48.29629, 12.781628), (1.3526978, -48.29629, 12.87006), (0.6772771, -48.29629, 12.923217), (7.924048e-16, -48.29629, 12.940952), (-0.6772771, -48.29629, 12.923217), (-1.3526978, -48.29629, 12.87006), (-2.024411, -48.29629, 12.781628), (-2.6905754, -48.29629, 12.658161), (-3.349365, -48.29629, 12.5), (-3.998974, -48.29629, 12.307577), (-4.6376224, -48.29629, 12.08142), (-5.2635593, -48.29629, 11.822148), (-5.8750696, -48.29629, 11.530473), (-6.470476, -48.29629, 11.207193), (-7.0481477, -48.29629, 10.853196), (-7.606501, -48.29629, 10.46945), (-8.144005, -48.29629, 10.057009), (-8.659187, -48.29629, 9.617002), (-9.150635, -48.29629, 9.150635), (-9.617002, -48.29629, 8.659187), (-10.057009, -48.29629, 8.144005), (-10.46945, -48.29629, 7.606501), (-10.853196, -48.29629, 7.0481477), (-11.207193, -48.29629, 6.470476), (-11.530473, -48.29629, 5.8750696), (-11.822148, -48.29629, 5.2635593), (-12.08142, -48.29629, 4.6376224), (-12.307577, -48.29629, 3.998974), (-12.5, -48.29629, 3.349365), (-12.658161, -48.29629, 2.6905754), (-12.781628, -48.29629, 2.024411), (-12.87006, -48.29629, 1.3526978), (-12.923217, -48.29629, 0.6772771), (-12.940952, -48.29629, 1.5848095e-15), (-12.923217, -48.29629, -0.6772771), (-12.87006, -48.29629, -1.3526978), (-12.781628, -48.29629, -2.024411), (-12.658161, -48.29629, -2.6905754), (-12.5, -48.29629, -3.349365), (-12.307577, -48.29629, -3.998974), (-12.08142, -48.29629, -4.6376224), (-11.822148, -48.29629, -5.2635593), (-11.530473, -48.29629, -5.8750696), (-11.207193, -48.29629, -6.470476), (-10.853196, -48.29629, -7.0481477), (-10.46945, -48.29629, -7.606501), (-10.057009, -48.29629, -8.144005), (-9.617002, -48.29629, -8.659187), (-9.150635, -48.29629, -9.150635), (-8.659187, -48.29629, -9.617002), (-8.144005, -48.29629, -10.057009), (-7.606501, -48.29629, -10.46945), (-7.0481477, -48.29629, -10.853196), (-6.470476, -48.29629, -11.207193), (-5.8750696, -48.29629, -11.530473), (-5.2635593, -48.29629, -11.822148), (-4.6376224, -48.29629, -12.08142), (-3.998974, -48.29629, -12.307577), (-3.349365, -48.29629, -12.5), (-2.6905754, -48.29629, -12.658161), (-2.024411, -48.29629, -12.781628), (-1.3526978, -48.29629, -12.87006), (-0.6772771, -48.29629, -12.923217), (-2.3772143e-15, -48.29629, -12.940952), (0.6772771, -48.29629, -12.923217), (1.3526978, -48.29629, -12.87006), (2.024411, -48.29629, -12.781628), (2.6905754, -48.29629, -12.658161), (3.349365, -48.29629, -12.5), (3.998974, -48.29629, -12.307577), (4.6376224, -48.29629, -12.08142), (5.2635593, -48.29629, -11.822148), (5.8750696, -48.29629, -11.530473), (6.470476, -48.29629, -11.207193), (7.0481477, -48.29629, -10.853196), (7.606501, -48.29629, -10.46945), (8.144005, -48.29629, -10.057009), (8.659187, -48.29629, -9.617002), (9.150635, -48.29629, -9.150635), (9.617002, -48.29629, -8.659187), (10.057009, -48.29629, -8.144005), (10.46945, -48.29629, -7.606501), (10.853196, -48.29629, -7.0481477), (11.207193, -48.29629, -6.470476), (11.530473, -48.29629, -5.8750696), (11.822148, -48.29629, -5.2635593), (12.08142, -48.29629, -4.6376224), (12.307577, -48.29629, -3.998974), (12.5, -48.29629, -3.349365), (12.658161, -48.29629, -2.6905754), (12.781628, -48.29629, -2.024411), (12.87006, -48.29629, -1.3526978), (12.923217, -48.29629, -0.6772771), (15.45085, -47.552826, 0), (15.429675, -47.552826, 0.808635), (15.366208, -47.552826, 1.6150535), (15.260624, -47.552826, 2.4170454), (15.113212, -47.552826, 3.2124124), (14.924375, -47.552826, 3.998974), (14.694632, -47.552826, 4.774575), (14.424611, -47.552826, 5.5370893), (14.115053, -47.552826, 6.2844267), (13.766808, -47.552826, 7.014539), (13.380828, -47.552826, 7.725425), (12.958173, -47.552826, 8.415136), (12.5, -47.552826, 9.081781), (12.0075655, -47.552826, 9.723535), (11.482219, -47.552826, 10.338636), (10.925401, -47.552826, 10.925401), (10.338636, -47.552826, 11.482219), (9.723535, -47.552826, 12.0075655), (9.081781, -47.552826, 12.5), (8.415136, -47.552826, 12.958173), (7.725425, -47.552826, 13.380828), (7.014539, -47.552826, 13.766808), (6.2844267, -47.552826, 14.115053), (5.5370893, -47.552826, 14.424611), (4.774575, -47.552826, 14.694632), (3.998974, -47.552826, 14.924375), (3.2124124, -47.552826, 15.113212), (2.4170454, -47.552826, 15.260624), (1.6150535, -47.552826, 15.366208), (0.808635, -47.552826, 15.429675), (9.460917e-16, -47.552826, 15.45085), (-0.808635, -47.552826, 15.429675), (-1.6150535, -47.552826, 15.366208), (-2.4170454, -47.552826, 15.260624), (-3.2124124, -47.552826, 15.113212), (-3.998974, -47.552826, 14.924375), (-4.774575, -47.552826, 14.694632), (-5.5370893, -47.552826, 14.424611), (-6.2844267, -47.552826, 14.115053), (-7.014539, -47.552826, 13.766808), (-7.725425, -47.552826, 13.380828), (-8.415136, -47.552826, 12.958173), (-9.081781, -47.552826, 12.5), (-9.723535, -47.552826, 12.0075655), (-10.338636, -47.552826, 11.482219), (-10.925401, -47.552826, 10.925401), (-11.482219, -47.552826, 10.338636), (-12.0075655, -47.552826, 9.723535), (-12.5, -47.552826, 9.081781), (-12.958173, -47.552826, 8.415136), (-13.380828, -47.552826, 7.725425), (-13.766808, -47.552826, 7.014539), (-14.115053, -47.552826, 6.2844267), (-14.424611, -47.552826, 5.5370893), (-14.694632, -47.552826, 4.774575), (-14.924375, -47.552826, 3.998974), (-15.113212, -47.552826, 3.2124124), (-15.260624, -47.552826, 2.4170454), (-15.366208, -47.552826, 1.6150535), (-15.429675, -47.552826, 0.808635), (-15.45085, -47.552826, 1.8921833e-15), (-15.429675, -47.552826, -0.808635), (-15.366208, -47.552826, -1.6150535), (-15.260624, -47.552826, -2.4170454), (-15.113212, -47.552826, -3.2124124), (-14.924375, -47.552826, -3.998974), (-14.694632, -47.552826, -4.774575), (-14.424611, -47.552826, -5.5370893), (-14.115053, -47.552826, -6.2844267), (-13.766808, -47.552826, -7.014539), (-13.380828, -47.552826, -7.725425), (-12.958173, -47.552826, -8.415136), (-12.5, -47.552826, -9.081781), (-12.0075655, -47.552826, -9.723535), (-11.482219, -47.552826, -10.338636), (-10.925401, -47.552826, -10.925401), (-10.338636, -47.552826, -11.482219), (-9.723535, -47.552826, -12.0075655), (-9.081781, -47.552826, -12.5), (-8.415136, -47.552826, -12.958173), (-7.725425, -47.552826, -13.380828), (-7.014539, -47.552826, -13.766808), (-6.2844267, -47.552826, -14.115053), (-5.5370893, -47.552826, -14.424611), (-4.774575, -47.552826, -14.694632), (-3.998974, -47.552826, -14.924375), (-3.2124124, -47.552826, -15.113212), (-2.4170454, -47.552826, -15.260624), (-1.6150535, -47.552826, -15.366208), (-0.808635, -47.552826, -15.429675), (-2.838275e-15, -47.552826, -15.45085), (0.808635, -47.552826, -15.429675), (1.6150535, -47.552826, -15.366208), (2.4170454, -47.552826, -15.260624), (3.2124124, -47.552826, -15.113212), (3.998974, -47.552826, -14.924375), (4.774575, -47.552826, -14.694632), (5.5370893, -47.552826, -14.424611), (6.2844267, -47.552826, -14.115053), (7.014539, -47.552826, -13.766808), (7.725425, -47.552826, -13.380828), (8.415136, -47.552826, -12.958173), (9.081781, -47.552826, -12.5), (9.723535, -47.552826, -12.0075655), (10.338636, -47.552826, -11.482219), (10.925401, -47.552826, -10.925401), (11.482219, -47.552826, -10.338636), (12.0075655, -47.552826, -9.723535), (12.5, -47.552826, -9.081781), (12.958173, -47.552826, -8.415136), (13.380828, -47.552826, -7.725425), (13.766808, -47.552826, -7.014539), (14.115053, -47.552826, -6.2844267), (14.424611, -47.552826, -5.5370893), (14.694632, -47.552826, -4.774575), (14.924375, -47.552826, -3.998974), (15.113212, -47.552826, -3.2124124), (15.260624, -47.552826, -2.4170454), (15.366208, -47.552826, -1.6150535), (15.429675, -47.552826, -0.808635), (17.918398, -46.67902, 0), (17.89384, -46.67902, 0.93777645), (17.820238, -46.67902, 1.8729825), (17.697792, -46.67902, 2.8030548), (17.526838, -46.67902, 3.7254443), (17.307842, -46.67902, 4.6376224), (17.041409, -46.67902, 5.5370893), (16.728266, -46.67902, 6.4213796), (16.36927, -46.67902, 7.288069), (15.965409, -46.67902, 8.134782), (15.517787, -46.67902, 8.959199), (15.027633, -46.67902, 9.759059), (14.496288, -46.67902, 10.532169), (13.92521, -46.67902, 11.276413), (13.315965, -46.67902, 11.989748), (12.67022, -46.67902, 12.67022), (11.989748, -46.67902, 13.315965), (11.276413, -46.67902, 13.92521), (10.532169, -46.67902, 14.496288), (9.759059, -46.67902, 15.027633), (8.959199, -46.67902, 15.517787), (8.134782, -46.67902, 15.965409), (7.288069, -46.67902, 16.36927), (6.4213796, -46.67902, 16.728266), (5.5370893, -46.67902, 17.041409), (4.6376224, -46.67902, 17.307842), (3.7254443, -46.67902, 17.526838), (2.8030548, -46.67902, 17.697792), (1.8729825, -46.67902, 17.820238), (0.93777645, -46.67902, 17.89384), (1.0971854e-15, -46.67902, 17.918398), (-0.93777645, -46.67902, 17.89384), (-1.8729825, -46.67902, 17.820238), (-2.8030548, -46.67902, 17.697792), (-3.7254443, -46.67902, 17.526838), (-4.6376224, -46.67902, 17.307842), (-5.5370893, -46.67902, 17.041409), (-6.4213796, -46.67902, 16.728266), (-7.288069, -46.67902, 16.36927), (-8.134782, -46.67902, 15.965409), (-8.959199, -46.67902, 15.517787), (-9.759059, -46.67902, 15.027633), (-10.532169, -46.67902, 14.496288), (-11.276413, -46.67902, 13.92521), (-11.989748, -46.67902, 13.315965), (-12.67022, -46.67902, 12.67022), (-13.315965, -46.67902, 11.989748), (-13.92521, -46.67902, 11.276413), (-14.496288, -46.67902, 10.532169), (-15.027633, -46.67902, 9.759059), (-15.517787, -46.67902, 8.959199), (-15.965409, -46.67902, 8.134782), (-16.36927, -46.67902, 7.288069), (-16.728266, -46.67902, 6.4213796), (-17.041409, -46.67902, 5.5370893), (-17.307842, -46.67902, 4.6376224), (-17.526838, -46.67902, 3.7254443), (-17.697792, -46.67902, 2.8030548), (-17.820238, -46.67902, 1.8729825), (-17.89384, -46.67902, 0.93777645), (-17.918398, -46.67902, 2.1943708e-15), (-17.89384, -46.67902, -0.93777645), (-17.820238, -46.67902, -1.8729825), (-17.697792, -46.67902, -2.8030548), (-17.526838, -46.67902, -3.7254443), (-17.307842, -46.67902, -4.6376224), (-17.041409, -46.67902, -5.5370893), (-16.728266, -46.67902, -6.4213796), (-16.36927, -46.67902, -7.288069), (-15.965409, -46.67902, -8.134782), (-15.517787, -46.67902, -8.959199), (-15.027633, -46.67902, -9.759059), (-14.496288, -46.67902, -10.532169), (-13.92521, -46.67902, -11.276413), (-13.315965, -46.67902, -11.989748), (-12.67022, -46.67902, -12.67022), (-11.989748, -46.67902, -13.315965), (-11.276413, -46.67902, -13.92521), (-10.532169, -46.67902, -14.496288), (-9.759059, -46.67902, -15.027633), (-8.959199, -46.67902, -15.517787), (-8.134782, -46.67902, -15.965409), (-7.288069, -46.67902, -16.36927), (-6.4213796, -46.67902, -16.728266), (-5.5370893, -46.67902, -17.041409), (-4.6376224, -46.67902, -17.307842), (-3.7254443, -46.67902, -17.526838), (-2.8030548, -46.67902, -17.697792), (-1.8729825, -46.67902, -17.820238), (-0.93777645, -46.67902, -17.89384), (-3.2915563e-15, -46.67902, -17.918398), (0.93777645, -46.67902, -17.89384), (1.8729825, -46.67902, -17.820238), (2.8030548, -46.67902, -17.697792), (3.7254443, -46.67902, -17.526838), (4.6376224, -46.67902, -17.307842), (5.5370893, -46.67902, -17.041409), (6.4213796, -46.67902, -16.728266), (7.288069, -46.67902, -16.36927), (8.134782, -46.67902, -15.965409), (8.959199, -46.67902, -15.517787), (9.759059, -46.67902, -15.027633), (10.532169, -46.67902, -14.496288), (11.276413, -46.67902, -13.92521), (11.989748, -46.67902, -13.315965), (12.67022, -46.67902, -12.67022), (13.315965, -46.67902, -11.989748), (13.92521, -46.67902, -11.276413), (14.496288, -46.67902, -10.532169), (15.027633, -46.67902, -9.759059), (15.517787, -46.67902, -8.959199), (15.965409, -46.67902, -8.134782), (16.36927, -46.67902, -7.288069), (16.728266, -46.67902, -6.4213796), (17.041409, -46.67902, -5.5370893), (17.307842, -46.67902, -4.6376224), (17.526838, -46.67902, -3.7254443), (17.697792, -46.67902, -2.8030548), (17.820238, -46.67902, -1.8729825), (17.89384, -46.67902, -0.93777645), (20.336832, -45.677273, 0), (20.308962, -45.677273, 1.0643475), (20.225426, -45.677273, 2.1257777), (20.086452, -45.677273, 3.1813815), (19.892424, -45.677273, 4.2282653), (19.643871, -45.677273, 5.2635593), (19.341476, -45.677273, 6.2844267), (18.986069, -45.677273, 7.288069), (18.57862, -45.677273, 8.271735), (18.12025, -45.677273, 9.232729), (17.612213, -45.677273, 10.168416), (17.055902, -45.677273, 11.076233), (16.452843, -45.677273, 11.95369), (15.804687, -45.677273, 12.798383), (15.113212, -45.677273, 13.607997), (14.380312, -45.677273, 14.380312), (13.607997, -45.677273, 15.113212), (12.798383, -45.677273, 15.804687), (11.95369, -45.677273, 16.452843), (11.076233, -45.677273, 17.055902), (10.168416, -45.677273, 17.612213), (9.232729, -45.677273, 18.12025), (8.271735, -45.677273, 18.57862), (7.288069, -45.677273, 18.986069), (6.2844267, -45.677273, 19.341476), (5.2635593, -45.677273, 19.643871), (4.2282653, -45.677273, 19.892424), (3.1813815, -45.677273, 20.086452), (2.1257777, -45.677273, 20.225426), (1.0643475, -45.677273, 20.308962), (1.2452718e-15, -45.677273, 20.336832), (-1.0643475, -45.677273, 20.308962), (-2.1257777, -45.677273, 20.225426), (-3.1813815, -45.677273, 20.086452), (-4.2282653, -45.677273, 19.892424), (-5.2635593, -45.677273, 19.643871), (-6.2844267, -45.677273, 19.341476), (-7.288069, -45.677273, 18.986069), (-8.271735, -45.677273, 18.57862), (-9.232729, -45.677273, 18.12025), (-10.168416, -45.677273, 17.612213), (-11.076233, -45.677273, 17.055902), (-11.95369, -45.677273, 16.452843), (-12.798383, -45.677273, 15.804687), (-13.607997, -45.677273, 15.113212), (-14.380312, -45.677273, 14.380312), (-15.113212, -45.677273, 13.607997), (-15.804687, -45.677273, 12.798383), (-16.452843, -45.677273, 11.95369), (-17.055902, -45.677273, 11.076233), (-17.612213, -45.677273, 10.168416), (-18.12025, -45.677273, 9.232729), (-18.57862, -45.677273, 8.271735), (-18.986069, -45.677273, 7.288069), (-19.341476, -45.677273, 6.2844267), (-19.643871, -45.677273, 5.2635593), (-19.892424, -45.677273, 4.2282653), (-20.086452, -45.677273, 3.1813815), (-20.225426, -45.677273, 2.1257777), (-20.308962, -45.677273, 1.0643475), (-20.336832, -45.677273, 2.4905437e-15), (-20.308962, -45.677273, -1.0643475), (-20.225426, -45.677273, -2.1257777), (-20.086452, -45.677273, -3.1813815), (-19.892424, -45.677273, -4.2282653), (-19.643871, -45.677273, -5.2635593), (-19.341476, -45.677273, -6.2844267), (-18.986069, -45.677273, -7.288069), (-18.57862, -45.677273, -8.271735), (-18.12025, -45.677273, -9.232729), (-17.612213, -45.677273, -10.168416), (-17.055902, -45.677273, -11.076233), (-16.452843, -45.677273, -11.95369), (-15.804687, -45.677273, -12.798383), (-15.113212, -45.677273, -13.607997), (-14.380312, -45.677273, -14.380312), (-13.607997, -45.677273, -15.113212), (-12.798383, -45.677273, -15.804687), (-11.95369, -45.677273, -16.452843), (-11.076233, -45.677273, -17.055902), (-10.168416, -45.677273, -17.612213), (-9.232729, -45.677273, -18.12025), (-8.271735, -45.677273, -18.57862), (-7.288069, -45.677273, -18.986069), (-6.2844267, -45.677273, -19.341476), (-5.2635593, -45.677273, -19.643871), (-4.2282653, -45.677273, -19.892424), (-3.1813815, -45.677273, -20.086452), (-2.1257777, -45.677273, -20.225426), (-1.0643475, -45.677273, -20.308962), (-3.7358155e-15, -45.677273, -20.336832), (1.0643475, -45.677273, -20.308962), (2.1257777, -45.677273, -20.225426), (3.1813815, -45.677273, -20.086452), (4.2282653, -45.677273, -19.892424), (5.2635593, -45.677273, -19.643871), (6.2844267, -45.677273, -19.341476), (7.288069, -45.677273, -18.986069), (8.271735, -45.677273, -18.57862), (9.232729, -45.677273, -18.12025), (10.168416, -45.677273, -17.612213), (11.076233, -45.677273, -17.055902), (11.95369, -45.677273, -16.452843), (12.798383, -45.677273, -15.804687), (13.607997, -45.677273, -15.113212), (14.380312, -45.677273, -14.380312), (15.113212, -45.677273, -13.607997), (15.804687, -45.677273, -12.798383), (16.452843, -45.677273, -11.95369), (17.055902, -45.677273, -11.076233), (17.612213, -45.677273, -10.168416), (18.12025, -45.677273, -9.232729), (18.57862, -45.677273, -8.271735), (18.986069, -45.677273, -7.288069), (19.341476, -45.677273, -6.2844267), (19.643871, -45.677273, -5.2635593), (19.892424, -45.677273, -4.2282653), (20.086452, -45.677273, -3.1813815), (20.225426, -45.677273, -2.1257777), (20.308962, -45.677273, -1.0643475), (22.699526, -44.550327, 0), (22.668417, -44.550327, 1.1880014), (22.575174, -44.550327, 2.3727465), (22.420055, -44.550327, 3.550988), (22.203485, -44.550327, 4.7194967), (21.926058, -44.550327, 5.8750696), (21.588531, -44.550327, 7.014539), (21.191832, -44.550327, 8.134782), (20.737047, -44.550327, 9.232729), (20.225426, -44.550327, 10.305368), (19.658365, -44.550327, 11.349763), (19.037424, -44.550327, 12.363048), (18.364302, -44.550327, 13.342446), (17.640844, -44.550327, 14.285274), (16.869034, -44.550327, 15.188947), (16.050987, -44.550327, 16.050987), (15.188947, -44.550327, 16.869034), (14.285274, -44.550327, 17.640844), (13.342446, -44.550327, 18.364302), (12.363048, -44.550327, 19.037424), (11.349763, -44.550327, 19.658365), (10.305368, -44.550327, 20.225426), (9.232729, -44.550327, 20.737047), (8.134782, -44.550327, 21.191832), (7.014539, -44.550327, 21.588531), (5.8750696, -44.550327, 21.926058), (4.7194967, -44.550327, 22.203485), (3.550988, -44.550327, 22.420055), (2.3727465, -44.550327, 22.575174), (1.1880014, -44.550327, 22.668417), (1.3899451e-15, -44.550327, 22.699526), (-1.1880014, -44.550327, 22.668417), (-2.3727465, -44.550327, 22.575174), (-3.550988, -44.550327, 22.420055), (-4.7194967, -44.550327, 22.203485), (-5.8750696, -44.550327, 21.926058), (-7.014539, -44.550327, 21.588531), (-8.134782, -44.550327, 21.191832), (-9.232729, -44.550327, 20.737047), (-10.305368, -44.550327, 20.225426), (-11.349763, -44.550327, 19.658365), (-12.363048, -44.550327, 19.037424), (-13.342446, -44.550327, 18.364302), (-14.285274, -44.550327, 17.640844), (-15.188947, -44.550327, 16.869034), (-16.050987, -44.550327, 16.050987), (-16.869034, -44.550327, 15.188947), (-17.640844, -44.550327, 14.285274), (-18.364302, -44.550327, 13.342446), (-19.037424, -44.550327, 12.363048), (-19.658365, -44.550327, 11.349763), (-20.225426, -44.550327, 10.305368), (-20.737047, -44.550327, 9.232729), (-21.191832, -44.550327, 8.134782), (-21.588531, -44.550327, 7.014539), (-21.926058, -44.550327, 5.8750696), (-22.203485, -44.550327, 4.7194967), (-22.420055, -44.550327, 3.550988), (-22.575174, -44.550327, 2.3727465), (-22.668417, -44.550327, 1.1880014), (-22.699526, -44.550327, 2.7798901e-15), (-22.668417, -44.550327, -1.1880014), (-22.575174, -44.550327, -2.3727465), (-22.420055, -44.550327, -3.550988), (-22.203485, -44.550327, -4.7194967), (-21.926058, -44.550327, -5.8750696), (-21.588531, -44.550327, -7.014539), (-21.191832, -44.550327, -8.134782), (-20.737047, -44.550327, -9.232729), (-20.225426, -44.550327, -10.305368), (-19.658365, -44.550327, -11.349763), (-19.037424, -44.550327, -12.363048), (-18.364302, -44.550327, -13.342446), (-17.640844, -44.550327, -14.285274), (-16.869034, -44.550327, -15.188947), (-16.050987, -44.550327, -16.050987), (-15.188947, -44.550327, -16.869034), (-14.285274, -44.550327, -17.640844), (-13.342446, -44.550327, -18.364302), (-12.363048, -44.550327, -19.037424), (-11.349763, -44.550327, -19.658365), (-10.305368, -44.550327, -20.225426), (-9.232729, -44.550327, -20.737047), (-8.134782, -44.550327, -21.191832), (-7.014539, -44.550327, -21.588531), (-5.8750696, -44.550327, -21.926058), (-4.7194967, -44.550327, -22.203485), (-3.550988, -44.550327, -22.420055), (-2.3727465, -44.550327, -22.575174), (-1.1880014, -44.550327, -22.668417), (-4.169835e-15, -44.550327, -22.699526), (1.1880014, -44.550327, -22.668417), (2.3727465, -44.550327, -22.575174), (3.550988, -44.550327, -22.420055), (4.7194967, -44.550327, -22.203485), (5.8750696, -44.550327, -21.926058), (7.014539, -44.550327, -21.588531), (8.134782, -44.550327, -21.191832), (9.232729, -44.550327, -20.737047), (10.305368, -44.550327, -20.225426), (11.349763, -44.550327, -19.658365), (12.363048, -44.550327, -19.037424), (13.342446, -44.550327, -18.364302), (14.285274, -44.550327, -17.640844), (15.188947, -44.550327, -16.869034), (16.050987, -44.550327, -16.050987), (16.869034, -44.550327, -15.188947), (17.640844, -44.550327, -14.285274), (18.364302, -44.550327, -13.342446), (19.037424, -44.550327, -12.363048), (19.658365, -44.550327, -11.349763), (20.225426, -44.550327, -10.305368), (20.737047, -44.550327, -9.232729), (21.191832, -44.550327, -8.134782), (21.588531, -44.550327, -7.014539), (21.926058, -44.550327, -5.8750696), (22.203485, -44.550327, -4.7194967), (22.420055, -44.550327, -3.550988), (22.575174, -44.550327, -2.3727465), (22.668417, -44.550327, -1.1880014), (25, -43.30127, 0), (24.965738, -43.30127, 1.308399), (24.863047, -43.30127, 2.6132116), (24.69221, -43.30127, 3.9108617), (24.45369, -43.30127, 5.197792), (24.148146, -43.30127, 6.470476), (23.776413, -43.30127, 7.725425), (23.33951, -43.30127, 8.959199), (22.838636, -43.30127, 10.168416), (22.275164, -43.30127, 11.349763), (21.650635, -43.30127, 12.5), (20.966764, -43.30127, 13.615976), (20.225426, -43.30127, 14.694632), (19.42865, -43.30127, 15.733009), (18.57862, -43.30127, 16.728266), (17.67767, -43.30127, 17.67767), (16.728266, -43.30127, 18.57862), (15.733009, -43.30127, 19.42865), (14.694632, -43.30127, 20.225426), (13.615976, -43.30127, 20.966764), (12.5, -43.30127, 21.650635), (11.349763, -43.30127, 22.275164), (10.168416, -43.30127, 22.838636), (8.959199, -43.30127, 23.33951), (7.725425, -43.30127, 23.776413), (6.470476, -43.30127, 24.148146), (5.197792, -43.30127, 24.45369), (3.9108617, -43.30127, 24.69221), (2.6132116, -43.30127, 24.863047), (1.308399, -43.30127, 24.965738), (1.5308084e-15, -43.30127, 25), (-1.308399, -43.30127, 24.965738), (-2.6132116, -43.30127, 24.863047), (-3.9108617, -43.30127, 24.69221), (-5.197792, -43.30127, 24.45369), (-6.470476, -43.30127, 24.148146), (-7.725425, -43.30127, 23.776413), (-8.959199, -43.30127, 23.33951), (-10.168416, -43.30127, 22.838636), (-11.349763, -43.30127, 22.275164), (-12.5, -43.30127, 21.650635), (-13.615976, -43.30127, 20.966764), (-14.694632, -43.30127, 20.225426), (-15.733009, -43.30127, 19.42865), (-16.728266, -43.30127, 18.57862), (-17.67767, -43.30127, 17.67767), (-18.57862, -43.30127, 16.728266), (-19.42865, -43.30127, 15.733009), (-20.225426, -43.30127, 14.694632), (-20.966764, -43.30127, 13.615976), (-21.650635, -43.30127, 12.5), (-22.275164, -43.30127, 11.349763), (-22.838636, -43.30127, 10.168416), (-23.33951, -43.30127, 8.959199), (-23.776413, -43.30127, 7.725425), (-24.148146, -43.30127, 6.470476), (-24.45369, -43.30127, 5.197792), (-24.69221, -43.30127, 3.9108617), (-24.863047, -43.30127, 2.6132116), (-24.965738, -43.30127, 1.308399), (-25, -43.30127, 3.0616169e-15), (-24.965738, -43.30127, -1.308399), (-24.863047, -43.30127, -2.6132116), (-24.69221, -43.30127, -3.9108617), (-24.45369, -43.30127, -5.197792), (-24.148146, -43.30127, -6.470476), (-23.776413, -43.30127, -7.725425), (-23.33951, -43.30127, -8.959199), (-22.838636, -43.30127, -10.168416), (-22.275164, -43.30127, -11.349763), (-21.650635, -43.30127, -12.5), (-20.966764, -43.30127, -13.615976), (-20.225426, -43.30127, -14.694632), (-19.42865, -43.30127, -15.733009), (-18.57862, -43.30127, -16.728266), (-17.67767, -43.30127, -17.67767), (-16.728266, -43.30127, -18.57862), (-15.733009, -43.30127, -19.42865), (-14.694632, -43.30127, -20.225426), (-13.615976, -43.30127, -20.966764), (-12.5, -43.30127, -21.650635), (-11.349763, -43.30127, -22.275164), (-10.168416, -43.30127, -22.838636), (-8.959199, -43.30127, -23.33951), (-7.725425, -43.30127, -23.776413), (-6.470476, -43.30127, -24.148146), (-5.197792, -43.30127, -24.45369), (-3.9108617, -43.30127, -24.69221), (-2.6132116, -43.30127, -24.863047), (-1.308399, -43.30127, -24.965738), (-4.5924254e-15, -43.30127, -25), (1.308399, -43.30127, -24.965738), (2.6132116, -43.30127, -24.863047), (3.9108617, -43.30127, -24.69221), (5.197792, -43.30127, -24.45369), (6.470476, -43.30127, -24.148146), (7.725425, -43.30127, -23.776413), (8.959199, -43.30127, -23.33951), (10.168416, -43.30127, -22.838636), (11.349763, -43.30127, -22.275164), (12.5, -43.30127, -21.650635), (13.615976, -43.30127, -20.966764), (14.694632, -43.30127, -20.225426), (15.733009, -43.30127, -19.42865), (16.728266, -43.30127, -18.57862), (17.67767, -43.30127, -17.67767), (18.57862, -43.30127, -16.728266), (19.42865, -43.30127, -15.733009), (20.225426, -43.30127, -14.694632), (20.966764, -43.30127, -13.615976), (21.650635, -43.30127, -12.5), (22.275164, -43.30127, -11.349763), (22.838636, -43.30127, -10.168416), (23.33951, -43.30127, -8.959199), (23.776413, -43.30127, -7.725425), (24.148146, -43.30127, -6.470476), (24.45369, -43.30127, -5.197792), (24.69221, -43.30127, -3.9108617), (24.863047, -43.30127, -2.6132116), (24.965738, -43.30127, -1.308399), (27.231953, -41.93353, 0), (27.194632, -41.93353, 1.4252102), (27.082773, -41.93353, 2.846514), (26.89668, -41.93353, 4.260016), (26.636868, -41.93353, 5.661841), (26.304045, -41.93353, 7.0481477), (25.899126, -41.93353, 8.415136), (25.423218, -41.93353, 9.759059), (24.877626, -41.93353, 11.076233), (24.263847, -41.93353, 12.363048), (23.583563, -41.93353, 13.615976), (22.838636, -41.93353, 14.831584), (22.031113, -41.93353, 16.00654), (21.1632, -41.93353, 17.137623), (20.237284, -41.93353, 18.221733), (19.255898, -41.93353, 19.255898), (18.221733, -41.93353, 20.237284), (17.137623, -41.93353, 21.1632), (16.00654, -41.93353, 22.031113), (14.831584, -41.93353, 22.838636), (13.615976, -41.93353, 23.583563), (12.363048, -41.93353, 24.263847), (11.076233, -41.93353, 24.877626), (9.759059, -41.93353, 25.423218), (8.415136, -41.93353, 25.899126), (7.0481477, -41.93353, 26.304045), (5.661841, -41.93353, 26.636868), (4.260016, -41.93353, 26.89668), (2.846514, -41.93353, 27.082773), (1.4252102, -41.93353, 27.194632), (1.6674762e-15, -41.93353, 27.231953), (-1.4252102, -41.93353, 27.194632), (-2.846514, -41.93353, 27.082773), (-4.260016, -41.93353, 26.89668), (-5.661841, -41.93353, 26.636868), (-7.0481477, -41.93353, 26.304045), (-8.415136, -41.93353, 25.899126), (-9.759059, -41.93353, 25.423218), (-11.076233, -41.93353, 24.877626), (-12.363048, -41.93353, 24.263847), (-13.615976, -41.93353, 23.583563), (-14.831584, -41.93353, 22.838636), (-16.00654, -41.93353, 22.031113), (-17.137623, -41.93353, 21.1632), (-18.221733, -41.93353, 20.237284), (-19.255898, -41.93353, 19.255898), (-20.237284, -41.93353, 18.221733), (-21.1632, -41.93353, 17.137623), (-22.031113, -41.93353, 16.00654), (-22.838636, -41.93353, 14.831584), (-23.583563, -41.93353, 13.615976), (-24.263847, -41.93353, 12.363048), (-24.877626, -41.93353, 11.076233), (-25.423218, -41.93353, 9.759059), (-25.899126, -41.93353, 8.415136), (-26.304045, -41.93353, 7.0481477), (-26.636868, -41.93353, 5.661841), (-26.89668, -41.93353, 4.260016), (-27.082773, -41.93353, 2.846514), (-27.194632, -41.93353, 1.4252102), (-27.231953, -41.93353, 3.3349523e-15), (-27.194632, -41.93353, -1.4252102), (-27.082773, -41.93353, -2.846514), (-26.89668, -41.93353, -4.260016), (-26.636868, -41.93353, -5.661841), (-26.304045, -41.93353, -7.0481477), (-25.899126, -41.93353, -8.415136), (-25.423218, -41.93353, -9.759059), (-24.877626, -41.93353, -11.076233), (-24.263847, -41.93353, -12.363048), (-23.583563, -41.93353, -13.615976), (-22.838636, -41.93353, -14.831584), (-22.031113, -41.93353, -16.00654), (-21.1632, -41.93353, -17.137623), (-20.237284, -41.93353, -18.221733), (-19.255898, -41.93353, -19.255898), (-18.221733, -41.93353, -20.237284), (-17.137623, -41.93353, -21.1632), (-16.00654, -41.93353, -22.031113), (-14.831584, -41.93353, -22.838636), (-13.615976, -41.93353, -23.583563), (-12.363048, -41.93353, -24.263847), (-11.076233, -41.93353, -24.877626), (-9.759059, -41.93353, -25.423218), (-8.415136, -41.93353, -25.899126), (-7.0481477, -41.93353, -26.304045), (-5.661841, -41.93353, -26.636868), (-4.260016, -41.93353, -26.89668), (-2.846514, -41.93353, -27.082773), (-1.4252102, -41.93353, -27.194632), (-5.0024284e-15, -41.93353, -27.231953), (1.4252102, -41.93353, -27.194632), (2.846514, -41.93353, -27.082773), (4.260016, -41.93353, -26.89668), (5.661841, -41.93353, -26.636868), (7.0481477, -41.93353, -26.304045), (8.415136, -41.93353, -25.899126), (9.759059, -41.93353, -25.423218), (11.076233, -41.93353, -24.877626), (12.363048, -41.93353, -24.263847), (13.615976, -41.93353, -23.583563), (14.831584, -41.93353, -22.838636), (16.00654, -41.93353, -22.031113), (17.137623, -41.93353, -21.1632), (18.221733, -41.93353, -20.237284), (19.255898, -41.93353, -19.255898), (20.237284, -41.93353, -18.221733), (21.1632, -41.93353, -17.137623), (22.031113, -41.93353, -16.00654), (22.838636, -41.93353, -14.831584), (23.583563, -41.93353, -13.615976), (24.263847, -41.93353, -12.363048), (24.877626, -41.93353, -11.076233), (25.423218, -41.93353, -9.759059), (25.899126, -41.93353, -8.415136), (26.304045, -41.93353, -7.0481477), (26.636868, -41.93353, -5.661841), (26.89668, -41.93353, -4.260016), (27.082773, -41.93353, -2.846514), (27.194632, -41.93353, -1.4252102), (29.389263, -40.45085, 0), (29.348986, -40.45085, 1.5381151), (29.228266, -40.45085, 3.0720146), (29.027431, -40.45085, 4.5974936), (28.747036, -40.45085, 6.110371), (28.387848, -40.45085, 7.606501), (27.95085, -40.45085, 9.081781), (27.43724, -40.45085, 10.532169), (26.848427, -40.45085, 11.95369), (26.186026, -40.45085, 13.342446), (25.451847, -40.45085, 14.694632), (24.64791, -40.45085, 16.00654), (23.776413, -40.45085, 17.274574), (22.839746, -40.45085, 18.495262), (21.840479, -40.45085, 19.665255), (20.781347, -40.45085, 20.781347), (19.665255, -40.45085, 21.840479), (18.495262, -40.45085, 22.839746), (17.274574, -40.45085, 23.776413), (16.00654, -40.45085, 24.64791), (14.694632, -40.45085, 25.451847), (13.342446, -40.45085, 26.186026), (11.95369, -40.45085, 26.848427), (10.532169, -40.45085, 27.43724), (9.081781, -40.45085, 27.95085), (7.606501, -40.45085, 28.387848), (6.110371, -40.45085, 28.747036), (4.5974936, -40.45085, 29.027431), (3.0720146, -40.45085, 29.228266), (1.5381151, -40.45085, 29.348986), (1.7995734e-15, -40.45085, 29.389263), (-1.5381151, -40.45085, 29.348986), (-3.0720146, -40.45085, 29.228266), (-4.5974936, -40.45085, 29.027431), (-6.110371, -40.45085, 28.747036), (-7.606501, -40.45085, 28.387848), (-9.081781, -40.45085, 27.95085), (-10.532169, -40.45085, 27.43724), (-11.95369, -40.45085, 26.848427), (-13.342446, -40.45085, 26.186026), (-14.694632, -40.45085, 25.451847), (-16.00654, -40.45085, 24.64791), (-17.274574, -40.45085, 23.776413), (-18.495262, -40.45085, 22.839746), (-19.665255, -40.45085, 21.840479), (-20.781347, -40.45085, 20.781347), (-21.840479, -40.45085, 19.665255), (-22.839746, -40.45085, 18.495262), (-23.776413, -40.45085, 17.274574), (-24.64791, -40.45085, 16.00654), (-25.451847, -40.45085, 14.694632), (-26.186026, -40.45085, 13.342446), (-26.848427, -40.45085, 11.95369), (-27.43724, -40.45085, 10.532169), (-27.95085, -40.45085, 9.081781), (-28.387848, -40.45085, 7.606501), (-28.747036, -40.45085, 6.110371), (-29.027431, -40.45085, 4.5974936), (-29.228266, -40.45085, 3.0720146), (-29.348986, -40.45085, 1.5381151), (-29.389263, -40.45085, 3.5991468e-15), (-29.348986, -40.45085, -1.5381151), (-29.228266, -40.45085, -3.0720146), (-29.027431, -40.45085, -4.5974936), (-28.747036, -40.45085, -6.110371), (-28.387848, -40.45085, -7.606501), (-27.95085, -40.45085, -9.081781), (-27.43724, -40.45085, -10.532169), (-26.848427, -40.45085, -11.95369), (-26.186026, -40.45085, -13.342446), (-25.451847, -40.45085, -14.694632), (-24.64791, -40.45085, -16.00654), (-23.776413, -40.45085, -17.274574), (-22.839746, -40.45085, -18.495262), (-21.840479, -40.45085, -19.665255), (-20.781347, -40.45085, -20.781347), (-19.665255, -40.45085, -21.840479), (-18.495262, -40.45085, -22.839746), (-17.274574, -40.45085, -23.776413), (-16.00654, -40.45085, -24.64791), (-14.694632, -40.45085, -25.451847), (-13.342446, -40.45085, -26.186026), (-11.95369, -40.45085, -26.848427), (-10.532169, -40.45085, -27.43724), (-9.081781, -40.45085, -27.95085), (-7.606501, -40.45085, -28.387848), (-6.110371, -40.45085, -28.747036), (-4.5974936, -40.45085, -29.027431), (-3.0720146, -40.45085, -29.228266), (-1.5381151, -40.45085, -29.348986), (-5.39872e-15, -40.45085, -29.389263), (1.5381151, -40.45085, -29.348986), (3.0720146, -40.45085, -29.228266), (4.5974936, -40.45085, -29.027431), (6.110371, -40.45085, -28.747036), (7.606501, -40.45085, -28.387848), (9.081781, -40.45085, -27.95085), (10.532169, -40.45085, -27.43724), (11.95369, -40.45085, -26.848427), (13.342446, -40.45085, -26.186026), (14.694632, -40.45085, -25.451847), (16.00654, -40.45085, -24.64791), (17.274574, -40.45085, -23.776413), (18.495262, -40.45085, -22.839746), (19.665255, -40.45085, -21.840479), (20.781347, -40.45085, -20.781347), (21.840479, -40.45085, -19.665255), (22.839746, -40.45085, -18.495262), (23.776413, -40.45085, -17.274574), (24.64791, -40.45085, -16.00654), (25.451847, -40.45085, -14.694632), (26.186026, -40.45085, -13.342446), (26.848427, -40.45085, -11.95369), (27.43724, -40.45085, -10.532169), (27.95085, -40.45085, -9.081781), (28.387848, -40.45085, -7.606501), (28.747036, -40.45085, -6.110371), (29.027431, -40.45085, -4.5974936), (29.228266, -40.45085, -3.0720146), (29.348986, -40.45085, -1.5381151), (31.466019, -38.8573, 0), (31.422897, -38.8573, 1.6468042), (31.293646, -38.8573, 3.2890947), (31.07862, -38.8573, 4.92237), (30.778412, -38.8573, 6.5421534), (30.39384, -38.8573, 8.144005), (29.925962, -38.8573, 9.723535), (29.37606, -38.8573, 11.276413), (28.74564, -38.8573, 12.798383), (28.036428, -38.8573, 14.285274), (27.250372, -38.8573, 15.733009), (26.389624, -38.8573, 17.137623), (25.456545, -38.8573, 18.495262), (24.45369, -38.8573, 19.802208), (23.38381, -38.8573, 21.054876), (22.249836, -38.8573, 22.249836), (21.054876, -38.8573, 23.38381), (19.802208, -38.8573, 24.45369), (18.495262, -38.8573, 25.456545), (17.137623, -38.8573, 26.389624), (15.733009, -38.8573, 27.250372), (14.285274, -38.8573, 28.036428), (12.798383, -38.8573, 28.74564), (11.276413, -38.8573, 29.37606), (9.723535, -38.8573, 29.925962), (8.144005, -38.8573, 30.39384), (6.5421534, -38.8573, 30.778412), (4.92237, -38.8573, 31.07862), (3.2890947, -38.8573, 31.293646), (1.6468042, -38.8573, 31.422897), (1.926738e-15, -38.8573, 31.466019), (-1.6468042, -38.8573, 31.422897), (-3.2890947, -38.8573, 31.293646), (-4.92237, -38.8573, 31.07862), (-6.5421534, -38.8573, 30.778412), (-8.144005, -38.8573, 30.39384), (-9.723535, -38.8573, 29.925962), (-11.276413, -38.8573, 29.37606), (-12.798383, -38.8573, 28.74564), (-14.285274, -38.8573, 28.036428), (-15.733009, -38.8573, 27.250372), (-17.137623, -38.8573, 26.389624), (-18.495262, -38.8573, 25.456545), (-19.802208, -38.8573, 24.45369), (-21.054876, -38.8573, 23.38381), (-22.249836, -38.8573, 22.249836), (-23.38381, -38.8573, 21.054876), (-24.45369, -38.8573, 19.802208), (-25.456545, -38.8573, 18.495262), (-26.389624, -38.8573, 17.137623), (-27.250372, -38.8573, 15.733009), (-28.036428, -38.8573, 14.285274), (-28.74564, -38.8573, 12.798383), (-29.37606, -38.8573, 11.276413), (-29.925962, -38.8573, 9.723535), (-30.39384, -38.8573, 8.144005), (-30.778412, -38.8573, 6.5421534), (-31.07862, -38.8573, 4.92237), (-31.293646, -38.8573, 3.2890947), (-31.422897, -38.8573, 1.6468042), (-31.466019, -38.8573, 3.853476e-15), (-31.422897, -38.8573, -1.6468042), (-31.293646, -38.8573, -3.2890947), (-31.07862, -38.8573, -4.92237), (-30.778412, -38.8573, -6.5421534), (-30.39384, -38.8573, -8.144005), (-29.925962, -38.8573, -9.723535), (-29.37606, -38.8573, -11.276413), (-28.74564, -38.8573, -12.798383), (-28.036428, -38.8573, -14.285274), (-27.250372, -38.8573, -15.733009), (-26.389624, -38.8573, -17.137623), (-25.456545, -38.8573, -18.495262), (-24.45369, -38.8573, -19.802208), (-23.38381, -38.8573, -21.054876), (-22.249836, -38.8573, -22.249836), (-21.054876, -38.8573, -23.38381), (-19.802208, -38.8573, -24.45369), (-18.495262, -38.8573, -25.456545), (-17.137623, -38.8573, -26.389624), (-15.733009, -38.8573, -27.250372), (-14.285274, -38.8573, -28.036428), (-12.798383, -38.8573, -28.74564), (-11.276413, -38.8573, -29.37606), (-9.723535, -38.8573, -29.925962), (-8.144005, -38.8573, -30.39384), (-6.5421534, -38.8573, -30.778412), (-4.92237, -38.8573, -31.07862), (-3.2890947, -38.8573, -31.293646), (-1.6468042, -38.8573, -31.422897), (-5.780214e-15, -38.8573, -31.466019), (1.6468042, -38.8573, -31.422897), (3.2890947, -38.8573, -31.293646), (4.92237, -38.8573, -31.07862), (6.5421534, -38.8573, -30.778412), (8.144005, -38.8573, -30.39384), (9.723535, -38.8573, -29.925962), (11.276413, -38.8573, -29.37606), (12.798383, -38.8573, -28.74564), (14.285274, -38.8573, -28.036428), (15.733009, -38.8573, -27.250372), (17.137623, -38.8573, -26.389624), (18.495262, -38.8573, -25.456545), (19.802208, -38.8573, -24.45369), (21.054876, -38.8573, -23.38381), (22.249836, -38.8573, -22.249836), (23.38381, -38.8573, -21.054876), (24.45369, -38.8573, -19.802208), (25.456545, -38.8573, -18.495262), (26.389624, -38.8573, -17.137623), (27.250372, -38.8573, -15.733009), (28.036428, -38.8573, -14.285274), (28.74564, -38.8573, -12.798383), (29.37606, -38.8573, -11.276413), (29.925962, -38.8573, -9.723535), (30.39384, -38.8573, -8.144005), (30.778412, -38.8573, -6.5421534), (31.07862, -38.8573, -4.92237), (31.293646, -38.8573, -3.2890947), (31.422897, -38.8573, -1.6468042), (33.45653, -37.15724, 0), (33.41068, -37.15724, 1.7509795), (33.27325, -37.15724, 3.4971597), (33.044624, -37.15724, 5.2337546), (32.725426, -37.15724, 6.9560037), (32.31653, -37.15724, 8.659187), (31.819052, -37.15724, 10.338636), (31.234362, -37.15724, 11.989748), (30.564062, -37.15724, 13.607997), (29.809986, -37.15724, 15.188947), (28.974205, -37.15724, 16.728266), (28.059008, -37.15724, 18.221733), (27.066902, -37.15724, 19.665255), (26.000607, -37.15724, 21.054876), (24.863047, -37.15724, 22.38679), (23.65734, -37.15724, 23.65734), (22.38679, -37.15724, 24.863047), (21.054876, -37.15724, 26.000607), (19.665255, -37.15724, 27.066902), (18.221733, -37.15724, 28.059008), (16.728266, -37.15724, 28.974205), (15.188947, -37.15724, 29.809986), (13.607997, -37.15724, 30.564062), (11.989748, -37.15724, 31.234362), (10.338636, -37.15724, 31.819052), (8.659187, -37.15724, 32.31653), (6.9560037, -37.15724, 32.725426), (5.2337546, -37.15724, 33.044624), (3.4971597, -37.15724, 33.27325), (1.7509795, -37.15724, 33.41068), (2.0486216e-15, -37.15724, 33.45653), (-1.7509795, -37.15724, 33.41068), (-3.4971597, -37.15724, 33.27325), (-5.2337546, -37.15724, 33.044624), (-6.9560037, -37.15724, 32.725426), (-8.659187, -37.15724, 32.31653), (-10.338636, -37.15724, 31.819052), (-11.989748, -37.15724, 31.234362), (-13.607997, -37.15724, 30.564062), (-15.188947, -37.15724, 29.809986), (-16.728266, -37.15724, 28.974205), (-18.221733, -37.15724, 28.059008), (-19.665255, -37.15724, 27.066902), (-21.054876, -37.15724, 26.000607), (-22.38679, -37.15724, 24.863047), (-23.65734, -37.15724, 23.65734), (-24.863047, -37.15724, 22.38679), (-26.000607, -37.15724, 21.054876), (-27.066902, -37.15724, 19.665255), (-28.059008, -37.15724, 18.221733), (-28.974205, -37.15724, 16.728266), (-29.809986, -37.15724, 15.188947), (-30.564062, -37.15724, 13.607997), (-31.234362, -37.15724, 11.989748), (-31.819052, -37.15724, 10.338636), (-32.31653, -37.15724, 8.659187), (-32.725426, -37.15724, 6.9560037), (-33.044624, -37.15724, 5.2337546), (-33.27325, -37.15724, 3.4971597), (-33.41068, -37.15724, 1.7509795), (-33.45653, -37.15724, 4.097243e-15), (-33.41068, -37.15724, -1.7509795), (-33.27325, -37.15724, -3.4971597), (-33.044624, -37.15724, -5.2337546), (-32.725426, -37.15724, -6.9560037), (-32.31653, -37.15724, -8.659187), (-31.819052, -37.15724, -10.338636), (-31.234362, -37.15724, -11.989748), (-30.564062, -37.15724, -13.607997), (-29.809986, -37.15724, -15.188947), (-28.974205, -37.15724, -16.728266), (-28.059008, -37.15724, -18.221733), (-27.066902, -37.15724, -19.665255), (-26.000607, -37.15724, -21.054876), (-24.863047, -37.15724, -22.38679), (-23.65734, -37.15724, -23.65734), (-22.38679, -37.15724, -24.863047), (-21.054876, -37.15724, -26.000607), (-19.665255, -37.15724, -27.066902), (-18.221733, -37.15724, -28.059008), (-16.728266, -37.15724, -28.974205), (-15.188947, -37.15724, -29.809986), (-13.607997, -37.15724, -30.564062), (-11.989748, -37.15724, -31.234362), (-10.338636, -37.15724, -31.819052), (-8.659187, -37.15724, -32.31653), (-6.9560037, -37.15724, -32.725426), (-5.2337546, -37.15724, -33.044624), (-3.4971597, -37.15724, -33.27325), (-1.7509795, -37.15724, -33.41068), (-6.145865e-15, -37.15724, -33.45653), (1.7509795, -37.15724, -33.41068), (3.4971597, -37.15724, -33.27325), (5.2337546, -37.15724, -33.044624), (6.9560037, -37.15724, -32.725426), (8.659187, -37.15724, -32.31653), (10.338636, -37.15724, -31.819052), (11.989748, -37.15724, -31.234362), (13.607997, -37.15724, -30.564062), (15.188947, -37.15724, -29.809986), (16.728266, -37.15724, -28.974205), (18.221733, -37.15724, -28.059008), (19.665255, -37.15724, -27.066902), (21.054876, -37.15724, -26.000607), (22.38679, -37.15724, -24.863047), (23.65734, -37.15724, -23.65734), (24.863047, -37.15724, -22.38679), (26.000607, -37.15724, -21.054876), (27.066902, -37.15724, -19.665255), (28.059008, -37.15724, -18.221733), (28.974205, -37.15724, -16.728266), (29.809986, -37.15724, -15.188947), (30.564062, -37.15724, -13.607997), (31.234362, -37.15724, -11.989748), (31.819052, -37.15724, -10.338636), (32.31653, -37.15724, -8.659187), (32.725426, -37.15724, -6.9560037), (33.044624, -37.15724, -5.2337546), (33.27325, -37.15724, -3.4971597), (33.41068, -37.15724, -1.7509795), (35.35534, -35.35534, 0), (35.306885, -35.35534, 1.8503555), (35.16166, -35.35534, 3.6956394), (34.920055, -35.35534, 5.5307937), (34.58274, -35.35534, 7.350788), (34.150635, -35.35534, 9.150635), (33.624924, -35.35534, 10.925401), (33.007053, -35.35534, 12.67022), (32.29871, -35.35534, 14.380312), (31.501839, -35.35534, 16.050987), (30.618622, -35.35534, 17.67767), (29.651482, -35.35534, 19.255898), (28.60307, -35.35534, 20.781347), (27.47626, -35.35534, 22.249836), (26.274137, -35.35534, 23.65734), (25, -35.35534, 25), (23.65734, -35.35534, 26.274137), (22.249836, -35.35534, 27.47626), (20.781347, -35.35534, 28.60307), (19.255898, -35.35534, 29.651482), (17.67767, -35.35534, 30.618622), (16.050987, -35.35534, 31.501839), (14.380312, -35.35534, 32.29871), (12.67022, -35.35534, 33.007053), (10.925401, -35.35534, 33.624924), (9.150635, -35.35534, 34.150635), (7.350788, -35.35534, 34.58274), (5.5307937, -35.35534, 34.920055), (3.6956394, -35.35534, 35.16166), (1.8503555, -35.35534, 35.306885), (2.1648902e-15, -35.35534, 35.35534), (-1.8503555, -35.35534, 35.306885), (-3.6956394, -35.35534, 35.16166), (-5.5307937, -35.35534, 34.920055), (-7.350788, -35.35534, 34.58274), (-9.150635, -35.35534, 34.150635), (-10.925401, -35.35534, 33.624924), (-12.67022, -35.35534, 33.007053), (-14.380312, -35.35534, 32.29871), (-16.050987, -35.35534, 31.501839), (-17.67767, -35.35534, 30.618622), (-19.255898, -35.35534, 29.651482), (-20.781347, -35.35534, 28.60307), (-22.249836, -35.35534, 27.47626), (-23.65734, -35.35534, 26.274137), (-25, -35.35534, 25), (-26.274137, -35.35534, 23.65734), (-27.47626, -35.35534, 22.249836), (-28.60307, -35.35534, 20.781347), (-29.651482, -35.35534, 19.255898), (-30.618622, -35.35534, 17.67767), (-31.501839, -35.35534, 16.050987), (-32.29871, -35.35534, 14.380312), (-33.007053, -35.35534, 12.67022), (-33.624924, -35.35534, 10.925401), (-34.150635, -35.35534, 9.150635), (-34.58274, -35.35534, 7.350788), (-34.920055, -35.35534, 5.5307937), (-35.16166, -35.35534, 3.6956394), (-35.306885, -35.35534, 1.8503555), (-35.35534, -35.35534, 4.3297804e-15), (-35.306885, -35.35534, -1.8503555), (-35.16166, -35.35534, -3.6956394), (-34.920055, -35.35534, -5.5307937), (-34.58274, -35.35534, -7.350788), (-34.150635, -35.35534, -9.150635), (-33.624924, -35.35534, -10.925401), (-33.007053, -35.35534, -12.67022), (-32.29871, -35.35534, -14.380312), (-31.501839, -35.35534, -16.050987), (-30.618622, -35.35534, -17.67767), (-29.651482, -35.35534, -19.255898), (-28.60307, -35.35534, -20.781347), (-27.47626, -35.35534, -22.249836), (-26.274137, -35.35534, -23.65734), (-25, -35.35534, -25), (-23.65734, -35.35534, -26.274137), (-22.249836, -35.35534, -27.47626), (-20.781347, -35.35534, -28.60307), (-19.255898, -35.35534, -29.651482), (-17.67767, -35.35534, -30.618622), (-16.050987, -35.35534, -31.501839), (-14.380312, -35.35534, -32.29871), (-12.67022, -35.35534, -33.007053), (-10.925401, -35.35534, -33.624924), (-9.150635, -35.35534, -34.150635), (-7.350788, -35.35534, -34.58274), (-5.5307937, -35.35534, -34.920055), (-3.6956394, -35.35534, -35.16166), (-1.8503555, -35.35534, -35.306885), (-6.4946704e-15, -35.35534, -35.35534), (1.8503555, -35.35534, -35.306885), (3.6956394, -35.35534, -35.16166), (5.5307937, -35.35534, -34.920055), (7.350788, -35.35534, -34.58274), (9.150635, -35.35534, -34.150635), (10.925401, -35.35534, -33.624924), (12.67022, -35.35534, -33.007053), (14.380312, -35.35534, -32.29871), (16.050987, -35.35534, -31.501839), (17.67767, -35.35534, -30.618622), (19.255898, -35.35534, -29.651482), (20.781347, -35.35534, -28.60307), (22.249836, -35.35534, -27.47626), (23.65734, -35.35534, -26.274137), (25, -35.35534, -25), (26.274137, -35.35534, -23.65734), (27.47626, -35.35534, -22.249836), (28.60307, -35.35534, -20.781347), (29.651482, -35.35534, -19.255898), (30.618622, -35.35534, -17.67767), (31.501839, -35.35534, -16.050987), (32.29871, -35.35534, -14.380312), (33.007053, -35.35534, -12.67022), (33.624924, -35.35534, -10.925401), (34.150635, -35.35534, -9.150635), (34.58274, -35.35534, -7.350788), (34.920055, -35.35534, -5.5307937), (35.16166, -35.35534, -3.6956394), (35.306885, -35.35534, -1.8503555), (37.15724, -33.45653, 0), (37.10632, -33.45653, 1.9446597), (36.95369, -33.45653, 3.8839893), (36.699776, -33.45653, 5.812673), (36.34527, -33.45653, 7.725425), (35.89114, -33.45653, 9.617002), (35.33864, -33.45653, 11.482219), (34.689274, -33.45653, 13.315965), (33.944828, -33.45653, 15.113212), (33.107346, -33.45653, 16.869034), (32.179115, -33.45653, 18.57862), (31.162685, -33.45653, 20.237284), (30.06084, -33.45653, 21.840479), (28.8766, -33.45653, 23.38381), (27.61321, -33.45653, 24.863047), (26.274137, -33.45653, 26.274137), (24.863047, -33.45653, 27.61321), (23.38381, -33.45653, 28.8766), (21.840479, -33.45653, 30.06084), (20.237284, -33.45653, 31.162685), (18.57862, -33.45653, 32.179115), (16.869034, -33.45653, 33.107346), (15.113212, -33.45653, 33.944828), (13.315965, -33.45653, 34.689274), (11.482219, -33.45653, 35.33864), (9.617002, -33.45653, 35.89114), (7.725425, -33.45653, 36.34527), (5.812673, -33.45653, 36.699776), (3.8839893, -33.45653, 36.95369), (1.9446597, -33.45653, 37.10632), (2.2752247e-15, -33.45653, 37.15724), (-1.9446597, -33.45653, 37.10632), (-3.8839893, -33.45653, 36.95369), (-5.812673, -33.45653, 36.699776), (-7.725425, -33.45653, 36.34527), (-9.617002, -33.45653, 35.89114), (-11.482219, -33.45653, 35.33864), (-13.315965, -33.45653, 34.689274), (-15.113212, -33.45653, 33.944828), (-16.869034, -33.45653, 33.107346), (-18.57862, -33.45653, 32.179115), (-20.237284, -33.45653, 31.162685), (-21.840479, -33.45653, 30.06084), (-23.38381, -33.45653, 28.8766), (-24.863047, -33.45653, 27.61321), (-26.274137, -33.45653, 26.274137), (-27.61321, -33.45653, 24.863047), (-28.8766, -33.45653, 23.38381), (-30.06084, -33.45653, 21.840479), (-31.162685, -33.45653, 20.237284), (-32.179115, -33.45653, 18.57862), (-33.107346, -33.45653, 16.869034), (-33.944828, -33.45653, 15.113212), (-34.689274, -33.45653, 13.315965), (-35.33864, -33.45653, 11.482219), (-35.89114, -33.45653, 9.617002), (-36.34527, -33.45653, 7.725425), (-36.699776, -33.45653, 5.812673), (-36.95369, -33.45653, 3.8839893), (-37.10632, -33.45653, 1.9446597), (-37.15724, -33.45653, 4.5504495e-15), (-37.10632, -33.45653, -1.9446597), (-36.95369, -33.45653, -3.8839893), (-36.699776, -33.45653, -5.812673), (-36.34527, -33.45653, -7.725425), (-35.89114, -33.45653, -9.617002), (-35.33864, -33.45653, -11.482219), (-34.689274, -33.45653, -13.315965), (-33.944828, -33.45653, -15.113212), (-33.107346, -33.45653, -16.869034), (-32.179115, -33.45653, -18.57862), (-31.162685, -33.45653, -20.237284), (-30.06084, -33.45653, -21.840479), (-28.8766, -33.45653, -23.38381), (-27.61321, -33.45653, -24.863047), (-26.274137, -33.45653, -26.274137), (-24.863047, -33.45653, -27.61321), (-23.38381, -33.45653, -28.8766), (-21.840479, -33.45653, -30.06084), (-20.237284, -33.45653, -31.162685), (-18.57862, -33.45653, -32.179115), (-16.869034, -33.45653, -33.107346), (-15.113212, -33.45653, -33.944828), (-13.315965, -33.45653, -34.689274), (-11.482219, -33.45653, -35.33864), (-9.617002, -33.45653, -35.89114), (-7.725425, -33.45653, -36.34527), (-5.812673, -33.45653, -36.699776), (-3.8839893, -33.45653, -36.95369), (-1.9446597, -33.45653, -37.10632), (-6.8256744e-15, -33.45653, -37.15724), (1.9446597, -33.45653, -37.10632), (3.8839893, -33.45653, -36.95369), (5.812673, -33.45653, -36.699776), (7.725425, -33.45653, -36.34527), (9.617002, -33.45653, -35.89114), (11.482219, -33.45653, -35.33864), (13.315965, -33.45653, -34.689274), (15.113212, -33.45653, -33.944828), (16.869034, -33.45653, -33.107346), (18.57862, -33.45653, -32.179115), (20.237284, -33.45653, -31.162685), (21.840479, -33.45653, -30.06084), (23.38381, -33.45653, -28.8766), (24.863047, -33.45653, -27.61321), (26.274137, -33.45653, -26.274137), (27.61321, -33.45653, -24.863047), (28.8766, -33.45653, -23.38381), (30.06084, -33.45653, -21.840479), (31.162685, -33.45653, -20.237284), (32.179115, -33.45653, -18.57862), (33.107346, -33.45653, -16.869034), (33.944828, -33.45653, -15.113212), (34.689274, -33.45653, -13.315965), (35.33864, -33.45653, -11.482219), (35.89114, -33.45653, -9.617002), (36.34527, -33.45653, -7.725425), (36.699776, -33.45653, -5.812673), (36.95369, -33.45653, -3.8839893), (37.10632, -33.45653, -1.9446597), (38.8573, -31.466019, 0), (38.804047, -31.466019, 2.033634), (38.644432, -31.466019, 4.0616937), (38.3789, -31.466019, 6.0786204), (38.00817, -31.466019, 8.078887), (37.533268, -31.466019, 10.057009), (36.955486, -31.466019, 12.0075655), (36.276413, -31.466019, 13.92521), (35.49791, -31.466019, 15.804687), (34.622105, -31.466019, 17.640844), (33.65141, -31.466019, 19.42865), (32.58847, -31.466019, 21.1632), (31.436214, -31.466019, 22.839746), (30.197792, -31.466019, 24.45369), (28.8766, -31.466019, 26.000607), (27.47626, -31.466019, 27.47626), (26.000607, -31.466019, 28.8766), (24.45369, -31.466019, 30.197792), (22.839746, -31.466019, 31.436214), (21.1632, -31.466019, 32.58847), (19.42865, -31.466019, 33.65141), (17.640844, -31.466019, 34.622105), (15.804687, -31.466019, 35.49791), (13.92521, -31.466019, 36.276413), (12.0075655, -31.466019, 36.955486), (10.057009, -31.466019, 37.533268), (8.078887, -31.466019, 38.00817), (6.0786204, -31.466019, 38.3789), (4.0616937, -31.466019, 38.644432), (2.033634, -31.466019, 38.804047), (2.3793234e-15, -31.466019, 38.8573), (-2.033634, -31.466019, 38.804047), (-4.0616937, -31.466019, 38.644432), (-6.0786204, -31.466019, 38.3789), (-8.078887, -31.466019, 38.00817), (-10.057009, -31.466019, 37.533268), (-12.0075655, -31.466019, 36.955486), (-13.92521, -31.466019, 36.276413), (-15.804687, -31.466019, 35.49791), (-17.640844, -31.466019, 34.622105), (-19.42865, -31.466019, 33.65141), (-21.1632, -31.466019, 32.58847), (-22.839746, -31.466019, 31.436214), (-24.45369, -31.466019, 30.197792), (-26.000607, -31.466019, 28.8766), (-27.47626, -31.466019, 27.47626), (-28.8766, -31.466019, 26.000607), (-30.197792, -31.466019, 24.45369), (-31.436214, -31.466019, 22.839746), (-32.58847, -31.466019, 21.1632), (-33.65141, -31.466019, 19.42865), (-34.622105, -31.466019, 17.640844), (-35.49791, -31.466019, 15.804687), (-36.276413, -31.466019, 13.92521), (-36.955486, -31.466019, 12.0075655), (-37.533268, -31.466019, 10.057009), (-38.00817, -31.466019, 8.078887), (-38.3789, -31.466019, 6.0786204), (-38.644432, -31.466019, 4.0616937), (-38.804047, -31.466019, 2.033634), (-38.8573, -31.466019, 4.7586468e-15), (-38.804047, -31.466019, -2.033634), (-38.644432, -31.466019, -4.0616937), (-38.3789, -31.466019, -6.0786204), (-38.00817, -31.466019, -8.078887), (-37.533268, -31.466019, -10.057009), (-36.955486, -31.466019, -12.0075655), (-36.276413, -31.466019, -13.92521), (-35.49791, -31.466019, -15.804687), (-34.622105, -31.466019, -17.640844), (-33.65141, -31.466019, -19.42865), (-32.58847, -31.466019, -21.1632), (-31.436214, -31.466019, -22.839746), (-30.197792, -31.466019, -24.45369), (-28.8766, -31.466019, -26.000607), (-27.47626, -31.466019, -27.47626), (-26.000607, -31.466019, -28.8766), (-24.45369, -31.466019, -30.197792), (-22.839746, -31.466019, -31.436214), (-21.1632, -31.466019, -32.58847), (-19.42865, -31.466019, -33.65141), (-17.640844, -31.466019, -34.622105), (-15.804687, -31.466019, -35.49791), (-13.92521, -31.466019, -36.276413), (-12.0075655, -31.466019, -36.955486), (-10.057009, -31.466019, -37.533268), (-8.078887, -31.466019, -38.00817), (-6.0786204, -31.466019, -38.3789), (-4.0616937, -31.466019, -38.644432), (-2.033634, -31.466019, -38.804047), (-7.1379695e-15, -31.466019, -38.8573), (2.033634, -31.466019, -38.804047), (4.0616937, -31.466019, -38.644432), (6.0786204, -31.466019, -38.3789), (8.078887, -31.466019, -38.00817), (10.057009, -31.466019, -37.533268), (12.0075655, -31.466019, -36.955486), (13.92521, -31.466019, -36.276413), (15.804687, -31.466019, -35.49791), (17.640844, -31.466019, -34.622105), (19.42865, -31.466019, -33.65141), (21.1632, -31.466019, -32.58847), (22.839746, -31.466019, -31.436214), (24.45369, -31.466019, -30.197792), (26.000607, -31.466019, -28.8766), (27.47626, -31.466019, -27.47626), (28.8766, -31.466019, -26.000607), (30.197792, -31.466019, -24.45369), (31.436214, -31.466019, -22.839746), (32.58847, -31.466019, -21.1632), (33.65141, -31.466019, -19.42865), (34.622105, -31.466019, -17.640844), (35.49791, -31.466019, -15.804687), (36.276413, -31.466019, -13.92521), (36.955486, -31.466019, -12.0075655), (37.533268, -31.466019, -10.057009), (38.00817, -31.466019, -8.078887), (38.3789, -31.466019, -6.0786204), (38.644432, -31.466019, -4.0616937), (38.804047, -31.466019, -2.033634), (40.45085, -29.389263, 0), (40.395412, -29.389263, 2.117034), (40.229256, -29.389263, 4.2282653), (39.95283, -29.389263, 6.327907), (39.566902, -29.389263, 8.410205), (39.07252, -29.389263, 10.46945), (38.471043, -29.389263, 12.5), (37.764122, -29.389263, 14.496288), (36.95369, -29.389263, 16.452843), (36.04197, -29.389263, 18.364302), (35.031464, -29.389263, 20.225426), (33.92494, -29.389263, 22.031113), (32.725426, -29.389263, 23.776413), (31.436214, -29.389263, 25.456545), (30.06084, -29.389263, 27.066902), (28.60307, -29.389263, 28.60307), (27.066902, -29.389263, 30.06084), (25.456545, -29.389263, 31.436214), (23.776413, -29.389263, 32.725426), (22.031113, -29.389263, 33.92494), (20.225426, -29.389263, 35.031464), (18.364302, -29.389263, 36.04197), (16.452843, -29.389263, 36.95369), (14.496288, -29.389263, 37.764122), (12.5, -29.389263, 38.471043), (10.46945, -29.389263, 39.07252), (8.410205, -29.389263, 39.566902), (6.327907, -29.389263, 39.95283), (4.2282653, -29.389263, 40.229256), (2.117034, -29.389263, 40.395412), (2.4769e-15, -29.389263, 40.45085), (-2.117034, -29.389263, 40.395412), (-4.2282653, -29.389263, 40.229256), (-6.327907, -29.389263, 39.95283), (-8.410205, -29.389263, 39.566902), (-10.46945, -29.389263, 39.07252), (-12.5, -29.389263, 38.471043), (-14.496288, -29.389263, 37.764122), (-16.452843, -29.389263, 36.95369), (-18.364302, -29.389263, 36.04197), (-20.225426, -29.389263, 35.031464), (-22.031113, -29.389263, 33.92494), (-23.776413, -29.389263, 32.725426), (-25.456545, -29.389263, 31.436214), (-27.066902, -29.389263, 30.06084), (-28.60307, -29.389263, 28.60307), (-30.06084, -29.389263, 27.066902), (-31.436214, -29.389263, 25.456545), (-32.725426, -29.389263, 23.776413), (-33.92494, -29.389263, 22.031113), (-35.031464, -29.389263, 20.225426), (-36.04197, -29.389263, 18.364302), (-36.95369, -29.389263, 16.452843), (-37.764122, -29.389263, 14.496288), (-38.471043, -29.389263, 12.5), (-39.07252, -29.389263, 10.46945), (-39.566902, -29.389263, 8.410205), (-39.95283, -29.389263, 6.327907), (-40.229256, -29.389263, 4.2282653), (-40.395412, -29.389263, 2.117034), (-40.45085, -29.389263, 4.9538e-15), (-40.395412, -29.389263, -2.117034), (-40.229256, -29.389263, -4.2282653), (-39.95283, -29.389263, -6.327907), (-39.566902, -29.389263, -8.410205), (-39.07252, -29.389263, -10.46945), (-38.471043, -29.389263, -12.5), (-37.764122, -29.389263, -14.496288), (-36.95369, -29.389263, -16.452843), (-36.04197, -29.389263, -18.364302), (-35.031464, -29.389263, -20.225426), (-33.92494, -29.389263, -22.031113), (-32.725426, -29.389263, -23.776413), (-31.436214, -29.389263, -25.456545), (-30.06084, -29.389263, -27.066902), (-28.60307, -29.389263, -28.60307), (-27.066902, -29.389263, -30.06084), (-25.456545, -29.389263, -31.436214), (-23.776413, -29.389263, -32.725426), (-22.031113, -29.389263, -33.92494), (-20.225426, -29.389263, -35.031464), (-18.364302, -29.389263, -36.04197), (-16.452843, -29.389263, -36.95369), (-14.496288, -29.389263, -37.764122), (-12.5, -29.389263, -38.471043), (-10.46945, -29.389263, -39.07252), (-8.410205, -29.389263, -39.566902), (-6.327907, -29.389263, -39.95283), (-4.2282653, -29.389263, -40.229256), (-2.117034, -29.389263, -40.395412), (-7.430701e-15, -29.389263, -40.45085), (2.117034, -29.389263, -40.395412), (4.2282653, -29.389263, -40.229256), (6.327907, -29.389263, -39.95283), (8.410205, -29.389263, -39.566902), (10.46945, -29.389263, -39.07252), (12.5, -29.389263, -38.471043), (14.496288, -29.389263, -37.764122), (16.452843, -29.389263, -36.95369), (18.364302, -29.389263, -36.04197), (20.225426, -29.389263, -35.031464), (22.031113, -29.389263, -33.92494), (23.776413, -29.389263, -32.725426), (25.456545, -29.389263, -31.436214), (27.066902, -29.389263, -30.06084), (28.60307, -29.389263, -28.60307), (30.06084, -29.389263, -27.066902), (31.436214, -29.389263, -25.456545), (32.725426, -29.389263, -23.776413), (33.92494, -29.389263, -22.031113), (35.031464, -29.389263, -20.225426), (36.04197, -29.389263, -18.364302), (36.95369, -29.389263, -16.452843), (37.764122, -29.389263, -14.496288), (38.471043, -29.389263, -12.5), (39.07252, -29.389263, -10.46945), (39.566902, -29.389263, -8.410205), (39.95283, -29.389263, -6.327907), (40.229256, -29.389263, -4.2282653), (40.395412, -29.389263, -2.117034), (41.93353, -27.231953, 0), (41.87606, -27.231953, 2.1946313), (41.70381, -27.231953, 4.3832474), (41.417255, -27.231953, 6.5598493), (41.01718, -27.231953, 8.718471), (40.504677, -27.231953, 10.853196), (39.881157, -27.231953, 12.958173), (39.148323, -27.231953, 15.027633), (38.308186, -27.231953, 17.055902), (37.36305, -27.231953, 19.037424), (36.315502, -27.231953, 20.966764), (35.168415, -27.231953, 22.838636), (33.92494, -27.231953, 24.64791), (32.58847, -27.231953, 26.389624), (31.162685, -27.231953, 28.059008), (29.651482, -27.231953, 29.651482), (28.059008, -27.231953, 31.162685), (26.389624, -27.231953, 32.58847), (24.64791, -27.231953, 33.92494), (22.838636, -27.231953, 35.168415), (20.966764, -27.231953, 36.315502), (19.037424, -27.231953, 37.36305), (17.055902, -27.231953, 38.308186), (15.027633, -27.231953, 39.148323), (12.958173, -27.231953, 39.881157), (10.853196, -27.231953, 40.504677), (8.718471, -27.231953, 41.01718), (6.5598493, -27.231953, 41.417255), (4.3832474, -27.231953, 41.70381), (2.1946313, -27.231953, 41.87606), (2.567688e-15, -27.231953, 41.93353), (-2.1946313, -27.231953, 41.87606), (-4.3832474, -27.231953, 41.70381), (-6.5598493, -27.231953, 41.417255), (-8.718471, -27.231953, 41.01718), (-10.853196, -27.231953, 40.504677), (-12.958173, -27.231953, 39.881157), (-15.027633, -27.231953, 39.148323), (-17.055902, -27.231953, 38.308186), (-19.037424, -27.231953, 37.36305), (-20.966764, -27.231953, 36.315502), (-22.838636, -27.231953, 35.168415), (-24.64791, -27.231953, 33.92494), (-26.389624, -27.231953, 32.58847), (-28.059008, -27.231953, 31.162685), (-29.651482, -27.231953, 29.651482), (-31.162685, -27.231953, 28.059008), (-32.58847, -27.231953, 26.389624), (-33.92494, -27.231953, 24.64791), (-35.168415, -27.231953, 22.838636), (-36.315502, -27.231953, 20.966764), (-37.36305, -27.231953, 19.037424), (-38.308186, -27.231953, 17.055902), (-39.148323, -27.231953, 15.027633), (-39.881157, -27.231953, 12.958173), (-40.504677, -27.231953, 10.853196), (-41.01718, -27.231953, 8.718471), (-41.417255, -27.231953, 6.5598493), (-41.70381, -27.231953, 4.3832474), (-41.87606, -27.231953, 2.1946313), (-41.93353, -27.231953, 5.135376e-15), (-41.87606, -27.231953, -2.1946313), (-41.70381, -27.231953, -4.3832474), (-41.417255, -27.231953, -6.5598493), (-41.01718, -27.231953, -8.718471), (-40.504677, -27.231953, -10.853196), (-39.881157, -27.231953, -12.958173), (-39.148323, -27.231953, -15.027633), (-38.308186, -27.231953, -17.055902), (-37.36305, -27.231953, -19.037424), (-36.315502, -27.231953, -20.966764), (-35.168415, -27.231953, -22.838636), (-33.92494, -27.231953, -24.64791), (-32.58847, -27.231953, -26.389624), (-31.162685, -27.231953, -28.059008), (-29.651482, -27.231953, -29.651482), (-28.059008, -27.231953, -31.162685), (-26.389624, -27.231953, -32.58847), (-24.64791, -27.231953, -33.92494), (-22.838636, -27.231953, -35.168415), (-20.966764, -27.231953, -36.315502), (-19.037424, -27.231953, -37.36305), (-17.055902, -27.231953, -38.308186), (-15.027633, -27.231953, -39.148323), (-12.958173, -27.231953, -39.881157), (-10.853196, -27.231953, -40.504677), (-8.718471, -27.231953, -41.01718), (-6.5598493, -27.231953, -41.417255), (-4.3832474, -27.231953, -41.70381), (-2.1946313, -27.231953, -41.87606), (-7.703064e-15, -27.231953, -41.93353), (2.1946313, -27.231953, -41.87606), (4.3832474, -27.231953, -41.70381), (6.5598493, -27.231953, -41.417255), (8.718471, -27.231953, -41.01718), (10.853196, -27.231953, -40.504677), (12.958173, -27.231953, -39.881157), (15.027633, -27.231953, -39.148323), (17.055902, -27.231953, -38.308186), (19.037424, -27.231953, -37.36305), (20.966764, -27.231953, -36.315502), (22.838636, -27.231953, -35.168415), (24.64791, -27.231953, -33.92494), (26.389624, -27.231953, -32.58847), (28.059008, -27.231953, -31.162685), (29.651482, -27.231953, -29.651482), (31.162685, -27.231953, -28.059008), (32.58847, -27.231953, -26.389624), (33.92494, -27.231953, -24.64791), (35.168415, -27.231953, -22.838636), (36.315502, -27.231953, -20.966764), (37.36305, -27.231953, -19.037424), (38.308186, -27.231953, -17.055902), (39.148323, -27.231953, -15.027633), (39.881157, -27.231953, -12.958173), (40.504677, -27.231953, -10.853196), (41.01718, -27.231953, -8.718471), (41.417255, -27.231953, -6.5598493), (41.70381, -27.231953, -4.3832474), (41.87606, -27.231953, -2.1946313), (43.30127, -25, 0), (43.24193, -25, 2.2662134), (43.06406, -25, 4.526215), (42.768158, -25, 6.773811), (42.355034, -25, 9.00284), (41.825813, -25, 11.207193), (41.181953, -25, 13.380828), (40.425217, -25, 15.517787), (39.55768, -25, 17.612213), (38.581715, -25, 19.658365), (37.5, -25, 21.650635), (36.315502, -25, 23.583563), (35.031464, -25, 25.451847), (33.65141, -25, 27.250372), (32.179115, -25, 28.974205), (30.618622, -25, 30.618622), (28.974205, -25, 32.179115), (27.250372, -25, 33.65141), (25.451847, -25, 35.031464), (23.583563, -25, 36.315502), (21.650635, -25, 37.5), (19.658365, -25, 38.581715), (17.612213, -25, 39.55768), (15.517787, -25, 40.425217), (13.380828, -25, 41.181953), (11.207193, -25, 41.825813), (9.00284, -25, 42.355034), (6.773811, -25, 42.768158), (4.526215, -25, 43.06406), (2.2662134, -25, 43.24193), (2.651438e-15, -25, 43.30127), (-2.2662134, -25, 43.24193), (-4.526215, -25, 43.06406), (-6.773811, -25, 42.768158), (-9.00284, -25, 42.355034), (-11.207193, -25, 41.825813), (-13.380828, -25, 41.181953), (-15.517787, -25, 40.425217), (-17.612213, -25, 39.55768), (-19.658365, -25, 38.581715), (-21.650635, -25, 37.5), (-23.583563, -25, 36.315502), (-25.451847, -25, 35.031464), (-27.250372, -25, 33.65141), (-28.974205, -25, 32.179115), (-30.618622, -25, 30.618622), (-32.179115, -25, 28.974205), (-33.65141, -25, 27.250372), (-35.031464, -25, 25.451847), (-36.315502, -25, 23.583563), (-37.5, -25, 21.650635), (-38.581715, -25, 19.658365), (-39.55768, -25, 17.612213), (-40.425217, -25, 15.517787), (-41.181953, -25, 13.380828), (-41.825813, -25, 11.207193), (-42.355034, -25, 9.00284), (-42.768158, -25, 6.773811), (-43.06406, -25, 4.526215), (-43.24193, -25, 2.2662134), (-43.30127, -25, 5.302876e-15), (-43.24193, -25, -2.2662134), (-43.06406, -25, -4.526215), (-42.768158, -25, -6.773811), (-42.355034, -25, -9.00284), (-41.825813, -25, -11.207193), (-41.181953, -25, -13.380828), (-40.425217, -25, -15.517787), (-39.55768, -25, -17.612213), (-38.581715, -25, -19.658365), (-37.5, -25, -21.650635), (-36.315502, -25, -23.583563), (-35.031464, -25, -25.451847), (-33.65141, -25, -27.250372), (-32.179115, -25, -28.974205), (-30.618622, -25, -30.618622), (-28.974205, -25, -32.179115), (-27.250372, -25, -33.65141), (-25.451847, -25, -35.031464), (-23.583563, -25, -36.315502), (-21.650635, -25, -37.5), (-19.658365, -25, -38.581715), (-17.612213, -25, -39.55768), (-15.517787, -25, -40.425217), (-13.380828, -25, -41.181953), (-11.207193, -25, -41.825813), (-9.00284, -25, -42.355034), (-6.773811, -25, -42.768158), (-4.526215, -25, -43.06406), (-2.2662134, -25, -43.24193), (-7.9543145e-15, -25, -43.30127), (2.2662134, -25, -43.24193), (4.526215, -25, -43.06406), (6.773811, -25, -42.768158), (9.00284, -25, -42.355034), (11.207193, -25, -41.825813), (13.380828, -25, -41.181953), (15.517787, -25, -40.425217), (17.612213, -25, -39.55768), (19.658365, -25, -38.581715), (21.650635, -25, -37.5), (23.583563, -25, -36.315502), (25.451847, -25, -35.031464), (27.250372, -25, -33.65141), (28.974205, -25, -32.179115), (30.618622, -25, -30.618622), (32.179115, -25, -28.974205), (33.65141, -25, -27.250372), (35.031464, -25, -25.451847), (36.315502, -25, -23.583563), (37.5, -25, -21.650635), (38.581715, -25, -19.658365), (39.55768, -25, -17.612213), (40.425217, -25, -15.517787), (41.181953, -25, -13.380828), (41.825813, -25, -11.207193), (42.355034, -25, -9.00284), (42.768158, -25, -6.773811), (43.06406, -25, -4.526215), (43.24193, -25, -2.2662134), (44.550327, -22.699526, 0), (44.489273, -22.699526, 2.331584), (44.306274, -22.699526, 4.656777), (44.00184, -22.699526, 6.9692063), (43.576794, -22.699526, 9.262533), (43.03231, -22.699526, 11.530473), (42.369877, -22.699526, 13.766808), (41.591312, -22.699526, 15.965409), (40.69875, -22.699526, 18.12025), (39.69463, -22.699526, 20.225426), (38.581715, -22.699526, 22.275164), (37.36305, -22.699526, 24.263847), (36.04197, -22.699526, 26.186026), (34.622105, -22.699526, 28.036428), (33.107346, -22.699526, 29.809986), (31.501839, -22.699526, 31.501839), (29.809986, -22.699526, 33.107346), (28.036428, -22.699526, 34.622105), (26.186026, -22.699526, 36.04197), (24.263847, -22.699526, 37.36305), (22.275164, -22.699526, 38.581715), (20.225426, -22.699526, 39.69463), (18.12025, -22.699526, 40.69875), (15.965409, -22.699526, 41.591312), (13.766808, -22.699526, 42.369877), (11.530473, -22.699526, 43.03231), (9.262533, -22.699526, 43.576794), (6.9692063, -22.699526, 44.00184), (4.656777, -22.699526, 44.306274), (2.331584, -22.699526, 44.489273), (2.7279206e-15, -22.699526, 44.550327), (-2.331584, -22.699526, 44.489273), (-4.656777, -22.699526, 44.306274), (-6.9692063, -22.699526, 44.00184), (-9.262533, -22.699526, 43.576794), (-11.530473, -22.699526, 43.03231), (-13.766808, -22.699526, 42.369877), (-15.965409, -22.699526, 41.591312), (-18.12025, -22.699526, 40.69875), (-20.225426, -22.699526, 39.69463), (-22.275164, -22.699526, 38.581715), (-24.263847, -22.699526, 37.36305), (-26.186026, -22.699526, 36.04197), (-28.036428, -22.699526, 34.622105), (-29.809986, -22.699526, 33.107346), (-31.501839, -22.699526, 31.501839), (-33.107346, -22.699526, 29.809986), (-34.622105, -22.699526, 28.036428), (-36.04197, -22.699526, 26.186026), (-37.36305, -22.699526, 24.263847), (-38.581715, -22.699526, 22.275164), (-39.69463, -22.699526, 20.225426), (-40.69875, -22.699526, 18.12025), (-41.591312, -22.699526, 15.965409), (-42.369877, -22.699526, 13.766808), (-43.03231, -22.699526, 11.530473), (-43.576794, -22.699526, 9.262533), (-44.00184, -22.699526, 6.9692063), (-44.306274, -22.699526, 4.656777), (-44.489273, -22.699526, 2.331584), (-44.550327, -22.699526, 5.4558413e-15), (-44.489273, -22.699526, -2.331584), (-44.306274, -22.699526, -4.656777), (-44.00184, -22.699526, -6.9692063), (-43.576794, -22.699526, -9.262533), (-43.03231, -22.699526, -11.530473), (-42.369877, -22.699526, -13.766808), (-41.591312, -22.699526, -15.965409), (-40.69875, -22.699526, -18.12025), (-39.69463, -22.699526, -20.225426), (-38.581715, -22.699526, -22.275164), (-37.36305, -22.699526, -24.263847), (-36.04197, -22.699526, -26.186026), (-34.622105, -22.699526, -28.036428), (-33.107346, -22.699526, -29.809986), (-31.501839, -22.699526, -31.501839), (-29.809986, -22.699526, -33.107346), (-28.036428, -22.699526, -34.622105), (-26.186026, -22.699526, -36.04197), (-24.263847, -22.699526, -37.36305), (-22.275164, -22.699526, -38.581715), (-20.225426, -22.699526, -39.69463), (-18.12025, -22.699526, -40.69875), (-15.965409, -22.699526, -41.591312), (-13.766808, -22.699526, -42.369877), (-11.530473, -22.699526, -43.03231), (-9.262533, -22.699526, -43.576794), (-6.9692063, -22.699526, -44.00184), (-4.656777, -22.699526, -44.306274), (-2.331584, -22.699526, -44.489273), (-8.183762e-15, -22.699526, -44.550327), (2.331584, -22.699526, -44.489273), (4.656777, -22.699526, -44.306274), (6.9692063, -22.699526, -44.00184), (9.262533, -22.699526, -43.576794), (11.530473, -22.699526, -43.03231), (13.766808, -22.699526, -42.369877), (15.965409, -22.699526, -41.591312), (18.12025, -22.699526, -40.69875), (20.225426, -22.699526, -39.69463), (22.275164, -22.699526, -38.581715), (24.263847, -22.699526, -37.36305), (26.186026, -22.699526, -36.04197), (28.036428, -22.699526, -34.622105), (29.809986, -22.699526, -33.107346), (31.501839, -22.699526, -31.501839), (33.107346, -22.699526, -29.809986), (34.622105, -22.699526, -28.036428), (36.04197, -22.699526, -26.186026), (37.36305, -22.699526, -24.263847), (38.581715, -22.699526, -22.275164), (39.69463, -22.699526, -20.225426), (40.69875, -22.699526, -18.12025), (41.591312, -22.699526, -15.965409), (42.369877, -22.699526, -13.766808), (43.03231, -22.699526, -11.530473), (43.576794, -22.699526, -9.262533), (44.00184, -22.699526, -6.9692063), (44.306274, -22.699526, -4.656777), (44.489273, -22.699526, -2.331584), (45.677273, -20.336832, 0), (45.614674, -20.336832, 2.3905637), (45.427048, -20.336832, 4.774575), (45.11491, -20.336832, 7.1454997), (44.679115, -20.336832, 9.496839), (44.120857, -20.336832, 11.822148), (43.44167, -20.336832, 14.115053), (42.64341, -20.336832, 16.36927), (41.728264, -20.336832, 18.57862), (40.69875, -20.336832, 20.737047), (39.55768, -20.336832, 22.838636), (38.308186, -20.336832, 24.877626), (36.95369, -20.336832, 26.848427), (35.49791, -20.336832, 28.74564), (33.944828, -20.336832, 30.564062), (32.29871, -20.336832, 32.29871), (30.564062, -20.336832, 33.944828), (28.74564, -20.336832, 35.49791), (26.848427, -20.336832, 36.95369), (24.877626, -20.336832, 38.308186), (22.838636, -20.336832, 39.55768), (20.737047, -20.336832, 40.69875), (18.57862, -20.336832, 41.728264), (16.36927, -20.336832, 42.64341), (14.115053, -20.336832, 43.44167), (11.822148, -20.336832, 44.120857), (9.496839, -20.336832, 44.679115), (7.1454997, -20.336832, 45.11491), (4.774575, -20.336832, 45.427048), (2.3905637, -20.336832, 45.614674), (2.7969263e-15, -20.336832, 45.677273), (-2.3905637, -20.336832, 45.614674), (-4.774575, -20.336832, 45.427048), (-7.1454997, -20.336832, 45.11491), (-9.496839, -20.336832, 44.679115), (-11.822148, -20.336832, 44.120857), (-14.115053, -20.336832, 43.44167), (-16.36927, -20.336832, 42.64341), (-18.57862, -20.336832, 41.728264), (-20.737047, -20.336832, 40.69875), (-22.838636, -20.336832, 39.55768), (-24.877626, -20.336832, 38.308186), (-26.848427, -20.336832, 36.95369), (-28.74564, -20.336832, 35.49791), (-30.564062, -20.336832, 33.944828), (-32.29871, -20.336832, 32.29871), (-33.944828, -20.336832, 30.564062), (-35.49791, -20.336832, 28.74564), (-36.95369, -20.336832, 26.848427), (-38.308186, -20.336832, 24.877626), (-39.55768, -20.336832, 22.838636), (-40.69875, -20.336832, 20.737047), (-41.728264, -20.336832, 18.57862), (-42.64341, -20.336832, 16.36927), (-43.44167, -20.336832, 14.115053), (-44.120857, -20.336832, 11.822148), (-44.679115, -20.336832, 9.496839), (-45.11491, -20.336832, 7.1454997), (-45.427048, -20.336832, 4.774575), (-45.614674, -20.336832, 2.3905637), (-45.677273, -20.336832, 5.5938526e-15), (-45.614674, -20.336832, -2.3905637), (-45.427048, -20.336832, -4.774575), (-45.11491, -20.336832, -7.1454997), (-44.679115, -20.336832, -9.496839), (-44.120857, -20.336832, -11.822148), (-43.44167, -20.336832, -14.115053), (-42.64341, -20.336832, -16.36927), (-41.728264, -20.336832, -18.57862), (-40.69875, -20.336832, -20.737047), (-39.55768, -20.336832, -22.838636), (-38.308186, -20.336832, -24.877626), (-36.95369, -20.336832, -26.848427), (-35.49791, -20.336832, -28.74564), (-33.944828, -20.336832, -30.564062), (-32.29871, -20.336832, -32.29871), (-30.564062, -20.336832, -33.944828), (-28.74564, -20.336832, -35.49791), (-26.848427, -20.336832, -36.95369), (-24.877626, -20.336832, -38.308186), (-22.838636, -20.336832, -39.55768), (-20.737047, -20.336832, -40.69875), (-18.57862, -20.336832, -41.728264), (-16.36927, -20.336832, -42.64341), (-14.115053, -20.336832, -43.44167), (-11.822148, -20.336832, -44.120857), (-9.496839, -20.336832, -44.679115), (-7.1454997, -20.336832, -45.11491), (-4.774575, -20.336832, -45.427048), (-2.3905637, -20.336832, -45.614674), (-8.390779e-15, -20.336832, -45.677273), (2.3905637, -20.336832, -45.614674), (4.774575, -20.336832, -45.427048), (7.1454997, -20.336832, -45.11491), (9.496839, -20.336832, -44.679115), (11.822148, -20.336832, -44.120857), (14.115053, -20.336832, -43.44167), (16.36927, -20.336832, -42.64341), (18.57862, -20.336832, -41.728264), (20.737047, -20.336832, -40.69875), (22.838636, -20.336832, -39.55768), (24.877626, -20.336832, -38.308186), (26.848427, -20.336832, -36.95369), (28.74564, -20.336832, -35.49791), (30.564062, -20.336832, -33.944828), (32.29871, -20.336832, -32.29871), (33.944828, -20.336832, -30.564062), (35.49791, -20.336832, -28.74564), (36.95369, -20.336832, -26.848427), (38.308186, -20.336832, -24.877626), (39.55768, -20.336832, -22.838636), (40.69875, -20.336832, -20.737047), (41.728264, -20.336832, -18.57862), (42.64341, -20.336832, -16.36927), (43.44167, -20.336832, -14.115053), (44.120857, -20.336832, -11.822148), (44.679115, -20.336832, -9.496839), (45.11491, -20.336832, -7.1454997), (45.427048, -20.336832, -4.774575), (45.614674, -20.336832, -2.3905637), (46.67902, -17.918398, 0), (46.615047, -17.918398, 2.4429913), (46.42331, -17.918398, 4.8792863), (46.104324, -17.918398, 7.302208), (45.658974, -17.918398, 9.705114), (45.08847, -17.918398, 12.08142), (44.394386, -17.918398, 14.424611), (43.57862, -17.918398, 16.728266), (42.64341, -17.918398, 18.986069), (41.591312, -17.918398, 21.191832), (40.425217, -17.918398, 23.33951), (39.148323, -17.918398, 25.423218), (37.764122, -17.918398, 27.43724), (36.276413, -17.918398, 29.37606), (34.689274, -17.918398, 31.234362), (33.007053, -17.918398, 33.007053), (31.234362, -17.918398, 34.689274), (29.37606, -17.918398, 36.276413), (27.43724, -17.918398, 37.764122), (25.423218, -17.918398, 39.148323), (23.33951, -17.918398, 40.425217), (21.191832, -17.918398, 41.591312), (18.986069, -17.918398, 42.64341), (16.728266, -17.918398, 43.57862), (14.424611, -17.918398, 44.394386), (12.08142, -17.918398, 45.08847), (9.705114, -17.918398, 45.658974), (7.302208, -17.918398, 46.104324), (4.8792863, -17.918398, 46.42331), (2.4429913, -17.918398, 46.615047), (2.8582657e-15, -17.918398, 46.67902), (-2.4429913, -17.918398, 46.615047), (-4.8792863, -17.918398, 46.42331), (-7.302208, -17.918398, 46.104324), (-9.705114, -17.918398, 45.658974), (-12.08142, -17.918398, 45.08847), (-14.424611, -17.918398, 44.394386), (-16.728266, -17.918398, 43.57862), (-18.986069, -17.918398, 42.64341), (-21.191832, -17.918398, 41.591312), (-23.33951, -17.918398, 40.425217), (-25.423218, -17.918398, 39.148323), (-27.43724, -17.918398, 37.764122), (-29.37606, -17.918398, 36.276413), (-31.234362, -17.918398, 34.689274), (-33.007053, -17.918398, 33.007053), (-34.689274, -17.918398, 31.234362), (-36.276413, -17.918398, 29.37606), (-37.764122, -17.918398, 27.43724), (-39.148323, -17.918398, 25.423218), (-40.425217, -17.918398, 23.33951), (-41.591312, -17.918398, 21.191832), (-42.64341, -17.918398, 18.986069), (-43.57862, -17.918398, 16.728266), (-44.394386, -17.918398, 14.424611), (-45.08847, -17.918398, 12.08142), (-45.658974, -17.918398, 9.705114), (-46.104324, -17.918398, 7.302208), (-46.42331, -17.918398, 4.8792863), (-46.615047, -17.918398, 2.4429913), (-46.67902, -17.918398, 5.7165313e-15), (-46.615047, -17.918398, -2.4429913), (-46.42331, -17.918398, -4.8792863), (-46.104324, -17.918398, -7.302208), (-45.658974, -17.918398, -9.705114), (-45.08847, -17.918398, -12.08142), (-44.394386, -17.918398, -14.424611), (-43.57862, -17.918398, -16.728266), (-42.64341, -17.918398, -18.986069), (-41.591312, -17.918398, -21.191832), (-40.425217, -17.918398, -23.33951), (-39.148323, -17.918398, -25.423218), (-37.764122, -17.918398, -27.43724), (-36.276413, -17.918398, -29.37606), (-34.689274, -17.918398, -31.234362), (-33.007053, -17.918398, -33.007053), (-31.234362, -17.918398, -34.689274), (-29.37606, -17.918398, -36.276413), (-27.43724, -17.918398, -37.764122), (-25.423218, -17.918398, -39.148323), (-23.33951, -17.918398, -40.425217), (-21.191832, -17.918398, -41.591312), (-18.986069, -17.918398, -42.64341), (-16.728266, -17.918398, -43.57862), (-14.424611, -17.918398, -44.394386), (-12.08142, -17.918398, -45.08847), (-9.705114, -17.918398, -45.658974), (-7.302208, -17.918398, -46.104324), (-4.8792863, -17.918398, -46.42331), (-2.4429913, -17.918398, -46.615047), (-8.5747974e-15, -17.918398, -46.67902), (2.4429913, -17.918398, -46.615047), (4.8792863, -17.918398, -46.42331), (7.302208, -17.918398, -46.104324), (9.705114, -17.918398, -45.658974), (12.08142, -17.918398, -45.08847), (14.424611, -17.918398, -44.394386), (16.728266, -17.918398, -43.57862), (18.986069, -17.918398, -42.64341), (21.191832, -17.918398, -41.591312), (23.33951, -17.918398, -40.425217), (25.423218, -17.918398, -39.148323), (27.43724, -17.918398, -37.764122), (29.37606, -17.918398, -36.276413), (31.234362, -17.918398, -34.689274), (33.007053, -17.918398, -33.007053), (34.689274, -17.918398, -31.234362), (36.276413, -17.918398, -29.37606), (37.764122, -17.918398, -27.43724), (39.148323, -17.918398, -25.423218), (40.425217, -17.918398, -23.33951), (41.591312, -17.918398, -21.191832), (42.64341, -17.918398, -18.986069), (43.57862, -17.918398, -16.728266), (44.394386, -17.918398, -14.424611), (45.08847, -17.918398, -12.08142), (45.658974, -17.918398, -9.705114), (46.104324, -17.918398, -7.302208), (46.42331, -17.918398, -4.8792863), (46.615047, -17.918398, -2.4429913), (47.552826, -15.45085, 0), (47.487656, -15.45085, 2.4887226), (47.292328, -15.45085, 4.970624), (46.967373, -15.45085, 7.438901), (46.513683, -15.45085, 9.886788), (45.932503, -15.45085, 12.307577), (45.225426, -15.45085, 14.694632), (44.394386, -15.45085, 17.041409), (43.44167, -15.45085, 19.341476), (42.369877, -15.45085, 21.588531), (41.181953, -15.45085, 23.776413), (39.881157, -15.45085, 25.899126), (38.471043, -15.45085, 27.95085), (36.955486, -15.45085, 29.925962), (35.33864, -15.45085, 31.819052), (33.624924, -15.45085, 33.624924), (31.819052, -15.45085, 35.33864), (29.925962, -15.45085, 36.955486), (27.95085, -15.45085, 38.471043), (25.899126, -15.45085, 39.881157), (23.776413, -15.45085, 41.181953), (21.588531, -15.45085, 42.369877), (19.341476, -15.45085, 43.44167), (17.041409, -15.45085, 44.394386), (14.694632, -15.45085, 45.225426), (12.307577, -15.45085, 45.932503), (9.886788, -15.45085, 46.513683), (7.438901, -15.45085, 46.967373), (4.970624, -15.45085, 47.292328), (2.4887226, -15.45085, 47.487656), (2.9117708e-15, -15.45085, 47.552826), (-2.4887226, -15.45085, 47.487656), (-4.970624, -15.45085, 47.292328), (-7.438901, -15.45085, 46.967373), (-9.886788, -15.45085, 46.513683), (-12.307577, -15.45085, 45.932503), (-14.694632, -15.45085, 45.225426), (-17.041409, -15.45085, 44.394386), (-19.341476, -15.45085, 43.44167), (-21.588531, -15.45085, 42.369877), (-23.776413, -15.45085, 41.181953), (-25.899126, -15.45085, 39.881157), (-27.95085, -15.45085, 38.471043), (-29.925962, -15.45085, 36.955486), (-31.819052, -15.45085, 35.33864), (-33.624924, -15.45085, 33.624924), (-35.33864, -15.45085, 31.819052), (-36.955486, -15.45085, 29.925962), (-38.471043, -15.45085, 27.95085), (-39.881157, -15.45085, 25.899126), (-41.181953, -15.45085, 23.776413), (-42.369877, -15.45085, 21.588531), (-43.44167, -15.45085, 19.341476), (-44.394386, -15.45085, 17.041409), (-45.225426, -15.45085, 14.694632), (-45.932503, -15.45085, 12.307577), (-46.513683, -15.45085, 9.886788), (-46.967373, -15.45085, 7.438901), (-47.292328, -15.45085, 4.970624), (-47.487656, -15.45085, 2.4887226), (-47.552826, -15.45085, 5.8235417e-15), (-47.487656, -15.45085, -2.4887226), (-47.292328, -15.45085, -4.970624), (-46.967373, -15.45085, -7.438901), (-46.513683, -15.45085, -9.886788), (-45.932503, -15.45085, -12.307577), (-45.225426, -15.45085, -14.694632), (-44.394386, -15.45085, -17.041409), (-43.44167, -15.45085, -19.341476), (-42.369877, -15.45085, -21.588531), (-41.181953, -15.45085, -23.776413), (-39.881157, -15.45085, -25.899126), (-38.471043, -15.45085, -27.95085), (-36.955486, -15.45085, -29.925962), (-35.33864, -15.45085, -31.819052), (-33.624924, -15.45085, -33.624924), (-31.819052, -15.45085, -35.33864), (-29.925962, -15.45085, -36.955486), (-27.95085, -15.45085, -38.471043), (-25.899126, -15.45085, -39.881157), (-23.776413, -15.45085, -41.181953), (-21.588531, -15.45085, -42.369877), (-19.341476, -15.45085, -43.44167), (-17.041409, -15.45085, -44.394386), (-14.694632, -15.45085, -45.225426), (-12.307577, -15.45085, -45.932503), (-9.886788, -15.45085, -46.513683), (-7.438901, -15.45085, -46.967373), (-4.970624, -15.45085, -47.292328), (-2.4887226, -15.45085, -47.487656), (-8.735313e-15, -15.45085, -47.552826), (2.4887226, -15.45085, -47.487656), (4.970624, -15.45085, -47.292328), (7.438901, -15.45085, -46.967373), (9.886788, -15.45085, -46.513683), (12.307577, -15.45085, -45.932503), (14.694632, -15.45085, -45.225426), (17.041409, -15.45085, -44.394386), (19.341476, -15.45085, -43.44167), (21.588531, -15.45085, -42.369877), (23.776413, -15.45085, -41.181953), (25.899126, -15.45085, -39.881157), (27.95085, -15.45085, -38.471043), (29.925962, -15.45085, -36.955486), (31.819052, -15.45085, -35.33864), (33.624924, -15.45085, -33.624924), (35.33864, -15.45085, -31.819052), (36.955486, -15.45085, -29.925962), (38.471043, -15.45085, -27.95085), (39.881157, -15.45085, -25.899126), (41.181953, -15.45085, -23.776413), (42.369877, -15.45085, -21.588531), (43.44167, -15.45085, -19.341476), (44.394386, -15.45085, -17.041409), (45.225426, -15.45085, -14.694632), (45.932503, -15.45085, -12.307577), (46.513683, -15.45085, -9.886788), (46.967373, -15.45085, -7.438901), (47.292328, -15.45085, -4.970624), (47.487656, -15.45085, -2.4887226), (48.29629, -12.940952, 0), (48.230103, -12.940952, 2.5276325), (48.03172, -12.940952, 5.048337), (47.701683, -12.940952, 7.5552044), (47.240902, -12.940952, 10.041364), (46.650635, -12.940952, 12.5), (45.932503, -12.940952, 14.924375), (45.08847, -12.940952, 17.307842), (44.120857, -12.940952, 19.643871), (43.03231, -12.940952, 21.926058), (41.825813, -12.940952, 24.148146), (40.504677, -12.940952, 26.304045), (39.07252, -12.940952, 28.387848), (37.533268, -12.940952, 30.39384), (35.89114, -12.940952, 32.31653), (34.150635, -12.940952, 34.150635), (32.31653, -12.940952, 35.89114), (30.39384, -12.940952, 37.533268), (28.387848, -12.940952, 39.07252), (26.304045, -12.940952, 40.504677), (24.148146, -12.940952, 41.825813), (21.926058, -12.940952, 43.03231), (19.643871, -12.940952, 44.120857), (17.307842, -12.940952, 45.08847), (14.924375, -12.940952, 45.932503), (12.5, -12.940952, 46.650635), (10.041364, -12.940952, 47.240902), (7.5552044, -12.940952, 47.701683), (5.048337, -12.940952, 48.03172), (2.5276325, -12.940952, 48.230103), (2.9572948e-15, -12.940952, 48.29629), (-2.5276325, -12.940952, 48.230103), (-5.048337, -12.940952, 48.03172), (-7.5552044, -12.940952, 47.701683), (-10.041364, -12.940952, 47.240902), (-12.5, -12.940952, 46.650635), (-14.924375, -12.940952, 45.932503), (-17.307842, -12.940952, 45.08847), (-19.643871, -12.940952, 44.120857), (-21.926058, -12.940952, 43.03231), (-24.148146, -12.940952, 41.825813), (-26.304045, -12.940952, 40.504677), (-28.387848, -12.940952, 39.07252), (-30.39384, -12.940952, 37.533268), (-32.31653, -12.940952, 35.89114), (-34.150635, -12.940952, 34.150635), (-35.89114, -12.940952, 32.31653), (-37.533268, -12.940952, 30.39384), (-39.07252, -12.940952, 28.387848), (-40.504677, -12.940952, 26.304045), (-41.825813, -12.940952, 24.148146), (-43.03231, -12.940952, 21.926058), (-44.120857, -12.940952, 19.643871), (-45.08847, -12.940952, 17.307842), (-45.932503, -12.940952, 14.924375), (-46.650635, -12.940952, 12.5), (-47.240902, -12.940952, 10.041364), (-47.701683, -12.940952, 7.5552044), (-48.03172, -12.940952, 5.048337), (-48.230103, -12.940952, 2.5276325), (-48.29629, -12.940952, 5.9145897e-15), (-48.230103, -12.940952, -2.5276325), (-48.03172, -12.940952, -5.048337), (-47.701683, -12.940952, -7.5552044), (-47.240902, -12.940952, -10.041364), (-46.650635, -12.940952, -12.5), (-45.932503, -12.940952, -14.924375), (-45.08847, -12.940952, -17.307842), (-44.120857, -12.940952, -19.643871), (-43.03231, -12.940952, -21.926058), (-41.825813, -12.940952, -24.148146), (-40.504677, -12.940952, -26.304045), (-39.07252, -12.940952, -28.387848), (-37.533268, -12.940952, -30.39384), (-35.89114, -12.940952, -32.31653), (-34.150635, -12.940952, -34.150635), (-32.31653, -12.940952, -35.89114), (-30.39384, -12.940952, -37.533268), (-28.387848, -12.940952, -39.07252), (-26.304045, -12.940952, -40.504677), (-24.148146, -12.940952, -41.825813), (-21.926058, -12.940952, -43.03231), (-19.643871, -12.940952, -44.120857), (-17.307842, -12.940952, -45.08847), (-14.924375, -12.940952, -45.932503), (-12.5, -12.940952, -46.650635), (-10.041364, -12.940952, -47.240902), (-7.5552044, -12.940952, -47.701683), (-5.048337, -12.940952, -48.03172), (-2.5276325, -12.940952, -48.230103), (-8.871885e-15, -12.940952, -48.29629), (2.5276325, -12.940952, -48.230103), (5.048337, -12.940952, -48.03172), (7.5552044, -12.940952, -47.701683), (10.041364, -12.940952, -47.240902), (12.5, -12.940952, -46.650635), (14.924375, -12.940952, -45.932503), (17.307842, -12.940952, -45.08847), (19.643871, -12.940952, -44.120857), (21.926058, -12.940952, -43.03231), (24.148146, -12.940952, -41.825813), (26.304045, -12.940952, -40.504677), (28.387848, -12.940952, -39.07252), (30.39384, -12.940952, -37.533268), (32.31653, -12.940952, -35.89114), (34.150635, -12.940952, -34.150635), (35.89114, -12.940952, -32.31653), (37.533268, -12.940952, -30.39384), (39.07252, -12.940952, -28.387848), (40.504677, -12.940952, -26.304045), (41.825813, -12.940952, -24.148146), (43.03231, -12.940952, -21.926058), (44.120857, -12.940952, -19.643871), (45.08847, -12.940952, -17.307842), (45.932503, -12.940952, -14.924375), (46.650635, -12.940952, -12.5), (47.240902, -12.940952, -10.041364), (47.701683, -12.940952, -7.5552044), (48.03172, -12.940952, -5.048337), (48.230103, -12.940952, -2.5276325), (48.90738, -10.395584, 0), (48.840355, -10.395584, 2.5596144), (48.63946, -10.395584, 5.112213), (48.30525, -10.395584, 7.6507998), (47.83864, -10.395584, 10.168416), (47.240902, -10.395584, 12.658161), (46.513683, -10.395584, 15.113212), (45.658974, -10.395584, 17.526838), (44.679115, -10.395584, 19.892424), (43.576794, -10.395584, 22.203485), (42.355034, -10.395584, 24.45369), (41.01718, -10.395584, 26.636868), (39.566902, -10.395584, 28.747036), (38.00817, -10.395584, 30.778412), (36.34527, -10.395584, 32.725426), (34.58274, -10.395584, 34.58274), (32.725426, -10.395584, 36.34527), (30.778412, -10.395584, 38.00817), (28.747036, -10.395584, 39.566902), (26.636868, -10.395584, 41.01718), (24.45369, -10.395584, 42.355034), (22.203485, -10.395584, 43.576794), (19.892424, -10.395584, 44.679115), (17.526838, -10.395584, 45.658974), (15.113212, -10.395584, 46.513683), (12.658161, -10.395584, 47.240902), (10.168416, -10.395584, 47.83864), (7.6507998, -10.395584, 48.30525), (5.112213, -10.395584, 48.63946), (2.5596144, -10.395584, 48.840355), (2.9947134e-15, -10.395584, 48.90738), (-2.5596144, -10.395584, 48.840355), (-5.112213, -10.395584, 48.63946), (-7.6507998, -10.395584, 48.30525), (-10.168416, -10.395584, 47.83864), (-12.658161, -10.395584, 47.240902), (-15.113212, -10.395584, 46.513683), (-17.526838, -10.395584, 45.658974), (-19.892424, -10.395584, 44.679115), (-22.203485, -10.395584, 43.576794), (-24.45369, -10.395584, 42.355034), (-26.636868, -10.395584, 41.01718), (-28.747036, -10.395584, 39.566902), (-30.778412, -10.395584, 38.00817), (-32.725426, -10.395584, 36.34527), (-34.58274, -10.395584, 34.58274), (-36.34527, -10.395584, 32.725426), (-38.00817, -10.395584, 30.778412), (-39.566902, -10.395584, 28.747036), (-41.01718, -10.395584, 26.636868), (-42.355034, -10.395584, 24.45369), (-43.576794, -10.395584, 22.203485), (-44.679115, -10.395584, 19.892424), (-45.658974, -10.395584, 17.526838), (-46.513683, -10.395584, 15.113212), (-47.240902, -10.395584, 12.658161), (-47.83864, -10.395584, 10.168416), (-48.30525, -10.395584, 7.6507998), (-48.63946, -10.395584, 5.112213), (-48.840355, -10.395584, 2.5596144), (-48.90738, -10.395584, 5.9894267e-15), (-48.840355, -10.395584, -2.5596144), (-48.63946, -10.395584, -5.112213), (-48.30525, -10.395584, -7.6507998), (-47.83864, -10.395584, -10.168416), (-47.240902, -10.395584, -12.658161), (-46.513683, -10.395584, -15.113212), (-45.658974, -10.395584, -17.526838), (-44.679115, -10.395584, -19.892424), (-43.576794, -10.395584, -22.203485), (-42.355034, -10.395584, -24.45369), (-41.01718, -10.395584, -26.636868), (-39.566902, -10.395584, -28.747036), (-38.00817, -10.395584, -30.778412), (-36.34527, -10.395584, -32.725426), (-34.58274, -10.395584, -34.58274), (-32.725426, -10.395584, -36.34527), (-30.778412, -10.395584, -38.00817), (-28.747036, -10.395584, -39.566902), (-26.636868, -10.395584, -41.01718), (-24.45369, -10.395584, -42.355034), (-22.203485, -10.395584, -43.576794), (-19.892424, -10.395584, -44.679115), (-17.526838, -10.395584, -45.658974), (-15.113212, -10.395584, -46.513683), (-12.658161, -10.395584, -47.240902), (-10.168416, -10.395584, -47.83864), (-7.6507998, -10.395584, -48.30525), (-5.112213, -10.395584, -48.63946), (-2.5596144, -10.395584, -48.840355), (-8.98414e-15, -10.395584, -48.90738), (2.5596144, -10.395584, -48.840355), (5.112213, -10.395584, -48.63946), (7.6507998, -10.395584, -48.30525), (10.168416, -10.395584, -47.83864), (12.658161, -10.395584, -47.240902), (15.113212, -10.395584, -46.513683), (17.526838, -10.395584, -45.658974), (19.892424, -10.395584, -44.679115), (22.203485, -10.395584, -43.576794), (24.45369, -10.395584, -42.355034), (26.636868, -10.395584, -41.01718), (28.747036, -10.395584, -39.566902), (30.778412, -10.395584, -38.00817), (32.725426, -10.395584, -36.34527), (34.58274, -10.395584, -34.58274), (36.34527, -10.395584, -32.725426), (38.00817, -10.395584, -30.778412), (39.566902, -10.395584, -28.747036), (41.01718, -10.395584, -26.636868), (42.355034, -10.395584, -24.45369), (43.576794, -10.395584, -22.203485), (44.679115, -10.395584, -19.892424), (45.658974, -10.395584, -17.526838), (46.513683, -10.395584, -15.113212), (47.240902, -10.395584, -12.658161), (47.83864, -10.395584, -10.168416), (48.30525, -10.395584, -7.6507998), (48.63946, -10.395584, -5.112213), (48.840355, -10.395584, -2.5596144), (49.38442, -7.8217235, 0), (49.31674, -7.8217235, 2.5845807), (49.113884, -7.8217235, 5.1620774), (48.776413, -7.8217235, 7.725425), (48.30525, -7.8217235, 10.267597), (47.701683, -7.8217235, 12.781628), (46.967373, -7.8217235, 15.260624), (46.104324, -7.8217235, 17.697792), (45.11491, -7.8217235, 20.086452), (44.00184, -7.8217235, 22.420055), (42.768158, -7.8217235, 24.69221), (41.417255, -7.8217235, 26.89668), (39.95283, -7.8217235, 29.027431), (38.3789, -7.8217235, 31.07862), (36.699776, -7.8217235, 33.044624), (34.920055, -7.8217235, 34.920055), (33.044624, -7.8217235, 36.699776), (31.07862, -7.8217235, 38.3789), (29.027431, -7.8217235, 39.95283), (26.89668, -7.8217235, 41.417255), (24.69221, -7.8217235, 42.768158), (22.420055, -7.8217235, 44.00184), (20.086452, -7.8217235, 45.11491), (17.697792, -7.8217235, 46.104324), (15.260624, -7.8217235, 46.967373), (12.781628, -7.8217235, 47.701683), (10.267597, -7.8217235, 48.30525), (7.725425, -7.8217235, 48.776413), (5.1620774, -7.8217235, 49.113884), (2.5845807, -7.8217235, 49.31674), (3.0239235e-15, -7.8217235, 49.38442), (-2.5845807, -7.8217235, 49.31674), (-5.1620774, -7.8217235, 49.113884), (-7.725425, -7.8217235, 48.776413), (-10.267597, -7.8217235, 48.30525), (-12.781628, -7.8217235, 47.701683), (-15.260624, -7.8217235, 46.967373), (-17.697792, -7.8217235, 46.104324), (-20.086452, -7.8217235, 45.11491), (-22.420055, -7.8217235, 44.00184), (-24.69221, -7.8217235, 42.768158), (-26.89668, -7.8217235, 41.417255), (-29.027431, -7.8217235, 39.95283), (-31.07862, -7.8217235, 38.3789), (-33.044624, -7.8217235, 36.699776), (-34.920055, -7.8217235, 34.920055), (-36.699776, -7.8217235, 33.044624), (-38.3789, -7.8217235, 31.07862), (-39.95283, -7.8217235, 29.027431), (-41.417255, -7.8217235, 26.89668), (-42.768158, -7.8217235, 24.69221), (-44.00184, -7.8217235, 22.420055), (-45.11491, -7.8217235, 20.086452), (-46.104324, -7.8217235, 17.697792), (-46.967373, -7.8217235, 15.260624), (-47.701683, -7.8217235, 12.781628), (-48.30525, -7.8217235, 10.267597), (-48.776413, -7.8217235, 7.725425), (-49.113884, -7.8217235, 5.1620774), (-49.31674, -7.8217235, 2.5845807), (-49.38442, -7.8217235, 6.047847e-15), (-49.31674, -7.8217235, -2.5845807), (-49.113884, -7.8217235, -5.1620774), (-48.776413, -7.8217235, -7.725425), (-48.30525, -7.8217235, -10.267597), (-47.701683, -7.8217235, -12.781628), (-46.967373, -7.8217235, -15.260624), (-46.104324, -7.8217235, -17.697792), (-45.11491, -7.8217235, -20.086452), (-44.00184, -7.8217235, -22.420055), (-42.768158, -7.8217235, -24.69221), (-41.417255, -7.8217235, -26.89668), (-39.95283, -7.8217235, -29.027431), (-38.3789, -7.8217235, -31.07862), (-36.699776, -7.8217235, -33.044624), (-34.920055, -7.8217235, -34.920055), (-33.044624, -7.8217235, -36.699776), (-31.07862, -7.8217235, -38.3789), (-29.027431, -7.8217235, -39.95283), (-26.89668, -7.8217235, -41.417255), (-24.69221, -7.8217235, -42.768158), (-22.420055, -7.8217235, -44.00184), (-20.086452, -7.8217235, -45.11491), (-17.697792, -7.8217235, -46.104324), (-15.260624, -7.8217235, -46.967373), (-12.781628, -7.8217235, -47.701683), (-10.267597, -7.8217235, -48.30525), (-7.725425, -7.8217235, -48.776413), (-5.1620774, -7.8217235, -49.113884), (-2.5845807, -7.8217235, -49.31674), (-9.07177e-15, -7.8217235, -49.38442), (2.5845807, -7.8217235, -49.31674), (5.1620774, -7.8217235, -49.113884), (7.725425, -7.8217235, -48.776413), (10.267597, -7.8217235, -48.30525), (12.781628, -7.8217235, -47.701683), (15.260624, -7.8217235, -46.967373), (17.697792, -7.8217235, -46.104324), (20.086452, -7.8217235, -45.11491), (22.420055, -7.8217235, -44.00184), (24.69221, -7.8217235, -42.768158), (26.89668, -7.8217235, -41.417255), (29.027431, -7.8217235, -39.95283), (31.07862, -7.8217235, -38.3789), (33.044624, -7.8217235, -36.699776), (34.920055, -7.8217235, -34.920055), (36.699776, -7.8217235, -33.044624), (38.3789, -7.8217235, -31.07862), (39.95283, -7.8217235, -29.027431), (41.417255, -7.8217235, -26.89668), (42.768158, -7.8217235, -24.69221), (44.00184, -7.8217235, -22.420055), (45.11491, -7.8217235, -20.086452), (46.104324, -7.8217235, -17.697792), (46.967373, -7.8217235, -15.260624), (47.701683, -7.8217235, -12.781628), (48.30525, -7.8217235, -10.267597), (48.776413, -7.8217235, -7.725425), (49.113884, -7.8217235, -5.1620774), (49.31674, -7.8217235, -2.5845807), (49.726093, -5.2264233, 0), (49.657948, -5.2264233, 2.6024628), (49.45369, -5.2264233, 5.197792), (49.113884, -5.2264233, 7.778875), (48.63946, -5.2264233, 10.338636), (48.03172, -5.2264233, 12.87006), (47.292328, -5.2264233, 15.366208), (46.42331, -5.2264233, 17.820238), (45.427048, -5.2264233, 20.225426), (44.306274, -5.2264233, 22.575174), (43.06406, -5.2264233, 24.863047), (41.70381, -5.2264233, 27.082773), (40.229256, -5.2264233, 29.228266), (38.644432, -5.2264233, 31.293646), (36.95369, -5.2264233, 33.27325), (35.16166, -5.2264233, 35.16166), (33.27325, -5.2264233, 36.95369), (31.293646, -5.2264233, 38.644432), (29.228266, -5.2264233, 40.229256), (27.082773, -5.2264233, 41.70381), (24.863047, -5.2264233, 43.06406), (22.575174, -5.2264233, 44.306274), (20.225426, -5.2264233, 45.427048), (17.820238, -5.2264233, 46.42331), (15.366208, -5.2264233, 47.292328), (12.87006, -5.2264233, 48.03172), (10.338636, -5.2264233, 48.63946), (7.778875, -5.2264233, 49.113884), (5.197792, -5.2264233, 49.45369), (2.6024628, -5.2264233, 49.657948), (3.0448452e-15, -5.2264233, 49.726093), (-2.6024628, -5.2264233, 49.657948), (-5.197792, -5.2264233, 49.45369), (-7.778875, -5.2264233, 49.113884), (-10.338636, -5.2264233, 48.63946), (-12.87006, -5.2264233, 48.03172), (-15.366208, -5.2264233, 47.292328), (-17.820238, -5.2264233, 46.42331), (-20.225426, -5.2264233, 45.427048), (-22.575174, -5.2264233, 44.306274), (-24.863047, -5.2264233, 43.06406), (-27.082773, -5.2264233, 41.70381), (-29.228266, -5.2264233, 40.229256), (-31.293646, -5.2264233, 38.644432), (-33.27325, -5.2264233, 36.95369), (-35.16166, -5.2264233, 35.16166), (-36.95369, -5.2264233, 33.27325), (-38.644432, -5.2264233, 31.293646), (-40.229256, -5.2264233, 29.228266), (-41.70381, -5.2264233, 27.082773), (-43.06406, -5.2264233, 24.863047), (-44.306274, -5.2264233, 22.575174), (-45.427048, -5.2264233, 20.225426), (-46.42331, -5.2264233, 17.820238), (-47.292328, -5.2264233, 15.366208), (-48.03172, -5.2264233, 12.87006), (-48.63946, -5.2264233, 10.338636), (-49.113884, -5.2264233, 7.778875), (-49.45369, -5.2264233, 5.197792), (-49.657948, -5.2264233, 2.6024628), (-49.726093, -5.2264233, 6.0896904e-15), (-49.657948, -5.2264233, -2.6024628), (-49.45369, -5.2264233, -5.197792), (-49.113884, -5.2264233, -7.778875), (-48.63946, -5.2264233, -10.338636), (-48.03172, -5.2264233, -12.87006), (-47.292328, -5.2264233, -15.366208), (-46.42331, -5.2264233, -17.820238), (-45.427048, -5.2264233, -20.225426), (-44.306274, -5.2264233, -22.575174), (-43.06406, -5.2264233, -24.863047), (-41.70381, -5.2264233, -27.082773), (-40.229256, -5.2264233, -29.228266), (-38.644432, -5.2264233, -31.293646), (-36.95369, -5.2264233, -33.27325), (-35.16166, -5.2264233, -35.16166), (-33.27325, -5.2264233, -36.95369), (-31.293646, -5.2264233, -38.644432), (-29.228266, -5.2264233, -40.229256), (-27.082773, -5.2264233, -41.70381), (-24.863047, -5.2264233, -43.06406), (-22.575174, -5.2264233, -44.306274), (-20.225426, -5.2264233, -45.427048), (-17.820238, -5.2264233, -46.42331), (-15.366208, -5.2264233, -47.292328), (-12.87006, -5.2264233, -48.03172), (-10.338636, -5.2264233, -48.63946), (-7.778875, -5.2264233, -49.113884), (-5.197792, -5.2264233, -49.45369), (-2.6024628, -5.2264233, -49.657948), (-9.1345354e-15, -5.2264233, -49.726093), (2.6024628, -5.2264233, -49.657948), (5.197792, -5.2264233, -49.45369), (7.778875, -5.2264233, -49.113884), (10.338636, -5.2264233, -48.63946), (12.87006, -5.2264233, -48.03172), (15.366208, -5.2264233, -47.292328), (17.820238, -5.2264233, -46.42331), (20.225426, -5.2264233, -45.427048), (22.575174, -5.2264233, -44.306274), (24.863047, -5.2264233, -43.06406), (27.082773, -5.2264233, -41.70381), (29.228266, -5.2264233, -40.229256), (31.293646, -5.2264233, -38.644432), (33.27325, -5.2264233, -36.95369), (35.16166, -5.2264233, -35.16166), (36.95369, -5.2264233, -33.27325), (38.644432, -5.2264233, -31.293646), (40.229256, -5.2264233, -29.228266), (41.70381, -5.2264233, -27.082773), (43.06406, -5.2264233, -24.863047), (44.306274, -5.2264233, -22.575174), (45.427048, -5.2264233, -20.225426), (46.42331, -5.2264233, -17.820238), (47.292328, -5.2264233, -15.366208), (48.03172, -5.2264233, -12.87006), (48.63946, -5.2264233, -10.338636), (49.113884, -5.2264233, -7.778875), (49.45369, -5.2264233, -5.197792), (49.657948, -5.2264233, -2.6024628), (49.931477, -2.616798, 0), (49.86305, -2.616798, 2.6132116), (49.657948, -2.616798, 5.2192607), (49.31674, -2.616798, 7.8110037), (48.840355, -2.616798, 10.381338), (48.230103, -2.616798, 12.923217), (47.487656, -2.616798, 15.429675), (46.615047, -2.616798, 17.89384), (45.614674, -2.616798, 20.308962), (44.489273, -2.616798, 22.668417), (43.24193, -2.616798, 24.965738), (41.87606, -2.616798, 27.194632), (40.395412, -2.616798, 29.348986), (38.804047, -2.616798, 31.422897), (37.10632, -2.616798, 33.41068), (35.306885, -2.616798, 35.306885), (33.41068, -2.616798, 37.10632), (31.422897, -2.616798, 38.804047), (29.348986, -2.616798, 40.395412), (27.194632, -2.616798, 41.87606), (24.965738, -2.616798, 43.24193), (22.668417, -2.616798, 44.489273), (20.308962, -2.616798, 45.614674), (17.89384, -2.616798, 46.615047), (15.429675, -2.616798, 47.487656), (12.923217, -2.616798, 48.230103), (10.381338, -2.616798, 48.840355), (7.8110037, -2.616798, 49.31674), (5.2192607, -2.616798, 49.657948), (2.6132116, -2.616798, 49.86305), (3.0574211e-15, -2.616798, 49.931477), (-2.6132116, -2.616798, 49.86305), (-5.2192607, -2.616798, 49.657948), (-7.8110037, -2.616798, 49.31674), (-10.381338, -2.616798, 48.840355), (-12.923217, -2.616798, 48.230103), (-15.429675, -2.616798, 47.487656), (-17.89384, -2.616798, 46.615047), (-20.308962, -2.616798, 45.614674), (-22.668417, -2.616798, 44.489273), (-24.965738, -2.616798, 43.24193), (-27.194632, -2.616798, 41.87606), (-29.348986, -2.616798, 40.395412), (-31.422897, -2.616798, 38.804047), (-33.41068, -2.616798, 37.10632), (-35.306885, -2.616798, 35.306885), (-37.10632, -2.616798, 33.41068), (-38.804047, -2.616798, 31.422897), (-40.395412, -2.616798, 29.348986), (-41.87606, -2.616798, 27.194632), (-43.24193, -2.616798, 24.965738), (-44.489273, -2.616798, 22.668417), (-45.614674, -2.616798, 20.308962), (-46.615047, -2.616798, 17.89384), (-47.487656, -2.616798, 15.429675), (-48.230103, -2.616798, 12.923217), (-48.840355, -2.616798, 10.381338), (-49.31674, -2.616798, 7.8110037), (-49.657948, -2.616798, 5.2192607), (-49.86305, -2.616798, 2.6132116), (-49.931477, -2.616798, 6.1148422e-15), (-49.86305, -2.616798, -2.6132116), (-49.657948, -2.616798, -5.2192607), (-49.31674, -2.616798, -7.8110037), (-48.840355, -2.616798, -10.381338), (-48.230103, -2.616798, -12.923217), (-47.487656, -2.616798, -15.429675), (-46.615047, -2.616798, -17.89384), (-45.614674, -2.616798, -20.308962), (-44.489273, -2.616798, -22.668417), (-43.24193, -2.616798, -24.965738), (-41.87606, -2.616798, -27.194632), (-40.395412, -2.616798, -29.348986), (-38.804047, -2.616798, -31.422897), (-37.10632, -2.616798, -33.41068), (-35.306885, -2.616798, -35.306885), (-33.41068, -2.616798, -37.10632), (-31.422897, -2.616798, -38.804047), (-29.348986, -2.616798, -40.395412), (-27.194632, -2.616798, -41.87606), (-24.965738, -2.616798, -43.24193), (-22.668417, -2.616798, -44.489273), (-20.308962, -2.616798, -45.614674), (-17.89384, -2.616798, -46.615047), (-15.429675, -2.616798, -47.487656), (-12.923217, -2.616798, -48.230103), (-10.381338, -2.616798, -48.840355), (-7.8110037, -2.616798, -49.31674), (-5.2192607, -2.616798, -49.657948), (-2.6132116, -2.616798, -49.86305), (-9.172263e-15, -2.616798, -49.931477), (2.6132116, -2.616798, -49.86305), (5.2192607, -2.616798, -49.657948), (7.8110037, -2.616798, -49.31674), (10.381338, -2.616798, -48.840355), (12.923217, -2.616798, -48.230103), (15.429675, -2.616798, -47.487656), (17.89384, -2.616798, -46.615047), (20.308962, -2.616798, -45.614674), (22.668417, -2.616798, -44.489273), (24.965738, -2.616798, -43.24193), (27.194632, -2.616798, -41.87606), (29.348986, -2.616798, -40.395412), (31.422897, -2.616798, -38.804047), (33.41068, -2.616798, -37.10632), (35.306885, -2.616798, -35.306885), (37.10632, -2.616798, -33.41068), (38.804047, -2.616798, -31.422897), (40.395412, -2.616798, -29.348986), (41.87606, -2.616798, -27.194632), (43.24193, -2.616798, -24.965738), (44.489273, -2.616798, -22.668417), (45.614674, -2.616798, -20.308962), (46.615047, -2.616798, -17.89384), (47.487656, -2.616798, -15.429675), (48.230103, -2.616798, -12.923217), (48.840355, -2.616798, -10.381338), (49.31674, -2.616798, -7.8110037), (49.657948, -2.616798, -5.2192607), (49.86305, -2.616798, -2.6132116), (50, 0, 0), (49.931477, 0, 2.616798), (49.726093, 0, 5.2264233), (49.38442, 0, 7.8217235), (48.90738, 0, 10.395584), (48.29629, 0, 12.940952), (47.552826, 0, 15.45085), (46.67902, 0, 17.918398), (45.677273, 0, 20.336832), (44.550327, 0, 22.699526), (43.30127, 0, 25), (41.93353, 0, 27.231953), (40.45085, 0, 29.389263), (38.8573, 0, 31.466019), (37.15724, 0, 33.45653), (35.35534, 0, 35.35534), (33.45653, 0, 37.15724), (31.466019, 0, 38.8573), (29.389263, 0, 40.45085), (27.231953, 0, 41.93353), (25, 0, 43.30127), (22.699526, 0, 44.550327), (20.336832, 0, 45.677273), (17.918398, 0, 46.67902), (15.45085, 0, 47.552826), (12.940952, 0, 48.29629), (10.395584, 0, 48.90738), (7.8217235, 0, 49.38442), (5.2264233, 0, 49.726093), (2.616798, 0, 49.931477), (3.0616169e-15, 0, 50), (-2.616798, 0, 49.931477), (-5.2264233, 0, 49.726093), (-7.8217235, 0, 49.38442), (-10.395584, 0, 48.90738), (-12.940952, 0, 48.29629), (-15.45085, 0, 47.552826), (-17.918398, 0, 46.67902), (-20.336832, 0, 45.677273), (-22.699526, 0, 44.550327), (-25, 0, 43.30127), (-27.231953, 0, 41.93353), (-29.389263, 0, 40.45085), (-31.466019, 0, 38.8573), (-33.45653, 0, 37.15724), (-35.35534, 0, 35.35534), (-37.15724, 0, 33.45653), (-38.8573, 0, 31.466019), (-40.45085, 0, 29.389263), (-41.93353, 0, 27.231953), (-43.30127, 0, 25), (-44.550327, 0, 22.699526), (-45.677273, 0, 20.336832), (-46.67902, 0, 17.918398), (-47.552826, 0, 15.45085), (-48.29629, 0, 12.940952), (-48.90738, 0, 10.395584), (-49.38442, 0, 7.8217235), (-49.726093, 0, 5.2264233), (-49.931477, 0, 2.616798), (-50, 0, 6.1232338e-15), (-49.931477, 0, -2.616798), (-49.726093, 0, -5.2264233), (-49.38442, 0, -7.8217235), (-48.90738, 0, -10.395584), (-48.29629, 0, -12.940952), (-47.552826, 0, -15.45085), (-46.67902, 0, -17.918398), (-45.677273, 0, -20.336832), (-44.550327, 0, -22.699526), (-43.30127, 0, -25), (-41.93353, 0, -27.231953), (-40.45085, 0, -29.389263), (-38.8573, 0, -31.466019), (-37.15724, 0, -33.45653), (-35.35534, 0, -35.35534), (-33.45653, 0, -37.15724), (-31.466019, 0, -38.8573), (-29.389263, 0, -40.45085), (-27.231953, 0, -41.93353), (-25, 0, -43.30127), (-22.699526, 0, -44.550327), (-20.336832, 0, -45.677273), (-17.918398, 0, -46.67902), (-15.45085, 0, -47.552826), (-12.940952, 0, -48.29629), (-10.395584, 0, -48.90738), (-7.8217235, 0, -49.38442), (-5.2264233, 0, -49.726093), (-2.616798, 0, -49.931477), (-9.184851e-15, 0, -50), (2.616798, 0, -49.931477), (5.2264233, 0, -49.726093), (7.8217235, 0, -49.38442), (10.395584, 0, -48.90738), (12.940952, 0, -48.29629), (15.45085, 0, -47.552826), (17.918398, 0, -46.67902), (20.336832, 0, -45.677273), (22.699526, 0, -44.550327), (25, 0, -43.30127), (27.231953, 0, -41.93353), (29.389263, 0, -40.45085), (31.466019, 0, -38.8573), (33.45653, 0, -37.15724), (35.35534, 0, -35.35534), (37.15724, 0, -33.45653), (38.8573, 0, -31.466019), (40.45085, 0, -29.389263), (41.93353, 0, -27.231953), (43.30127, 0, -25), (44.550327, 0, -22.699526), (45.677273, 0, -20.336832), (46.67902, 0, -17.918398), (47.552826, 0, -15.45085), (48.29629, 0, -12.940952), (48.90738, 0, -10.395584), (49.38442, 0, -7.8217235), (49.726093, 0, -5.2264233), (49.931477, 0, -2.616798), (49.931477, 2.616798, 0), (49.86305, 2.616798, 2.6132116), (49.657948, 2.616798, 5.2192607), (49.31674, 2.616798, 7.8110037), (48.840355, 2.616798, 10.381338), (48.230103, 2.616798, 12.923217), (47.487656, 2.616798, 15.429675), (46.615047, 2.616798, 17.89384), (45.614674, 2.616798, 20.308962), (44.489273, 2.616798, 22.668417), (43.24193, 2.616798, 24.965738), (41.87606, 2.616798, 27.194632), (40.395412, 2.616798, 29.348986), (38.804047, 2.616798, 31.422897), (37.10632, 2.616798, 33.41068), (35.306885, 2.616798, 35.306885), (33.41068, 2.616798, 37.10632), (31.422897, 2.616798, 38.804047), (29.348986, 2.616798, 40.395412), (27.194632, 2.616798, 41.87606), (24.965738, 2.616798, 43.24193), (22.668417, 2.616798, 44.489273), (20.308962, 2.616798, 45.614674), (17.89384, 2.616798, 46.615047), (15.429675, 2.616798, 47.487656), (12.923217, 2.616798, 48.230103), (10.381338, 2.616798, 48.840355), (7.8110037, 2.616798, 49.31674), (5.2192607, 2.616798, 49.657948), (2.6132116, 2.616798, 49.86305), (3.0574211e-15, 2.616798, 49.931477), (-2.6132116, 2.616798, 49.86305), (-5.2192607, 2.616798, 49.657948), (-7.8110037, 2.616798, 49.31674), (-10.381338, 2.616798, 48.840355), (-12.923217, 2.616798, 48.230103), (-15.429675, 2.616798, 47.487656), (-17.89384, 2.616798, 46.615047), (-20.308962, 2.616798, 45.614674), (-22.668417, 2.616798, 44.489273), (-24.965738, 2.616798, 43.24193), (-27.194632, 2.616798, 41.87606), (-29.348986, 2.616798, 40.395412), (-31.422897, 2.616798, 38.804047), (-33.41068, 2.616798, 37.10632), (-35.306885, 2.616798, 35.306885), (-37.10632, 2.616798, 33.41068), (-38.804047, 2.616798, 31.422897), (-40.395412, 2.616798, 29.348986), (-41.87606, 2.616798, 27.194632), (-43.24193, 2.616798, 24.965738), (-44.489273, 2.616798, 22.668417), (-45.614674, 2.616798, 20.308962), (-46.615047, 2.616798, 17.89384), (-47.487656, 2.616798, 15.429675), (-48.230103, 2.616798, 12.923217), (-48.840355, 2.616798, 10.381338), (-49.31674, 2.616798, 7.8110037), (-49.657948, 2.616798, 5.2192607), (-49.86305, 2.616798, 2.6132116), (-49.931477, 2.616798, 6.1148422e-15), (-49.86305, 2.616798, -2.6132116), (-49.657948, 2.616798, -5.2192607), (-49.31674, 2.616798, -7.8110037), (-48.840355, 2.616798, -10.381338), (-48.230103, 2.616798, -12.923217), (-47.487656, 2.616798, -15.429675), (-46.615047, 2.616798, -17.89384), (-45.614674, 2.616798, -20.308962), (-44.489273, 2.616798, -22.668417), (-43.24193, 2.616798, -24.965738), (-41.87606, 2.616798, -27.194632), (-40.395412, 2.616798, -29.348986), (-38.804047, 2.616798, -31.422897), (-37.10632, 2.616798, -33.41068), (-35.306885, 2.616798, -35.306885), (-33.41068, 2.616798, -37.10632), (-31.422897, 2.616798, -38.804047), (-29.348986, 2.616798, -40.395412), (-27.194632, 2.616798, -41.87606), (-24.965738, 2.616798, -43.24193), (-22.668417, 2.616798, -44.489273), (-20.308962, 2.616798, -45.614674), (-17.89384, 2.616798, -46.615047), (-15.429675, 2.616798, -47.487656), (-12.923217, 2.616798, -48.230103), (-10.381338, 2.616798, -48.840355), (-7.8110037, 2.616798, -49.31674), (-5.2192607, 2.616798, -49.657948), (-2.6132116, 2.616798, -49.86305), (-9.172263e-15, 2.616798, -49.931477), (2.6132116, 2.616798, -49.86305), (5.2192607, 2.616798, -49.657948), (7.8110037, 2.616798, -49.31674), (10.381338, 2.616798, -48.840355), (12.923217, 2.616798, -48.230103), (15.429675, 2.616798, -47.487656), (17.89384, 2.616798, -46.615047), (20.308962, 2.616798, -45.614674), (22.668417, 2.616798, -44.489273), (24.965738, 2.616798, -43.24193), (27.194632, 2.616798, -41.87606), (29.348986, 2.616798, -40.395412), (31.422897, 2.616798, -38.804047), (33.41068, 2.616798, -37.10632), (35.306885, 2.616798, -35.306885), (37.10632, 2.616798, -33.41068), (38.804047, 2.616798, -31.422897), (40.395412, 2.616798, -29.348986), (41.87606, 2.616798, -27.194632), (43.24193, 2.616798, -24.965738), (44.489273, 2.616798, -22.668417), (45.614674, 2.616798, -20.308962), (46.615047, 2.616798, -17.89384), (47.487656, 2.616798, -15.429675), (48.230103, 2.616798, -12.923217), (48.840355, 2.616798, -10.381338), (49.31674, 2.616798, -7.8110037), (49.657948, 2.616798, -5.2192607), (49.86305, 2.616798, -2.6132116), (49.726093, 5.2264233, 0), (49.657948, 5.2264233, 2.6024628), (49.45369, 5.2264233, 5.197792), (49.113884, 5.2264233, 7.778875), (48.63946, 5.2264233, 10.338636), (48.03172, 5.2264233, 12.87006), (47.292328, 5.2264233, 15.366208), (46.42331, 5.2264233, 17.820238), (45.427048, 5.2264233, 20.225426), (44.306274, 5.2264233, 22.575174), (43.06406, 5.2264233, 24.863047), (41.70381, 5.2264233, 27.082773), (40.229256, 5.2264233, 29.228266), (38.644432, 5.2264233, 31.293646), (36.95369, 5.2264233, 33.27325), (35.16166, 5.2264233, 35.16166), (33.27325, 5.2264233, 36.95369), (31.293646, 5.2264233, 38.644432), (29.228266, 5.2264233, 40.229256), (27.082773, 5.2264233, 41.70381), (24.863047, 5.2264233, 43.06406), (22.575174, 5.2264233, 44.306274), (20.225426, 5.2264233, 45.427048), (17.820238, 5.2264233, 46.42331), (15.366208, 5.2264233, 47.292328), (12.87006, 5.2264233, 48.03172), (10.338636, 5.2264233, 48.63946), (7.778875, 5.2264233, 49.113884), (5.197792, 5.2264233, 49.45369), (2.6024628, 5.2264233, 49.657948), (3.0448452e-15, 5.2264233, 49.726093), (-2.6024628, 5.2264233, 49.657948), (-5.197792, 5.2264233, 49.45369), (-7.778875, 5.2264233, 49.113884), (-10.338636, 5.2264233, 48.63946), (-12.87006, 5.2264233, 48.03172), (-15.366208, 5.2264233, 47.292328), (-17.820238, 5.2264233, 46.42331), (-20.225426, 5.2264233, 45.427048), (-22.575174, 5.2264233, 44.306274), (-24.863047, 5.2264233, 43.06406), (-27.082773, 5.2264233, 41.70381), (-29.228266, 5.2264233, 40.229256), (-31.293646, 5.2264233, 38.644432), (-33.27325, 5.2264233, 36.95369), (-35.16166, 5.2264233, 35.16166), (-36.95369, 5.2264233, 33.27325), (-38.644432, 5.2264233, 31.293646), (-40.229256, 5.2264233, 29.228266), (-41.70381, 5.2264233, 27.082773), (-43.06406, 5.2264233, 24.863047), (-44.306274, 5.2264233, 22.575174), (-45.427048, 5.2264233, 20.225426), (-46.42331, 5.2264233, 17.820238), (-47.292328, 5.2264233, 15.366208), (-48.03172, 5.2264233, 12.87006), (-48.63946, 5.2264233, 10.338636), (-49.113884, 5.2264233, 7.778875), (-49.45369, 5.2264233, 5.197792), (-49.657948, 5.2264233, 2.6024628), (-49.726093, 5.2264233, 6.0896904e-15), (-49.657948, 5.2264233, -2.6024628), (-49.45369, 5.2264233, -5.197792), (-49.113884, 5.2264233, -7.778875), (-48.63946, 5.2264233, -10.338636), (-48.03172, 5.2264233, -12.87006), (-47.292328, 5.2264233, -15.366208), (-46.42331, 5.2264233, -17.820238), (-45.427048, 5.2264233, -20.225426), (-44.306274, 5.2264233, -22.575174), (-43.06406, 5.2264233, -24.863047), (-41.70381, 5.2264233, -27.082773), (-40.229256, 5.2264233, -29.228266), (-38.644432, 5.2264233, -31.293646), (-36.95369, 5.2264233, -33.27325), (-35.16166, 5.2264233, -35.16166), (-33.27325, 5.2264233, -36.95369), (-31.293646, 5.2264233, -38.644432), (-29.228266, 5.2264233, -40.229256), (-27.082773, 5.2264233, -41.70381), (-24.863047, 5.2264233, -43.06406), (-22.575174, 5.2264233, -44.306274), (-20.225426, 5.2264233, -45.427048), (-17.820238, 5.2264233, -46.42331), (-15.366208, 5.2264233, -47.292328), (-12.87006, 5.2264233, -48.03172), (-10.338636, 5.2264233, -48.63946), (-7.778875, 5.2264233, -49.113884), (-5.197792, 5.2264233, -49.45369), (-2.6024628, 5.2264233, -49.657948), (-9.1345354e-15, 5.2264233, -49.726093), (2.6024628, 5.2264233, -49.657948), (5.197792, 5.2264233, -49.45369), (7.778875, 5.2264233, -49.113884), (10.338636, 5.2264233, -48.63946), (12.87006, 5.2264233, -48.03172), (15.366208, 5.2264233, -47.292328), (17.820238, 5.2264233, -46.42331), (20.225426, 5.2264233, -45.427048), (22.575174, 5.2264233, -44.306274), (24.863047, 5.2264233, -43.06406), (27.082773, 5.2264233, -41.70381), (29.228266, 5.2264233, -40.229256), (31.293646, 5.2264233, -38.644432), (33.27325, 5.2264233, -36.95369), (35.16166, 5.2264233, -35.16166), (36.95369, 5.2264233, -33.27325), (38.644432, 5.2264233, -31.293646), (40.229256, 5.2264233, -29.228266), (41.70381, 5.2264233, -27.082773), (43.06406, 5.2264233, -24.863047), (44.306274, 5.2264233, -22.575174), (45.427048, 5.2264233, -20.225426), (46.42331, 5.2264233, -17.820238), (47.292328, 5.2264233, -15.366208), (48.03172, 5.2264233, -12.87006), (48.63946, 5.2264233, -10.338636), (49.113884, 5.2264233, -7.778875), (49.45369, 5.2264233, -5.197792), (49.657948, 5.2264233, -2.6024628), (49.38442, 7.8217235, 0), (49.31674, 7.8217235, 2.5845807), (49.113884, 7.8217235, 5.1620774), (48.776413, 7.8217235, 7.725425), (48.30525, 7.8217235, 10.267597), (47.701683, 7.8217235, 12.781628), (46.967373, 7.8217235, 15.260624), (46.104324, 7.8217235, 17.697792), (45.11491, 7.8217235, 20.086452), (44.00184, 7.8217235, 22.420055), (42.768158, 7.8217235, 24.69221), (41.417255, 7.8217235, 26.89668), (39.95283, 7.8217235, 29.027431), (38.3789, 7.8217235, 31.07862), (36.699776, 7.8217235, 33.044624), (34.920055, 7.8217235, 34.920055), (33.044624, 7.8217235, 36.699776), (31.07862, 7.8217235, 38.3789), (29.027431, 7.8217235, 39.95283), (26.89668, 7.8217235, 41.417255), (24.69221, 7.8217235, 42.768158), (22.420055, 7.8217235, 44.00184), (20.086452, 7.8217235, 45.11491), (17.697792, 7.8217235, 46.104324), (15.260624, 7.8217235, 46.967373), (12.781628, 7.8217235, 47.701683), (10.267597, 7.8217235, 48.30525), (7.725425, 7.8217235, 48.776413), (5.1620774, 7.8217235, 49.113884), (2.5845807, 7.8217235, 49.31674), (3.0239235e-15, 7.8217235, 49.38442), (-2.5845807, 7.8217235, 49.31674), (-5.1620774, 7.8217235, 49.113884), (-7.725425, 7.8217235, 48.776413), (-10.267597, 7.8217235, 48.30525), (-12.781628, 7.8217235, 47.701683), (-15.260624, 7.8217235, 46.967373), (-17.697792, 7.8217235, 46.104324), (-20.086452, 7.8217235, 45.11491), (-22.420055, 7.8217235, 44.00184), (-24.69221, 7.8217235, 42.768158), (-26.89668, 7.8217235, 41.417255), (-29.027431, 7.8217235, 39.95283), (-31.07862, 7.8217235, 38.3789), (-33.044624, 7.8217235, 36.699776), (-34.920055, 7.8217235, 34.920055), (-36.699776, 7.8217235, 33.044624), (-38.3789, 7.8217235, 31.07862), (-39.95283, 7.8217235, 29.027431), (-41.417255, 7.8217235, 26.89668), (-42.768158, 7.8217235, 24.69221), (-44.00184, 7.8217235, 22.420055), (-45.11491, 7.8217235, 20.086452), (-46.104324, 7.8217235, 17.697792), (-46.967373, 7.8217235, 15.260624), (-47.701683, 7.8217235, 12.781628), (-48.30525, 7.8217235, 10.267597), (-48.776413, 7.8217235, 7.725425), (-49.113884, 7.8217235, 5.1620774), (-49.31674, 7.8217235, 2.5845807), (-49.38442, 7.8217235, 6.047847e-15), (-49.31674, 7.8217235, -2.5845807), (-49.113884, 7.8217235, -5.1620774), (-48.776413, 7.8217235, -7.725425), (-48.30525, 7.8217235, -10.267597), (-47.701683, 7.8217235, -12.781628), (-46.967373, 7.8217235, -15.260624), (-46.104324, 7.8217235, -17.697792), (-45.11491, 7.8217235, -20.086452), (-44.00184, 7.8217235, -22.420055), (-42.768158, 7.8217235, -24.69221), (-41.417255, 7.8217235, -26.89668), (-39.95283, 7.8217235, -29.027431), (-38.3789, 7.8217235, -31.07862), (-36.699776, 7.8217235, -33.044624), (-34.920055, 7.8217235, -34.920055), (-33.044624, 7.8217235, -36.699776), (-31.07862, 7.8217235, -38.3789), (-29.027431, 7.8217235, -39.95283), (-26.89668, 7.8217235, -41.417255), (-24.69221, 7.8217235, -42.768158), (-22.420055, 7.8217235, -44.00184), (-20.086452, 7.8217235, -45.11491), (-17.697792, 7.8217235, -46.104324), (-15.260624, 7.8217235, -46.967373), (-12.781628, 7.8217235, -47.701683), (-10.267597, 7.8217235, -48.30525), (-7.725425, 7.8217235, -48.776413), (-5.1620774, 7.8217235, -49.113884), (-2.5845807, 7.8217235, -49.31674), (-9.07177e-15, 7.8217235, -49.38442), (2.5845807, 7.8217235, -49.31674), (5.1620774, 7.8217235, -49.113884), (7.725425, 7.8217235, -48.776413), (10.267597, 7.8217235, -48.30525), (12.781628, 7.8217235, -47.701683), (15.260624, 7.8217235, -46.967373), (17.697792, 7.8217235, -46.104324), (20.086452, 7.8217235, -45.11491), (22.420055, 7.8217235, -44.00184), (24.69221, 7.8217235, -42.768158), (26.89668, 7.8217235, -41.417255), (29.027431, 7.8217235, -39.95283), (31.07862, 7.8217235, -38.3789), (33.044624, 7.8217235, -36.699776), (34.920055, 7.8217235, -34.920055), (36.699776, 7.8217235, -33.044624), (38.3789, 7.8217235, -31.07862), (39.95283, 7.8217235, -29.027431), (41.417255, 7.8217235, -26.89668), (42.768158, 7.8217235, -24.69221), (44.00184, 7.8217235, -22.420055), (45.11491, 7.8217235, -20.086452), (46.104324, 7.8217235, -17.697792), (46.967373, 7.8217235, -15.260624), (47.701683, 7.8217235, -12.781628), (48.30525, 7.8217235, -10.267597), (48.776413, 7.8217235, -7.725425), (49.113884, 7.8217235, -5.1620774), (49.31674, 7.8217235, -2.5845807), (48.90738, 10.395584, 0), (48.840355, 10.395584, 2.5596144), (48.63946, 10.395584, 5.112213), (48.30525, 10.395584, 7.6507998), (47.83864, 10.395584, 10.168416), (47.240902, 10.395584, 12.658161), (46.513683, 10.395584, 15.113212), (45.658974, 10.395584, 17.526838), (44.679115, 10.395584, 19.892424), (43.576794, 10.395584, 22.203485), (42.355034, 10.395584, 24.45369), (41.01718, 10.395584, 26.636868), (39.566902, 10.395584, 28.747036), (38.00817, 10.395584, 30.778412), (36.34527, 10.395584, 32.725426), (34.58274, 10.395584, 34.58274), (32.725426, 10.395584, 36.34527), (30.778412, 10.395584, 38.00817), (28.747036, 10.395584, 39.566902), (26.636868, 10.395584, 41.01718), (24.45369, 10.395584, 42.355034), (22.203485, 10.395584, 43.576794), (19.892424, 10.395584, 44.679115), (17.526838, 10.395584, 45.658974), (15.113212, 10.395584, 46.513683), (12.658161, 10.395584, 47.240902), (10.168416, 10.395584, 47.83864), (7.6507998, 10.395584, 48.30525), (5.112213, 10.395584, 48.63946), (2.5596144, 10.395584, 48.840355), (2.9947134e-15, 10.395584, 48.90738), (-2.5596144, 10.395584, 48.840355), (-5.112213, 10.395584, 48.63946), (-7.6507998, 10.395584, 48.30525), (-10.168416, 10.395584, 47.83864), (-12.658161, 10.395584, 47.240902), (-15.113212, 10.395584, 46.513683), (-17.526838, 10.395584, 45.658974), (-19.892424, 10.395584, 44.679115), (-22.203485, 10.395584, 43.576794), (-24.45369, 10.395584, 42.355034), (-26.636868, 10.395584, 41.01718), (-28.747036, 10.395584, 39.566902), (-30.778412, 10.395584, 38.00817), (-32.725426, 10.395584, 36.34527), (-34.58274, 10.395584, 34.58274), (-36.34527, 10.395584, 32.725426), (-38.00817, 10.395584, 30.778412), (-39.566902, 10.395584, 28.747036), (-41.01718, 10.395584, 26.636868), (-42.355034, 10.395584, 24.45369), (-43.576794, 10.395584, 22.203485), (-44.679115, 10.395584, 19.892424), (-45.658974, 10.395584, 17.526838), (-46.513683, 10.395584, 15.113212), (-47.240902, 10.395584, 12.658161), (-47.83864, 10.395584, 10.168416), (-48.30525, 10.395584, 7.6507998), (-48.63946, 10.395584, 5.112213), (-48.840355, 10.395584, 2.5596144), (-48.90738, 10.395584, 5.9894267e-15), (-48.840355, 10.395584, -2.5596144), (-48.63946, 10.395584, -5.112213), (-48.30525, 10.395584, -7.6507998), (-47.83864, 10.395584, -10.168416), (-47.240902, 10.395584, -12.658161), (-46.513683, 10.395584, -15.113212), (-45.658974, 10.395584, -17.526838), (-44.679115, 10.395584, -19.892424), (-43.576794, 10.395584, -22.203485), (-42.355034, 10.395584, -24.45369), (-41.01718, 10.395584, -26.636868), (-39.566902, 10.395584, -28.747036), (-38.00817, 10.395584, -30.778412), (-36.34527, 10.395584, -32.725426), (-34.58274, 10.395584, -34.58274), (-32.725426, 10.395584, -36.34527), (-30.778412, 10.395584, -38.00817), (-28.747036, 10.395584, -39.566902), (-26.636868, 10.395584, -41.01718), (-24.45369, 10.395584, -42.355034), (-22.203485, 10.395584, -43.576794), (-19.892424, 10.395584, -44.679115), (-17.526838, 10.395584, -45.658974), (-15.113212, 10.395584, -46.513683), (-12.658161, 10.395584, -47.240902), (-10.168416, 10.395584, -47.83864), (-7.6507998, 10.395584, -48.30525), (-5.112213, 10.395584, -48.63946), (-2.5596144, 10.395584, -48.840355), (-8.98414e-15, 10.395584, -48.90738), (2.5596144, 10.395584, -48.840355), (5.112213, 10.395584, -48.63946), (7.6507998, 10.395584, -48.30525), (10.168416, 10.395584, -47.83864), (12.658161, 10.395584, -47.240902), (15.113212, 10.395584, -46.513683), (17.526838, 10.395584, -45.658974), (19.892424, 10.395584, -44.679115), (22.203485, 10.395584, -43.576794), (24.45369, 10.395584, -42.355034), (26.636868, 10.395584, -41.01718), (28.747036, 10.395584, -39.566902), (30.778412, 10.395584, -38.00817), (32.725426, 10.395584, -36.34527), (34.58274, 10.395584, -34.58274), (36.34527, 10.395584, -32.725426), (38.00817, 10.395584, -30.778412), (39.566902, 10.395584, -28.747036), (41.01718, 10.395584, -26.636868), (42.355034, 10.395584, -24.45369), (43.576794, 10.395584, -22.203485), (44.679115, 10.395584, -19.892424), (45.658974, 10.395584, -17.526838), (46.513683, 10.395584, -15.113212), (47.240902, 10.395584, -12.658161), (47.83864, 10.395584, -10.168416), (48.30525, 10.395584, -7.6507998), (48.63946, 10.395584, -5.112213), (48.840355, 10.395584, -2.5596144), (48.29629, 12.940952, 0), (48.230103, 12.940952, 2.5276325), (48.03172, 12.940952, 5.048337), (47.701683, 12.940952, 7.5552044), (47.240902, 12.940952, 10.041364), (46.650635, 12.940952, 12.5), (45.932503, 12.940952, 14.924375), (45.08847, 12.940952, 17.307842), (44.120857, 12.940952, 19.643871), (43.03231, 12.940952, 21.926058), (41.825813, 12.940952, 24.148146), (40.504677, 12.940952, 26.304045), (39.07252, 12.940952, 28.387848), (37.533268, 12.940952, 30.39384), (35.89114, 12.940952, 32.31653), (34.150635, 12.940952, 34.150635), (32.31653, 12.940952, 35.89114), (30.39384, 12.940952, 37.533268), (28.387848, 12.940952, 39.07252), (26.304045, 12.940952, 40.504677), (24.148146, 12.940952, 41.825813), (21.926058, 12.940952, 43.03231), (19.643871, 12.940952, 44.120857), (17.307842, 12.940952, 45.08847), (14.924375, 12.940952, 45.932503), (12.5, 12.940952, 46.650635), (10.041364, 12.940952, 47.240902), (7.5552044, 12.940952, 47.701683), (5.048337, 12.940952, 48.03172), (2.5276325, 12.940952, 48.230103), (2.9572948e-15, 12.940952, 48.29629), (-2.5276325, 12.940952, 48.230103), (-5.048337, 12.940952, 48.03172), (-7.5552044, 12.940952, 47.701683), (-10.041364, 12.940952, 47.240902), (-12.5, 12.940952, 46.650635), (-14.924375, 12.940952, 45.932503), (-17.307842, 12.940952, 45.08847), (-19.643871, 12.940952, 44.120857), (-21.926058, 12.940952, 43.03231), (-24.148146, 12.940952, 41.825813), (-26.304045, 12.940952, 40.504677), (-28.387848, 12.940952, 39.07252), (-30.39384, 12.940952, 37.533268), (-32.31653, 12.940952, 35.89114), (-34.150635, 12.940952, 34.150635), (-35.89114, 12.940952, 32.31653), (-37.533268, 12.940952, 30.39384), (-39.07252, 12.940952, 28.387848), (-40.504677, 12.940952, 26.304045), (-41.825813, 12.940952, 24.148146), (-43.03231, 12.940952, 21.926058), (-44.120857, 12.940952, 19.643871), (-45.08847, 12.940952, 17.307842), (-45.932503, 12.940952, 14.924375), (-46.650635, 12.940952, 12.5), (-47.240902, 12.940952, 10.041364), (-47.701683, 12.940952, 7.5552044), (-48.03172, 12.940952, 5.048337), (-48.230103, 12.940952, 2.5276325), (-48.29629, 12.940952, 5.9145897e-15), (-48.230103, 12.940952, -2.5276325), (-48.03172, 12.940952, -5.048337), (-47.701683, 12.940952, -7.5552044), (-47.240902, 12.940952, -10.041364), (-46.650635, 12.940952, -12.5), (-45.932503, 12.940952, -14.924375), (-45.08847, 12.940952, -17.307842), (-44.120857, 12.940952, -19.643871), (-43.03231, 12.940952, -21.926058), (-41.825813, 12.940952, -24.148146), (-40.504677, 12.940952, -26.304045), (-39.07252, 12.940952, -28.387848), (-37.533268, 12.940952, -30.39384), (-35.89114, 12.940952, -32.31653), (-34.150635, 12.940952, -34.150635), (-32.31653, 12.940952, -35.89114), (-30.39384, 12.940952, -37.533268), (-28.387848, 12.940952, -39.07252), (-26.304045, 12.940952, -40.504677), (-24.148146, 12.940952, -41.825813), (-21.926058, 12.940952, -43.03231), (-19.643871, 12.940952, -44.120857), (-17.307842, 12.940952, -45.08847), (-14.924375, 12.940952, -45.932503), (-12.5, 12.940952, -46.650635), (-10.041364, 12.940952, -47.240902), (-7.5552044, 12.940952, -47.701683), (-5.048337, 12.940952, -48.03172), (-2.5276325, 12.940952, -48.230103), (-8.871885e-15, 12.940952, -48.29629), (2.5276325, 12.940952, -48.230103), (5.048337, 12.940952, -48.03172), (7.5552044, 12.940952, -47.701683), (10.041364, 12.940952, -47.240902), (12.5, 12.940952, -46.650635), (14.924375, 12.940952, -45.932503), (17.307842, 12.940952, -45.08847), (19.643871, 12.940952, -44.120857), (21.926058, 12.940952, -43.03231), (24.148146, 12.940952, -41.825813), (26.304045, 12.940952, -40.504677), (28.387848, 12.940952, -39.07252), (30.39384, 12.940952, -37.533268), (32.31653, 12.940952, -35.89114), (34.150635, 12.940952, -34.150635), (35.89114, 12.940952, -32.31653), (37.533268, 12.940952, -30.39384), (39.07252, 12.940952, -28.387848), (40.504677, 12.940952, -26.304045), (41.825813, 12.940952, -24.148146), (43.03231, 12.940952, -21.926058), (44.120857, 12.940952, -19.643871), (45.08847, 12.940952, -17.307842), (45.932503, 12.940952, -14.924375), (46.650635, 12.940952, -12.5), (47.240902, 12.940952, -10.041364), (47.701683, 12.940952, -7.5552044), (48.03172, 12.940952, -5.048337), (48.230103, 12.940952, -2.5276325), (47.552826, 15.45085, 0), (47.487656, 15.45085, 2.4887226), (47.292328, 15.45085, 4.970624), (46.967373, 15.45085, 7.438901), (46.513683, 15.45085, 9.886788), (45.932503, 15.45085, 12.307577), (45.225426, 15.45085, 14.694632), (44.394386, 15.45085, 17.041409), (43.44167, 15.45085, 19.341476), (42.369877, 15.45085, 21.588531), (41.181953, 15.45085, 23.776413), (39.881157, 15.45085, 25.899126), (38.471043, 15.45085, 27.95085), (36.955486, 15.45085, 29.925962), (35.33864, 15.45085, 31.819052), (33.624924, 15.45085, 33.624924), (31.819052, 15.45085, 35.33864), (29.925962, 15.45085, 36.955486), (27.95085, 15.45085, 38.471043), (25.899126, 15.45085, 39.881157), (23.776413, 15.45085, 41.181953), (21.588531, 15.45085, 42.369877), (19.341476, 15.45085, 43.44167), (17.041409, 15.45085, 44.394386), (14.694632, 15.45085, 45.225426), (12.307577, 15.45085, 45.932503), (9.886788, 15.45085, 46.513683), (7.438901, 15.45085, 46.967373), (4.970624, 15.45085, 47.292328), (2.4887226, 15.45085, 47.487656), (2.9117708e-15, 15.45085, 47.552826), (-2.4887226, 15.45085, 47.487656), (-4.970624, 15.45085, 47.292328), (-7.438901, 15.45085, 46.967373), (-9.886788, 15.45085, 46.513683), (-12.307577, 15.45085, 45.932503), (-14.694632, 15.45085, 45.225426), (-17.041409, 15.45085, 44.394386), (-19.341476, 15.45085, 43.44167), (-21.588531, 15.45085, 42.369877), (-23.776413, 15.45085, 41.181953), (-25.899126, 15.45085, 39.881157), (-27.95085, 15.45085, 38.471043), (-29.925962, 15.45085, 36.955486), (-31.819052, 15.45085, 35.33864), (-33.624924, 15.45085, 33.624924), (-35.33864, 15.45085, 31.819052), (-36.955486, 15.45085, 29.925962), (-38.471043, 15.45085, 27.95085), (-39.881157, 15.45085, 25.899126), (-41.181953, 15.45085, 23.776413), (-42.369877, 15.45085, 21.588531), (-43.44167, 15.45085, 19.341476), (-44.394386, 15.45085, 17.041409), (-45.225426, 15.45085, 14.694632), (-45.932503, 15.45085, 12.307577), (-46.513683, 15.45085, 9.886788), (-46.967373, 15.45085, 7.438901), (-47.292328, 15.45085, 4.970624), (-47.487656, 15.45085, 2.4887226), (-47.552826, 15.45085, 5.8235417e-15), (-47.487656, 15.45085, -2.4887226), (-47.292328, 15.45085, -4.970624), (-46.967373, 15.45085, -7.438901), (-46.513683, 15.45085, -9.886788), (-45.932503, 15.45085, -12.307577), (-45.225426, 15.45085, -14.694632), (-44.394386, 15.45085, -17.041409), (-43.44167, 15.45085, -19.341476), (-42.369877, 15.45085, -21.588531), (-41.181953, 15.45085, -23.776413), (-39.881157, 15.45085, -25.899126), (-38.471043, 15.45085, -27.95085), (-36.955486, 15.45085, -29.925962), (-35.33864, 15.45085, -31.819052), (-33.624924, 15.45085, -33.624924), (-31.819052, 15.45085, -35.33864), (-29.925962, 15.45085, -36.955486), (-27.95085, 15.45085, -38.471043), (-25.899126, 15.45085, -39.881157), (-23.776413, 15.45085, -41.181953), (-21.588531, 15.45085, -42.369877), (-19.341476, 15.45085, -43.44167), (-17.041409, 15.45085, -44.394386), (-14.694632, 15.45085, -45.225426), (-12.307577, 15.45085, -45.932503), (-9.886788, 15.45085, -46.513683), (-7.438901, 15.45085, -46.967373), (-4.970624, 15.45085, -47.292328), (-2.4887226, 15.45085, -47.487656), (-8.735313e-15, 15.45085, -47.552826), (2.4887226, 15.45085, -47.487656), (4.970624, 15.45085, -47.292328), (7.438901, 15.45085, -46.967373), (9.886788, 15.45085, -46.513683), (12.307577, 15.45085, -45.932503), (14.694632, 15.45085, -45.225426), (17.041409, 15.45085, -44.394386), (19.341476, 15.45085, -43.44167), (21.588531, 15.45085, -42.369877), (23.776413, 15.45085, -41.181953), (25.899126, 15.45085, -39.881157), (27.95085, 15.45085, -38.471043), (29.925962, 15.45085, -36.955486), (31.819052, 15.45085, -35.33864), (33.624924, 15.45085, -33.624924), (35.33864, 15.45085, -31.819052), (36.955486, 15.45085, -29.925962), (38.471043, 15.45085, -27.95085), (39.881157, 15.45085, -25.899126), (41.181953, 15.45085, -23.776413), (42.369877, 15.45085, -21.588531), (43.44167, 15.45085, -19.341476), (44.394386, 15.45085, -17.041409), (45.225426, 15.45085, -14.694632), (45.932503, 15.45085, -12.307577), (46.513683, 15.45085, -9.886788), (46.967373, 15.45085, -7.438901), (47.292328, 15.45085, -4.970624), (47.487656, 15.45085, -2.4887226), (46.67902, 17.918398, 0), (46.615047, 17.918398, 2.4429913), (46.42331, 17.918398, 4.8792863), (46.104324, 17.918398, 7.302208), (45.658974, 17.918398, 9.705114), (45.08847, 17.918398, 12.08142), (44.394386, 17.918398, 14.424611), (43.57862, 17.918398, 16.728266), (42.64341, 17.918398, 18.986069), (41.591312, 17.918398, 21.191832), (40.425217, 17.918398, 23.33951), (39.148323, 17.918398, 25.423218), (37.764122, 17.918398, 27.43724), (36.276413, 17.918398, 29.37606), (34.689274, 17.918398, 31.234362), (33.007053, 17.918398, 33.007053), (31.234362, 17.918398, 34.689274), (29.37606, 17.918398, 36.276413), (27.43724, 17.918398, 37.764122), (25.423218, 17.918398, 39.148323), (23.33951, 17.918398, 40.425217), (21.191832, 17.918398, 41.591312), (18.986069, 17.918398, 42.64341), (16.728266, 17.918398, 43.57862), (14.424611, 17.918398, 44.394386), (12.08142, 17.918398, 45.08847), (9.705114, 17.918398, 45.658974), (7.302208, 17.918398, 46.104324), (4.8792863, 17.918398, 46.42331), (2.4429913, 17.918398, 46.615047), (2.8582657e-15, 17.918398, 46.67902), (-2.4429913, 17.918398, 46.615047), (-4.8792863, 17.918398, 46.42331), (-7.302208, 17.918398, 46.104324), (-9.705114, 17.918398, 45.658974), (-12.08142, 17.918398, 45.08847), (-14.424611, 17.918398, 44.394386), (-16.728266, 17.918398, 43.57862), (-18.986069, 17.918398, 42.64341), (-21.191832, 17.918398, 41.591312), (-23.33951, 17.918398, 40.425217), (-25.423218, 17.918398, 39.148323), (-27.43724, 17.918398, 37.764122), (-29.37606, 17.918398, 36.276413), (-31.234362, 17.918398, 34.689274), (-33.007053, 17.918398, 33.007053), (-34.689274, 17.918398, 31.234362), (-36.276413, 17.918398, 29.37606), (-37.764122, 17.918398, 27.43724), (-39.148323, 17.918398, 25.423218), (-40.425217, 17.918398, 23.33951), (-41.591312, 17.918398, 21.191832), (-42.64341, 17.918398, 18.986069), (-43.57862, 17.918398, 16.728266), (-44.394386, 17.918398, 14.424611), (-45.08847, 17.918398, 12.08142), (-45.658974, 17.918398, 9.705114), (-46.104324, 17.918398, 7.302208), (-46.42331, 17.918398, 4.8792863), (-46.615047, 17.918398, 2.4429913), (-46.67902, 17.918398, 5.7165313e-15), (-46.615047, 17.918398, -2.4429913), (-46.42331, 17.918398, -4.8792863), (-46.104324, 17.918398, -7.302208), (-45.658974, 17.918398, -9.705114), (-45.08847, 17.918398, -12.08142), (-44.394386, 17.918398, -14.424611), (-43.57862, 17.918398, -16.728266), (-42.64341, 17.918398, -18.986069), (-41.591312, 17.918398, -21.191832), (-40.425217, 17.918398, -23.33951), (-39.148323, 17.918398, -25.423218), (-37.764122, 17.918398, -27.43724), (-36.276413, 17.918398, -29.37606), (-34.689274, 17.918398, -31.234362), (-33.007053, 17.918398, -33.007053), (-31.234362, 17.918398, -34.689274), (-29.37606, 17.918398, -36.276413), (-27.43724, 17.918398, -37.764122), (-25.423218, 17.918398, -39.148323), (-23.33951, 17.918398, -40.425217), (-21.191832, 17.918398, -41.591312), (-18.986069, 17.918398, -42.64341), (-16.728266, 17.918398, -43.57862), (-14.424611, 17.918398, -44.394386), (-12.08142, 17.918398, -45.08847), (-9.705114, 17.918398, -45.658974), (-7.302208, 17.918398, -46.104324), (-4.8792863, 17.918398, -46.42331), (-2.4429913, 17.918398, -46.615047), (-8.5747974e-15, 17.918398, -46.67902), (2.4429913, 17.918398, -46.615047), (4.8792863, 17.918398, -46.42331), (7.302208, 17.918398, -46.104324), (9.705114, 17.918398, -45.658974), (12.08142, 17.918398, -45.08847), (14.424611, 17.918398, -44.394386), (16.728266, 17.918398, -43.57862), (18.986069, 17.918398, -42.64341), (21.191832, 17.918398, -41.591312), (23.33951, 17.918398, -40.425217), (25.423218, 17.918398, -39.148323), (27.43724, 17.918398, -37.764122), (29.37606, 17.918398, -36.276413), (31.234362, 17.918398, -34.689274), (33.007053, 17.918398, -33.007053), (34.689274, 17.918398, -31.234362), (36.276413, 17.918398, -29.37606), (37.764122, 17.918398, -27.43724), (39.148323, 17.918398, -25.423218), (40.425217, 17.918398, -23.33951), (41.591312, 17.918398, -21.191832), (42.64341, 17.918398, -18.986069), (43.57862, 17.918398, -16.728266), (44.394386, 17.918398, -14.424611), (45.08847, 17.918398, -12.08142), (45.658974, 17.918398, -9.705114), (46.104324, 17.918398, -7.302208), (46.42331, 17.918398, -4.8792863), (46.615047, 17.918398, -2.4429913), (45.677273, 20.336832, 0), (45.614674, 20.336832, 2.3905637), (45.427048, 20.336832, 4.774575), (45.11491, 20.336832, 7.1454997), (44.679115, 20.336832, 9.496839), (44.120857, 20.336832, 11.822148), (43.44167, 20.336832, 14.115053), (42.64341, 20.336832, 16.36927), (41.728264, 20.336832, 18.57862), (40.69875, 20.336832, 20.737047), (39.55768, 20.336832, 22.838636), (38.308186, 20.336832, 24.877626), (36.95369, 20.336832, 26.848427), (35.49791, 20.336832, 28.74564), (33.944828, 20.336832, 30.564062), (32.29871, 20.336832, 32.29871), (30.564062, 20.336832, 33.944828), (28.74564, 20.336832, 35.49791), (26.848427, 20.336832, 36.95369), (24.877626, 20.336832, 38.308186), (22.838636, 20.336832, 39.55768), (20.737047, 20.336832, 40.69875), (18.57862, 20.336832, 41.728264), (16.36927, 20.336832, 42.64341), (14.115053, 20.336832, 43.44167), (11.822148, 20.336832, 44.120857), (9.496839, 20.336832, 44.679115), (7.1454997, 20.336832, 45.11491), (4.774575, 20.336832, 45.427048), (2.3905637, 20.336832, 45.614674), (2.7969263e-15, 20.336832, 45.677273), (-2.3905637, 20.336832, 45.614674), (-4.774575, 20.336832, 45.427048), (-7.1454997, 20.336832, 45.11491), (-9.496839, 20.336832, 44.679115), (-11.822148, 20.336832, 44.120857), (-14.115053, 20.336832, 43.44167), (-16.36927, 20.336832, 42.64341), (-18.57862, 20.336832, 41.728264), (-20.737047, 20.336832, 40.69875), (-22.838636, 20.336832, 39.55768), (-24.877626, 20.336832, 38.308186), (-26.848427, 20.336832, 36.95369), (-28.74564, 20.336832, 35.49791), (-30.564062, 20.336832, 33.944828), (-32.29871, 20.336832, 32.29871), (-33.944828, 20.336832, 30.564062), (-35.49791, 20.336832, 28.74564), (-36.95369, 20.336832, 26.848427), (-38.308186, 20.336832, 24.877626), (-39.55768, 20.336832, 22.838636), (-40.69875, 20.336832, 20.737047), (-41.728264, 20.336832, 18.57862), (-42.64341, 20.336832, 16.36927), (-43.44167, 20.336832, 14.115053), (-44.120857, 20.336832, 11.822148), (-44.679115, 20.336832, 9.496839), (-45.11491, 20.336832, 7.1454997), (-45.427048, 20.336832, 4.774575), (-45.614674, 20.336832, 2.3905637), (-45.677273, 20.336832, 5.5938526e-15), (-45.614674, 20.336832, -2.3905637), (-45.427048, 20.336832, -4.774575), (-45.11491, 20.336832, -7.1454997), (-44.679115, 20.336832, -9.496839), (-44.120857, 20.336832, -11.822148), (-43.44167, 20.336832, -14.115053), (-42.64341, 20.336832, -16.36927), (-41.728264, 20.336832, -18.57862), (-40.69875, 20.336832, -20.737047), (-39.55768, 20.336832, -22.838636), (-38.308186, 20.336832, -24.877626), (-36.95369, 20.336832, -26.848427), (-35.49791, 20.336832, -28.74564), (-33.944828, 20.336832, -30.564062), (-32.29871, 20.336832, -32.29871), (-30.564062, 20.336832, -33.944828), (-28.74564, 20.336832, -35.49791), (-26.848427, 20.336832, -36.95369), (-24.877626, 20.336832, -38.308186), (-22.838636, 20.336832, -39.55768), (-20.737047, 20.336832, -40.69875), (-18.57862, 20.336832, -41.728264), (-16.36927, 20.336832, -42.64341), (-14.115053, 20.336832, -43.44167), (-11.822148, 20.336832, -44.120857), (-9.496839, 20.336832, -44.679115), (-7.1454997, 20.336832, -45.11491), (-4.774575, 20.336832, -45.427048), (-2.3905637, 20.336832, -45.614674), (-8.390779e-15, 20.336832, -45.677273), (2.3905637, 20.336832, -45.614674), (4.774575, 20.336832, -45.427048), (7.1454997, 20.336832, -45.11491), (9.496839, 20.336832, -44.679115), (11.822148, 20.336832, -44.120857), (14.115053, 20.336832, -43.44167), (16.36927, 20.336832, -42.64341), (18.57862, 20.336832, -41.728264), (20.737047, 20.336832, -40.69875), (22.838636, 20.336832, -39.55768), (24.877626, 20.336832, -38.308186), (26.848427, 20.336832, -36.95369), (28.74564, 20.336832, -35.49791), (30.564062, 20.336832, -33.944828), (32.29871, 20.336832, -32.29871), (33.944828, 20.336832, -30.564062), (35.49791, 20.336832, -28.74564), (36.95369, 20.336832, -26.848427), (38.308186, 20.336832, -24.877626), (39.55768, 20.336832, -22.838636), (40.69875, 20.336832, -20.737047), (41.728264, 20.336832, -18.57862), (42.64341, 20.336832, -16.36927), (43.44167, 20.336832, -14.115053), (44.120857, 20.336832, -11.822148), (44.679115, 20.336832, -9.496839), (45.11491, 20.336832, -7.1454997), (45.427048, 20.336832, -4.774575), (45.614674, 20.336832, -2.3905637), (44.550327, 22.699526, 0), (44.489273, 22.699526, 2.331584), (44.306274, 22.699526, 4.656777), (44.00184, 22.699526, 6.9692063), (43.576794, 22.699526, 9.262533), (43.03231, 22.699526, 11.530473), (42.369877, 22.699526, 13.766808), (41.591312, 22.699526, 15.965409), (40.69875, 22.699526, 18.12025), (39.69463, 22.699526, 20.225426), (38.581715, 22.699526, 22.275164), (37.36305, 22.699526, 24.263847), (36.04197, 22.699526, 26.186026), (34.622105, 22.699526, 28.036428), (33.107346, 22.699526, 29.809986), (31.501839, 22.699526, 31.501839), (29.809986, 22.699526, 33.107346), (28.036428, 22.699526, 34.622105), (26.186026, 22.699526, 36.04197), (24.263847, 22.699526, 37.36305), (22.275164, 22.699526, 38.581715), (20.225426, 22.699526, 39.69463), (18.12025, 22.699526, 40.69875), (15.965409, 22.699526, 41.591312), (13.766808, 22.699526, 42.369877), (11.530473, 22.699526, 43.03231), (9.262533, 22.699526, 43.576794), (6.9692063, 22.699526, 44.00184), (4.656777, 22.699526, 44.306274), (2.331584, 22.699526, 44.489273), (2.7279206e-15, 22.699526, 44.550327), (-2.331584, 22.699526, 44.489273), (-4.656777, 22.699526, 44.306274), (-6.9692063, 22.699526, 44.00184), (-9.262533, 22.699526, 43.576794), (-11.530473, 22.699526, 43.03231), (-13.766808, 22.699526, 42.369877), (-15.965409, 22.699526, 41.591312), (-18.12025, 22.699526, 40.69875), (-20.225426, 22.699526, 39.69463), (-22.275164, 22.699526, 38.581715), (-24.263847, 22.699526, 37.36305), (-26.186026, 22.699526, 36.04197), (-28.036428, 22.699526, 34.622105), (-29.809986, 22.699526, 33.107346), (-31.501839, 22.699526, 31.501839), (-33.107346, 22.699526, 29.809986), (-34.622105, 22.699526, 28.036428), (-36.04197, 22.699526, 26.186026), (-37.36305, 22.699526, 24.263847), (-38.581715, 22.699526, 22.275164), (-39.69463, 22.699526, 20.225426), (-40.69875, 22.699526, 18.12025), (-41.591312, 22.699526, 15.965409), (-42.369877, 22.699526, 13.766808), (-43.03231, 22.699526, 11.530473), (-43.576794, 22.699526, 9.262533), (-44.00184, 22.699526, 6.9692063), (-44.306274, 22.699526, 4.656777), (-44.489273, 22.699526, 2.331584), (-44.550327, 22.699526, 5.4558413e-15), (-44.489273, 22.699526, -2.331584), (-44.306274, 22.699526, -4.656777), (-44.00184, 22.699526, -6.9692063), (-43.576794, 22.699526, -9.262533), (-43.03231, 22.699526, -11.530473), (-42.369877, 22.699526, -13.766808), (-41.591312, 22.699526, -15.965409), (-40.69875, 22.699526, -18.12025), (-39.69463, 22.699526, -20.225426), (-38.581715, 22.699526, -22.275164), (-37.36305, 22.699526, -24.263847), (-36.04197, 22.699526, -26.186026), (-34.622105, 22.699526, -28.036428), (-33.107346, 22.699526, -29.809986), (-31.501839, 22.699526, -31.501839), (-29.809986, 22.699526, -33.107346), (-28.036428, 22.699526, -34.622105), (-26.186026, 22.699526, -36.04197), (-24.263847, 22.699526, -37.36305), (-22.275164, 22.699526, -38.581715), (-20.225426, 22.699526, -39.69463), (-18.12025, 22.699526, -40.69875), (-15.965409, 22.699526, -41.591312), (-13.766808, 22.699526, -42.369877), (-11.530473, 22.699526, -43.03231), (-9.262533, 22.699526, -43.576794), (-6.9692063, 22.699526, -44.00184), (-4.656777, 22.699526, -44.306274), (-2.331584, 22.699526, -44.489273), (-8.183762e-15, 22.699526, -44.550327), (2.331584, 22.699526, -44.489273), (4.656777, 22.699526, -44.306274), (6.9692063, 22.699526, -44.00184), (9.262533, 22.699526, -43.576794), (11.530473, 22.699526, -43.03231), (13.766808, 22.699526, -42.369877), (15.965409, 22.699526, -41.591312), (18.12025, 22.699526, -40.69875), (20.225426, 22.699526, -39.69463), (22.275164, 22.699526, -38.581715), (24.263847, 22.699526, -37.36305), (26.186026, 22.699526, -36.04197), (28.036428, 22.699526, -34.622105), (29.809986, 22.699526, -33.107346), (31.501839, 22.699526, -31.501839), (33.107346, 22.699526, -29.809986), (34.622105, 22.699526, -28.036428), (36.04197, 22.699526, -26.186026), (37.36305, 22.699526, -24.263847), (38.581715, 22.699526, -22.275164), (39.69463, 22.699526, -20.225426), (40.69875, 22.699526, -18.12025), (41.591312, 22.699526, -15.965409), (42.369877, 22.699526, -13.766808), (43.03231, 22.699526, -11.530473), (43.576794, 22.699526, -9.262533), (44.00184, 22.699526, -6.9692063), (44.306274, 22.699526, -4.656777), (44.489273, 22.699526, -2.331584), (43.30127, 25, 0), (43.24193, 25, 2.2662134), (43.06406, 25, 4.526215), (42.768158, 25, 6.773811), (42.355034, 25, 9.00284), (41.825813, 25, 11.207193), (41.181953, 25, 13.380828), (40.425217, 25, 15.517787), (39.55768, 25, 17.612213), (38.581715, 25, 19.658365), (37.5, 25, 21.650635), (36.315502, 25, 23.583563), (35.031464, 25, 25.451847), (33.65141, 25, 27.250372), (32.179115, 25, 28.974205), (30.618622, 25, 30.618622), (28.974205, 25, 32.179115), (27.250372, 25, 33.65141), (25.451847, 25, 35.031464), (23.583563, 25, 36.315502), (21.650635, 25, 37.5), (19.658365, 25, 38.581715), (17.612213, 25, 39.55768), (15.517787, 25, 40.425217), (13.380828, 25, 41.181953), (11.207193, 25, 41.825813), (9.00284, 25, 42.355034), (6.773811, 25, 42.768158), (4.526215, 25, 43.06406), (2.2662134, 25, 43.24193), (2.651438e-15, 25, 43.30127), (-2.2662134, 25, 43.24193), (-4.526215, 25, 43.06406), (-6.773811, 25, 42.768158), (-9.00284, 25, 42.355034), (-11.207193, 25, 41.825813), (-13.380828, 25, 41.181953), (-15.517787, 25, 40.425217), (-17.612213, 25, 39.55768), (-19.658365, 25, 38.581715), (-21.650635, 25, 37.5), (-23.583563, 25, 36.315502), (-25.451847, 25, 35.031464), (-27.250372, 25, 33.65141), (-28.974205, 25, 32.179115), (-30.618622, 25, 30.618622), (-32.179115, 25, 28.974205), (-33.65141, 25, 27.250372), (-35.031464, 25, 25.451847), (-36.315502, 25, 23.583563), (-37.5, 25, 21.650635), (-38.581715, 25, 19.658365), (-39.55768, 25, 17.612213), (-40.425217, 25, 15.517787), (-41.181953, 25, 13.380828), (-41.825813, 25, 11.207193), (-42.355034, 25, 9.00284), (-42.768158, 25, 6.773811), (-43.06406, 25, 4.526215), (-43.24193, 25, 2.2662134), (-43.30127, 25, 5.302876e-15), (-43.24193, 25, -2.2662134), (-43.06406, 25, -4.526215), (-42.768158, 25, -6.773811), (-42.355034, 25, -9.00284), (-41.825813, 25, -11.207193), (-41.181953, 25, -13.380828), (-40.425217, 25, -15.517787), (-39.55768, 25, -17.612213), (-38.581715, 25, -19.658365), (-37.5, 25, -21.650635), (-36.315502, 25, -23.583563), (-35.031464, 25, -25.451847), (-33.65141, 25, -27.250372), (-32.179115, 25, -28.974205), (-30.618622, 25, -30.618622), (-28.974205, 25, -32.179115), (-27.250372, 25, -33.65141), (-25.451847, 25, -35.031464), (-23.583563, 25, -36.315502), (-21.650635, 25, -37.5), (-19.658365, 25, -38.581715), (-17.612213, 25, -39.55768), (-15.517787, 25, -40.425217), (-13.380828, 25, -41.181953), (-11.207193, 25, -41.825813), (-9.00284, 25, -42.355034), (-6.773811, 25, -42.768158), (-4.526215, 25, -43.06406), (-2.2662134, 25, -43.24193), (-7.9543145e-15, 25, -43.30127), (2.2662134, 25, -43.24193), (4.526215, 25, -43.06406), (6.773811, 25, -42.768158), (9.00284, 25, -42.355034), (11.207193, 25, -41.825813), (13.380828, 25, -41.181953), (15.517787, 25, -40.425217), (17.612213, 25, -39.55768), (19.658365, 25, -38.581715), (21.650635, 25, -37.5), (23.583563, 25, -36.315502), (25.451847, 25, -35.031464), (27.250372, 25, -33.65141), (28.974205, 25, -32.179115), (30.618622, 25, -30.618622), (32.179115, 25, -28.974205), (33.65141, 25, -27.250372), (35.031464, 25, -25.451847), (36.315502, 25, -23.583563), (37.5, 25, -21.650635), (38.581715, 25, -19.658365), (39.55768, 25, -17.612213), (40.425217, 25, -15.517787), (41.181953, 25, -13.380828), (41.825813, 25, -11.207193), (42.355034, 25, -9.00284), (42.768158, 25, -6.773811), (43.06406, 25, -4.526215), (43.24193, 25, -2.2662134), (41.93353, 27.231953, 0), (41.87606, 27.231953, 2.1946313), (41.70381, 27.231953, 4.3832474), (41.417255, 27.231953, 6.5598493), (41.01718, 27.231953, 8.718471), (40.504677, 27.231953, 10.853196), (39.881157, 27.231953, 12.958173), (39.148323, 27.231953, 15.027633), (38.308186, 27.231953, 17.055902), (37.36305, 27.231953, 19.037424), (36.315502, 27.231953, 20.966764), (35.168415, 27.231953, 22.838636), (33.92494, 27.231953, 24.64791), (32.58847, 27.231953, 26.389624), (31.162685, 27.231953, 28.059008), (29.651482, 27.231953, 29.651482), (28.059008, 27.231953, 31.162685), (26.389624, 27.231953, 32.58847), (24.64791, 27.231953, 33.92494), (22.838636, 27.231953, 35.168415), (20.966764, 27.231953, 36.315502), (19.037424, 27.231953, 37.36305), (17.055902, 27.231953, 38.308186), (15.027633, 27.231953, 39.148323), (12.958173, 27.231953, 39.881157), (10.853196, 27.231953, 40.504677), (8.718471, 27.231953, 41.01718), (6.5598493, 27.231953, 41.417255), (4.3832474, 27.231953, 41.70381), (2.1946313, 27.231953, 41.87606), (2.567688e-15, 27.231953, 41.93353), (-2.1946313, 27.231953, 41.87606), (-4.3832474, 27.231953, 41.70381), (-6.5598493, 27.231953, 41.417255), (-8.718471, 27.231953, 41.01718), (-10.853196, 27.231953, 40.504677), (-12.958173, 27.231953, 39.881157), (-15.027633, 27.231953, 39.148323), (-17.055902, 27.231953, 38.308186), (-19.037424, 27.231953, 37.36305), (-20.966764, 27.231953, 36.315502), (-22.838636, 27.231953, 35.168415), (-24.64791, 27.231953, 33.92494), (-26.389624, 27.231953, 32.58847), (-28.059008, 27.231953, 31.162685), (-29.651482, 27.231953, 29.651482), (-31.162685, 27.231953, 28.059008), (-32.58847, 27.231953, 26.389624), (-33.92494, 27.231953, 24.64791), (-35.168415, 27.231953, 22.838636), (-36.315502, 27.231953, 20.966764), (-37.36305, 27.231953, 19.037424), (-38.308186, 27.231953, 17.055902), (-39.148323, 27.231953, 15.027633), (-39.881157, 27.231953, 12.958173), (-40.504677, 27.231953, 10.853196), (-41.01718, 27.231953, 8.718471), (-41.417255, 27.231953, 6.5598493), (-41.70381, 27.231953, 4.3832474), (-41.87606, 27.231953, 2.1946313), (-41.93353, 27.231953, 5.135376e-15), (-41.87606, 27.231953, -2.1946313), (-41.70381, 27.231953, -4.3832474), (-41.417255, 27.231953, -6.5598493), (-41.01718, 27.231953, -8.718471), (-40.504677, 27.231953, -10.853196), (-39.881157, 27.231953, -12.958173), (-39.148323, 27.231953, -15.027633), (-38.308186, 27.231953, -17.055902), (-37.36305, 27.231953, -19.037424), (-36.315502, 27.231953, -20.966764), (-35.168415, 27.231953, -22.838636), (-33.92494, 27.231953, -24.64791), (-32.58847, 27.231953, -26.389624), (-31.162685, 27.231953, -28.059008), (-29.651482, 27.231953, -29.651482), (-28.059008, 27.231953, -31.162685), (-26.389624, 27.231953, -32.58847), (-24.64791, 27.231953, -33.92494), (-22.838636, 27.231953, -35.168415), (-20.966764, 27.231953, -36.315502), (-19.037424, 27.231953, -37.36305), (-17.055902, 27.231953, -38.308186), (-15.027633, 27.231953, -39.148323), (-12.958173, 27.231953, -39.881157), (-10.853196, 27.231953, -40.504677), (-8.718471, 27.231953, -41.01718), (-6.5598493, 27.231953, -41.417255), (-4.3832474, 27.231953, -41.70381), (-2.1946313, 27.231953, -41.87606), (-7.703064e-15, 27.231953, -41.93353), (2.1946313, 27.231953, -41.87606), (4.3832474, 27.231953, -41.70381), (6.5598493, 27.231953, -41.417255), (8.718471, 27.231953, -41.01718), (10.853196, 27.231953, -40.504677), (12.958173, 27.231953, -39.881157), (15.027633, 27.231953, -39.148323), (17.055902, 27.231953, -38.308186), (19.037424, 27.231953, -37.36305), (20.966764, 27.231953, -36.315502), (22.838636, 27.231953, -35.168415), (24.64791, 27.231953, -33.92494), (26.389624, 27.231953, -32.58847), (28.059008, 27.231953, -31.162685), (29.651482, 27.231953, -29.651482), (31.162685, 27.231953, -28.059008), (32.58847, 27.231953, -26.389624), (33.92494, 27.231953, -24.64791), (35.168415, 27.231953, -22.838636), (36.315502, 27.231953, -20.966764), (37.36305, 27.231953, -19.037424), (38.308186, 27.231953, -17.055902), (39.148323, 27.231953, -15.027633), (39.881157, 27.231953, -12.958173), (40.504677, 27.231953, -10.853196), (41.01718, 27.231953, -8.718471), (41.417255, 27.231953, -6.5598493), (41.70381, 27.231953, -4.3832474), (41.87606, 27.231953, -2.1946313), (40.45085, 29.389263, 0), (40.395412, 29.389263, 2.117034), (40.229256, 29.389263, 4.2282653), (39.95283, 29.389263, 6.327907), (39.566902, 29.389263, 8.410205), (39.07252, 29.389263, 10.46945), (38.471043, 29.389263, 12.5), (37.764122, 29.389263, 14.496288), (36.95369, 29.389263, 16.452843), (36.04197, 29.389263, 18.364302), (35.031464, 29.389263, 20.225426), (33.92494, 29.389263, 22.031113), (32.725426, 29.389263, 23.776413), (31.436214, 29.389263, 25.456545), (30.06084, 29.389263, 27.066902), (28.60307, 29.389263, 28.60307), (27.066902, 29.389263, 30.06084), (25.456545, 29.389263, 31.436214), (23.776413, 29.389263, 32.725426), (22.031113, 29.389263, 33.92494), (20.225426, 29.389263, 35.031464), (18.364302, 29.389263, 36.04197), (16.452843, 29.389263, 36.95369), (14.496288, 29.389263, 37.764122), (12.5, 29.389263, 38.471043), (10.46945, 29.389263, 39.07252), (8.410205, 29.389263, 39.566902), (6.327907, 29.389263, 39.95283), (4.2282653, 29.389263, 40.229256), (2.117034, 29.389263, 40.395412), (2.4769e-15, 29.389263, 40.45085), (-2.117034, 29.389263, 40.395412), (-4.2282653, 29.389263, 40.229256), (-6.327907, 29.389263, 39.95283), (-8.410205, 29.389263, 39.566902), (-10.46945, 29.389263, 39.07252), (-12.5, 29.389263, 38.471043), (-14.496288, 29.389263, 37.764122), (-16.452843, 29.389263, 36.95369), (-18.364302, 29.389263, 36.04197), (-20.225426, 29.389263, 35.031464), (-22.031113, 29.389263, 33.92494), (-23.776413, 29.389263, 32.725426), (-25.456545, 29.389263, 31.436214), (-27.066902, 29.389263, 30.06084), (-28.60307, 29.389263, 28.60307), (-30.06084, 29.389263, 27.066902), (-31.436214, 29.389263, 25.456545), (-32.725426, 29.389263, 23.776413), (-33.92494, 29.389263, 22.031113), (-35.031464, 29.389263, 20.225426), (-36.04197, 29.389263, 18.364302), (-36.95369, 29.389263, 16.452843), (-37.764122, 29.389263, 14.496288), (-38.471043, 29.389263, 12.5), (-39.07252, 29.389263, 10.46945), (-39.566902, 29.389263, 8.410205), (-39.95283, 29.389263, 6.327907), (-40.229256, 29.389263, 4.2282653), (-40.395412, 29.389263, 2.117034), (-40.45085, 29.389263, 4.9538e-15), (-40.395412, 29.389263, -2.117034), (-40.229256, 29.389263, -4.2282653), (-39.95283, 29.389263, -6.327907), (-39.566902, 29.389263, -8.410205), (-39.07252, 29.389263, -10.46945), (-38.471043, 29.389263, -12.5), (-37.764122, 29.389263, -14.496288), (-36.95369, 29.389263, -16.452843), (-36.04197, 29.389263, -18.364302), (-35.031464, 29.389263, -20.225426), (-33.92494, 29.389263, -22.031113), (-32.725426, 29.389263, -23.776413), (-31.436214, 29.389263, -25.456545), (-30.06084, 29.389263, -27.066902), (-28.60307, 29.389263, -28.60307), (-27.066902, 29.389263, -30.06084), (-25.456545, 29.389263, -31.436214), (-23.776413, 29.389263, -32.725426), (-22.031113, 29.389263, -33.92494), (-20.225426, 29.389263, -35.031464), (-18.364302, 29.389263, -36.04197), (-16.452843, 29.389263, -36.95369), (-14.496288, 29.389263, -37.764122), (-12.5, 29.389263, -38.471043), (-10.46945, 29.389263, -39.07252), (-8.410205, 29.389263, -39.566902), (-6.327907, 29.389263, -39.95283), (-4.2282653, 29.389263, -40.229256), (-2.117034, 29.389263, -40.395412), (-7.430701e-15, 29.389263, -40.45085), (2.117034, 29.389263, -40.395412), (4.2282653, 29.389263, -40.229256), (6.327907, 29.389263, -39.95283), (8.410205, 29.389263, -39.566902), (10.46945, 29.389263, -39.07252), (12.5, 29.389263, -38.471043), (14.496288, 29.389263, -37.764122), (16.452843, 29.389263, -36.95369), (18.364302, 29.389263, -36.04197), (20.225426, 29.389263, -35.031464), (22.031113, 29.389263, -33.92494), (23.776413, 29.389263, -32.725426), (25.456545, 29.389263, -31.436214), (27.066902, 29.389263, -30.06084), (28.60307, 29.389263, -28.60307), (30.06084, 29.389263, -27.066902), (31.436214, 29.389263, -25.456545), (32.725426, 29.389263, -23.776413), (33.92494, 29.389263, -22.031113), (35.031464, 29.389263, -20.225426), (36.04197, 29.389263, -18.364302), (36.95369, 29.389263, -16.452843), (37.764122, 29.389263, -14.496288), (38.471043, 29.389263, -12.5), (39.07252, 29.389263, -10.46945), (39.566902, 29.389263, -8.410205), (39.95283, 29.389263, -6.327907), (40.229256, 29.389263, -4.2282653), (40.395412, 29.389263, -2.117034), (38.8573, 31.466019, 0), (38.804047, 31.466019, 2.033634), (38.644432, 31.466019, 4.0616937), (38.3789, 31.466019, 6.0786204), (38.00817, 31.466019, 8.078887), (37.533268, 31.466019, 10.057009), (36.955486, 31.466019, 12.0075655), (36.276413, 31.466019, 13.92521), (35.49791, 31.466019, 15.804687), (34.622105, 31.466019, 17.640844), (33.65141, 31.466019, 19.42865), (32.58847, 31.466019, 21.1632), (31.436214, 31.466019, 22.839746), (30.197792, 31.466019, 24.45369), (28.8766, 31.466019, 26.000607), (27.47626, 31.466019, 27.47626), (26.000607, 31.466019, 28.8766), (24.45369, 31.466019, 30.197792), (22.839746, 31.466019, 31.436214), (21.1632, 31.466019, 32.58847), (19.42865, 31.466019, 33.65141), (17.640844, 31.466019, 34.622105), (15.804687, 31.466019, 35.49791), (13.92521, 31.466019, 36.276413), (12.0075655, 31.466019, 36.955486), (10.057009, 31.466019, 37.533268), (8.078887, 31.466019, 38.00817), (6.0786204, 31.466019, 38.3789), (4.0616937, 31.466019, 38.644432), (2.033634, 31.466019, 38.804047), (2.3793234e-15, 31.466019, 38.8573), (-2.033634, 31.466019, 38.804047), (-4.0616937, 31.466019, 38.644432), (-6.0786204, 31.466019, 38.3789), (-8.078887, 31.466019, 38.00817), (-10.057009, 31.466019, 37.533268), (-12.0075655, 31.466019, 36.955486), (-13.92521, 31.466019, 36.276413), (-15.804687, 31.466019, 35.49791), (-17.640844, 31.466019, 34.622105), (-19.42865, 31.466019, 33.65141), (-21.1632, 31.466019, 32.58847), (-22.839746, 31.466019, 31.436214), (-24.45369, 31.466019, 30.197792), (-26.000607, 31.466019, 28.8766), (-27.47626, 31.466019, 27.47626), (-28.8766, 31.466019, 26.000607), (-30.197792, 31.466019, 24.45369), (-31.436214, 31.466019, 22.839746), (-32.58847, 31.466019, 21.1632), (-33.65141, 31.466019, 19.42865), (-34.622105, 31.466019, 17.640844), (-35.49791, 31.466019, 15.804687), (-36.276413, 31.466019, 13.92521), (-36.955486, 31.466019, 12.0075655), (-37.533268, 31.466019, 10.057009), (-38.00817, 31.466019, 8.078887), (-38.3789, 31.466019, 6.0786204), (-38.644432, 31.466019, 4.0616937), (-38.804047, 31.466019, 2.033634), (-38.8573, 31.466019, 4.7586468e-15), (-38.804047, 31.466019, -2.033634), (-38.644432, 31.466019, -4.0616937), (-38.3789, 31.466019, -6.0786204), (-38.00817, 31.466019, -8.078887), (-37.533268, 31.466019, -10.057009), (-36.955486, 31.466019, -12.0075655), (-36.276413, 31.466019, -13.92521), (-35.49791, 31.466019, -15.804687), (-34.622105, 31.466019, -17.640844), (-33.65141, 31.466019, -19.42865), (-32.58847, 31.466019, -21.1632), (-31.436214, 31.466019, -22.839746), (-30.197792, 31.466019, -24.45369), (-28.8766, 31.466019, -26.000607), (-27.47626, 31.466019, -27.47626), (-26.000607, 31.466019, -28.8766), (-24.45369, 31.466019, -30.197792), (-22.839746, 31.466019, -31.436214), (-21.1632, 31.466019, -32.58847), (-19.42865, 31.466019, -33.65141), (-17.640844, 31.466019, -34.622105), (-15.804687, 31.466019, -35.49791), (-13.92521, 31.466019, -36.276413), (-12.0075655, 31.466019, -36.955486), (-10.057009, 31.466019, -37.533268), (-8.078887, 31.466019, -38.00817), (-6.0786204, 31.466019, -38.3789), (-4.0616937, 31.466019, -38.644432), (-2.033634, 31.466019, -38.804047), (-7.1379695e-15, 31.466019, -38.8573), (2.033634, 31.466019, -38.804047), (4.0616937, 31.466019, -38.644432), (6.0786204, 31.466019, -38.3789), (8.078887, 31.466019, -38.00817), (10.057009, 31.466019, -37.533268), (12.0075655, 31.466019, -36.955486), (13.92521, 31.466019, -36.276413), (15.804687, 31.466019, -35.49791), (17.640844, 31.466019, -34.622105), (19.42865, 31.466019, -33.65141), (21.1632, 31.466019, -32.58847), (22.839746, 31.466019, -31.436214), (24.45369, 31.466019, -30.197792), (26.000607, 31.466019, -28.8766), (27.47626, 31.466019, -27.47626), (28.8766, 31.466019, -26.000607), (30.197792, 31.466019, -24.45369), (31.436214, 31.466019, -22.839746), (32.58847, 31.466019, -21.1632), (33.65141, 31.466019, -19.42865), (34.622105, 31.466019, -17.640844), (35.49791, 31.466019, -15.804687), (36.276413, 31.466019, -13.92521), (36.955486, 31.466019, -12.0075655), (37.533268, 31.466019, -10.057009), (38.00817, 31.466019, -8.078887), (38.3789, 31.466019, -6.0786204), (38.644432, 31.466019, -4.0616937), (38.804047, 31.466019, -2.033634), (37.15724, 33.45653, 0), (37.10632, 33.45653, 1.9446597), (36.95369, 33.45653, 3.8839893), (36.699776, 33.45653, 5.812673), (36.34527, 33.45653, 7.725425), (35.89114, 33.45653, 9.617002), (35.33864, 33.45653, 11.482219), (34.689274, 33.45653, 13.315965), (33.944828, 33.45653, 15.113212), (33.107346, 33.45653, 16.869034), (32.179115, 33.45653, 18.57862), (31.162685, 33.45653, 20.237284), (30.06084, 33.45653, 21.840479), (28.8766, 33.45653, 23.38381), (27.61321, 33.45653, 24.863047), (26.274137, 33.45653, 26.274137), (24.863047, 33.45653, 27.61321), (23.38381, 33.45653, 28.8766), (21.840479, 33.45653, 30.06084), (20.237284, 33.45653, 31.162685), (18.57862, 33.45653, 32.179115), (16.869034, 33.45653, 33.107346), (15.113212, 33.45653, 33.944828), (13.315965, 33.45653, 34.689274), (11.482219, 33.45653, 35.33864), (9.617002, 33.45653, 35.89114), (7.725425, 33.45653, 36.34527), (5.812673, 33.45653, 36.699776), (3.8839893, 33.45653, 36.95369), (1.9446597, 33.45653, 37.10632), (2.2752247e-15, 33.45653, 37.15724), (-1.9446597, 33.45653, 37.10632), (-3.8839893, 33.45653, 36.95369), (-5.812673, 33.45653, 36.699776), (-7.725425, 33.45653, 36.34527), (-9.617002, 33.45653, 35.89114), (-11.482219, 33.45653, 35.33864), (-13.315965, 33.45653, 34.689274), (-15.113212, 33.45653, 33.944828), (-16.869034, 33.45653, 33.107346), (-18.57862, 33.45653, 32.179115), (-20.237284, 33.45653, 31.162685), (-21.840479, 33.45653, 30.06084), (-23.38381, 33.45653, 28.8766), (-24.863047, 33.45653, 27.61321), (-26.274137, 33.45653, 26.274137), (-27.61321, 33.45653, 24.863047), (-28.8766, 33.45653, 23.38381), (-30.06084, 33.45653, 21.840479), (-31.162685, 33.45653, 20.237284), (-32.179115, 33.45653, 18.57862), (-33.107346, 33.45653, 16.869034), (-33.944828, 33.45653, 15.113212), (-34.689274, 33.45653, 13.315965), (-35.33864, 33.45653, 11.482219), (-35.89114, 33.45653, 9.617002), (-36.34527, 33.45653, 7.725425), (-36.699776, 33.45653, 5.812673), (-36.95369, 33.45653, 3.8839893), (-37.10632, 33.45653, 1.9446597), (-37.15724, 33.45653, 4.5504495e-15), (-37.10632, 33.45653, -1.9446597), (-36.95369, 33.45653, -3.8839893), (-36.699776, 33.45653, -5.812673), (-36.34527, 33.45653, -7.725425), (-35.89114, 33.45653, -9.617002), (-35.33864, 33.45653, -11.482219), (-34.689274, 33.45653, -13.315965), (-33.944828, 33.45653, -15.113212), (-33.107346, 33.45653, -16.869034), (-32.179115, 33.45653, -18.57862), (-31.162685, 33.45653, -20.237284), (-30.06084, 33.45653, -21.840479), (-28.8766, 33.45653, -23.38381), (-27.61321, 33.45653, -24.863047), (-26.274137, 33.45653, -26.274137), (-24.863047, 33.45653, -27.61321), (-23.38381, 33.45653, -28.8766), (-21.840479, 33.45653, -30.06084), (-20.237284, 33.45653, -31.162685), (-18.57862, 33.45653, -32.179115), (-16.869034, 33.45653, -33.107346), (-15.113212, 33.45653, -33.944828), (-13.315965, 33.45653, -34.689274), (-11.482219, 33.45653, -35.33864), (-9.617002, 33.45653, -35.89114), (-7.725425, 33.45653, -36.34527), (-5.812673, 33.45653, -36.699776), (-3.8839893, 33.45653, -36.95369), (-1.9446597, 33.45653, -37.10632), (-6.8256744e-15, 33.45653, -37.15724), (1.9446597, 33.45653, -37.10632), (3.8839893, 33.45653, -36.95369), (5.812673, 33.45653, -36.699776), (7.725425, 33.45653, -36.34527), (9.617002, 33.45653, -35.89114), (11.482219, 33.45653, -35.33864), (13.315965, 33.45653, -34.689274), (15.113212, 33.45653, -33.944828), (16.869034, 33.45653, -33.107346), (18.57862, 33.45653, -32.179115), (20.237284, 33.45653, -31.162685), (21.840479, 33.45653, -30.06084), (23.38381, 33.45653, -28.8766), (24.863047, 33.45653, -27.61321), (26.274137, 33.45653, -26.274137), (27.61321, 33.45653, -24.863047), (28.8766, 33.45653, -23.38381), (30.06084, 33.45653, -21.840479), (31.162685, 33.45653, -20.237284), (32.179115, 33.45653, -18.57862), (33.107346, 33.45653, -16.869034), (33.944828, 33.45653, -15.113212), (34.689274, 33.45653, -13.315965), (35.33864, 33.45653, -11.482219), (35.89114, 33.45653, -9.617002), (36.34527, 33.45653, -7.725425), (36.699776, 33.45653, -5.812673), (36.95369, 33.45653, -3.8839893), (37.10632, 33.45653, -1.9446597), (35.35534, 35.35534, 0), (35.306885, 35.35534, 1.8503555), (35.16166, 35.35534, 3.6956394), (34.920055, 35.35534, 5.5307937), (34.58274, 35.35534, 7.350788), (34.150635, 35.35534, 9.150635), (33.624924, 35.35534, 10.925401), (33.007053, 35.35534, 12.67022), (32.29871, 35.35534, 14.380312), (31.501839, 35.35534, 16.050987), (30.618622, 35.35534, 17.67767), (29.651482, 35.35534, 19.255898), (28.60307, 35.35534, 20.781347), (27.47626, 35.35534, 22.249836), (26.274137, 35.35534, 23.65734), (25, 35.35534, 25), (23.65734, 35.35534, 26.274137), (22.249836, 35.35534, 27.47626), (20.781347, 35.35534, 28.60307), (19.255898, 35.35534, 29.651482), (17.67767, 35.35534, 30.618622), (16.050987, 35.35534, 31.501839), (14.380312, 35.35534, 32.29871), (12.67022, 35.35534, 33.007053), (10.925401, 35.35534, 33.624924), (9.150635, 35.35534, 34.150635), (7.350788, 35.35534, 34.58274), (5.5307937, 35.35534, 34.920055), (3.6956394, 35.35534, 35.16166), (1.8503555, 35.35534, 35.306885), (2.1648902e-15, 35.35534, 35.35534), (-1.8503555, 35.35534, 35.306885), (-3.6956394, 35.35534, 35.16166), (-5.5307937, 35.35534, 34.920055), (-7.350788, 35.35534, 34.58274), (-9.150635, 35.35534, 34.150635), (-10.925401, 35.35534, 33.624924), (-12.67022, 35.35534, 33.007053), (-14.380312, 35.35534, 32.29871), (-16.050987, 35.35534, 31.501839), (-17.67767, 35.35534, 30.618622), (-19.255898, 35.35534, 29.651482), (-20.781347, 35.35534, 28.60307), (-22.249836, 35.35534, 27.47626), (-23.65734, 35.35534, 26.274137), (-25, 35.35534, 25), (-26.274137, 35.35534, 23.65734), (-27.47626, 35.35534, 22.249836), (-28.60307, 35.35534, 20.781347), (-29.651482, 35.35534, 19.255898), (-30.618622, 35.35534, 17.67767), (-31.501839, 35.35534, 16.050987), (-32.29871, 35.35534, 14.380312), (-33.007053, 35.35534, 12.67022), (-33.624924, 35.35534, 10.925401), (-34.150635, 35.35534, 9.150635), (-34.58274, 35.35534, 7.350788), (-34.920055, 35.35534, 5.5307937), (-35.16166, 35.35534, 3.6956394), (-35.306885, 35.35534, 1.8503555), (-35.35534, 35.35534, 4.3297804e-15), (-35.306885, 35.35534, -1.8503555), (-35.16166, 35.35534, -3.6956394), (-34.920055, 35.35534, -5.5307937), (-34.58274, 35.35534, -7.350788), (-34.150635, 35.35534, -9.150635), (-33.624924, 35.35534, -10.925401), (-33.007053, 35.35534, -12.67022), (-32.29871, 35.35534, -14.380312), (-31.501839, 35.35534, -16.050987), (-30.618622, 35.35534, -17.67767), (-29.651482, 35.35534, -19.255898), (-28.60307, 35.35534, -20.781347), (-27.47626, 35.35534, -22.249836), (-26.274137, 35.35534, -23.65734), (-25, 35.35534, -25), (-23.65734, 35.35534, -26.274137), (-22.249836, 35.35534, -27.47626), (-20.781347, 35.35534, -28.60307), (-19.255898, 35.35534, -29.651482), (-17.67767, 35.35534, -30.618622), (-16.050987, 35.35534, -31.501839), (-14.380312, 35.35534, -32.29871), (-12.67022, 35.35534, -33.007053), (-10.925401, 35.35534, -33.624924), (-9.150635, 35.35534, -34.150635), (-7.350788, 35.35534, -34.58274), (-5.5307937, 35.35534, -34.920055), (-3.6956394, 35.35534, -35.16166), (-1.8503555, 35.35534, -35.306885), (-6.4946704e-15, 35.35534, -35.35534), (1.8503555, 35.35534, -35.306885), (3.6956394, 35.35534, -35.16166), (5.5307937, 35.35534, -34.920055), (7.350788, 35.35534, -34.58274), (9.150635, 35.35534, -34.150635), (10.925401, 35.35534, -33.624924), (12.67022, 35.35534, -33.007053), (14.380312, 35.35534, -32.29871), (16.050987, 35.35534, -31.501839), (17.67767, 35.35534, -30.618622), (19.255898, 35.35534, -29.651482), (20.781347, 35.35534, -28.60307), (22.249836, 35.35534, -27.47626), (23.65734, 35.35534, -26.274137), (25, 35.35534, -25), (26.274137, 35.35534, -23.65734), (27.47626, 35.35534, -22.249836), (28.60307, 35.35534, -20.781347), (29.651482, 35.35534, -19.255898), (30.618622, 35.35534, -17.67767), (31.501839, 35.35534, -16.050987), (32.29871, 35.35534, -14.380312), (33.007053, 35.35534, -12.67022), (33.624924, 35.35534, -10.925401), (34.150635, 35.35534, -9.150635), (34.58274, 35.35534, -7.350788), (34.920055, 35.35534, -5.5307937), (35.16166, 35.35534, -3.6956394), (35.306885, 35.35534, -1.8503555), (33.45653, 37.15724, 0), (33.41068, 37.15724, 1.7509795), (33.27325, 37.15724, 3.4971597), (33.044624, 37.15724, 5.2337546), (32.725426, 37.15724, 6.9560037), (32.31653, 37.15724, 8.659187), (31.819052, 37.15724, 10.338636), (31.234362, 37.15724, 11.989748), (30.564062, 37.15724, 13.607997), (29.809986, 37.15724, 15.188947), (28.974205, 37.15724, 16.728266), (28.059008, 37.15724, 18.221733), (27.066902, 37.15724, 19.665255), (26.000607, 37.15724, 21.054876), (24.863047, 37.15724, 22.38679), (23.65734, 37.15724, 23.65734), (22.38679, 37.15724, 24.863047), (21.054876, 37.15724, 26.000607), (19.665255, 37.15724, 27.066902), (18.221733, 37.15724, 28.059008), (16.728266, 37.15724, 28.974205), (15.188947, 37.15724, 29.809986), (13.607997, 37.15724, 30.564062), (11.989748, 37.15724, 31.234362), (10.338636, 37.15724, 31.819052), (8.659187, 37.15724, 32.31653), (6.9560037, 37.15724, 32.725426), (5.2337546, 37.15724, 33.044624), (3.4971597, 37.15724, 33.27325), (1.7509795, 37.15724, 33.41068), (2.0486216e-15, 37.15724, 33.45653), (-1.7509795, 37.15724, 33.41068), (-3.4971597, 37.15724, 33.27325), (-5.2337546, 37.15724, 33.044624), (-6.9560037, 37.15724, 32.725426), (-8.659187, 37.15724, 32.31653), (-10.338636, 37.15724, 31.819052), (-11.989748, 37.15724, 31.234362), (-13.607997, 37.15724, 30.564062), (-15.188947, 37.15724, 29.809986), (-16.728266, 37.15724, 28.974205), (-18.221733, 37.15724, 28.059008), (-19.665255, 37.15724, 27.066902), (-21.054876, 37.15724, 26.000607), (-22.38679, 37.15724, 24.863047), (-23.65734, 37.15724, 23.65734), (-24.863047, 37.15724, 22.38679), (-26.000607, 37.15724, 21.054876), (-27.066902, 37.15724, 19.665255), (-28.059008, 37.15724, 18.221733), (-28.974205, 37.15724, 16.728266), (-29.809986, 37.15724, 15.188947), (-30.564062, 37.15724, 13.607997), (-31.234362, 37.15724, 11.989748), (-31.819052, 37.15724, 10.338636), (-32.31653, 37.15724, 8.659187), (-32.725426, 37.15724, 6.9560037), (-33.044624, 37.15724, 5.2337546), (-33.27325, 37.15724, 3.4971597), (-33.41068, 37.15724, 1.7509795), (-33.45653, 37.15724, 4.097243e-15), (-33.41068, 37.15724, -1.7509795), (-33.27325, 37.15724, -3.4971597), (-33.044624, 37.15724, -5.2337546), (-32.725426, 37.15724, -6.9560037), (-32.31653, 37.15724, -8.659187), (-31.819052, 37.15724, -10.338636), (-31.234362, 37.15724, -11.989748), (-30.564062, 37.15724, -13.607997), (-29.809986, 37.15724, -15.188947), (-28.974205, 37.15724, -16.728266), (-28.059008, 37.15724, -18.221733), (-27.066902, 37.15724, -19.665255), (-26.000607, 37.15724, -21.054876), (-24.863047, 37.15724, -22.38679), (-23.65734, 37.15724, -23.65734), (-22.38679, 37.15724, -24.863047), (-21.054876, 37.15724, -26.000607), (-19.665255, 37.15724, -27.066902), (-18.221733, 37.15724, -28.059008), (-16.728266, 37.15724, -28.974205), (-15.188947, 37.15724, -29.809986), (-13.607997, 37.15724, -30.564062), (-11.989748, 37.15724, -31.234362), (-10.338636, 37.15724, -31.819052), (-8.659187, 37.15724, -32.31653), (-6.9560037, 37.15724, -32.725426), (-5.2337546, 37.15724, -33.044624), (-3.4971597, 37.15724, -33.27325), (-1.7509795, 37.15724, -33.41068), (-6.145865e-15, 37.15724, -33.45653), (1.7509795, 37.15724, -33.41068), (3.4971597, 37.15724, -33.27325), (5.2337546, 37.15724, -33.044624), (6.9560037, 37.15724, -32.725426), (8.659187, 37.15724, -32.31653), (10.338636, 37.15724, -31.819052), (11.989748, 37.15724, -31.234362), (13.607997, 37.15724, -30.564062), (15.188947, 37.15724, -29.809986), (16.728266, 37.15724, -28.974205), (18.221733, 37.15724, -28.059008), (19.665255, 37.15724, -27.066902), (21.054876, 37.15724, -26.000607), (22.38679, 37.15724, -24.863047), (23.65734, 37.15724, -23.65734), (24.863047, 37.15724, -22.38679), (26.000607, 37.15724, -21.054876), (27.066902, 37.15724, -19.665255), (28.059008, 37.15724, -18.221733), (28.974205, 37.15724, -16.728266), (29.809986, 37.15724, -15.188947), (30.564062, 37.15724, -13.607997), (31.234362, 37.15724, -11.989748), (31.819052, 37.15724, -10.338636), (32.31653, 37.15724, -8.659187), (32.725426, 37.15724, -6.9560037), (33.044624, 37.15724, -5.2337546), (33.27325, 37.15724, -3.4971597), (33.41068, 37.15724, -1.7509795), (31.466019, 38.8573, 0), (31.422897, 38.8573, 1.6468042), (31.293646, 38.8573, 3.2890947), (31.07862, 38.8573, 4.92237), (30.778412, 38.8573, 6.5421534), (30.39384, 38.8573, 8.144005), (29.925962, 38.8573, 9.723535), (29.37606, 38.8573, 11.276413), (28.74564, 38.8573, 12.798383), (28.036428, 38.8573, 14.285274), (27.250372, 38.8573, 15.733009), (26.389624, 38.8573, 17.137623), (25.456545, 38.8573, 18.495262), (24.45369, 38.8573, 19.802208), (23.38381, 38.8573, 21.054876), (22.249836, 38.8573, 22.249836), (21.054876, 38.8573, 23.38381), (19.802208, 38.8573, 24.45369), (18.495262, 38.8573, 25.456545), (17.137623, 38.8573, 26.389624), (15.733009, 38.8573, 27.250372), (14.285274, 38.8573, 28.036428), (12.798383, 38.8573, 28.74564), (11.276413, 38.8573, 29.37606), (9.723535, 38.8573, 29.925962), (8.144005, 38.8573, 30.39384), (6.5421534, 38.8573, 30.778412), (4.92237, 38.8573, 31.07862), (3.2890947, 38.8573, 31.293646), (1.6468042, 38.8573, 31.422897), (1.926738e-15, 38.8573, 31.466019), (-1.6468042, 38.8573, 31.422897), (-3.2890947, 38.8573, 31.293646), (-4.92237, 38.8573, 31.07862), (-6.5421534, 38.8573, 30.778412), (-8.144005, 38.8573, 30.39384), (-9.723535, 38.8573, 29.925962), (-11.276413, 38.8573, 29.37606), (-12.798383, 38.8573, 28.74564), (-14.285274, 38.8573, 28.036428), (-15.733009, 38.8573, 27.250372), (-17.137623, 38.8573, 26.389624), (-18.495262, 38.8573, 25.456545), (-19.802208, 38.8573, 24.45369), (-21.054876, 38.8573, 23.38381), (-22.249836, 38.8573, 22.249836), (-23.38381, 38.8573, 21.054876), (-24.45369, 38.8573, 19.802208), (-25.456545, 38.8573, 18.495262), (-26.389624, 38.8573, 17.137623), (-27.250372, 38.8573, 15.733009), (-28.036428, 38.8573, 14.285274), (-28.74564, 38.8573, 12.798383), (-29.37606, 38.8573, 11.276413), (-29.925962, 38.8573, 9.723535), (-30.39384, 38.8573, 8.144005), (-30.778412, 38.8573, 6.5421534), (-31.07862, 38.8573, 4.92237), (-31.293646, 38.8573, 3.2890947), (-31.422897, 38.8573, 1.6468042), (-31.466019, 38.8573, 3.853476e-15), (-31.422897, 38.8573, -1.6468042), (-31.293646, 38.8573, -3.2890947), (-31.07862, 38.8573, -4.92237), (-30.778412, 38.8573, -6.5421534), (-30.39384, 38.8573, -8.144005), (-29.925962, 38.8573, -9.723535), (-29.37606, 38.8573, -11.276413), (-28.74564, 38.8573, -12.798383), (-28.036428, 38.8573, -14.285274), (-27.250372, 38.8573, -15.733009), (-26.389624, 38.8573, -17.137623), (-25.456545, 38.8573, -18.495262), (-24.45369, 38.8573, -19.802208), (-23.38381, 38.8573, -21.054876), (-22.249836, 38.8573, -22.249836), (-21.054876, 38.8573, -23.38381), (-19.802208, 38.8573, -24.45369), (-18.495262, 38.8573, -25.456545), (-17.137623, 38.8573, -26.389624), (-15.733009, 38.8573, -27.250372), (-14.285274, 38.8573, -28.036428), (-12.798383, 38.8573, -28.74564), (-11.276413, 38.8573, -29.37606), (-9.723535, 38.8573, -29.925962), (-8.144005, 38.8573, -30.39384), (-6.5421534, 38.8573, -30.778412), (-4.92237, 38.8573, -31.07862), (-3.2890947, 38.8573, -31.293646), (-1.6468042, 38.8573, -31.422897), (-5.780214e-15, 38.8573, -31.466019), (1.6468042, 38.8573, -31.422897), (3.2890947, 38.8573, -31.293646), (4.92237, 38.8573, -31.07862), (6.5421534, 38.8573, -30.778412), (8.144005, 38.8573, -30.39384), (9.723535, 38.8573, -29.925962), (11.276413, 38.8573, -29.37606), (12.798383, 38.8573, -28.74564), (14.285274, 38.8573, -28.036428), (15.733009, 38.8573, -27.250372), (17.137623, 38.8573, -26.389624), (18.495262, 38.8573, -25.456545), (19.802208, 38.8573, -24.45369), (21.054876, 38.8573, -23.38381), (22.249836, 38.8573, -22.249836), (23.38381, 38.8573, -21.054876), (24.45369, 38.8573, -19.802208), (25.456545, 38.8573, -18.495262), (26.389624, 38.8573, -17.137623), (27.250372, 38.8573, -15.733009), (28.036428, 38.8573, -14.285274), (28.74564, 38.8573, -12.798383), (29.37606, 38.8573, -11.276413), (29.925962, 38.8573, -9.723535), (30.39384, 38.8573, -8.144005), (30.778412, 38.8573, -6.5421534), (31.07862, 38.8573, -4.92237), (31.293646, 38.8573, -3.2890947), (31.422897, 38.8573, -1.6468042), (29.389263, 40.45085, 0), (29.348986, 40.45085, 1.5381151), (29.228266, 40.45085, 3.0720146), (29.027431, 40.45085, 4.5974936), (28.747036, 40.45085, 6.110371), (28.387848, 40.45085, 7.606501), (27.95085, 40.45085, 9.081781), (27.43724, 40.45085, 10.532169), (26.848427, 40.45085, 11.95369), (26.186026, 40.45085, 13.342446), (25.451847, 40.45085, 14.694632), (24.64791, 40.45085, 16.00654), (23.776413, 40.45085, 17.274574), (22.839746, 40.45085, 18.495262), (21.840479, 40.45085, 19.665255), (20.781347, 40.45085, 20.781347), (19.665255, 40.45085, 21.840479), (18.495262, 40.45085, 22.839746), (17.274574, 40.45085, 23.776413), (16.00654, 40.45085, 24.64791), (14.694632, 40.45085, 25.451847), (13.342446, 40.45085, 26.186026), (11.95369, 40.45085, 26.848427), (10.532169, 40.45085, 27.43724), (9.081781, 40.45085, 27.95085), (7.606501, 40.45085, 28.387848), (6.110371, 40.45085, 28.747036), (4.5974936, 40.45085, 29.027431), (3.0720146, 40.45085, 29.228266), (1.5381151, 40.45085, 29.348986), (1.7995734e-15, 40.45085, 29.389263), (-1.5381151, 40.45085, 29.348986), (-3.0720146, 40.45085, 29.228266), (-4.5974936, 40.45085, 29.027431), (-6.110371, 40.45085, 28.747036), (-7.606501, 40.45085, 28.387848), (-9.081781, 40.45085, 27.95085), (-10.532169, 40.45085, 27.43724), (-11.95369, 40.45085, 26.848427), (-13.342446, 40.45085, 26.186026), (-14.694632, 40.45085, 25.451847), (-16.00654, 40.45085, 24.64791), (-17.274574, 40.45085, 23.776413), (-18.495262, 40.45085, 22.839746), (-19.665255, 40.45085, 21.840479), (-20.781347, 40.45085, 20.781347), (-21.840479, 40.45085, 19.665255), (-22.839746, 40.45085, 18.495262), (-23.776413, 40.45085, 17.274574), (-24.64791, 40.45085, 16.00654), (-25.451847, 40.45085, 14.694632), (-26.186026, 40.45085, 13.342446), (-26.848427, 40.45085, 11.95369), (-27.43724, 40.45085, 10.532169), (-27.95085, 40.45085, 9.081781), (-28.387848, 40.45085, 7.606501), (-28.747036, 40.45085, 6.110371), (-29.027431, 40.45085, 4.5974936), (-29.228266, 40.45085, 3.0720146), (-29.348986, 40.45085, 1.5381151), (-29.389263, 40.45085, 3.5991468e-15), (-29.348986, 40.45085, -1.5381151), (-29.228266, 40.45085, -3.0720146), (-29.027431, 40.45085, -4.5974936), (-28.747036, 40.45085, -6.110371), (-28.387848, 40.45085, -7.606501), (-27.95085, 40.45085, -9.081781), (-27.43724, 40.45085, -10.532169), (-26.848427, 40.45085, -11.95369), (-26.186026, 40.45085, -13.342446), (-25.451847, 40.45085, -14.694632), (-24.64791, 40.45085, -16.00654), (-23.776413, 40.45085, -17.274574), (-22.839746, 40.45085, -18.495262), (-21.840479, 40.45085, -19.665255), (-20.781347, 40.45085, -20.781347), (-19.665255, 40.45085, -21.840479), (-18.495262, 40.45085, -22.839746), (-17.274574, 40.45085, -23.776413), (-16.00654, 40.45085, -24.64791), (-14.694632, 40.45085, -25.451847), (-13.342446, 40.45085, -26.186026), (-11.95369, 40.45085, -26.848427), (-10.532169, 40.45085, -27.43724), (-9.081781, 40.45085, -27.95085), (-7.606501, 40.45085, -28.387848), (-6.110371, 40.45085, -28.747036), (-4.5974936, 40.45085, -29.027431), (-3.0720146, 40.45085, -29.228266), (-1.5381151, 40.45085, -29.348986), (-5.39872e-15, 40.45085, -29.389263), (1.5381151, 40.45085, -29.348986), (3.0720146, 40.45085, -29.228266), (4.5974936, 40.45085, -29.027431), (6.110371, 40.45085, -28.747036), (7.606501, 40.45085, -28.387848), (9.081781, 40.45085, -27.95085), (10.532169, 40.45085, -27.43724), (11.95369, 40.45085, -26.848427), (13.342446, 40.45085, -26.186026), (14.694632, 40.45085, -25.451847), (16.00654, 40.45085, -24.64791), (17.274574, 40.45085, -23.776413), (18.495262, 40.45085, -22.839746), (19.665255, 40.45085, -21.840479), (20.781347, 40.45085, -20.781347), (21.840479, 40.45085, -19.665255), (22.839746, 40.45085, -18.495262), (23.776413, 40.45085, -17.274574), (24.64791, 40.45085, -16.00654), (25.451847, 40.45085, -14.694632), (26.186026, 40.45085, -13.342446), (26.848427, 40.45085, -11.95369), (27.43724, 40.45085, -10.532169), (27.95085, 40.45085, -9.081781), (28.387848, 40.45085, -7.606501), (28.747036, 40.45085, -6.110371), (29.027431, 40.45085, -4.5974936), (29.228266, 40.45085, -3.0720146), (29.348986, 40.45085, -1.5381151), (27.231953, 41.93353, 0), (27.194632, 41.93353, 1.4252102), (27.082773, 41.93353, 2.846514), (26.89668, 41.93353, 4.260016), (26.636868, 41.93353, 5.661841), (26.304045, 41.93353, 7.0481477), (25.899126, 41.93353, 8.415136), (25.423218, 41.93353, 9.759059), (24.877626, 41.93353, 11.076233), (24.263847, 41.93353, 12.363048), (23.583563, 41.93353, 13.615976), (22.838636, 41.93353, 14.831584), (22.031113, 41.93353, 16.00654), (21.1632, 41.93353, 17.137623), (20.237284, 41.93353, 18.221733), (19.255898, 41.93353, 19.255898), (18.221733, 41.93353, 20.237284), (17.137623, 41.93353, 21.1632), (16.00654, 41.93353, 22.031113), (14.831584, 41.93353, 22.838636), (13.615976, 41.93353, 23.583563), (12.363048, 41.93353, 24.263847), (11.076233, 41.93353, 24.877626), (9.759059, 41.93353, 25.423218), (8.415136, 41.93353, 25.899126), (7.0481477, 41.93353, 26.304045), (5.661841, 41.93353, 26.636868), (4.260016, 41.93353, 26.89668), (2.846514, 41.93353, 27.082773), (1.4252102, 41.93353, 27.194632), (1.6674762e-15, 41.93353, 27.231953), (-1.4252102, 41.93353, 27.194632), (-2.846514, 41.93353, 27.082773), (-4.260016, 41.93353, 26.89668), (-5.661841, 41.93353, 26.636868), (-7.0481477, 41.93353, 26.304045), (-8.415136, 41.93353, 25.899126), (-9.759059, 41.93353, 25.423218), (-11.076233, 41.93353, 24.877626), (-12.363048, 41.93353, 24.263847), (-13.615976, 41.93353, 23.583563), (-14.831584, 41.93353, 22.838636), (-16.00654, 41.93353, 22.031113), (-17.137623, 41.93353, 21.1632), (-18.221733, 41.93353, 20.237284), (-19.255898, 41.93353, 19.255898), (-20.237284, 41.93353, 18.221733), (-21.1632, 41.93353, 17.137623), (-22.031113, 41.93353, 16.00654), (-22.838636, 41.93353, 14.831584), (-23.583563, 41.93353, 13.615976), (-24.263847, 41.93353, 12.363048), (-24.877626, 41.93353, 11.076233), (-25.423218, 41.93353, 9.759059), (-25.899126, 41.93353, 8.415136), (-26.304045, 41.93353, 7.0481477), (-26.636868, 41.93353, 5.661841), (-26.89668, 41.93353, 4.260016), (-27.082773, 41.93353, 2.846514), (-27.194632, 41.93353, 1.4252102), (-27.231953, 41.93353, 3.3349523e-15), (-27.194632, 41.93353, -1.4252102), (-27.082773, 41.93353, -2.846514), (-26.89668, 41.93353, -4.260016), (-26.636868, 41.93353, -5.661841), (-26.304045, 41.93353, -7.0481477), (-25.899126, 41.93353, -8.415136), (-25.423218, 41.93353, -9.759059), (-24.877626, 41.93353, -11.076233), (-24.263847, 41.93353, -12.363048), (-23.583563, 41.93353, -13.615976), (-22.838636, 41.93353, -14.831584), (-22.031113, 41.93353, -16.00654), (-21.1632, 41.93353, -17.137623), (-20.237284, 41.93353, -18.221733), (-19.255898, 41.93353, -19.255898), (-18.221733, 41.93353, -20.237284), (-17.137623, 41.93353, -21.1632), (-16.00654, 41.93353, -22.031113), (-14.831584, 41.93353, -22.838636), (-13.615976, 41.93353, -23.583563), (-12.363048, 41.93353, -24.263847), (-11.076233, 41.93353, -24.877626), (-9.759059, 41.93353, -25.423218), (-8.415136, 41.93353, -25.899126), (-7.0481477, 41.93353, -26.304045), (-5.661841, 41.93353, -26.636868), (-4.260016, 41.93353, -26.89668), (-2.846514, 41.93353, -27.082773), (-1.4252102, 41.93353, -27.194632), (-5.0024284e-15, 41.93353, -27.231953), (1.4252102, 41.93353, -27.194632), (2.846514, 41.93353, -27.082773), (4.260016, 41.93353, -26.89668), (5.661841, 41.93353, -26.636868), (7.0481477, 41.93353, -26.304045), (8.415136, 41.93353, -25.899126), (9.759059, 41.93353, -25.423218), (11.076233, 41.93353, -24.877626), (12.363048, 41.93353, -24.263847), (13.615976, 41.93353, -23.583563), (14.831584, 41.93353, -22.838636), (16.00654, 41.93353, -22.031113), (17.137623, 41.93353, -21.1632), (18.221733, 41.93353, -20.237284), (19.255898, 41.93353, -19.255898), (20.237284, 41.93353, -18.221733), (21.1632, 41.93353, -17.137623), (22.031113, 41.93353, -16.00654), (22.838636, 41.93353, -14.831584), (23.583563, 41.93353, -13.615976), (24.263847, 41.93353, -12.363048), (24.877626, 41.93353, -11.076233), (25.423218, 41.93353, -9.759059), (25.899126, 41.93353, -8.415136), (26.304045, 41.93353, -7.0481477), (26.636868, 41.93353, -5.661841), (26.89668, 41.93353, -4.260016), (27.082773, 41.93353, -2.846514), (27.194632, 41.93353, -1.4252102), (25, 43.30127, 0), (24.965738, 43.30127, 1.308399), (24.863047, 43.30127, 2.6132116), (24.69221, 43.30127, 3.9108617), (24.45369, 43.30127, 5.197792), (24.148146, 43.30127, 6.470476), (23.776413, 43.30127, 7.725425), (23.33951, 43.30127, 8.959199), (22.838636, 43.30127, 10.168416), (22.275164, 43.30127, 11.349763), (21.650635, 43.30127, 12.5), (20.966764, 43.30127, 13.615976), (20.225426, 43.30127, 14.694632), (19.42865, 43.30127, 15.733009), (18.57862, 43.30127, 16.728266), (17.67767, 43.30127, 17.67767), (16.728266, 43.30127, 18.57862), (15.733009, 43.30127, 19.42865), (14.694632, 43.30127, 20.225426), (13.615976, 43.30127, 20.966764), (12.5, 43.30127, 21.650635), (11.349763, 43.30127, 22.275164), (10.168416, 43.30127, 22.838636), (8.959199, 43.30127, 23.33951), (7.725425, 43.30127, 23.776413), (6.470476, 43.30127, 24.148146), (5.197792, 43.30127, 24.45369), (3.9108617, 43.30127, 24.69221), (2.6132116, 43.30127, 24.863047), (1.308399, 43.30127, 24.965738), (1.5308084e-15, 43.30127, 25), (-1.308399, 43.30127, 24.965738), (-2.6132116, 43.30127, 24.863047), (-3.9108617, 43.30127, 24.69221), (-5.197792, 43.30127, 24.45369), (-6.470476, 43.30127, 24.148146), (-7.725425, 43.30127, 23.776413), (-8.959199, 43.30127, 23.33951), (-10.168416, 43.30127, 22.838636), (-11.349763, 43.30127, 22.275164), (-12.5, 43.30127, 21.650635), (-13.615976, 43.30127, 20.966764), (-14.694632, 43.30127, 20.225426), (-15.733009, 43.30127, 19.42865), (-16.728266, 43.30127, 18.57862), (-17.67767, 43.30127, 17.67767), (-18.57862, 43.30127, 16.728266), (-19.42865, 43.30127, 15.733009), (-20.225426, 43.30127, 14.694632), (-20.966764, 43.30127, 13.615976), (-21.650635, 43.30127, 12.5), (-22.275164, 43.30127, 11.349763), (-22.838636, 43.30127, 10.168416), (-23.33951, 43.30127, 8.959199), (-23.776413, 43.30127, 7.725425), (-24.148146, 43.30127, 6.470476), (-24.45369, 43.30127, 5.197792), (-24.69221, 43.30127, 3.9108617), (-24.863047, 43.30127, 2.6132116), (-24.965738, 43.30127, 1.308399), (-25, 43.30127, 3.0616169e-15), (-24.965738, 43.30127, -1.308399), (-24.863047, 43.30127, -2.6132116), (-24.69221, 43.30127, -3.9108617), (-24.45369, 43.30127, -5.197792), (-24.148146, 43.30127, -6.470476), (-23.776413, 43.30127, -7.725425), (-23.33951, 43.30127, -8.959199), (-22.838636, 43.30127, -10.168416), (-22.275164, 43.30127, -11.349763), (-21.650635, 43.30127, -12.5), (-20.966764, 43.30127, -13.615976), (-20.225426, 43.30127, -14.694632), (-19.42865, 43.30127, -15.733009), (-18.57862, 43.30127, -16.728266), (-17.67767, 43.30127, -17.67767), (-16.728266, 43.30127, -18.57862), (-15.733009, 43.30127, -19.42865), (-14.694632, 43.30127, -20.225426), (-13.615976, 43.30127, -20.966764), (-12.5, 43.30127, -21.650635), (-11.349763, 43.30127, -22.275164), (-10.168416, 43.30127, -22.838636), (-8.959199, 43.30127, -23.33951), (-7.725425, 43.30127, -23.776413), (-6.470476, 43.30127, -24.148146), (-5.197792, 43.30127, -24.45369), (-3.9108617, 43.30127, -24.69221), (-2.6132116, 43.30127, -24.863047), (-1.308399, 43.30127, -24.965738), (-4.5924254e-15, 43.30127, -25), (1.308399, 43.30127, -24.965738), (2.6132116, 43.30127, -24.863047), (3.9108617, 43.30127, -24.69221), (5.197792, 43.30127, -24.45369), (6.470476, 43.30127, -24.148146), (7.725425, 43.30127, -23.776413), (8.959199, 43.30127, -23.33951), (10.168416, 43.30127, -22.838636), (11.349763, 43.30127, -22.275164), (12.5, 43.30127, -21.650635), (13.615976, 43.30127, -20.966764), (14.694632, 43.30127, -20.225426), (15.733009, 43.30127, -19.42865), (16.728266, 43.30127, -18.57862), (17.67767, 43.30127, -17.67767), (18.57862, 43.30127, -16.728266), (19.42865, 43.30127, -15.733009), (20.225426, 43.30127, -14.694632), (20.966764, 43.30127, -13.615976), (21.650635, 43.30127, -12.5), (22.275164, 43.30127, -11.349763), (22.838636, 43.30127, -10.168416), (23.33951, 43.30127, -8.959199), (23.776413, 43.30127, -7.725425), (24.148146, 43.30127, -6.470476), (24.45369, 43.30127, -5.197792), (24.69221, 43.30127, -3.9108617), (24.863047, 43.30127, -2.6132116), (24.965738, 43.30127, -1.308399), (22.699526, 44.550327, 0), (22.668417, 44.550327, 1.1880014), (22.575174, 44.550327, 2.3727465), (22.420055, 44.550327, 3.550988), (22.203485, 44.550327, 4.7194967), (21.926058, 44.550327, 5.8750696), (21.588531, 44.550327, 7.014539), (21.191832, 44.550327, 8.134782), (20.737047, 44.550327, 9.232729), (20.225426, 44.550327, 10.305368), (19.658365, 44.550327, 11.349763), (19.037424, 44.550327, 12.363048), (18.364302, 44.550327, 13.342446), (17.640844, 44.550327, 14.285274), (16.869034, 44.550327, 15.188947), (16.050987, 44.550327, 16.050987), (15.188947, 44.550327, 16.869034), (14.285274, 44.550327, 17.640844), (13.342446, 44.550327, 18.364302), (12.363048, 44.550327, 19.037424), (11.349763, 44.550327, 19.658365), (10.305368, 44.550327, 20.225426), (9.232729, 44.550327, 20.737047), (8.134782, 44.550327, 21.191832), (7.014539, 44.550327, 21.588531), (5.8750696, 44.550327, 21.926058), (4.7194967, 44.550327, 22.203485), (3.550988, 44.550327, 22.420055), (2.3727465, 44.550327, 22.575174), (1.1880014, 44.550327, 22.668417), (1.3899451e-15, 44.550327, 22.699526), (-1.1880014, 44.550327, 22.668417), (-2.3727465, 44.550327, 22.575174), (-3.550988, 44.550327, 22.420055), (-4.7194967, 44.550327, 22.203485), (-5.8750696, 44.550327, 21.926058), (-7.014539, 44.550327, 21.588531), (-8.134782, 44.550327, 21.191832), (-9.232729, 44.550327, 20.737047), (-10.305368, 44.550327, 20.225426), (-11.349763, 44.550327, 19.658365), (-12.363048, 44.550327, 19.037424), (-13.342446, 44.550327, 18.364302), (-14.285274, 44.550327, 17.640844), (-15.188947, 44.550327, 16.869034), (-16.050987, 44.550327, 16.050987), (-16.869034, 44.550327, 15.188947), (-17.640844, 44.550327, 14.285274), (-18.364302, 44.550327, 13.342446), (-19.037424, 44.550327, 12.363048), (-19.658365, 44.550327, 11.349763), (-20.225426, 44.550327, 10.305368), (-20.737047, 44.550327, 9.232729), (-21.191832, 44.550327, 8.134782), (-21.588531, 44.550327, 7.014539), (-21.926058, 44.550327, 5.8750696), (-22.203485, 44.550327, 4.7194967), (-22.420055, 44.550327, 3.550988), (-22.575174, 44.550327, 2.3727465), (-22.668417, 44.550327, 1.1880014), (-22.699526, 44.550327, 2.7798901e-15), (-22.668417, 44.550327, -1.1880014), (-22.575174, 44.550327, -2.3727465), (-22.420055, 44.550327, -3.550988), (-22.203485, 44.550327, -4.7194967), (-21.926058, 44.550327, -5.8750696), (-21.588531, 44.550327, -7.014539), (-21.191832, 44.550327, -8.134782), (-20.737047, 44.550327, -9.232729), (-20.225426, 44.550327, -10.305368), (-19.658365, 44.550327, -11.349763), (-19.037424, 44.550327, -12.363048), (-18.364302, 44.550327, -13.342446), (-17.640844, 44.550327, -14.285274), (-16.869034, 44.550327, -15.188947), (-16.050987, 44.550327, -16.050987), (-15.188947, 44.550327, -16.869034), (-14.285274, 44.550327, -17.640844), (-13.342446, 44.550327, -18.364302), (-12.363048, 44.550327, -19.037424), (-11.349763, 44.550327, -19.658365), (-10.305368, 44.550327, -20.225426), (-9.232729, 44.550327, -20.737047), (-8.134782, 44.550327, -21.191832), (-7.014539, 44.550327, -21.588531), (-5.8750696, 44.550327, -21.926058), (-4.7194967, 44.550327, -22.203485), (-3.550988, 44.550327, -22.420055), (-2.3727465, 44.550327, -22.575174), (-1.1880014, 44.550327, -22.668417), (-4.169835e-15, 44.550327, -22.699526), (1.1880014, 44.550327, -22.668417), (2.3727465, 44.550327, -22.575174), (3.550988, 44.550327, -22.420055), (4.7194967, 44.550327, -22.203485), (5.8750696, 44.550327, -21.926058), (7.014539, 44.550327, -21.588531), (8.134782, 44.550327, -21.191832), (9.232729, 44.550327, -20.737047), (10.305368, 44.550327, -20.225426), (11.349763, 44.550327, -19.658365), (12.363048, 44.550327, -19.037424), (13.342446, 44.550327, -18.364302), (14.285274, 44.550327, -17.640844), (15.188947, 44.550327, -16.869034), (16.050987, 44.550327, -16.050987), (16.869034, 44.550327, -15.188947), (17.640844, 44.550327, -14.285274), (18.364302, 44.550327, -13.342446), (19.037424, 44.550327, -12.363048), (19.658365, 44.550327, -11.349763), (20.225426, 44.550327, -10.305368), (20.737047, 44.550327, -9.232729), (21.191832, 44.550327, -8.134782), (21.588531, 44.550327, -7.014539), (21.926058, 44.550327, -5.8750696), (22.203485, 44.550327, -4.7194967), (22.420055, 44.550327, -3.550988), (22.575174, 44.550327, -2.3727465), (22.668417, 44.550327, -1.1880014), (20.336832, 45.677273, 0), (20.308962, 45.677273, 1.0643475), (20.225426, 45.677273, 2.1257777), (20.086452, 45.677273, 3.1813815), (19.892424, 45.677273, 4.2282653), (19.643871, 45.677273, 5.2635593), (19.341476, 45.677273, 6.2844267), (18.986069, 45.677273, 7.288069), (18.57862, 45.677273, 8.271735), (18.12025, 45.677273, 9.232729), (17.612213, 45.677273, 10.168416), (17.055902, 45.677273, 11.076233), (16.452843, 45.677273, 11.95369), (15.804687, 45.677273, 12.798383), (15.113212, 45.677273, 13.607997), (14.380312, 45.677273, 14.380312), (13.607997, 45.677273, 15.113212), (12.798383, 45.677273, 15.804687), (11.95369, 45.677273, 16.452843), (11.076233, 45.677273, 17.055902), (10.168416, 45.677273, 17.612213), (9.232729, 45.677273, 18.12025), (8.271735, 45.677273, 18.57862), (7.288069, 45.677273, 18.986069), (6.2844267, 45.677273, 19.341476), (5.2635593, 45.677273, 19.643871), (4.2282653, 45.677273, 19.892424), (3.1813815, 45.677273, 20.086452), (2.1257777, 45.677273, 20.225426), (1.0643475, 45.677273, 20.308962), (1.2452718e-15, 45.677273, 20.336832), (-1.0643475, 45.677273, 20.308962), (-2.1257777, 45.677273, 20.225426), (-3.1813815, 45.677273, 20.086452), (-4.2282653, 45.677273, 19.892424), (-5.2635593, 45.677273, 19.643871), (-6.2844267, 45.677273, 19.341476), (-7.288069, 45.677273, 18.986069), (-8.271735, 45.677273, 18.57862), (-9.232729, 45.677273, 18.12025), (-10.168416, 45.677273, 17.612213), (-11.076233, 45.677273, 17.055902), (-11.95369, 45.677273, 16.452843), (-12.798383, 45.677273, 15.804687), (-13.607997, 45.677273, 15.113212), (-14.380312, 45.677273, 14.380312), (-15.113212, 45.677273, 13.607997), (-15.804687, 45.677273, 12.798383), (-16.452843, 45.677273, 11.95369), (-17.055902, 45.677273, 11.076233), (-17.612213, 45.677273, 10.168416), (-18.12025, 45.677273, 9.232729), (-18.57862, 45.677273, 8.271735), (-18.986069, 45.677273, 7.288069), (-19.341476, 45.677273, 6.2844267), (-19.643871, 45.677273, 5.2635593), (-19.892424, 45.677273, 4.2282653), (-20.086452, 45.677273, 3.1813815), (-20.225426, 45.677273, 2.1257777), (-20.308962, 45.677273, 1.0643475), (-20.336832, 45.677273, 2.4905437e-15), (-20.308962, 45.677273, -1.0643475), (-20.225426, 45.677273, -2.1257777), (-20.086452, 45.677273, -3.1813815), (-19.892424, 45.677273, -4.2282653), (-19.643871, 45.677273, -5.2635593), (-19.341476, 45.677273, -6.2844267), (-18.986069, 45.677273, -7.288069), (-18.57862, 45.677273, -8.271735), (-18.12025, 45.677273, -9.232729), (-17.612213, 45.677273, -10.168416), (-17.055902, 45.677273, -11.076233), (-16.452843, 45.677273, -11.95369), (-15.804687, 45.677273, -12.798383), (-15.113212, 45.677273, -13.607997), (-14.380312, 45.677273, -14.380312), (-13.607997, 45.677273, -15.113212), (-12.798383, 45.677273, -15.804687), (-11.95369, 45.677273, -16.452843), (-11.076233, 45.677273, -17.055902), (-10.168416, 45.677273, -17.612213), (-9.232729, 45.677273, -18.12025), (-8.271735, 45.677273, -18.57862), (-7.288069, 45.677273, -18.986069), (-6.2844267, 45.677273, -19.341476), (-5.2635593, 45.677273, -19.643871), (-4.2282653, 45.677273, -19.892424), (-3.1813815, 45.677273, -20.086452), (-2.1257777, 45.677273, -20.225426), (-1.0643475, 45.677273, -20.308962), (-3.7358155e-15, 45.677273, -20.336832), (1.0643475, 45.677273, -20.308962), (2.1257777, 45.677273, -20.225426), (3.1813815, 45.677273, -20.086452), (4.2282653, 45.677273, -19.892424), (5.2635593, 45.677273, -19.643871), (6.2844267, 45.677273, -19.341476), (7.288069, 45.677273, -18.986069), (8.271735, 45.677273, -18.57862), (9.232729, 45.677273, -18.12025), (10.168416, 45.677273, -17.612213), (11.076233, 45.677273, -17.055902), (11.95369, 45.677273, -16.452843), (12.798383, 45.677273, -15.804687), (13.607997, 45.677273, -15.113212), (14.380312, 45.677273, -14.380312), (15.113212, 45.677273, -13.607997), (15.804687, 45.677273, -12.798383), (16.452843, 45.677273, -11.95369), (17.055902, 45.677273, -11.076233), (17.612213, 45.677273, -10.168416), (18.12025, 45.677273, -9.232729), (18.57862, 45.677273, -8.271735), (18.986069, 45.677273, -7.288069), (19.341476, 45.677273, -6.2844267), (19.643871, 45.677273, -5.2635593), (19.892424, 45.677273, -4.2282653), (20.086452, 45.677273, -3.1813815), (20.225426, 45.677273, -2.1257777), (20.308962, 45.677273, -1.0643475), (17.918398, 46.67902, 0), (17.89384, 46.67902, 0.93777645), (17.820238, 46.67902, 1.8729825), (17.697792, 46.67902, 2.8030548), (17.526838, 46.67902, 3.7254443), (17.307842, 46.67902, 4.6376224), (17.041409, 46.67902, 5.5370893), (16.728266, 46.67902, 6.4213796), (16.36927, 46.67902, 7.288069), (15.965409, 46.67902, 8.134782), (15.517787, 46.67902, 8.959199), (15.027633, 46.67902, 9.759059), (14.496288, 46.67902, 10.532169), (13.92521, 46.67902, 11.276413), (13.315965, 46.67902, 11.989748), (12.67022, 46.67902, 12.67022), (11.989748, 46.67902, 13.315965), (11.276413, 46.67902, 13.92521), (10.532169, 46.67902, 14.496288), (9.759059, 46.67902, 15.027633), (8.959199, 46.67902, 15.517787), (8.134782, 46.67902, 15.965409), (7.288069, 46.67902, 16.36927), (6.4213796, 46.67902, 16.728266), (5.5370893, 46.67902, 17.041409), (4.6376224, 46.67902, 17.307842), (3.7254443, 46.67902, 17.526838), (2.8030548, 46.67902, 17.697792), (1.8729825, 46.67902, 17.820238), (0.93777645, 46.67902, 17.89384), (1.0971854e-15, 46.67902, 17.918398), (-0.93777645, 46.67902, 17.89384), (-1.8729825, 46.67902, 17.820238), (-2.8030548, 46.67902, 17.697792), (-3.7254443, 46.67902, 17.526838), (-4.6376224, 46.67902, 17.307842), (-5.5370893, 46.67902, 17.041409), (-6.4213796, 46.67902, 16.728266), (-7.288069, 46.67902, 16.36927), (-8.134782, 46.67902, 15.965409), (-8.959199, 46.67902, 15.517787), (-9.759059, 46.67902, 15.027633), (-10.532169, 46.67902, 14.496288), (-11.276413, 46.67902, 13.92521), (-11.989748, 46.67902, 13.315965), (-12.67022, 46.67902, 12.67022), (-13.315965, 46.67902, 11.989748), (-13.92521, 46.67902, 11.276413), (-14.496288, 46.67902, 10.532169), (-15.027633, 46.67902, 9.759059), (-15.517787, 46.67902, 8.959199), (-15.965409, 46.67902, 8.134782), (-16.36927, 46.67902, 7.288069), (-16.728266, 46.67902, 6.4213796), (-17.041409, 46.67902, 5.5370893), (-17.307842, 46.67902, 4.6376224), (-17.526838, 46.67902, 3.7254443), (-17.697792, 46.67902, 2.8030548), (-17.820238, 46.67902, 1.8729825), (-17.89384, 46.67902, 0.93777645), (-17.918398, 46.67902, 2.1943708e-15), (-17.89384, 46.67902, -0.93777645), (-17.820238, 46.67902, -1.8729825), (-17.697792, 46.67902, -2.8030548), (-17.526838, 46.67902, -3.7254443), (-17.307842, 46.67902, -4.6376224), (-17.041409, 46.67902, -5.5370893), (-16.728266, 46.67902, -6.4213796), (-16.36927, 46.67902, -7.288069), (-15.965409, 46.67902, -8.134782), (-15.517787, 46.67902, -8.959199), (-15.027633, 46.67902, -9.759059), (-14.496288, 46.67902, -10.532169), (-13.92521, 46.67902, -11.276413), (-13.315965, 46.67902, -11.989748), (-12.67022, 46.67902, -12.67022), (-11.989748, 46.67902, -13.315965), (-11.276413, 46.67902, -13.92521), (-10.532169, 46.67902, -14.496288), (-9.759059, 46.67902, -15.027633), (-8.959199, 46.67902, -15.517787), (-8.134782, 46.67902, -15.965409), (-7.288069, 46.67902, -16.36927), (-6.4213796, 46.67902, -16.728266), (-5.5370893, 46.67902, -17.041409), (-4.6376224, 46.67902, -17.307842), (-3.7254443, 46.67902, -17.526838), (-2.8030548, 46.67902, -17.697792), (-1.8729825, 46.67902, -17.820238), (-0.93777645, 46.67902, -17.89384), (-3.2915563e-15, 46.67902, -17.918398), (0.93777645, 46.67902, -17.89384), (1.8729825, 46.67902, -17.820238), (2.8030548, 46.67902, -17.697792), (3.7254443, 46.67902, -17.526838), (4.6376224, 46.67902, -17.307842), (5.5370893, 46.67902, -17.041409), (6.4213796, 46.67902, -16.728266), (7.288069, 46.67902, -16.36927), (8.134782, 46.67902, -15.965409), (8.959199, 46.67902, -15.517787), (9.759059, 46.67902, -15.027633), (10.532169, 46.67902, -14.496288), (11.276413, 46.67902, -13.92521), (11.989748, 46.67902, -13.315965), (12.67022, 46.67902, -12.67022), (13.315965, 46.67902, -11.989748), (13.92521, 46.67902, -11.276413), (14.496288, 46.67902, -10.532169), (15.027633, 46.67902, -9.759059), (15.517787, 46.67902, -8.959199), (15.965409, 46.67902, -8.134782), (16.36927, 46.67902, -7.288069), (16.728266, 46.67902, -6.4213796), (17.041409, 46.67902, -5.5370893), (17.307842, 46.67902, -4.6376224), (17.526838, 46.67902, -3.7254443), (17.697792, 46.67902, -2.8030548), (17.820238, 46.67902, -1.8729825), (17.89384, 46.67902, -0.93777645), (15.45085, 47.552826, 0), (15.429675, 47.552826, 0.808635), (15.366208, 47.552826, 1.6150535), (15.260624, 47.552826, 2.4170454), (15.113212, 47.552826, 3.2124124), (14.924375, 47.552826, 3.998974), (14.694632, 47.552826, 4.774575), (14.424611, 47.552826, 5.5370893), (14.115053, 47.552826, 6.2844267), (13.766808, 47.552826, 7.014539), (13.380828, 47.552826, 7.725425), (12.958173, 47.552826, 8.415136), (12.5, 47.552826, 9.081781), (12.0075655, 47.552826, 9.723535), (11.482219, 47.552826, 10.338636), (10.925401, 47.552826, 10.925401), (10.338636, 47.552826, 11.482219), (9.723535, 47.552826, 12.0075655), (9.081781, 47.552826, 12.5), (8.415136, 47.552826, 12.958173), (7.725425, 47.552826, 13.380828), (7.014539, 47.552826, 13.766808), (6.2844267, 47.552826, 14.115053), (5.5370893, 47.552826, 14.424611), (4.774575, 47.552826, 14.694632), (3.998974, 47.552826, 14.924375), (3.2124124, 47.552826, 15.113212), (2.4170454, 47.552826, 15.260624), (1.6150535, 47.552826, 15.366208), (0.808635, 47.552826, 15.429675), (9.460917e-16, 47.552826, 15.45085), (-0.808635, 47.552826, 15.429675), (-1.6150535, 47.552826, 15.366208), (-2.4170454, 47.552826, 15.260624), (-3.2124124, 47.552826, 15.113212), (-3.998974, 47.552826, 14.924375), (-4.774575, 47.552826, 14.694632), (-5.5370893, 47.552826, 14.424611), (-6.2844267, 47.552826, 14.115053), (-7.014539, 47.552826, 13.766808), (-7.725425, 47.552826, 13.380828), (-8.415136, 47.552826, 12.958173), (-9.081781, 47.552826, 12.5), (-9.723535, 47.552826, 12.0075655), (-10.338636, 47.552826, 11.482219), (-10.925401, 47.552826, 10.925401), (-11.482219, 47.552826, 10.338636), (-12.0075655, 47.552826, 9.723535), (-12.5, 47.552826, 9.081781), (-12.958173, 47.552826, 8.415136), (-13.380828, 47.552826, 7.725425), (-13.766808, 47.552826, 7.014539), (-14.115053, 47.552826, 6.2844267), (-14.424611, 47.552826, 5.5370893), (-14.694632, 47.552826, 4.774575), (-14.924375, 47.552826, 3.998974), (-15.113212, 47.552826, 3.2124124), (-15.260624, 47.552826, 2.4170454), (-15.366208, 47.552826, 1.6150535), (-15.429675, 47.552826, 0.808635), (-15.45085, 47.552826, 1.8921833e-15), (-15.429675, 47.552826, -0.808635), (-15.366208, 47.552826, -1.6150535), (-15.260624, 47.552826, -2.4170454), (-15.113212, 47.552826, -3.2124124), (-14.924375, 47.552826, -3.998974), (-14.694632, 47.552826, -4.774575), (-14.424611, 47.552826, -5.5370893), (-14.115053, 47.552826, -6.2844267), (-13.766808, 47.552826, -7.014539), (-13.380828, 47.552826, -7.725425), (-12.958173, 47.552826, -8.415136), (-12.5, 47.552826, -9.081781), (-12.0075655, 47.552826, -9.723535), (-11.482219, 47.552826, -10.338636), (-10.925401, 47.552826, -10.925401), (-10.338636, 47.552826, -11.482219), (-9.723535, 47.552826, -12.0075655), (-9.081781, 47.552826, -12.5), (-8.415136, 47.552826, -12.958173), (-7.725425, 47.552826, -13.380828), (-7.014539, 47.552826, -13.766808), (-6.2844267, 47.552826, -14.115053), (-5.5370893, 47.552826, -14.424611), (-4.774575, 47.552826, -14.694632), (-3.998974, 47.552826, -14.924375), (-3.2124124, 47.552826, -15.113212), (-2.4170454, 47.552826, -15.260624), (-1.6150535, 47.552826, -15.366208), (-0.808635, 47.552826, -15.429675), (-2.838275e-15, 47.552826, -15.45085), (0.808635, 47.552826, -15.429675), (1.6150535, 47.552826, -15.366208), (2.4170454, 47.552826, -15.260624), (3.2124124, 47.552826, -15.113212), (3.998974, 47.552826, -14.924375), (4.774575, 47.552826, -14.694632), (5.5370893, 47.552826, -14.424611), (6.2844267, 47.552826, -14.115053), (7.014539, 47.552826, -13.766808), (7.725425, 47.552826, -13.380828), (8.415136, 47.552826, -12.958173), (9.081781, 47.552826, -12.5), (9.723535, 47.552826, -12.0075655), (10.338636, 47.552826, -11.482219), (10.925401, 47.552826, -10.925401), (11.482219, 47.552826, -10.338636), (12.0075655, 47.552826, -9.723535), (12.5, 47.552826, -9.081781), (12.958173, 47.552826, -8.415136), (13.380828, 47.552826, -7.725425), (13.766808, 47.552826, -7.014539), (14.115053, 47.552826, -6.2844267), (14.424611, 47.552826, -5.5370893), (14.694632, 47.552826, -4.774575), (14.924375, 47.552826, -3.998974), (15.113212, 47.552826, -3.2124124), (15.260624, 47.552826, -2.4170454), (15.366208, 47.552826, -1.6150535), (15.429675, 47.552826, -0.808635), (12.940952, 48.29629, 0), (12.923217, 48.29629, 0.6772771), (12.87006, 48.29629, 1.3526978), (12.781628, 48.29629, 2.024411), (12.658161, 48.29629, 2.6905754), (12.5, 48.29629, 3.349365), (12.307577, 48.29629, 3.998974), (12.08142, 48.29629, 4.6376224), (11.822148, 48.29629, 5.2635593), (11.530473, 48.29629, 5.8750696), (11.207193, 48.29629, 6.470476), (10.853196, 48.29629, 7.0481477), (10.46945, 48.29629, 7.606501), (10.057009, 48.29629, 8.144005), (9.617002, 48.29629, 8.659187), (9.150635, 48.29629, 9.150635), (8.659187, 48.29629, 9.617002), (8.144005, 48.29629, 10.057009), (7.606501, 48.29629, 10.46945), (7.0481477, 48.29629, 10.853196), (6.470476, 48.29629, 11.207193), (5.8750696, 48.29629, 11.530473), (5.2635593, 48.29629, 11.822148), (4.6376224, 48.29629, 12.08142), (3.998974, 48.29629, 12.307577), (3.349365, 48.29629, 12.5), (2.6905754, 48.29629, 12.658161), (2.024411, 48.29629, 12.781628), (1.3526978, 48.29629, 12.87006), (0.6772771, 48.29629, 12.923217), (7.924048e-16, 48.29629, 12.940952), (-0.6772771, 48.29629, 12.923217), (-1.3526978, 48.29629, 12.87006), (-2.024411, 48.29629, 12.781628), (-2.6905754, 48.29629, 12.658161), (-3.349365, 48.29629, 12.5), (-3.998974, 48.29629, 12.307577), (-4.6376224, 48.29629, 12.08142), (-5.2635593, 48.29629, 11.822148), (-5.8750696, 48.29629, 11.530473), (-6.470476, 48.29629, 11.207193), (-7.0481477, 48.29629, 10.853196), (-7.606501, 48.29629, 10.46945), (-8.144005, 48.29629, 10.057009), (-8.659187, 48.29629, 9.617002), (-9.150635, 48.29629, 9.150635), (-9.617002, 48.29629, 8.659187), (-10.057009, 48.29629, 8.144005), (-10.46945, 48.29629, 7.606501), (-10.853196, 48.29629, 7.0481477), (-11.207193, 48.29629, 6.470476), (-11.530473, 48.29629, 5.8750696), (-11.822148, 48.29629, 5.2635593), (-12.08142, 48.29629, 4.6376224), (-12.307577, 48.29629, 3.998974), (-12.5, 48.29629, 3.349365), (-12.658161, 48.29629, 2.6905754), (-12.781628, 48.29629, 2.024411), (-12.87006, 48.29629, 1.3526978), (-12.923217, 48.29629, 0.6772771), (-12.940952, 48.29629, 1.5848095e-15), (-12.923217, 48.29629, -0.6772771), (-12.87006, 48.29629, -1.3526978), (-12.781628, 48.29629, -2.024411), (-12.658161, 48.29629, -2.6905754), (-12.5, 48.29629, -3.349365), (-12.307577, 48.29629, -3.998974), (-12.08142, 48.29629, -4.6376224), (-11.822148, 48.29629, -5.2635593), (-11.530473, 48.29629, -5.8750696), (-11.207193, 48.29629, -6.470476), (-10.853196, 48.29629, -7.0481477), (-10.46945, 48.29629, -7.606501), (-10.057009, 48.29629, -8.144005), (-9.617002, 48.29629, -8.659187), (-9.150635, 48.29629, -9.150635), (-8.659187, 48.29629, -9.617002), (-8.144005, 48.29629, -10.057009), (-7.606501, 48.29629, -10.46945), (-7.0481477, 48.29629, -10.853196), (-6.470476, 48.29629, -11.207193), (-5.8750696, 48.29629, -11.530473), (-5.2635593, 48.29629, -11.822148), (-4.6376224, 48.29629, -12.08142), (-3.998974, 48.29629, -12.307577), (-3.349365, 48.29629, -12.5), (-2.6905754, 48.29629, -12.658161), (-2.024411, 48.29629, -12.781628), (-1.3526978, 48.29629, -12.87006), (-0.6772771, 48.29629, -12.923217), (-2.3772143e-15, 48.29629, -12.940952), (0.6772771, 48.29629, -12.923217), (1.3526978, 48.29629, -12.87006), (2.024411, 48.29629, -12.781628), (2.6905754, 48.29629, -12.658161), (3.349365, 48.29629, -12.5), (3.998974, 48.29629, -12.307577), (4.6376224, 48.29629, -12.08142), (5.2635593, 48.29629, -11.822148), (5.8750696, 48.29629, -11.530473), (6.470476, 48.29629, -11.207193), (7.0481477, 48.29629, -10.853196), (7.606501, 48.29629, -10.46945), (8.144005, 48.29629, -10.057009), (8.659187, 48.29629, -9.617002), (9.150635, 48.29629, -9.150635), (9.617002, 48.29629, -8.659187), (10.057009, 48.29629, -8.144005), (10.46945, 48.29629, -7.606501), (10.853196, 48.29629, -7.0481477), (11.207193, 48.29629, -6.470476), (11.530473, 48.29629, -5.8750696), (11.822148, 48.29629, -5.2635593), (12.08142, 48.29629, -4.6376224), (12.307577, 48.29629, -3.998974), (12.5, 48.29629, -3.349365), (12.658161, 48.29629, -2.6905754), (12.781628, 48.29629, -2.024411), (12.87006, 48.29629, -1.3526978), (12.923217, 48.29629, -0.6772771), (10.395584, 48.90738, 0), (10.381338, 48.90738, 0.54406285), (10.338636, 48.90738, 1.0866345), (10.267597, 48.90738, 1.6262277), (10.168416, 48.90738, 2.1613636), (10.041364, 48.90738, 2.6905754), (9.886788, 48.90738, 3.2124124), (9.705114, 48.90738, 3.7254443), (9.496839, 48.90738, 4.2282653), (9.262533, 48.90738, 4.7194967), (9.00284, 48.90738, 5.197792), (8.718471, 48.90738, 5.661841), (8.410205, 48.90738, 6.110371), (8.078887, 48.90738, 6.5421534), (7.725425, 48.90738, 6.9560037), (7.350788, 48.90738, 7.350788), (6.9560037, 48.90738, 7.725425), (6.5421534, 48.90738, 8.078887), (6.110371, 48.90738, 8.410205), (5.661841, 48.90738, 8.718471), (5.197792, 48.90738, 9.00284), (4.7194967, 48.90738, 9.262533), (4.2282653, 48.90738, 9.496839), (3.7254443, 48.90738, 9.705114), (3.2124124, 48.90738, 9.886788), (2.6905754, 48.90738, 10.041364), (2.1613636, 48.90738, 10.168416), (1.6262277, 48.90738, 10.267597), (1.0866345, 48.90738, 10.338636), (0.54406285, 48.90738, 10.381338), (6.3654595e-16, 48.90738, 10.395584), (-0.54406285, 48.90738, 10.381338), (-1.0866345, 48.90738, 10.338636), (-1.6262277, 48.90738, 10.267597), (-2.1613636, 48.90738, 10.168416), (-2.6905754, 48.90738, 10.041364), (-3.2124124, 48.90738, 9.886788), (-3.7254443, 48.90738, 9.705114), (-4.2282653, 48.90738, 9.496839), (-4.7194967, 48.90738, 9.262533), (-5.197792, 48.90738, 9.00284), (-5.661841, 48.90738, 8.718471), (-6.110371, 48.90738, 8.410205), (-6.5421534, 48.90738, 8.078887), (-6.9560037, 48.90738, 7.725425), (-7.350788, 48.90738, 7.350788), (-7.725425, 48.90738, 6.9560037), (-8.078887, 48.90738, 6.5421534), (-8.410205, 48.90738, 6.110371), (-8.718471, 48.90738, 5.661841), (-9.00284, 48.90738, 5.197792), (-9.262533, 48.90738, 4.7194967), (-9.496839, 48.90738, 4.2282653), (-9.705114, 48.90738, 3.7254443), (-9.886788, 48.90738, 3.2124124), (-10.041364, 48.90738, 2.6905754), (-10.168416, 48.90738, 2.1613636), (-10.267597, 48.90738, 1.6262277), (-10.338636, 48.90738, 1.0866345), (-10.381338, 48.90738, 0.54406285), (-10.395584, 48.90738, 1.2730919e-15), (-10.381338, 48.90738, -0.54406285), (-10.338636, 48.90738, -1.0866345), (-10.267597, 48.90738, -1.6262277), (-10.168416, 48.90738, -2.1613636), (-10.041364, 48.90738, -2.6905754), (-9.886788, 48.90738, -3.2124124), (-9.705114, 48.90738, -3.7254443), (-9.496839, 48.90738, -4.2282653), (-9.262533, 48.90738, -4.7194967), (-9.00284, 48.90738, -5.197792), (-8.718471, 48.90738, -5.661841), (-8.410205, 48.90738, -6.110371), (-8.078887, 48.90738, -6.5421534), (-7.725425, 48.90738, -6.9560037), (-7.350788, 48.90738, -7.350788), (-6.9560037, 48.90738, -7.725425), (-6.5421534, 48.90738, -8.078887), (-6.110371, 48.90738, -8.410205), (-5.661841, 48.90738, -8.718471), (-5.197792, 48.90738, -9.00284), (-4.7194967, 48.90738, -9.262533), (-4.2282653, 48.90738, -9.496839), (-3.7254443, 48.90738, -9.705114), (-3.2124124, 48.90738, -9.886788), (-2.6905754, 48.90738, -10.041364), (-2.1613636, 48.90738, -10.168416), (-1.6262277, 48.90738, -10.267597), (-1.0866345, 48.90738, -10.338636), (-0.54406285, 48.90738, -10.381338), (-1.909638e-15, 48.90738, -10.395584), (0.54406285, 48.90738, -10.381338), (1.0866345, 48.90738, -10.338636), (1.6262277, 48.90738, -10.267597), (2.1613636, 48.90738, -10.168416), (2.6905754, 48.90738, -10.041364), (3.2124124, 48.90738, -9.886788), (3.7254443, 48.90738, -9.705114), (4.2282653, 48.90738, -9.496839), (4.7194967, 48.90738, -9.262533), (5.197792, 48.90738, -9.00284), (5.661841, 48.90738, -8.718471), (6.110371, 48.90738, -8.410205), (6.5421534, 48.90738, -8.078887), (6.9560037, 48.90738, -7.725425), (7.350788, 48.90738, -7.350788), (7.725425, 48.90738, -6.9560037), (8.078887, 48.90738, -6.5421534), (8.410205, 48.90738, -6.110371), (8.718471, 48.90738, -5.661841), (9.00284, 48.90738, -5.197792), (9.262533, 48.90738, -4.7194967), (9.496839, 48.90738, -4.2282653), (9.705114, 48.90738, -3.7254443), (9.886788, 48.90738, -3.2124124), (10.041364, 48.90738, -2.6905754), (10.168416, 48.90738, -2.1613636), (10.267597, 48.90738, -1.6262277), (10.338636, 48.90738, -1.0866345), (10.381338, 48.90738, -0.54406285), (7.8217235, 49.38442, 0), (7.8110037, 49.38442, 0.40935737), (7.778875, 49.38442, 0.81759274), (7.725425, 49.38442, 1.223587), (7.6507998, 49.38442, 1.6262277), (7.5552044, 49.38442, 2.024411), (7.438901, 49.38442, 2.4170454), (7.302208, 49.38442, 2.8030548), (7.1454997, 49.38442, 3.1813815), (6.9692063, 49.38442, 3.550988), (6.773811, 49.38442, 3.9108617), (6.5598493, 49.38442, 4.260016), (6.327907, 49.38442, 4.5974936), (6.0786204, 49.38442, 4.92237), (5.812673, 49.38442, 5.2337546), (5.5307937, 49.38442, 5.5307937), (5.2337546, 49.38442, 5.812673), (4.92237, 49.38442, 6.0786204), (4.5974936, 49.38442, 6.327907), (4.260016, 49.38442, 6.5598493), (3.9108617, 49.38442, 6.773811), (3.550988, 49.38442, 6.9692063), (3.1813815, 49.38442, 7.1454997), (2.8030548, 49.38442, 7.302208), (2.4170454, 49.38442, 7.438901), (2.024411, 49.38442, 7.5552044), (1.6262277, 49.38442, 7.6507998), (1.223587, 49.38442, 7.725425), (0.81759274, 49.38442, 7.778875), (0.40935737, 49.38442, 7.8110037), (4.789424e-16, 49.38442, 7.8217235), (-0.40935737, 49.38442, 7.8110037), (-0.81759274, 49.38442, 7.778875), (-1.223587, 49.38442, 7.725425), (-1.6262277, 49.38442, 7.6507998), (-2.024411, 49.38442, 7.5552044), (-2.4170454, 49.38442, 7.438901), (-2.8030548, 49.38442, 7.302208), (-3.1813815, 49.38442, 7.1454997), (-3.550988, 49.38442, 6.9692063), (-3.9108617, 49.38442, 6.773811), (-4.260016, 49.38442, 6.5598493), (-4.5974936, 49.38442, 6.327907), (-4.92237, 49.38442, 6.0786204), (-5.2337546, 49.38442, 5.812673), (-5.5307937, 49.38442, 5.5307937), (-5.812673, 49.38442, 5.2337546), (-6.0786204, 49.38442, 4.92237), (-6.327907, 49.38442, 4.5974936), (-6.5598493, 49.38442, 4.260016), (-6.773811, 49.38442, 3.9108617), (-6.9692063, 49.38442, 3.550988), (-7.1454997, 49.38442, 3.1813815), (-7.302208, 49.38442, 2.8030548), (-7.438901, 49.38442, 2.4170454), (-7.5552044, 49.38442, 2.024411), (-7.6507998, 49.38442, 1.6262277), (-7.725425, 49.38442, 1.223587), (-7.778875, 49.38442, 0.81759274), (-7.8110037, 49.38442, 0.40935737), (-7.8217235, 49.38442, 9.578848e-16), (-7.8110037, 49.38442, -0.40935737), (-7.778875, 49.38442, -0.81759274), (-7.725425, 49.38442, -1.223587), (-7.6507998, 49.38442, -1.6262277), (-7.5552044, 49.38442, -2.024411), (-7.438901, 49.38442, -2.4170454), (-7.302208, 49.38442, -2.8030548), (-7.1454997, 49.38442, -3.1813815), (-6.9692063, 49.38442, -3.550988), (-6.773811, 49.38442, -3.9108617), (-6.5598493, 49.38442, -4.260016), (-6.327907, 49.38442, -4.5974936), (-6.0786204, 49.38442, -4.92237), (-5.812673, 49.38442, -5.2337546), (-5.5307937, 49.38442, -5.5307937), (-5.2337546, 49.38442, -5.812673), (-4.92237, 49.38442, -6.0786204), (-4.5974936, 49.38442, -6.327907), (-4.260016, 49.38442, -6.5598493), (-3.9108617, 49.38442, -6.773811), (-3.550988, 49.38442, -6.9692063), (-3.1813815, 49.38442, -7.1454997), (-2.8030548, 49.38442, -7.302208), (-2.4170454, 49.38442, -7.438901), (-2.024411, 49.38442, -7.5552044), (-1.6262277, 49.38442, -7.6507998), (-1.223587, 49.38442, -7.725425), (-0.81759274, 49.38442, -7.778875), (-0.40935737, 49.38442, -7.8110037), (-1.4368273e-15, 49.38442, -7.8217235), (0.40935737, 49.38442, -7.8110037), (0.81759274, 49.38442, -7.778875), (1.223587, 49.38442, -7.725425), (1.6262277, 49.38442, -7.6507998), (2.024411, 49.38442, -7.5552044), (2.4170454, 49.38442, -7.438901), (2.8030548, 49.38442, -7.302208), (3.1813815, 49.38442, -7.1454997), (3.550988, 49.38442, -6.9692063), (3.9108617, 49.38442, -6.773811), (4.260016, 49.38442, -6.5598493), (4.5974936, 49.38442, -6.327907), (4.92237, 49.38442, -6.0786204), (5.2337546, 49.38442, -5.812673), (5.5307937, 49.38442, -5.5307937), (5.812673, 49.38442, -5.2337546), (6.0786204, 49.38442, -4.92237), (6.327907, 49.38442, -4.5974936), (6.5598493, 49.38442, -4.260016), (6.773811, 49.38442, -3.9108617), (6.9692063, 49.38442, -3.550988), (7.1454997, 49.38442, -3.1813815), (7.302208, 49.38442, -2.8030548), (7.438901, 49.38442, -2.4170454), (7.5552044, 49.38442, -2.024411), (7.6507998, 49.38442, -1.6262277), (7.725425, 49.38442, -1.223587), (7.778875, 49.38442, -0.81759274), (7.8110037, 49.38442, -0.40935737), (5.2264233, 49.726093, 0), (5.2192607, 49.726093, 0.27352986), (5.197792, 49.726093, 0.54631), (5.1620774, 49.726093, 0.81759274), (5.112213, 49.726093, 1.0866345), (5.048337, 49.726093, 1.3526978), (4.970624, 49.726093, 1.6150535), (4.8792863, 49.726093, 1.8729825), (4.774575, 49.726093, 2.1257777), (4.656777, 49.726093, 2.3727465), (4.526215, 49.726093, 2.6132116), (4.3832474, 49.726093, 2.846514), (4.2282653, 49.726093, 3.0720146), (4.0616937, 49.726093, 3.2890947), (3.8839893, 49.726093, 3.4971597), (3.6956394, 49.726093, 3.6956394), (3.4971597, 49.726093, 3.8839893), (3.2890947, 49.726093, 4.0616937), (3.0720146, 49.726093, 4.2282653), (2.846514, 49.726093, 4.3832474), (2.6132116, 49.726093, 4.526215), (2.3727465, 49.726093, 4.656777), (2.1257777, 49.726093, 4.774575), (1.8729825, 49.726093, 4.8792863), (1.6150535, 49.726093, 4.970624), (1.3526978, 49.726093, 5.048337), (1.0866345, 49.726093, 5.112213), (0.81759274, 49.726093, 5.1620774), (0.54631, 49.726093, 5.197792), (0.27352986, 49.726093, 5.2192607), (3.2002612e-16, 49.726093, 5.2264233), (-0.27352986, 49.726093, 5.2192607), (-0.54631, 49.726093, 5.197792), (-0.81759274, 49.726093, 5.1620774), (-1.0866345, 49.726093, 5.112213), (-1.3526978, 49.726093, 5.048337), (-1.6150535, 49.726093, 4.970624), (-1.8729825, 49.726093, 4.8792863), (-2.1257777, 49.726093, 4.774575), (-2.3727465, 49.726093, 4.656777), (-2.6132116, 49.726093, 4.526215), (-2.846514, 49.726093, 4.3832474), (-3.0720146, 49.726093, 4.2282653), (-3.2890947, 49.726093, 4.0616937), (-3.4971597, 49.726093, 3.8839893), (-3.6956394, 49.726093, 3.6956394), (-3.8839893, 49.726093, 3.4971597), (-4.0616937, 49.726093, 3.2890947), (-4.2282653, 49.726093, 3.0720146), (-4.3832474, 49.726093, 2.846514), (-4.526215, 49.726093, 2.6132116), (-4.656777, 49.726093, 2.3727465), (-4.774575, 49.726093, 2.1257777), (-4.8792863, 49.726093, 1.8729825), (-4.970624, 49.726093, 1.6150535), (-5.048337, 49.726093, 1.3526978), (-5.112213, 49.726093, 1.0866345), (-5.1620774, 49.726093, 0.81759274), (-5.197792, 49.726093, 0.54631), (-5.2192607, 49.726093, 0.27352986), (-5.2264233, 49.726093, 6.4005224e-16), (-5.2192607, 49.726093, -0.27352986), (-5.197792, 49.726093, -0.54631), (-5.1620774, 49.726093, -0.81759274), (-5.112213, 49.726093, -1.0866345), (-5.048337, 49.726093, -1.3526978), (-4.970624, 49.726093, -1.6150535), (-4.8792863, 49.726093, -1.8729825), (-4.774575, 49.726093, -2.1257777), (-4.656777, 49.726093, -2.3727465), (-4.526215, 49.726093, -2.6132116), (-4.3832474, 49.726093, -2.846514), (-4.2282653, 49.726093, -3.0720146), (-4.0616937, 49.726093, -3.2890947), (-3.8839893, 49.726093, -3.4971597), (-3.6956394, 49.726093, -3.6956394), (-3.4971597, 49.726093, -3.8839893), (-3.2890947, 49.726093, -4.0616937), (-3.0720146, 49.726093, -4.2282653), (-2.846514, 49.726093, -4.3832474), (-2.6132116, 49.726093, -4.526215), (-2.3727465, 49.726093, -4.656777), (-2.1257777, 49.726093, -4.774575), (-1.8729825, 49.726093, -4.8792863), (-1.6150535, 49.726093, -4.970624), (-1.3526978, 49.726093, -5.048337), (-1.0866345, 49.726093, -5.112213), (-0.81759274, 49.726093, -5.1620774), (-0.54631, 49.726093, -5.197792), (-0.27352986, 49.726093, -5.2192607), (-9.600784e-16, 49.726093, -5.2264233), (0.27352986, 49.726093, -5.2192607), (0.54631, 49.726093, -5.197792), (0.81759274, 49.726093, -5.1620774), (1.0866345, 49.726093, -5.112213), (1.3526978, 49.726093, -5.048337), (1.6150535, 49.726093, -4.970624), (1.8729825, 49.726093, -4.8792863), (2.1257777, 49.726093, -4.774575), (2.3727465, 49.726093, -4.656777), (2.6132116, 49.726093, -4.526215), (2.846514, 49.726093, -4.3832474), (3.0720146, 49.726093, -4.2282653), (3.2890947, 49.726093, -4.0616937), (3.4971597, 49.726093, -3.8839893), (3.6956394, 49.726093, -3.6956394), (3.8839893, 49.726093, -3.4971597), (4.0616937, 49.726093, -3.2890947), (4.2282653, 49.726093, -3.0720146), (4.3832474, 49.726093, -2.846514), (4.526215, 49.726093, -2.6132116), (4.656777, 49.726093, -2.3727465), (4.774575, 49.726093, -2.1257777), (4.8792863, 49.726093, -1.8729825), (4.970624, 49.726093, -1.6150535), (5.048337, 49.726093, -1.3526978), (5.112213, 49.726093, -1.0866345), (5.1620774, 49.726093, -0.81759274), (5.197792, 49.726093, -0.54631), (5.2192607, 49.726093, -0.27352986), (2.616798, 49.931477, 0), (2.6132116, 49.931477, 0.13695261), (2.6024628, 49.931477, 0.27352986), (2.5845807, 49.931477, 0.40935737), (2.5596144, 49.931477, 0.54406285), (2.5276325, 49.931477, 0.6772771), (2.4887226, 49.931477, 0.808635), (2.4429913, 49.931477, 0.93777645), (2.3905637, 49.931477, 1.0643475), (2.331584, 49.931477, 1.1880014), (2.2662134, 49.931477, 1.308399), (2.1946313, 49.931477, 1.4252102), (2.117034, 49.931477, 1.5381151), (2.033634, 49.931477, 1.6468042), (1.9446597, 49.931477, 1.7509795), (1.8503555, 49.931477, 1.8503555), (1.7509795, 49.931477, 1.9446597), (1.6468042, 49.931477, 2.033634), (1.5381151, 49.931477, 2.117034), (1.4252102, 49.931477, 2.1946313), (1.308399, 49.931477, 2.2662134), (1.1880014, 49.931477, 2.331584), (1.0643475, 49.931477, 2.3905637), (0.93777645, 49.931477, 2.4429913), (0.808635, 49.931477, 2.4887226), (0.6772771, 49.931477, 2.5276325), (0.54406285, 49.931477, 2.5596144), (0.40935737, 49.931477, 2.5845807), (0.27352986, 49.931477, 2.6024628), (0.13695261, 49.931477, 2.6132116), (1.6023265e-16, 49.931477, 2.616798), (-0.13695261, 49.931477, 2.6132116), (-0.27352986, 49.931477, 2.6024628), (-0.40935737, 49.931477, 2.5845807), (-0.54406285, 49.931477, 2.5596144), (-0.6772771, 49.931477, 2.5276325), (-0.808635, 49.931477, 2.4887226), (-0.93777645, 49.931477, 2.4429913), (-1.0643475, 49.931477, 2.3905637), (-1.1880014, 49.931477, 2.331584), (-1.308399, 49.931477, 2.2662134), (-1.4252102, 49.931477, 2.1946313), (-1.5381151, 49.931477, 2.117034), (-1.6468042, 49.931477, 2.033634), (-1.7509795, 49.931477, 1.9446597), (-1.8503555, 49.931477, 1.8503555), (-1.9446597, 49.931477, 1.7509795), (-2.033634, 49.931477, 1.6468042), (-2.117034, 49.931477, 1.5381151), (-2.1946313, 49.931477, 1.4252102), (-2.2662134, 49.931477, 1.308399), (-2.331584, 49.931477, 1.1880014), (-2.3905637, 49.931477, 1.0643475), (-2.4429913, 49.931477, 0.93777645), (-2.4887226, 49.931477, 0.808635), (-2.5276325, 49.931477, 0.6772771), (-2.5596144, 49.931477, 0.54406285), (-2.5845807, 49.931477, 0.40935737), (-2.6024628, 49.931477, 0.27352986), (-2.6132116, 49.931477, 0.13695261), (-2.616798, 49.931477, 3.204653e-16), (-2.6132116, 49.931477, -0.13695261), (-2.6024628, 49.931477, -0.27352986), (-2.5845807, 49.931477, -0.40935737), (-2.5596144, 49.931477, -0.54406285), (-2.5276325, 49.931477, -0.6772771), (-2.4887226, 49.931477, -0.808635), (-2.4429913, 49.931477, -0.93777645), (-2.3905637, 49.931477, -1.0643475), (-2.331584, 49.931477, -1.1880014), (-2.2662134, 49.931477, -1.308399), (-2.1946313, 49.931477, -1.4252102), (-2.117034, 49.931477, -1.5381151), (-2.033634, 49.931477, -1.6468042), (-1.9446597, 49.931477, -1.7509795), (-1.8503555, 49.931477, -1.8503555), (-1.7509795, 49.931477, -1.9446597), (-1.6468042, 49.931477, -2.033634), (-1.5381151, 49.931477, -2.117034), (-1.4252102, 49.931477, -2.1946313), (-1.308399, 49.931477, -2.2662134), (-1.1880014, 49.931477, -2.331584), (-1.0643475, 49.931477, -2.3905637), (-0.93777645, 49.931477, -2.4429913), (-0.808635, 49.931477, -2.4887226), (-0.6772771, 49.931477, -2.5276325), (-0.54406285, 49.931477, -2.5596144), (-0.40935737, 49.931477, -2.5845807), (-0.27352986, 49.931477, -2.6024628), (-0.13695261, 49.931477, -2.6132116), (-4.80698e-16, 49.931477, -2.616798), (0.13695261, 49.931477, -2.6132116), (0.27352986, 49.931477, -2.6024628), (0.40935737, 49.931477, -2.5845807), (0.54406285, 49.931477, -2.5596144), (0.6772771, 49.931477, -2.5276325), (0.808635, 49.931477, -2.4887226), (0.93777645, 49.931477, -2.4429913), (1.0643475, 49.931477, -2.3905637), (1.1880014, 49.931477, -2.331584), (1.308399, 49.931477, -2.2662134), (1.4252102, 49.931477, -2.1946313), (1.5381151, 49.931477, -2.117034), (1.6468042, 49.931477, -2.033634), (1.7509795, 49.931477, -1.9446597), (1.8503555, 49.931477, -1.8503555), (1.9446597, 49.931477, -1.7509795), (2.033634, 49.931477, -1.6468042), (2.117034, 49.931477, -1.5381151), (2.1946313, 49.931477, -1.4252102), (2.2662134, 49.931477, -1.308399), (2.331584, 49.931477, -1.1880014), (2.3905637, 49.931477, -1.0643475), (2.4429913, 49.931477, -0.93777645), (2.4887226, 49.931477, -0.808635), (2.5276325, 49.931477, -0.6772771), (2.5596144, 49.931477, -0.54406285), (2.5845807, 49.931477, -0.40935737), (2.6024628, 49.931477, -0.27352986), (2.6132116, 49.931477, -0.13695261), (0, 50, 0)] + delete color3f[] primvars:displayColor.connect = + float2[] primvars:st = [(0.5, 0), (1, 0.016666668), (0.9916667, 0.016666668), (0.5, 0), (0.9916667, 0.016666668), (0.98333335, 0.016666668), (0.5, 0), (0.98333335, 0.016666668), (0.975, 0.016666668), (0.5, 0), (0.975, 0.016666668), (0.96666664, 0.016666668), (0.5, 0), (0.96666664, 0.016666668), (0.9583333, 0.016666668), (0.5, 0), (0.9583333, 0.016666668), (0.95, 0.016666668), (0.5, 0), (0.95, 0.016666668), (0.94166666, 0.016666668), (0.5, 0), (0.94166666, 0.016666668), (0.93333334, 0.016666668), (0.5, 0), (0.93333334, 0.016666668), (0.925, 0.016666668), (0.5, 0), (0.925, 0.016666668), (0.9166667, 0.016666668), (0.5, 0), (0.9166667, 0.016666668), (0.90833336, 0.016666668), (0.5, 0), (0.90833336, 0.016666668), (0.9, 0.016666668), (0.5, 0), (0.9, 0.016666668), (0.89166665, 0.016666668), (0.5, 0), (0.89166665, 0.016666668), (0.8833333, 0.016666668), (0.5, 0), (0.8833333, 0.016666668), (0.875, 0.016666668), (0.5, 0), (0.875, 0.016666668), (0.8666667, 0.016666668), (0.5, 0), (0.8666667, 0.016666668), (0.85833335, 0.016666668), (0.5, 0), (0.85833335, 0.016666668), (0.85, 0.016666668), (0.5, 0), (0.85, 0.016666668), (0.84166664, 0.016666668), (0.5, 0), (0.84166664, 0.016666668), (0.8333333, 0.016666668), (0.5, 0), (0.8333333, 0.016666668), (0.825, 0.016666668), (0.5, 0), (0.825, 0.016666668), (0.81666666, 0.016666668), (0.5, 0), (0.81666666, 0.016666668), (0.80833334, 0.016666668), (0.5, 0), (0.80833334, 0.016666668), (0.8, 0.016666668), (0.5, 0), (0.8, 0.016666668), (0.7916667, 0.016666668), (0.5, 0), (0.7916667, 0.016666668), (0.78333336, 0.016666668), (0.5, 0), (0.78333336, 0.016666668), (0.775, 0.016666668), (0.5, 0), (0.775, 0.016666668), (0.76666665, 0.016666668), (0.5, 0), (0.76666665, 0.016666668), (0.7583333, 0.016666668), (0.5, 0), (0.7583333, 0.016666668), (0.75, 0.016666668), (0.5, 0), (0.75, 0.016666668), (0.7416667, 0.016666668), (0.5, 0), (0.7416667, 0.016666668), (0.73333335, 0.016666668), (0.5, 0), (0.73333335, 0.016666668), (0.725, 0.016666668), (0.5, 0), (0.725, 0.016666668), (0.71666664, 0.016666668), (0.5, 0), (0.71666664, 0.016666668), (0.7083333, 0.016666668), (0.5, 0), (0.7083333, 0.016666668), (0.7, 0.016666668), (0.5, 0), (0.7, 0.016666668), (0.69166666, 0.016666668), (0.5, 0), (0.69166666, 0.016666668), (0.68333334, 0.016666668), (0.5, 0), (0.68333334, 0.016666668), (0.675, 0.016666668), (0.5, 0), (0.675, 0.016666668), (0.6666667, 0.016666668), (0.5, 0), (0.6666667, 0.016666668), (0.65833336, 0.016666668), (0.5, 0), (0.65833336, 0.016666668), (0.65, 0.016666668), (0.5, 0), (0.65, 0.016666668), (0.64166665, 0.016666668), (0.5, 0), (0.64166665, 0.016666668), (0.6333333, 0.016666668), (0.5, 0), (0.6333333, 0.016666668), (0.625, 0.016666668), (0.5, 0), (0.625, 0.016666668), (0.6166667, 0.016666668), (0.5, 0), (0.6166667, 0.016666668), (0.60833335, 0.016666668), (0.5, 0), (0.60833335, 0.016666668), (0.6, 0.016666668), (0.5, 0), (0.6, 0.016666668), (0.59166664, 0.016666668), (0.5, 0), (0.59166664, 0.016666668), (0.5833333, 0.016666668), (0.5, 0), (0.5833333, 0.016666668), (0.575, 0.016666668), (0.5, 0), (0.575, 0.016666668), (0.56666666, 0.016666668), (0.5, 0), (0.56666666, 0.016666668), (0.55833334, 0.016666668), (0.5, 0), (0.55833334, 0.016666668), (0.55, 0.016666668), (0.5, 0), (0.55, 0.016666668), (0.5416667, 0.016666668), (0.5, 0), (0.5416667, 0.016666668), (0.53333336, 0.016666668), (0.5, 0), (0.53333336, 0.016666668), (0.525, 0.016666668), (0.5, 0), (0.525, 0.016666668), (0.51666665, 0.016666668), (0.5, 0), (0.51666665, 0.016666668), (0.5083333, 0.016666668), (0.5, 0), (0.5083333, 0.016666668), (0.5, 0.016666668), (0.5, 0), (0.5, 0.016666668), (0.49166667, 0.016666668), (0.5, 0), (0.49166667, 0.016666668), (0.48333332, 0.016666668), (0.5, 0), (0.48333332, 0.016666668), (0.475, 0.016666668), (0.5, 0), (0.475, 0.016666668), (0.46666667, 0.016666668), (0.5, 0), (0.46666667, 0.016666668), (0.45833334, 0.016666668), (0.5, 0), (0.45833334, 0.016666668), (0.45, 0.016666668), (0.5, 0), (0.45, 0.016666668), (0.44166666, 0.016666668), (0.5, 0), (0.44166666, 0.016666668), (0.43333334, 0.016666668), (0.5, 0), (0.43333334, 0.016666668), (0.425, 0.016666668), (0.5, 0), (0.425, 0.016666668), (0.41666666, 0.016666668), (0.5, 0), (0.41666666, 0.016666668), (0.40833333, 0.016666668), (0.5, 0), (0.40833333, 0.016666668), (0.4, 0.016666668), (0.5, 0), (0.4, 0.016666668), (0.39166668, 0.016666668), (0.5, 0), (0.39166668, 0.016666668), (0.38333333, 0.016666668), (0.5, 0), (0.38333333, 0.016666668), (0.375, 0.016666668), (0.5, 0), (0.375, 0.016666668), (0.36666667, 0.016666668), (0.5, 0), (0.36666667, 0.016666668), (0.35833332, 0.016666668), (0.5, 0), (0.35833332, 0.016666668), (0.35, 0.016666668), (0.5, 0), (0.35, 0.016666668), (0.34166667, 0.016666668), (0.5, 0), (0.34166667, 0.016666668), (0.33333334, 0.016666668), (0.5, 0), (0.33333334, 0.016666668), (0.325, 0.016666668), (0.5, 0), (0.325, 0.016666668), (0.31666666, 0.016666668), (0.5, 0), (0.31666666, 0.016666668), (0.30833334, 0.016666668), (0.5, 0), (0.30833334, 0.016666668), (0.3, 0.016666668), (0.5, 0), (0.3, 0.016666668), (0.29166666, 0.016666668), (0.5, 0), (0.29166666, 0.016666668), (0.28333333, 0.016666668), (0.5, 0), (0.28333333, 0.016666668), (0.275, 0.016666668), (0.5, 0), (0.275, 0.016666668), (0.26666668, 0.016666668), (0.5, 0), (0.26666668, 0.016666668), (0.25833333, 0.016666668), (0.5, 0), (0.25833333, 0.016666668), (0.25, 0.016666668), (0.5, 0), (0.25, 0.016666668), (0.24166666, 0.016666668), (0.5, 0), (0.24166666, 0.016666668), (0.23333333, 0.016666668), (0.5, 0), (0.23333333, 0.016666668), (0.225, 0.016666668), (0.5, 0), (0.225, 0.016666668), (0.21666667, 0.016666668), (0.5, 0), (0.21666667, 0.016666668), (0.20833333, 0.016666668), (0.5, 0), (0.20833333, 0.016666668), (0.2, 0.016666668), (0.5, 0), (0.2, 0.016666668), (0.19166666, 0.016666668), (0.5, 0), (0.19166666, 0.016666668), (0.18333334, 0.016666668), (0.5, 0), (0.18333334, 0.016666668), (0.175, 0.016666668), (0.5, 0), (0.175, 0.016666668), (0.16666667, 0.016666668), (0.5, 0), (0.16666667, 0.016666668), (0.15833333, 0.016666668), (0.5, 0), (0.15833333, 0.016666668), (0.15, 0.016666668), (0.5, 0), (0.15, 0.016666668), (0.14166667, 0.016666668), (0.5, 0), (0.14166667, 0.016666668), (0.13333334, 0.016666668), (0.5, 0), (0.13333334, 0.016666668), (0.125, 0.016666668), (0.5, 0), (0.125, 0.016666668), (0.11666667, 0.016666668), (0.5, 0), (0.11666667, 0.016666668), (0.108333334, 0.016666668), (0.5, 0), (0.108333334, 0.016666668), (0.1, 0.016666668), (0.5, 0), (0.1, 0.016666668), (0.09166667, 0.016666668), (0.5, 0), (0.09166667, 0.016666668), (0.083333336, 0.016666668), (0.5, 0), (0.083333336, 0.016666668), (0.075, 0.016666668), (0.5, 0), (0.075, 0.016666668), (0.06666667, 0.016666668), (0.5, 0), (0.06666667, 0.016666668), (0.058333334, 0.016666668), (0.5, 0), (0.058333334, 0.016666668), (0.05, 0.016666668), (0.5, 0), (0.05, 0.016666668), (0.041666668, 0.016666668), (0.5, 0), (0.041666668, 0.016666668), (0.033333335, 0.016666668), (0.5, 0), (0.033333335, 0.016666668), (0.025, 0.016666668), (0.5, 0), (0.025, 0.016666668), (0.016666668, 0.016666668), (0.5, 0), (0.016666668, 0.016666668), (0.008333334, 0.016666668), (0.5, 0), (0.008333334, 0.016666668), (0, 0.016666668), (1, 0.016666668), (1, 0.033333335), (0.9916667, 0.033333335), (0.9916667, 0.016666668), (0.9916667, 0.016666668), (0.9916667, 0.033333335), (0.98333335, 0.033333335), (0.98333335, 0.016666668), (0.98333335, 0.016666668), (0.98333335, 0.033333335), (0.975, 0.033333335), (0.975, 0.016666668), (0.975, 0.016666668), (0.975, 0.033333335), (0.96666664, 0.033333335), (0.96666664, 0.016666668), (0.96666664, 0.016666668), (0.96666664, 0.033333335), (0.9583333, 0.033333335), (0.9583333, 0.016666668), (0.9583333, 0.016666668), (0.9583333, 0.033333335), (0.95, 0.033333335), (0.95, 0.016666668), (0.95, 0.016666668), (0.95, 0.033333335), (0.94166666, 0.033333335), (0.94166666, 0.016666668), (0.94166666, 0.016666668), (0.94166666, 0.033333335), (0.93333334, 0.033333335), (0.93333334, 0.016666668), (0.93333334, 0.016666668), (0.93333334, 0.033333335), (0.925, 0.033333335), (0.925, 0.016666668), (0.925, 0.016666668), (0.925, 0.033333335), (0.9166667, 0.033333335), (0.9166667, 0.016666668), (0.9166667, 0.016666668), (0.9166667, 0.033333335), (0.90833336, 0.033333335), (0.90833336, 0.016666668), (0.90833336, 0.016666668), (0.90833336, 0.033333335), (0.9, 0.033333335), (0.9, 0.016666668), (0.9, 0.016666668), (0.9, 0.033333335), (0.89166665, 0.033333335), (0.89166665, 0.016666668), (0.89166665, 0.016666668), (0.89166665, 0.033333335), (0.8833333, 0.033333335), (0.8833333, 0.016666668), (0.8833333, 0.016666668), (0.8833333, 0.033333335), (0.875, 0.033333335), (0.875, 0.016666668), (0.875, 0.016666668), (0.875, 0.033333335), (0.8666667, 0.033333335), (0.8666667, 0.016666668), (0.8666667, 0.016666668), (0.8666667, 0.033333335), (0.85833335, 0.033333335), (0.85833335, 0.016666668), (0.85833335, 0.016666668), (0.85833335, 0.033333335), (0.85, 0.033333335), (0.85, 0.016666668), (0.85, 0.016666668), (0.85, 0.033333335), (0.84166664, 0.033333335), (0.84166664, 0.016666668), (0.84166664, 0.016666668), (0.84166664, 0.033333335), (0.8333333, 0.033333335), (0.8333333, 0.016666668), (0.8333333, 0.016666668), (0.8333333, 0.033333335), (0.825, 0.033333335), (0.825, 0.016666668), (0.825, 0.016666668), (0.825, 0.033333335), (0.81666666, 0.033333335), (0.81666666, 0.016666668), (0.81666666, 0.016666668), (0.81666666, 0.033333335), (0.80833334, 0.033333335), (0.80833334, 0.016666668), (0.80833334, 0.016666668), (0.80833334, 0.033333335), (0.8, 0.033333335), (0.8, 0.016666668), (0.8, 0.016666668), (0.8, 0.033333335), (0.7916667, 0.033333335), (0.7916667, 0.016666668), (0.7916667, 0.016666668), (0.7916667, 0.033333335), (0.78333336, 0.033333335), (0.78333336, 0.016666668), (0.78333336, 0.016666668), (0.78333336, 0.033333335), (0.775, 0.033333335), (0.775, 0.016666668), (0.775, 0.016666668), (0.775, 0.033333335), (0.76666665, 0.033333335), (0.76666665, 0.016666668), (0.76666665, 0.016666668), (0.76666665, 0.033333335), (0.7583333, 0.033333335), (0.7583333, 0.016666668), (0.7583333, 0.016666668), (0.7583333, 0.033333335), (0.75, 0.033333335), (0.75, 0.016666668), (0.75, 0.016666668), (0.75, 0.033333335), (0.7416667, 0.033333335), (0.7416667, 0.016666668), (0.7416667, 0.016666668), (0.7416667, 0.033333335), (0.73333335, 0.033333335), (0.73333335, 0.016666668), (0.73333335, 0.016666668), (0.73333335, 0.033333335), (0.725, 0.033333335), (0.725, 0.016666668), (0.725, 0.016666668), (0.725, 0.033333335), (0.71666664, 0.033333335), (0.71666664, 0.016666668), (0.71666664, 0.016666668), (0.71666664, 0.033333335), (0.7083333, 0.033333335), (0.7083333, 0.016666668), (0.7083333, 0.016666668), (0.7083333, 0.033333335), (0.7, 0.033333335), (0.7, 0.016666668), (0.7, 0.016666668), (0.7, 0.033333335), (0.69166666, 0.033333335), (0.69166666, 0.016666668), (0.69166666, 0.016666668), (0.69166666, 0.033333335), (0.68333334, 0.033333335), (0.68333334, 0.016666668), (0.68333334, 0.016666668), (0.68333334, 0.033333335), (0.675, 0.033333335), (0.675, 0.016666668), (0.675, 0.016666668), (0.675, 0.033333335), (0.6666667, 0.033333335), (0.6666667, 0.016666668), (0.6666667, 0.016666668), (0.6666667, 0.033333335), (0.65833336, 0.033333335), (0.65833336, 0.016666668), (0.65833336, 0.016666668), (0.65833336, 0.033333335), (0.65, 0.033333335), (0.65, 0.016666668), (0.65, 0.016666668), (0.65, 0.033333335), (0.64166665, 0.033333335), (0.64166665, 0.016666668), (0.64166665, 0.016666668), (0.64166665, 0.033333335), (0.6333333, 0.033333335), (0.6333333, 0.016666668), (0.6333333, 0.016666668), (0.6333333, 0.033333335), (0.625, 0.033333335), (0.625, 0.016666668), (0.625, 0.016666668), (0.625, 0.033333335), (0.6166667, 0.033333335), (0.6166667, 0.016666668), (0.6166667, 0.016666668), (0.6166667, 0.033333335), (0.60833335, 0.033333335), (0.60833335, 0.016666668), (0.60833335, 0.016666668), (0.60833335, 0.033333335), (0.6, 0.033333335), (0.6, 0.016666668), (0.6, 0.016666668), (0.6, 0.033333335), (0.59166664, 0.033333335), (0.59166664, 0.016666668), (0.59166664, 0.016666668), (0.59166664, 0.033333335), (0.5833333, 0.033333335), (0.5833333, 0.016666668), (0.5833333, 0.016666668), (0.5833333, 0.033333335), (0.575, 0.033333335), (0.575, 0.016666668), (0.575, 0.016666668), (0.575, 0.033333335), (0.56666666, 0.033333335), (0.56666666, 0.016666668), (0.56666666, 0.016666668), (0.56666666, 0.033333335), (0.55833334, 0.033333335), (0.55833334, 0.016666668), (0.55833334, 0.016666668), (0.55833334, 0.033333335), (0.55, 0.033333335), (0.55, 0.016666668), (0.55, 0.016666668), (0.55, 0.033333335), (0.5416667, 0.033333335), (0.5416667, 0.016666668), (0.5416667, 0.016666668), (0.5416667, 0.033333335), (0.53333336, 0.033333335), (0.53333336, 0.016666668), (0.53333336, 0.016666668), (0.53333336, 0.033333335), (0.525, 0.033333335), (0.525, 0.016666668), (0.525, 0.016666668), (0.525, 0.033333335), (0.51666665, 0.033333335), (0.51666665, 0.016666668), (0.51666665, 0.016666668), (0.51666665, 0.033333335), (0.5083333, 0.033333335), (0.5083333, 0.016666668), (0.5083333, 0.016666668), (0.5083333, 0.033333335), (0.5, 0.033333335), (0.5, 0.016666668), (0.5, 0.016666668), (0.5, 0.033333335), (0.49166667, 0.033333335), (0.49166667, 0.016666668), (0.49166667, 0.016666668), (0.49166667, 0.033333335), (0.48333332, 0.033333335), (0.48333332, 0.016666668), (0.48333332, 0.016666668), (0.48333332, 0.033333335), (0.475, 0.033333335), (0.475, 0.016666668), (0.475, 0.016666668), (0.475, 0.033333335), (0.46666667, 0.033333335), (0.46666667, 0.016666668), (0.46666667, 0.016666668), (0.46666667, 0.033333335), (0.45833334, 0.033333335), (0.45833334, 0.016666668), (0.45833334, 0.016666668), (0.45833334, 0.033333335), (0.45, 0.033333335), (0.45, 0.016666668), (0.45, 0.016666668), (0.45, 0.033333335), (0.44166666, 0.033333335), (0.44166666, 0.016666668), (0.44166666, 0.016666668), (0.44166666, 0.033333335), (0.43333334, 0.033333335), (0.43333334, 0.016666668), (0.43333334, 0.016666668), (0.43333334, 0.033333335), (0.425, 0.033333335), (0.425, 0.016666668), (0.425, 0.016666668), (0.425, 0.033333335), (0.41666666, 0.033333335), (0.41666666, 0.016666668), (0.41666666, 0.016666668), (0.41666666, 0.033333335), (0.40833333, 0.033333335), (0.40833333, 0.016666668), (0.40833333, 0.016666668), (0.40833333, 0.033333335), (0.4, 0.033333335), (0.4, 0.016666668), (0.4, 0.016666668), (0.4, 0.033333335), (0.39166668, 0.033333335), (0.39166668, 0.016666668), (0.39166668, 0.016666668), (0.39166668, 0.033333335), (0.38333333, 0.033333335), (0.38333333, 0.016666668), (0.38333333, 0.016666668), (0.38333333, 0.033333335), (0.375, 0.033333335), (0.375, 0.016666668), (0.375, 0.016666668), (0.375, 0.033333335), (0.36666667, 0.033333335), (0.36666667, 0.016666668), (0.36666667, 0.016666668), (0.36666667, 0.033333335), (0.35833332, 0.033333335), (0.35833332, 0.016666668), (0.35833332, 0.016666668), (0.35833332, 0.033333335), (0.35, 0.033333335), (0.35, 0.016666668), (0.35, 0.016666668), (0.35, 0.033333335), (0.34166667, 0.033333335), (0.34166667, 0.016666668), (0.34166667, 0.016666668), (0.34166667, 0.033333335), (0.33333334, 0.033333335), (0.33333334, 0.016666668), (0.33333334, 0.016666668), (0.33333334, 0.033333335), (0.325, 0.033333335), (0.325, 0.016666668), (0.325, 0.016666668), (0.325, 0.033333335), (0.31666666, 0.033333335), (0.31666666, 0.016666668), (0.31666666, 0.016666668), (0.31666666, 0.033333335), (0.30833334, 0.033333335), (0.30833334, 0.016666668), (0.30833334, 0.016666668), (0.30833334, 0.033333335), (0.3, 0.033333335), (0.3, 0.016666668), (0.3, 0.016666668), (0.3, 0.033333335), (0.29166666, 0.033333335), (0.29166666, 0.016666668), (0.29166666, 0.016666668), (0.29166666, 0.033333335), (0.28333333, 0.033333335), (0.28333333, 0.016666668), (0.28333333, 0.016666668), (0.28333333, 0.033333335), (0.275, 0.033333335), (0.275, 0.016666668), (0.275, 0.016666668), (0.275, 0.033333335), (0.26666668, 0.033333335), (0.26666668, 0.016666668), (0.26666668, 0.016666668), (0.26666668, 0.033333335), (0.25833333, 0.033333335), (0.25833333, 0.016666668), (0.25833333, 0.016666668), (0.25833333, 0.033333335), (0.25, 0.033333335), (0.25, 0.016666668), (0.25, 0.016666668), (0.25, 0.033333335), (0.24166666, 0.033333335), (0.24166666, 0.016666668), (0.24166666, 0.016666668), (0.24166666, 0.033333335), (0.23333333, 0.033333335), (0.23333333, 0.016666668), (0.23333333, 0.016666668), (0.23333333, 0.033333335), (0.225, 0.033333335), (0.225, 0.016666668), (0.225, 0.016666668), (0.225, 0.033333335), (0.21666667, 0.033333335), (0.21666667, 0.016666668), (0.21666667, 0.016666668), (0.21666667, 0.033333335), (0.20833333, 0.033333335), (0.20833333, 0.016666668), (0.20833333, 0.016666668), (0.20833333, 0.033333335), (0.2, 0.033333335), (0.2, 0.016666668), (0.2, 0.016666668), (0.2, 0.033333335), (0.19166666, 0.033333335), (0.19166666, 0.016666668), (0.19166666, 0.016666668), (0.19166666, 0.033333335), (0.18333334, 0.033333335), (0.18333334, 0.016666668), (0.18333334, 0.016666668), (0.18333334, 0.033333335), (0.175, 0.033333335), (0.175, 0.016666668), (0.175, 0.016666668), (0.175, 0.033333335), (0.16666667, 0.033333335), (0.16666667, 0.016666668), (0.16666667, 0.016666668), (0.16666667, 0.033333335), (0.15833333, 0.033333335), (0.15833333, 0.016666668), (0.15833333, 0.016666668), (0.15833333, 0.033333335), (0.15, 0.033333335), (0.15, 0.016666668), (0.15, 0.016666668), (0.15, 0.033333335), (0.14166667, 0.033333335), (0.14166667, 0.016666668), (0.14166667, 0.016666668), (0.14166667, 0.033333335), (0.13333334, 0.033333335), (0.13333334, 0.016666668), (0.13333334, 0.016666668), (0.13333334, 0.033333335), (0.125, 0.033333335), (0.125, 0.016666668), (0.125, 0.016666668), (0.125, 0.033333335), (0.11666667, 0.033333335), (0.11666667, 0.016666668), (0.11666667, 0.016666668), (0.11666667, 0.033333335), (0.108333334, 0.033333335), (0.108333334, 0.016666668), (0.108333334, 0.016666668), (0.108333334, 0.033333335), (0.1, 0.033333335), (0.1, 0.016666668), (0.1, 0.016666668), (0.1, 0.033333335), (0.09166667, 0.033333335), (0.09166667, 0.016666668), (0.09166667, 0.016666668), (0.09166667, 0.033333335), (0.083333336, 0.033333335), (0.083333336, 0.016666668), (0.083333336, 0.016666668), (0.083333336, 0.033333335), (0.075, 0.033333335), (0.075, 0.016666668), (0.075, 0.016666668), (0.075, 0.033333335), (0.06666667, 0.033333335), (0.06666667, 0.016666668), (0.06666667, 0.016666668), (0.06666667, 0.033333335), (0.058333334, 0.033333335), (0.058333334, 0.016666668), (0.058333334, 0.016666668), (0.058333334, 0.033333335), (0.05, 0.033333335), (0.05, 0.016666668), (0.05, 0.016666668), (0.05, 0.033333335), (0.041666668, 0.033333335), (0.041666668, 0.016666668), (0.041666668, 0.016666668), (0.041666668, 0.033333335), (0.033333335, 0.033333335), (0.033333335, 0.016666668), (0.033333335, 0.016666668), (0.033333335, 0.033333335), (0.025, 0.033333335), (0.025, 0.016666668), (0.025, 0.016666668), (0.025, 0.033333335), (0.016666668, 0.033333335), (0.016666668, 0.016666668), (0.016666668, 0.016666668), (0.016666668, 0.033333335), (0.008333334, 0.033333335), (0.008333334, 0.016666668), (0.008333334, 0.016666668), (0.008333334, 0.033333335), (0, 0.033333335), (0, 0.016666668), (1, 0.033333335), (1, 0.05), (0.9916667, 0.05), (0.9916667, 0.033333335), (0.9916667, 0.033333335), (0.9916667, 0.05), (0.98333335, 0.05), (0.98333335, 0.033333335), (0.98333335, 0.033333335), (0.98333335, 0.05), (0.975, 0.05), (0.975, 0.033333335), (0.975, 0.033333335), (0.975, 0.05), (0.96666664, 0.05), (0.96666664, 0.033333335), (0.96666664, 0.033333335), (0.96666664, 0.05), (0.9583333, 0.05), (0.9583333, 0.033333335), (0.9583333, 0.033333335), (0.9583333, 0.05), (0.95, 0.05), (0.95, 0.033333335), (0.95, 0.033333335), (0.95, 0.05), (0.94166666, 0.05), (0.94166666, 0.033333335), (0.94166666, 0.033333335), (0.94166666, 0.05), (0.93333334, 0.05), (0.93333334, 0.033333335), (0.93333334, 0.033333335), (0.93333334, 0.05), (0.925, 0.05), (0.925, 0.033333335), (0.925, 0.033333335), (0.925, 0.05), (0.9166667, 0.05), (0.9166667, 0.033333335), (0.9166667, 0.033333335), (0.9166667, 0.05), (0.90833336, 0.05), (0.90833336, 0.033333335), (0.90833336, 0.033333335), (0.90833336, 0.05), (0.9, 0.05), (0.9, 0.033333335), (0.9, 0.033333335), (0.9, 0.05), (0.89166665, 0.05), (0.89166665, 0.033333335), (0.89166665, 0.033333335), (0.89166665, 0.05), (0.8833333, 0.05), (0.8833333, 0.033333335), (0.8833333, 0.033333335), (0.8833333, 0.05), (0.875, 0.05), (0.875, 0.033333335), (0.875, 0.033333335), (0.875, 0.05), (0.8666667, 0.05), (0.8666667, 0.033333335), (0.8666667, 0.033333335), (0.8666667, 0.05), (0.85833335, 0.05), (0.85833335, 0.033333335), (0.85833335, 0.033333335), (0.85833335, 0.05), (0.85, 0.05), (0.85, 0.033333335), (0.85, 0.033333335), (0.85, 0.05), (0.84166664, 0.05), (0.84166664, 0.033333335), (0.84166664, 0.033333335), (0.84166664, 0.05), (0.8333333, 0.05), (0.8333333, 0.033333335), (0.8333333, 0.033333335), (0.8333333, 0.05), (0.825, 0.05), (0.825, 0.033333335), (0.825, 0.033333335), (0.825, 0.05), (0.81666666, 0.05), (0.81666666, 0.033333335), (0.81666666, 0.033333335), (0.81666666, 0.05), (0.80833334, 0.05), (0.80833334, 0.033333335), (0.80833334, 0.033333335), (0.80833334, 0.05), (0.8, 0.05), (0.8, 0.033333335), (0.8, 0.033333335), (0.8, 0.05), (0.7916667, 0.05), (0.7916667, 0.033333335), (0.7916667, 0.033333335), (0.7916667, 0.05), (0.78333336, 0.05), (0.78333336, 0.033333335), (0.78333336, 0.033333335), (0.78333336, 0.05), (0.775, 0.05), (0.775, 0.033333335), (0.775, 0.033333335), (0.775, 0.05), (0.76666665, 0.05), (0.76666665, 0.033333335), (0.76666665, 0.033333335), (0.76666665, 0.05), (0.7583333, 0.05), (0.7583333, 0.033333335), (0.7583333, 0.033333335), (0.7583333, 0.05), (0.75, 0.05), (0.75, 0.033333335), (0.75, 0.033333335), (0.75, 0.05), (0.7416667, 0.05), (0.7416667, 0.033333335), (0.7416667, 0.033333335), (0.7416667, 0.05), (0.73333335, 0.05), (0.73333335, 0.033333335), (0.73333335, 0.033333335), (0.73333335, 0.05), (0.725, 0.05), (0.725, 0.033333335), (0.725, 0.033333335), (0.725, 0.05), (0.71666664, 0.05), (0.71666664, 0.033333335), (0.71666664, 0.033333335), (0.71666664, 0.05), (0.7083333, 0.05), (0.7083333, 0.033333335), (0.7083333, 0.033333335), (0.7083333, 0.05), (0.7, 0.05), (0.7, 0.033333335), (0.7, 0.033333335), (0.7, 0.05), (0.69166666, 0.05), (0.69166666, 0.033333335), (0.69166666, 0.033333335), (0.69166666, 0.05), (0.68333334, 0.05), (0.68333334, 0.033333335), (0.68333334, 0.033333335), (0.68333334, 0.05), (0.675, 0.05), (0.675, 0.033333335), (0.675, 0.033333335), (0.675, 0.05), (0.6666667, 0.05), (0.6666667, 0.033333335), (0.6666667, 0.033333335), (0.6666667, 0.05), (0.65833336, 0.05), (0.65833336, 0.033333335), (0.65833336, 0.033333335), (0.65833336, 0.05), (0.65, 0.05), (0.65, 0.033333335), (0.65, 0.033333335), (0.65, 0.05), (0.64166665, 0.05), (0.64166665, 0.033333335), (0.64166665, 0.033333335), (0.64166665, 0.05), (0.6333333, 0.05), (0.6333333, 0.033333335), (0.6333333, 0.033333335), (0.6333333, 0.05), (0.625, 0.05), (0.625, 0.033333335), (0.625, 0.033333335), (0.625, 0.05), (0.6166667, 0.05), (0.6166667, 0.033333335), (0.6166667, 0.033333335), (0.6166667, 0.05), (0.60833335, 0.05), (0.60833335, 0.033333335), (0.60833335, 0.033333335), (0.60833335, 0.05), (0.6, 0.05), (0.6, 0.033333335), (0.6, 0.033333335), (0.6, 0.05), (0.59166664, 0.05), (0.59166664, 0.033333335), (0.59166664, 0.033333335), (0.59166664, 0.05), (0.5833333, 0.05), (0.5833333, 0.033333335), (0.5833333, 0.033333335), (0.5833333, 0.05), (0.575, 0.05), (0.575, 0.033333335), (0.575, 0.033333335), (0.575, 0.05), (0.56666666, 0.05), (0.56666666, 0.033333335), (0.56666666, 0.033333335), (0.56666666, 0.05), (0.55833334, 0.05), (0.55833334, 0.033333335), (0.55833334, 0.033333335), (0.55833334, 0.05), (0.55, 0.05), (0.55, 0.033333335), (0.55, 0.033333335), (0.55, 0.05), (0.5416667, 0.05), (0.5416667, 0.033333335), (0.5416667, 0.033333335), (0.5416667, 0.05), (0.53333336, 0.05), (0.53333336, 0.033333335), (0.53333336, 0.033333335), (0.53333336, 0.05), (0.525, 0.05), (0.525, 0.033333335), (0.525, 0.033333335), (0.525, 0.05), (0.51666665, 0.05), (0.51666665, 0.033333335), (0.51666665, 0.033333335), (0.51666665, 0.05), (0.5083333, 0.05), (0.5083333, 0.033333335), (0.5083333, 0.033333335), (0.5083333, 0.05), (0.5, 0.05), (0.5, 0.033333335), (0.5, 0.033333335), (0.5, 0.05), (0.49166667, 0.05), (0.49166667, 0.033333335), (0.49166667, 0.033333335), (0.49166667, 0.05), (0.48333332, 0.05), (0.48333332, 0.033333335), (0.48333332, 0.033333335), (0.48333332, 0.05), (0.475, 0.05), (0.475, 0.033333335), (0.475, 0.033333335), (0.475, 0.05), (0.46666667, 0.05), (0.46666667, 0.033333335), (0.46666667, 0.033333335), (0.46666667, 0.05), (0.45833334, 0.05), (0.45833334, 0.033333335), (0.45833334, 0.033333335), (0.45833334, 0.05), (0.45, 0.05), (0.45, 0.033333335), (0.45, 0.033333335), (0.45, 0.05), (0.44166666, 0.05), (0.44166666, 0.033333335), (0.44166666, 0.033333335), (0.44166666, 0.05), (0.43333334, 0.05), (0.43333334, 0.033333335), (0.43333334, 0.033333335), (0.43333334, 0.05), (0.425, 0.05), (0.425, 0.033333335), (0.425, 0.033333335), (0.425, 0.05), (0.41666666, 0.05), (0.41666666, 0.033333335), (0.41666666, 0.033333335), (0.41666666, 0.05), (0.40833333, 0.05), (0.40833333, 0.033333335), (0.40833333, 0.033333335), (0.40833333, 0.05), (0.4, 0.05), (0.4, 0.033333335), (0.4, 0.033333335), (0.4, 0.05), (0.39166668, 0.05), (0.39166668, 0.033333335), (0.39166668, 0.033333335), (0.39166668, 0.05), (0.38333333, 0.05), (0.38333333, 0.033333335), (0.38333333, 0.033333335), (0.38333333, 0.05), (0.375, 0.05), (0.375, 0.033333335), (0.375, 0.033333335), (0.375, 0.05), (0.36666667, 0.05), (0.36666667, 0.033333335), (0.36666667, 0.033333335), (0.36666667, 0.05), (0.35833332, 0.05), (0.35833332, 0.033333335), (0.35833332, 0.033333335), (0.35833332, 0.05), (0.35, 0.05), (0.35, 0.033333335), (0.35, 0.033333335), (0.35, 0.05), (0.34166667, 0.05), (0.34166667, 0.033333335), (0.34166667, 0.033333335), (0.34166667, 0.05), (0.33333334, 0.05), (0.33333334, 0.033333335), (0.33333334, 0.033333335), (0.33333334, 0.05), (0.325, 0.05), (0.325, 0.033333335), (0.325, 0.033333335), (0.325, 0.05), (0.31666666, 0.05), (0.31666666, 0.033333335), (0.31666666, 0.033333335), (0.31666666, 0.05), (0.30833334, 0.05), (0.30833334, 0.033333335), (0.30833334, 0.033333335), (0.30833334, 0.05), (0.3, 0.05), (0.3, 0.033333335), (0.3, 0.033333335), (0.3, 0.05), (0.29166666, 0.05), (0.29166666, 0.033333335), (0.29166666, 0.033333335), (0.29166666, 0.05), (0.28333333, 0.05), (0.28333333, 0.033333335), (0.28333333, 0.033333335), (0.28333333, 0.05), (0.275, 0.05), (0.275, 0.033333335), (0.275, 0.033333335), (0.275, 0.05), (0.26666668, 0.05), (0.26666668, 0.033333335), (0.26666668, 0.033333335), (0.26666668, 0.05), (0.25833333, 0.05), (0.25833333, 0.033333335), (0.25833333, 0.033333335), (0.25833333, 0.05), (0.25, 0.05), (0.25, 0.033333335), (0.25, 0.033333335), (0.25, 0.05), (0.24166666, 0.05), (0.24166666, 0.033333335), (0.24166666, 0.033333335), (0.24166666, 0.05), (0.23333333, 0.05), (0.23333333, 0.033333335), (0.23333333, 0.033333335), (0.23333333, 0.05), (0.225, 0.05), (0.225, 0.033333335), (0.225, 0.033333335), (0.225, 0.05), (0.21666667, 0.05), (0.21666667, 0.033333335), (0.21666667, 0.033333335), (0.21666667, 0.05), (0.20833333, 0.05), (0.20833333, 0.033333335), (0.20833333, 0.033333335), (0.20833333, 0.05), (0.2, 0.05), (0.2, 0.033333335), (0.2, 0.033333335), (0.2, 0.05), (0.19166666, 0.05), (0.19166666, 0.033333335), (0.19166666, 0.033333335), (0.19166666, 0.05), (0.18333334, 0.05), (0.18333334, 0.033333335), (0.18333334, 0.033333335), (0.18333334, 0.05), (0.175, 0.05), (0.175, 0.033333335), (0.175, 0.033333335), (0.175, 0.05), (0.16666667, 0.05), (0.16666667, 0.033333335), (0.16666667, 0.033333335), (0.16666667, 0.05), (0.15833333, 0.05), (0.15833333, 0.033333335), (0.15833333, 0.033333335), (0.15833333, 0.05), (0.15, 0.05), (0.15, 0.033333335), (0.15, 0.033333335), (0.15, 0.05), (0.14166667, 0.05), (0.14166667, 0.033333335), (0.14166667, 0.033333335), (0.14166667, 0.05), (0.13333334, 0.05), (0.13333334, 0.033333335), (0.13333334, 0.033333335), (0.13333334, 0.05), (0.125, 0.05), (0.125, 0.033333335), (0.125, 0.033333335), (0.125, 0.05), (0.11666667, 0.05), (0.11666667, 0.033333335), (0.11666667, 0.033333335), (0.11666667, 0.05), (0.108333334, 0.05), (0.108333334, 0.033333335), (0.108333334, 0.033333335), (0.108333334, 0.05), (0.1, 0.05), (0.1, 0.033333335), (0.1, 0.033333335), (0.1, 0.05), (0.09166667, 0.05), (0.09166667, 0.033333335), (0.09166667, 0.033333335), (0.09166667, 0.05), (0.083333336, 0.05), (0.083333336, 0.033333335), (0.083333336, 0.033333335), (0.083333336, 0.05), (0.075, 0.05), (0.075, 0.033333335), (0.075, 0.033333335), (0.075, 0.05), (0.06666667, 0.05), (0.06666667, 0.033333335), (0.06666667, 0.033333335), (0.06666667, 0.05), (0.058333334, 0.05), (0.058333334, 0.033333335), (0.058333334, 0.033333335), (0.058333334, 0.05), (0.05, 0.05), (0.05, 0.033333335), (0.05, 0.033333335), (0.05, 0.05), (0.041666668, 0.05), (0.041666668, 0.033333335), (0.041666668, 0.033333335), (0.041666668, 0.05), (0.033333335, 0.05), (0.033333335, 0.033333335), (0.033333335, 0.033333335), (0.033333335, 0.05), (0.025, 0.05), (0.025, 0.033333335), (0.025, 0.033333335), (0.025, 0.05), (0.016666668, 0.05), (0.016666668, 0.033333335), (0.016666668, 0.033333335), (0.016666668, 0.05), (0.008333334, 0.05), (0.008333334, 0.033333335), (0.008333334, 0.033333335), (0.008333334, 0.05), (0, 0.05), (0, 0.033333335), (1, 0.05), (1, 0.06666667), (0.9916667, 0.06666667), (0.9916667, 0.05), (0.9916667, 0.05), (0.9916667, 0.06666667), (0.98333335, 0.06666667), (0.98333335, 0.05), (0.98333335, 0.05), (0.98333335, 0.06666667), (0.975, 0.06666667), (0.975, 0.05), (0.975, 0.05), (0.975, 0.06666667), (0.96666664, 0.06666667), (0.96666664, 0.05), (0.96666664, 0.05), (0.96666664, 0.06666667), (0.9583333, 0.06666667), (0.9583333, 0.05), (0.9583333, 0.05), (0.9583333, 0.06666667), (0.95, 0.06666667), (0.95, 0.05), (0.95, 0.05), (0.95, 0.06666667), (0.94166666, 0.06666667), (0.94166666, 0.05), (0.94166666, 0.05), (0.94166666, 0.06666667), (0.93333334, 0.06666667), (0.93333334, 0.05), (0.93333334, 0.05), (0.93333334, 0.06666667), (0.925, 0.06666667), (0.925, 0.05), (0.925, 0.05), (0.925, 0.06666667), (0.9166667, 0.06666667), (0.9166667, 0.05), (0.9166667, 0.05), (0.9166667, 0.06666667), (0.90833336, 0.06666667), (0.90833336, 0.05), (0.90833336, 0.05), (0.90833336, 0.06666667), (0.9, 0.06666667), (0.9, 0.05), (0.9, 0.05), (0.9, 0.06666667), (0.89166665, 0.06666667), (0.89166665, 0.05), (0.89166665, 0.05), (0.89166665, 0.06666667), (0.8833333, 0.06666667), (0.8833333, 0.05), (0.8833333, 0.05), (0.8833333, 0.06666667), (0.875, 0.06666667), (0.875, 0.05), (0.875, 0.05), (0.875, 0.06666667), (0.8666667, 0.06666667), (0.8666667, 0.05), (0.8666667, 0.05), (0.8666667, 0.06666667), (0.85833335, 0.06666667), (0.85833335, 0.05), (0.85833335, 0.05), (0.85833335, 0.06666667), (0.85, 0.06666667), (0.85, 0.05), (0.85, 0.05), (0.85, 0.06666667), (0.84166664, 0.06666667), (0.84166664, 0.05), (0.84166664, 0.05), (0.84166664, 0.06666667), (0.8333333, 0.06666667), (0.8333333, 0.05), (0.8333333, 0.05), (0.8333333, 0.06666667), (0.825, 0.06666667), (0.825, 0.05), (0.825, 0.05), (0.825, 0.06666667), (0.81666666, 0.06666667), (0.81666666, 0.05), (0.81666666, 0.05), (0.81666666, 0.06666667), (0.80833334, 0.06666667), (0.80833334, 0.05), (0.80833334, 0.05), (0.80833334, 0.06666667), (0.8, 0.06666667), (0.8, 0.05), (0.8, 0.05), (0.8, 0.06666667), (0.7916667, 0.06666667), (0.7916667, 0.05), (0.7916667, 0.05), (0.7916667, 0.06666667), (0.78333336, 0.06666667), (0.78333336, 0.05), (0.78333336, 0.05), (0.78333336, 0.06666667), (0.775, 0.06666667), (0.775, 0.05), (0.775, 0.05), (0.775, 0.06666667), (0.76666665, 0.06666667), (0.76666665, 0.05), (0.76666665, 0.05), (0.76666665, 0.06666667), (0.7583333, 0.06666667), (0.7583333, 0.05), (0.7583333, 0.05), (0.7583333, 0.06666667), (0.75, 0.06666667), (0.75, 0.05), (0.75, 0.05), (0.75, 0.06666667), (0.7416667, 0.06666667), (0.7416667, 0.05), (0.7416667, 0.05), (0.7416667, 0.06666667), (0.73333335, 0.06666667), (0.73333335, 0.05), (0.73333335, 0.05), (0.73333335, 0.06666667), (0.725, 0.06666667), (0.725, 0.05), (0.725, 0.05), (0.725, 0.06666667), (0.71666664, 0.06666667), (0.71666664, 0.05), (0.71666664, 0.05), (0.71666664, 0.06666667), (0.7083333, 0.06666667), (0.7083333, 0.05), (0.7083333, 0.05), (0.7083333, 0.06666667), (0.7, 0.06666667), (0.7, 0.05), (0.7, 0.05), (0.7, 0.06666667), (0.69166666, 0.06666667), (0.69166666, 0.05), (0.69166666, 0.05), (0.69166666, 0.06666667), (0.68333334, 0.06666667), (0.68333334, 0.05), (0.68333334, 0.05), (0.68333334, 0.06666667), (0.675, 0.06666667), (0.675, 0.05), (0.675, 0.05), (0.675, 0.06666667), (0.6666667, 0.06666667), (0.6666667, 0.05), (0.6666667, 0.05), (0.6666667, 0.06666667), (0.65833336, 0.06666667), (0.65833336, 0.05), (0.65833336, 0.05), (0.65833336, 0.06666667), (0.65, 0.06666667), (0.65, 0.05), (0.65, 0.05), (0.65, 0.06666667), (0.64166665, 0.06666667), (0.64166665, 0.05), (0.64166665, 0.05), (0.64166665, 0.06666667), (0.6333333, 0.06666667), (0.6333333, 0.05), (0.6333333, 0.05), (0.6333333, 0.06666667), (0.625, 0.06666667), (0.625, 0.05), (0.625, 0.05), (0.625, 0.06666667), (0.6166667, 0.06666667), (0.6166667, 0.05), (0.6166667, 0.05), (0.6166667, 0.06666667), (0.60833335, 0.06666667), (0.60833335, 0.05), (0.60833335, 0.05), (0.60833335, 0.06666667), (0.6, 0.06666667), (0.6, 0.05), (0.6, 0.05), (0.6, 0.06666667), (0.59166664, 0.06666667), (0.59166664, 0.05), (0.59166664, 0.05), (0.59166664, 0.06666667), (0.5833333, 0.06666667), (0.5833333, 0.05), (0.5833333, 0.05), (0.5833333, 0.06666667), (0.575, 0.06666667), (0.575, 0.05), (0.575, 0.05), (0.575, 0.06666667), (0.56666666, 0.06666667), (0.56666666, 0.05), (0.56666666, 0.05), (0.56666666, 0.06666667), (0.55833334, 0.06666667), (0.55833334, 0.05), (0.55833334, 0.05), (0.55833334, 0.06666667), (0.55, 0.06666667), (0.55, 0.05), (0.55, 0.05), (0.55, 0.06666667), (0.5416667, 0.06666667), (0.5416667, 0.05), (0.5416667, 0.05), (0.5416667, 0.06666667), (0.53333336, 0.06666667), (0.53333336, 0.05), (0.53333336, 0.05), (0.53333336, 0.06666667), (0.525, 0.06666667), (0.525, 0.05), (0.525, 0.05), (0.525, 0.06666667), (0.51666665, 0.06666667), (0.51666665, 0.05), (0.51666665, 0.05), (0.51666665, 0.06666667), (0.5083333, 0.06666667), (0.5083333, 0.05), (0.5083333, 0.05), (0.5083333, 0.06666667), (0.5, 0.06666667), (0.5, 0.05), (0.5, 0.05), (0.5, 0.06666667), (0.49166667, 0.06666667), (0.49166667, 0.05), (0.49166667, 0.05), (0.49166667, 0.06666667), (0.48333332, 0.06666667), (0.48333332, 0.05), (0.48333332, 0.05), (0.48333332, 0.06666667), (0.475, 0.06666667), (0.475, 0.05), (0.475, 0.05), (0.475, 0.06666667), (0.46666667, 0.06666667), (0.46666667, 0.05), (0.46666667, 0.05), (0.46666667, 0.06666667), (0.45833334, 0.06666667), (0.45833334, 0.05), (0.45833334, 0.05), (0.45833334, 0.06666667), (0.45, 0.06666667), (0.45, 0.05), (0.45, 0.05), (0.45, 0.06666667), (0.44166666, 0.06666667), (0.44166666, 0.05), (0.44166666, 0.05), (0.44166666, 0.06666667), (0.43333334, 0.06666667), (0.43333334, 0.05), (0.43333334, 0.05), (0.43333334, 0.06666667), (0.425, 0.06666667), (0.425, 0.05), (0.425, 0.05), (0.425, 0.06666667), (0.41666666, 0.06666667), (0.41666666, 0.05), (0.41666666, 0.05), (0.41666666, 0.06666667), (0.40833333, 0.06666667), (0.40833333, 0.05), (0.40833333, 0.05), (0.40833333, 0.06666667), (0.4, 0.06666667), (0.4, 0.05), (0.4, 0.05), (0.4, 0.06666667), (0.39166668, 0.06666667), (0.39166668, 0.05), (0.39166668, 0.05), (0.39166668, 0.06666667), (0.38333333, 0.06666667), (0.38333333, 0.05), (0.38333333, 0.05), (0.38333333, 0.06666667), (0.375, 0.06666667), (0.375, 0.05), (0.375, 0.05), (0.375, 0.06666667), (0.36666667, 0.06666667), (0.36666667, 0.05), (0.36666667, 0.05), (0.36666667, 0.06666667), (0.35833332, 0.06666667), (0.35833332, 0.05), (0.35833332, 0.05), (0.35833332, 0.06666667), (0.35, 0.06666667), (0.35, 0.05), (0.35, 0.05), (0.35, 0.06666667), (0.34166667, 0.06666667), (0.34166667, 0.05), (0.34166667, 0.05), (0.34166667, 0.06666667), (0.33333334, 0.06666667), (0.33333334, 0.05), (0.33333334, 0.05), (0.33333334, 0.06666667), (0.325, 0.06666667), (0.325, 0.05), (0.325, 0.05), (0.325, 0.06666667), (0.31666666, 0.06666667), (0.31666666, 0.05), (0.31666666, 0.05), (0.31666666, 0.06666667), (0.30833334, 0.06666667), (0.30833334, 0.05), (0.30833334, 0.05), (0.30833334, 0.06666667), (0.3, 0.06666667), (0.3, 0.05), (0.3, 0.05), (0.3, 0.06666667), (0.29166666, 0.06666667), (0.29166666, 0.05), (0.29166666, 0.05), (0.29166666, 0.06666667), (0.28333333, 0.06666667), (0.28333333, 0.05), (0.28333333, 0.05), (0.28333333, 0.06666667), (0.275, 0.06666667), (0.275, 0.05), (0.275, 0.05), (0.275, 0.06666667), (0.26666668, 0.06666667), (0.26666668, 0.05), (0.26666668, 0.05), (0.26666668, 0.06666667), (0.25833333, 0.06666667), (0.25833333, 0.05), (0.25833333, 0.05), (0.25833333, 0.06666667), (0.25, 0.06666667), (0.25, 0.05), (0.25, 0.05), (0.25, 0.06666667), (0.24166666, 0.06666667), (0.24166666, 0.05), (0.24166666, 0.05), (0.24166666, 0.06666667), (0.23333333, 0.06666667), (0.23333333, 0.05), (0.23333333, 0.05), (0.23333333, 0.06666667), (0.225, 0.06666667), (0.225, 0.05), (0.225, 0.05), (0.225, 0.06666667), (0.21666667, 0.06666667), (0.21666667, 0.05), (0.21666667, 0.05), (0.21666667, 0.06666667), (0.20833333, 0.06666667), (0.20833333, 0.05), (0.20833333, 0.05), (0.20833333, 0.06666667), (0.2, 0.06666667), (0.2, 0.05), (0.2, 0.05), (0.2, 0.06666667), (0.19166666, 0.06666667), (0.19166666, 0.05), (0.19166666, 0.05), (0.19166666, 0.06666667), (0.18333334, 0.06666667), (0.18333334, 0.05), (0.18333334, 0.05), (0.18333334, 0.06666667), (0.175, 0.06666667), (0.175, 0.05), (0.175, 0.05), (0.175, 0.06666667), (0.16666667, 0.06666667), (0.16666667, 0.05), (0.16666667, 0.05), (0.16666667, 0.06666667), (0.15833333, 0.06666667), (0.15833333, 0.05), (0.15833333, 0.05), (0.15833333, 0.06666667), (0.15, 0.06666667), (0.15, 0.05), (0.15, 0.05), (0.15, 0.06666667), (0.14166667, 0.06666667), (0.14166667, 0.05), (0.14166667, 0.05), (0.14166667, 0.06666667), (0.13333334, 0.06666667), (0.13333334, 0.05), (0.13333334, 0.05), (0.13333334, 0.06666667), (0.125, 0.06666667), (0.125, 0.05), (0.125, 0.05), (0.125, 0.06666667), (0.11666667, 0.06666667), (0.11666667, 0.05), (0.11666667, 0.05), (0.11666667, 0.06666667), (0.108333334, 0.06666667), (0.108333334, 0.05), (0.108333334, 0.05), (0.108333334, 0.06666667), (0.1, 0.06666667), (0.1, 0.05), (0.1, 0.05), (0.1, 0.06666667), (0.09166667, 0.06666667), (0.09166667, 0.05), (0.09166667, 0.05), (0.09166667, 0.06666667), (0.083333336, 0.06666667), (0.083333336, 0.05), (0.083333336, 0.05), (0.083333336, 0.06666667), (0.075, 0.06666667), (0.075, 0.05), (0.075, 0.05), (0.075, 0.06666667), (0.06666667, 0.06666667), (0.06666667, 0.05), (0.06666667, 0.05), (0.06666667, 0.06666667), (0.058333334, 0.06666667), (0.058333334, 0.05), (0.058333334, 0.05), (0.058333334, 0.06666667), (0.05, 0.06666667), (0.05, 0.05), (0.05, 0.05), (0.05, 0.06666667), (0.041666668, 0.06666667), (0.041666668, 0.05), (0.041666668, 0.05), (0.041666668, 0.06666667), (0.033333335, 0.06666667), (0.033333335, 0.05), (0.033333335, 0.05), (0.033333335, 0.06666667), (0.025, 0.06666667), (0.025, 0.05), (0.025, 0.05), (0.025, 0.06666667), (0.016666668, 0.06666667), (0.016666668, 0.05), (0.016666668, 0.05), (0.016666668, 0.06666667), (0.008333334, 0.06666667), (0.008333334, 0.05), (0.008333334, 0.05), (0.008333334, 0.06666667), (0, 0.06666667), (0, 0.05), (1, 0.06666667), (1, 0.083333336), (0.9916667, 0.083333336), (0.9916667, 0.06666667), (0.9916667, 0.06666667), (0.9916667, 0.083333336), (0.98333335, 0.083333336), (0.98333335, 0.06666667), (0.98333335, 0.06666667), (0.98333335, 0.083333336), (0.975, 0.083333336), (0.975, 0.06666667), (0.975, 0.06666667), (0.975, 0.083333336), (0.96666664, 0.083333336), (0.96666664, 0.06666667), (0.96666664, 0.06666667), (0.96666664, 0.083333336), (0.9583333, 0.083333336), (0.9583333, 0.06666667), (0.9583333, 0.06666667), (0.9583333, 0.083333336), (0.95, 0.083333336), (0.95, 0.06666667), (0.95, 0.06666667), (0.95, 0.083333336), (0.94166666, 0.083333336), (0.94166666, 0.06666667), (0.94166666, 0.06666667), (0.94166666, 0.083333336), (0.93333334, 0.083333336), (0.93333334, 0.06666667), (0.93333334, 0.06666667), (0.93333334, 0.083333336), (0.925, 0.083333336), (0.925, 0.06666667), (0.925, 0.06666667), (0.925, 0.083333336), (0.9166667, 0.083333336), (0.9166667, 0.06666667), (0.9166667, 0.06666667), (0.9166667, 0.083333336), (0.90833336, 0.083333336), (0.90833336, 0.06666667), (0.90833336, 0.06666667), (0.90833336, 0.083333336), (0.9, 0.083333336), (0.9, 0.06666667), (0.9, 0.06666667), (0.9, 0.083333336), (0.89166665, 0.083333336), (0.89166665, 0.06666667), (0.89166665, 0.06666667), (0.89166665, 0.083333336), (0.8833333, 0.083333336), (0.8833333, 0.06666667), (0.8833333, 0.06666667), (0.8833333, 0.083333336), (0.875, 0.083333336), (0.875, 0.06666667), (0.875, 0.06666667), (0.875, 0.083333336), (0.8666667, 0.083333336), (0.8666667, 0.06666667), (0.8666667, 0.06666667), (0.8666667, 0.083333336), (0.85833335, 0.083333336), (0.85833335, 0.06666667), (0.85833335, 0.06666667), (0.85833335, 0.083333336), (0.85, 0.083333336), (0.85, 0.06666667), (0.85, 0.06666667), (0.85, 0.083333336), (0.84166664, 0.083333336), (0.84166664, 0.06666667), (0.84166664, 0.06666667), (0.84166664, 0.083333336), (0.8333333, 0.083333336), (0.8333333, 0.06666667), (0.8333333, 0.06666667), (0.8333333, 0.083333336), (0.825, 0.083333336), (0.825, 0.06666667), (0.825, 0.06666667), (0.825, 0.083333336), (0.81666666, 0.083333336), (0.81666666, 0.06666667), (0.81666666, 0.06666667), (0.81666666, 0.083333336), (0.80833334, 0.083333336), (0.80833334, 0.06666667), (0.80833334, 0.06666667), (0.80833334, 0.083333336), (0.8, 0.083333336), (0.8, 0.06666667), (0.8, 0.06666667), (0.8, 0.083333336), (0.7916667, 0.083333336), (0.7916667, 0.06666667), (0.7916667, 0.06666667), (0.7916667, 0.083333336), (0.78333336, 0.083333336), (0.78333336, 0.06666667), (0.78333336, 0.06666667), (0.78333336, 0.083333336), (0.775, 0.083333336), (0.775, 0.06666667), (0.775, 0.06666667), (0.775, 0.083333336), (0.76666665, 0.083333336), (0.76666665, 0.06666667), (0.76666665, 0.06666667), (0.76666665, 0.083333336), (0.7583333, 0.083333336), (0.7583333, 0.06666667), (0.7583333, 0.06666667), (0.7583333, 0.083333336), (0.75, 0.083333336), (0.75, 0.06666667), (0.75, 0.06666667), (0.75, 0.083333336), (0.7416667, 0.083333336), (0.7416667, 0.06666667), (0.7416667, 0.06666667), (0.7416667, 0.083333336), (0.73333335, 0.083333336), (0.73333335, 0.06666667), (0.73333335, 0.06666667), (0.73333335, 0.083333336), (0.725, 0.083333336), (0.725, 0.06666667), (0.725, 0.06666667), (0.725, 0.083333336), (0.71666664, 0.083333336), (0.71666664, 0.06666667), (0.71666664, 0.06666667), (0.71666664, 0.083333336), (0.7083333, 0.083333336), (0.7083333, 0.06666667), (0.7083333, 0.06666667), (0.7083333, 0.083333336), (0.7, 0.083333336), (0.7, 0.06666667), (0.7, 0.06666667), (0.7, 0.083333336), (0.69166666, 0.083333336), (0.69166666, 0.06666667), (0.69166666, 0.06666667), (0.69166666, 0.083333336), (0.68333334, 0.083333336), (0.68333334, 0.06666667), (0.68333334, 0.06666667), (0.68333334, 0.083333336), (0.675, 0.083333336), (0.675, 0.06666667), (0.675, 0.06666667), (0.675, 0.083333336), (0.6666667, 0.083333336), (0.6666667, 0.06666667), (0.6666667, 0.06666667), (0.6666667, 0.083333336), (0.65833336, 0.083333336), (0.65833336, 0.06666667), (0.65833336, 0.06666667), (0.65833336, 0.083333336), (0.65, 0.083333336), (0.65, 0.06666667), (0.65, 0.06666667), (0.65, 0.083333336), (0.64166665, 0.083333336), (0.64166665, 0.06666667), (0.64166665, 0.06666667), (0.64166665, 0.083333336), (0.6333333, 0.083333336), (0.6333333, 0.06666667), (0.6333333, 0.06666667), (0.6333333, 0.083333336), (0.625, 0.083333336), (0.625, 0.06666667), (0.625, 0.06666667), (0.625, 0.083333336), (0.6166667, 0.083333336), (0.6166667, 0.06666667), (0.6166667, 0.06666667), (0.6166667, 0.083333336), (0.60833335, 0.083333336), (0.60833335, 0.06666667), (0.60833335, 0.06666667), (0.60833335, 0.083333336), (0.6, 0.083333336), (0.6, 0.06666667), (0.6, 0.06666667), (0.6, 0.083333336), (0.59166664, 0.083333336), (0.59166664, 0.06666667), (0.59166664, 0.06666667), (0.59166664, 0.083333336), (0.5833333, 0.083333336), (0.5833333, 0.06666667), (0.5833333, 0.06666667), (0.5833333, 0.083333336), (0.575, 0.083333336), (0.575, 0.06666667), (0.575, 0.06666667), (0.575, 0.083333336), (0.56666666, 0.083333336), (0.56666666, 0.06666667), (0.56666666, 0.06666667), (0.56666666, 0.083333336), (0.55833334, 0.083333336), (0.55833334, 0.06666667), (0.55833334, 0.06666667), (0.55833334, 0.083333336), (0.55, 0.083333336), (0.55, 0.06666667), (0.55, 0.06666667), (0.55, 0.083333336), (0.5416667, 0.083333336), (0.5416667, 0.06666667), (0.5416667, 0.06666667), (0.5416667, 0.083333336), (0.53333336, 0.083333336), (0.53333336, 0.06666667), (0.53333336, 0.06666667), (0.53333336, 0.083333336), (0.525, 0.083333336), (0.525, 0.06666667), (0.525, 0.06666667), (0.525, 0.083333336), (0.51666665, 0.083333336), (0.51666665, 0.06666667), (0.51666665, 0.06666667), (0.51666665, 0.083333336), (0.5083333, 0.083333336), (0.5083333, 0.06666667), (0.5083333, 0.06666667), (0.5083333, 0.083333336), (0.5, 0.083333336), (0.5, 0.06666667), (0.5, 0.06666667), (0.5, 0.083333336), (0.49166667, 0.083333336), (0.49166667, 0.06666667), (0.49166667, 0.06666667), (0.49166667, 0.083333336), (0.48333332, 0.083333336), (0.48333332, 0.06666667), (0.48333332, 0.06666667), (0.48333332, 0.083333336), (0.475, 0.083333336), (0.475, 0.06666667), (0.475, 0.06666667), (0.475, 0.083333336), (0.46666667, 0.083333336), (0.46666667, 0.06666667), (0.46666667, 0.06666667), (0.46666667, 0.083333336), (0.45833334, 0.083333336), (0.45833334, 0.06666667), (0.45833334, 0.06666667), (0.45833334, 0.083333336), (0.45, 0.083333336), (0.45, 0.06666667), (0.45, 0.06666667), (0.45, 0.083333336), (0.44166666, 0.083333336), (0.44166666, 0.06666667), (0.44166666, 0.06666667), (0.44166666, 0.083333336), (0.43333334, 0.083333336), (0.43333334, 0.06666667), (0.43333334, 0.06666667), (0.43333334, 0.083333336), (0.425, 0.083333336), (0.425, 0.06666667), (0.425, 0.06666667), (0.425, 0.083333336), (0.41666666, 0.083333336), (0.41666666, 0.06666667), (0.41666666, 0.06666667), (0.41666666, 0.083333336), (0.40833333, 0.083333336), (0.40833333, 0.06666667), (0.40833333, 0.06666667), (0.40833333, 0.083333336), (0.4, 0.083333336), (0.4, 0.06666667), (0.4, 0.06666667), (0.4, 0.083333336), (0.39166668, 0.083333336), (0.39166668, 0.06666667), (0.39166668, 0.06666667), (0.39166668, 0.083333336), (0.38333333, 0.083333336), (0.38333333, 0.06666667), (0.38333333, 0.06666667), (0.38333333, 0.083333336), (0.375, 0.083333336), (0.375, 0.06666667), (0.375, 0.06666667), (0.375, 0.083333336), (0.36666667, 0.083333336), (0.36666667, 0.06666667), (0.36666667, 0.06666667), (0.36666667, 0.083333336), (0.35833332, 0.083333336), (0.35833332, 0.06666667), (0.35833332, 0.06666667), (0.35833332, 0.083333336), (0.35, 0.083333336), (0.35, 0.06666667), (0.35, 0.06666667), (0.35, 0.083333336), (0.34166667, 0.083333336), (0.34166667, 0.06666667), (0.34166667, 0.06666667), (0.34166667, 0.083333336), (0.33333334, 0.083333336), (0.33333334, 0.06666667), (0.33333334, 0.06666667), (0.33333334, 0.083333336), (0.325, 0.083333336), (0.325, 0.06666667), (0.325, 0.06666667), (0.325, 0.083333336), (0.31666666, 0.083333336), (0.31666666, 0.06666667), (0.31666666, 0.06666667), (0.31666666, 0.083333336), (0.30833334, 0.083333336), (0.30833334, 0.06666667), (0.30833334, 0.06666667), (0.30833334, 0.083333336), (0.3, 0.083333336), (0.3, 0.06666667), (0.3, 0.06666667), (0.3, 0.083333336), (0.29166666, 0.083333336), (0.29166666, 0.06666667), (0.29166666, 0.06666667), (0.29166666, 0.083333336), (0.28333333, 0.083333336), (0.28333333, 0.06666667), (0.28333333, 0.06666667), (0.28333333, 0.083333336), (0.275, 0.083333336), (0.275, 0.06666667), (0.275, 0.06666667), (0.275, 0.083333336), (0.26666668, 0.083333336), (0.26666668, 0.06666667), (0.26666668, 0.06666667), (0.26666668, 0.083333336), (0.25833333, 0.083333336), (0.25833333, 0.06666667), (0.25833333, 0.06666667), (0.25833333, 0.083333336), (0.25, 0.083333336), (0.25, 0.06666667), (0.25, 0.06666667), (0.25, 0.083333336), (0.24166666, 0.083333336), (0.24166666, 0.06666667), (0.24166666, 0.06666667), (0.24166666, 0.083333336), (0.23333333, 0.083333336), (0.23333333, 0.06666667), (0.23333333, 0.06666667), (0.23333333, 0.083333336), (0.225, 0.083333336), (0.225, 0.06666667), (0.225, 0.06666667), (0.225, 0.083333336), (0.21666667, 0.083333336), (0.21666667, 0.06666667), (0.21666667, 0.06666667), (0.21666667, 0.083333336), (0.20833333, 0.083333336), (0.20833333, 0.06666667), (0.20833333, 0.06666667), (0.20833333, 0.083333336), (0.2, 0.083333336), (0.2, 0.06666667), (0.2, 0.06666667), (0.2, 0.083333336), (0.19166666, 0.083333336), (0.19166666, 0.06666667), (0.19166666, 0.06666667), (0.19166666, 0.083333336), (0.18333334, 0.083333336), (0.18333334, 0.06666667), (0.18333334, 0.06666667), (0.18333334, 0.083333336), (0.175, 0.083333336), (0.175, 0.06666667), (0.175, 0.06666667), (0.175, 0.083333336), (0.16666667, 0.083333336), (0.16666667, 0.06666667), (0.16666667, 0.06666667), (0.16666667, 0.083333336), (0.15833333, 0.083333336), (0.15833333, 0.06666667), (0.15833333, 0.06666667), (0.15833333, 0.083333336), (0.15, 0.083333336), (0.15, 0.06666667), (0.15, 0.06666667), (0.15, 0.083333336), (0.14166667, 0.083333336), (0.14166667, 0.06666667), (0.14166667, 0.06666667), (0.14166667, 0.083333336), (0.13333334, 0.083333336), (0.13333334, 0.06666667), (0.13333334, 0.06666667), (0.13333334, 0.083333336), (0.125, 0.083333336), (0.125, 0.06666667), (0.125, 0.06666667), (0.125, 0.083333336), (0.11666667, 0.083333336), (0.11666667, 0.06666667), (0.11666667, 0.06666667), (0.11666667, 0.083333336), (0.108333334, 0.083333336), (0.108333334, 0.06666667), (0.108333334, 0.06666667), (0.108333334, 0.083333336), (0.1, 0.083333336), (0.1, 0.06666667), (0.1, 0.06666667), (0.1, 0.083333336), (0.09166667, 0.083333336), (0.09166667, 0.06666667), (0.09166667, 0.06666667), (0.09166667, 0.083333336), (0.083333336, 0.083333336), (0.083333336, 0.06666667), (0.083333336, 0.06666667), (0.083333336, 0.083333336), (0.075, 0.083333336), (0.075, 0.06666667), (0.075, 0.06666667), (0.075, 0.083333336), (0.06666667, 0.083333336), (0.06666667, 0.06666667), (0.06666667, 0.06666667), (0.06666667, 0.083333336), (0.058333334, 0.083333336), (0.058333334, 0.06666667), (0.058333334, 0.06666667), (0.058333334, 0.083333336), (0.05, 0.083333336), (0.05, 0.06666667), (0.05, 0.06666667), (0.05, 0.083333336), (0.041666668, 0.083333336), (0.041666668, 0.06666667), (0.041666668, 0.06666667), (0.041666668, 0.083333336), (0.033333335, 0.083333336), (0.033333335, 0.06666667), (0.033333335, 0.06666667), (0.033333335, 0.083333336), (0.025, 0.083333336), (0.025, 0.06666667), (0.025, 0.06666667), (0.025, 0.083333336), (0.016666668, 0.083333336), (0.016666668, 0.06666667), (0.016666668, 0.06666667), (0.016666668, 0.083333336), (0.008333334, 0.083333336), (0.008333334, 0.06666667), (0.008333334, 0.06666667), (0.008333334, 0.083333336), (0, 0.083333336), (0, 0.06666667), (1, 0.083333336), (1, 0.1), (0.9916667, 0.1), (0.9916667, 0.083333336), (0.9916667, 0.083333336), (0.9916667, 0.1), (0.98333335, 0.1), (0.98333335, 0.083333336), (0.98333335, 0.083333336), (0.98333335, 0.1), (0.975, 0.1), (0.975, 0.083333336), (0.975, 0.083333336), (0.975, 0.1), (0.96666664, 0.1), (0.96666664, 0.083333336), (0.96666664, 0.083333336), (0.96666664, 0.1), (0.9583333, 0.1), (0.9583333, 0.083333336), (0.9583333, 0.083333336), (0.9583333, 0.1), (0.95, 0.1), (0.95, 0.083333336), (0.95, 0.083333336), (0.95, 0.1), (0.94166666, 0.1), (0.94166666, 0.083333336), (0.94166666, 0.083333336), (0.94166666, 0.1), (0.93333334, 0.1), (0.93333334, 0.083333336), (0.93333334, 0.083333336), (0.93333334, 0.1), (0.925, 0.1), (0.925, 0.083333336), (0.925, 0.083333336), (0.925, 0.1), (0.9166667, 0.1), (0.9166667, 0.083333336), (0.9166667, 0.083333336), (0.9166667, 0.1), (0.90833336, 0.1), (0.90833336, 0.083333336), (0.90833336, 0.083333336), (0.90833336, 0.1), (0.9, 0.1), (0.9, 0.083333336), (0.9, 0.083333336), (0.9, 0.1), (0.89166665, 0.1), (0.89166665, 0.083333336), (0.89166665, 0.083333336), (0.89166665, 0.1), (0.8833333, 0.1), (0.8833333, 0.083333336), (0.8833333, 0.083333336), (0.8833333, 0.1), (0.875, 0.1), (0.875, 0.083333336), (0.875, 0.083333336), (0.875, 0.1), (0.8666667, 0.1), (0.8666667, 0.083333336), (0.8666667, 0.083333336), (0.8666667, 0.1), (0.85833335, 0.1), (0.85833335, 0.083333336), (0.85833335, 0.083333336), (0.85833335, 0.1), (0.85, 0.1), (0.85, 0.083333336), (0.85, 0.083333336), (0.85, 0.1), (0.84166664, 0.1), (0.84166664, 0.083333336), (0.84166664, 0.083333336), (0.84166664, 0.1), (0.8333333, 0.1), (0.8333333, 0.083333336), (0.8333333, 0.083333336), (0.8333333, 0.1), (0.825, 0.1), (0.825, 0.083333336), (0.825, 0.083333336), (0.825, 0.1), (0.81666666, 0.1), (0.81666666, 0.083333336), (0.81666666, 0.083333336), (0.81666666, 0.1), (0.80833334, 0.1), (0.80833334, 0.083333336), (0.80833334, 0.083333336), (0.80833334, 0.1), (0.8, 0.1), (0.8, 0.083333336), (0.8, 0.083333336), (0.8, 0.1), (0.7916667, 0.1), (0.7916667, 0.083333336), (0.7916667, 0.083333336), (0.7916667, 0.1), (0.78333336, 0.1), (0.78333336, 0.083333336), (0.78333336, 0.083333336), (0.78333336, 0.1), (0.775, 0.1), (0.775, 0.083333336), (0.775, 0.083333336), (0.775, 0.1), (0.76666665, 0.1), (0.76666665, 0.083333336), (0.76666665, 0.083333336), (0.76666665, 0.1), (0.7583333, 0.1), (0.7583333, 0.083333336), (0.7583333, 0.083333336), (0.7583333, 0.1), (0.75, 0.1), (0.75, 0.083333336), (0.75, 0.083333336), (0.75, 0.1), (0.7416667, 0.1), (0.7416667, 0.083333336), (0.7416667, 0.083333336), (0.7416667, 0.1), (0.73333335, 0.1), (0.73333335, 0.083333336), (0.73333335, 0.083333336), (0.73333335, 0.1), (0.725, 0.1), (0.725, 0.083333336), (0.725, 0.083333336), (0.725, 0.1), (0.71666664, 0.1), (0.71666664, 0.083333336), (0.71666664, 0.083333336), (0.71666664, 0.1), (0.7083333, 0.1), (0.7083333, 0.083333336), (0.7083333, 0.083333336), (0.7083333, 0.1), (0.7, 0.1), (0.7, 0.083333336), (0.7, 0.083333336), (0.7, 0.1), (0.69166666, 0.1), (0.69166666, 0.083333336), (0.69166666, 0.083333336), (0.69166666, 0.1), (0.68333334, 0.1), (0.68333334, 0.083333336), (0.68333334, 0.083333336), (0.68333334, 0.1), (0.675, 0.1), (0.675, 0.083333336), (0.675, 0.083333336), (0.675, 0.1), (0.6666667, 0.1), (0.6666667, 0.083333336), (0.6666667, 0.083333336), (0.6666667, 0.1), (0.65833336, 0.1), (0.65833336, 0.083333336), (0.65833336, 0.083333336), (0.65833336, 0.1), (0.65, 0.1), (0.65, 0.083333336), (0.65, 0.083333336), (0.65, 0.1), (0.64166665, 0.1), (0.64166665, 0.083333336), (0.64166665, 0.083333336), (0.64166665, 0.1), (0.6333333, 0.1), (0.6333333, 0.083333336), (0.6333333, 0.083333336), (0.6333333, 0.1), (0.625, 0.1), (0.625, 0.083333336), (0.625, 0.083333336), (0.625, 0.1), (0.6166667, 0.1), (0.6166667, 0.083333336), (0.6166667, 0.083333336), (0.6166667, 0.1), (0.60833335, 0.1), (0.60833335, 0.083333336), (0.60833335, 0.083333336), (0.60833335, 0.1), (0.6, 0.1), (0.6, 0.083333336), (0.6, 0.083333336), (0.6, 0.1), (0.59166664, 0.1), (0.59166664, 0.083333336), (0.59166664, 0.083333336), (0.59166664, 0.1), (0.5833333, 0.1), (0.5833333, 0.083333336), (0.5833333, 0.083333336), (0.5833333, 0.1), (0.575, 0.1), (0.575, 0.083333336), (0.575, 0.083333336), (0.575, 0.1), (0.56666666, 0.1), (0.56666666, 0.083333336), (0.56666666, 0.083333336), (0.56666666, 0.1), (0.55833334, 0.1), (0.55833334, 0.083333336), (0.55833334, 0.083333336), (0.55833334, 0.1), (0.55, 0.1), (0.55, 0.083333336), (0.55, 0.083333336), (0.55, 0.1), (0.5416667, 0.1), (0.5416667, 0.083333336), (0.5416667, 0.083333336), (0.5416667, 0.1), (0.53333336, 0.1), (0.53333336, 0.083333336), (0.53333336, 0.083333336), (0.53333336, 0.1), (0.525, 0.1), (0.525, 0.083333336), (0.525, 0.083333336), (0.525, 0.1), (0.51666665, 0.1), (0.51666665, 0.083333336), (0.51666665, 0.083333336), (0.51666665, 0.1), (0.5083333, 0.1), (0.5083333, 0.083333336), (0.5083333, 0.083333336), (0.5083333, 0.1), (0.5, 0.1), (0.5, 0.083333336), (0.5, 0.083333336), (0.5, 0.1), (0.49166667, 0.1), (0.49166667, 0.083333336), (0.49166667, 0.083333336), (0.49166667, 0.1), (0.48333332, 0.1), (0.48333332, 0.083333336), (0.48333332, 0.083333336), (0.48333332, 0.1), (0.475, 0.1), (0.475, 0.083333336), (0.475, 0.083333336), (0.475, 0.1), (0.46666667, 0.1), (0.46666667, 0.083333336), (0.46666667, 0.083333336), (0.46666667, 0.1), (0.45833334, 0.1), (0.45833334, 0.083333336), (0.45833334, 0.083333336), (0.45833334, 0.1), (0.45, 0.1), (0.45, 0.083333336), (0.45, 0.083333336), (0.45, 0.1), (0.44166666, 0.1), (0.44166666, 0.083333336), (0.44166666, 0.083333336), (0.44166666, 0.1), (0.43333334, 0.1), (0.43333334, 0.083333336), (0.43333334, 0.083333336), (0.43333334, 0.1), (0.425, 0.1), (0.425, 0.083333336), (0.425, 0.083333336), (0.425, 0.1), (0.41666666, 0.1), (0.41666666, 0.083333336), (0.41666666, 0.083333336), (0.41666666, 0.1), (0.40833333, 0.1), (0.40833333, 0.083333336), (0.40833333, 0.083333336), (0.40833333, 0.1), (0.4, 0.1), (0.4, 0.083333336), (0.4, 0.083333336), (0.4, 0.1), (0.39166668, 0.1), (0.39166668, 0.083333336), (0.39166668, 0.083333336), (0.39166668, 0.1), (0.38333333, 0.1), (0.38333333, 0.083333336), (0.38333333, 0.083333336), (0.38333333, 0.1), (0.375, 0.1), (0.375, 0.083333336), (0.375, 0.083333336), (0.375, 0.1), (0.36666667, 0.1), (0.36666667, 0.083333336), (0.36666667, 0.083333336), (0.36666667, 0.1), (0.35833332, 0.1), (0.35833332, 0.083333336), (0.35833332, 0.083333336), (0.35833332, 0.1), (0.35, 0.1), (0.35, 0.083333336), (0.35, 0.083333336), (0.35, 0.1), (0.34166667, 0.1), (0.34166667, 0.083333336), (0.34166667, 0.083333336), (0.34166667, 0.1), (0.33333334, 0.1), (0.33333334, 0.083333336), (0.33333334, 0.083333336), (0.33333334, 0.1), (0.325, 0.1), (0.325, 0.083333336), (0.325, 0.083333336), (0.325, 0.1), (0.31666666, 0.1), (0.31666666, 0.083333336), (0.31666666, 0.083333336), (0.31666666, 0.1), (0.30833334, 0.1), (0.30833334, 0.083333336), (0.30833334, 0.083333336), (0.30833334, 0.1), (0.3, 0.1), (0.3, 0.083333336), (0.3, 0.083333336), (0.3, 0.1), (0.29166666, 0.1), (0.29166666, 0.083333336), (0.29166666, 0.083333336), (0.29166666, 0.1), (0.28333333, 0.1), (0.28333333, 0.083333336), (0.28333333, 0.083333336), (0.28333333, 0.1), (0.275, 0.1), (0.275, 0.083333336), (0.275, 0.083333336), (0.275, 0.1), (0.26666668, 0.1), (0.26666668, 0.083333336), (0.26666668, 0.083333336), (0.26666668, 0.1), (0.25833333, 0.1), (0.25833333, 0.083333336), (0.25833333, 0.083333336), (0.25833333, 0.1), (0.25, 0.1), (0.25, 0.083333336), (0.25, 0.083333336), (0.25, 0.1), (0.24166666, 0.1), (0.24166666, 0.083333336), (0.24166666, 0.083333336), (0.24166666, 0.1), (0.23333333, 0.1), (0.23333333, 0.083333336), (0.23333333, 0.083333336), (0.23333333, 0.1), (0.225, 0.1), (0.225, 0.083333336), (0.225, 0.083333336), (0.225, 0.1), (0.21666667, 0.1), (0.21666667, 0.083333336), (0.21666667, 0.083333336), (0.21666667, 0.1), (0.20833333, 0.1), (0.20833333, 0.083333336), (0.20833333, 0.083333336), (0.20833333, 0.1), (0.2, 0.1), (0.2, 0.083333336), (0.2, 0.083333336), (0.2, 0.1), (0.19166666, 0.1), (0.19166666, 0.083333336), (0.19166666, 0.083333336), (0.19166666, 0.1), (0.18333334, 0.1), (0.18333334, 0.083333336), (0.18333334, 0.083333336), (0.18333334, 0.1), (0.175, 0.1), (0.175, 0.083333336), (0.175, 0.083333336), (0.175, 0.1), (0.16666667, 0.1), (0.16666667, 0.083333336), (0.16666667, 0.083333336), (0.16666667, 0.1), (0.15833333, 0.1), (0.15833333, 0.083333336), (0.15833333, 0.083333336), (0.15833333, 0.1), (0.15, 0.1), (0.15, 0.083333336), (0.15, 0.083333336), (0.15, 0.1), (0.14166667, 0.1), (0.14166667, 0.083333336), (0.14166667, 0.083333336), (0.14166667, 0.1), (0.13333334, 0.1), (0.13333334, 0.083333336), (0.13333334, 0.083333336), (0.13333334, 0.1), (0.125, 0.1), (0.125, 0.083333336), (0.125, 0.083333336), (0.125, 0.1), (0.11666667, 0.1), (0.11666667, 0.083333336), (0.11666667, 0.083333336), (0.11666667, 0.1), (0.108333334, 0.1), (0.108333334, 0.083333336), (0.108333334, 0.083333336), (0.108333334, 0.1), (0.1, 0.1), (0.1, 0.083333336), (0.1, 0.083333336), (0.1, 0.1), (0.09166667, 0.1), (0.09166667, 0.083333336), (0.09166667, 0.083333336), (0.09166667, 0.1), (0.083333336, 0.1), (0.083333336, 0.083333336), (0.083333336, 0.083333336), (0.083333336, 0.1), (0.075, 0.1), (0.075, 0.083333336), (0.075, 0.083333336), (0.075, 0.1), (0.06666667, 0.1), (0.06666667, 0.083333336), (0.06666667, 0.083333336), (0.06666667, 0.1), (0.058333334, 0.1), (0.058333334, 0.083333336), (0.058333334, 0.083333336), (0.058333334, 0.1), (0.05, 0.1), (0.05, 0.083333336), (0.05, 0.083333336), (0.05, 0.1), (0.041666668, 0.1), (0.041666668, 0.083333336), (0.041666668, 0.083333336), (0.041666668, 0.1), (0.033333335, 0.1), (0.033333335, 0.083333336), (0.033333335, 0.083333336), (0.033333335, 0.1), (0.025, 0.1), (0.025, 0.083333336), (0.025, 0.083333336), (0.025, 0.1), (0.016666668, 0.1), (0.016666668, 0.083333336), (0.016666668, 0.083333336), (0.016666668, 0.1), (0.008333334, 0.1), (0.008333334, 0.083333336), (0.008333334, 0.083333336), (0.008333334, 0.1), (0, 0.1), (0, 0.083333336), (1, 0.1), (1, 0.11666667), (0.9916667, 0.11666667), (0.9916667, 0.1), (0.9916667, 0.1), (0.9916667, 0.11666667), (0.98333335, 0.11666667), (0.98333335, 0.1), (0.98333335, 0.1), (0.98333335, 0.11666667), (0.975, 0.11666667), (0.975, 0.1), (0.975, 0.1), (0.975, 0.11666667), (0.96666664, 0.11666667), (0.96666664, 0.1), (0.96666664, 0.1), (0.96666664, 0.11666667), (0.9583333, 0.11666667), (0.9583333, 0.1), (0.9583333, 0.1), (0.9583333, 0.11666667), (0.95, 0.11666667), (0.95, 0.1), (0.95, 0.1), (0.95, 0.11666667), (0.94166666, 0.11666667), (0.94166666, 0.1), (0.94166666, 0.1), (0.94166666, 0.11666667), (0.93333334, 0.11666667), (0.93333334, 0.1), (0.93333334, 0.1), (0.93333334, 0.11666667), (0.925, 0.11666667), (0.925, 0.1), (0.925, 0.1), (0.925, 0.11666667), (0.9166667, 0.11666667), (0.9166667, 0.1), (0.9166667, 0.1), (0.9166667, 0.11666667), (0.90833336, 0.11666667), (0.90833336, 0.1), (0.90833336, 0.1), (0.90833336, 0.11666667), (0.9, 0.11666667), (0.9, 0.1), (0.9, 0.1), (0.9, 0.11666667), (0.89166665, 0.11666667), (0.89166665, 0.1), (0.89166665, 0.1), (0.89166665, 0.11666667), (0.8833333, 0.11666667), (0.8833333, 0.1), (0.8833333, 0.1), (0.8833333, 0.11666667), (0.875, 0.11666667), (0.875, 0.1), (0.875, 0.1), (0.875, 0.11666667), (0.8666667, 0.11666667), (0.8666667, 0.1), (0.8666667, 0.1), (0.8666667, 0.11666667), (0.85833335, 0.11666667), (0.85833335, 0.1), (0.85833335, 0.1), (0.85833335, 0.11666667), (0.85, 0.11666667), (0.85, 0.1), (0.85, 0.1), (0.85, 0.11666667), (0.84166664, 0.11666667), (0.84166664, 0.1), (0.84166664, 0.1), (0.84166664, 0.11666667), (0.8333333, 0.11666667), (0.8333333, 0.1), (0.8333333, 0.1), (0.8333333, 0.11666667), (0.825, 0.11666667), (0.825, 0.1), (0.825, 0.1), (0.825, 0.11666667), (0.81666666, 0.11666667), (0.81666666, 0.1), (0.81666666, 0.1), (0.81666666, 0.11666667), (0.80833334, 0.11666667), (0.80833334, 0.1), (0.80833334, 0.1), (0.80833334, 0.11666667), (0.8, 0.11666667), (0.8, 0.1), (0.8, 0.1), (0.8, 0.11666667), (0.7916667, 0.11666667), (0.7916667, 0.1), (0.7916667, 0.1), (0.7916667, 0.11666667), (0.78333336, 0.11666667), (0.78333336, 0.1), (0.78333336, 0.1), (0.78333336, 0.11666667), (0.775, 0.11666667), (0.775, 0.1), (0.775, 0.1), (0.775, 0.11666667), (0.76666665, 0.11666667), (0.76666665, 0.1), (0.76666665, 0.1), (0.76666665, 0.11666667), (0.7583333, 0.11666667), (0.7583333, 0.1), (0.7583333, 0.1), (0.7583333, 0.11666667), (0.75, 0.11666667), (0.75, 0.1), (0.75, 0.1), (0.75, 0.11666667), (0.7416667, 0.11666667), (0.7416667, 0.1), (0.7416667, 0.1), (0.7416667, 0.11666667), (0.73333335, 0.11666667), (0.73333335, 0.1), (0.73333335, 0.1), (0.73333335, 0.11666667), (0.725, 0.11666667), (0.725, 0.1), (0.725, 0.1), (0.725, 0.11666667), (0.71666664, 0.11666667), (0.71666664, 0.1), (0.71666664, 0.1), (0.71666664, 0.11666667), (0.7083333, 0.11666667), (0.7083333, 0.1), (0.7083333, 0.1), (0.7083333, 0.11666667), (0.7, 0.11666667), (0.7, 0.1), (0.7, 0.1), (0.7, 0.11666667), (0.69166666, 0.11666667), (0.69166666, 0.1), (0.69166666, 0.1), (0.69166666, 0.11666667), (0.68333334, 0.11666667), (0.68333334, 0.1), (0.68333334, 0.1), (0.68333334, 0.11666667), (0.675, 0.11666667), (0.675, 0.1), (0.675, 0.1), (0.675, 0.11666667), (0.6666667, 0.11666667), (0.6666667, 0.1), (0.6666667, 0.1), (0.6666667, 0.11666667), (0.65833336, 0.11666667), (0.65833336, 0.1), (0.65833336, 0.1), (0.65833336, 0.11666667), (0.65, 0.11666667), (0.65, 0.1), (0.65, 0.1), (0.65, 0.11666667), (0.64166665, 0.11666667), (0.64166665, 0.1), (0.64166665, 0.1), (0.64166665, 0.11666667), (0.6333333, 0.11666667), (0.6333333, 0.1), (0.6333333, 0.1), (0.6333333, 0.11666667), (0.625, 0.11666667), (0.625, 0.1), (0.625, 0.1), (0.625, 0.11666667), (0.6166667, 0.11666667), (0.6166667, 0.1), (0.6166667, 0.1), (0.6166667, 0.11666667), (0.60833335, 0.11666667), (0.60833335, 0.1), (0.60833335, 0.1), (0.60833335, 0.11666667), (0.6, 0.11666667), (0.6, 0.1), (0.6, 0.1), (0.6, 0.11666667), (0.59166664, 0.11666667), (0.59166664, 0.1), (0.59166664, 0.1), (0.59166664, 0.11666667), (0.5833333, 0.11666667), (0.5833333, 0.1), (0.5833333, 0.1), (0.5833333, 0.11666667), (0.575, 0.11666667), (0.575, 0.1), (0.575, 0.1), (0.575, 0.11666667), (0.56666666, 0.11666667), (0.56666666, 0.1), (0.56666666, 0.1), (0.56666666, 0.11666667), (0.55833334, 0.11666667), (0.55833334, 0.1), (0.55833334, 0.1), (0.55833334, 0.11666667), (0.55, 0.11666667), (0.55, 0.1), (0.55, 0.1), (0.55, 0.11666667), (0.5416667, 0.11666667), (0.5416667, 0.1), (0.5416667, 0.1), (0.5416667, 0.11666667), (0.53333336, 0.11666667), (0.53333336, 0.1), (0.53333336, 0.1), (0.53333336, 0.11666667), (0.525, 0.11666667), (0.525, 0.1), (0.525, 0.1), (0.525, 0.11666667), (0.51666665, 0.11666667), (0.51666665, 0.1), (0.51666665, 0.1), (0.51666665, 0.11666667), (0.5083333, 0.11666667), (0.5083333, 0.1), (0.5083333, 0.1), (0.5083333, 0.11666667), (0.5, 0.11666667), (0.5, 0.1), (0.5, 0.1), (0.5, 0.11666667), (0.49166667, 0.11666667), (0.49166667, 0.1), (0.49166667, 0.1), (0.49166667, 0.11666667), (0.48333332, 0.11666667), (0.48333332, 0.1), (0.48333332, 0.1), (0.48333332, 0.11666667), (0.475, 0.11666667), (0.475, 0.1), (0.475, 0.1), (0.475, 0.11666667), (0.46666667, 0.11666667), (0.46666667, 0.1), (0.46666667, 0.1), (0.46666667, 0.11666667), (0.45833334, 0.11666667), (0.45833334, 0.1), (0.45833334, 0.1), (0.45833334, 0.11666667), (0.45, 0.11666667), (0.45, 0.1), (0.45, 0.1), (0.45, 0.11666667), (0.44166666, 0.11666667), (0.44166666, 0.1), (0.44166666, 0.1), (0.44166666, 0.11666667), (0.43333334, 0.11666667), (0.43333334, 0.1), (0.43333334, 0.1), (0.43333334, 0.11666667), (0.425, 0.11666667), (0.425, 0.1), (0.425, 0.1), (0.425, 0.11666667), (0.41666666, 0.11666667), (0.41666666, 0.1), (0.41666666, 0.1), (0.41666666, 0.11666667), (0.40833333, 0.11666667), (0.40833333, 0.1), (0.40833333, 0.1), (0.40833333, 0.11666667), (0.4, 0.11666667), (0.4, 0.1), (0.4, 0.1), (0.4, 0.11666667), (0.39166668, 0.11666667), (0.39166668, 0.1), (0.39166668, 0.1), (0.39166668, 0.11666667), (0.38333333, 0.11666667), (0.38333333, 0.1), (0.38333333, 0.1), (0.38333333, 0.11666667), (0.375, 0.11666667), (0.375, 0.1), (0.375, 0.1), (0.375, 0.11666667), (0.36666667, 0.11666667), (0.36666667, 0.1), (0.36666667, 0.1), (0.36666667, 0.11666667), (0.35833332, 0.11666667), (0.35833332, 0.1), (0.35833332, 0.1), (0.35833332, 0.11666667), (0.35, 0.11666667), (0.35, 0.1), (0.35, 0.1), (0.35, 0.11666667), (0.34166667, 0.11666667), (0.34166667, 0.1), (0.34166667, 0.1), (0.34166667, 0.11666667), (0.33333334, 0.11666667), (0.33333334, 0.1), (0.33333334, 0.1), (0.33333334, 0.11666667), (0.325, 0.11666667), (0.325, 0.1), (0.325, 0.1), (0.325, 0.11666667), (0.31666666, 0.11666667), (0.31666666, 0.1), (0.31666666, 0.1), (0.31666666, 0.11666667), (0.30833334, 0.11666667), (0.30833334, 0.1), (0.30833334, 0.1), (0.30833334, 0.11666667), (0.3, 0.11666667), (0.3, 0.1), (0.3, 0.1), (0.3, 0.11666667), (0.29166666, 0.11666667), (0.29166666, 0.1), (0.29166666, 0.1), (0.29166666, 0.11666667), (0.28333333, 0.11666667), (0.28333333, 0.1), (0.28333333, 0.1), (0.28333333, 0.11666667), (0.275, 0.11666667), (0.275, 0.1), (0.275, 0.1), (0.275, 0.11666667), (0.26666668, 0.11666667), (0.26666668, 0.1), (0.26666668, 0.1), (0.26666668, 0.11666667), (0.25833333, 0.11666667), (0.25833333, 0.1), (0.25833333, 0.1), (0.25833333, 0.11666667), (0.25, 0.11666667), (0.25, 0.1), (0.25, 0.1), (0.25, 0.11666667), (0.24166666, 0.11666667), (0.24166666, 0.1), (0.24166666, 0.1), (0.24166666, 0.11666667), (0.23333333, 0.11666667), (0.23333333, 0.1), (0.23333333, 0.1), (0.23333333, 0.11666667), (0.225, 0.11666667), (0.225, 0.1), (0.225, 0.1), (0.225, 0.11666667), (0.21666667, 0.11666667), (0.21666667, 0.1), (0.21666667, 0.1), (0.21666667, 0.11666667), (0.20833333, 0.11666667), (0.20833333, 0.1), (0.20833333, 0.1), (0.20833333, 0.11666667), (0.2, 0.11666667), (0.2, 0.1), (0.2, 0.1), (0.2, 0.11666667), (0.19166666, 0.11666667), (0.19166666, 0.1), (0.19166666, 0.1), (0.19166666, 0.11666667), (0.18333334, 0.11666667), (0.18333334, 0.1), (0.18333334, 0.1), (0.18333334, 0.11666667), (0.175, 0.11666667), (0.175, 0.1), (0.175, 0.1), (0.175, 0.11666667), (0.16666667, 0.11666667), (0.16666667, 0.1), (0.16666667, 0.1), (0.16666667, 0.11666667), (0.15833333, 0.11666667), (0.15833333, 0.1), (0.15833333, 0.1), (0.15833333, 0.11666667), (0.15, 0.11666667), (0.15, 0.1), (0.15, 0.1), (0.15, 0.11666667), (0.14166667, 0.11666667), (0.14166667, 0.1), (0.14166667, 0.1), (0.14166667, 0.11666667), (0.13333334, 0.11666667), (0.13333334, 0.1), (0.13333334, 0.1), (0.13333334, 0.11666667), (0.125, 0.11666667), (0.125, 0.1), (0.125, 0.1), (0.125, 0.11666667), (0.11666667, 0.11666667), (0.11666667, 0.1), (0.11666667, 0.1), (0.11666667, 0.11666667), (0.108333334, 0.11666667), (0.108333334, 0.1), (0.108333334, 0.1), (0.108333334, 0.11666667), (0.1, 0.11666667), (0.1, 0.1), (0.1, 0.1), (0.1, 0.11666667), (0.09166667, 0.11666667), (0.09166667, 0.1), (0.09166667, 0.1), (0.09166667, 0.11666667), (0.083333336, 0.11666667), (0.083333336, 0.1), (0.083333336, 0.1), (0.083333336, 0.11666667), (0.075, 0.11666667), (0.075, 0.1), (0.075, 0.1), (0.075, 0.11666667), (0.06666667, 0.11666667), (0.06666667, 0.1), (0.06666667, 0.1), (0.06666667, 0.11666667), (0.058333334, 0.11666667), (0.058333334, 0.1), (0.058333334, 0.1), (0.058333334, 0.11666667), (0.05, 0.11666667), (0.05, 0.1), (0.05, 0.1), (0.05, 0.11666667), (0.041666668, 0.11666667), (0.041666668, 0.1), (0.041666668, 0.1), (0.041666668, 0.11666667), (0.033333335, 0.11666667), (0.033333335, 0.1), (0.033333335, 0.1), (0.033333335, 0.11666667), (0.025, 0.11666667), (0.025, 0.1), (0.025, 0.1), (0.025, 0.11666667), (0.016666668, 0.11666667), (0.016666668, 0.1), (0.016666668, 0.1), (0.016666668, 0.11666667), (0.008333334, 0.11666667), (0.008333334, 0.1), (0.008333334, 0.1), (0.008333334, 0.11666667), (0, 0.11666667), (0, 0.1), (1, 0.11666667), (1, 0.13333334), (0.9916667, 0.13333334), (0.9916667, 0.11666667), (0.9916667, 0.11666667), (0.9916667, 0.13333334), (0.98333335, 0.13333334), (0.98333335, 0.11666667), (0.98333335, 0.11666667), (0.98333335, 0.13333334), (0.975, 0.13333334), (0.975, 0.11666667), (0.975, 0.11666667), (0.975, 0.13333334), (0.96666664, 0.13333334), (0.96666664, 0.11666667), (0.96666664, 0.11666667), (0.96666664, 0.13333334), (0.9583333, 0.13333334), (0.9583333, 0.11666667), (0.9583333, 0.11666667), (0.9583333, 0.13333334), (0.95, 0.13333334), (0.95, 0.11666667), (0.95, 0.11666667), (0.95, 0.13333334), (0.94166666, 0.13333334), (0.94166666, 0.11666667), (0.94166666, 0.11666667), (0.94166666, 0.13333334), (0.93333334, 0.13333334), (0.93333334, 0.11666667), (0.93333334, 0.11666667), (0.93333334, 0.13333334), (0.925, 0.13333334), (0.925, 0.11666667), (0.925, 0.11666667), (0.925, 0.13333334), (0.9166667, 0.13333334), (0.9166667, 0.11666667), (0.9166667, 0.11666667), (0.9166667, 0.13333334), (0.90833336, 0.13333334), (0.90833336, 0.11666667), (0.90833336, 0.11666667), (0.90833336, 0.13333334), (0.9, 0.13333334), (0.9, 0.11666667), (0.9, 0.11666667), (0.9, 0.13333334), (0.89166665, 0.13333334), (0.89166665, 0.11666667), (0.89166665, 0.11666667), (0.89166665, 0.13333334), (0.8833333, 0.13333334), (0.8833333, 0.11666667), (0.8833333, 0.11666667), (0.8833333, 0.13333334), (0.875, 0.13333334), (0.875, 0.11666667), (0.875, 0.11666667), (0.875, 0.13333334), (0.8666667, 0.13333334), (0.8666667, 0.11666667), (0.8666667, 0.11666667), (0.8666667, 0.13333334), (0.85833335, 0.13333334), (0.85833335, 0.11666667), (0.85833335, 0.11666667), (0.85833335, 0.13333334), (0.85, 0.13333334), (0.85, 0.11666667), (0.85, 0.11666667), (0.85, 0.13333334), (0.84166664, 0.13333334), (0.84166664, 0.11666667), (0.84166664, 0.11666667), (0.84166664, 0.13333334), (0.8333333, 0.13333334), (0.8333333, 0.11666667), (0.8333333, 0.11666667), (0.8333333, 0.13333334), (0.825, 0.13333334), (0.825, 0.11666667), (0.825, 0.11666667), (0.825, 0.13333334), (0.81666666, 0.13333334), (0.81666666, 0.11666667), (0.81666666, 0.11666667), (0.81666666, 0.13333334), (0.80833334, 0.13333334), (0.80833334, 0.11666667), (0.80833334, 0.11666667), (0.80833334, 0.13333334), (0.8, 0.13333334), (0.8, 0.11666667), (0.8, 0.11666667), (0.8, 0.13333334), (0.7916667, 0.13333334), (0.7916667, 0.11666667), (0.7916667, 0.11666667), (0.7916667, 0.13333334), (0.78333336, 0.13333334), (0.78333336, 0.11666667), (0.78333336, 0.11666667), (0.78333336, 0.13333334), (0.775, 0.13333334), (0.775, 0.11666667), (0.775, 0.11666667), (0.775, 0.13333334), (0.76666665, 0.13333334), (0.76666665, 0.11666667), (0.76666665, 0.11666667), (0.76666665, 0.13333334), (0.7583333, 0.13333334), (0.7583333, 0.11666667), (0.7583333, 0.11666667), (0.7583333, 0.13333334), (0.75, 0.13333334), (0.75, 0.11666667), (0.75, 0.11666667), (0.75, 0.13333334), (0.7416667, 0.13333334), (0.7416667, 0.11666667), (0.7416667, 0.11666667), (0.7416667, 0.13333334), (0.73333335, 0.13333334), (0.73333335, 0.11666667), (0.73333335, 0.11666667), (0.73333335, 0.13333334), (0.725, 0.13333334), (0.725, 0.11666667), (0.725, 0.11666667), (0.725, 0.13333334), (0.71666664, 0.13333334), (0.71666664, 0.11666667), (0.71666664, 0.11666667), (0.71666664, 0.13333334), (0.7083333, 0.13333334), (0.7083333, 0.11666667), (0.7083333, 0.11666667), (0.7083333, 0.13333334), (0.7, 0.13333334), (0.7, 0.11666667), (0.7, 0.11666667), (0.7, 0.13333334), (0.69166666, 0.13333334), (0.69166666, 0.11666667), (0.69166666, 0.11666667), (0.69166666, 0.13333334), (0.68333334, 0.13333334), (0.68333334, 0.11666667), (0.68333334, 0.11666667), (0.68333334, 0.13333334), (0.675, 0.13333334), (0.675, 0.11666667), (0.675, 0.11666667), (0.675, 0.13333334), (0.6666667, 0.13333334), (0.6666667, 0.11666667), (0.6666667, 0.11666667), (0.6666667, 0.13333334), (0.65833336, 0.13333334), (0.65833336, 0.11666667), (0.65833336, 0.11666667), (0.65833336, 0.13333334), (0.65, 0.13333334), (0.65, 0.11666667), (0.65, 0.11666667), (0.65, 0.13333334), (0.64166665, 0.13333334), (0.64166665, 0.11666667), (0.64166665, 0.11666667), (0.64166665, 0.13333334), (0.6333333, 0.13333334), (0.6333333, 0.11666667), (0.6333333, 0.11666667), (0.6333333, 0.13333334), (0.625, 0.13333334), (0.625, 0.11666667), (0.625, 0.11666667), (0.625, 0.13333334), (0.6166667, 0.13333334), (0.6166667, 0.11666667), (0.6166667, 0.11666667), (0.6166667, 0.13333334), (0.60833335, 0.13333334), (0.60833335, 0.11666667), (0.60833335, 0.11666667), (0.60833335, 0.13333334), (0.6, 0.13333334), (0.6, 0.11666667), (0.6, 0.11666667), (0.6, 0.13333334), (0.59166664, 0.13333334), (0.59166664, 0.11666667), (0.59166664, 0.11666667), (0.59166664, 0.13333334), (0.5833333, 0.13333334), (0.5833333, 0.11666667), (0.5833333, 0.11666667), (0.5833333, 0.13333334), (0.575, 0.13333334), (0.575, 0.11666667), (0.575, 0.11666667), (0.575, 0.13333334), (0.56666666, 0.13333334), (0.56666666, 0.11666667), (0.56666666, 0.11666667), (0.56666666, 0.13333334), (0.55833334, 0.13333334), (0.55833334, 0.11666667), (0.55833334, 0.11666667), (0.55833334, 0.13333334), (0.55, 0.13333334), (0.55, 0.11666667), (0.55, 0.11666667), (0.55, 0.13333334), (0.5416667, 0.13333334), (0.5416667, 0.11666667), (0.5416667, 0.11666667), (0.5416667, 0.13333334), (0.53333336, 0.13333334), (0.53333336, 0.11666667), (0.53333336, 0.11666667), (0.53333336, 0.13333334), (0.525, 0.13333334), (0.525, 0.11666667), (0.525, 0.11666667), (0.525, 0.13333334), (0.51666665, 0.13333334), (0.51666665, 0.11666667), (0.51666665, 0.11666667), (0.51666665, 0.13333334), (0.5083333, 0.13333334), (0.5083333, 0.11666667), (0.5083333, 0.11666667), (0.5083333, 0.13333334), (0.5, 0.13333334), (0.5, 0.11666667), (0.5, 0.11666667), (0.5, 0.13333334), (0.49166667, 0.13333334), (0.49166667, 0.11666667), (0.49166667, 0.11666667), (0.49166667, 0.13333334), (0.48333332, 0.13333334), (0.48333332, 0.11666667), (0.48333332, 0.11666667), (0.48333332, 0.13333334), (0.475, 0.13333334), (0.475, 0.11666667), (0.475, 0.11666667), (0.475, 0.13333334), (0.46666667, 0.13333334), (0.46666667, 0.11666667), (0.46666667, 0.11666667), (0.46666667, 0.13333334), (0.45833334, 0.13333334), (0.45833334, 0.11666667), (0.45833334, 0.11666667), (0.45833334, 0.13333334), (0.45, 0.13333334), (0.45, 0.11666667), (0.45, 0.11666667), (0.45, 0.13333334), (0.44166666, 0.13333334), (0.44166666, 0.11666667), (0.44166666, 0.11666667), (0.44166666, 0.13333334), (0.43333334, 0.13333334), (0.43333334, 0.11666667), (0.43333334, 0.11666667), (0.43333334, 0.13333334), (0.425, 0.13333334), (0.425, 0.11666667), (0.425, 0.11666667), (0.425, 0.13333334), (0.41666666, 0.13333334), (0.41666666, 0.11666667), (0.41666666, 0.11666667), (0.41666666, 0.13333334), (0.40833333, 0.13333334), (0.40833333, 0.11666667), (0.40833333, 0.11666667), (0.40833333, 0.13333334), (0.4, 0.13333334), (0.4, 0.11666667), (0.4, 0.11666667), (0.4, 0.13333334), (0.39166668, 0.13333334), (0.39166668, 0.11666667), (0.39166668, 0.11666667), (0.39166668, 0.13333334), (0.38333333, 0.13333334), (0.38333333, 0.11666667), (0.38333333, 0.11666667), (0.38333333, 0.13333334), (0.375, 0.13333334), (0.375, 0.11666667), (0.375, 0.11666667), (0.375, 0.13333334), (0.36666667, 0.13333334), (0.36666667, 0.11666667), (0.36666667, 0.11666667), (0.36666667, 0.13333334), (0.35833332, 0.13333334), (0.35833332, 0.11666667), (0.35833332, 0.11666667), (0.35833332, 0.13333334), (0.35, 0.13333334), (0.35, 0.11666667), (0.35, 0.11666667), (0.35, 0.13333334), (0.34166667, 0.13333334), (0.34166667, 0.11666667), (0.34166667, 0.11666667), (0.34166667, 0.13333334), (0.33333334, 0.13333334), (0.33333334, 0.11666667), (0.33333334, 0.11666667), (0.33333334, 0.13333334), (0.325, 0.13333334), (0.325, 0.11666667), (0.325, 0.11666667), (0.325, 0.13333334), (0.31666666, 0.13333334), (0.31666666, 0.11666667), (0.31666666, 0.11666667), (0.31666666, 0.13333334), (0.30833334, 0.13333334), (0.30833334, 0.11666667), (0.30833334, 0.11666667), (0.30833334, 0.13333334), (0.3, 0.13333334), (0.3, 0.11666667), (0.3, 0.11666667), (0.3, 0.13333334), (0.29166666, 0.13333334), (0.29166666, 0.11666667), (0.29166666, 0.11666667), (0.29166666, 0.13333334), (0.28333333, 0.13333334), (0.28333333, 0.11666667), (0.28333333, 0.11666667), (0.28333333, 0.13333334), (0.275, 0.13333334), (0.275, 0.11666667), (0.275, 0.11666667), (0.275, 0.13333334), (0.26666668, 0.13333334), (0.26666668, 0.11666667), (0.26666668, 0.11666667), (0.26666668, 0.13333334), (0.25833333, 0.13333334), (0.25833333, 0.11666667), (0.25833333, 0.11666667), (0.25833333, 0.13333334), (0.25, 0.13333334), (0.25, 0.11666667), (0.25, 0.11666667), (0.25, 0.13333334), (0.24166666, 0.13333334), (0.24166666, 0.11666667), (0.24166666, 0.11666667), (0.24166666, 0.13333334), (0.23333333, 0.13333334), (0.23333333, 0.11666667), (0.23333333, 0.11666667), (0.23333333, 0.13333334), (0.225, 0.13333334), (0.225, 0.11666667), (0.225, 0.11666667), (0.225, 0.13333334), (0.21666667, 0.13333334), (0.21666667, 0.11666667), (0.21666667, 0.11666667), (0.21666667, 0.13333334), (0.20833333, 0.13333334), (0.20833333, 0.11666667), (0.20833333, 0.11666667), (0.20833333, 0.13333334), (0.2, 0.13333334), (0.2, 0.11666667), (0.2, 0.11666667), (0.2, 0.13333334), (0.19166666, 0.13333334), (0.19166666, 0.11666667), (0.19166666, 0.11666667), (0.19166666, 0.13333334), (0.18333334, 0.13333334), (0.18333334, 0.11666667), (0.18333334, 0.11666667), (0.18333334, 0.13333334), (0.175, 0.13333334), (0.175, 0.11666667), (0.175, 0.11666667), (0.175, 0.13333334), (0.16666667, 0.13333334), (0.16666667, 0.11666667), (0.16666667, 0.11666667), (0.16666667, 0.13333334), (0.15833333, 0.13333334), (0.15833333, 0.11666667), (0.15833333, 0.11666667), (0.15833333, 0.13333334), (0.15, 0.13333334), (0.15, 0.11666667), (0.15, 0.11666667), (0.15, 0.13333334), (0.14166667, 0.13333334), (0.14166667, 0.11666667), (0.14166667, 0.11666667), (0.14166667, 0.13333334), (0.13333334, 0.13333334), (0.13333334, 0.11666667), (0.13333334, 0.11666667), (0.13333334, 0.13333334), (0.125, 0.13333334), (0.125, 0.11666667), (0.125, 0.11666667), (0.125, 0.13333334), (0.11666667, 0.13333334), (0.11666667, 0.11666667), (0.11666667, 0.11666667), (0.11666667, 0.13333334), (0.108333334, 0.13333334), (0.108333334, 0.11666667), (0.108333334, 0.11666667), (0.108333334, 0.13333334), (0.1, 0.13333334), (0.1, 0.11666667), (0.1, 0.11666667), (0.1, 0.13333334), (0.09166667, 0.13333334), (0.09166667, 0.11666667), (0.09166667, 0.11666667), (0.09166667, 0.13333334), (0.083333336, 0.13333334), (0.083333336, 0.11666667), (0.083333336, 0.11666667), (0.083333336, 0.13333334), (0.075, 0.13333334), (0.075, 0.11666667), (0.075, 0.11666667), (0.075, 0.13333334), (0.06666667, 0.13333334), (0.06666667, 0.11666667), (0.06666667, 0.11666667), (0.06666667, 0.13333334), (0.058333334, 0.13333334), (0.058333334, 0.11666667), (0.058333334, 0.11666667), (0.058333334, 0.13333334), (0.05, 0.13333334), (0.05, 0.11666667), (0.05, 0.11666667), (0.05, 0.13333334), (0.041666668, 0.13333334), (0.041666668, 0.11666667), (0.041666668, 0.11666667), (0.041666668, 0.13333334), (0.033333335, 0.13333334), (0.033333335, 0.11666667), (0.033333335, 0.11666667), (0.033333335, 0.13333334), (0.025, 0.13333334), (0.025, 0.11666667), (0.025, 0.11666667), (0.025, 0.13333334), (0.016666668, 0.13333334), (0.016666668, 0.11666667), (0.016666668, 0.11666667), (0.016666668, 0.13333334), (0.008333334, 0.13333334), (0.008333334, 0.11666667), (0.008333334, 0.11666667), (0.008333334, 0.13333334), (0, 0.13333334), (0, 0.11666667), (1, 0.13333334), (1, 0.15), (0.9916667, 0.15), (0.9916667, 0.13333334), (0.9916667, 0.13333334), (0.9916667, 0.15), (0.98333335, 0.15), (0.98333335, 0.13333334), (0.98333335, 0.13333334), (0.98333335, 0.15), (0.975, 0.15), (0.975, 0.13333334), (0.975, 0.13333334), (0.975, 0.15), (0.96666664, 0.15), (0.96666664, 0.13333334), (0.96666664, 0.13333334), (0.96666664, 0.15), (0.9583333, 0.15), (0.9583333, 0.13333334), (0.9583333, 0.13333334), (0.9583333, 0.15), (0.95, 0.15), (0.95, 0.13333334), (0.95, 0.13333334), (0.95, 0.15), (0.94166666, 0.15), (0.94166666, 0.13333334), (0.94166666, 0.13333334), (0.94166666, 0.15), (0.93333334, 0.15), (0.93333334, 0.13333334), (0.93333334, 0.13333334), (0.93333334, 0.15), (0.925, 0.15), (0.925, 0.13333334), (0.925, 0.13333334), (0.925, 0.15), (0.9166667, 0.15), (0.9166667, 0.13333334), (0.9166667, 0.13333334), (0.9166667, 0.15), (0.90833336, 0.15), (0.90833336, 0.13333334), (0.90833336, 0.13333334), (0.90833336, 0.15), (0.9, 0.15), (0.9, 0.13333334), (0.9, 0.13333334), (0.9, 0.15), (0.89166665, 0.15), (0.89166665, 0.13333334), (0.89166665, 0.13333334), (0.89166665, 0.15), (0.8833333, 0.15), (0.8833333, 0.13333334), (0.8833333, 0.13333334), (0.8833333, 0.15), (0.875, 0.15), (0.875, 0.13333334), (0.875, 0.13333334), (0.875, 0.15), (0.8666667, 0.15), (0.8666667, 0.13333334), (0.8666667, 0.13333334), (0.8666667, 0.15), (0.85833335, 0.15), (0.85833335, 0.13333334), (0.85833335, 0.13333334), (0.85833335, 0.15), (0.85, 0.15), (0.85, 0.13333334), (0.85, 0.13333334), (0.85, 0.15), (0.84166664, 0.15), (0.84166664, 0.13333334), (0.84166664, 0.13333334), (0.84166664, 0.15), (0.8333333, 0.15), (0.8333333, 0.13333334), (0.8333333, 0.13333334), (0.8333333, 0.15), (0.825, 0.15), (0.825, 0.13333334), (0.825, 0.13333334), (0.825, 0.15), (0.81666666, 0.15), (0.81666666, 0.13333334), (0.81666666, 0.13333334), (0.81666666, 0.15), (0.80833334, 0.15), (0.80833334, 0.13333334), (0.80833334, 0.13333334), (0.80833334, 0.15), (0.8, 0.15), (0.8, 0.13333334), (0.8, 0.13333334), (0.8, 0.15), (0.7916667, 0.15), (0.7916667, 0.13333334), (0.7916667, 0.13333334), (0.7916667, 0.15), (0.78333336, 0.15), (0.78333336, 0.13333334), (0.78333336, 0.13333334), (0.78333336, 0.15), (0.775, 0.15), (0.775, 0.13333334), (0.775, 0.13333334), (0.775, 0.15), (0.76666665, 0.15), (0.76666665, 0.13333334), (0.76666665, 0.13333334), (0.76666665, 0.15), (0.7583333, 0.15), (0.7583333, 0.13333334), (0.7583333, 0.13333334), (0.7583333, 0.15), (0.75, 0.15), (0.75, 0.13333334), (0.75, 0.13333334), (0.75, 0.15), (0.7416667, 0.15), (0.7416667, 0.13333334), (0.7416667, 0.13333334), (0.7416667, 0.15), (0.73333335, 0.15), (0.73333335, 0.13333334), (0.73333335, 0.13333334), (0.73333335, 0.15), (0.725, 0.15), (0.725, 0.13333334), (0.725, 0.13333334), (0.725, 0.15), (0.71666664, 0.15), (0.71666664, 0.13333334), (0.71666664, 0.13333334), (0.71666664, 0.15), (0.7083333, 0.15), (0.7083333, 0.13333334), (0.7083333, 0.13333334), (0.7083333, 0.15), (0.7, 0.15), (0.7, 0.13333334), (0.7, 0.13333334), (0.7, 0.15), (0.69166666, 0.15), (0.69166666, 0.13333334), (0.69166666, 0.13333334), (0.69166666, 0.15), (0.68333334, 0.15), (0.68333334, 0.13333334), (0.68333334, 0.13333334), (0.68333334, 0.15), (0.675, 0.15), (0.675, 0.13333334), (0.675, 0.13333334), (0.675, 0.15), (0.6666667, 0.15), (0.6666667, 0.13333334), (0.6666667, 0.13333334), (0.6666667, 0.15), (0.65833336, 0.15), (0.65833336, 0.13333334), (0.65833336, 0.13333334), (0.65833336, 0.15), (0.65, 0.15), (0.65, 0.13333334), (0.65, 0.13333334), (0.65, 0.15), (0.64166665, 0.15), (0.64166665, 0.13333334), (0.64166665, 0.13333334), (0.64166665, 0.15), (0.6333333, 0.15), (0.6333333, 0.13333334), (0.6333333, 0.13333334), (0.6333333, 0.15), (0.625, 0.15), (0.625, 0.13333334), (0.625, 0.13333334), (0.625, 0.15), (0.6166667, 0.15), (0.6166667, 0.13333334), (0.6166667, 0.13333334), (0.6166667, 0.15), (0.60833335, 0.15), (0.60833335, 0.13333334), (0.60833335, 0.13333334), (0.60833335, 0.15), (0.6, 0.15), (0.6, 0.13333334), (0.6, 0.13333334), (0.6, 0.15), (0.59166664, 0.15), (0.59166664, 0.13333334), (0.59166664, 0.13333334), (0.59166664, 0.15), (0.5833333, 0.15), (0.5833333, 0.13333334), (0.5833333, 0.13333334), (0.5833333, 0.15), (0.575, 0.15), (0.575, 0.13333334), (0.575, 0.13333334), (0.575, 0.15), (0.56666666, 0.15), (0.56666666, 0.13333334), (0.56666666, 0.13333334), (0.56666666, 0.15), (0.55833334, 0.15), (0.55833334, 0.13333334), (0.55833334, 0.13333334), (0.55833334, 0.15), (0.55, 0.15), (0.55, 0.13333334), (0.55, 0.13333334), (0.55, 0.15), (0.5416667, 0.15), (0.5416667, 0.13333334), (0.5416667, 0.13333334), (0.5416667, 0.15), (0.53333336, 0.15), (0.53333336, 0.13333334), (0.53333336, 0.13333334), (0.53333336, 0.15), (0.525, 0.15), (0.525, 0.13333334), (0.525, 0.13333334), (0.525, 0.15), (0.51666665, 0.15), (0.51666665, 0.13333334), (0.51666665, 0.13333334), (0.51666665, 0.15), (0.5083333, 0.15), (0.5083333, 0.13333334), (0.5083333, 0.13333334), (0.5083333, 0.15), (0.5, 0.15), (0.5, 0.13333334), (0.5, 0.13333334), (0.5, 0.15), (0.49166667, 0.15), (0.49166667, 0.13333334), (0.49166667, 0.13333334), (0.49166667, 0.15), (0.48333332, 0.15), (0.48333332, 0.13333334), (0.48333332, 0.13333334), (0.48333332, 0.15), (0.475, 0.15), (0.475, 0.13333334), (0.475, 0.13333334), (0.475, 0.15), (0.46666667, 0.15), (0.46666667, 0.13333334), (0.46666667, 0.13333334), (0.46666667, 0.15), (0.45833334, 0.15), (0.45833334, 0.13333334), (0.45833334, 0.13333334), (0.45833334, 0.15), (0.45, 0.15), (0.45, 0.13333334), (0.45, 0.13333334), (0.45, 0.15), (0.44166666, 0.15), (0.44166666, 0.13333334), (0.44166666, 0.13333334), (0.44166666, 0.15), (0.43333334, 0.15), (0.43333334, 0.13333334), (0.43333334, 0.13333334), (0.43333334, 0.15), (0.425, 0.15), (0.425, 0.13333334), (0.425, 0.13333334), (0.425, 0.15), (0.41666666, 0.15), (0.41666666, 0.13333334), (0.41666666, 0.13333334), (0.41666666, 0.15), (0.40833333, 0.15), (0.40833333, 0.13333334), (0.40833333, 0.13333334), (0.40833333, 0.15), (0.4, 0.15), (0.4, 0.13333334), (0.4, 0.13333334), (0.4, 0.15), (0.39166668, 0.15), (0.39166668, 0.13333334), (0.39166668, 0.13333334), (0.39166668, 0.15), (0.38333333, 0.15), (0.38333333, 0.13333334), (0.38333333, 0.13333334), (0.38333333, 0.15), (0.375, 0.15), (0.375, 0.13333334), (0.375, 0.13333334), (0.375, 0.15), (0.36666667, 0.15), (0.36666667, 0.13333334), (0.36666667, 0.13333334), (0.36666667, 0.15), (0.35833332, 0.15), (0.35833332, 0.13333334), (0.35833332, 0.13333334), (0.35833332, 0.15), (0.35, 0.15), (0.35, 0.13333334), (0.35, 0.13333334), (0.35, 0.15), (0.34166667, 0.15), (0.34166667, 0.13333334), (0.34166667, 0.13333334), (0.34166667, 0.15), (0.33333334, 0.15), (0.33333334, 0.13333334), (0.33333334, 0.13333334), (0.33333334, 0.15), (0.325, 0.15), (0.325, 0.13333334), (0.325, 0.13333334), (0.325, 0.15), (0.31666666, 0.15), (0.31666666, 0.13333334), (0.31666666, 0.13333334), (0.31666666, 0.15), (0.30833334, 0.15), (0.30833334, 0.13333334), (0.30833334, 0.13333334), (0.30833334, 0.15), (0.3, 0.15), (0.3, 0.13333334), (0.3, 0.13333334), (0.3, 0.15), (0.29166666, 0.15), (0.29166666, 0.13333334), (0.29166666, 0.13333334), (0.29166666, 0.15), (0.28333333, 0.15), (0.28333333, 0.13333334), (0.28333333, 0.13333334), (0.28333333, 0.15), (0.275, 0.15), (0.275, 0.13333334), (0.275, 0.13333334), (0.275, 0.15), (0.26666668, 0.15), (0.26666668, 0.13333334), (0.26666668, 0.13333334), (0.26666668, 0.15), (0.25833333, 0.15), (0.25833333, 0.13333334), (0.25833333, 0.13333334), (0.25833333, 0.15), (0.25, 0.15), (0.25, 0.13333334), (0.25, 0.13333334), (0.25, 0.15), (0.24166666, 0.15), (0.24166666, 0.13333334), (0.24166666, 0.13333334), (0.24166666, 0.15), (0.23333333, 0.15), (0.23333333, 0.13333334), (0.23333333, 0.13333334), (0.23333333, 0.15), (0.225, 0.15), (0.225, 0.13333334), (0.225, 0.13333334), (0.225, 0.15), (0.21666667, 0.15), (0.21666667, 0.13333334), (0.21666667, 0.13333334), (0.21666667, 0.15), (0.20833333, 0.15), (0.20833333, 0.13333334), (0.20833333, 0.13333334), (0.20833333, 0.15), (0.2, 0.15), (0.2, 0.13333334), (0.2, 0.13333334), (0.2, 0.15), (0.19166666, 0.15), (0.19166666, 0.13333334), (0.19166666, 0.13333334), (0.19166666, 0.15), (0.18333334, 0.15), (0.18333334, 0.13333334), (0.18333334, 0.13333334), (0.18333334, 0.15), (0.175, 0.15), (0.175, 0.13333334), (0.175, 0.13333334), (0.175, 0.15), (0.16666667, 0.15), (0.16666667, 0.13333334), (0.16666667, 0.13333334), (0.16666667, 0.15), (0.15833333, 0.15), (0.15833333, 0.13333334), (0.15833333, 0.13333334), (0.15833333, 0.15), (0.15, 0.15), (0.15, 0.13333334), (0.15, 0.13333334), (0.15, 0.15), (0.14166667, 0.15), (0.14166667, 0.13333334), (0.14166667, 0.13333334), (0.14166667, 0.15), (0.13333334, 0.15), (0.13333334, 0.13333334), (0.13333334, 0.13333334), (0.13333334, 0.15), (0.125, 0.15), (0.125, 0.13333334), (0.125, 0.13333334), (0.125, 0.15), (0.11666667, 0.15), (0.11666667, 0.13333334), (0.11666667, 0.13333334), (0.11666667, 0.15), (0.108333334, 0.15), (0.108333334, 0.13333334), (0.108333334, 0.13333334), (0.108333334, 0.15), (0.1, 0.15), (0.1, 0.13333334), (0.1, 0.13333334), (0.1, 0.15), (0.09166667, 0.15), (0.09166667, 0.13333334), (0.09166667, 0.13333334), (0.09166667, 0.15), (0.083333336, 0.15), (0.083333336, 0.13333334), (0.083333336, 0.13333334), (0.083333336, 0.15), (0.075, 0.15), (0.075, 0.13333334), (0.075, 0.13333334), (0.075, 0.15), (0.06666667, 0.15), (0.06666667, 0.13333334), (0.06666667, 0.13333334), (0.06666667, 0.15), (0.058333334, 0.15), (0.058333334, 0.13333334), (0.058333334, 0.13333334), (0.058333334, 0.15), (0.05, 0.15), (0.05, 0.13333334), (0.05, 0.13333334), (0.05, 0.15), (0.041666668, 0.15), (0.041666668, 0.13333334), (0.041666668, 0.13333334), (0.041666668, 0.15), (0.033333335, 0.15), (0.033333335, 0.13333334), (0.033333335, 0.13333334), (0.033333335, 0.15), (0.025, 0.15), (0.025, 0.13333334), (0.025, 0.13333334), (0.025, 0.15), (0.016666668, 0.15), (0.016666668, 0.13333334), (0.016666668, 0.13333334), (0.016666668, 0.15), (0.008333334, 0.15), (0.008333334, 0.13333334), (0.008333334, 0.13333334), (0.008333334, 0.15), (0, 0.15), (0, 0.13333334), (1, 0.15), (1, 0.16666667), (0.9916667, 0.16666667), (0.9916667, 0.15), (0.9916667, 0.15), (0.9916667, 0.16666667), (0.98333335, 0.16666667), (0.98333335, 0.15), (0.98333335, 0.15), (0.98333335, 0.16666667), (0.975, 0.16666667), (0.975, 0.15), (0.975, 0.15), (0.975, 0.16666667), (0.96666664, 0.16666667), (0.96666664, 0.15), (0.96666664, 0.15), (0.96666664, 0.16666667), (0.9583333, 0.16666667), (0.9583333, 0.15), (0.9583333, 0.15), (0.9583333, 0.16666667), (0.95, 0.16666667), (0.95, 0.15), (0.95, 0.15), (0.95, 0.16666667), (0.94166666, 0.16666667), (0.94166666, 0.15), (0.94166666, 0.15), (0.94166666, 0.16666667), (0.93333334, 0.16666667), (0.93333334, 0.15), (0.93333334, 0.15), (0.93333334, 0.16666667), (0.925, 0.16666667), (0.925, 0.15), (0.925, 0.15), (0.925, 0.16666667), (0.9166667, 0.16666667), (0.9166667, 0.15), (0.9166667, 0.15), (0.9166667, 0.16666667), (0.90833336, 0.16666667), (0.90833336, 0.15), (0.90833336, 0.15), (0.90833336, 0.16666667), (0.9, 0.16666667), (0.9, 0.15), (0.9, 0.15), (0.9, 0.16666667), (0.89166665, 0.16666667), (0.89166665, 0.15), (0.89166665, 0.15), (0.89166665, 0.16666667), (0.8833333, 0.16666667), (0.8833333, 0.15), (0.8833333, 0.15), (0.8833333, 0.16666667), (0.875, 0.16666667), (0.875, 0.15), (0.875, 0.15), (0.875, 0.16666667), (0.8666667, 0.16666667), (0.8666667, 0.15), (0.8666667, 0.15), (0.8666667, 0.16666667), (0.85833335, 0.16666667), (0.85833335, 0.15), (0.85833335, 0.15), (0.85833335, 0.16666667), (0.85, 0.16666667), (0.85, 0.15), (0.85, 0.15), (0.85, 0.16666667), (0.84166664, 0.16666667), (0.84166664, 0.15), (0.84166664, 0.15), (0.84166664, 0.16666667), (0.8333333, 0.16666667), (0.8333333, 0.15), (0.8333333, 0.15), (0.8333333, 0.16666667), (0.825, 0.16666667), (0.825, 0.15), (0.825, 0.15), (0.825, 0.16666667), (0.81666666, 0.16666667), (0.81666666, 0.15), (0.81666666, 0.15), (0.81666666, 0.16666667), (0.80833334, 0.16666667), (0.80833334, 0.15), (0.80833334, 0.15), (0.80833334, 0.16666667), (0.8, 0.16666667), (0.8, 0.15), (0.8, 0.15), (0.8, 0.16666667), (0.7916667, 0.16666667), (0.7916667, 0.15), (0.7916667, 0.15), (0.7916667, 0.16666667), (0.78333336, 0.16666667), (0.78333336, 0.15), (0.78333336, 0.15), (0.78333336, 0.16666667), (0.775, 0.16666667), (0.775, 0.15), (0.775, 0.15), (0.775, 0.16666667), (0.76666665, 0.16666667), (0.76666665, 0.15), (0.76666665, 0.15), (0.76666665, 0.16666667), (0.7583333, 0.16666667), (0.7583333, 0.15), (0.7583333, 0.15), (0.7583333, 0.16666667), (0.75, 0.16666667), (0.75, 0.15), (0.75, 0.15), (0.75, 0.16666667), (0.7416667, 0.16666667), (0.7416667, 0.15), (0.7416667, 0.15), (0.7416667, 0.16666667), (0.73333335, 0.16666667), (0.73333335, 0.15), (0.73333335, 0.15), (0.73333335, 0.16666667), (0.725, 0.16666667), (0.725, 0.15), (0.725, 0.15), (0.725, 0.16666667), (0.71666664, 0.16666667), (0.71666664, 0.15), (0.71666664, 0.15), (0.71666664, 0.16666667), (0.7083333, 0.16666667), (0.7083333, 0.15), (0.7083333, 0.15), (0.7083333, 0.16666667), (0.7, 0.16666667), (0.7, 0.15), (0.7, 0.15), (0.7, 0.16666667), (0.69166666, 0.16666667), (0.69166666, 0.15), (0.69166666, 0.15), (0.69166666, 0.16666667), (0.68333334, 0.16666667), (0.68333334, 0.15), (0.68333334, 0.15), (0.68333334, 0.16666667), (0.675, 0.16666667), (0.675, 0.15), (0.675, 0.15), (0.675, 0.16666667), (0.6666667, 0.16666667), (0.6666667, 0.15), (0.6666667, 0.15), (0.6666667, 0.16666667), (0.65833336, 0.16666667), (0.65833336, 0.15), (0.65833336, 0.15), (0.65833336, 0.16666667), (0.65, 0.16666667), (0.65, 0.15), (0.65, 0.15), (0.65, 0.16666667), (0.64166665, 0.16666667), (0.64166665, 0.15), (0.64166665, 0.15), (0.64166665, 0.16666667), (0.6333333, 0.16666667), (0.6333333, 0.15), (0.6333333, 0.15), (0.6333333, 0.16666667), (0.625, 0.16666667), (0.625, 0.15), (0.625, 0.15), (0.625, 0.16666667), (0.6166667, 0.16666667), (0.6166667, 0.15), (0.6166667, 0.15), (0.6166667, 0.16666667), (0.60833335, 0.16666667), (0.60833335, 0.15), (0.60833335, 0.15), (0.60833335, 0.16666667), (0.6, 0.16666667), (0.6, 0.15), (0.6, 0.15), (0.6, 0.16666667), (0.59166664, 0.16666667), (0.59166664, 0.15), (0.59166664, 0.15), (0.59166664, 0.16666667), (0.5833333, 0.16666667), (0.5833333, 0.15), (0.5833333, 0.15), (0.5833333, 0.16666667), (0.575, 0.16666667), (0.575, 0.15), (0.575, 0.15), (0.575, 0.16666667), (0.56666666, 0.16666667), (0.56666666, 0.15), (0.56666666, 0.15), (0.56666666, 0.16666667), (0.55833334, 0.16666667), (0.55833334, 0.15), (0.55833334, 0.15), (0.55833334, 0.16666667), (0.55, 0.16666667), (0.55, 0.15), (0.55, 0.15), (0.55, 0.16666667), (0.5416667, 0.16666667), (0.5416667, 0.15), (0.5416667, 0.15), (0.5416667, 0.16666667), (0.53333336, 0.16666667), (0.53333336, 0.15), (0.53333336, 0.15), (0.53333336, 0.16666667), (0.525, 0.16666667), (0.525, 0.15), (0.525, 0.15), (0.525, 0.16666667), (0.51666665, 0.16666667), (0.51666665, 0.15), (0.51666665, 0.15), (0.51666665, 0.16666667), (0.5083333, 0.16666667), (0.5083333, 0.15), (0.5083333, 0.15), (0.5083333, 0.16666667), (0.5, 0.16666667), (0.5, 0.15), (0.5, 0.15), (0.5, 0.16666667), (0.49166667, 0.16666667), (0.49166667, 0.15), (0.49166667, 0.15), (0.49166667, 0.16666667), (0.48333332, 0.16666667), (0.48333332, 0.15), (0.48333332, 0.15), (0.48333332, 0.16666667), (0.475, 0.16666667), (0.475, 0.15), (0.475, 0.15), (0.475, 0.16666667), (0.46666667, 0.16666667), (0.46666667, 0.15), (0.46666667, 0.15), (0.46666667, 0.16666667), (0.45833334, 0.16666667), (0.45833334, 0.15), (0.45833334, 0.15), (0.45833334, 0.16666667), (0.45, 0.16666667), (0.45, 0.15), (0.45, 0.15), (0.45, 0.16666667), (0.44166666, 0.16666667), (0.44166666, 0.15), (0.44166666, 0.15), (0.44166666, 0.16666667), (0.43333334, 0.16666667), (0.43333334, 0.15), (0.43333334, 0.15), (0.43333334, 0.16666667), (0.425, 0.16666667), (0.425, 0.15), (0.425, 0.15), (0.425, 0.16666667), (0.41666666, 0.16666667), (0.41666666, 0.15), (0.41666666, 0.15), (0.41666666, 0.16666667), (0.40833333, 0.16666667), (0.40833333, 0.15), (0.40833333, 0.15), (0.40833333, 0.16666667), (0.4, 0.16666667), (0.4, 0.15), (0.4, 0.15), (0.4, 0.16666667), (0.39166668, 0.16666667), (0.39166668, 0.15), (0.39166668, 0.15), (0.39166668, 0.16666667), (0.38333333, 0.16666667), (0.38333333, 0.15), (0.38333333, 0.15), (0.38333333, 0.16666667), (0.375, 0.16666667), (0.375, 0.15), (0.375, 0.15), (0.375, 0.16666667), (0.36666667, 0.16666667), (0.36666667, 0.15), (0.36666667, 0.15), (0.36666667, 0.16666667), (0.35833332, 0.16666667), (0.35833332, 0.15), (0.35833332, 0.15), (0.35833332, 0.16666667), (0.35, 0.16666667), (0.35, 0.15), (0.35, 0.15), (0.35, 0.16666667), (0.34166667, 0.16666667), (0.34166667, 0.15), (0.34166667, 0.15), (0.34166667, 0.16666667), (0.33333334, 0.16666667), (0.33333334, 0.15), (0.33333334, 0.15), (0.33333334, 0.16666667), (0.325, 0.16666667), (0.325, 0.15), (0.325, 0.15), (0.325, 0.16666667), (0.31666666, 0.16666667), (0.31666666, 0.15), (0.31666666, 0.15), (0.31666666, 0.16666667), (0.30833334, 0.16666667), (0.30833334, 0.15), (0.30833334, 0.15), (0.30833334, 0.16666667), (0.3, 0.16666667), (0.3, 0.15), (0.3, 0.15), (0.3, 0.16666667), (0.29166666, 0.16666667), (0.29166666, 0.15), (0.29166666, 0.15), (0.29166666, 0.16666667), (0.28333333, 0.16666667), (0.28333333, 0.15), (0.28333333, 0.15), (0.28333333, 0.16666667), (0.275, 0.16666667), (0.275, 0.15), (0.275, 0.15), (0.275, 0.16666667), (0.26666668, 0.16666667), (0.26666668, 0.15), (0.26666668, 0.15), (0.26666668, 0.16666667), (0.25833333, 0.16666667), (0.25833333, 0.15), (0.25833333, 0.15), (0.25833333, 0.16666667), (0.25, 0.16666667), (0.25, 0.15), (0.25, 0.15), (0.25, 0.16666667), (0.24166666, 0.16666667), (0.24166666, 0.15), (0.24166666, 0.15), (0.24166666, 0.16666667), (0.23333333, 0.16666667), (0.23333333, 0.15), (0.23333333, 0.15), (0.23333333, 0.16666667), (0.225, 0.16666667), (0.225, 0.15), (0.225, 0.15), (0.225, 0.16666667), (0.21666667, 0.16666667), (0.21666667, 0.15), (0.21666667, 0.15), (0.21666667, 0.16666667), (0.20833333, 0.16666667), (0.20833333, 0.15), (0.20833333, 0.15), (0.20833333, 0.16666667), (0.2, 0.16666667), (0.2, 0.15), (0.2, 0.15), (0.2, 0.16666667), (0.19166666, 0.16666667), (0.19166666, 0.15), (0.19166666, 0.15), (0.19166666, 0.16666667), (0.18333334, 0.16666667), (0.18333334, 0.15), (0.18333334, 0.15), (0.18333334, 0.16666667), (0.175, 0.16666667), (0.175, 0.15), (0.175, 0.15), (0.175, 0.16666667), (0.16666667, 0.16666667), (0.16666667, 0.15), (0.16666667, 0.15), (0.16666667, 0.16666667), (0.15833333, 0.16666667), (0.15833333, 0.15), (0.15833333, 0.15), (0.15833333, 0.16666667), (0.15, 0.16666667), (0.15, 0.15), (0.15, 0.15), (0.15, 0.16666667), (0.14166667, 0.16666667), (0.14166667, 0.15), (0.14166667, 0.15), (0.14166667, 0.16666667), (0.13333334, 0.16666667), (0.13333334, 0.15), (0.13333334, 0.15), (0.13333334, 0.16666667), (0.125, 0.16666667), (0.125, 0.15), (0.125, 0.15), (0.125, 0.16666667), (0.11666667, 0.16666667), (0.11666667, 0.15), (0.11666667, 0.15), (0.11666667, 0.16666667), (0.108333334, 0.16666667), (0.108333334, 0.15), (0.108333334, 0.15), (0.108333334, 0.16666667), (0.1, 0.16666667), (0.1, 0.15), (0.1, 0.15), (0.1, 0.16666667), (0.09166667, 0.16666667), (0.09166667, 0.15), (0.09166667, 0.15), (0.09166667, 0.16666667), (0.083333336, 0.16666667), (0.083333336, 0.15), (0.083333336, 0.15), (0.083333336, 0.16666667), (0.075, 0.16666667), (0.075, 0.15), (0.075, 0.15), (0.075, 0.16666667), (0.06666667, 0.16666667), (0.06666667, 0.15), (0.06666667, 0.15), (0.06666667, 0.16666667), (0.058333334, 0.16666667), (0.058333334, 0.15), (0.058333334, 0.15), (0.058333334, 0.16666667), (0.05, 0.16666667), (0.05, 0.15), (0.05, 0.15), (0.05, 0.16666667), (0.041666668, 0.16666667), (0.041666668, 0.15), (0.041666668, 0.15), (0.041666668, 0.16666667), (0.033333335, 0.16666667), (0.033333335, 0.15), (0.033333335, 0.15), (0.033333335, 0.16666667), (0.025, 0.16666667), (0.025, 0.15), (0.025, 0.15), (0.025, 0.16666667), (0.016666668, 0.16666667), (0.016666668, 0.15), (0.016666668, 0.15), (0.016666668, 0.16666667), (0.008333334, 0.16666667), (0.008333334, 0.15), (0.008333334, 0.15), (0.008333334, 0.16666667), (0, 0.16666667), (0, 0.15), (1, 0.16666667), (1, 0.18333334), (0.9916667, 0.18333334), (0.9916667, 0.16666667), (0.9916667, 0.16666667), (0.9916667, 0.18333334), (0.98333335, 0.18333334), (0.98333335, 0.16666667), (0.98333335, 0.16666667), (0.98333335, 0.18333334), (0.975, 0.18333334), (0.975, 0.16666667), (0.975, 0.16666667), (0.975, 0.18333334), (0.96666664, 0.18333334), (0.96666664, 0.16666667), (0.96666664, 0.16666667), (0.96666664, 0.18333334), (0.9583333, 0.18333334), (0.9583333, 0.16666667), (0.9583333, 0.16666667), (0.9583333, 0.18333334), (0.95, 0.18333334), (0.95, 0.16666667), (0.95, 0.16666667), (0.95, 0.18333334), (0.94166666, 0.18333334), (0.94166666, 0.16666667), (0.94166666, 0.16666667), (0.94166666, 0.18333334), (0.93333334, 0.18333334), (0.93333334, 0.16666667), (0.93333334, 0.16666667), (0.93333334, 0.18333334), (0.925, 0.18333334), (0.925, 0.16666667), (0.925, 0.16666667), (0.925, 0.18333334), (0.9166667, 0.18333334), (0.9166667, 0.16666667), (0.9166667, 0.16666667), (0.9166667, 0.18333334), (0.90833336, 0.18333334), (0.90833336, 0.16666667), (0.90833336, 0.16666667), (0.90833336, 0.18333334), (0.9, 0.18333334), (0.9, 0.16666667), (0.9, 0.16666667), (0.9, 0.18333334), (0.89166665, 0.18333334), (0.89166665, 0.16666667), (0.89166665, 0.16666667), (0.89166665, 0.18333334), (0.8833333, 0.18333334), (0.8833333, 0.16666667), (0.8833333, 0.16666667), (0.8833333, 0.18333334), (0.875, 0.18333334), (0.875, 0.16666667), (0.875, 0.16666667), (0.875, 0.18333334), (0.8666667, 0.18333334), (0.8666667, 0.16666667), (0.8666667, 0.16666667), (0.8666667, 0.18333334), (0.85833335, 0.18333334), (0.85833335, 0.16666667), (0.85833335, 0.16666667), (0.85833335, 0.18333334), (0.85, 0.18333334), (0.85, 0.16666667), (0.85, 0.16666667), (0.85, 0.18333334), (0.84166664, 0.18333334), (0.84166664, 0.16666667), (0.84166664, 0.16666667), (0.84166664, 0.18333334), (0.8333333, 0.18333334), (0.8333333, 0.16666667), (0.8333333, 0.16666667), (0.8333333, 0.18333334), (0.825, 0.18333334), (0.825, 0.16666667), (0.825, 0.16666667), (0.825, 0.18333334), (0.81666666, 0.18333334), (0.81666666, 0.16666667), (0.81666666, 0.16666667), (0.81666666, 0.18333334), (0.80833334, 0.18333334), (0.80833334, 0.16666667), (0.80833334, 0.16666667), (0.80833334, 0.18333334), (0.8, 0.18333334), (0.8, 0.16666667), (0.8, 0.16666667), (0.8, 0.18333334), (0.7916667, 0.18333334), (0.7916667, 0.16666667), (0.7916667, 0.16666667), (0.7916667, 0.18333334), (0.78333336, 0.18333334), (0.78333336, 0.16666667), (0.78333336, 0.16666667), (0.78333336, 0.18333334), (0.775, 0.18333334), (0.775, 0.16666667), (0.775, 0.16666667), (0.775, 0.18333334), (0.76666665, 0.18333334), (0.76666665, 0.16666667), (0.76666665, 0.16666667), (0.76666665, 0.18333334), (0.7583333, 0.18333334), (0.7583333, 0.16666667), (0.7583333, 0.16666667), (0.7583333, 0.18333334), (0.75, 0.18333334), (0.75, 0.16666667), (0.75, 0.16666667), (0.75, 0.18333334), (0.7416667, 0.18333334), (0.7416667, 0.16666667), (0.7416667, 0.16666667), (0.7416667, 0.18333334), (0.73333335, 0.18333334), (0.73333335, 0.16666667), (0.73333335, 0.16666667), (0.73333335, 0.18333334), (0.725, 0.18333334), (0.725, 0.16666667), (0.725, 0.16666667), (0.725, 0.18333334), (0.71666664, 0.18333334), (0.71666664, 0.16666667), (0.71666664, 0.16666667), (0.71666664, 0.18333334), (0.7083333, 0.18333334), (0.7083333, 0.16666667), (0.7083333, 0.16666667), (0.7083333, 0.18333334), (0.7, 0.18333334), (0.7, 0.16666667), (0.7, 0.16666667), (0.7, 0.18333334), (0.69166666, 0.18333334), (0.69166666, 0.16666667), (0.69166666, 0.16666667), (0.69166666, 0.18333334), (0.68333334, 0.18333334), (0.68333334, 0.16666667), (0.68333334, 0.16666667), (0.68333334, 0.18333334), (0.675, 0.18333334), (0.675, 0.16666667), (0.675, 0.16666667), (0.675, 0.18333334), (0.6666667, 0.18333334), (0.6666667, 0.16666667), (0.6666667, 0.16666667), (0.6666667, 0.18333334), (0.65833336, 0.18333334), (0.65833336, 0.16666667), (0.65833336, 0.16666667), (0.65833336, 0.18333334), (0.65, 0.18333334), (0.65, 0.16666667), (0.65, 0.16666667), (0.65, 0.18333334), (0.64166665, 0.18333334), (0.64166665, 0.16666667), (0.64166665, 0.16666667), (0.64166665, 0.18333334), (0.6333333, 0.18333334), (0.6333333, 0.16666667), (0.6333333, 0.16666667), (0.6333333, 0.18333334), (0.625, 0.18333334), (0.625, 0.16666667), (0.625, 0.16666667), (0.625, 0.18333334), (0.6166667, 0.18333334), (0.6166667, 0.16666667), (0.6166667, 0.16666667), (0.6166667, 0.18333334), (0.60833335, 0.18333334), (0.60833335, 0.16666667), (0.60833335, 0.16666667), (0.60833335, 0.18333334), (0.6, 0.18333334), (0.6, 0.16666667), (0.6, 0.16666667), (0.6, 0.18333334), (0.59166664, 0.18333334), (0.59166664, 0.16666667), (0.59166664, 0.16666667), (0.59166664, 0.18333334), (0.5833333, 0.18333334), (0.5833333, 0.16666667), (0.5833333, 0.16666667), (0.5833333, 0.18333334), (0.575, 0.18333334), (0.575, 0.16666667), (0.575, 0.16666667), (0.575, 0.18333334), (0.56666666, 0.18333334), (0.56666666, 0.16666667), (0.56666666, 0.16666667), (0.56666666, 0.18333334), (0.55833334, 0.18333334), (0.55833334, 0.16666667), (0.55833334, 0.16666667), (0.55833334, 0.18333334), (0.55, 0.18333334), (0.55, 0.16666667), (0.55, 0.16666667), (0.55, 0.18333334), (0.5416667, 0.18333334), (0.5416667, 0.16666667), (0.5416667, 0.16666667), (0.5416667, 0.18333334), (0.53333336, 0.18333334), (0.53333336, 0.16666667), (0.53333336, 0.16666667), (0.53333336, 0.18333334), (0.525, 0.18333334), (0.525, 0.16666667), (0.525, 0.16666667), (0.525, 0.18333334), (0.51666665, 0.18333334), (0.51666665, 0.16666667), (0.51666665, 0.16666667), (0.51666665, 0.18333334), (0.5083333, 0.18333334), (0.5083333, 0.16666667), (0.5083333, 0.16666667), (0.5083333, 0.18333334), (0.5, 0.18333334), (0.5, 0.16666667), (0.5, 0.16666667), (0.5, 0.18333334), (0.49166667, 0.18333334), (0.49166667, 0.16666667), (0.49166667, 0.16666667), (0.49166667, 0.18333334), (0.48333332, 0.18333334), (0.48333332, 0.16666667), (0.48333332, 0.16666667), (0.48333332, 0.18333334), (0.475, 0.18333334), (0.475, 0.16666667), (0.475, 0.16666667), (0.475, 0.18333334), (0.46666667, 0.18333334), (0.46666667, 0.16666667), (0.46666667, 0.16666667), (0.46666667, 0.18333334), (0.45833334, 0.18333334), (0.45833334, 0.16666667), (0.45833334, 0.16666667), (0.45833334, 0.18333334), (0.45, 0.18333334), (0.45, 0.16666667), (0.45, 0.16666667), (0.45, 0.18333334), (0.44166666, 0.18333334), (0.44166666, 0.16666667), (0.44166666, 0.16666667), (0.44166666, 0.18333334), (0.43333334, 0.18333334), (0.43333334, 0.16666667), (0.43333334, 0.16666667), (0.43333334, 0.18333334), (0.425, 0.18333334), (0.425, 0.16666667), (0.425, 0.16666667), (0.425, 0.18333334), (0.41666666, 0.18333334), (0.41666666, 0.16666667), (0.41666666, 0.16666667), (0.41666666, 0.18333334), (0.40833333, 0.18333334), (0.40833333, 0.16666667), (0.40833333, 0.16666667), (0.40833333, 0.18333334), (0.4, 0.18333334), (0.4, 0.16666667), (0.4, 0.16666667), (0.4, 0.18333334), (0.39166668, 0.18333334), (0.39166668, 0.16666667), (0.39166668, 0.16666667), (0.39166668, 0.18333334), (0.38333333, 0.18333334), (0.38333333, 0.16666667), (0.38333333, 0.16666667), (0.38333333, 0.18333334), (0.375, 0.18333334), (0.375, 0.16666667), (0.375, 0.16666667), (0.375, 0.18333334), (0.36666667, 0.18333334), (0.36666667, 0.16666667), (0.36666667, 0.16666667), (0.36666667, 0.18333334), (0.35833332, 0.18333334), (0.35833332, 0.16666667), (0.35833332, 0.16666667), (0.35833332, 0.18333334), (0.35, 0.18333334), (0.35, 0.16666667), (0.35, 0.16666667), (0.35, 0.18333334), (0.34166667, 0.18333334), (0.34166667, 0.16666667), (0.34166667, 0.16666667), (0.34166667, 0.18333334), (0.33333334, 0.18333334), (0.33333334, 0.16666667), (0.33333334, 0.16666667), (0.33333334, 0.18333334), (0.325, 0.18333334), (0.325, 0.16666667), (0.325, 0.16666667), (0.325, 0.18333334), (0.31666666, 0.18333334), (0.31666666, 0.16666667), (0.31666666, 0.16666667), (0.31666666, 0.18333334), (0.30833334, 0.18333334), (0.30833334, 0.16666667), (0.30833334, 0.16666667), (0.30833334, 0.18333334), (0.3, 0.18333334), (0.3, 0.16666667), (0.3, 0.16666667), (0.3, 0.18333334), (0.29166666, 0.18333334), (0.29166666, 0.16666667), (0.29166666, 0.16666667), (0.29166666, 0.18333334), (0.28333333, 0.18333334), (0.28333333, 0.16666667), (0.28333333, 0.16666667), (0.28333333, 0.18333334), (0.275, 0.18333334), (0.275, 0.16666667), (0.275, 0.16666667), (0.275, 0.18333334), (0.26666668, 0.18333334), (0.26666668, 0.16666667), (0.26666668, 0.16666667), (0.26666668, 0.18333334), (0.25833333, 0.18333334), (0.25833333, 0.16666667), (0.25833333, 0.16666667), (0.25833333, 0.18333334), (0.25, 0.18333334), (0.25, 0.16666667), (0.25, 0.16666667), (0.25, 0.18333334), (0.24166666, 0.18333334), (0.24166666, 0.16666667), (0.24166666, 0.16666667), (0.24166666, 0.18333334), (0.23333333, 0.18333334), (0.23333333, 0.16666667), (0.23333333, 0.16666667), (0.23333333, 0.18333334), (0.225, 0.18333334), (0.225, 0.16666667), (0.225, 0.16666667), (0.225, 0.18333334), (0.21666667, 0.18333334), (0.21666667, 0.16666667), (0.21666667, 0.16666667), (0.21666667, 0.18333334), (0.20833333, 0.18333334), (0.20833333, 0.16666667), (0.20833333, 0.16666667), (0.20833333, 0.18333334), (0.2, 0.18333334), (0.2, 0.16666667), (0.2, 0.16666667), (0.2, 0.18333334), (0.19166666, 0.18333334), (0.19166666, 0.16666667), (0.19166666, 0.16666667), (0.19166666, 0.18333334), (0.18333334, 0.18333334), (0.18333334, 0.16666667), (0.18333334, 0.16666667), (0.18333334, 0.18333334), (0.175, 0.18333334), (0.175, 0.16666667), (0.175, 0.16666667), (0.175, 0.18333334), (0.16666667, 0.18333334), (0.16666667, 0.16666667), (0.16666667, 0.16666667), (0.16666667, 0.18333334), (0.15833333, 0.18333334), (0.15833333, 0.16666667), (0.15833333, 0.16666667), (0.15833333, 0.18333334), (0.15, 0.18333334), (0.15, 0.16666667), (0.15, 0.16666667), (0.15, 0.18333334), (0.14166667, 0.18333334), (0.14166667, 0.16666667), (0.14166667, 0.16666667), (0.14166667, 0.18333334), (0.13333334, 0.18333334), (0.13333334, 0.16666667), (0.13333334, 0.16666667), (0.13333334, 0.18333334), (0.125, 0.18333334), (0.125, 0.16666667), (0.125, 0.16666667), (0.125, 0.18333334), (0.11666667, 0.18333334), (0.11666667, 0.16666667), (0.11666667, 0.16666667), (0.11666667, 0.18333334), (0.108333334, 0.18333334), (0.108333334, 0.16666667), (0.108333334, 0.16666667), (0.108333334, 0.18333334), (0.1, 0.18333334), (0.1, 0.16666667), (0.1, 0.16666667), (0.1, 0.18333334), (0.09166667, 0.18333334), (0.09166667, 0.16666667), (0.09166667, 0.16666667), (0.09166667, 0.18333334), (0.083333336, 0.18333334), (0.083333336, 0.16666667), (0.083333336, 0.16666667), (0.083333336, 0.18333334), (0.075, 0.18333334), (0.075, 0.16666667), (0.075, 0.16666667), (0.075, 0.18333334), (0.06666667, 0.18333334), (0.06666667, 0.16666667), (0.06666667, 0.16666667), (0.06666667, 0.18333334), (0.058333334, 0.18333334), (0.058333334, 0.16666667), (0.058333334, 0.16666667), (0.058333334, 0.18333334), (0.05, 0.18333334), (0.05, 0.16666667), (0.05, 0.16666667), (0.05, 0.18333334), (0.041666668, 0.18333334), (0.041666668, 0.16666667), (0.041666668, 0.16666667), (0.041666668, 0.18333334), (0.033333335, 0.18333334), (0.033333335, 0.16666667), (0.033333335, 0.16666667), (0.033333335, 0.18333334), (0.025, 0.18333334), (0.025, 0.16666667), (0.025, 0.16666667), (0.025, 0.18333334), (0.016666668, 0.18333334), (0.016666668, 0.16666667), (0.016666668, 0.16666667), (0.016666668, 0.18333334), (0.008333334, 0.18333334), (0.008333334, 0.16666667), (0.008333334, 0.16666667), (0.008333334, 0.18333334), (0, 0.18333334), (0, 0.16666667), (1, 0.18333334), (1, 0.2), (0.9916667, 0.2), (0.9916667, 0.18333334), (0.9916667, 0.18333334), (0.9916667, 0.2), (0.98333335, 0.2), (0.98333335, 0.18333334), (0.98333335, 0.18333334), (0.98333335, 0.2), (0.975, 0.2), (0.975, 0.18333334), (0.975, 0.18333334), (0.975, 0.2), (0.96666664, 0.2), (0.96666664, 0.18333334), (0.96666664, 0.18333334), (0.96666664, 0.2), (0.9583333, 0.2), (0.9583333, 0.18333334), (0.9583333, 0.18333334), (0.9583333, 0.2), (0.95, 0.2), (0.95, 0.18333334), (0.95, 0.18333334), (0.95, 0.2), (0.94166666, 0.2), (0.94166666, 0.18333334), (0.94166666, 0.18333334), (0.94166666, 0.2), (0.93333334, 0.2), (0.93333334, 0.18333334), (0.93333334, 0.18333334), (0.93333334, 0.2), (0.925, 0.2), (0.925, 0.18333334), (0.925, 0.18333334), (0.925, 0.2), (0.9166667, 0.2), (0.9166667, 0.18333334), (0.9166667, 0.18333334), (0.9166667, 0.2), (0.90833336, 0.2), (0.90833336, 0.18333334), (0.90833336, 0.18333334), (0.90833336, 0.2), (0.9, 0.2), (0.9, 0.18333334), (0.9, 0.18333334), (0.9, 0.2), (0.89166665, 0.2), (0.89166665, 0.18333334), (0.89166665, 0.18333334), (0.89166665, 0.2), (0.8833333, 0.2), (0.8833333, 0.18333334), (0.8833333, 0.18333334), (0.8833333, 0.2), (0.875, 0.2), (0.875, 0.18333334), (0.875, 0.18333334), (0.875, 0.2), (0.8666667, 0.2), (0.8666667, 0.18333334), (0.8666667, 0.18333334), (0.8666667, 0.2), (0.85833335, 0.2), (0.85833335, 0.18333334), (0.85833335, 0.18333334), (0.85833335, 0.2), (0.85, 0.2), (0.85, 0.18333334), (0.85, 0.18333334), (0.85, 0.2), (0.84166664, 0.2), (0.84166664, 0.18333334), (0.84166664, 0.18333334), (0.84166664, 0.2), (0.8333333, 0.2), (0.8333333, 0.18333334), (0.8333333, 0.18333334), (0.8333333, 0.2), (0.825, 0.2), (0.825, 0.18333334), (0.825, 0.18333334), (0.825, 0.2), (0.81666666, 0.2), (0.81666666, 0.18333334), (0.81666666, 0.18333334), (0.81666666, 0.2), (0.80833334, 0.2), (0.80833334, 0.18333334), (0.80833334, 0.18333334), (0.80833334, 0.2), (0.8, 0.2), (0.8, 0.18333334), (0.8, 0.18333334), (0.8, 0.2), (0.7916667, 0.2), (0.7916667, 0.18333334), (0.7916667, 0.18333334), (0.7916667, 0.2), (0.78333336, 0.2), (0.78333336, 0.18333334), (0.78333336, 0.18333334), (0.78333336, 0.2), (0.775, 0.2), (0.775, 0.18333334), (0.775, 0.18333334), (0.775, 0.2), (0.76666665, 0.2), (0.76666665, 0.18333334), (0.76666665, 0.18333334), (0.76666665, 0.2), (0.7583333, 0.2), (0.7583333, 0.18333334), (0.7583333, 0.18333334), (0.7583333, 0.2), (0.75, 0.2), (0.75, 0.18333334), (0.75, 0.18333334), (0.75, 0.2), (0.7416667, 0.2), (0.7416667, 0.18333334), (0.7416667, 0.18333334), (0.7416667, 0.2), (0.73333335, 0.2), (0.73333335, 0.18333334), (0.73333335, 0.18333334), (0.73333335, 0.2), (0.725, 0.2), (0.725, 0.18333334), (0.725, 0.18333334), (0.725, 0.2), (0.71666664, 0.2), (0.71666664, 0.18333334), (0.71666664, 0.18333334), (0.71666664, 0.2), (0.7083333, 0.2), (0.7083333, 0.18333334), (0.7083333, 0.18333334), (0.7083333, 0.2), (0.7, 0.2), (0.7, 0.18333334), (0.7, 0.18333334), (0.7, 0.2), (0.69166666, 0.2), (0.69166666, 0.18333334), (0.69166666, 0.18333334), (0.69166666, 0.2), (0.68333334, 0.2), (0.68333334, 0.18333334), (0.68333334, 0.18333334), (0.68333334, 0.2), (0.675, 0.2), (0.675, 0.18333334), (0.675, 0.18333334), (0.675, 0.2), (0.6666667, 0.2), (0.6666667, 0.18333334), (0.6666667, 0.18333334), (0.6666667, 0.2), (0.65833336, 0.2), (0.65833336, 0.18333334), (0.65833336, 0.18333334), (0.65833336, 0.2), (0.65, 0.2), (0.65, 0.18333334), (0.65, 0.18333334), (0.65, 0.2), (0.64166665, 0.2), (0.64166665, 0.18333334), (0.64166665, 0.18333334), (0.64166665, 0.2), (0.6333333, 0.2), (0.6333333, 0.18333334), (0.6333333, 0.18333334), (0.6333333, 0.2), (0.625, 0.2), (0.625, 0.18333334), (0.625, 0.18333334), (0.625, 0.2), (0.6166667, 0.2), (0.6166667, 0.18333334), (0.6166667, 0.18333334), (0.6166667, 0.2), (0.60833335, 0.2), (0.60833335, 0.18333334), (0.60833335, 0.18333334), (0.60833335, 0.2), (0.6, 0.2), (0.6, 0.18333334), (0.6, 0.18333334), (0.6, 0.2), (0.59166664, 0.2), (0.59166664, 0.18333334), (0.59166664, 0.18333334), (0.59166664, 0.2), (0.5833333, 0.2), (0.5833333, 0.18333334), (0.5833333, 0.18333334), (0.5833333, 0.2), (0.575, 0.2), (0.575, 0.18333334), (0.575, 0.18333334), (0.575, 0.2), (0.56666666, 0.2), (0.56666666, 0.18333334), (0.56666666, 0.18333334), (0.56666666, 0.2), (0.55833334, 0.2), (0.55833334, 0.18333334), (0.55833334, 0.18333334), (0.55833334, 0.2), (0.55, 0.2), (0.55, 0.18333334), (0.55, 0.18333334), (0.55, 0.2), (0.5416667, 0.2), (0.5416667, 0.18333334), (0.5416667, 0.18333334), (0.5416667, 0.2), (0.53333336, 0.2), (0.53333336, 0.18333334), (0.53333336, 0.18333334), (0.53333336, 0.2), (0.525, 0.2), (0.525, 0.18333334), (0.525, 0.18333334), (0.525, 0.2), (0.51666665, 0.2), (0.51666665, 0.18333334), (0.51666665, 0.18333334), (0.51666665, 0.2), (0.5083333, 0.2), (0.5083333, 0.18333334), (0.5083333, 0.18333334), (0.5083333, 0.2), (0.5, 0.2), (0.5, 0.18333334), (0.5, 0.18333334), (0.5, 0.2), (0.49166667, 0.2), (0.49166667, 0.18333334), (0.49166667, 0.18333334), (0.49166667, 0.2), (0.48333332, 0.2), (0.48333332, 0.18333334), (0.48333332, 0.18333334), (0.48333332, 0.2), (0.475, 0.2), (0.475, 0.18333334), (0.475, 0.18333334), (0.475, 0.2), (0.46666667, 0.2), (0.46666667, 0.18333334), (0.46666667, 0.18333334), (0.46666667, 0.2), (0.45833334, 0.2), (0.45833334, 0.18333334), (0.45833334, 0.18333334), (0.45833334, 0.2), (0.45, 0.2), (0.45, 0.18333334), (0.45, 0.18333334), (0.45, 0.2), (0.44166666, 0.2), (0.44166666, 0.18333334), (0.44166666, 0.18333334), (0.44166666, 0.2), (0.43333334, 0.2), (0.43333334, 0.18333334), (0.43333334, 0.18333334), (0.43333334, 0.2), (0.425, 0.2), (0.425, 0.18333334), (0.425, 0.18333334), (0.425, 0.2), (0.41666666, 0.2), (0.41666666, 0.18333334), (0.41666666, 0.18333334), (0.41666666, 0.2), (0.40833333, 0.2), (0.40833333, 0.18333334), (0.40833333, 0.18333334), (0.40833333, 0.2), (0.4, 0.2), (0.4, 0.18333334), (0.4, 0.18333334), (0.4, 0.2), (0.39166668, 0.2), (0.39166668, 0.18333334), (0.39166668, 0.18333334), (0.39166668, 0.2), (0.38333333, 0.2), (0.38333333, 0.18333334), (0.38333333, 0.18333334), (0.38333333, 0.2), (0.375, 0.2), (0.375, 0.18333334), (0.375, 0.18333334), (0.375, 0.2), (0.36666667, 0.2), (0.36666667, 0.18333334), (0.36666667, 0.18333334), (0.36666667, 0.2), (0.35833332, 0.2), (0.35833332, 0.18333334), (0.35833332, 0.18333334), (0.35833332, 0.2), (0.35, 0.2), (0.35, 0.18333334), (0.35, 0.18333334), (0.35, 0.2), (0.34166667, 0.2), (0.34166667, 0.18333334), (0.34166667, 0.18333334), (0.34166667, 0.2), (0.33333334, 0.2), (0.33333334, 0.18333334), (0.33333334, 0.18333334), (0.33333334, 0.2), (0.325, 0.2), (0.325, 0.18333334), (0.325, 0.18333334), (0.325, 0.2), (0.31666666, 0.2), (0.31666666, 0.18333334), (0.31666666, 0.18333334), (0.31666666, 0.2), (0.30833334, 0.2), (0.30833334, 0.18333334), (0.30833334, 0.18333334), (0.30833334, 0.2), (0.3, 0.2), (0.3, 0.18333334), (0.3, 0.18333334), (0.3, 0.2), (0.29166666, 0.2), (0.29166666, 0.18333334), (0.29166666, 0.18333334), (0.29166666, 0.2), (0.28333333, 0.2), (0.28333333, 0.18333334), (0.28333333, 0.18333334), (0.28333333, 0.2), (0.275, 0.2), (0.275, 0.18333334), (0.275, 0.18333334), (0.275, 0.2), (0.26666668, 0.2), (0.26666668, 0.18333334), (0.26666668, 0.18333334), (0.26666668, 0.2), (0.25833333, 0.2), (0.25833333, 0.18333334), (0.25833333, 0.18333334), (0.25833333, 0.2), (0.25, 0.2), (0.25, 0.18333334), (0.25, 0.18333334), (0.25, 0.2), (0.24166666, 0.2), (0.24166666, 0.18333334), (0.24166666, 0.18333334), (0.24166666, 0.2), (0.23333333, 0.2), (0.23333333, 0.18333334), (0.23333333, 0.18333334), (0.23333333, 0.2), (0.225, 0.2), (0.225, 0.18333334), (0.225, 0.18333334), (0.225, 0.2), (0.21666667, 0.2), (0.21666667, 0.18333334), (0.21666667, 0.18333334), (0.21666667, 0.2), (0.20833333, 0.2), (0.20833333, 0.18333334), (0.20833333, 0.18333334), (0.20833333, 0.2), (0.2, 0.2), (0.2, 0.18333334), (0.2, 0.18333334), (0.2, 0.2), (0.19166666, 0.2), (0.19166666, 0.18333334), (0.19166666, 0.18333334), (0.19166666, 0.2), (0.18333334, 0.2), (0.18333334, 0.18333334), (0.18333334, 0.18333334), (0.18333334, 0.2), (0.175, 0.2), (0.175, 0.18333334), (0.175, 0.18333334), (0.175, 0.2), (0.16666667, 0.2), (0.16666667, 0.18333334), (0.16666667, 0.18333334), (0.16666667, 0.2), (0.15833333, 0.2), (0.15833333, 0.18333334), (0.15833333, 0.18333334), (0.15833333, 0.2), (0.15, 0.2), (0.15, 0.18333334), (0.15, 0.18333334), (0.15, 0.2), (0.14166667, 0.2), (0.14166667, 0.18333334), (0.14166667, 0.18333334), (0.14166667, 0.2), (0.13333334, 0.2), (0.13333334, 0.18333334), (0.13333334, 0.18333334), (0.13333334, 0.2), (0.125, 0.2), (0.125, 0.18333334), (0.125, 0.18333334), (0.125, 0.2), (0.11666667, 0.2), (0.11666667, 0.18333334), (0.11666667, 0.18333334), (0.11666667, 0.2), (0.108333334, 0.2), (0.108333334, 0.18333334), (0.108333334, 0.18333334), (0.108333334, 0.2), (0.1, 0.2), (0.1, 0.18333334), (0.1, 0.18333334), (0.1, 0.2), (0.09166667, 0.2), (0.09166667, 0.18333334), (0.09166667, 0.18333334), (0.09166667, 0.2), (0.083333336, 0.2), (0.083333336, 0.18333334), (0.083333336, 0.18333334), (0.083333336, 0.2), (0.075, 0.2), (0.075, 0.18333334), (0.075, 0.18333334), (0.075, 0.2), (0.06666667, 0.2), (0.06666667, 0.18333334), (0.06666667, 0.18333334), (0.06666667, 0.2), (0.058333334, 0.2), (0.058333334, 0.18333334), (0.058333334, 0.18333334), (0.058333334, 0.2), (0.05, 0.2), (0.05, 0.18333334), (0.05, 0.18333334), (0.05, 0.2), (0.041666668, 0.2), (0.041666668, 0.18333334), (0.041666668, 0.18333334), (0.041666668, 0.2), (0.033333335, 0.2), (0.033333335, 0.18333334), (0.033333335, 0.18333334), (0.033333335, 0.2), (0.025, 0.2), (0.025, 0.18333334), (0.025, 0.18333334), (0.025, 0.2), (0.016666668, 0.2), (0.016666668, 0.18333334), (0.016666668, 0.18333334), (0.016666668, 0.2), (0.008333334, 0.2), (0.008333334, 0.18333334), (0.008333334, 0.18333334), (0.008333334, 0.2), (0, 0.2), (0, 0.18333334), (1, 0.2), (1, 0.21666667), (0.9916667, 0.21666667), (0.9916667, 0.2), (0.9916667, 0.2), (0.9916667, 0.21666667), (0.98333335, 0.21666667), (0.98333335, 0.2), (0.98333335, 0.2), (0.98333335, 0.21666667), (0.975, 0.21666667), (0.975, 0.2), (0.975, 0.2), (0.975, 0.21666667), (0.96666664, 0.21666667), (0.96666664, 0.2), (0.96666664, 0.2), (0.96666664, 0.21666667), (0.9583333, 0.21666667), (0.9583333, 0.2), (0.9583333, 0.2), (0.9583333, 0.21666667), (0.95, 0.21666667), (0.95, 0.2), (0.95, 0.2), (0.95, 0.21666667), (0.94166666, 0.21666667), (0.94166666, 0.2), (0.94166666, 0.2), (0.94166666, 0.21666667), (0.93333334, 0.21666667), (0.93333334, 0.2), (0.93333334, 0.2), (0.93333334, 0.21666667), (0.925, 0.21666667), (0.925, 0.2), (0.925, 0.2), (0.925, 0.21666667), (0.9166667, 0.21666667), (0.9166667, 0.2), (0.9166667, 0.2), (0.9166667, 0.21666667), (0.90833336, 0.21666667), (0.90833336, 0.2), (0.90833336, 0.2), (0.90833336, 0.21666667), (0.9, 0.21666667), (0.9, 0.2), (0.9, 0.2), (0.9, 0.21666667), (0.89166665, 0.21666667), (0.89166665, 0.2), (0.89166665, 0.2), (0.89166665, 0.21666667), (0.8833333, 0.21666667), (0.8833333, 0.2), (0.8833333, 0.2), (0.8833333, 0.21666667), (0.875, 0.21666667), (0.875, 0.2), (0.875, 0.2), (0.875, 0.21666667), (0.8666667, 0.21666667), (0.8666667, 0.2), (0.8666667, 0.2), (0.8666667, 0.21666667), (0.85833335, 0.21666667), (0.85833335, 0.2), (0.85833335, 0.2), (0.85833335, 0.21666667), (0.85, 0.21666667), (0.85, 0.2), (0.85, 0.2), (0.85, 0.21666667), (0.84166664, 0.21666667), (0.84166664, 0.2), (0.84166664, 0.2), (0.84166664, 0.21666667), (0.8333333, 0.21666667), (0.8333333, 0.2), (0.8333333, 0.2), (0.8333333, 0.21666667), (0.825, 0.21666667), (0.825, 0.2), (0.825, 0.2), (0.825, 0.21666667), (0.81666666, 0.21666667), (0.81666666, 0.2), (0.81666666, 0.2), (0.81666666, 0.21666667), (0.80833334, 0.21666667), (0.80833334, 0.2), (0.80833334, 0.2), (0.80833334, 0.21666667), (0.8, 0.21666667), (0.8, 0.2), (0.8, 0.2), (0.8, 0.21666667), (0.7916667, 0.21666667), (0.7916667, 0.2), (0.7916667, 0.2), (0.7916667, 0.21666667), (0.78333336, 0.21666667), (0.78333336, 0.2), (0.78333336, 0.2), (0.78333336, 0.21666667), (0.775, 0.21666667), (0.775, 0.2), (0.775, 0.2), (0.775, 0.21666667), (0.76666665, 0.21666667), (0.76666665, 0.2), (0.76666665, 0.2), (0.76666665, 0.21666667), (0.7583333, 0.21666667), (0.7583333, 0.2), (0.7583333, 0.2), (0.7583333, 0.21666667), (0.75, 0.21666667), (0.75, 0.2), (0.75, 0.2), (0.75, 0.21666667), (0.7416667, 0.21666667), (0.7416667, 0.2), (0.7416667, 0.2), (0.7416667, 0.21666667), (0.73333335, 0.21666667), (0.73333335, 0.2), (0.73333335, 0.2), (0.73333335, 0.21666667), (0.725, 0.21666667), (0.725, 0.2), (0.725, 0.2), (0.725, 0.21666667), (0.71666664, 0.21666667), (0.71666664, 0.2), (0.71666664, 0.2), (0.71666664, 0.21666667), (0.7083333, 0.21666667), (0.7083333, 0.2), (0.7083333, 0.2), (0.7083333, 0.21666667), (0.7, 0.21666667), (0.7, 0.2), (0.7, 0.2), (0.7, 0.21666667), (0.69166666, 0.21666667), (0.69166666, 0.2), (0.69166666, 0.2), (0.69166666, 0.21666667), (0.68333334, 0.21666667), (0.68333334, 0.2), (0.68333334, 0.2), (0.68333334, 0.21666667), (0.675, 0.21666667), (0.675, 0.2), (0.675, 0.2), (0.675, 0.21666667), (0.6666667, 0.21666667), (0.6666667, 0.2), (0.6666667, 0.2), (0.6666667, 0.21666667), (0.65833336, 0.21666667), (0.65833336, 0.2), (0.65833336, 0.2), (0.65833336, 0.21666667), (0.65, 0.21666667), (0.65, 0.2), (0.65, 0.2), (0.65, 0.21666667), (0.64166665, 0.21666667), (0.64166665, 0.2), (0.64166665, 0.2), (0.64166665, 0.21666667), (0.6333333, 0.21666667), (0.6333333, 0.2), (0.6333333, 0.2), (0.6333333, 0.21666667), (0.625, 0.21666667), (0.625, 0.2), (0.625, 0.2), (0.625, 0.21666667), (0.6166667, 0.21666667), (0.6166667, 0.2), (0.6166667, 0.2), (0.6166667, 0.21666667), (0.60833335, 0.21666667), (0.60833335, 0.2), (0.60833335, 0.2), (0.60833335, 0.21666667), (0.6, 0.21666667), (0.6, 0.2), (0.6, 0.2), (0.6, 0.21666667), (0.59166664, 0.21666667), (0.59166664, 0.2), (0.59166664, 0.2), (0.59166664, 0.21666667), (0.5833333, 0.21666667), (0.5833333, 0.2), (0.5833333, 0.2), (0.5833333, 0.21666667), (0.575, 0.21666667), (0.575, 0.2), (0.575, 0.2), (0.575, 0.21666667), (0.56666666, 0.21666667), (0.56666666, 0.2), (0.56666666, 0.2), (0.56666666, 0.21666667), (0.55833334, 0.21666667), (0.55833334, 0.2), (0.55833334, 0.2), (0.55833334, 0.21666667), (0.55, 0.21666667), (0.55, 0.2), (0.55, 0.2), (0.55, 0.21666667), (0.5416667, 0.21666667), (0.5416667, 0.2), (0.5416667, 0.2), (0.5416667, 0.21666667), (0.53333336, 0.21666667), (0.53333336, 0.2), (0.53333336, 0.2), (0.53333336, 0.21666667), (0.525, 0.21666667), (0.525, 0.2), (0.525, 0.2), (0.525, 0.21666667), (0.51666665, 0.21666667), (0.51666665, 0.2), (0.51666665, 0.2), (0.51666665, 0.21666667), (0.5083333, 0.21666667), (0.5083333, 0.2), (0.5083333, 0.2), (0.5083333, 0.21666667), (0.5, 0.21666667), (0.5, 0.2), (0.5, 0.2), (0.5, 0.21666667), (0.49166667, 0.21666667), (0.49166667, 0.2), (0.49166667, 0.2), (0.49166667, 0.21666667), (0.48333332, 0.21666667), (0.48333332, 0.2), (0.48333332, 0.2), (0.48333332, 0.21666667), (0.475, 0.21666667), (0.475, 0.2), (0.475, 0.2), (0.475, 0.21666667), (0.46666667, 0.21666667), (0.46666667, 0.2), (0.46666667, 0.2), (0.46666667, 0.21666667), (0.45833334, 0.21666667), (0.45833334, 0.2), (0.45833334, 0.2), (0.45833334, 0.21666667), (0.45, 0.21666667), (0.45, 0.2), (0.45, 0.2), (0.45, 0.21666667), (0.44166666, 0.21666667), (0.44166666, 0.2), (0.44166666, 0.2), (0.44166666, 0.21666667), (0.43333334, 0.21666667), (0.43333334, 0.2), (0.43333334, 0.2), (0.43333334, 0.21666667), (0.425, 0.21666667), (0.425, 0.2), (0.425, 0.2), (0.425, 0.21666667), (0.41666666, 0.21666667), (0.41666666, 0.2), (0.41666666, 0.2), (0.41666666, 0.21666667), (0.40833333, 0.21666667), (0.40833333, 0.2), (0.40833333, 0.2), (0.40833333, 0.21666667), (0.4, 0.21666667), (0.4, 0.2), (0.4, 0.2), (0.4, 0.21666667), (0.39166668, 0.21666667), (0.39166668, 0.2), (0.39166668, 0.2), (0.39166668, 0.21666667), (0.38333333, 0.21666667), (0.38333333, 0.2), (0.38333333, 0.2), (0.38333333, 0.21666667), (0.375, 0.21666667), (0.375, 0.2), (0.375, 0.2), (0.375, 0.21666667), (0.36666667, 0.21666667), (0.36666667, 0.2), (0.36666667, 0.2), (0.36666667, 0.21666667), (0.35833332, 0.21666667), (0.35833332, 0.2), (0.35833332, 0.2), (0.35833332, 0.21666667), (0.35, 0.21666667), (0.35, 0.2), (0.35, 0.2), (0.35, 0.21666667), (0.34166667, 0.21666667), (0.34166667, 0.2), (0.34166667, 0.2), (0.34166667, 0.21666667), (0.33333334, 0.21666667), (0.33333334, 0.2), (0.33333334, 0.2), (0.33333334, 0.21666667), (0.325, 0.21666667), (0.325, 0.2), (0.325, 0.2), (0.325, 0.21666667), (0.31666666, 0.21666667), (0.31666666, 0.2), (0.31666666, 0.2), (0.31666666, 0.21666667), (0.30833334, 0.21666667), (0.30833334, 0.2), (0.30833334, 0.2), (0.30833334, 0.21666667), (0.3, 0.21666667), (0.3, 0.2), (0.3, 0.2), (0.3, 0.21666667), (0.29166666, 0.21666667), (0.29166666, 0.2), (0.29166666, 0.2), (0.29166666, 0.21666667), (0.28333333, 0.21666667), (0.28333333, 0.2), (0.28333333, 0.2), (0.28333333, 0.21666667), (0.275, 0.21666667), (0.275, 0.2), (0.275, 0.2), (0.275, 0.21666667), (0.26666668, 0.21666667), (0.26666668, 0.2), (0.26666668, 0.2), (0.26666668, 0.21666667), (0.25833333, 0.21666667), (0.25833333, 0.2), (0.25833333, 0.2), (0.25833333, 0.21666667), (0.25, 0.21666667), (0.25, 0.2), (0.25, 0.2), (0.25, 0.21666667), (0.24166666, 0.21666667), (0.24166666, 0.2), (0.24166666, 0.2), (0.24166666, 0.21666667), (0.23333333, 0.21666667), (0.23333333, 0.2), (0.23333333, 0.2), (0.23333333, 0.21666667), (0.225, 0.21666667), (0.225, 0.2), (0.225, 0.2), (0.225, 0.21666667), (0.21666667, 0.21666667), (0.21666667, 0.2), (0.21666667, 0.2), (0.21666667, 0.21666667), (0.20833333, 0.21666667), (0.20833333, 0.2), (0.20833333, 0.2), (0.20833333, 0.21666667), (0.2, 0.21666667), (0.2, 0.2), (0.2, 0.2), (0.2, 0.21666667), (0.19166666, 0.21666667), (0.19166666, 0.2), (0.19166666, 0.2), (0.19166666, 0.21666667), (0.18333334, 0.21666667), (0.18333334, 0.2), (0.18333334, 0.2), (0.18333334, 0.21666667), (0.175, 0.21666667), (0.175, 0.2), (0.175, 0.2), (0.175, 0.21666667), (0.16666667, 0.21666667), (0.16666667, 0.2), (0.16666667, 0.2), (0.16666667, 0.21666667), (0.15833333, 0.21666667), (0.15833333, 0.2), (0.15833333, 0.2), (0.15833333, 0.21666667), (0.15, 0.21666667), (0.15, 0.2), (0.15, 0.2), (0.15, 0.21666667), (0.14166667, 0.21666667), (0.14166667, 0.2), (0.14166667, 0.2), (0.14166667, 0.21666667), (0.13333334, 0.21666667), (0.13333334, 0.2), (0.13333334, 0.2), (0.13333334, 0.21666667), (0.125, 0.21666667), (0.125, 0.2), (0.125, 0.2), (0.125, 0.21666667), (0.11666667, 0.21666667), (0.11666667, 0.2), (0.11666667, 0.2), (0.11666667, 0.21666667), (0.108333334, 0.21666667), (0.108333334, 0.2), (0.108333334, 0.2), (0.108333334, 0.21666667), (0.1, 0.21666667), (0.1, 0.2), (0.1, 0.2), (0.1, 0.21666667), (0.09166667, 0.21666667), (0.09166667, 0.2), (0.09166667, 0.2), (0.09166667, 0.21666667), (0.083333336, 0.21666667), (0.083333336, 0.2), (0.083333336, 0.2), (0.083333336, 0.21666667), (0.075, 0.21666667), (0.075, 0.2), (0.075, 0.2), (0.075, 0.21666667), (0.06666667, 0.21666667), (0.06666667, 0.2), (0.06666667, 0.2), (0.06666667, 0.21666667), (0.058333334, 0.21666667), (0.058333334, 0.2), (0.058333334, 0.2), (0.058333334, 0.21666667), (0.05, 0.21666667), (0.05, 0.2), (0.05, 0.2), (0.05, 0.21666667), (0.041666668, 0.21666667), (0.041666668, 0.2), (0.041666668, 0.2), (0.041666668, 0.21666667), (0.033333335, 0.21666667), (0.033333335, 0.2), (0.033333335, 0.2), (0.033333335, 0.21666667), (0.025, 0.21666667), (0.025, 0.2), (0.025, 0.2), (0.025, 0.21666667), (0.016666668, 0.21666667), (0.016666668, 0.2), (0.016666668, 0.2), (0.016666668, 0.21666667), (0.008333334, 0.21666667), (0.008333334, 0.2), (0.008333334, 0.2), (0.008333334, 0.21666667), (0, 0.21666667), (0, 0.2), (1, 0.21666667), (1, 0.23333333), (0.9916667, 0.23333333), (0.9916667, 0.21666667), (0.9916667, 0.21666667), (0.9916667, 0.23333333), (0.98333335, 0.23333333), (0.98333335, 0.21666667), (0.98333335, 0.21666667), (0.98333335, 0.23333333), (0.975, 0.23333333), (0.975, 0.21666667), (0.975, 0.21666667), (0.975, 0.23333333), (0.96666664, 0.23333333), (0.96666664, 0.21666667), (0.96666664, 0.21666667), (0.96666664, 0.23333333), (0.9583333, 0.23333333), (0.9583333, 0.21666667), (0.9583333, 0.21666667), (0.9583333, 0.23333333), (0.95, 0.23333333), (0.95, 0.21666667), (0.95, 0.21666667), (0.95, 0.23333333), (0.94166666, 0.23333333), (0.94166666, 0.21666667), (0.94166666, 0.21666667), (0.94166666, 0.23333333), (0.93333334, 0.23333333), (0.93333334, 0.21666667), (0.93333334, 0.21666667), (0.93333334, 0.23333333), (0.925, 0.23333333), (0.925, 0.21666667), (0.925, 0.21666667), (0.925, 0.23333333), (0.9166667, 0.23333333), (0.9166667, 0.21666667), (0.9166667, 0.21666667), (0.9166667, 0.23333333), (0.90833336, 0.23333333), (0.90833336, 0.21666667), (0.90833336, 0.21666667), (0.90833336, 0.23333333), (0.9, 0.23333333), (0.9, 0.21666667), (0.9, 0.21666667), (0.9, 0.23333333), (0.89166665, 0.23333333), (0.89166665, 0.21666667), (0.89166665, 0.21666667), (0.89166665, 0.23333333), (0.8833333, 0.23333333), (0.8833333, 0.21666667), (0.8833333, 0.21666667), (0.8833333, 0.23333333), (0.875, 0.23333333), (0.875, 0.21666667), (0.875, 0.21666667), (0.875, 0.23333333), (0.8666667, 0.23333333), (0.8666667, 0.21666667), (0.8666667, 0.21666667), (0.8666667, 0.23333333), (0.85833335, 0.23333333), (0.85833335, 0.21666667), (0.85833335, 0.21666667), (0.85833335, 0.23333333), (0.85, 0.23333333), (0.85, 0.21666667), (0.85, 0.21666667), (0.85, 0.23333333), (0.84166664, 0.23333333), (0.84166664, 0.21666667), (0.84166664, 0.21666667), (0.84166664, 0.23333333), (0.8333333, 0.23333333), (0.8333333, 0.21666667), (0.8333333, 0.21666667), (0.8333333, 0.23333333), (0.825, 0.23333333), (0.825, 0.21666667), (0.825, 0.21666667), (0.825, 0.23333333), (0.81666666, 0.23333333), (0.81666666, 0.21666667), (0.81666666, 0.21666667), (0.81666666, 0.23333333), (0.80833334, 0.23333333), (0.80833334, 0.21666667), (0.80833334, 0.21666667), (0.80833334, 0.23333333), (0.8, 0.23333333), (0.8, 0.21666667), (0.8, 0.21666667), (0.8, 0.23333333), (0.7916667, 0.23333333), (0.7916667, 0.21666667), (0.7916667, 0.21666667), (0.7916667, 0.23333333), (0.78333336, 0.23333333), (0.78333336, 0.21666667), (0.78333336, 0.21666667), (0.78333336, 0.23333333), (0.775, 0.23333333), (0.775, 0.21666667), (0.775, 0.21666667), (0.775, 0.23333333), (0.76666665, 0.23333333), (0.76666665, 0.21666667), (0.76666665, 0.21666667), (0.76666665, 0.23333333), (0.7583333, 0.23333333), (0.7583333, 0.21666667), (0.7583333, 0.21666667), (0.7583333, 0.23333333), (0.75, 0.23333333), (0.75, 0.21666667), (0.75, 0.21666667), (0.75, 0.23333333), (0.7416667, 0.23333333), (0.7416667, 0.21666667), (0.7416667, 0.21666667), (0.7416667, 0.23333333), (0.73333335, 0.23333333), (0.73333335, 0.21666667), (0.73333335, 0.21666667), (0.73333335, 0.23333333), (0.725, 0.23333333), (0.725, 0.21666667), (0.725, 0.21666667), (0.725, 0.23333333), (0.71666664, 0.23333333), (0.71666664, 0.21666667), (0.71666664, 0.21666667), (0.71666664, 0.23333333), (0.7083333, 0.23333333), (0.7083333, 0.21666667), (0.7083333, 0.21666667), (0.7083333, 0.23333333), (0.7, 0.23333333), (0.7, 0.21666667), (0.7, 0.21666667), (0.7, 0.23333333), (0.69166666, 0.23333333), (0.69166666, 0.21666667), (0.69166666, 0.21666667), (0.69166666, 0.23333333), (0.68333334, 0.23333333), (0.68333334, 0.21666667), (0.68333334, 0.21666667), (0.68333334, 0.23333333), (0.675, 0.23333333), (0.675, 0.21666667), (0.675, 0.21666667), (0.675, 0.23333333), (0.6666667, 0.23333333), (0.6666667, 0.21666667), (0.6666667, 0.21666667), (0.6666667, 0.23333333), (0.65833336, 0.23333333), (0.65833336, 0.21666667), (0.65833336, 0.21666667), (0.65833336, 0.23333333), (0.65, 0.23333333), (0.65, 0.21666667), (0.65, 0.21666667), (0.65, 0.23333333), (0.64166665, 0.23333333), (0.64166665, 0.21666667), (0.64166665, 0.21666667), (0.64166665, 0.23333333), (0.6333333, 0.23333333), (0.6333333, 0.21666667), (0.6333333, 0.21666667), (0.6333333, 0.23333333), (0.625, 0.23333333), (0.625, 0.21666667), (0.625, 0.21666667), (0.625, 0.23333333), (0.6166667, 0.23333333), (0.6166667, 0.21666667), (0.6166667, 0.21666667), (0.6166667, 0.23333333), (0.60833335, 0.23333333), (0.60833335, 0.21666667), (0.60833335, 0.21666667), (0.60833335, 0.23333333), (0.6, 0.23333333), (0.6, 0.21666667), (0.6, 0.21666667), (0.6, 0.23333333), (0.59166664, 0.23333333), (0.59166664, 0.21666667), (0.59166664, 0.21666667), (0.59166664, 0.23333333), (0.5833333, 0.23333333), (0.5833333, 0.21666667), (0.5833333, 0.21666667), (0.5833333, 0.23333333), (0.575, 0.23333333), (0.575, 0.21666667), (0.575, 0.21666667), (0.575, 0.23333333), (0.56666666, 0.23333333), (0.56666666, 0.21666667), (0.56666666, 0.21666667), (0.56666666, 0.23333333), (0.55833334, 0.23333333), (0.55833334, 0.21666667), (0.55833334, 0.21666667), (0.55833334, 0.23333333), (0.55, 0.23333333), (0.55, 0.21666667), (0.55, 0.21666667), (0.55, 0.23333333), (0.5416667, 0.23333333), (0.5416667, 0.21666667), (0.5416667, 0.21666667), (0.5416667, 0.23333333), (0.53333336, 0.23333333), (0.53333336, 0.21666667), (0.53333336, 0.21666667), (0.53333336, 0.23333333), (0.525, 0.23333333), (0.525, 0.21666667), (0.525, 0.21666667), (0.525, 0.23333333), (0.51666665, 0.23333333), (0.51666665, 0.21666667), (0.51666665, 0.21666667), (0.51666665, 0.23333333), (0.5083333, 0.23333333), (0.5083333, 0.21666667), (0.5083333, 0.21666667), (0.5083333, 0.23333333), (0.5, 0.23333333), (0.5, 0.21666667), (0.5, 0.21666667), (0.5, 0.23333333), (0.49166667, 0.23333333), (0.49166667, 0.21666667), (0.49166667, 0.21666667), (0.49166667, 0.23333333), (0.48333332, 0.23333333), (0.48333332, 0.21666667), (0.48333332, 0.21666667), (0.48333332, 0.23333333), (0.475, 0.23333333), (0.475, 0.21666667), (0.475, 0.21666667), (0.475, 0.23333333), (0.46666667, 0.23333333), (0.46666667, 0.21666667), (0.46666667, 0.21666667), (0.46666667, 0.23333333), (0.45833334, 0.23333333), (0.45833334, 0.21666667), (0.45833334, 0.21666667), (0.45833334, 0.23333333), (0.45, 0.23333333), (0.45, 0.21666667), (0.45, 0.21666667), (0.45, 0.23333333), (0.44166666, 0.23333333), (0.44166666, 0.21666667), (0.44166666, 0.21666667), (0.44166666, 0.23333333), (0.43333334, 0.23333333), (0.43333334, 0.21666667), (0.43333334, 0.21666667), (0.43333334, 0.23333333), (0.425, 0.23333333), (0.425, 0.21666667), (0.425, 0.21666667), (0.425, 0.23333333), (0.41666666, 0.23333333), (0.41666666, 0.21666667), (0.41666666, 0.21666667), (0.41666666, 0.23333333), (0.40833333, 0.23333333), (0.40833333, 0.21666667), (0.40833333, 0.21666667), (0.40833333, 0.23333333), (0.4, 0.23333333), (0.4, 0.21666667), (0.4, 0.21666667), (0.4, 0.23333333), (0.39166668, 0.23333333), (0.39166668, 0.21666667), (0.39166668, 0.21666667), (0.39166668, 0.23333333), (0.38333333, 0.23333333), (0.38333333, 0.21666667), (0.38333333, 0.21666667), (0.38333333, 0.23333333), (0.375, 0.23333333), (0.375, 0.21666667), (0.375, 0.21666667), (0.375, 0.23333333), (0.36666667, 0.23333333), (0.36666667, 0.21666667), (0.36666667, 0.21666667), (0.36666667, 0.23333333), (0.35833332, 0.23333333), (0.35833332, 0.21666667), (0.35833332, 0.21666667), (0.35833332, 0.23333333), (0.35, 0.23333333), (0.35, 0.21666667), (0.35, 0.21666667), (0.35, 0.23333333), (0.34166667, 0.23333333), (0.34166667, 0.21666667), (0.34166667, 0.21666667), (0.34166667, 0.23333333), (0.33333334, 0.23333333), (0.33333334, 0.21666667), (0.33333334, 0.21666667), (0.33333334, 0.23333333), (0.325, 0.23333333), (0.325, 0.21666667), (0.325, 0.21666667), (0.325, 0.23333333), (0.31666666, 0.23333333), (0.31666666, 0.21666667), (0.31666666, 0.21666667), (0.31666666, 0.23333333), (0.30833334, 0.23333333), (0.30833334, 0.21666667), (0.30833334, 0.21666667), (0.30833334, 0.23333333), (0.3, 0.23333333), (0.3, 0.21666667), (0.3, 0.21666667), (0.3, 0.23333333), (0.29166666, 0.23333333), (0.29166666, 0.21666667), (0.29166666, 0.21666667), (0.29166666, 0.23333333), (0.28333333, 0.23333333), (0.28333333, 0.21666667), (0.28333333, 0.21666667), (0.28333333, 0.23333333), (0.275, 0.23333333), (0.275, 0.21666667), (0.275, 0.21666667), (0.275, 0.23333333), (0.26666668, 0.23333333), (0.26666668, 0.21666667), (0.26666668, 0.21666667), (0.26666668, 0.23333333), (0.25833333, 0.23333333), (0.25833333, 0.21666667), (0.25833333, 0.21666667), (0.25833333, 0.23333333), (0.25, 0.23333333), (0.25, 0.21666667), (0.25, 0.21666667), (0.25, 0.23333333), (0.24166666, 0.23333333), (0.24166666, 0.21666667), (0.24166666, 0.21666667), (0.24166666, 0.23333333), (0.23333333, 0.23333333), (0.23333333, 0.21666667), (0.23333333, 0.21666667), (0.23333333, 0.23333333), (0.225, 0.23333333), (0.225, 0.21666667), (0.225, 0.21666667), (0.225, 0.23333333), (0.21666667, 0.23333333), (0.21666667, 0.21666667), (0.21666667, 0.21666667), (0.21666667, 0.23333333), (0.20833333, 0.23333333), (0.20833333, 0.21666667), (0.20833333, 0.21666667), (0.20833333, 0.23333333), (0.2, 0.23333333), (0.2, 0.21666667), (0.2, 0.21666667), (0.2, 0.23333333), (0.19166666, 0.23333333), (0.19166666, 0.21666667), (0.19166666, 0.21666667), (0.19166666, 0.23333333), (0.18333334, 0.23333333), (0.18333334, 0.21666667), (0.18333334, 0.21666667), (0.18333334, 0.23333333), (0.175, 0.23333333), (0.175, 0.21666667), (0.175, 0.21666667), (0.175, 0.23333333), (0.16666667, 0.23333333), (0.16666667, 0.21666667), (0.16666667, 0.21666667), (0.16666667, 0.23333333), (0.15833333, 0.23333333), (0.15833333, 0.21666667), (0.15833333, 0.21666667), (0.15833333, 0.23333333), (0.15, 0.23333333), (0.15, 0.21666667), (0.15, 0.21666667), (0.15, 0.23333333), (0.14166667, 0.23333333), (0.14166667, 0.21666667), (0.14166667, 0.21666667), (0.14166667, 0.23333333), (0.13333334, 0.23333333), (0.13333334, 0.21666667), (0.13333334, 0.21666667), (0.13333334, 0.23333333), (0.125, 0.23333333), (0.125, 0.21666667), (0.125, 0.21666667), (0.125, 0.23333333), (0.11666667, 0.23333333), (0.11666667, 0.21666667), (0.11666667, 0.21666667), (0.11666667, 0.23333333), (0.108333334, 0.23333333), (0.108333334, 0.21666667), (0.108333334, 0.21666667), (0.108333334, 0.23333333), (0.1, 0.23333333), (0.1, 0.21666667), (0.1, 0.21666667), (0.1, 0.23333333), (0.09166667, 0.23333333), (0.09166667, 0.21666667), (0.09166667, 0.21666667), (0.09166667, 0.23333333), (0.083333336, 0.23333333), (0.083333336, 0.21666667), (0.083333336, 0.21666667), (0.083333336, 0.23333333), (0.075, 0.23333333), (0.075, 0.21666667), (0.075, 0.21666667), (0.075, 0.23333333), (0.06666667, 0.23333333), (0.06666667, 0.21666667), (0.06666667, 0.21666667), (0.06666667, 0.23333333), (0.058333334, 0.23333333), (0.058333334, 0.21666667), (0.058333334, 0.21666667), (0.058333334, 0.23333333), (0.05, 0.23333333), (0.05, 0.21666667), (0.05, 0.21666667), (0.05, 0.23333333), (0.041666668, 0.23333333), (0.041666668, 0.21666667), (0.041666668, 0.21666667), (0.041666668, 0.23333333), (0.033333335, 0.23333333), (0.033333335, 0.21666667), (0.033333335, 0.21666667), (0.033333335, 0.23333333), (0.025, 0.23333333), (0.025, 0.21666667), (0.025, 0.21666667), (0.025, 0.23333333), (0.016666668, 0.23333333), (0.016666668, 0.21666667), (0.016666668, 0.21666667), (0.016666668, 0.23333333), (0.008333334, 0.23333333), (0.008333334, 0.21666667), (0.008333334, 0.21666667), (0.008333334, 0.23333333), (0, 0.23333333), (0, 0.21666667), (1, 0.23333333), (1, 0.25), (0.9916667, 0.25), (0.9916667, 0.23333333), (0.9916667, 0.23333333), (0.9916667, 0.25), (0.98333335, 0.25), (0.98333335, 0.23333333), (0.98333335, 0.23333333), (0.98333335, 0.25), (0.975, 0.25), (0.975, 0.23333333), (0.975, 0.23333333), (0.975, 0.25), (0.96666664, 0.25), (0.96666664, 0.23333333), (0.96666664, 0.23333333), (0.96666664, 0.25), (0.9583333, 0.25), (0.9583333, 0.23333333), (0.9583333, 0.23333333), (0.9583333, 0.25), (0.95, 0.25), (0.95, 0.23333333), (0.95, 0.23333333), (0.95, 0.25), (0.94166666, 0.25), (0.94166666, 0.23333333), (0.94166666, 0.23333333), (0.94166666, 0.25), (0.93333334, 0.25), (0.93333334, 0.23333333), (0.93333334, 0.23333333), (0.93333334, 0.25), (0.925, 0.25), (0.925, 0.23333333), (0.925, 0.23333333), (0.925, 0.25), (0.9166667, 0.25), (0.9166667, 0.23333333), (0.9166667, 0.23333333), (0.9166667, 0.25), (0.90833336, 0.25), (0.90833336, 0.23333333), (0.90833336, 0.23333333), (0.90833336, 0.25), (0.9, 0.25), (0.9, 0.23333333), (0.9, 0.23333333), (0.9, 0.25), (0.89166665, 0.25), (0.89166665, 0.23333333), (0.89166665, 0.23333333), (0.89166665, 0.25), (0.8833333, 0.25), (0.8833333, 0.23333333), (0.8833333, 0.23333333), (0.8833333, 0.25), (0.875, 0.25), (0.875, 0.23333333), (0.875, 0.23333333), (0.875, 0.25), (0.8666667, 0.25), (0.8666667, 0.23333333), (0.8666667, 0.23333333), (0.8666667, 0.25), (0.85833335, 0.25), (0.85833335, 0.23333333), (0.85833335, 0.23333333), (0.85833335, 0.25), (0.85, 0.25), (0.85, 0.23333333), (0.85, 0.23333333), (0.85, 0.25), (0.84166664, 0.25), (0.84166664, 0.23333333), (0.84166664, 0.23333333), (0.84166664, 0.25), (0.8333333, 0.25), (0.8333333, 0.23333333), (0.8333333, 0.23333333), (0.8333333, 0.25), (0.825, 0.25), (0.825, 0.23333333), (0.825, 0.23333333), (0.825, 0.25), (0.81666666, 0.25), (0.81666666, 0.23333333), (0.81666666, 0.23333333), (0.81666666, 0.25), (0.80833334, 0.25), (0.80833334, 0.23333333), (0.80833334, 0.23333333), (0.80833334, 0.25), (0.8, 0.25), (0.8, 0.23333333), (0.8, 0.23333333), (0.8, 0.25), (0.7916667, 0.25), (0.7916667, 0.23333333), (0.7916667, 0.23333333), (0.7916667, 0.25), (0.78333336, 0.25), (0.78333336, 0.23333333), (0.78333336, 0.23333333), (0.78333336, 0.25), (0.775, 0.25), (0.775, 0.23333333), (0.775, 0.23333333), (0.775, 0.25), (0.76666665, 0.25), (0.76666665, 0.23333333), (0.76666665, 0.23333333), (0.76666665, 0.25), (0.7583333, 0.25), (0.7583333, 0.23333333), (0.7583333, 0.23333333), (0.7583333, 0.25), (0.75, 0.25), (0.75, 0.23333333), (0.75, 0.23333333), (0.75, 0.25), (0.7416667, 0.25), (0.7416667, 0.23333333), (0.7416667, 0.23333333), (0.7416667, 0.25), (0.73333335, 0.25), (0.73333335, 0.23333333), (0.73333335, 0.23333333), (0.73333335, 0.25), (0.725, 0.25), (0.725, 0.23333333), (0.725, 0.23333333), (0.725, 0.25), (0.71666664, 0.25), (0.71666664, 0.23333333), (0.71666664, 0.23333333), (0.71666664, 0.25), (0.7083333, 0.25), (0.7083333, 0.23333333), (0.7083333, 0.23333333), (0.7083333, 0.25), (0.7, 0.25), (0.7, 0.23333333), (0.7, 0.23333333), (0.7, 0.25), (0.69166666, 0.25), (0.69166666, 0.23333333), (0.69166666, 0.23333333), (0.69166666, 0.25), (0.68333334, 0.25), (0.68333334, 0.23333333), (0.68333334, 0.23333333), (0.68333334, 0.25), (0.675, 0.25), (0.675, 0.23333333), (0.675, 0.23333333), (0.675, 0.25), (0.6666667, 0.25), (0.6666667, 0.23333333), (0.6666667, 0.23333333), (0.6666667, 0.25), (0.65833336, 0.25), (0.65833336, 0.23333333), (0.65833336, 0.23333333), (0.65833336, 0.25), (0.65, 0.25), (0.65, 0.23333333), (0.65, 0.23333333), (0.65, 0.25), (0.64166665, 0.25), (0.64166665, 0.23333333), (0.64166665, 0.23333333), (0.64166665, 0.25), (0.6333333, 0.25), (0.6333333, 0.23333333), (0.6333333, 0.23333333), (0.6333333, 0.25), (0.625, 0.25), (0.625, 0.23333333), (0.625, 0.23333333), (0.625, 0.25), (0.6166667, 0.25), (0.6166667, 0.23333333), (0.6166667, 0.23333333), (0.6166667, 0.25), (0.60833335, 0.25), (0.60833335, 0.23333333), (0.60833335, 0.23333333), (0.60833335, 0.25), (0.6, 0.25), (0.6, 0.23333333), (0.6, 0.23333333), (0.6, 0.25), (0.59166664, 0.25), (0.59166664, 0.23333333), (0.59166664, 0.23333333), (0.59166664, 0.25), (0.5833333, 0.25), (0.5833333, 0.23333333), (0.5833333, 0.23333333), (0.5833333, 0.25), (0.575, 0.25), (0.575, 0.23333333), (0.575, 0.23333333), (0.575, 0.25), (0.56666666, 0.25), (0.56666666, 0.23333333), (0.56666666, 0.23333333), (0.56666666, 0.25), (0.55833334, 0.25), (0.55833334, 0.23333333), (0.55833334, 0.23333333), (0.55833334, 0.25), (0.55, 0.25), (0.55, 0.23333333), (0.55, 0.23333333), (0.55, 0.25), (0.5416667, 0.25), (0.5416667, 0.23333333), (0.5416667, 0.23333333), (0.5416667, 0.25), (0.53333336, 0.25), (0.53333336, 0.23333333), (0.53333336, 0.23333333), (0.53333336, 0.25), (0.525, 0.25), (0.525, 0.23333333), (0.525, 0.23333333), (0.525, 0.25), (0.51666665, 0.25), (0.51666665, 0.23333333), (0.51666665, 0.23333333), (0.51666665, 0.25), (0.5083333, 0.25), (0.5083333, 0.23333333), (0.5083333, 0.23333333), (0.5083333, 0.25), (0.5, 0.25), (0.5, 0.23333333), (0.5, 0.23333333), (0.5, 0.25), (0.49166667, 0.25), (0.49166667, 0.23333333), (0.49166667, 0.23333333), (0.49166667, 0.25), (0.48333332, 0.25), (0.48333332, 0.23333333), (0.48333332, 0.23333333), (0.48333332, 0.25), (0.475, 0.25), (0.475, 0.23333333), (0.475, 0.23333333), (0.475, 0.25), (0.46666667, 0.25), (0.46666667, 0.23333333), (0.46666667, 0.23333333), (0.46666667, 0.25), (0.45833334, 0.25), (0.45833334, 0.23333333), (0.45833334, 0.23333333), (0.45833334, 0.25), (0.45, 0.25), (0.45, 0.23333333), (0.45, 0.23333333), (0.45, 0.25), (0.44166666, 0.25), (0.44166666, 0.23333333), (0.44166666, 0.23333333), (0.44166666, 0.25), (0.43333334, 0.25), (0.43333334, 0.23333333), (0.43333334, 0.23333333), (0.43333334, 0.25), (0.425, 0.25), (0.425, 0.23333333), (0.425, 0.23333333), (0.425, 0.25), (0.41666666, 0.25), (0.41666666, 0.23333333), (0.41666666, 0.23333333), (0.41666666, 0.25), (0.40833333, 0.25), (0.40833333, 0.23333333), (0.40833333, 0.23333333), (0.40833333, 0.25), (0.4, 0.25), (0.4, 0.23333333), (0.4, 0.23333333), (0.4, 0.25), (0.39166668, 0.25), (0.39166668, 0.23333333), (0.39166668, 0.23333333), (0.39166668, 0.25), (0.38333333, 0.25), (0.38333333, 0.23333333), (0.38333333, 0.23333333), (0.38333333, 0.25), (0.375, 0.25), (0.375, 0.23333333), (0.375, 0.23333333), (0.375, 0.25), (0.36666667, 0.25), (0.36666667, 0.23333333), (0.36666667, 0.23333333), (0.36666667, 0.25), (0.35833332, 0.25), (0.35833332, 0.23333333), (0.35833332, 0.23333333), (0.35833332, 0.25), (0.35, 0.25), (0.35, 0.23333333), (0.35, 0.23333333), (0.35, 0.25), (0.34166667, 0.25), (0.34166667, 0.23333333), (0.34166667, 0.23333333), (0.34166667, 0.25), (0.33333334, 0.25), (0.33333334, 0.23333333), (0.33333334, 0.23333333), (0.33333334, 0.25), (0.325, 0.25), (0.325, 0.23333333), (0.325, 0.23333333), (0.325, 0.25), (0.31666666, 0.25), (0.31666666, 0.23333333), (0.31666666, 0.23333333), (0.31666666, 0.25), (0.30833334, 0.25), (0.30833334, 0.23333333), (0.30833334, 0.23333333), (0.30833334, 0.25), (0.3, 0.25), (0.3, 0.23333333), (0.3, 0.23333333), (0.3, 0.25), (0.29166666, 0.25), (0.29166666, 0.23333333), (0.29166666, 0.23333333), (0.29166666, 0.25), (0.28333333, 0.25), (0.28333333, 0.23333333), (0.28333333, 0.23333333), (0.28333333, 0.25), (0.275, 0.25), (0.275, 0.23333333), (0.275, 0.23333333), (0.275, 0.25), (0.26666668, 0.25), (0.26666668, 0.23333333), (0.26666668, 0.23333333), (0.26666668, 0.25), (0.25833333, 0.25), (0.25833333, 0.23333333), (0.25833333, 0.23333333), (0.25833333, 0.25), (0.25, 0.25), (0.25, 0.23333333), (0.25, 0.23333333), (0.25, 0.25), (0.24166666, 0.25), (0.24166666, 0.23333333), (0.24166666, 0.23333333), (0.24166666, 0.25), (0.23333333, 0.25), (0.23333333, 0.23333333), (0.23333333, 0.23333333), (0.23333333, 0.25), (0.225, 0.25), (0.225, 0.23333333), (0.225, 0.23333333), (0.225, 0.25), (0.21666667, 0.25), (0.21666667, 0.23333333), (0.21666667, 0.23333333), (0.21666667, 0.25), (0.20833333, 0.25), (0.20833333, 0.23333333), (0.20833333, 0.23333333), (0.20833333, 0.25), (0.2, 0.25), (0.2, 0.23333333), (0.2, 0.23333333), (0.2, 0.25), (0.19166666, 0.25), (0.19166666, 0.23333333), (0.19166666, 0.23333333), (0.19166666, 0.25), (0.18333334, 0.25), (0.18333334, 0.23333333), (0.18333334, 0.23333333), (0.18333334, 0.25), (0.175, 0.25), (0.175, 0.23333333), (0.175, 0.23333333), (0.175, 0.25), (0.16666667, 0.25), (0.16666667, 0.23333333), (0.16666667, 0.23333333), (0.16666667, 0.25), (0.15833333, 0.25), (0.15833333, 0.23333333), (0.15833333, 0.23333333), (0.15833333, 0.25), (0.15, 0.25), (0.15, 0.23333333), (0.15, 0.23333333), (0.15, 0.25), (0.14166667, 0.25), (0.14166667, 0.23333333), (0.14166667, 0.23333333), (0.14166667, 0.25), (0.13333334, 0.25), (0.13333334, 0.23333333), (0.13333334, 0.23333333), (0.13333334, 0.25), (0.125, 0.25), (0.125, 0.23333333), (0.125, 0.23333333), (0.125, 0.25), (0.11666667, 0.25), (0.11666667, 0.23333333), (0.11666667, 0.23333333), (0.11666667, 0.25), (0.108333334, 0.25), (0.108333334, 0.23333333), (0.108333334, 0.23333333), (0.108333334, 0.25), (0.1, 0.25), (0.1, 0.23333333), (0.1, 0.23333333), (0.1, 0.25), (0.09166667, 0.25), (0.09166667, 0.23333333), (0.09166667, 0.23333333), (0.09166667, 0.25), (0.083333336, 0.25), (0.083333336, 0.23333333), (0.083333336, 0.23333333), (0.083333336, 0.25), (0.075, 0.25), (0.075, 0.23333333), (0.075, 0.23333333), (0.075, 0.25), (0.06666667, 0.25), (0.06666667, 0.23333333), (0.06666667, 0.23333333), (0.06666667, 0.25), (0.058333334, 0.25), (0.058333334, 0.23333333), (0.058333334, 0.23333333), (0.058333334, 0.25), (0.05, 0.25), (0.05, 0.23333333), (0.05, 0.23333333), (0.05, 0.25), (0.041666668, 0.25), (0.041666668, 0.23333333), (0.041666668, 0.23333333), (0.041666668, 0.25), (0.033333335, 0.25), (0.033333335, 0.23333333), (0.033333335, 0.23333333), (0.033333335, 0.25), (0.025, 0.25), (0.025, 0.23333333), (0.025, 0.23333333), (0.025, 0.25), (0.016666668, 0.25), (0.016666668, 0.23333333), (0.016666668, 0.23333333), (0.016666668, 0.25), (0.008333334, 0.25), (0.008333334, 0.23333333), (0.008333334, 0.23333333), (0.008333334, 0.25), (0, 0.25), (0, 0.23333333), (1, 0.25), (1, 0.26666668), (0.9916667, 0.26666668), (0.9916667, 0.25), (0.9916667, 0.25), (0.9916667, 0.26666668), (0.98333335, 0.26666668), (0.98333335, 0.25), (0.98333335, 0.25), (0.98333335, 0.26666668), (0.975, 0.26666668), (0.975, 0.25), (0.975, 0.25), (0.975, 0.26666668), (0.96666664, 0.26666668), (0.96666664, 0.25), (0.96666664, 0.25), (0.96666664, 0.26666668), (0.9583333, 0.26666668), (0.9583333, 0.25), (0.9583333, 0.25), (0.9583333, 0.26666668), (0.95, 0.26666668), (0.95, 0.25), (0.95, 0.25), (0.95, 0.26666668), (0.94166666, 0.26666668), (0.94166666, 0.25), (0.94166666, 0.25), (0.94166666, 0.26666668), (0.93333334, 0.26666668), (0.93333334, 0.25), (0.93333334, 0.25), (0.93333334, 0.26666668), (0.925, 0.26666668), (0.925, 0.25), (0.925, 0.25), (0.925, 0.26666668), (0.9166667, 0.26666668), (0.9166667, 0.25), (0.9166667, 0.25), (0.9166667, 0.26666668), (0.90833336, 0.26666668), (0.90833336, 0.25), (0.90833336, 0.25), (0.90833336, 0.26666668), (0.9, 0.26666668), (0.9, 0.25), (0.9, 0.25), (0.9, 0.26666668), (0.89166665, 0.26666668), (0.89166665, 0.25), (0.89166665, 0.25), (0.89166665, 0.26666668), (0.8833333, 0.26666668), (0.8833333, 0.25), (0.8833333, 0.25), (0.8833333, 0.26666668), (0.875, 0.26666668), (0.875, 0.25), (0.875, 0.25), (0.875, 0.26666668), (0.8666667, 0.26666668), (0.8666667, 0.25), (0.8666667, 0.25), (0.8666667, 0.26666668), (0.85833335, 0.26666668), (0.85833335, 0.25), (0.85833335, 0.25), (0.85833335, 0.26666668), (0.85, 0.26666668), (0.85, 0.25), (0.85, 0.25), (0.85, 0.26666668), (0.84166664, 0.26666668), (0.84166664, 0.25), (0.84166664, 0.25), (0.84166664, 0.26666668), (0.8333333, 0.26666668), (0.8333333, 0.25), (0.8333333, 0.25), (0.8333333, 0.26666668), (0.825, 0.26666668), (0.825, 0.25), (0.825, 0.25), (0.825, 0.26666668), (0.81666666, 0.26666668), (0.81666666, 0.25), (0.81666666, 0.25), (0.81666666, 0.26666668), (0.80833334, 0.26666668), (0.80833334, 0.25), (0.80833334, 0.25), (0.80833334, 0.26666668), (0.8, 0.26666668), (0.8, 0.25), (0.8, 0.25), (0.8, 0.26666668), (0.7916667, 0.26666668), (0.7916667, 0.25), (0.7916667, 0.25), (0.7916667, 0.26666668), (0.78333336, 0.26666668), (0.78333336, 0.25), (0.78333336, 0.25), (0.78333336, 0.26666668), (0.775, 0.26666668), (0.775, 0.25), (0.775, 0.25), (0.775, 0.26666668), (0.76666665, 0.26666668), (0.76666665, 0.25), (0.76666665, 0.25), (0.76666665, 0.26666668), (0.7583333, 0.26666668), (0.7583333, 0.25), (0.7583333, 0.25), (0.7583333, 0.26666668), (0.75, 0.26666668), (0.75, 0.25), (0.75, 0.25), (0.75, 0.26666668), (0.7416667, 0.26666668), (0.7416667, 0.25), (0.7416667, 0.25), (0.7416667, 0.26666668), (0.73333335, 0.26666668), (0.73333335, 0.25), (0.73333335, 0.25), (0.73333335, 0.26666668), (0.725, 0.26666668), (0.725, 0.25), (0.725, 0.25), (0.725, 0.26666668), (0.71666664, 0.26666668), (0.71666664, 0.25), (0.71666664, 0.25), (0.71666664, 0.26666668), (0.7083333, 0.26666668), (0.7083333, 0.25), (0.7083333, 0.25), (0.7083333, 0.26666668), (0.7, 0.26666668), (0.7, 0.25), (0.7, 0.25), (0.7, 0.26666668), (0.69166666, 0.26666668), (0.69166666, 0.25), (0.69166666, 0.25), (0.69166666, 0.26666668), (0.68333334, 0.26666668), (0.68333334, 0.25), (0.68333334, 0.25), (0.68333334, 0.26666668), (0.675, 0.26666668), (0.675, 0.25), (0.675, 0.25), (0.675, 0.26666668), (0.6666667, 0.26666668), (0.6666667, 0.25), (0.6666667, 0.25), (0.6666667, 0.26666668), (0.65833336, 0.26666668), (0.65833336, 0.25), (0.65833336, 0.25), (0.65833336, 0.26666668), (0.65, 0.26666668), (0.65, 0.25), (0.65, 0.25), (0.65, 0.26666668), (0.64166665, 0.26666668), (0.64166665, 0.25), (0.64166665, 0.25), (0.64166665, 0.26666668), (0.6333333, 0.26666668), (0.6333333, 0.25), (0.6333333, 0.25), (0.6333333, 0.26666668), (0.625, 0.26666668), (0.625, 0.25), (0.625, 0.25), (0.625, 0.26666668), (0.6166667, 0.26666668), (0.6166667, 0.25), (0.6166667, 0.25), (0.6166667, 0.26666668), (0.60833335, 0.26666668), (0.60833335, 0.25), (0.60833335, 0.25), (0.60833335, 0.26666668), (0.6, 0.26666668), (0.6, 0.25), (0.6, 0.25), (0.6, 0.26666668), (0.59166664, 0.26666668), (0.59166664, 0.25), (0.59166664, 0.25), (0.59166664, 0.26666668), (0.5833333, 0.26666668), (0.5833333, 0.25), (0.5833333, 0.25), (0.5833333, 0.26666668), (0.575, 0.26666668), (0.575, 0.25), (0.575, 0.25), (0.575, 0.26666668), (0.56666666, 0.26666668), (0.56666666, 0.25), (0.56666666, 0.25), (0.56666666, 0.26666668), (0.55833334, 0.26666668), (0.55833334, 0.25), (0.55833334, 0.25), (0.55833334, 0.26666668), (0.55, 0.26666668), (0.55, 0.25), (0.55, 0.25), (0.55, 0.26666668), (0.5416667, 0.26666668), (0.5416667, 0.25), (0.5416667, 0.25), (0.5416667, 0.26666668), (0.53333336, 0.26666668), (0.53333336, 0.25), (0.53333336, 0.25), (0.53333336, 0.26666668), (0.525, 0.26666668), (0.525, 0.25), (0.525, 0.25), (0.525, 0.26666668), (0.51666665, 0.26666668), (0.51666665, 0.25), (0.51666665, 0.25), (0.51666665, 0.26666668), (0.5083333, 0.26666668), (0.5083333, 0.25), (0.5083333, 0.25), (0.5083333, 0.26666668), (0.5, 0.26666668), (0.5, 0.25), (0.5, 0.25), (0.5, 0.26666668), (0.49166667, 0.26666668), (0.49166667, 0.25), (0.49166667, 0.25), (0.49166667, 0.26666668), (0.48333332, 0.26666668), (0.48333332, 0.25), (0.48333332, 0.25), (0.48333332, 0.26666668), (0.475, 0.26666668), (0.475, 0.25), (0.475, 0.25), (0.475, 0.26666668), (0.46666667, 0.26666668), (0.46666667, 0.25), (0.46666667, 0.25), (0.46666667, 0.26666668), (0.45833334, 0.26666668), (0.45833334, 0.25), (0.45833334, 0.25), (0.45833334, 0.26666668), (0.45, 0.26666668), (0.45, 0.25), (0.45, 0.25), (0.45, 0.26666668), (0.44166666, 0.26666668), (0.44166666, 0.25), (0.44166666, 0.25), (0.44166666, 0.26666668), (0.43333334, 0.26666668), (0.43333334, 0.25), (0.43333334, 0.25), (0.43333334, 0.26666668), (0.425, 0.26666668), (0.425, 0.25), (0.425, 0.25), (0.425, 0.26666668), (0.41666666, 0.26666668), (0.41666666, 0.25), (0.41666666, 0.25), (0.41666666, 0.26666668), (0.40833333, 0.26666668), (0.40833333, 0.25), (0.40833333, 0.25), (0.40833333, 0.26666668), (0.4, 0.26666668), (0.4, 0.25), (0.4, 0.25), (0.4, 0.26666668), (0.39166668, 0.26666668), (0.39166668, 0.25), (0.39166668, 0.25), (0.39166668, 0.26666668), (0.38333333, 0.26666668), (0.38333333, 0.25), (0.38333333, 0.25), (0.38333333, 0.26666668), (0.375, 0.26666668), (0.375, 0.25), (0.375, 0.25), (0.375, 0.26666668), (0.36666667, 0.26666668), (0.36666667, 0.25), (0.36666667, 0.25), (0.36666667, 0.26666668), (0.35833332, 0.26666668), (0.35833332, 0.25), (0.35833332, 0.25), (0.35833332, 0.26666668), (0.35, 0.26666668), (0.35, 0.25), (0.35, 0.25), (0.35, 0.26666668), (0.34166667, 0.26666668), (0.34166667, 0.25), (0.34166667, 0.25), (0.34166667, 0.26666668), (0.33333334, 0.26666668), (0.33333334, 0.25), (0.33333334, 0.25), (0.33333334, 0.26666668), (0.325, 0.26666668), (0.325, 0.25), (0.325, 0.25), (0.325, 0.26666668), (0.31666666, 0.26666668), (0.31666666, 0.25), (0.31666666, 0.25), (0.31666666, 0.26666668), (0.30833334, 0.26666668), (0.30833334, 0.25), (0.30833334, 0.25), (0.30833334, 0.26666668), (0.3, 0.26666668), (0.3, 0.25), (0.3, 0.25), (0.3, 0.26666668), (0.29166666, 0.26666668), (0.29166666, 0.25), (0.29166666, 0.25), (0.29166666, 0.26666668), (0.28333333, 0.26666668), (0.28333333, 0.25), (0.28333333, 0.25), (0.28333333, 0.26666668), (0.275, 0.26666668), (0.275, 0.25), (0.275, 0.25), (0.275, 0.26666668), (0.26666668, 0.26666668), (0.26666668, 0.25), (0.26666668, 0.25), (0.26666668, 0.26666668), (0.25833333, 0.26666668), (0.25833333, 0.25), (0.25833333, 0.25), (0.25833333, 0.26666668), (0.25, 0.26666668), (0.25, 0.25), (0.25, 0.25), (0.25, 0.26666668), (0.24166666, 0.26666668), (0.24166666, 0.25), (0.24166666, 0.25), (0.24166666, 0.26666668), (0.23333333, 0.26666668), (0.23333333, 0.25), (0.23333333, 0.25), (0.23333333, 0.26666668), (0.225, 0.26666668), (0.225, 0.25), (0.225, 0.25), (0.225, 0.26666668), (0.21666667, 0.26666668), (0.21666667, 0.25), (0.21666667, 0.25), (0.21666667, 0.26666668), (0.20833333, 0.26666668), (0.20833333, 0.25), (0.20833333, 0.25), (0.20833333, 0.26666668), (0.2, 0.26666668), (0.2, 0.25), (0.2, 0.25), (0.2, 0.26666668), (0.19166666, 0.26666668), (0.19166666, 0.25), (0.19166666, 0.25), (0.19166666, 0.26666668), (0.18333334, 0.26666668), (0.18333334, 0.25), (0.18333334, 0.25), (0.18333334, 0.26666668), (0.175, 0.26666668), (0.175, 0.25), (0.175, 0.25), (0.175, 0.26666668), (0.16666667, 0.26666668), (0.16666667, 0.25), (0.16666667, 0.25), (0.16666667, 0.26666668), (0.15833333, 0.26666668), (0.15833333, 0.25), (0.15833333, 0.25), (0.15833333, 0.26666668), (0.15, 0.26666668), (0.15, 0.25), (0.15, 0.25), (0.15, 0.26666668), (0.14166667, 0.26666668), (0.14166667, 0.25), (0.14166667, 0.25), (0.14166667, 0.26666668), (0.13333334, 0.26666668), (0.13333334, 0.25), (0.13333334, 0.25), (0.13333334, 0.26666668), (0.125, 0.26666668), (0.125, 0.25), (0.125, 0.25), (0.125, 0.26666668), (0.11666667, 0.26666668), (0.11666667, 0.25), (0.11666667, 0.25), (0.11666667, 0.26666668), (0.108333334, 0.26666668), (0.108333334, 0.25), (0.108333334, 0.25), (0.108333334, 0.26666668), (0.1, 0.26666668), (0.1, 0.25), (0.1, 0.25), (0.1, 0.26666668), (0.09166667, 0.26666668), (0.09166667, 0.25), (0.09166667, 0.25), (0.09166667, 0.26666668), (0.083333336, 0.26666668), (0.083333336, 0.25), (0.083333336, 0.25), (0.083333336, 0.26666668), (0.075, 0.26666668), (0.075, 0.25), (0.075, 0.25), (0.075, 0.26666668), (0.06666667, 0.26666668), (0.06666667, 0.25), (0.06666667, 0.25), (0.06666667, 0.26666668), (0.058333334, 0.26666668), (0.058333334, 0.25), (0.058333334, 0.25), (0.058333334, 0.26666668), (0.05, 0.26666668), (0.05, 0.25), (0.05, 0.25), (0.05, 0.26666668), (0.041666668, 0.26666668), (0.041666668, 0.25), (0.041666668, 0.25), (0.041666668, 0.26666668), (0.033333335, 0.26666668), (0.033333335, 0.25), (0.033333335, 0.25), (0.033333335, 0.26666668), (0.025, 0.26666668), (0.025, 0.25), (0.025, 0.25), (0.025, 0.26666668), (0.016666668, 0.26666668), (0.016666668, 0.25), (0.016666668, 0.25), (0.016666668, 0.26666668), (0.008333334, 0.26666668), (0.008333334, 0.25), (0.008333334, 0.25), (0.008333334, 0.26666668), (0, 0.26666668), (0, 0.25), (1, 0.26666668), (1, 0.28333333), (0.9916667, 0.28333333), (0.9916667, 0.26666668), (0.9916667, 0.26666668), (0.9916667, 0.28333333), (0.98333335, 0.28333333), (0.98333335, 0.26666668), (0.98333335, 0.26666668), (0.98333335, 0.28333333), (0.975, 0.28333333), (0.975, 0.26666668), (0.975, 0.26666668), (0.975, 0.28333333), (0.96666664, 0.28333333), (0.96666664, 0.26666668), (0.96666664, 0.26666668), (0.96666664, 0.28333333), (0.9583333, 0.28333333), (0.9583333, 0.26666668), (0.9583333, 0.26666668), (0.9583333, 0.28333333), (0.95, 0.28333333), (0.95, 0.26666668), (0.95, 0.26666668), (0.95, 0.28333333), (0.94166666, 0.28333333), (0.94166666, 0.26666668), (0.94166666, 0.26666668), (0.94166666, 0.28333333), (0.93333334, 0.28333333), (0.93333334, 0.26666668), (0.93333334, 0.26666668), (0.93333334, 0.28333333), (0.925, 0.28333333), (0.925, 0.26666668), (0.925, 0.26666668), (0.925, 0.28333333), (0.9166667, 0.28333333), (0.9166667, 0.26666668), (0.9166667, 0.26666668), (0.9166667, 0.28333333), (0.90833336, 0.28333333), (0.90833336, 0.26666668), (0.90833336, 0.26666668), (0.90833336, 0.28333333), (0.9, 0.28333333), (0.9, 0.26666668), (0.9, 0.26666668), (0.9, 0.28333333), (0.89166665, 0.28333333), (0.89166665, 0.26666668), (0.89166665, 0.26666668), (0.89166665, 0.28333333), (0.8833333, 0.28333333), (0.8833333, 0.26666668), (0.8833333, 0.26666668), (0.8833333, 0.28333333), (0.875, 0.28333333), (0.875, 0.26666668), (0.875, 0.26666668), (0.875, 0.28333333), (0.8666667, 0.28333333), (0.8666667, 0.26666668), (0.8666667, 0.26666668), (0.8666667, 0.28333333), (0.85833335, 0.28333333), (0.85833335, 0.26666668), (0.85833335, 0.26666668), (0.85833335, 0.28333333), (0.85, 0.28333333), (0.85, 0.26666668), (0.85, 0.26666668), (0.85, 0.28333333), (0.84166664, 0.28333333), (0.84166664, 0.26666668), (0.84166664, 0.26666668), (0.84166664, 0.28333333), (0.8333333, 0.28333333), (0.8333333, 0.26666668), (0.8333333, 0.26666668), (0.8333333, 0.28333333), (0.825, 0.28333333), (0.825, 0.26666668), (0.825, 0.26666668), (0.825, 0.28333333), (0.81666666, 0.28333333), (0.81666666, 0.26666668), (0.81666666, 0.26666668), (0.81666666, 0.28333333), (0.80833334, 0.28333333), (0.80833334, 0.26666668), (0.80833334, 0.26666668), (0.80833334, 0.28333333), (0.8, 0.28333333), (0.8, 0.26666668), (0.8, 0.26666668), (0.8, 0.28333333), (0.7916667, 0.28333333), (0.7916667, 0.26666668), (0.7916667, 0.26666668), (0.7916667, 0.28333333), (0.78333336, 0.28333333), (0.78333336, 0.26666668), (0.78333336, 0.26666668), (0.78333336, 0.28333333), (0.775, 0.28333333), (0.775, 0.26666668), (0.775, 0.26666668), (0.775, 0.28333333), (0.76666665, 0.28333333), (0.76666665, 0.26666668), (0.76666665, 0.26666668), (0.76666665, 0.28333333), (0.7583333, 0.28333333), (0.7583333, 0.26666668), (0.7583333, 0.26666668), (0.7583333, 0.28333333), (0.75, 0.28333333), (0.75, 0.26666668), (0.75, 0.26666668), (0.75, 0.28333333), (0.7416667, 0.28333333), (0.7416667, 0.26666668), (0.7416667, 0.26666668), (0.7416667, 0.28333333), (0.73333335, 0.28333333), (0.73333335, 0.26666668), (0.73333335, 0.26666668), (0.73333335, 0.28333333), (0.725, 0.28333333), (0.725, 0.26666668), (0.725, 0.26666668), (0.725, 0.28333333), (0.71666664, 0.28333333), (0.71666664, 0.26666668), (0.71666664, 0.26666668), (0.71666664, 0.28333333), (0.7083333, 0.28333333), (0.7083333, 0.26666668), (0.7083333, 0.26666668), (0.7083333, 0.28333333), (0.7, 0.28333333), (0.7, 0.26666668), (0.7, 0.26666668), (0.7, 0.28333333), (0.69166666, 0.28333333), (0.69166666, 0.26666668), (0.69166666, 0.26666668), (0.69166666, 0.28333333), (0.68333334, 0.28333333), (0.68333334, 0.26666668), (0.68333334, 0.26666668), (0.68333334, 0.28333333), (0.675, 0.28333333), (0.675, 0.26666668), (0.675, 0.26666668), (0.675, 0.28333333), (0.6666667, 0.28333333), (0.6666667, 0.26666668), (0.6666667, 0.26666668), (0.6666667, 0.28333333), (0.65833336, 0.28333333), (0.65833336, 0.26666668), (0.65833336, 0.26666668), (0.65833336, 0.28333333), (0.65, 0.28333333), (0.65, 0.26666668), (0.65, 0.26666668), (0.65, 0.28333333), (0.64166665, 0.28333333), (0.64166665, 0.26666668), (0.64166665, 0.26666668), (0.64166665, 0.28333333), (0.6333333, 0.28333333), (0.6333333, 0.26666668), (0.6333333, 0.26666668), (0.6333333, 0.28333333), (0.625, 0.28333333), (0.625, 0.26666668), (0.625, 0.26666668), (0.625, 0.28333333), (0.6166667, 0.28333333), (0.6166667, 0.26666668), (0.6166667, 0.26666668), (0.6166667, 0.28333333), (0.60833335, 0.28333333), (0.60833335, 0.26666668), (0.60833335, 0.26666668), (0.60833335, 0.28333333), (0.6, 0.28333333), (0.6, 0.26666668), (0.6, 0.26666668), (0.6, 0.28333333), (0.59166664, 0.28333333), (0.59166664, 0.26666668), (0.59166664, 0.26666668), (0.59166664, 0.28333333), (0.5833333, 0.28333333), (0.5833333, 0.26666668), (0.5833333, 0.26666668), (0.5833333, 0.28333333), (0.575, 0.28333333), (0.575, 0.26666668), (0.575, 0.26666668), (0.575, 0.28333333), (0.56666666, 0.28333333), (0.56666666, 0.26666668), (0.56666666, 0.26666668), (0.56666666, 0.28333333), (0.55833334, 0.28333333), (0.55833334, 0.26666668), (0.55833334, 0.26666668), (0.55833334, 0.28333333), (0.55, 0.28333333), (0.55, 0.26666668), (0.55, 0.26666668), (0.55, 0.28333333), (0.5416667, 0.28333333), (0.5416667, 0.26666668), (0.5416667, 0.26666668), (0.5416667, 0.28333333), (0.53333336, 0.28333333), (0.53333336, 0.26666668), (0.53333336, 0.26666668), (0.53333336, 0.28333333), (0.525, 0.28333333), (0.525, 0.26666668), (0.525, 0.26666668), (0.525, 0.28333333), (0.51666665, 0.28333333), (0.51666665, 0.26666668), (0.51666665, 0.26666668), (0.51666665, 0.28333333), (0.5083333, 0.28333333), (0.5083333, 0.26666668), (0.5083333, 0.26666668), (0.5083333, 0.28333333), (0.5, 0.28333333), (0.5, 0.26666668), (0.5, 0.26666668), (0.5, 0.28333333), (0.49166667, 0.28333333), (0.49166667, 0.26666668), (0.49166667, 0.26666668), (0.49166667, 0.28333333), (0.48333332, 0.28333333), (0.48333332, 0.26666668), (0.48333332, 0.26666668), (0.48333332, 0.28333333), (0.475, 0.28333333), (0.475, 0.26666668), (0.475, 0.26666668), (0.475, 0.28333333), (0.46666667, 0.28333333), (0.46666667, 0.26666668), (0.46666667, 0.26666668), (0.46666667, 0.28333333), (0.45833334, 0.28333333), (0.45833334, 0.26666668), (0.45833334, 0.26666668), (0.45833334, 0.28333333), (0.45, 0.28333333), (0.45, 0.26666668), (0.45, 0.26666668), (0.45, 0.28333333), (0.44166666, 0.28333333), (0.44166666, 0.26666668), (0.44166666, 0.26666668), (0.44166666, 0.28333333), (0.43333334, 0.28333333), (0.43333334, 0.26666668), (0.43333334, 0.26666668), (0.43333334, 0.28333333), (0.425, 0.28333333), (0.425, 0.26666668), (0.425, 0.26666668), (0.425, 0.28333333), (0.41666666, 0.28333333), (0.41666666, 0.26666668), (0.41666666, 0.26666668), (0.41666666, 0.28333333), (0.40833333, 0.28333333), (0.40833333, 0.26666668), (0.40833333, 0.26666668), (0.40833333, 0.28333333), (0.4, 0.28333333), (0.4, 0.26666668), (0.4, 0.26666668), (0.4, 0.28333333), (0.39166668, 0.28333333), (0.39166668, 0.26666668), (0.39166668, 0.26666668), (0.39166668, 0.28333333), (0.38333333, 0.28333333), (0.38333333, 0.26666668), (0.38333333, 0.26666668), (0.38333333, 0.28333333), (0.375, 0.28333333), (0.375, 0.26666668), (0.375, 0.26666668), (0.375, 0.28333333), (0.36666667, 0.28333333), (0.36666667, 0.26666668), (0.36666667, 0.26666668), (0.36666667, 0.28333333), (0.35833332, 0.28333333), (0.35833332, 0.26666668), (0.35833332, 0.26666668), (0.35833332, 0.28333333), (0.35, 0.28333333), (0.35, 0.26666668), (0.35, 0.26666668), (0.35, 0.28333333), (0.34166667, 0.28333333), (0.34166667, 0.26666668), (0.34166667, 0.26666668), (0.34166667, 0.28333333), (0.33333334, 0.28333333), (0.33333334, 0.26666668), (0.33333334, 0.26666668), (0.33333334, 0.28333333), (0.325, 0.28333333), (0.325, 0.26666668), (0.325, 0.26666668), (0.325, 0.28333333), (0.31666666, 0.28333333), (0.31666666, 0.26666668), (0.31666666, 0.26666668), (0.31666666, 0.28333333), (0.30833334, 0.28333333), (0.30833334, 0.26666668), (0.30833334, 0.26666668), (0.30833334, 0.28333333), (0.3, 0.28333333), (0.3, 0.26666668), (0.3, 0.26666668), (0.3, 0.28333333), (0.29166666, 0.28333333), (0.29166666, 0.26666668), (0.29166666, 0.26666668), (0.29166666, 0.28333333), (0.28333333, 0.28333333), (0.28333333, 0.26666668), (0.28333333, 0.26666668), (0.28333333, 0.28333333), (0.275, 0.28333333), (0.275, 0.26666668), (0.275, 0.26666668), (0.275, 0.28333333), (0.26666668, 0.28333333), (0.26666668, 0.26666668), (0.26666668, 0.26666668), (0.26666668, 0.28333333), (0.25833333, 0.28333333), (0.25833333, 0.26666668), (0.25833333, 0.26666668), (0.25833333, 0.28333333), (0.25, 0.28333333), (0.25, 0.26666668), (0.25, 0.26666668), (0.25, 0.28333333), (0.24166666, 0.28333333), (0.24166666, 0.26666668), (0.24166666, 0.26666668), (0.24166666, 0.28333333), (0.23333333, 0.28333333), (0.23333333, 0.26666668), (0.23333333, 0.26666668), (0.23333333, 0.28333333), (0.225, 0.28333333), (0.225, 0.26666668), (0.225, 0.26666668), (0.225, 0.28333333), (0.21666667, 0.28333333), (0.21666667, 0.26666668), (0.21666667, 0.26666668), (0.21666667, 0.28333333), (0.20833333, 0.28333333), (0.20833333, 0.26666668), (0.20833333, 0.26666668), (0.20833333, 0.28333333), (0.2, 0.28333333), (0.2, 0.26666668), (0.2, 0.26666668), (0.2, 0.28333333), (0.19166666, 0.28333333), (0.19166666, 0.26666668), (0.19166666, 0.26666668), (0.19166666, 0.28333333), (0.18333334, 0.28333333), (0.18333334, 0.26666668), (0.18333334, 0.26666668), (0.18333334, 0.28333333), (0.175, 0.28333333), (0.175, 0.26666668), (0.175, 0.26666668), (0.175, 0.28333333), (0.16666667, 0.28333333), (0.16666667, 0.26666668), (0.16666667, 0.26666668), (0.16666667, 0.28333333), (0.15833333, 0.28333333), (0.15833333, 0.26666668), (0.15833333, 0.26666668), (0.15833333, 0.28333333), (0.15, 0.28333333), (0.15, 0.26666668), (0.15, 0.26666668), (0.15, 0.28333333), (0.14166667, 0.28333333), (0.14166667, 0.26666668), (0.14166667, 0.26666668), (0.14166667, 0.28333333), (0.13333334, 0.28333333), (0.13333334, 0.26666668), (0.13333334, 0.26666668), (0.13333334, 0.28333333), (0.125, 0.28333333), (0.125, 0.26666668), (0.125, 0.26666668), (0.125, 0.28333333), (0.11666667, 0.28333333), (0.11666667, 0.26666668), (0.11666667, 0.26666668), (0.11666667, 0.28333333), (0.108333334, 0.28333333), (0.108333334, 0.26666668), (0.108333334, 0.26666668), (0.108333334, 0.28333333), (0.1, 0.28333333), (0.1, 0.26666668), (0.1, 0.26666668), (0.1, 0.28333333), (0.09166667, 0.28333333), (0.09166667, 0.26666668), (0.09166667, 0.26666668), (0.09166667, 0.28333333), (0.083333336, 0.28333333), (0.083333336, 0.26666668), (0.083333336, 0.26666668), (0.083333336, 0.28333333), (0.075, 0.28333333), (0.075, 0.26666668), (0.075, 0.26666668), (0.075, 0.28333333), (0.06666667, 0.28333333), (0.06666667, 0.26666668), (0.06666667, 0.26666668), (0.06666667, 0.28333333), (0.058333334, 0.28333333), (0.058333334, 0.26666668), (0.058333334, 0.26666668), (0.058333334, 0.28333333), (0.05, 0.28333333), (0.05, 0.26666668), (0.05, 0.26666668), (0.05, 0.28333333), (0.041666668, 0.28333333), (0.041666668, 0.26666668), (0.041666668, 0.26666668), (0.041666668, 0.28333333), (0.033333335, 0.28333333), (0.033333335, 0.26666668), (0.033333335, 0.26666668), (0.033333335, 0.28333333), (0.025, 0.28333333), (0.025, 0.26666668), (0.025, 0.26666668), (0.025, 0.28333333), (0.016666668, 0.28333333), (0.016666668, 0.26666668), (0.016666668, 0.26666668), (0.016666668, 0.28333333), (0.008333334, 0.28333333), (0.008333334, 0.26666668), (0.008333334, 0.26666668), (0.008333334, 0.28333333), (0, 0.28333333), (0, 0.26666668), (1, 0.28333333), (1, 0.3), (0.9916667, 0.3), (0.9916667, 0.28333333), (0.9916667, 0.28333333), (0.9916667, 0.3), (0.98333335, 0.3), (0.98333335, 0.28333333), (0.98333335, 0.28333333), (0.98333335, 0.3), (0.975, 0.3), (0.975, 0.28333333), (0.975, 0.28333333), (0.975, 0.3), (0.96666664, 0.3), (0.96666664, 0.28333333), (0.96666664, 0.28333333), (0.96666664, 0.3), (0.9583333, 0.3), (0.9583333, 0.28333333), (0.9583333, 0.28333333), (0.9583333, 0.3), (0.95, 0.3), (0.95, 0.28333333), (0.95, 0.28333333), (0.95, 0.3), (0.94166666, 0.3), (0.94166666, 0.28333333), (0.94166666, 0.28333333), (0.94166666, 0.3), (0.93333334, 0.3), (0.93333334, 0.28333333), (0.93333334, 0.28333333), (0.93333334, 0.3), (0.925, 0.3), (0.925, 0.28333333), (0.925, 0.28333333), (0.925, 0.3), (0.9166667, 0.3), (0.9166667, 0.28333333), (0.9166667, 0.28333333), (0.9166667, 0.3), (0.90833336, 0.3), (0.90833336, 0.28333333), (0.90833336, 0.28333333), (0.90833336, 0.3), (0.9, 0.3), (0.9, 0.28333333), (0.9, 0.28333333), (0.9, 0.3), (0.89166665, 0.3), (0.89166665, 0.28333333), (0.89166665, 0.28333333), (0.89166665, 0.3), (0.8833333, 0.3), (0.8833333, 0.28333333), (0.8833333, 0.28333333), (0.8833333, 0.3), (0.875, 0.3), (0.875, 0.28333333), (0.875, 0.28333333), (0.875, 0.3), (0.8666667, 0.3), (0.8666667, 0.28333333), (0.8666667, 0.28333333), (0.8666667, 0.3), (0.85833335, 0.3), (0.85833335, 0.28333333), (0.85833335, 0.28333333), (0.85833335, 0.3), (0.85, 0.3), (0.85, 0.28333333), (0.85, 0.28333333), (0.85, 0.3), (0.84166664, 0.3), (0.84166664, 0.28333333), (0.84166664, 0.28333333), (0.84166664, 0.3), (0.8333333, 0.3), (0.8333333, 0.28333333), (0.8333333, 0.28333333), (0.8333333, 0.3), (0.825, 0.3), (0.825, 0.28333333), (0.825, 0.28333333), (0.825, 0.3), (0.81666666, 0.3), (0.81666666, 0.28333333), (0.81666666, 0.28333333), (0.81666666, 0.3), (0.80833334, 0.3), (0.80833334, 0.28333333), (0.80833334, 0.28333333), (0.80833334, 0.3), (0.8, 0.3), (0.8, 0.28333333), (0.8, 0.28333333), (0.8, 0.3), (0.7916667, 0.3), (0.7916667, 0.28333333), (0.7916667, 0.28333333), (0.7916667, 0.3), (0.78333336, 0.3), (0.78333336, 0.28333333), (0.78333336, 0.28333333), (0.78333336, 0.3), (0.775, 0.3), (0.775, 0.28333333), (0.775, 0.28333333), (0.775, 0.3), (0.76666665, 0.3), (0.76666665, 0.28333333), (0.76666665, 0.28333333), (0.76666665, 0.3), (0.7583333, 0.3), (0.7583333, 0.28333333), (0.7583333, 0.28333333), (0.7583333, 0.3), (0.75, 0.3), (0.75, 0.28333333), (0.75, 0.28333333), (0.75, 0.3), (0.7416667, 0.3), (0.7416667, 0.28333333), (0.7416667, 0.28333333), (0.7416667, 0.3), (0.73333335, 0.3), (0.73333335, 0.28333333), (0.73333335, 0.28333333), (0.73333335, 0.3), (0.725, 0.3), (0.725, 0.28333333), (0.725, 0.28333333), (0.725, 0.3), (0.71666664, 0.3), (0.71666664, 0.28333333), (0.71666664, 0.28333333), (0.71666664, 0.3), (0.7083333, 0.3), (0.7083333, 0.28333333), (0.7083333, 0.28333333), (0.7083333, 0.3), (0.7, 0.3), (0.7, 0.28333333), (0.7, 0.28333333), (0.7, 0.3), (0.69166666, 0.3), (0.69166666, 0.28333333), (0.69166666, 0.28333333), (0.69166666, 0.3), (0.68333334, 0.3), (0.68333334, 0.28333333), (0.68333334, 0.28333333), (0.68333334, 0.3), (0.675, 0.3), (0.675, 0.28333333), (0.675, 0.28333333), (0.675, 0.3), (0.6666667, 0.3), (0.6666667, 0.28333333), (0.6666667, 0.28333333), (0.6666667, 0.3), (0.65833336, 0.3), (0.65833336, 0.28333333), (0.65833336, 0.28333333), (0.65833336, 0.3), (0.65, 0.3), (0.65, 0.28333333), (0.65, 0.28333333), (0.65, 0.3), (0.64166665, 0.3), (0.64166665, 0.28333333), (0.64166665, 0.28333333), (0.64166665, 0.3), (0.6333333, 0.3), (0.6333333, 0.28333333), (0.6333333, 0.28333333), (0.6333333, 0.3), (0.625, 0.3), (0.625, 0.28333333), (0.625, 0.28333333), (0.625, 0.3), (0.6166667, 0.3), (0.6166667, 0.28333333), (0.6166667, 0.28333333), (0.6166667, 0.3), (0.60833335, 0.3), (0.60833335, 0.28333333), (0.60833335, 0.28333333), (0.60833335, 0.3), (0.6, 0.3), (0.6, 0.28333333), (0.6, 0.28333333), (0.6, 0.3), (0.59166664, 0.3), (0.59166664, 0.28333333), (0.59166664, 0.28333333), (0.59166664, 0.3), (0.5833333, 0.3), (0.5833333, 0.28333333), (0.5833333, 0.28333333), (0.5833333, 0.3), (0.575, 0.3), (0.575, 0.28333333), (0.575, 0.28333333), (0.575, 0.3), (0.56666666, 0.3), (0.56666666, 0.28333333), (0.56666666, 0.28333333), (0.56666666, 0.3), (0.55833334, 0.3), (0.55833334, 0.28333333), (0.55833334, 0.28333333), (0.55833334, 0.3), (0.55, 0.3), (0.55, 0.28333333), (0.55, 0.28333333), (0.55, 0.3), (0.5416667, 0.3), (0.5416667, 0.28333333), (0.5416667, 0.28333333), (0.5416667, 0.3), (0.53333336, 0.3), (0.53333336, 0.28333333), (0.53333336, 0.28333333), (0.53333336, 0.3), (0.525, 0.3), (0.525, 0.28333333), (0.525, 0.28333333), (0.525, 0.3), (0.51666665, 0.3), (0.51666665, 0.28333333), (0.51666665, 0.28333333), (0.51666665, 0.3), (0.5083333, 0.3), (0.5083333, 0.28333333), (0.5083333, 0.28333333), (0.5083333, 0.3), (0.5, 0.3), (0.5, 0.28333333), (0.5, 0.28333333), (0.5, 0.3), (0.49166667, 0.3), (0.49166667, 0.28333333), (0.49166667, 0.28333333), (0.49166667, 0.3), (0.48333332, 0.3), (0.48333332, 0.28333333), (0.48333332, 0.28333333), (0.48333332, 0.3), (0.475, 0.3), (0.475, 0.28333333), (0.475, 0.28333333), (0.475, 0.3), (0.46666667, 0.3), (0.46666667, 0.28333333), (0.46666667, 0.28333333), (0.46666667, 0.3), (0.45833334, 0.3), (0.45833334, 0.28333333), (0.45833334, 0.28333333), (0.45833334, 0.3), (0.45, 0.3), (0.45, 0.28333333), (0.45, 0.28333333), (0.45, 0.3), (0.44166666, 0.3), (0.44166666, 0.28333333), (0.44166666, 0.28333333), (0.44166666, 0.3), (0.43333334, 0.3), (0.43333334, 0.28333333), (0.43333334, 0.28333333), (0.43333334, 0.3), (0.425, 0.3), (0.425, 0.28333333), (0.425, 0.28333333), (0.425, 0.3), (0.41666666, 0.3), (0.41666666, 0.28333333), (0.41666666, 0.28333333), (0.41666666, 0.3), (0.40833333, 0.3), (0.40833333, 0.28333333), (0.40833333, 0.28333333), (0.40833333, 0.3), (0.4, 0.3), (0.4, 0.28333333), (0.4, 0.28333333), (0.4, 0.3), (0.39166668, 0.3), (0.39166668, 0.28333333), (0.39166668, 0.28333333), (0.39166668, 0.3), (0.38333333, 0.3), (0.38333333, 0.28333333), (0.38333333, 0.28333333), (0.38333333, 0.3), (0.375, 0.3), (0.375, 0.28333333), (0.375, 0.28333333), (0.375, 0.3), (0.36666667, 0.3), (0.36666667, 0.28333333), (0.36666667, 0.28333333), (0.36666667, 0.3), (0.35833332, 0.3), (0.35833332, 0.28333333), (0.35833332, 0.28333333), (0.35833332, 0.3), (0.35, 0.3), (0.35, 0.28333333), (0.35, 0.28333333), (0.35, 0.3), (0.34166667, 0.3), (0.34166667, 0.28333333), (0.34166667, 0.28333333), (0.34166667, 0.3), (0.33333334, 0.3), (0.33333334, 0.28333333), (0.33333334, 0.28333333), (0.33333334, 0.3), (0.325, 0.3), (0.325, 0.28333333), (0.325, 0.28333333), (0.325, 0.3), (0.31666666, 0.3), (0.31666666, 0.28333333), (0.31666666, 0.28333333), (0.31666666, 0.3), (0.30833334, 0.3), (0.30833334, 0.28333333), (0.30833334, 0.28333333), (0.30833334, 0.3), (0.3, 0.3), (0.3, 0.28333333), (0.3, 0.28333333), (0.3, 0.3), (0.29166666, 0.3), (0.29166666, 0.28333333), (0.29166666, 0.28333333), (0.29166666, 0.3), (0.28333333, 0.3), (0.28333333, 0.28333333), (0.28333333, 0.28333333), (0.28333333, 0.3), (0.275, 0.3), (0.275, 0.28333333), (0.275, 0.28333333), (0.275, 0.3), (0.26666668, 0.3), (0.26666668, 0.28333333), (0.26666668, 0.28333333), (0.26666668, 0.3), (0.25833333, 0.3), (0.25833333, 0.28333333), (0.25833333, 0.28333333), (0.25833333, 0.3), (0.25, 0.3), (0.25, 0.28333333), (0.25, 0.28333333), (0.25, 0.3), (0.24166666, 0.3), (0.24166666, 0.28333333), (0.24166666, 0.28333333), (0.24166666, 0.3), (0.23333333, 0.3), (0.23333333, 0.28333333), (0.23333333, 0.28333333), (0.23333333, 0.3), (0.225, 0.3), (0.225, 0.28333333), (0.225, 0.28333333), (0.225, 0.3), (0.21666667, 0.3), (0.21666667, 0.28333333), (0.21666667, 0.28333333), (0.21666667, 0.3), (0.20833333, 0.3), (0.20833333, 0.28333333), (0.20833333, 0.28333333), (0.20833333, 0.3), (0.2, 0.3), (0.2, 0.28333333), (0.2, 0.28333333), (0.2, 0.3), (0.19166666, 0.3), (0.19166666, 0.28333333), (0.19166666, 0.28333333), (0.19166666, 0.3), (0.18333334, 0.3), (0.18333334, 0.28333333), (0.18333334, 0.28333333), (0.18333334, 0.3), (0.175, 0.3), (0.175, 0.28333333), (0.175, 0.28333333), (0.175, 0.3), (0.16666667, 0.3), (0.16666667, 0.28333333), (0.16666667, 0.28333333), (0.16666667, 0.3), (0.15833333, 0.3), (0.15833333, 0.28333333), (0.15833333, 0.28333333), (0.15833333, 0.3), (0.15, 0.3), (0.15, 0.28333333), (0.15, 0.28333333), (0.15, 0.3), (0.14166667, 0.3), (0.14166667, 0.28333333), (0.14166667, 0.28333333), (0.14166667, 0.3), (0.13333334, 0.3), (0.13333334, 0.28333333), (0.13333334, 0.28333333), (0.13333334, 0.3), (0.125, 0.3), (0.125, 0.28333333), (0.125, 0.28333333), (0.125, 0.3), (0.11666667, 0.3), (0.11666667, 0.28333333), (0.11666667, 0.28333333), (0.11666667, 0.3), (0.108333334, 0.3), (0.108333334, 0.28333333), (0.108333334, 0.28333333), (0.108333334, 0.3), (0.1, 0.3), (0.1, 0.28333333), (0.1, 0.28333333), (0.1, 0.3), (0.09166667, 0.3), (0.09166667, 0.28333333), (0.09166667, 0.28333333), (0.09166667, 0.3), (0.083333336, 0.3), (0.083333336, 0.28333333), (0.083333336, 0.28333333), (0.083333336, 0.3), (0.075, 0.3), (0.075, 0.28333333), (0.075, 0.28333333), (0.075, 0.3), (0.06666667, 0.3), (0.06666667, 0.28333333), (0.06666667, 0.28333333), (0.06666667, 0.3), (0.058333334, 0.3), (0.058333334, 0.28333333), (0.058333334, 0.28333333), (0.058333334, 0.3), (0.05, 0.3), (0.05, 0.28333333), (0.05, 0.28333333), (0.05, 0.3), (0.041666668, 0.3), (0.041666668, 0.28333333), (0.041666668, 0.28333333), (0.041666668, 0.3), (0.033333335, 0.3), (0.033333335, 0.28333333), (0.033333335, 0.28333333), (0.033333335, 0.3), (0.025, 0.3), (0.025, 0.28333333), (0.025, 0.28333333), (0.025, 0.3), (0.016666668, 0.3), (0.016666668, 0.28333333), (0.016666668, 0.28333333), (0.016666668, 0.3), (0.008333334, 0.3), (0.008333334, 0.28333333), (0.008333334, 0.28333333), (0.008333334, 0.3), (0, 0.3), (0, 0.28333333), (1, 0.3), (1, 0.31666666), (0.9916667, 0.31666666), (0.9916667, 0.3), (0.9916667, 0.3), (0.9916667, 0.31666666), (0.98333335, 0.31666666), (0.98333335, 0.3), (0.98333335, 0.3), (0.98333335, 0.31666666), (0.975, 0.31666666), (0.975, 0.3), (0.975, 0.3), (0.975, 0.31666666), (0.96666664, 0.31666666), (0.96666664, 0.3), (0.96666664, 0.3), (0.96666664, 0.31666666), (0.9583333, 0.31666666), (0.9583333, 0.3), (0.9583333, 0.3), (0.9583333, 0.31666666), (0.95, 0.31666666), (0.95, 0.3), (0.95, 0.3), (0.95, 0.31666666), (0.94166666, 0.31666666), (0.94166666, 0.3), (0.94166666, 0.3), (0.94166666, 0.31666666), (0.93333334, 0.31666666), (0.93333334, 0.3), (0.93333334, 0.3), (0.93333334, 0.31666666), (0.925, 0.31666666), (0.925, 0.3), (0.925, 0.3), (0.925, 0.31666666), (0.9166667, 0.31666666), (0.9166667, 0.3), (0.9166667, 0.3), (0.9166667, 0.31666666), (0.90833336, 0.31666666), (0.90833336, 0.3), (0.90833336, 0.3), (0.90833336, 0.31666666), (0.9, 0.31666666), (0.9, 0.3), (0.9, 0.3), (0.9, 0.31666666), (0.89166665, 0.31666666), (0.89166665, 0.3), (0.89166665, 0.3), (0.89166665, 0.31666666), (0.8833333, 0.31666666), (0.8833333, 0.3), (0.8833333, 0.3), (0.8833333, 0.31666666), (0.875, 0.31666666), (0.875, 0.3), (0.875, 0.3), (0.875, 0.31666666), (0.8666667, 0.31666666), (0.8666667, 0.3), (0.8666667, 0.3), (0.8666667, 0.31666666), (0.85833335, 0.31666666), (0.85833335, 0.3), (0.85833335, 0.3), (0.85833335, 0.31666666), (0.85, 0.31666666), (0.85, 0.3), (0.85, 0.3), (0.85, 0.31666666), (0.84166664, 0.31666666), (0.84166664, 0.3), (0.84166664, 0.3), (0.84166664, 0.31666666), (0.8333333, 0.31666666), (0.8333333, 0.3), (0.8333333, 0.3), (0.8333333, 0.31666666), (0.825, 0.31666666), (0.825, 0.3), (0.825, 0.3), (0.825, 0.31666666), (0.81666666, 0.31666666), (0.81666666, 0.3), (0.81666666, 0.3), (0.81666666, 0.31666666), (0.80833334, 0.31666666), (0.80833334, 0.3), (0.80833334, 0.3), (0.80833334, 0.31666666), (0.8, 0.31666666), (0.8, 0.3), (0.8, 0.3), (0.8, 0.31666666), (0.7916667, 0.31666666), (0.7916667, 0.3), (0.7916667, 0.3), (0.7916667, 0.31666666), (0.78333336, 0.31666666), (0.78333336, 0.3), (0.78333336, 0.3), (0.78333336, 0.31666666), (0.775, 0.31666666), (0.775, 0.3), (0.775, 0.3), (0.775, 0.31666666), (0.76666665, 0.31666666), (0.76666665, 0.3), (0.76666665, 0.3), (0.76666665, 0.31666666), (0.7583333, 0.31666666), (0.7583333, 0.3), (0.7583333, 0.3), (0.7583333, 0.31666666), (0.75, 0.31666666), (0.75, 0.3), (0.75, 0.3), (0.75, 0.31666666), (0.7416667, 0.31666666), (0.7416667, 0.3), (0.7416667, 0.3), (0.7416667, 0.31666666), (0.73333335, 0.31666666), (0.73333335, 0.3), (0.73333335, 0.3), (0.73333335, 0.31666666), (0.725, 0.31666666), (0.725, 0.3), (0.725, 0.3), (0.725, 0.31666666), (0.71666664, 0.31666666), (0.71666664, 0.3), (0.71666664, 0.3), (0.71666664, 0.31666666), (0.7083333, 0.31666666), (0.7083333, 0.3), (0.7083333, 0.3), (0.7083333, 0.31666666), (0.7, 0.31666666), (0.7, 0.3), (0.7, 0.3), (0.7, 0.31666666), (0.69166666, 0.31666666), (0.69166666, 0.3), (0.69166666, 0.3), (0.69166666, 0.31666666), (0.68333334, 0.31666666), (0.68333334, 0.3), (0.68333334, 0.3), (0.68333334, 0.31666666), (0.675, 0.31666666), (0.675, 0.3), (0.675, 0.3), (0.675, 0.31666666), (0.6666667, 0.31666666), (0.6666667, 0.3), (0.6666667, 0.3), (0.6666667, 0.31666666), (0.65833336, 0.31666666), (0.65833336, 0.3), (0.65833336, 0.3), (0.65833336, 0.31666666), (0.65, 0.31666666), (0.65, 0.3), (0.65, 0.3), (0.65, 0.31666666), (0.64166665, 0.31666666), (0.64166665, 0.3), (0.64166665, 0.3), (0.64166665, 0.31666666), (0.6333333, 0.31666666), (0.6333333, 0.3), (0.6333333, 0.3), (0.6333333, 0.31666666), (0.625, 0.31666666), (0.625, 0.3), (0.625, 0.3), (0.625, 0.31666666), (0.6166667, 0.31666666), (0.6166667, 0.3), (0.6166667, 0.3), (0.6166667, 0.31666666), (0.60833335, 0.31666666), (0.60833335, 0.3), (0.60833335, 0.3), (0.60833335, 0.31666666), (0.6, 0.31666666), (0.6, 0.3), (0.6, 0.3), (0.6, 0.31666666), (0.59166664, 0.31666666), (0.59166664, 0.3), (0.59166664, 0.3), (0.59166664, 0.31666666), (0.5833333, 0.31666666), (0.5833333, 0.3), (0.5833333, 0.3), (0.5833333, 0.31666666), (0.575, 0.31666666), (0.575, 0.3), (0.575, 0.3), (0.575, 0.31666666), (0.56666666, 0.31666666), (0.56666666, 0.3), (0.56666666, 0.3), (0.56666666, 0.31666666), (0.55833334, 0.31666666), (0.55833334, 0.3), (0.55833334, 0.3), (0.55833334, 0.31666666), (0.55, 0.31666666), (0.55, 0.3), (0.55, 0.3), (0.55, 0.31666666), (0.5416667, 0.31666666), (0.5416667, 0.3), (0.5416667, 0.3), (0.5416667, 0.31666666), (0.53333336, 0.31666666), (0.53333336, 0.3), (0.53333336, 0.3), (0.53333336, 0.31666666), (0.525, 0.31666666), (0.525, 0.3), (0.525, 0.3), (0.525, 0.31666666), (0.51666665, 0.31666666), (0.51666665, 0.3), (0.51666665, 0.3), (0.51666665, 0.31666666), (0.5083333, 0.31666666), (0.5083333, 0.3), (0.5083333, 0.3), (0.5083333, 0.31666666), (0.5, 0.31666666), (0.5, 0.3), (0.5, 0.3), (0.5, 0.31666666), (0.49166667, 0.31666666), (0.49166667, 0.3), (0.49166667, 0.3), (0.49166667, 0.31666666), (0.48333332, 0.31666666), (0.48333332, 0.3), (0.48333332, 0.3), (0.48333332, 0.31666666), (0.475, 0.31666666), (0.475, 0.3), (0.475, 0.3), (0.475, 0.31666666), (0.46666667, 0.31666666), (0.46666667, 0.3), (0.46666667, 0.3), (0.46666667, 0.31666666), (0.45833334, 0.31666666), (0.45833334, 0.3), (0.45833334, 0.3), (0.45833334, 0.31666666), (0.45, 0.31666666), (0.45, 0.3), (0.45, 0.3), (0.45, 0.31666666), (0.44166666, 0.31666666), (0.44166666, 0.3), (0.44166666, 0.3), (0.44166666, 0.31666666), (0.43333334, 0.31666666), (0.43333334, 0.3), (0.43333334, 0.3), (0.43333334, 0.31666666), (0.425, 0.31666666), (0.425, 0.3), (0.425, 0.3), (0.425, 0.31666666), (0.41666666, 0.31666666), (0.41666666, 0.3), (0.41666666, 0.3), (0.41666666, 0.31666666), (0.40833333, 0.31666666), (0.40833333, 0.3), (0.40833333, 0.3), (0.40833333, 0.31666666), (0.4, 0.31666666), (0.4, 0.3), (0.4, 0.3), (0.4, 0.31666666), (0.39166668, 0.31666666), (0.39166668, 0.3), (0.39166668, 0.3), (0.39166668, 0.31666666), (0.38333333, 0.31666666), (0.38333333, 0.3), (0.38333333, 0.3), (0.38333333, 0.31666666), (0.375, 0.31666666), (0.375, 0.3), (0.375, 0.3), (0.375, 0.31666666), (0.36666667, 0.31666666), (0.36666667, 0.3), (0.36666667, 0.3), (0.36666667, 0.31666666), (0.35833332, 0.31666666), (0.35833332, 0.3), (0.35833332, 0.3), (0.35833332, 0.31666666), (0.35, 0.31666666), (0.35, 0.3), (0.35, 0.3), (0.35, 0.31666666), (0.34166667, 0.31666666), (0.34166667, 0.3), (0.34166667, 0.3), (0.34166667, 0.31666666), (0.33333334, 0.31666666), (0.33333334, 0.3), (0.33333334, 0.3), (0.33333334, 0.31666666), (0.325, 0.31666666), (0.325, 0.3), (0.325, 0.3), (0.325, 0.31666666), (0.31666666, 0.31666666), (0.31666666, 0.3), (0.31666666, 0.3), (0.31666666, 0.31666666), (0.30833334, 0.31666666), (0.30833334, 0.3), (0.30833334, 0.3), (0.30833334, 0.31666666), (0.3, 0.31666666), (0.3, 0.3), (0.3, 0.3), (0.3, 0.31666666), (0.29166666, 0.31666666), (0.29166666, 0.3), (0.29166666, 0.3), (0.29166666, 0.31666666), (0.28333333, 0.31666666), (0.28333333, 0.3), (0.28333333, 0.3), (0.28333333, 0.31666666), (0.275, 0.31666666), (0.275, 0.3), (0.275, 0.3), (0.275, 0.31666666), (0.26666668, 0.31666666), (0.26666668, 0.3), (0.26666668, 0.3), (0.26666668, 0.31666666), (0.25833333, 0.31666666), (0.25833333, 0.3), (0.25833333, 0.3), (0.25833333, 0.31666666), (0.25, 0.31666666), (0.25, 0.3), (0.25, 0.3), (0.25, 0.31666666), (0.24166666, 0.31666666), (0.24166666, 0.3), (0.24166666, 0.3), (0.24166666, 0.31666666), (0.23333333, 0.31666666), (0.23333333, 0.3), (0.23333333, 0.3), (0.23333333, 0.31666666), (0.225, 0.31666666), (0.225, 0.3), (0.225, 0.3), (0.225, 0.31666666), (0.21666667, 0.31666666), (0.21666667, 0.3), (0.21666667, 0.3), (0.21666667, 0.31666666), (0.20833333, 0.31666666), (0.20833333, 0.3), (0.20833333, 0.3), (0.20833333, 0.31666666), (0.2, 0.31666666), (0.2, 0.3), (0.2, 0.3), (0.2, 0.31666666), (0.19166666, 0.31666666), (0.19166666, 0.3), (0.19166666, 0.3), (0.19166666, 0.31666666), (0.18333334, 0.31666666), (0.18333334, 0.3), (0.18333334, 0.3), (0.18333334, 0.31666666), (0.175, 0.31666666), (0.175, 0.3), (0.175, 0.3), (0.175, 0.31666666), (0.16666667, 0.31666666), (0.16666667, 0.3), (0.16666667, 0.3), (0.16666667, 0.31666666), (0.15833333, 0.31666666), (0.15833333, 0.3), (0.15833333, 0.3), (0.15833333, 0.31666666), (0.15, 0.31666666), (0.15, 0.3), (0.15, 0.3), (0.15, 0.31666666), (0.14166667, 0.31666666), (0.14166667, 0.3), (0.14166667, 0.3), (0.14166667, 0.31666666), (0.13333334, 0.31666666), (0.13333334, 0.3), (0.13333334, 0.3), (0.13333334, 0.31666666), (0.125, 0.31666666), (0.125, 0.3), (0.125, 0.3), (0.125, 0.31666666), (0.11666667, 0.31666666), (0.11666667, 0.3), (0.11666667, 0.3), (0.11666667, 0.31666666), (0.108333334, 0.31666666), (0.108333334, 0.3), (0.108333334, 0.3), (0.108333334, 0.31666666), (0.1, 0.31666666), (0.1, 0.3), (0.1, 0.3), (0.1, 0.31666666), (0.09166667, 0.31666666), (0.09166667, 0.3), (0.09166667, 0.3), (0.09166667, 0.31666666), (0.083333336, 0.31666666), (0.083333336, 0.3), (0.083333336, 0.3), (0.083333336, 0.31666666), (0.075, 0.31666666), (0.075, 0.3), (0.075, 0.3), (0.075, 0.31666666), (0.06666667, 0.31666666), (0.06666667, 0.3), (0.06666667, 0.3), (0.06666667, 0.31666666), (0.058333334, 0.31666666), (0.058333334, 0.3), (0.058333334, 0.3), (0.058333334, 0.31666666), (0.05, 0.31666666), (0.05, 0.3), (0.05, 0.3), (0.05, 0.31666666), (0.041666668, 0.31666666), (0.041666668, 0.3), (0.041666668, 0.3), (0.041666668, 0.31666666), (0.033333335, 0.31666666), (0.033333335, 0.3), (0.033333335, 0.3), (0.033333335, 0.31666666), (0.025, 0.31666666), (0.025, 0.3), (0.025, 0.3), (0.025, 0.31666666), (0.016666668, 0.31666666), (0.016666668, 0.3), (0.016666668, 0.3), (0.016666668, 0.31666666), (0.008333334, 0.31666666), (0.008333334, 0.3), (0.008333334, 0.3), (0.008333334, 0.31666666), (0, 0.31666666), (0, 0.3), (1, 0.31666666), (1, 0.33333334), (0.9916667, 0.33333334), (0.9916667, 0.31666666), (0.9916667, 0.31666666), (0.9916667, 0.33333334), (0.98333335, 0.33333334), (0.98333335, 0.31666666), (0.98333335, 0.31666666), (0.98333335, 0.33333334), (0.975, 0.33333334), (0.975, 0.31666666), (0.975, 0.31666666), (0.975, 0.33333334), (0.96666664, 0.33333334), (0.96666664, 0.31666666), (0.96666664, 0.31666666), (0.96666664, 0.33333334), (0.9583333, 0.33333334), (0.9583333, 0.31666666), (0.9583333, 0.31666666), (0.9583333, 0.33333334), (0.95, 0.33333334), (0.95, 0.31666666), (0.95, 0.31666666), (0.95, 0.33333334), (0.94166666, 0.33333334), (0.94166666, 0.31666666), (0.94166666, 0.31666666), (0.94166666, 0.33333334), (0.93333334, 0.33333334), (0.93333334, 0.31666666), (0.93333334, 0.31666666), (0.93333334, 0.33333334), (0.925, 0.33333334), (0.925, 0.31666666), (0.925, 0.31666666), (0.925, 0.33333334), (0.9166667, 0.33333334), (0.9166667, 0.31666666), (0.9166667, 0.31666666), (0.9166667, 0.33333334), (0.90833336, 0.33333334), (0.90833336, 0.31666666), (0.90833336, 0.31666666), (0.90833336, 0.33333334), (0.9, 0.33333334), (0.9, 0.31666666), (0.9, 0.31666666), (0.9, 0.33333334), (0.89166665, 0.33333334), (0.89166665, 0.31666666), (0.89166665, 0.31666666), (0.89166665, 0.33333334), (0.8833333, 0.33333334), (0.8833333, 0.31666666), (0.8833333, 0.31666666), (0.8833333, 0.33333334), (0.875, 0.33333334), (0.875, 0.31666666), (0.875, 0.31666666), (0.875, 0.33333334), (0.8666667, 0.33333334), (0.8666667, 0.31666666), (0.8666667, 0.31666666), (0.8666667, 0.33333334), (0.85833335, 0.33333334), (0.85833335, 0.31666666), (0.85833335, 0.31666666), (0.85833335, 0.33333334), (0.85, 0.33333334), (0.85, 0.31666666), (0.85, 0.31666666), (0.85, 0.33333334), (0.84166664, 0.33333334), (0.84166664, 0.31666666), (0.84166664, 0.31666666), (0.84166664, 0.33333334), (0.8333333, 0.33333334), (0.8333333, 0.31666666), (0.8333333, 0.31666666), (0.8333333, 0.33333334), (0.825, 0.33333334), (0.825, 0.31666666), (0.825, 0.31666666), (0.825, 0.33333334), (0.81666666, 0.33333334), (0.81666666, 0.31666666), (0.81666666, 0.31666666), (0.81666666, 0.33333334), (0.80833334, 0.33333334), (0.80833334, 0.31666666), (0.80833334, 0.31666666), (0.80833334, 0.33333334), (0.8, 0.33333334), (0.8, 0.31666666), (0.8, 0.31666666), (0.8, 0.33333334), (0.7916667, 0.33333334), (0.7916667, 0.31666666), (0.7916667, 0.31666666), (0.7916667, 0.33333334), (0.78333336, 0.33333334), (0.78333336, 0.31666666), (0.78333336, 0.31666666), (0.78333336, 0.33333334), (0.775, 0.33333334), (0.775, 0.31666666), (0.775, 0.31666666), (0.775, 0.33333334), (0.76666665, 0.33333334), (0.76666665, 0.31666666), (0.76666665, 0.31666666), (0.76666665, 0.33333334), (0.7583333, 0.33333334), (0.7583333, 0.31666666), (0.7583333, 0.31666666), (0.7583333, 0.33333334), (0.75, 0.33333334), (0.75, 0.31666666), (0.75, 0.31666666), (0.75, 0.33333334), (0.7416667, 0.33333334), (0.7416667, 0.31666666), (0.7416667, 0.31666666), (0.7416667, 0.33333334), (0.73333335, 0.33333334), (0.73333335, 0.31666666), (0.73333335, 0.31666666), (0.73333335, 0.33333334), (0.725, 0.33333334), (0.725, 0.31666666), (0.725, 0.31666666), (0.725, 0.33333334), (0.71666664, 0.33333334), (0.71666664, 0.31666666), (0.71666664, 0.31666666), (0.71666664, 0.33333334), (0.7083333, 0.33333334), (0.7083333, 0.31666666), (0.7083333, 0.31666666), (0.7083333, 0.33333334), (0.7, 0.33333334), (0.7, 0.31666666), (0.7, 0.31666666), (0.7, 0.33333334), (0.69166666, 0.33333334), (0.69166666, 0.31666666), (0.69166666, 0.31666666), (0.69166666, 0.33333334), (0.68333334, 0.33333334), (0.68333334, 0.31666666), (0.68333334, 0.31666666), (0.68333334, 0.33333334), (0.675, 0.33333334), (0.675, 0.31666666), (0.675, 0.31666666), (0.675, 0.33333334), (0.6666667, 0.33333334), (0.6666667, 0.31666666), (0.6666667, 0.31666666), (0.6666667, 0.33333334), (0.65833336, 0.33333334), (0.65833336, 0.31666666), (0.65833336, 0.31666666), (0.65833336, 0.33333334), (0.65, 0.33333334), (0.65, 0.31666666), (0.65, 0.31666666), (0.65, 0.33333334), (0.64166665, 0.33333334), (0.64166665, 0.31666666), (0.64166665, 0.31666666), (0.64166665, 0.33333334), (0.6333333, 0.33333334), (0.6333333, 0.31666666), (0.6333333, 0.31666666), (0.6333333, 0.33333334), (0.625, 0.33333334), (0.625, 0.31666666), (0.625, 0.31666666), (0.625, 0.33333334), (0.6166667, 0.33333334), (0.6166667, 0.31666666), (0.6166667, 0.31666666), (0.6166667, 0.33333334), (0.60833335, 0.33333334), (0.60833335, 0.31666666), (0.60833335, 0.31666666), (0.60833335, 0.33333334), (0.6, 0.33333334), (0.6, 0.31666666), (0.6, 0.31666666), (0.6, 0.33333334), (0.59166664, 0.33333334), (0.59166664, 0.31666666), (0.59166664, 0.31666666), (0.59166664, 0.33333334), (0.5833333, 0.33333334), (0.5833333, 0.31666666), (0.5833333, 0.31666666), (0.5833333, 0.33333334), (0.575, 0.33333334), (0.575, 0.31666666), (0.575, 0.31666666), (0.575, 0.33333334), (0.56666666, 0.33333334), (0.56666666, 0.31666666), (0.56666666, 0.31666666), (0.56666666, 0.33333334), (0.55833334, 0.33333334), (0.55833334, 0.31666666), (0.55833334, 0.31666666), (0.55833334, 0.33333334), (0.55, 0.33333334), (0.55, 0.31666666), (0.55, 0.31666666), (0.55, 0.33333334), (0.5416667, 0.33333334), (0.5416667, 0.31666666), (0.5416667, 0.31666666), (0.5416667, 0.33333334), (0.53333336, 0.33333334), (0.53333336, 0.31666666), (0.53333336, 0.31666666), (0.53333336, 0.33333334), (0.525, 0.33333334), (0.525, 0.31666666), (0.525, 0.31666666), (0.525, 0.33333334), (0.51666665, 0.33333334), (0.51666665, 0.31666666), (0.51666665, 0.31666666), (0.51666665, 0.33333334), (0.5083333, 0.33333334), (0.5083333, 0.31666666), (0.5083333, 0.31666666), (0.5083333, 0.33333334), (0.5, 0.33333334), (0.5, 0.31666666), (0.5, 0.31666666), (0.5, 0.33333334), (0.49166667, 0.33333334), (0.49166667, 0.31666666), (0.49166667, 0.31666666), (0.49166667, 0.33333334), (0.48333332, 0.33333334), (0.48333332, 0.31666666), (0.48333332, 0.31666666), (0.48333332, 0.33333334), (0.475, 0.33333334), (0.475, 0.31666666), (0.475, 0.31666666), (0.475, 0.33333334), (0.46666667, 0.33333334), (0.46666667, 0.31666666), (0.46666667, 0.31666666), (0.46666667, 0.33333334), (0.45833334, 0.33333334), (0.45833334, 0.31666666), (0.45833334, 0.31666666), (0.45833334, 0.33333334), (0.45, 0.33333334), (0.45, 0.31666666), (0.45, 0.31666666), (0.45, 0.33333334), (0.44166666, 0.33333334), (0.44166666, 0.31666666), (0.44166666, 0.31666666), (0.44166666, 0.33333334), (0.43333334, 0.33333334), (0.43333334, 0.31666666), (0.43333334, 0.31666666), (0.43333334, 0.33333334), (0.425, 0.33333334), (0.425, 0.31666666), (0.425, 0.31666666), (0.425, 0.33333334), (0.41666666, 0.33333334), (0.41666666, 0.31666666), (0.41666666, 0.31666666), (0.41666666, 0.33333334), (0.40833333, 0.33333334), (0.40833333, 0.31666666), (0.40833333, 0.31666666), (0.40833333, 0.33333334), (0.4, 0.33333334), (0.4, 0.31666666), (0.4, 0.31666666), (0.4, 0.33333334), (0.39166668, 0.33333334), (0.39166668, 0.31666666), (0.39166668, 0.31666666), (0.39166668, 0.33333334), (0.38333333, 0.33333334), (0.38333333, 0.31666666), (0.38333333, 0.31666666), (0.38333333, 0.33333334), (0.375, 0.33333334), (0.375, 0.31666666), (0.375, 0.31666666), (0.375, 0.33333334), (0.36666667, 0.33333334), (0.36666667, 0.31666666), (0.36666667, 0.31666666), (0.36666667, 0.33333334), (0.35833332, 0.33333334), (0.35833332, 0.31666666), (0.35833332, 0.31666666), (0.35833332, 0.33333334), (0.35, 0.33333334), (0.35, 0.31666666), (0.35, 0.31666666), (0.35, 0.33333334), (0.34166667, 0.33333334), (0.34166667, 0.31666666), (0.34166667, 0.31666666), (0.34166667, 0.33333334), (0.33333334, 0.33333334), (0.33333334, 0.31666666), (0.33333334, 0.31666666), (0.33333334, 0.33333334), (0.325, 0.33333334), (0.325, 0.31666666), (0.325, 0.31666666), (0.325, 0.33333334), (0.31666666, 0.33333334), (0.31666666, 0.31666666), (0.31666666, 0.31666666), (0.31666666, 0.33333334), (0.30833334, 0.33333334), (0.30833334, 0.31666666), (0.30833334, 0.31666666), (0.30833334, 0.33333334), (0.3, 0.33333334), (0.3, 0.31666666), (0.3, 0.31666666), (0.3, 0.33333334), (0.29166666, 0.33333334), (0.29166666, 0.31666666), (0.29166666, 0.31666666), (0.29166666, 0.33333334), (0.28333333, 0.33333334), (0.28333333, 0.31666666), (0.28333333, 0.31666666), (0.28333333, 0.33333334), (0.275, 0.33333334), (0.275, 0.31666666), (0.275, 0.31666666), (0.275, 0.33333334), (0.26666668, 0.33333334), (0.26666668, 0.31666666), (0.26666668, 0.31666666), (0.26666668, 0.33333334), (0.25833333, 0.33333334), (0.25833333, 0.31666666), (0.25833333, 0.31666666), (0.25833333, 0.33333334), (0.25, 0.33333334), (0.25, 0.31666666), (0.25, 0.31666666), (0.25, 0.33333334), (0.24166666, 0.33333334), (0.24166666, 0.31666666), (0.24166666, 0.31666666), (0.24166666, 0.33333334), (0.23333333, 0.33333334), (0.23333333, 0.31666666), (0.23333333, 0.31666666), (0.23333333, 0.33333334), (0.225, 0.33333334), (0.225, 0.31666666), (0.225, 0.31666666), (0.225, 0.33333334), (0.21666667, 0.33333334), (0.21666667, 0.31666666), (0.21666667, 0.31666666), (0.21666667, 0.33333334), (0.20833333, 0.33333334), (0.20833333, 0.31666666), (0.20833333, 0.31666666), (0.20833333, 0.33333334), (0.2, 0.33333334), (0.2, 0.31666666), (0.2, 0.31666666), (0.2, 0.33333334), (0.19166666, 0.33333334), (0.19166666, 0.31666666), (0.19166666, 0.31666666), (0.19166666, 0.33333334), (0.18333334, 0.33333334), (0.18333334, 0.31666666), (0.18333334, 0.31666666), (0.18333334, 0.33333334), (0.175, 0.33333334), (0.175, 0.31666666), (0.175, 0.31666666), (0.175, 0.33333334), (0.16666667, 0.33333334), (0.16666667, 0.31666666), (0.16666667, 0.31666666), (0.16666667, 0.33333334), (0.15833333, 0.33333334), (0.15833333, 0.31666666), (0.15833333, 0.31666666), (0.15833333, 0.33333334), (0.15, 0.33333334), (0.15, 0.31666666), (0.15, 0.31666666), (0.15, 0.33333334), (0.14166667, 0.33333334), (0.14166667, 0.31666666), (0.14166667, 0.31666666), (0.14166667, 0.33333334), (0.13333334, 0.33333334), (0.13333334, 0.31666666), (0.13333334, 0.31666666), (0.13333334, 0.33333334), (0.125, 0.33333334), (0.125, 0.31666666), (0.125, 0.31666666), (0.125, 0.33333334), (0.11666667, 0.33333334), (0.11666667, 0.31666666), (0.11666667, 0.31666666), (0.11666667, 0.33333334), (0.108333334, 0.33333334), (0.108333334, 0.31666666), (0.108333334, 0.31666666), (0.108333334, 0.33333334), (0.1, 0.33333334), (0.1, 0.31666666), (0.1, 0.31666666), (0.1, 0.33333334), (0.09166667, 0.33333334), (0.09166667, 0.31666666), (0.09166667, 0.31666666), (0.09166667, 0.33333334), (0.083333336, 0.33333334), (0.083333336, 0.31666666), (0.083333336, 0.31666666), (0.083333336, 0.33333334), (0.075, 0.33333334), (0.075, 0.31666666), (0.075, 0.31666666), (0.075, 0.33333334), (0.06666667, 0.33333334), (0.06666667, 0.31666666), (0.06666667, 0.31666666), (0.06666667, 0.33333334), (0.058333334, 0.33333334), (0.058333334, 0.31666666), (0.058333334, 0.31666666), (0.058333334, 0.33333334), (0.05, 0.33333334), (0.05, 0.31666666), (0.05, 0.31666666), (0.05, 0.33333334), (0.041666668, 0.33333334), (0.041666668, 0.31666666), (0.041666668, 0.31666666), (0.041666668, 0.33333334), (0.033333335, 0.33333334), (0.033333335, 0.31666666), (0.033333335, 0.31666666), (0.033333335, 0.33333334), (0.025, 0.33333334), (0.025, 0.31666666), (0.025, 0.31666666), (0.025, 0.33333334), (0.016666668, 0.33333334), (0.016666668, 0.31666666), (0.016666668, 0.31666666), (0.016666668, 0.33333334), (0.008333334, 0.33333334), (0.008333334, 0.31666666), (0.008333334, 0.31666666), (0.008333334, 0.33333334), (0, 0.33333334), (0, 0.31666666), (1, 0.33333334), (1, 0.35), (0.9916667, 0.35), (0.9916667, 0.33333334), (0.9916667, 0.33333334), (0.9916667, 0.35), (0.98333335, 0.35), (0.98333335, 0.33333334), (0.98333335, 0.33333334), (0.98333335, 0.35), (0.975, 0.35), (0.975, 0.33333334), (0.975, 0.33333334), (0.975, 0.35), (0.96666664, 0.35), (0.96666664, 0.33333334), (0.96666664, 0.33333334), (0.96666664, 0.35), (0.9583333, 0.35), (0.9583333, 0.33333334), (0.9583333, 0.33333334), (0.9583333, 0.35), (0.95, 0.35), (0.95, 0.33333334), (0.95, 0.33333334), (0.95, 0.35), (0.94166666, 0.35), (0.94166666, 0.33333334), (0.94166666, 0.33333334), (0.94166666, 0.35), (0.93333334, 0.35), (0.93333334, 0.33333334), (0.93333334, 0.33333334), (0.93333334, 0.35), (0.925, 0.35), (0.925, 0.33333334), (0.925, 0.33333334), (0.925, 0.35), (0.9166667, 0.35), (0.9166667, 0.33333334), (0.9166667, 0.33333334), (0.9166667, 0.35), (0.90833336, 0.35), (0.90833336, 0.33333334), (0.90833336, 0.33333334), (0.90833336, 0.35), (0.9, 0.35), (0.9, 0.33333334), (0.9, 0.33333334), (0.9, 0.35), (0.89166665, 0.35), (0.89166665, 0.33333334), (0.89166665, 0.33333334), (0.89166665, 0.35), (0.8833333, 0.35), (0.8833333, 0.33333334), (0.8833333, 0.33333334), (0.8833333, 0.35), (0.875, 0.35), (0.875, 0.33333334), (0.875, 0.33333334), (0.875, 0.35), (0.8666667, 0.35), (0.8666667, 0.33333334), (0.8666667, 0.33333334), (0.8666667, 0.35), (0.85833335, 0.35), (0.85833335, 0.33333334), (0.85833335, 0.33333334), (0.85833335, 0.35), (0.85, 0.35), (0.85, 0.33333334), (0.85, 0.33333334), (0.85, 0.35), (0.84166664, 0.35), (0.84166664, 0.33333334), (0.84166664, 0.33333334), (0.84166664, 0.35), (0.8333333, 0.35), (0.8333333, 0.33333334), (0.8333333, 0.33333334), (0.8333333, 0.35), (0.825, 0.35), (0.825, 0.33333334), (0.825, 0.33333334), (0.825, 0.35), (0.81666666, 0.35), (0.81666666, 0.33333334), (0.81666666, 0.33333334), (0.81666666, 0.35), (0.80833334, 0.35), (0.80833334, 0.33333334), (0.80833334, 0.33333334), (0.80833334, 0.35), (0.8, 0.35), (0.8, 0.33333334), (0.8, 0.33333334), (0.8, 0.35), (0.7916667, 0.35), (0.7916667, 0.33333334), (0.7916667, 0.33333334), (0.7916667, 0.35), (0.78333336, 0.35), (0.78333336, 0.33333334), (0.78333336, 0.33333334), (0.78333336, 0.35), (0.775, 0.35), (0.775, 0.33333334), (0.775, 0.33333334), (0.775, 0.35), (0.76666665, 0.35), (0.76666665, 0.33333334), (0.76666665, 0.33333334), (0.76666665, 0.35), (0.7583333, 0.35), (0.7583333, 0.33333334), (0.7583333, 0.33333334), (0.7583333, 0.35), (0.75, 0.35), (0.75, 0.33333334), (0.75, 0.33333334), (0.75, 0.35), (0.7416667, 0.35), (0.7416667, 0.33333334), (0.7416667, 0.33333334), (0.7416667, 0.35), (0.73333335, 0.35), (0.73333335, 0.33333334), (0.73333335, 0.33333334), (0.73333335, 0.35), (0.725, 0.35), (0.725, 0.33333334), (0.725, 0.33333334), (0.725, 0.35), (0.71666664, 0.35), (0.71666664, 0.33333334), (0.71666664, 0.33333334), (0.71666664, 0.35), (0.7083333, 0.35), (0.7083333, 0.33333334), (0.7083333, 0.33333334), (0.7083333, 0.35), (0.7, 0.35), (0.7, 0.33333334), (0.7, 0.33333334), (0.7, 0.35), (0.69166666, 0.35), (0.69166666, 0.33333334), (0.69166666, 0.33333334), (0.69166666, 0.35), (0.68333334, 0.35), (0.68333334, 0.33333334), (0.68333334, 0.33333334), (0.68333334, 0.35), (0.675, 0.35), (0.675, 0.33333334), (0.675, 0.33333334), (0.675, 0.35), (0.6666667, 0.35), (0.6666667, 0.33333334), (0.6666667, 0.33333334), (0.6666667, 0.35), (0.65833336, 0.35), (0.65833336, 0.33333334), (0.65833336, 0.33333334), (0.65833336, 0.35), (0.65, 0.35), (0.65, 0.33333334), (0.65, 0.33333334), (0.65, 0.35), (0.64166665, 0.35), (0.64166665, 0.33333334), (0.64166665, 0.33333334), (0.64166665, 0.35), (0.6333333, 0.35), (0.6333333, 0.33333334), (0.6333333, 0.33333334), (0.6333333, 0.35), (0.625, 0.35), (0.625, 0.33333334), (0.625, 0.33333334), (0.625, 0.35), (0.6166667, 0.35), (0.6166667, 0.33333334), (0.6166667, 0.33333334), (0.6166667, 0.35), (0.60833335, 0.35), (0.60833335, 0.33333334), (0.60833335, 0.33333334), (0.60833335, 0.35), (0.6, 0.35), (0.6, 0.33333334), (0.6, 0.33333334), (0.6, 0.35), (0.59166664, 0.35), (0.59166664, 0.33333334), (0.59166664, 0.33333334), (0.59166664, 0.35), (0.5833333, 0.35), (0.5833333, 0.33333334), (0.5833333, 0.33333334), (0.5833333, 0.35), (0.575, 0.35), (0.575, 0.33333334), (0.575, 0.33333334), (0.575, 0.35), (0.56666666, 0.35), (0.56666666, 0.33333334), (0.56666666, 0.33333334), (0.56666666, 0.35), (0.55833334, 0.35), (0.55833334, 0.33333334), (0.55833334, 0.33333334), (0.55833334, 0.35), (0.55, 0.35), (0.55, 0.33333334), (0.55, 0.33333334), (0.55, 0.35), (0.5416667, 0.35), (0.5416667, 0.33333334), (0.5416667, 0.33333334), (0.5416667, 0.35), (0.53333336, 0.35), (0.53333336, 0.33333334), (0.53333336, 0.33333334), (0.53333336, 0.35), (0.525, 0.35), (0.525, 0.33333334), (0.525, 0.33333334), (0.525, 0.35), (0.51666665, 0.35), (0.51666665, 0.33333334), (0.51666665, 0.33333334), (0.51666665, 0.35), (0.5083333, 0.35), (0.5083333, 0.33333334), (0.5083333, 0.33333334), (0.5083333, 0.35), (0.5, 0.35), (0.5, 0.33333334), (0.5, 0.33333334), (0.5, 0.35), (0.49166667, 0.35), (0.49166667, 0.33333334), (0.49166667, 0.33333334), (0.49166667, 0.35), (0.48333332, 0.35), (0.48333332, 0.33333334), (0.48333332, 0.33333334), (0.48333332, 0.35), (0.475, 0.35), (0.475, 0.33333334), (0.475, 0.33333334), (0.475, 0.35), (0.46666667, 0.35), (0.46666667, 0.33333334), (0.46666667, 0.33333334), (0.46666667, 0.35), (0.45833334, 0.35), (0.45833334, 0.33333334), (0.45833334, 0.33333334), (0.45833334, 0.35), (0.45, 0.35), (0.45, 0.33333334), (0.45, 0.33333334), (0.45, 0.35), (0.44166666, 0.35), (0.44166666, 0.33333334), (0.44166666, 0.33333334), (0.44166666, 0.35), (0.43333334, 0.35), (0.43333334, 0.33333334), (0.43333334, 0.33333334), (0.43333334, 0.35), (0.425, 0.35), (0.425, 0.33333334), (0.425, 0.33333334), (0.425, 0.35), (0.41666666, 0.35), (0.41666666, 0.33333334), (0.41666666, 0.33333334), (0.41666666, 0.35), (0.40833333, 0.35), (0.40833333, 0.33333334), (0.40833333, 0.33333334), (0.40833333, 0.35), (0.4, 0.35), (0.4, 0.33333334), (0.4, 0.33333334), (0.4, 0.35), (0.39166668, 0.35), (0.39166668, 0.33333334), (0.39166668, 0.33333334), (0.39166668, 0.35), (0.38333333, 0.35), (0.38333333, 0.33333334), (0.38333333, 0.33333334), (0.38333333, 0.35), (0.375, 0.35), (0.375, 0.33333334), (0.375, 0.33333334), (0.375, 0.35), (0.36666667, 0.35), (0.36666667, 0.33333334), (0.36666667, 0.33333334), (0.36666667, 0.35), (0.35833332, 0.35), (0.35833332, 0.33333334), (0.35833332, 0.33333334), (0.35833332, 0.35), (0.35, 0.35), (0.35, 0.33333334), (0.35, 0.33333334), (0.35, 0.35), (0.34166667, 0.35), (0.34166667, 0.33333334), (0.34166667, 0.33333334), (0.34166667, 0.35), (0.33333334, 0.35), (0.33333334, 0.33333334), (0.33333334, 0.33333334), (0.33333334, 0.35), (0.325, 0.35), (0.325, 0.33333334), (0.325, 0.33333334), (0.325, 0.35), (0.31666666, 0.35), (0.31666666, 0.33333334), (0.31666666, 0.33333334), (0.31666666, 0.35), (0.30833334, 0.35), (0.30833334, 0.33333334), (0.30833334, 0.33333334), (0.30833334, 0.35), (0.3, 0.35), (0.3, 0.33333334), (0.3, 0.33333334), (0.3, 0.35), (0.29166666, 0.35), (0.29166666, 0.33333334), (0.29166666, 0.33333334), (0.29166666, 0.35), (0.28333333, 0.35), (0.28333333, 0.33333334), (0.28333333, 0.33333334), (0.28333333, 0.35), (0.275, 0.35), (0.275, 0.33333334), (0.275, 0.33333334), (0.275, 0.35), (0.26666668, 0.35), (0.26666668, 0.33333334), (0.26666668, 0.33333334), (0.26666668, 0.35), (0.25833333, 0.35), (0.25833333, 0.33333334), (0.25833333, 0.33333334), (0.25833333, 0.35), (0.25, 0.35), (0.25, 0.33333334), (0.25, 0.33333334), (0.25, 0.35), (0.24166666, 0.35), (0.24166666, 0.33333334), (0.24166666, 0.33333334), (0.24166666, 0.35), (0.23333333, 0.35), (0.23333333, 0.33333334), (0.23333333, 0.33333334), (0.23333333, 0.35), (0.225, 0.35), (0.225, 0.33333334), (0.225, 0.33333334), (0.225, 0.35), (0.21666667, 0.35), (0.21666667, 0.33333334), (0.21666667, 0.33333334), (0.21666667, 0.35), (0.20833333, 0.35), (0.20833333, 0.33333334), (0.20833333, 0.33333334), (0.20833333, 0.35), (0.2, 0.35), (0.2, 0.33333334), (0.2, 0.33333334), (0.2, 0.35), (0.19166666, 0.35), (0.19166666, 0.33333334), (0.19166666, 0.33333334), (0.19166666, 0.35), (0.18333334, 0.35), (0.18333334, 0.33333334), (0.18333334, 0.33333334), (0.18333334, 0.35), (0.175, 0.35), (0.175, 0.33333334), (0.175, 0.33333334), (0.175, 0.35), (0.16666667, 0.35), (0.16666667, 0.33333334), (0.16666667, 0.33333334), (0.16666667, 0.35), (0.15833333, 0.35), (0.15833333, 0.33333334), (0.15833333, 0.33333334), (0.15833333, 0.35), (0.15, 0.35), (0.15, 0.33333334), (0.15, 0.33333334), (0.15, 0.35), (0.14166667, 0.35), (0.14166667, 0.33333334), (0.14166667, 0.33333334), (0.14166667, 0.35), (0.13333334, 0.35), (0.13333334, 0.33333334), (0.13333334, 0.33333334), (0.13333334, 0.35), (0.125, 0.35), (0.125, 0.33333334), (0.125, 0.33333334), (0.125, 0.35), (0.11666667, 0.35), (0.11666667, 0.33333334), (0.11666667, 0.33333334), (0.11666667, 0.35), (0.108333334, 0.35), (0.108333334, 0.33333334), (0.108333334, 0.33333334), (0.108333334, 0.35), (0.1, 0.35), (0.1, 0.33333334), (0.1, 0.33333334), (0.1, 0.35), (0.09166667, 0.35), (0.09166667, 0.33333334), (0.09166667, 0.33333334), (0.09166667, 0.35), (0.083333336, 0.35), (0.083333336, 0.33333334), (0.083333336, 0.33333334), (0.083333336, 0.35), (0.075, 0.35), (0.075, 0.33333334), (0.075, 0.33333334), (0.075, 0.35), (0.06666667, 0.35), (0.06666667, 0.33333334), (0.06666667, 0.33333334), (0.06666667, 0.35), (0.058333334, 0.35), (0.058333334, 0.33333334), (0.058333334, 0.33333334), (0.058333334, 0.35), (0.05, 0.35), (0.05, 0.33333334), (0.05, 0.33333334), (0.05, 0.35), (0.041666668, 0.35), (0.041666668, 0.33333334), (0.041666668, 0.33333334), (0.041666668, 0.35), (0.033333335, 0.35), (0.033333335, 0.33333334), (0.033333335, 0.33333334), (0.033333335, 0.35), (0.025, 0.35), (0.025, 0.33333334), (0.025, 0.33333334), (0.025, 0.35), (0.016666668, 0.35), (0.016666668, 0.33333334), (0.016666668, 0.33333334), (0.016666668, 0.35), (0.008333334, 0.35), (0.008333334, 0.33333334), (0.008333334, 0.33333334), (0.008333334, 0.35), (0, 0.35), (0, 0.33333334), (1, 0.35), (1, 0.36666667), (0.9916667, 0.36666667), (0.9916667, 0.35), (0.9916667, 0.35), (0.9916667, 0.36666667), (0.98333335, 0.36666667), (0.98333335, 0.35), (0.98333335, 0.35), (0.98333335, 0.36666667), (0.975, 0.36666667), (0.975, 0.35), (0.975, 0.35), (0.975, 0.36666667), (0.96666664, 0.36666667), (0.96666664, 0.35), (0.96666664, 0.35), (0.96666664, 0.36666667), (0.9583333, 0.36666667), (0.9583333, 0.35), (0.9583333, 0.35), (0.9583333, 0.36666667), (0.95, 0.36666667), (0.95, 0.35), (0.95, 0.35), (0.95, 0.36666667), (0.94166666, 0.36666667), (0.94166666, 0.35), (0.94166666, 0.35), (0.94166666, 0.36666667), (0.93333334, 0.36666667), (0.93333334, 0.35), (0.93333334, 0.35), (0.93333334, 0.36666667), (0.925, 0.36666667), (0.925, 0.35), (0.925, 0.35), (0.925, 0.36666667), (0.9166667, 0.36666667), (0.9166667, 0.35), (0.9166667, 0.35), (0.9166667, 0.36666667), (0.90833336, 0.36666667), (0.90833336, 0.35), (0.90833336, 0.35), (0.90833336, 0.36666667), (0.9, 0.36666667), (0.9, 0.35), (0.9, 0.35), (0.9, 0.36666667), (0.89166665, 0.36666667), (0.89166665, 0.35), (0.89166665, 0.35), (0.89166665, 0.36666667), (0.8833333, 0.36666667), (0.8833333, 0.35), (0.8833333, 0.35), (0.8833333, 0.36666667), (0.875, 0.36666667), (0.875, 0.35), (0.875, 0.35), (0.875, 0.36666667), (0.8666667, 0.36666667), (0.8666667, 0.35), (0.8666667, 0.35), (0.8666667, 0.36666667), (0.85833335, 0.36666667), (0.85833335, 0.35), (0.85833335, 0.35), (0.85833335, 0.36666667), (0.85, 0.36666667), (0.85, 0.35), (0.85, 0.35), (0.85, 0.36666667), (0.84166664, 0.36666667), (0.84166664, 0.35), (0.84166664, 0.35), (0.84166664, 0.36666667), (0.8333333, 0.36666667), (0.8333333, 0.35), (0.8333333, 0.35), (0.8333333, 0.36666667), (0.825, 0.36666667), (0.825, 0.35), (0.825, 0.35), (0.825, 0.36666667), (0.81666666, 0.36666667), (0.81666666, 0.35), (0.81666666, 0.35), (0.81666666, 0.36666667), (0.80833334, 0.36666667), (0.80833334, 0.35), (0.80833334, 0.35), (0.80833334, 0.36666667), (0.8, 0.36666667), (0.8, 0.35), (0.8, 0.35), (0.8, 0.36666667), (0.7916667, 0.36666667), (0.7916667, 0.35), (0.7916667, 0.35), (0.7916667, 0.36666667), (0.78333336, 0.36666667), (0.78333336, 0.35), (0.78333336, 0.35), (0.78333336, 0.36666667), (0.775, 0.36666667), (0.775, 0.35), (0.775, 0.35), (0.775, 0.36666667), (0.76666665, 0.36666667), (0.76666665, 0.35), (0.76666665, 0.35), (0.76666665, 0.36666667), (0.7583333, 0.36666667), (0.7583333, 0.35), (0.7583333, 0.35), (0.7583333, 0.36666667), (0.75, 0.36666667), (0.75, 0.35), (0.75, 0.35), (0.75, 0.36666667), (0.7416667, 0.36666667), (0.7416667, 0.35), (0.7416667, 0.35), (0.7416667, 0.36666667), (0.73333335, 0.36666667), (0.73333335, 0.35), (0.73333335, 0.35), (0.73333335, 0.36666667), (0.725, 0.36666667), (0.725, 0.35), (0.725, 0.35), (0.725, 0.36666667), (0.71666664, 0.36666667), (0.71666664, 0.35), (0.71666664, 0.35), (0.71666664, 0.36666667), (0.7083333, 0.36666667), (0.7083333, 0.35), (0.7083333, 0.35), (0.7083333, 0.36666667), (0.7, 0.36666667), (0.7, 0.35), (0.7, 0.35), (0.7, 0.36666667), (0.69166666, 0.36666667), (0.69166666, 0.35), (0.69166666, 0.35), (0.69166666, 0.36666667), (0.68333334, 0.36666667), (0.68333334, 0.35), (0.68333334, 0.35), (0.68333334, 0.36666667), (0.675, 0.36666667), (0.675, 0.35), (0.675, 0.35), (0.675, 0.36666667), (0.6666667, 0.36666667), (0.6666667, 0.35), (0.6666667, 0.35), (0.6666667, 0.36666667), (0.65833336, 0.36666667), (0.65833336, 0.35), (0.65833336, 0.35), (0.65833336, 0.36666667), (0.65, 0.36666667), (0.65, 0.35), (0.65, 0.35), (0.65, 0.36666667), (0.64166665, 0.36666667), (0.64166665, 0.35), (0.64166665, 0.35), (0.64166665, 0.36666667), (0.6333333, 0.36666667), (0.6333333, 0.35), (0.6333333, 0.35), (0.6333333, 0.36666667), (0.625, 0.36666667), (0.625, 0.35), (0.625, 0.35), (0.625, 0.36666667), (0.6166667, 0.36666667), (0.6166667, 0.35), (0.6166667, 0.35), (0.6166667, 0.36666667), (0.60833335, 0.36666667), (0.60833335, 0.35), (0.60833335, 0.35), (0.60833335, 0.36666667), (0.6, 0.36666667), (0.6, 0.35), (0.6, 0.35), (0.6, 0.36666667), (0.59166664, 0.36666667), (0.59166664, 0.35), (0.59166664, 0.35), (0.59166664, 0.36666667), (0.5833333, 0.36666667), (0.5833333, 0.35), (0.5833333, 0.35), (0.5833333, 0.36666667), (0.575, 0.36666667), (0.575, 0.35), (0.575, 0.35), (0.575, 0.36666667), (0.56666666, 0.36666667), (0.56666666, 0.35), (0.56666666, 0.35), (0.56666666, 0.36666667), (0.55833334, 0.36666667), (0.55833334, 0.35), (0.55833334, 0.35), (0.55833334, 0.36666667), (0.55, 0.36666667), (0.55, 0.35), (0.55, 0.35), (0.55, 0.36666667), (0.5416667, 0.36666667), (0.5416667, 0.35), (0.5416667, 0.35), (0.5416667, 0.36666667), (0.53333336, 0.36666667), (0.53333336, 0.35), (0.53333336, 0.35), (0.53333336, 0.36666667), (0.525, 0.36666667), (0.525, 0.35), (0.525, 0.35), (0.525, 0.36666667), (0.51666665, 0.36666667), (0.51666665, 0.35), (0.51666665, 0.35), (0.51666665, 0.36666667), (0.5083333, 0.36666667), (0.5083333, 0.35), (0.5083333, 0.35), (0.5083333, 0.36666667), (0.5, 0.36666667), (0.5, 0.35), (0.5, 0.35), (0.5, 0.36666667), (0.49166667, 0.36666667), (0.49166667, 0.35), (0.49166667, 0.35), (0.49166667, 0.36666667), (0.48333332, 0.36666667), (0.48333332, 0.35), (0.48333332, 0.35), (0.48333332, 0.36666667), (0.475, 0.36666667), (0.475, 0.35), (0.475, 0.35), (0.475, 0.36666667), (0.46666667, 0.36666667), (0.46666667, 0.35), (0.46666667, 0.35), (0.46666667, 0.36666667), (0.45833334, 0.36666667), (0.45833334, 0.35), (0.45833334, 0.35), (0.45833334, 0.36666667), (0.45, 0.36666667), (0.45, 0.35), (0.45, 0.35), (0.45, 0.36666667), (0.44166666, 0.36666667), (0.44166666, 0.35), (0.44166666, 0.35), (0.44166666, 0.36666667), (0.43333334, 0.36666667), (0.43333334, 0.35), (0.43333334, 0.35), (0.43333334, 0.36666667), (0.425, 0.36666667), (0.425, 0.35), (0.425, 0.35), (0.425, 0.36666667), (0.41666666, 0.36666667), (0.41666666, 0.35), (0.41666666, 0.35), (0.41666666, 0.36666667), (0.40833333, 0.36666667), (0.40833333, 0.35), (0.40833333, 0.35), (0.40833333, 0.36666667), (0.4, 0.36666667), (0.4, 0.35), (0.4, 0.35), (0.4, 0.36666667), (0.39166668, 0.36666667), (0.39166668, 0.35), (0.39166668, 0.35), (0.39166668, 0.36666667), (0.38333333, 0.36666667), (0.38333333, 0.35), (0.38333333, 0.35), (0.38333333, 0.36666667), (0.375, 0.36666667), (0.375, 0.35), (0.375, 0.35), (0.375, 0.36666667), (0.36666667, 0.36666667), (0.36666667, 0.35), (0.36666667, 0.35), (0.36666667, 0.36666667), (0.35833332, 0.36666667), (0.35833332, 0.35), (0.35833332, 0.35), (0.35833332, 0.36666667), (0.35, 0.36666667), (0.35, 0.35), (0.35, 0.35), (0.35, 0.36666667), (0.34166667, 0.36666667), (0.34166667, 0.35), (0.34166667, 0.35), (0.34166667, 0.36666667), (0.33333334, 0.36666667), (0.33333334, 0.35), (0.33333334, 0.35), (0.33333334, 0.36666667), (0.325, 0.36666667), (0.325, 0.35), (0.325, 0.35), (0.325, 0.36666667), (0.31666666, 0.36666667), (0.31666666, 0.35), (0.31666666, 0.35), (0.31666666, 0.36666667), (0.30833334, 0.36666667), (0.30833334, 0.35), (0.30833334, 0.35), (0.30833334, 0.36666667), (0.3, 0.36666667), (0.3, 0.35), (0.3, 0.35), (0.3, 0.36666667), (0.29166666, 0.36666667), (0.29166666, 0.35), (0.29166666, 0.35), (0.29166666, 0.36666667), (0.28333333, 0.36666667), (0.28333333, 0.35), (0.28333333, 0.35), (0.28333333, 0.36666667), (0.275, 0.36666667), (0.275, 0.35), (0.275, 0.35), (0.275, 0.36666667), (0.26666668, 0.36666667), (0.26666668, 0.35), (0.26666668, 0.35), (0.26666668, 0.36666667), (0.25833333, 0.36666667), (0.25833333, 0.35), (0.25833333, 0.35), (0.25833333, 0.36666667), (0.25, 0.36666667), (0.25, 0.35), (0.25, 0.35), (0.25, 0.36666667), (0.24166666, 0.36666667), (0.24166666, 0.35), (0.24166666, 0.35), (0.24166666, 0.36666667), (0.23333333, 0.36666667), (0.23333333, 0.35), (0.23333333, 0.35), (0.23333333, 0.36666667), (0.225, 0.36666667), (0.225, 0.35), (0.225, 0.35), (0.225, 0.36666667), (0.21666667, 0.36666667), (0.21666667, 0.35), (0.21666667, 0.35), (0.21666667, 0.36666667), (0.20833333, 0.36666667), (0.20833333, 0.35), (0.20833333, 0.35), (0.20833333, 0.36666667), (0.2, 0.36666667), (0.2, 0.35), (0.2, 0.35), (0.2, 0.36666667), (0.19166666, 0.36666667), (0.19166666, 0.35), (0.19166666, 0.35), (0.19166666, 0.36666667), (0.18333334, 0.36666667), (0.18333334, 0.35), (0.18333334, 0.35), (0.18333334, 0.36666667), (0.175, 0.36666667), (0.175, 0.35), (0.175, 0.35), (0.175, 0.36666667), (0.16666667, 0.36666667), (0.16666667, 0.35), (0.16666667, 0.35), (0.16666667, 0.36666667), (0.15833333, 0.36666667), (0.15833333, 0.35), (0.15833333, 0.35), (0.15833333, 0.36666667), (0.15, 0.36666667), (0.15, 0.35), (0.15, 0.35), (0.15, 0.36666667), (0.14166667, 0.36666667), (0.14166667, 0.35), (0.14166667, 0.35), (0.14166667, 0.36666667), (0.13333334, 0.36666667), (0.13333334, 0.35), (0.13333334, 0.35), (0.13333334, 0.36666667), (0.125, 0.36666667), (0.125, 0.35), (0.125, 0.35), (0.125, 0.36666667), (0.11666667, 0.36666667), (0.11666667, 0.35), (0.11666667, 0.35), (0.11666667, 0.36666667), (0.108333334, 0.36666667), (0.108333334, 0.35), (0.108333334, 0.35), (0.108333334, 0.36666667), (0.1, 0.36666667), (0.1, 0.35), (0.1, 0.35), (0.1, 0.36666667), (0.09166667, 0.36666667), (0.09166667, 0.35), (0.09166667, 0.35), (0.09166667, 0.36666667), (0.083333336, 0.36666667), (0.083333336, 0.35), (0.083333336, 0.35), (0.083333336, 0.36666667), (0.075, 0.36666667), (0.075, 0.35), (0.075, 0.35), (0.075, 0.36666667), (0.06666667, 0.36666667), (0.06666667, 0.35), (0.06666667, 0.35), (0.06666667, 0.36666667), (0.058333334, 0.36666667), (0.058333334, 0.35), (0.058333334, 0.35), (0.058333334, 0.36666667), (0.05, 0.36666667), (0.05, 0.35), (0.05, 0.35), (0.05, 0.36666667), (0.041666668, 0.36666667), (0.041666668, 0.35), (0.041666668, 0.35), (0.041666668, 0.36666667), (0.033333335, 0.36666667), (0.033333335, 0.35), (0.033333335, 0.35), (0.033333335, 0.36666667), (0.025, 0.36666667), (0.025, 0.35), (0.025, 0.35), (0.025, 0.36666667), (0.016666668, 0.36666667), (0.016666668, 0.35), (0.016666668, 0.35), (0.016666668, 0.36666667), (0.008333334, 0.36666667), (0.008333334, 0.35), (0.008333334, 0.35), (0.008333334, 0.36666667), (0, 0.36666667), (0, 0.35), (1, 0.36666667), (1, 0.38333333), (0.9916667, 0.38333333), (0.9916667, 0.36666667), (0.9916667, 0.36666667), (0.9916667, 0.38333333), (0.98333335, 0.38333333), (0.98333335, 0.36666667), (0.98333335, 0.36666667), (0.98333335, 0.38333333), (0.975, 0.38333333), (0.975, 0.36666667), (0.975, 0.36666667), (0.975, 0.38333333), (0.96666664, 0.38333333), (0.96666664, 0.36666667), (0.96666664, 0.36666667), (0.96666664, 0.38333333), (0.9583333, 0.38333333), (0.9583333, 0.36666667), (0.9583333, 0.36666667), (0.9583333, 0.38333333), (0.95, 0.38333333), (0.95, 0.36666667), (0.95, 0.36666667), (0.95, 0.38333333), (0.94166666, 0.38333333), (0.94166666, 0.36666667), (0.94166666, 0.36666667), (0.94166666, 0.38333333), (0.93333334, 0.38333333), (0.93333334, 0.36666667), (0.93333334, 0.36666667), (0.93333334, 0.38333333), (0.925, 0.38333333), (0.925, 0.36666667), (0.925, 0.36666667), (0.925, 0.38333333), (0.9166667, 0.38333333), (0.9166667, 0.36666667), (0.9166667, 0.36666667), (0.9166667, 0.38333333), (0.90833336, 0.38333333), (0.90833336, 0.36666667), (0.90833336, 0.36666667), (0.90833336, 0.38333333), (0.9, 0.38333333), (0.9, 0.36666667), (0.9, 0.36666667), (0.9, 0.38333333), (0.89166665, 0.38333333), (0.89166665, 0.36666667), (0.89166665, 0.36666667), (0.89166665, 0.38333333), (0.8833333, 0.38333333), (0.8833333, 0.36666667), (0.8833333, 0.36666667), (0.8833333, 0.38333333), (0.875, 0.38333333), (0.875, 0.36666667), (0.875, 0.36666667), (0.875, 0.38333333), (0.8666667, 0.38333333), (0.8666667, 0.36666667), (0.8666667, 0.36666667), (0.8666667, 0.38333333), (0.85833335, 0.38333333), (0.85833335, 0.36666667), (0.85833335, 0.36666667), (0.85833335, 0.38333333), (0.85, 0.38333333), (0.85, 0.36666667), (0.85, 0.36666667), (0.85, 0.38333333), (0.84166664, 0.38333333), (0.84166664, 0.36666667), (0.84166664, 0.36666667), (0.84166664, 0.38333333), (0.8333333, 0.38333333), (0.8333333, 0.36666667), (0.8333333, 0.36666667), (0.8333333, 0.38333333), (0.825, 0.38333333), (0.825, 0.36666667), (0.825, 0.36666667), (0.825, 0.38333333), (0.81666666, 0.38333333), (0.81666666, 0.36666667), (0.81666666, 0.36666667), (0.81666666, 0.38333333), (0.80833334, 0.38333333), (0.80833334, 0.36666667), (0.80833334, 0.36666667), (0.80833334, 0.38333333), (0.8, 0.38333333), (0.8, 0.36666667), (0.8, 0.36666667), (0.8, 0.38333333), (0.7916667, 0.38333333), (0.7916667, 0.36666667), (0.7916667, 0.36666667), (0.7916667, 0.38333333), (0.78333336, 0.38333333), (0.78333336, 0.36666667), (0.78333336, 0.36666667), (0.78333336, 0.38333333), (0.775, 0.38333333), (0.775, 0.36666667), (0.775, 0.36666667), (0.775, 0.38333333), (0.76666665, 0.38333333), (0.76666665, 0.36666667), (0.76666665, 0.36666667), (0.76666665, 0.38333333), (0.7583333, 0.38333333), (0.7583333, 0.36666667), (0.7583333, 0.36666667), (0.7583333, 0.38333333), (0.75, 0.38333333), (0.75, 0.36666667), (0.75, 0.36666667), (0.75, 0.38333333), (0.7416667, 0.38333333), (0.7416667, 0.36666667), (0.7416667, 0.36666667), (0.7416667, 0.38333333), (0.73333335, 0.38333333), (0.73333335, 0.36666667), (0.73333335, 0.36666667), (0.73333335, 0.38333333), (0.725, 0.38333333), (0.725, 0.36666667), (0.725, 0.36666667), (0.725, 0.38333333), (0.71666664, 0.38333333), (0.71666664, 0.36666667), (0.71666664, 0.36666667), (0.71666664, 0.38333333), (0.7083333, 0.38333333), (0.7083333, 0.36666667), (0.7083333, 0.36666667), (0.7083333, 0.38333333), (0.7, 0.38333333), (0.7, 0.36666667), (0.7, 0.36666667), (0.7, 0.38333333), (0.69166666, 0.38333333), (0.69166666, 0.36666667), (0.69166666, 0.36666667), (0.69166666, 0.38333333), (0.68333334, 0.38333333), (0.68333334, 0.36666667), (0.68333334, 0.36666667), (0.68333334, 0.38333333), (0.675, 0.38333333), (0.675, 0.36666667), (0.675, 0.36666667), (0.675, 0.38333333), (0.6666667, 0.38333333), (0.6666667, 0.36666667), (0.6666667, 0.36666667), (0.6666667, 0.38333333), (0.65833336, 0.38333333), (0.65833336, 0.36666667), (0.65833336, 0.36666667), (0.65833336, 0.38333333), (0.65, 0.38333333), (0.65, 0.36666667), (0.65, 0.36666667), (0.65, 0.38333333), (0.64166665, 0.38333333), (0.64166665, 0.36666667), (0.64166665, 0.36666667), (0.64166665, 0.38333333), (0.6333333, 0.38333333), (0.6333333, 0.36666667), (0.6333333, 0.36666667), (0.6333333, 0.38333333), (0.625, 0.38333333), (0.625, 0.36666667), (0.625, 0.36666667), (0.625, 0.38333333), (0.6166667, 0.38333333), (0.6166667, 0.36666667), (0.6166667, 0.36666667), (0.6166667, 0.38333333), (0.60833335, 0.38333333), (0.60833335, 0.36666667), (0.60833335, 0.36666667), (0.60833335, 0.38333333), (0.6, 0.38333333), (0.6, 0.36666667), (0.6, 0.36666667), (0.6, 0.38333333), (0.59166664, 0.38333333), (0.59166664, 0.36666667), (0.59166664, 0.36666667), (0.59166664, 0.38333333), (0.5833333, 0.38333333), (0.5833333, 0.36666667), (0.5833333, 0.36666667), (0.5833333, 0.38333333), (0.575, 0.38333333), (0.575, 0.36666667), (0.575, 0.36666667), (0.575, 0.38333333), (0.56666666, 0.38333333), (0.56666666, 0.36666667), (0.56666666, 0.36666667), (0.56666666, 0.38333333), (0.55833334, 0.38333333), (0.55833334, 0.36666667), (0.55833334, 0.36666667), (0.55833334, 0.38333333), (0.55, 0.38333333), (0.55, 0.36666667), (0.55, 0.36666667), (0.55, 0.38333333), (0.5416667, 0.38333333), (0.5416667, 0.36666667), (0.5416667, 0.36666667), (0.5416667, 0.38333333), (0.53333336, 0.38333333), (0.53333336, 0.36666667), (0.53333336, 0.36666667), (0.53333336, 0.38333333), (0.525, 0.38333333), (0.525, 0.36666667), (0.525, 0.36666667), (0.525, 0.38333333), (0.51666665, 0.38333333), (0.51666665, 0.36666667), (0.51666665, 0.36666667), (0.51666665, 0.38333333), (0.5083333, 0.38333333), (0.5083333, 0.36666667), (0.5083333, 0.36666667), (0.5083333, 0.38333333), (0.5, 0.38333333), (0.5, 0.36666667), (0.5, 0.36666667), (0.5, 0.38333333), (0.49166667, 0.38333333), (0.49166667, 0.36666667), (0.49166667, 0.36666667), (0.49166667, 0.38333333), (0.48333332, 0.38333333), (0.48333332, 0.36666667), (0.48333332, 0.36666667), (0.48333332, 0.38333333), (0.475, 0.38333333), (0.475, 0.36666667), (0.475, 0.36666667), (0.475, 0.38333333), (0.46666667, 0.38333333), (0.46666667, 0.36666667), (0.46666667, 0.36666667), (0.46666667, 0.38333333), (0.45833334, 0.38333333), (0.45833334, 0.36666667), (0.45833334, 0.36666667), (0.45833334, 0.38333333), (0.45, 0.38333333), (0.45, 0.36666667), (0.45, 0.36666667), (0.45, 0.38333333), (0.44166666, 0.38333333), (0.44166666, 0.36666667), (0.44166666, 0.36666667), (0.44166666, 0.38333333), (0.43333334, 0.38333333), (0.43333334, 0.36666667), (0.43333334, 0.36666667), (0.43333334, 0.38333333), (0.425, 0.38333333), (0.425, 0.36666667), (0.425, 0.36666667), (0.425, 0.38333333), (0.41666666, 0.38333333), (0.41666666, 0.36666667), (0.41666666, 0.36666667), (0.41666666, 0.38333333), (0.40833333, 0.38333333), (0.40833333, 0.36666667), (0.40833333, 0.36666667), (0.40833333, 0.38333333), (0.4, 0.38333333), (0.4, 0.36666667), (0.4, 0.36666667), (0.4, 0.38333333), (0.39166668, 0.38333333), (0.39166668, 0.36666667), (0.39166668, 0.36666667), (0.39166668, 0.38333333), (0.38333333, 0.38333333), (0.38333333, 0.36666667), (0.38333333, 0.36666667), (0.38333333, 0.38333333), (0.375, 0.38333333), (0.375, 0.36666667), (0.375, 0.36666667), (0.375, 0.38333333), (0.36666667, 0.38333333), (0.36666667, 0.36666667), (0.36666667, 0.36666667), (0.36666667, 0.38333333), (0.35833332, 0.38333333), (0.35833332, 0.36666667), (0.35833332, 0.36666667), (0.35833332, 0.38333333), (0.35, 0.38333333), (0.35, 0.36666667), (0.35, 0.36666667), (0.35, 0.38333333), (0.34166667, 0.38333333), (0.34166667, 0.36666667), (0.34166667, 0.36666667), (0.34166667, 0.38333333), (0.33333334, 0.38333333), (0.33333334, 0.36666667), (0.33333334, 0.36666667), (0.33333334, 0.38333333), (0.325, 0.38333333), (0.325, 0.36666667), (0.325, 0.36666667), (0.325, 0.38333333), (0.31666666, 0.38333333), (0.31666666, 0.36666667), (0.31666666, 0.36666667), (0.31666666, 0.38333333), (0.30833334, 0.38333333), (0.30833334, 0.36666667), (0.30833334, 0.36666667), (0.30833334, 0.38333333), (0.3, 0.38333333), (0.3, 0.36666667), (0.3, 0.36666667), (0.3, 0.38333333), (0.29166666, 0.38333333), (0.29166666, 0.36666667), (0.29166666, 0.36666667), (0.29166666, 0.38333333), (0.28333333, 0.38333333), (0.28333333, 0.36666667), (0.28333333, 0.36666667), (0.28333333, 0.38333333), (0.275, 0.38333333), (0.275, 0.36666667), (0.275, 0.36666667), (0.275, 0.38333333), (0.26666668, 0.38333333), (0.26666668, 0.36666667), (0.26666668, 0.36666667), (0.26666668, 0.38333333), (0.25833333, 0.38333333), (0.25833333, 0.36666667), (0.25833333, 0.36666667), (0.25833333, 0.38333333), (0.25, 0.38333333), (0.25, 0.36666667), (0.25, 0.36666667), (0.25, 0.38333333), (0.24166666, 0.38333333), (0.24166666, 0.36666667), (0.24166666, 0.36666667), (0.24166666, 0.38333333), (0.23333333, 0.38333333), (0.23333333, 0.36666667), (0.23333333, 0.36666667), (0.23333333, 0.38333333), (0.225, 0.38333333), (0.225, 0.36666667), (0.225, 0.36666667), (0.225, 0.38333333), (0.21666667, 0.38333333), (0.21666667, 0.36666667), (0.21666667, 0.36666667), (0.21666667, 0.38333333), (0.20833333, 0.38333333), (0.20833333, 0.36666667), (0.20833333, 0.36666667), (0.20833333, 0.38333333), (0.2, 0.38333333), (0.2, 0.36666667), (0.2, 0.36666667), (0.2, 0.38333333), (0.19166666, 0.38333333), (0.19166666, 0.36666667), (0.19166666, 0.36666667), (0.19166666, 0.38333333), (0.18333334, 0.38333333), (0.18333334, 0.36666667), (0.18333334, 0.36666667), (0.18333334, 0.38333333), (0.175, 0.38333333), (0.175, 0.36666667), (0.175, 0.36666667), (0.175, 0.38333333), (0.16666667, 0.38333333), (0.16666667, 0.36666667), (0.16666667, 0.36666667), (0.16666667, 0.38333333), (0.15833333, 0.38333333), (0.15833333, 0.36666667), (0.15833333, 0.36666667), (0.15833333, 0.38333333), (0.15, 0.38333333), (0.15, 0.36666667), (0.15, 0.36666667), (0.15, 0.38333333), (0.14166667, 0.38333333), (0.14166667, 0.36666667), (0.14166667, 0.36666667), (0.14166667, 0.38333333), (0.13333334, 0.38333333), (0.13333334, 0.36666667), (0.13333334, 0.36666667), (0.13333334, 0.38333333), (0.125, 0.38333333), (0.125, 0.36666667), (0.125, 0.36666667), (0.125, 0.38333333), (0.11666667, 0.38333333), (0.11666667, 0.36666667), (0.11666667, 0.36666667), (0.11666667, 0.38333333), (0.108333334, 0.38333333), (0.108333334, 0.36666667), (0.108333334, 0.36666667), (0.108333334, 0.38333333), (0.1, 0.38333333), (0.1, 0.36666667), (0.1, 0.36666667), (0.1, 0.38333333), (0.09166667, 0.38333333), (0.09166667, 0.36666667), (0.09166667, 0.36666667), (0.09166667, 0.38333333), (0.083333336, 0.38333333), (0.083333336, 0.36666667), (0.083333336, 0.36666667), (0.083333336, 0.38333333), (0.075, 0.38333333), (0.075, 0.36666667), (0.075, 0.36666667), (0.075, 0.38333333), (0.06666667, 0.38333333), (0.06666667, 0.36666667), (0.06666667, 0.36666667), (0.06666667, 0.38333333), (0.058333334, 0.38333333), (0.058333334, 0.36666667), (0.058333334, 0.36666667), (0.058333334, 0.38333333), (0.05, 0.38333333), (0.05, 0.36666667), (0.05, 0.36666667), (0.05, 0.38333333), (0.041666668, 0.38333333), (0.041666668, 0.36666667), (0.041666668, 0.36666667), (0.041666668, 0.38333333), (0.033333335, 0.38333333), (0.033333335, 0.36666667), (0.033333335, 0.36666667), (0.033333335, 0.38333333), (0.025, 0.38333333), (0.025, 0.36666667), (0.025, 0.36666667), (0.025, 0.38333333), (0.016666668, 0.38333333), (0.016666668, 0.36666667), (0.016666668, 0.36666667), (0.016666668, 0.38333333), (0.008333334, 0.38333333), (0.008333334, 0.36666667), (0.008333334, 0.36666667), (0.008333334, 0.38333333), (0, 0.38333333), (0, 0.36666667), (1, 0.38333333), (1, 0.4), (0.9916667, 0.4), (0.9916667, 0.38333333), (0.9916667, 0.38333333), (0.9916667, 0.4), (0.98333335, 0.4), (0.98333335, 0.38333333), (0.98333335, 0.38333333), (0.98333335, 0.4), (0.975, 0.4), (0.975, 0.38333333), (0.975, 0.38333333), (0.975, 0.4), (0.96666664, 0.4), (0.96666664, 0.38333333), (0.96666664, 0.38333333), (0.96666664, 0.4), (0.9583333, 0.4), (0.9583333, 0.38333333), (0.9583333, 0.38333333), (0.9583333, 0.4), (0.95, 0.4), (0.95, 0.38333333), (0.95, 0.38333333), (0.95, 0.4), (0.94166666, 0.4), (0.94166666, 0.38333333), (0.94166666, 0.38333333), (0.94166666, 0.4), (0.93333334, 0.4), (0.93333334, 0.38333333), (0.93333334, 0.38333333), (0.93333334, 0.4), (0.925, 0.4), (0.925, 0.38333333), (0.925, 0.38333333), (0.925, 0.4), (0.9166667, 0.4), (0.9166667, 0.38333333), (0.9166667, 0.38333333), (0.9166667, 0.4), (0.90833336, 0.4), (0.90833336, 0.38333333), (0.90833336, 0.38333333), (0.90833336, 0.4), (0.9, 0.4), (0.9, 0.38333333), (0.9, 0.38333333), (0.9, 0.4), (0.89166665, 0.4), (0.89166665, 0.38333333), (0.89166665, 0.38333333), (0.89166665, 0.4), (0.8833333, 0.4), (0.8833333, 0.38333333), (0.8833333, 0.38333333), (0.8833333, 0.4), (0.875, 0.4), (0.875, 0.38333333), (0.875, 0.38333333), (0.875, 0.4), (0.8666667, 0.4), (0.8666667, 0.38333333), (0.8666667, 0.38333333), (0.8666667, 0.4), (0.85833335, 0.4), (0.85833335, 0.38333333), (0.85833335, 0.38333333), (0.85833335, 0.4), (0.85, 0.4), (0.85, 0.38333333), (0.85, 0.38333333), (0.85, 0.4), (0.84166664, 0.4), (0.84166664, 0.38333333), (0.84166664, 0.38333333), (0.84166664, 0.4), (0.8333333, 0.4), (0.8333333, 0.38333333), (0.8333333, 0.38333333), (0.8333333, 0.4), (0.825, 0.4), (0.825, 0.38333333), (0.825, 0.38333333), (0.825, 0.4), (0.81666666, 0.4), (0.81666666, 0.38333333), (0.81666666, 0.38333333), (0.81666666, 0.4), (0.80833334, 0.4), (0.80833334, 0.38333333), (0.80833334, 0.38333333), (0.80833334, 0.4), (0.8, 0.4), (0.8, 0.38333333), (0.8, 0.38333333), (0.8, 0.4), (0.7916667, 0.4), (0.7916667, 0.38333333), (0.7916667, 0.38333333), (0.7916667, 0.4), (0.78333336, 0.4), (0.78333336, 0.38333333), (0.78333336, 0.38333333), (0.78333336, 0.4), (0.775, 0.4), (0.775, 0.38333333), (0.775, 0.38333333), (0.775, 0.4), (0.76666665, 0.4), (0.76666665, 0.38333333), (0.76666665, 0.38333333), (0.76666665, 0.4), (0.7583333, 0.4), (0.7583333, 0.38333333), (0.7583333, 0.38333333), (0.7583333, 0.4), (0.75, 0.4), (0.75, 0.38333333), (0.75, 0.38333333), (0.75, 0.4), (0.7416667, 0.4), (0.7416667, 0.38333333), (0.7416667, 0.38333333), (0.7416667, 0.4), (0.73333335, 0.4), (0.73333335, 0.38333333), (0.73333335, 0.38333333), (0.73333335, 0.4), (0.725, 0.4), (0.725, 0.38333333), (0.725, 0.38333333), (0.725, 0.4), (0.71666664, 0.4), (0.71666664, 0.38333333), (0.71666664, 0.38333333), (0.71666664, 0.4), (0.7083333, 0.4), (0.7083333, 0.38333333), (0.7083333, 0.38333333), (0.7083333, 0.4), (0.7, 0.4), (0.7, 0.38333333), (0.7, 0.38333333), (0.7, 0.4), (0.69166666, 0.4), (0.69166666, 0.38333333), (0.69166666, 0.38333333), (0.69166666, 0.4), (0.68333334, 0.4), (0.68333334, 0.38333333), (0.68333334, 0.38333333), (0.68333334, 0.4), (0.675, 0.4), (0.675, 0.38333333), (0.675, 0.38333333), (0.675, 0.4), (0.6666667, 0.4), (0.6666667, 0.38333333), (0.6666667, 0.38333333), (0.6666667, 0.4), (0.65833336, 0.4), (0.65833336, 0.38333333), (0.65833336, 0.38333333), (0.65833336, 0.4), (0.65, 0.4), (0.65, 0.38333333), (0.65, 0.38333333), (0.65, 0.4), (0.64166665, 0.4), (0.64166665, 0.38333333), (0.64166665, 0.38333333), (0.64166665, 0.4), (0.6333333, 0.4), (0.6333333, 0.38333333), (0.6333333, 0.38333333), (0.6333333, 0.4), (0.625, 0.4), (0.625, 0.38333333), (0.625, 0.38333333), (0.625, 0.4), (0.6166667, 0.4), (0.6166667, 0.38333333), (0.6166667, 0.38333333), (0.6166667, 0.4), (0.60833335, 0.4), (0.60833335, 0.38333333), (0.60833335, 0.38333333), (0.60833335, 0.4), (0.6, 0.4), (0.6, 0.38333333), (0.6, 0.38333333), (0.6, 0.4), (0.59166664, 0.4), (0.59166664, 0.38333333), (0.59166664, 0.38333333), (0.59166664, 0.4), (0.5833333, 0.4), (0.5833333, 0.38333333), (0.5833333, 0.38333333), (0.5833333, 0.4), (0.575, 0.4), (0.575, 0.38333333), (0.575, 0.38333333), (0.575, 0.4), (0.56666666, 0.4), (0.56666666, 0.38333333), (0.56666666, 0.38333333), (0.56666666, 0.4), (0.55833334, 0.4), (0.55833334, 0.38333333), (0.55833334, 0.38333333), (0.55833334, 0.4), (0.55, 0.4), (0.55, 0.38333333), (0.55, 0.38333333), (0.55, 0.4), (0.5416667, 0.4), (0.5416667, 0.38333333), (0.5416667, 0.38333333), (0.5416667, 0.4), (0.53333336, 0.4), (0.53333336, 0.38333333), (0.53333336, 0.38333333), (0.53333336, 0.4), (0.525, 0.4), (0.525, 0.38333333), (0.525, 0.38333333), (0.525, 0.4), (0.51666665, 0.4), (0.51666665, 0.38333333), (0.51666665, 0.38333333), (0.51666665, 0.4), (0.5083333, 0.4), (0.5083333, 0.38333333), (0.5083333, 0.38333333), (0.5083333, 0.4), (0.5, 0.4), (0.5, 0.38333333), (0.5, 0.38333333), (0.5, 0.4), (0.49166667, 0.4), (0.49166667, 0.38333333), (0.49166667, 0.38333333), (0.49166667, 0.4), (0.48333332, 0.4), (0.48333332, 0.38333333), (0.48333332, 0.38333333), (0.48333332, 0.4), (0.475, 0.4), (0.475, 0.38333333), (0.475, 0.38333333), (0.475, 0.4), (0.46666667, 0.4), (0.46666667, 0.38333333), (0.46666667, 0.38333333), (0.46666667, 0.4), (0.45833334, 0.4), (0.45833334, 0.38333333), (0.45833334, 0.38333333), (0.45833334, 0.4), (0.45, 0.4), (0.45, 0.38333333), (0.45, 0.38333333), (0.45, 0.4), (0.44166666, 0.4), (0.44166666, 0.38333333), (0.44166666, 0.38333333), (0.44166666, 0.4), (0.43333334, 0.4), (0.43333334, 0.38333333), (0.43333334, 0.38333333), (0.43333334, 0.4), (0.425, 0.4), (0.425, 0.38333333), (0.425, 0.38333333), (0.425, 0.4), (0.41666666, 0.4), (0.41666666, 0.38333333), (0.41666666, 0.38333333), (0.41666666, 0.4), (0.40833333, 0.4), (0.40833333, 0.38333333), (0.40833333, 0.38333333), (0.40833333, 0.4), (0.4, 0.4), (0.4, 0.38333333), (0.4, 0.38333333), (0.4, 0.4), (0.39166668, 0.4), (0.39166668, 0.38333333), (0.39166668, 0.38333333), (0.39166668, 0.4), (0.38333333, 0.4), (0.38333333, 0.38333333), (0.38333333, 0.38333333), (0.38333333, 0.4), (0.375, 0.4), (0.375, 0.38333333), (0.375, 0.38333333), (0.375, 0.4), (0.36666667, 0.4), (0.36666667, 0.38333333), (0.36666667, 0.38333333), (0.36666667, 0.4), (0.35833332, 0.4), (0.35833332, 0.38333333), (0.35833332, 0.38333333), (0.35833332, 0.4), (0.35, 0.4), (0.35, 0.38333333), (0.35, 0.38333333), (0.35, 0.4), (0.34166667, 0.4), (0.34166667, 0.38333333), (0.34166667, 0.38333333), (0.34166667, 0.4), (0.33333334, 0.4), (0.33333334, 0.38333333), (0.33333334, 0.38333333), (0.33333334, 0.4), (0.325, 0.4), (0.325, 0.38333333), (0.325, 0.38333333), (0.325, 0.4), (0.31666666, 0.4), (0.31666666, 0.38333333), (0.31666666, 0.38333333), (0.31666666, 0.4), (0.30833334, 0.4), (0.30833334, 0.38333333), (0.30833334, 0.38333333), (0.30833334, 0.4), (0.3, 0.4), (0.3, 0.38333333), (0.3, 0.38333333), (0.3, 0.4), (0.29166666, 0.4), (0.29166666, 0.38333333), (0.29166666, 0.38333333), (0.29166666, 0.4), (0.28333333, 0.4), (0.28333333, 0.38333333), (0.28333333, 0.38333333), (0.28333333, 0.4), (0.275, 0.4), (0.275, 0.38333333), (0.275, 0.38333333), (0.275, 0.4), (0.26666668, 0.4), (0.26666668, 0.38333333), (0.26666668, 0.38333333), (0.26666668, 0.4), (0.25833333, 0.4), (0.25833333, 0.38333333), (0.25833333, 0.38333333), (0.25833333, 0.4), (0.25, 0.4), (0.25, 0.38333333), (0.25, 0.38333333), (0.25, 0.4), (0.24166666, 0.4), (0.24166666, 0.38333333), (0.24166666, 0.38333333), (0.24166666, 0.4), (0.23333333, 0.4), (0.23333333, 0.38333333), (0.23333333, 0.38333333), (0.23333333, 0.4), (0.225, 0.4), (0.225, 0.38333333), (0.225, 0.38333333), (0.225, 0.4), (0.21666667, 0.4), (0.21666667, 0.38333333), (0.21666667, 0.38333333), (0.21666667, 0.4), (0.20833333, 0.4), (0.20833333, 0.38333333), (0.20833333, 0.38333333), (0.20833333, 0.4), (0.2, 0.4), (0.2, 0.38333333), (0.2, 0.38333333), (0.2, 0.4), (0.19166666, 0.4), (0.19166666, 0.38333333), (0.19166666, 0.38333333), (0.19166666, 0.4), (0.18333334, 0.4), (0.18333334, 0.38333333), (0.18333334, 0.38333333), (0.18333334, 0.4), (0.175, 0.4), (0.175, 0.38333333), (0.175, 0.38333333), (0.175, 0.4), (0.16666667, 0.4), (0.16666667, 0.38333333), (0.16666667, 0.38333333), (0.16666667, 0.4), (0.15833333, 0.4), (0.15833333, 0.38333333), (0.15833333, 0.38333333), (0.15833333, 0.4), (0.15, 0.4), (0.15, 0.38333333), (0.15, 0.38333333), (0.15, 0.4), (0.14166667, 0.4), (0.14166667, 0.38333333), (0.14166667, 0.38333333), (0.14166667, 0.4), (0.13333334, 0.4), (0.13333334, 0.38333333), (0.13333334, 0.38333333), (0.13333334, 0.4), (0.125, 0.4), (0.125, 0.38333333), (0.125, 0.38333333), (0.125, 0.4), (0.11666667, 0.4), (0.11666667, 0.38333333), (0.11666667, 0.38333333), (0.11666667, 0.4), (0.108333334, 0.4), (0.108333334, 0.38333333), (0.108333334, 0.38333333), (0.108333334, 0.4), (0.1, 0.4), (0.1, 0.38333333), (0.1, 0.38333333), (0.1, 0.4), (0.09166667, 0.4), (0.09166667, 0.38333333), (0.09166667, 0.38333333), (0.09166667, 0.4), (0.083333336, 0.4), (0.083333336, 0.38333333), (0.083333336, 0.38333333), (0.083333336, 0.4), (0.075, 0.4), (0.075, 0.38333333), (0.075, 0.38333333), (0.075, 0.4), (0.06666667, 0.4), (0.06666667, 0.38333333), (0.06666667, 0.38333333), (0.06666667, 0.4), (0.058333334, 0.4), (0.058333334, 0.38333333), (0.058333334, 0.38333333), (0.058333334, 0.4), (0.05, 0.4), (0.05, 0.38333333), (0.05, 0.38333333), (0.05, 0.4), (0.041666668, 0.4), (0.041666668, 0.38333333), (0.041666668, 0.38333333), (0.041666668, 0.4), (0.033333335, 0.4), (0.033333335, 0.38333333), (0.033333335, 0.38333333), (0.033333335, 0.4), (0.025, 0.4), (0.025, 0.38333333), (0.025, 0.38333333), (0.025, 0.4), (0.016666668, 0.4), (0.016666668, 0.38333333), (0.016666668, 0.38333333), (0.016666668, 0.4), (0.008333334, 0.4), (0.008333334, 0.38333333), (0.008333334, 0.38333333), (0.008333334, 0.4), (0, 0.4), (0, 0.38333333), (1, 0.4), (1, 0.41666666), (0.9916667, 0.41666666), (0.9916667, 0.4), (0.9916667, 0.4), (0.9916667, 0.41666666), (0.98333335, 0.41666666), (0.98333335, 0.4), (0.98333335, 0.4), (0.98333335, 0.41666666), (0.975, 0.41666666), (0.975, 0.4), (0.975, 0.4), (0.975, 0.41666666), (0.96666664, 0.41666666), (0.96666664, 0.4), (0.96666664, 0.4), (0.96666664, 0.41666666), (0.9583333, 0.41666666), (0.9583333, 0.4), (0.9583333, 0.4), (0.9583333, 0.41666666), (0.95, 0.41666666), (0.95, 0.4), (0.95, 0.4), (0.95, 0.41666666), (0.94166666, 0.41666666), (0.94166666, 0.4), (0.94166666, 0.4), (0.94166666, 0.41666666), (0.93333334, 0.41666666), (0.93333334, 0.4), (0.93333334, 0.4), (0.93333334, 0.41666666), (0.925, 0.41666666), (0.925, 0.4), (0.925, 0.4), (0.925, 0.41666666), (0.9166667, 0.41666666), (0.9166667, 0.4), (0.9166667, 0.4), (0.9166667, 0.41666666), (0.90833336, 0.41666666), (0.90833336, 0.4), (0.90833336, 0.4), (0.90833336, 0.41666666), (0.9, 0.41666666), (0.9, 0.4), (0.9, 0.4), (0.9, 0.41666666), (0.89166665, 0.41666666), (0.89166665, 0.4), (0.89166665, 0.4), (0.89166665, 0.41666666), (0.8833333, 0.41666666), (0.8833333, 0.4), (0.8833333, 0.4), (0.8833333, 0.41666666), (0.875, 0.41666666), (0.875, 0.4), (0.875, 0.4), (0.875, 0.41666666), (0.8666667, 0.41666666), (0.8666667, 0.4), (0.8666667, 0.4), (0.8666667, 0.41666666), (0.85833335, 0.41666666), (0.85833335, 0.4), (0.85833335, 0.4), (0.85833335, 0.41666666), (0.85, 0.41666666), (0.85, 0.4), (0.85, 0.4), (0.85, 0.41666666), (0.84166664, 0.41666666), (0.84166664, 0.4), (0.84166664, 0.4), (0.84166664, 0.41666666), (0.8333333, 0.41666666), (0.8333333, 0.4), (0.8333333, 0.4), (0.8333333, 0.41666666), (0.825, 0.41666666), (0.825, 0.4), (0.825, 0.4), (0.825, 0.41666666), (0.81666666, 0.41666666), (0.81666666, 0.4), (0.81666666, 0.4), (0.81666666, 0.41666666), (0.80833334, 0.41666666), (0.80833334, 0.4), (0.80833334, 0.4), (0.80833334, 0.41666666), (0.8, 0.41666666), (0.8, 0.4), (0.8, 0.4), (0.8, 0.41666666), (0.7916667, 0.41666666), (0.7916667, 0.4), (0.7916667, 0.4), (0.7916667, 0.41666666), (0.78333336, 0.41666666), (0.78333336, 0.4), (0.78333336, 0.4), (0.78333336, 0.41666666), (0.775, 0.41666666), (0.775, 0.4), (0.775, 0.4), (0.775, 0.41666666), (0.76666665, 0.41666666), (0.76666665, 0.4), (0.76666665, 0.4), (0.76666665, 0.41666666), (0.7583333, 0.41666666), (0.7583333, 0.4), (0.7583333, 0.4), (0.7583333, 0.41666666), (0.75, 0.41666666), (0.75, 0.4), (0.75, 0.4), (0.75, 0.41666666), (0.7416667, 0.41666666), (0.7416667, 0.4), (0.7416667, 0.4), (0.7416667, 0.41666666), (0.73333335, 0.41666666), (0.73333335, 0.4), (0.73333335, 0.4), (0.73333335, 0.41666666), (0.725, 0.41666666), (0.725, 0.4), (0.725, 0.4), (0.725, 0.41666666), (0.71666664, 0.41666666), (0.71666664, 0.4), (0.71666664, 0.4), (0.71666664, 0.41666666), (0.7083333, 0.41666666), (0.7083333, 0.4), (0.7083333, 0.4), (0.7083333, 0.41666666), (0.7, 0.41666666), (0.7, 0.4), (0.7, 0.4), (0.7, 0.41666666), (0.69166666, 0.41666666), (0.69166666, 0.4), (0.69166666, 0.4), (0.69166666, 0.41666666), (0.68333334, 0.41666666), (0.68333334, 0.4), (0.68333334, 0.4), (0.68333334, 0.41666666), (0.675, 0.41666666), (0.675, 0.4), (0.675, 0.4), (0.675, 0.41666666), (0.6666667, 0.41666666), (0.6666667, 0.4), (0.6666667, 0.4), (0.6666667, 0.41666666), (0.65833336, 0.41666666), (0.65833336, 0.4), (0.65833336, 0.4), (0.65833336, 0.41666666), (0.65, 0.41666666), (0.65, 0.4), (0.65, 0.4), (0.65, 0.41666666), (0.64166665, 0.41666666), (0.64166665, 0.4), (0.64166665, 0.4), (0.64166665, 0.41666666), (0.6333333, 0.41666666), (0.6333333, 0.4), (0.6333333, 0.4), (0.6333333, 0.41666666), (0.625, 0.41666666), (0.625, 0.4), (0.625, 0.4), (0.625, 0.41666666), (0.6166667, 0.41666666), (0.6166667, 0.4), (0.6166667, 0.4), (0.6166667, 0.41666666), (0.60833335, 0.41666666), (0.60833335, 0.4), (0.60833335, 0.4), (0.60833335, 0.41666666), (0.6, 0.41666666), (0.6, 0.4), (0.6, 0.4), (0.6, 0.41666666), (0.59166664, 0.41666666), (0.59166664, 0.4), (0.59166664, 0.4), (0.59166664, 0.41666666), (0.5833333, 0.41666666), (0.5833333, 0.4), (0.5833333, 0.4), (0.5833333, 0.41666666), (0.575, 0.41666666), (0.575, 0.4), (0.575, 0.4), (0.575, 0.41666666), (0.56666666, 0.41666666), (0.56666666, 0.4), (0.56666666, 0.4), (0.56666666, 0.41666666), (0.55833334, 0.41666666), (0.55833334, 0.4), (0.55833334, 0.4), (0.55833334, 0.41666666), (0.55, 0.41666666), (0.55, 0.4), (0.55, 0.4), (0.55, 0.41666666), (0.5416667, 0.41666666), (0.5416667, 0.4), (0.5416667, 0.4), (0.5416667, 0.41666666), (0.53333336, 0.41666666), (0.53333336, 0.4), (0.53333336, 0.4), (0.53333336, 0.41666666), (0.525, 0.41666666), (0.525, 0.4), (0.525, 0.4), (0.525, 0.41666666), (0.51666665, 0.41666666), (0.51666665, 0.4), (0.51666665, 0.4), (0.51666665, 0.41666666), (0.5083333, 0.41666666), (0.5083333, 0.4), (0.5083333, 0.4), (0.5083333, 0.41666666), (0.5, 0.41666666), (0.5, 0.4), (0.5, 0.4), (0.5, 0.41666666), (0.49166667, 0.41666666), (0.49166667, 0.4), (0.49166667, 0.4), (0.49166667, 0.41666666), (0.48333332, 0.41666666), (0.48333332, 0.4), (0.48333332, 0.4), (0.48333332, 0.41666666), (0.475, 0.41666666), (0.475, 0.4), (0.475, 0.4), (0.475, 0.41666666), (0.46666667, 0.41666666), (0.46666667, 0.4), (0.46666667, 0.4), (0.46666667, 0.41666666), (0.45833334, 0.41666666), (0.45833334, 0.4), (0.45833334, 0.4), (0.45833334, 0.41666666), (0.45, 0.41666666), (0.45, 0.4), (0.45, 0.4), (0.45, 0.41666666), (0.44166666, 0.41666666), (0.44166666, 0.4), (0.44166666, 0.4), (0.44166666, 0.41666666), (0.43333334, 0.41666666), (0.43333334, 0.4), (0.43333334, 0.4), (0.43333334, 0.41666666), (0.425, 0.41666666), (0.425, 0.4), (0.425, 0.4), (0.425, 0.41666666), (0.41666666, 0.41666666), (0.41666666, 0.4), (0.41666666, 0.4), (0.41666666, 0.41666666), (0.40833333, 0.41666666), (0.40833333, 0.4), (0.40833333, 0.4), (0.40833333, 0.41666666), (0.4, 0.41666666), (0.4, 0.4), (0.4, 0.4), (0.4, 0.41666666), (0.39166668, 0.41666666), (0.39166668, 0.4), (0.39166668, 0.4), (0.39166668, 0.41666666), (0.38333333, 0.41666666), (0.38333333, 0.4), (0.38333333, 0.4), (0.38333333, 0.41666666), (0.375, 0.41666666), (0.375, 0.4), (0.375, 0.4), (0.375, 0.41666666), (0.36666667, 0.41666666), (0.36666667, 0.4), (0.36666667, 0.4), (0.36666667, 0.41666666), (0.35833332, 0.41666666), (0.35833332, 0.4), (0.35833332, 0.4), (0.35833332, 0.41666666), (0.35, 0.41666666), (0.35, 0.4), (0.35, 0.4), (0.35, 0.41666666), (0.34166667, 0.41666666), (0.34166667, 0.4), (0.34166667, 0.4), (0.34166667, 0.41666666), (0.33333334, 0.41666666), (0.33333334, 0.4), (0.33333334, 0.4), (0.33333334, 0.41666666), (0.325, 0.41666666), (0.325, 0.4), (0.325, 0.4), (0.325, 0.41666666), (0.31666666, 0.41666666), (0.31666666, 0.4), (0.31666666, 0.4), (0.31666666, 0.41666666), (0.30833334, 0.41666666), (0.30833334, 0.4), (0.30833334, 0.4), (0.30833334, 0.41666666), (0.3, 0.41666666), (0.3, 0.4), (0.3, 0.4), (0.3, 0.41666666), (0.29166666, 0.41666666), (0.29166666, 0.4), (0.29166666, 0.4), (0.29166666, 0.41666666), (0.28333333, 0.41666666), (0.28333333, 0.4), (0.28333333, 0.4), (0.28333333, 0.41666666), (0.275, 0.41666666), (0.275, 0.4), (0.275, 0.4), (0.275, 0.41666666), (0.26666668, 0.41666666), (0.26666668, 0.4), (0.26666668, 0.4), (0.26666668, 0.41666666), (0.25833333, 0.41666666), (0.25833333, 0.4), (0.25833333, 0.4), (0.25833333, 0.41666666), (0.25, 0.41666666), (0.25, 0.4), (0.25, 0.4), (0.25, 0.41666666), (0.24166666, 0.41666666), (0.24166666, 0.4), (0.24166666, 0.4), (0.24166666, 0.41666666), (0.23333333, 0.41666666), (0.23333333, 0.4), (0.23333333, 0.4), (0.23333333, 0.41666666), (0.225, 0.41666666), (0.225, 0.4), (0.225, 0.4), (0.225, 0.41666666), (0.21666667, 0.41666666), (0.21666667, 0.4), (0.21666667, 0.4), (0.21666667, 0.41666666), (0.20833333, 0.41666666), (0.20833333, 0.4), (0.20833333, 0.4), (0.20833333, 0.41666666), (0.2, 0.41666666), (0.2, 0.4), (0.2, 0.4), (0.2, 0.41666666), (0.19166666, 0.41666666), (0.19166666, 0.4), (0.19166666, 0.4), (0.19166666, 0.41666666), (0.18333334, 0.41666666), (0.18333334, 0.4), (0.18333334, 0.4), (0.18333334, 0.41666666), (0.175, 0.41666666), (0.175, 0.4), (0.175, 0.4), (0.175, 0.41666666), (0.16666667, 0.41666666), (0.16666667, 0.4), (0.16666667, 0.4), (0.16666667, 0.41666666), (0.15833333, 0.41666666), (0.15833333, 0.4), (0.15833333, 0.4), (0.15833333, 0.41666666), (0.15, 0.41666666), (0.15, 0.4), (0.15, 0.4), (0.15, 0.41666666), (0.14166667, 0.41666666), (0.14166667, 0.4), (0.14166667, 0.4), (0.14166667, 0.41666666), (0.13333334, 0.41666666), (0.13333334, 0.4), (0.13333334, 0.4), (0.13333334, 0.41666666), (0.125, 0.41666666), (0.125, 0.4), (0.125, 0.4), (0.125, 0.41666666), (0.11666667, 0.41666666), (0.11666667, 0.4), (0.11666667, 0.4), (0.11666667, 0.41666666), (0.108333334, 0.41666666), (0.108333334, 0.4), (0.108333334, 0.4), (0.108333334, 0.41666666), (0.1, 0.41666666), (0.1, 0.4), (0.1, 0.4), (0.1, 0.41666666), (0.09166667, 0.41666666), (0.09166667, 0.4), (0.09166667, 0.4), (0.09166667, 0.41666666), (0.083333336, 0.41666666), (0.083333336, 0.4), (0.083333336, 0.4), (0.083333336, 0.41666666), (0.075, 0.41666666), (0.075, 0.4), (0.075, 0.4), (0.075, 0.41666666), (0.06666667, 0.41666666), (0.06666667, 0.4), (0.06666667, 0.4), (0.06666667, 0.41666666), (0.058333334, 0.41666666), (0.058333334, 0.4), (0.058333334, 0.4), (0.058333334, 0.41666666), (0.05, 0.41666666), (0.05, 0.4), (0.05, 0.4), (0.05, 0.41666666), (0.041666668, 0.41666666), (0.041666668, 0.4), (0.041666668, 0.4), (0.041666668, 0.41666666), (0.033333335, 0.41666666), (0.033333335, 0.4), (0.033333335, 0.4), (0.033333335, 0.41666666), (0.025, 0.41666666), (0.025, 0.4), (0.025, 0.4), (0.025, 0.41666666), (0.016666668, 0.41666666), (0.016666668, 0.4), (0.016666668, 0.4), (0.016666668, 0.41666666), (0.008333334, 0.41666666), (0.008333334, 0.4), (0.008333334, 0.4), (0.008333334, 0.41666666), (0, 0.41666666), (0, 0.4), (1, 0.41666666), (1, 0.43333334), (0.9916667, 0.43333334), (0.9916667, 0.41666666), (0.9916667, 0.41666666), (0.9916667, 0.43333334), (0.98333335, 0.43333334), (0.98333335, 0.41666666), (0.98333335, 0.41666666), (0.98333335, 0.43333334), (0.975, 0.43333334), (0.975, 0.41666666), (0.975, 0.41666666), (0.975, 0.43333334), (0.96666664, 0.43333334), (0.96666664, 0.41666666), (0.96666664, 0.41666666), (0.96666664, 0.43333334), (0.9583333, 0.43333334), (0.9583333, 0.41666666), (0.9583333, 0.41666666), (0.9583333, 0.43333334), (0.95, 0.43333334), (0.95, 0.41666666), (0.95, 0.41666666), (0.95, 0.43333334), (0.94166666, 0.43333334), (0.94166666, 0.41666666), (0.94166666, 0.41666666), (0.94166666, 0.43333334), (0.93333334, 0.43333334), (0.93333334, 0.41666666), (0.93333334, 0.41666666), (0.93333334, 0.43333334), (0.925, 0.43333334), (0.925, 0.41666666), (0.925, 0.41666666), (0.925, 0.43333334), (0.9166667, 0.43333334), (0.9166667, 0.41666666), (0.9166667, 0.41666666), (0.9166667, 0.43333334), (0.90833336, 0.43333334), (0.90833336, 0.41666666), (0.90833336, 0.41666666), (0.90833336, 0.43333334), (0.9, 0.43333334), (0.9, 0.41666666), (0.9, 0.41666666), (0.9, 0.43333334), (0.89166665, 0.43333334), (0.89166665, 0.41666666), (0.89166665, 0.41666666), (0.89166665, 0.43333334), (0.8833333, 0.43333334), (0.8833333, 0.41666666), (0.8833333, 0.41666666), (0.8833333, 0.43333334), (0.875, 0.43333334), (0.875, 0.41666666), (0.875, 0.41666666), (0.875, 0.43333334), (0.8666667, 0.43333334), (0.8666667, 0.41666666), (0.8666667, 0.41666666), (0.8666667, 0.43333334), (0.85833335, 0.43333334), (0.85833335, 0.41666666), (0.85833335, 0.41666666), (0.85833335, 0.43333334), (0.85, 0.43333334), (0.85, 0.41666666), (0.85, 0.41666666), (0.85, 0.43333334), (0.84166664, 0.43333334), (0.84166664, 0.41666666), (0.84166664, 0.41666666), (0.84166664, 0.43333334), (0.8333333, 0.43333334), (0.8333333, 0.41666666), (0.8333333, 0.41666666), (0.8333333, 0.43333334), (0.825, 0.43333334), (0.825, 0.41666666), (0.825, 0.41666666), (0.825, 0.43333334), (0.81666666, 0.43333334), (0.81666666, 0.41666666), (0.81666666, 0.41666666), (0.81666666, 0.43333334), (0.80833334, 0.43333334), (0.80833334, 0.41666666), (0.80833334, 0.41666666), (0.80833334, 0.43333334), (0.8, 0.43333334), (0.8, 0.41666666), (0.8, 0.41666666), (0.8, 0.43333334), (0.7916667, 0.43333334), (0.7916667, 0.41666666), (0.7916667, 0.41666666), (0.7916667, 0.43333334), (0.78333336, 0.43333334), (0.78333336, 0.41666666), (0.78333336, 0.41666666), (0.78333336, 0.43333334), (0.775, 0.43333334), (0.775, 0.41666666), (0.775, 0.41666666), (0.775, 0.43333334), (0.76666665, 0.43333334), (0.76666665, 0.41666666), (0.76666665, 0.41666666), (0.76666665, 0.43333334), (0.7583333, 0.43333334), (0.7583333, 0.41666666), (0.7583333, 0.41666666), (0.7583333, 0.43333334), (0.75, 0.43333334), (0.75, 0.41666666), (0.75, 0.41666666), (0.75, 0.43333334), (0.7416667, 0.43333334), (0.7416667, 0.41666666), (0.7416667, 0.41666666), (0.7416667, 0.43333334), (0.73333335, 0.43333334), (0.73333335, 0.41666666), (0.73333335, 0.41666666), (0.73333335, 0.43333334), (0.725, 0.43333334), (0.725, 0.41666666), (0.725, 0.41666666), (0.725, 0.43333334), (0.71666664, 0.43333334), (0.71666664, 0.41666666), (0.71666664, 0.41666666), (0.71666664, 0.43333334), (0.7083333, 0.43333334), (0.7083333, 0.41666666), (0.7083333, 0.41666666), (0.7083333, 0.43333334), (0.7, 0.43333334), (0.7, 0.41666666), (0.7, 0.41666666), (0.7, 0.43333334), (0.69166666, 0.43333334), (0.69166666, 0.41666666), (0.69166666, 0.41666666), (0.69166666, 0.43333334), (0.68333334, 0.43333334), (0.68333334, 0.41666666), (0.68333334, 0.41666666), (0.68333334, 0.43333334), (0.675, 0.43333334), (0.675, 0.41666666), (0.675, 0.41666666), (0.675, 0.43333334), (0.6666667, 0.43333334), (0.6666667, 0.41666666), (0.6666667, 0.41666666), (0.6666667, 0.43333334), (0.65833336, 0.43333334), (0.65833336, 0.41666666), (0.65833336, 0.41666666), (0.65833336, 0.43333334), (0.65, 0.43333334), (0.65, 0.41666666), (0.65, 0.41666666), (0.65, 0.43333334), (0.64166665, 0.43333334), (0.64166665, 0.41666666), (0.64166665, 0.41666666), (0.64166665, 0.43333334), (0.6333333, 0.43333334), (0.6333333, 0.41666666), (0.6333333, 0.41666666), (0.6333333, 0.43333334), (0.625, 0.43333334), (0.625, 0.41666666), (0.625, 0.41666666), (0.625, 0.43333334), (0.6166667, 0.43333334), (0.6166667, 0.41666666), (0.6166667, 0.41666666), (0.6166667, 0.43333334), (0.60833335, 0.43333334), (0.60833335, 0.41666666), (0.60833335, 0.41666666), (0.60833335, 0.43333334), (0.6, 0.43333334), (0.6, 0.41666666), (0.6, 0.41666666), (0.6, 0.43333334), (0.59166664, 0.43333334), (0.59166664, 0.41666666), (0.59166664, 0.41666666), (0.59166664, 0.43333334), (0.5833333, 0.43333334), (0.5833333, 0.41666666), (0.5833333, 0.41666666), (0.5833333, 0.43333334), (0.575, 0.43333334), (0.575, 0.41666666), (0.575, 0.41666666), (0.575, 0.43333334), (0.56666666, 0.43333334), (0.56666666, 0.41666666), (0.56666666, 0.41666666), (0.56666666, 0.43333334), (0.55833334, 0.43333334), (0.55833334, 0.41666666), (0.55833334, 0.41666666), (0.55833334, 0.43333334), (0.55, 0.43333334), (0.55, 0.41666666), (0.55, 0.41666666), (0.55, 0.43333334), (0.5416667, 0.43333334), (0.5416667, 0.41666666), (0.5416667, 0.41666666), (0.5416667, 0.43333334), (0.53333336, 0.43333334), (0.53333336, 0.41666666), (0.53333336, 0.41666666), (0.53333336, 0.43333334), (0.525, 0.43333334), (0.525, 0.41666666), (0.525, 0.41666666), (0.525, 0.43333334), (0.51666665, 0.43333334), (0.51666665, 0.41666666), (0.51666665, 0.41666666), (0.51666665, 0.43333334), (0.5083333, 0.43333334), (0.5083333, 0.41666666), (0.5083333, 0.41666666), (0.5083333, 0.43333334), (0.5, 0.43333334), (0.5, 0.41666666), (0.5, 0.41666666), (0.5, 0.43333334), (0.49166667, 0.43333334), (0.49166667, 0.41666666), (0.49166667, 0.41666666), (0.49166667, 0.43333334), (0.48333332, 0.43333334), (0.48333332, 0.41666666), (0.48333332, 0.41666666), (0.48333332, 0.43333334), (0.475, 0.43333334), (0.475, 0.41666666), (0.475, 0.41666666), (0.475, 0.43333334), (0.46666667, 0.43333334), (0.46666667, 0.41666666), (0.46666667, 0.41666666), (0.46666667, 0.43333334), (0.45833334, 0.43333334), (0.45833334, 0.41666666), (0.45833334, 0.41666666), (0.45833334, 0.43333334), (0.45, 0.43333334), (0.45, 0.41666666), (0.45, 0.41666666), (0.45, 0.43333334), (0.44166666, 0.43333334), (0.44166666, 0.41666666), (0.44166666, 0.41666666), (0.44166666, 0.43333334), (0.43333334, 0.43333334), (0.43333334, 0.41666666), (0.43333334, 0.41666666), (0.43333334, 0.43333334), (0.425, 0.43333334), (0.425, 0.41666666), (0.425, 0.41666666), (0.425, 0.43333334), (0.41666666, 0.43333334), (0.41666666, 0.41666666), (0.41666666, 0.41666666), (0.41666666, 0.43333334), (0.40833333, 0.43333334), (0.40833333, 0.41666666), (0.40833333, 0.41666666), (0.40833333, 0.43333334), (0.4, 0.43333334), (0.4, 0.41666666), (0.4, 0.41666666), (0.4, 0.43333334), (0.39166668, 0.43333334), (0.39166668, 0.41666666), (0.39166668, 0.41666666), (0.39166668, 0.43333334), (0.38333333, 0.43333334), (0.38333333, 0.41666666), (0.38333333, 0.41666666), (0.38333333, 0.43333334), (0.375, 0.43333334), (0.375, 0.41666666), (0.375, 0.41666666), (0.375, 0.43333334), (0.36666667, 0.43333334), (0.36666667, 0.41666666), (0.36666667, 0.41666666), (0.36666667, 0.43333334), (0.35833332, 0.43333334), (0.35833332, 0.41666666), (0.35833332, 0.41666666), (0.35833332, 0.43333334), (0.35, 0.43333334), (0.35, 0.41666666), (0.35, 0.41666666), (0.35, 0.43333334), (0.34166667, 0.43333334), (0.34166667, 0.41666666), (0.34166667, 0.41666666), (0.34166667, 0.43333334), (0.33333334, 0.43333334), (0.33333334, 0.41666666), (0.33333334, 0.41666666), (0.33333334, 0.43333334), (0.325, 0.43333334), (0.325, 0.41666666), (0.325, 0.41666666), (0.325, 0.43333334), (0.31666666, 0.43333334), (0.31666666, 0.41666666), (0.31666666, 0.41666666), (0.31666666, 0.43333334), (0.30833334, 0.43333334), (0.30833334, 0.41666666), (0.30833334, 0.41666666), (0.30833334, 0.43333334), (0.3, 0.43333334), (0.3, 0.41666666), (0.3, 0.41666666), (0.3, 0.43333334), (0.29166666, 0.43333334), (0.29166666, 0.41666666), (0.29166666, 0.41666666), (0.29166666, 0.43333334), (0.28333333, 0.43333334), (0.28333333, 0.41666666), (0.28333333, 0.41666666), (0.28333333, 0.43333334), (0.275, 0.43333334), (0.275, 0.41666666), (0.275, 0.41666666), (0.275, 0.43333334), (0.26666668, 0.43333334), (0.26666668, 0.41666666), (0.26666668, 0.41666666), (0.26666668, 0.43333334), (0.25833333, 0.43333334), (0.25833333, 0.41666666), (0.25833333, 0.41666666), (0.25833333, 0.43333334), (0.25, 0.43333334), (0.25, 0.41666666), (0.25, 0.41666666), (0.25, 0.43333334), (0.24166666, 0.43333334), (0.24166666, 0.41666666), (0.24166666, 0.41666666), (0.24166666, 0.43333334), (0.23333333, 0.43333334), (0.23333333, 0.41666666), (0.23333333, 0.41666666), (0.23333333, 0.43333334), (0.225, 0.43333334), (0.225, 0.41666666), (0.225, 0.41666666), (0.225, 0.43333334), (0.21666667, 0.43333334), (0.21666667, 0.41666666), (0.21666667, 0.41666666), (0.21666667, 0.43333334), (0.20833333, 0.43333334), (0.20833333, 0.41666666), (0.20833333, 0.41666666), (0.20833333, 0.43333334), (0.2, 0.43333334), (0.2, 0.41666666), (0.2, 0.41666666), (0.2, 0.43333334), (0.19166666, 0.43333334), (0.19166666, 0.41666666), (0.19166666, 0.41666666), (0.19166666, 0.43333334), (0.18333334, 0.43333334), (0.18333334, 0.41666666), (0.18333334, 0.41666666), (0.18333334, 0.43333334), (0.175, 0.43333334), (0.175, 0.41666666), (0.175, 0.41666666), (0.175, 0.43333334), (0.16666667, 0.43333334), (0.16666667, 0.41666666), (0.16666667, 0.41666666), (0.16666667, 0.43333334), (0.15833333, 0.43333334), (0.15833333, 0.41666666), (0.15833333, 0.41666666), (0.15833333, 0.43333334), (0.15, 0.43333334), (0.15, 0.41666666), (0.15, 0.41666666), (0.15, 0.43333334), (0.14166667, 0.43333334), (0.14166667, 0.41666666), (0.14166667, 0.41666666), (0.14166667, 0.43333334), (0.13333334, 0.43333334), (0.13333334, 0.41666666), (0.13333334, 0.41666666), (0.13333334, 0.43333334), (0.125, 0.43333334), (0.125, 0.41666666), (0.125, 0.41666666), (0.125, 0.43333334), (0.11666667, 0.43333334), (0.11666667, 0.41666666), (0.11666667, 0.41666666), (0.11666667, 0.43333334), (0.108333334, 0.43333334), (0.108333334, 0.41666666), (0.108333334, 0.41666666), (0.108333334, 0.43333334), (0.1, 0.43333334), (0.1, 0.41666666), (0.1, 0.41666666), (0.1, 0.43333334), (0.09166667, 0.43333334), (0.09166667, 0.41666666), (0.09166667, 0.41666666), (0.09166667, 0.43333334), (0.083333336, 0.43333334), (0.083333336, 0.41666666), (0.083333336, 0.41666666), (0.083333336, 0.43333334), (0.075, 0.43333334), (0.075, 0.41666666), (0.075, 0.41666666), (0.075, 0.43333334), (0.06666667, 0.43333334), (0.06666667, 0.41666666), (0.06666667, 0.41666666), (0.06666667, 0.43333334), (0.058333334, 0.43333334), (0.058333334, 0.41666666), (0.058333334, 0.41666666), (0.058333334, 0.43333334), (0.05, 0.43333334), (0.05, 0.41666666), (0.05, 0.41666666), (0.05, 0.43333334), (0.041666668, 0.43333334), (0.041666668, 0.41666666), (0.041666668, 0.41666666), (0.041666668, 0.43333334), (0.033333335, 0.43333334), (0.033333335, 0.41666666), (0.033333335, 0.41666666), (0.033333335, 0.43333334), (0.025, 0.43333334), (0.025, 0.41666666), (0.025, 0.41666666), (0.025, 0.43333334), (0.016666668, 0.43333334), (0.016666668, 0.41666666), (0.016666668, 0.41666666), (0.016666668, 0.43333334), (0.008333334, 0.43333334), (0.008333334, 0.41666666), (0.008333334, 0.41666666), (0.008333334, 0.43333334), (0, 0.43333334), (0, 0.41666666), (1, 0.43333334), (1, 0.45), (0.9916667, 0.45), (0.9916667, 0.43333334), (0.9916667, 0.43333334), (0.9916667, 0.45), (0.98333335, 0.45), (0.98333335, 0.43333334), (0.98333335, 0.43333334), (0.98333335, 0.45), (0.975, 0.45), (0.975, 0.43333334), (0.975, 0.43333334), (0.975, 0.45), (0.96666664, 0.45), (0.96666664, 0.43333334), (0.96666664, 0.43333334), (0.96666664, 0.45), (0.9583333, 0.45), (0.9583333, 0.43333334), (0.9583333, 0.43333334), (0.9583333, 0.45), (0.95, 0.45), (0.95, 0.43333334), (0.95, 0.43333334), (0.95, 0.45), (0.94166666, 0.45), (0.94166666, 0.43333334), (0.94166666, 0.43333334), (0.94166666, 0.45), (0.93333334, 0.45), (0.93333334, 0.43333334), (0.93333334, 0.43333334), (0.93333334, 0.45), (0.925, 0.45), (0.925, 0.43333334), (0.925, 0.43333334), (0.925, 0.45), (0.9166667, 0.45), (0.9166667, 0.43333334), (0.9166667, 0.43333334), (0.9166667, 0.45), (0.90833336, 0.45), (0.90833336, 0.43333334), (0.90833336, 0.43333334), (0.90833336, 0.45), (0.9, 0.45), (0.9, 0.43333334), (0.9, 0.43333334), (0.9, 0.45), (0.89166665, 0.45), (0.89166665, 0.43333334), (0.89166665, 0.43333334), (0.89166665, 0.45), (0.8833333, 0.45), (0.8833333, 0.43333334), (0.8833333, 0.43333334), (0.8833333, 0.45), (0.875, 0.45), (0.875, 0.43333334), (0.875, 0.43333334), (0.875, 0.45), (0.8666667, 0.45), (0.8666667, 0.43333334), (0.8666667, 0.43333334), (0.8666667, 0.45), (0.85833335, 0.45), (0.85833335, 0.43333334), (0.85833335, 0.43333334), (0.85833335, 0.45), (0.85, 0.45), (0.85, 0.43333334), (0.85, 0.43333334), (0.85, 0.45), (0.84166664, 0.45), (0.84166664, 0.43333334), (0.84166664, 0.43333334), (0.84166664, 0.45), (0.8333333, 0.45), (0.8333333, 0.43333334), (0.8333333, 0.43333334), (0.8333333, 0.45), (0.825, 0.45), (0.825, 0.43333334), (0.825, 0.43333334), (0.825, 0.45), (0.81666666, 0.45), (0.81666666, 0.43333334), (0.81666666, 0.43333334), (0.81666666, 0.45), (0.80833334, 0.45), (0.80833334, 0.43333334), (0.80833334, 0.43333334), (0.80833334, 0.45), (0.8, 0.45), (0.8, 0.43333334), (0.8, 0.43333334), (0.8, 0.45), (0.7916667, 0.45), (0.7916667, 0.43333334), (0.7916667, 0.43333334), (0.7916667, 0.45), (0.78333336, 0.45), (0.78333336, 0.43333334), (0.78333336, 0.43333334), (0.78333336, 0.45), (0.775, 0.45), (0.775, 0.43333334), (0.775, 0.43333334), (0.775, 0.45), (0.76666665, 0.45), (0.76666665, 0.43333334), (0.76666665, 0.43333334), (0.76666665, 0.45), (0.7583333, 0.45), (0.7583333, 0.43333334), (0.7583333, 0.43333334), (0.7583333, 0.45), (0.75, 0.45), (0.75, 0.43333334), (0.75, 0.43333334), (0.75, 0.45), (0.7416667, 0.45), (0.7416667, 0.43333334), (0.7416667, 0.43333334), (0.7416667, 0.45), (0.73333335, 0.45), (0.73333335, 0.43333334), (0.73333335, 0.43333334), (0.73333335, 0.45), (0.725, 0.45), (0.725, 0.43333334), (0.725, 0.43333334), (0.725, 0.45), (0.71666664, 0.45), (0.71666664, 0.43333334), (0.71666664, 0.43333334), (0.71666664, 0.45), (0.7083333, 0.45), (0.7083333, 0.43333334), (0.7083333, 0.43333334), (0.7083333, 0.45), (0.7, 0.45), (0.7, 0.43333334), (0.7, 0.43333334), (0.7, 0.45), (0.69166666, 0.45), (0.69166666, 0.43333334), (0.69166666, 0.43333334), (0.69166666, 0.45), (0.68333334, 0.45), (0.68333334, 0.43333334), (0.68333334, 0.43333334), (0.68333334, 0.45), (0.675, 0.45), (0.675, 0.43333334), (0.675, 0.43333334), (0.675, 0.45), (0.6666667, 0.45), (0.6666667, 0.43333334), (0.6666667, 0.43333334), (0.6666667, 0.45), (0.65833336, 0.45), (0.65833336, 0.43333334), (0.65833336, 0.43333334), (0.65833336, 0.45), (0.65, 0.45), (0.65, 0.43333334), (0.65, 0.43333334), (0.65, 0.45), (0.64166665, 0.45), (0.64166665, 0.43333334), (0.64166665, 0.43333334), (0.64166665, 0.45), (0.6333333, 0.45), (0.6333333, 0.43333334), (0.6333333, 0.43333334), (0.6333333, 0.45), (0.625, 0.45), (0.625, 0.43333334), (0.625, 0.43333334), (0.625, 0.45), (0.6166667, 0.45), (0.6166667, 0.43333334), (0.6166667, 0.43333334), (0.6166667, 0.45), (0.60833335, 0.45), (0.60833335, 0.43333334), (0.60833335, 0.43333334), (0.60833335, 0.45), (0.6, 0.45), (0.6, 0.43333334), (0.6, 0.43333334), (0.6, 0.45), (0.59166664, 0.45), (0.59166664, 0.43333334), (0.59166664, 0.43333334), (0.59166664, 0.45), (0.5833333, 0.45), (0.5833333, 0.43333334), (0.5833333, 0.43333334), (0.5833333, 0.45), (0.575, 0.45), (0.575, 0.43333334), (0.575, 0.43333334), (0.575, 0.45), (0.56666666, 0.45), (0.56666666, 0.43333334), (0.56666666, 0.43333334), (0.56666666, 0.45), (0.55833334, 0.45), (0.55833334, 0.43333334), (0.55833334, 0.43333334), (0.55833334, 0.45), (0.55, 0.45), (0.55, 0.43333334), (0.55, 0.43333334), (0.55, 0.45), (0.5416667, 0.45), (0.5416667, 0.43333334), (0.5416667, 0.43333334), (0.5416667, 0.45), (0.53333336, 0.45), (0.53333336, 0.43333334), (0.53333336, 0.43333334), (0.53333336, 0.45), (0.525, 0.45), (0.525, 0.43333334), (0.525, 0.43333334), (0.525, 0.45), (0.51666665, 0.45), (0.51666665, 0.43333334), (0.51666665, 0.43333334), (0.51666665, 0.45), (0.5083333, 0.45), (0.5083333, 0.43333334), (0.5083333, 0.43333334), (0.5083333, 0.45), (0.5, 0.45), (0.5, 0.43333334), (0.5, 0.43333334), (0.5, 0.45), (0.49166667, 0.45), (0.49166667, 0.43333334), (0.49166667, 0.43333334), (0.49166667, 0.45), (0.48333332, 0.45), (0.48333332, 0.43333334), (0.48333332, 0.43333334), (0.48333332, 0.45), (0.475, 0.45), (0.475, 0.43333334), (0.475, 0.43333334), (0.475, 0.45), (0.46666667, 0.45), (0.46666667, 0.43333334), (0.46666667, 0.43333334), (0.46666667, 0.45), (0.45833334, 0.45), (0.45833334, 0.43333334), (0.45833334, 0.43333334), (0.45833334, 0.45), (0.45, 0.45), (0.45, 0.43333334), (0.45, 0.43333334), (0.45, 0.45), (0.44166666, 0.45), (0.44166666, 0.43333334), (0.44166666, 0.43333334), (0.44166666, 0.45), (0.43333334, 0.45), (0.43333334, 0.43333334), (0.43333334, 0.43333334), (0.43333334, 0.45), (0.425, 0.45), (0.425, 0.43333334), (0.425, 0.43333334), (0.425, 0.45), (0.41666666, 0.45), (0.41666666, 0.43333334), (0.41666666, 0.43333334), (0.41666666, 0.45), (0.40833333, 0.45), (0.40833333, 0.43333334), (0.40833333, 0.43333334), (0.40833333, 0.45), (0.4, 0.45), (0.4, 0.43333334), (0.4, 0.43333334), (0.4, 0.45), (0.39166668, 0.45), (0.39166668, 0.43333334), (0.39166668, 0.43333334), (0.39166668, 0.45), (0.38333333, 0.45), (0.38333333, 0.43333334), (0.38333333, 0.43333334), (0.38333333, 0.45), (0.375, 0.45), (0.375, 0.43333334), (0.375, 0.43333334), (0.375, 0.45), (0.36666667, 0.45), (0.36666667, 0.43333334), (0.36666667, 0.43333334), (0.36666667, 0.45), (0.35833332, 0.45), (0.35833332, 0.43333334), (0.35833332, 0.43333334), (0.35833332, 0.45), (0.35, 0.45), (0.35, 0.43333334), (0.35, 0.43333334), (0.35, 0.45), (0.34166667, 0.45), (0.34166667, 0.43333334), (0.34166667, 0.43333334), (0.34166667, 0.45), (0.33333334, 0.45), (0.33333334, 0.43333334), (0.33333334, 0.43333334), (0.33333334, 0.45), (0.325, 0.45), (0.325, 0.43333334), (0.325, 0.43333334), (0.325, 0.45), (0.31666666, 0.45), (0.31666666, 0.43333334), (0.31666666, 0.43333334), (0.31666666, 0.45), (0.30833334, 0.45), (0.30833334, 0.43333334), (0.30833334, 0.43333334), (0.30833334, 0.45), (0.3, 0.45), (0.3, 0.43333334), (0.3, 0.43333334), (0.3, 0.45), (0.29166666, 0.45), (0.29166666, 0.43333334), (0.29166666, 0.43333334), (0.29166666, 0.45), (0.28333333, 0.45), (0.28333333, 0.43333334), (0.28333333, 0.43333334), (0.28333333, 0.45), (0.275, 0.45), (0.275, 0.43333334), (0.275, 0.43333334), (0.275, 0.45), (0.26666668, 0.45), (0.26666668, 0.43333334), (0.26666668, 0.43333334), (0.26666668, 0.45), (0.25833333, 0.45), (0.25833333, 0.43333334), (0.25833333, 0.43333334), (0.25833333, 0.45), (0.25, 0.45), (0.25, 0.43333334), (0.25, 0.43333334), (0.25, 0.45), (0.24166666, 0.45), (0.24166666, 0.43333334), (0.24166666, 0.43333334), (0.24166666, 0.45), (0.23333333, 0.45), (0.23333333, 0.43333334), (0.23333333, 0.43333334), (0.23333333, 0.45), (0.225, 0.45), (0.225, 0.43333334), (0.225, 0.43333334), (0.225, 0.45), (0.21666667, 0.45), (0.21666667, 0.43333334), (0.21666667, 0.43333334), (0.21666667, 0.45), (0.20833333, 0.45), (0.20833333, 0.43333334), (0.20833333, 0.43333334), (0.20833333, 0.45), (0.2, 0.45), (0.2, 0.43333334), (0.2, 0.43333334), (0.2, 0.45), (0.19166666, 0.45), (0.19166666, 0.43333334), (0.19166666, 0.43333334), (0.19166666, 0.45), (0.18333334, 0.45), (0.18333334, 0.43333334), (0.18333334, 0.43333334), (0.18333334, 0.45), (0.175, 0.45), (0.175, 0.43333334), (0.175, 0.43333334), (0.175, 0.45), (0.16666667, 0.45), (0.16666667, 0.43333334), (0.16666667, 0.43333334), (0.16666667, 0.45), (0.15833333, 0.45), (0.15833333, 0.43333334), (0.15833333, 0.43333334), (0.15833333, 0.45), (0.15, 0.45), (0.15, 0.43333334), (0.15, 0.43333334), (0.15, 0.45), (0.14166667, 0.45), (0.14166667, 0.43333334), (0.14166667, 0.43333334), (0.14166667, 0.45), (0.13333334, 0.45), (0.13333334, 0.43333334), (0.13333334, 0.43333334), (0.13333334, 0.45), (0.125, 0.45), (0.125, 0.43333334), (0.125, 0.43333334), (0.125, 0.45), (0.11666667, 0.45), (0.11666667, 0.43333334), (0.11666667, 0.43333334), (0.11666667, 0.45), (0.108333334, 0.45), (0.108333334, 0.43333334), (0.108333334, 0.43333334), (0.108333334, 0.45), (0.1, 0.45), (0.1, 0.43333334), (0.1, 0.43333334), (0.1, 0.45), (0.09166667, 0.45), (0.09166667, 0.43333334), (0.09166667, 0.43333334), (0.09166667, 0.45), (0.083333336, 0.45), (0.083333336, 0.43333334), (0.083333336, 0.43333334), (0.083333336, 0.45), (0.075, 0.45), (0.075, 0.43333334), (0.075, 0.43333334), (0.075, 0.45), (0.06666667, 0.45), (0.06666667, 0.43333334), (0.06666667, 0.43333334), (0.06666667, 0.45), (0.058333334, 0.45), (0.058333334, 0.43333334), (0.058333334, 0.43333334), (0.058333334, 0.45), (0.05, 0.45), (0.05, 0.43333334), (0.05, 0.43333334), (0.05, 0.45), (0.041666668, 0.45), (0.041666668, 0.43333334), (0.041666668, 0.43333334), (0.041666668, 0.45), (0.033333335, 0.45), (0.033333335, 0.43333334), (0.033333335, 0.43333334), (0.033333335, 0.45), (0.025, 0.45), (0.025, 0.43333334), (0.025, 0.43333334), (0.025, 0.45), (0.016666668, 0.45), (0.016666668, 0.43333334), (0.016666668, 0.43333334), (0.016666668, 0.45), (0.008333334, 0.45), (0.008333334, 0.43333334), (0.008333334, 0.43333334), (0.008333334, 0.45), (0, 0.45), (0, 0.43333334), (1, 0.45), (1, 0.46666667), (0.9916667, 0.46666667), (0.9916667, 0.45), (0.9916667, 0.45), (0.9916667, 0.46666667), (0.98333335, 0.46666667), (0.98333335, 0.45), (0.98333335, 0.45), (0.98333335, 0.46666667), (0.975, 0.46666667), (0.975, 0.45), (0.975, 0.45), (0.975, 0.46666667), (0.96666664, 0.46666667), (0.96666664, 0.45), (0.96666664, 0.45), (0.96666664, 0.46666667), (0.9583333, 0.46666667), (0.9583333, 0.45), (0.9583333, 0.45), (0.9583333, 0.46666667), (0.95, 0.46666667), (0.95, 0.45), (0.95, 0.45), (0.95, 0.46666667), (0.94166666, 0.46666667), (0.94166666, 0.45), (0.94166666, 0.45), (0.94166666, 0.46666667), (0.93333334, 0.46666667), (0.93333334, 0.45), (0.93333334, 0.45), (0.93333334, 0.46666667), (0.925, 0.46666667), (0.925, 0.45), (0.925, 0.45), (0.925, 0.46666667), (0.9166667, 0.46666667), (0.9166667, 0.45), (0.9166667, 0.45), (0.9166667, 0.46666667), (0.90833336, 0.46666667), (0.90833336, 0.45), (0.90833336, 0.45), (0.90833336, 0.46666667), (0.9, 0.46666667), (0.9, 0.45), (0.9, 0.45), (0.9, 0.46666667), (0.89166665, 0.46666667), (0.89166665, 0.45), (0.89166665, 0.45), (0.89166665, 0.46666667), (0.8833333, 0.46666667), (0.8833333, 0.45), (0.8833333, 0.45), (0.8833333, 0.46666667), (0.875, 0.46666667), (0.875, 0.45), (0.875, 0.45), (0.875, 0.46666667), (0.8666667, 0.46666667), (0.8666667, 0.45), (0.8666667, 0.45), (0.8666667, 0.46666667), (0.85833335, 0.46666667), (0.85833335, 0.45), (0.85833335, 0.45), (0.85833335, 0.46666667), (0.85, 0.46666667), (0.85, 0.45), (0.85, 0.45), (0.85, 0.46666667), (0.84166664, 0.46666667), (0.84166664, 0.45), (0.84166664, 0.45), (0.84166664, 0.46666667), (0.8333333, 0.46666667), (0.8333333, 0.45), (0.8333333, 0.45), (0.8333333, 0.46666667), (0.825, 0.46666667), (0.825, 0.45), (0.825, 0.45), (0.825, 0.46666667), (0.81666666, 0.46666667), (0.81666666, 0.45), (0.81666666, 0.45), (0.81666666, 0.46666667), (0.80833334, 0.46666667), (0.80833334, 0.45), (0.80833334, 0.45), (0.80833334, 0.46666667), (0.8, 0.46666667), (0.8, 0.45), (0.8, 0.45), (0.8, 0.46666667), (0.7916667, 0.46666667), (0.7916667, 0.45), (0.7916667, 0.45), (0.7916667, 0.46666667), (0.78333336, 0.46666667), (0.78333336, 0.45), (0.78333336, 0.45), (0.78333336, 0.46666667), (0.775, 0.46666667), (0.775, 0.45), (0.775, 0.45), (0.775, 0.46666667), (0.76666665, 0.46666667), (0.76666665, 0.45), (0.76666665, 0.45), (0.76666665, 0.46666667), (0.7583333, 0.46666667), (0.7583333, 0.45), (0.7583333, 0.45), (0.7583333, 0.46666667), (0.75, 0.46666667), (0.75, 0.45), (0.75, 0.45), (0.75, 0.46666667), (0.7416667, 0.46666667), (0.7416667, 0.45), (0.7416667, 0.45), (0.7416667, 0.46666667), (0.73333335, 0.46666667), (0.73333335, 0.45), (0.73333335, 0.45), (0.73333335, 0.46666667), (0.725, 0.46666667), (0.725, 0.45), (0.725, 0.45), (0.725, 0.46666667), (0.71666664, 0.46666667), (0.71666664, 0.45), (0.71666664, 0.45), (0.71666664, 0.46666667), (0.7083333, 0.46666667), (0.7083333, 0.45), (0.7083333, 0.45), (0.7083333, 0.46666667), (0.7, 0.46666667), (0.7, 0.45), (0.7, 0.45), (0.7, 0.46666667), (0.69166666, 0.46666667), (0.69166666, 0.45), (0.69166666, 0.45), (0.69166666, 0.46666667), (0.68333334, 0.46666667), (0.68333334, 0.45), (0.68333334, 0.45), (0.68333334, 0.46666667), (0.675, 0.46666667), (0.675, 0.45), (0.675, 0.45), (0.675, 0.46666667), (0.6666667, 0.46666667), (0.6666667, 0.45), (0.6666667, 0.45), (0.6666667, 0.46666667), (0.65833336, 0.46666667), (0.65833336, 0.45), (0.65833336, 0.45), (0.65833336, 0.46666667), (0.65, 0.46666667), (0.65, 0.45), (0.65, 0.45), (0.65, 0.46666667), (0.64166665, 0.46666667), (0.64166665, 0.45), (0.64166665, 0.45), (0.64166665, 0.46666667), (0.6333333, 0.46666667), (0.6333333, 0.45), (0.6333333, 0.45), (0.6333333, 0.46666667), (0.625, 0.46666667), (0.625, 0.45), (0.625, 0.45), (0.625, 0.46666667), (0.6166667, 0.46666667), (0.6166667, 0.45), (0.6166667, 0.45), (0.6166667, 0.46666667), (0.60833335, 0.46666667), (0.60833335, 0.45), (0.60833335, 0.45), (0.60833335, 0.46666667), (0.6, 0.46666667), (0.6, 0.45), (0.6, 0.45), (0.6, 0.46666667), (0.59166664, 0.46666667), (0.59166664, 0.45), (0.59166664, 0.45), (0.59166664, 0.46666667), (0.5833333, 0.46666667), (0.5833333, 0.45), (0.5833333, 0.45), (0.5833333, 0.46666667), (0.575, 0.46666667), (0.575, 0.45), (0.575, 0.45), (0.575, 0.46666667), (0.56666666, 0.46666667), (0.56666666, 0.45), (0.56666666, 0.45), (0.56666666, 0.46666667), (0.55833334, 0.46666667), (0.55833334, 0.45), (0.55833334, 0.45), (0.55833334, 0.46666667), (0.55, 0.46666667), (0.55, 0.45), (0.55, 0.45), (0.55, 0.46666667), (0.5416667, 0.46666667), (0.5416667, 0.45), (0.5416667, 0.45), (0.5416667, 0.46666667), (0.53333336, 0.46666667), (0.53333336, 0.45), (0.53333336, 0.45), (0.53333336, 0.46666667), (0.525, 0.46666667), (0.525, 0.45), (0.525, 0.45), (0.525, 0.46666667), (0.51666665, 0.46666667), (0.51666665, 0.45), (0.51666665, 0.45), (0.51666665, 0.46666667), (0.5083333, 0.46666667), (0.5083333, 0.45), (0.5083333, 0.45), (0.5083333, 0.46666667), (0.5, 0.46666667), (0.5, 0.45), (0.5, 0.45), (0.5, 0.46666667), (0.49166667, 0.46666667), (0.49166667, 0.45), (0.49166667, 0.45), (0.49166667, 0.46666667), (0.48333332, 0.46666667), (0.48333332, 0.45), (0.48333332, 0.45), (0.48333332, 0.46666667), (0.475, 0.46666667), (0.475, 0.45), (0.475, 0.45), (0.475, 0.46666667), (0.46666667, 0.46666667), (0.46666667, 0.45), (0.46666667, 0.45), (0.46666667, 0.46666667), (0.45833334, 0.46666667), (0.45833334, 0.45), (0.45833334, 0.45), (0.45833334, 0.46666667), (0.45, 0.46666667), (0.45, 0.45), (0.45, 0.45), (0.45, 0.46666667), (0.44166666, 0.46666667), (0.44166666, 0.45), (0.44166666, 0.45), (0.44166666, 0.46666667), (0.43333334, 0.46666667), (0.43333334, 0.45), (0.43333334, 0.45), (0.43333334, 0.46666667), (0.425, 0.46666667), (0.425, 0.45), (0.425, 0.45), (0.425, 0.46666667), (0.41666666, 0.46666667), (0.41666666, 0.45), (0.41666666, 0.45), (0.41666666, 0.46666667), (0.40833333, 0.46666667), (0.40833333, 0.45), (0.40833333, 0.45), (0.40833333, 0.46666667), (0.4, 0.46666667), (0.4, 0.45), (0.4, 0.45), (0.4, 0.46666667), (0.39166668, 0.46666667), (0.39166668, 0.45), (0.39166668, 0.45), (0.39166668, 0.46666667), (0.38333333, 0.46666667), (0.38333333, 0.45), (0.38333333, 0.45), (0.38333333, 0.46666667), (0.375, 0.46666667), (0.375, 0.45), (0.375, 0.45), (0.375, 0.46666667), (0.36666667, 0.46666667), (0.36666667, 0.45), (0.36666667, 0.45), (0.36666667, 0.46666667), (0.35833332, 0.46666667), (0.35833332, 0.45), (0.35833332, 0.45), (0.35833332, 0.46666667), (0.35, 0.46666667), (0.35, 0.45), (0.35, 0.45), (0.35, 0.46666667), (0.34166667, 0.46666667), (0.34166667, 0.45), (0.34166667, 0.45), (0.34166667, 0.46666667), (0.33333334, 0.46666667), (0.33333334, 0.45), (0.33333334, 0.45), (0.33333334, 0.46666667), (0.325, 0.46666667), (0.325, 0.45), (0.325, 0.45), (0.325, 0.46666667), (0.31666666, 0.46666667), (0.31666666, 0.45), (0.31666666, 0.45), (0.31666666, 0.46666667), (0.30833334, 0.46666667), (0.30833334, 0.45), (0.30833334, 0.45), (0.30833334, 0.46666667), (0.3, 0.46666667), (0.3, 0.45), (0.3, 0.45), (0.3, 0.46666667), (0.29166666, 0.46666667), (0.29166666, 0.45), (0.29166666, 0.45), (0.29166666, 0.46666667), (0.28333333, 0.46666667), (0.28333333, 0.45), (0.28333333, 0.45), (0.28333333, 0.46666667), (0.275, 0.46666667), (0.275, 0.45), (0.275, 0.45), (0.275, 0.46666667), (0.26666668, 0.46666667), (0.26666668, 0.45), (0.26666668, 0.45), (0.26666668, 0.46666667), (0.25833333, 0.46666667), (0.25833333, 0.45), (0.25833333, 0.45), (0.25833333, 0.46666667), (0.25, 0.46666667), (0.25, 0.45), (0.25, 0.45), (0.25, 0.46666667), (0.24166666, 0.46666667), (0.24166666, 0.45), (0.24166666, 0.45), (0.24166666, 0.46666667), (0.23333333, 0.46666667), (0.23333333, 0.45), (0.23333333, 0.45), (0.23333333, 0.46666667), (0.225, 0.46666667), (0.225, 0.45), (0.225, 0.45), (0.225, 0.46666667), (0.21666667, 0.46666667), (0.21666667, 0.45), (0.21666667, 0.45), (0.21666667, 0.46666667), (0.20833333, 0.46666667), (0.20833333, 0.45), (0.20833333, 0.45), (0.20833333, 0.46666667), (0.2, 0.46666667), (0.2, 0.45), (0.2, 0.45), (0.2, 0.46666667), (0.19166666, 0.46666667), (0.19166666, 0.45), (0.19166666, 0.45), (0.19166666, 0.46666667), (0.18333334, 0.46666667), (0.18333334, 0.45), (0.18333334, 0.45), (0.18333334, 0.46666667), (0.175, 0.46666667), (0.175, 0.45), (0.175, 0.45), (0.175, 0.46666667), (0.16666667, 0.46666667), (0.16666667, 0.45), (0.16666667, 0.45), (0.16666667, 0.46666667), (0.15833333, 0.46666667), (0.15833333, 0.45), (0.15833333, 0.45), (0.15833333, 0.46666667), (0.15, 0.46666667), (0.15, 0.45), (0.15, 0.45), (0.15, 0.46666667), (0.14166667, 0.46666667), (0.14166667, 0.45), (0.14166667, 0.45), (0.14166667, 0.46666667), (0.13333334, 0.46666667), (0.13333334, 0.45), (0.13333334, 0.45), (0.13333334, 0.46666667), (0.125, 0.46666667), (0.125, 0.45), (0.125, 0.45), (0.125, 0.46666667), (0.11666667, 0.46666667), (0.11666667, 0.45), (0.11666667, 0.45), (0.11666667, 0.46666667), (0.108333334, 0.46666667), (0.108333334, 0.45), (0.108333334, 0.45), (0.108333334, 0.46666667), (0.1, 0.46666667), (0.1, 0.45), (0.1, 0.45), (0.1, 0.46666667), (0.09166667, 0.46666667), (0.09166667, 0.45), (0.09166667, 0.45), (0.09166667, 0.46666667), (0.083333336, 0.46666667), (0.083333336, 0.45), (0.083333336, 0.45), (0.083333336, 0.46666667), (0.075, 0.46666667), (0.075, 0.45), (0.075, 0.45), (0.075, 0.46666667), (0.06666667, 0.46666667), (0.06666667, 0.45), (0.06666667, 0.45), (0.06666667, 0.46666667), (0.058333334, 0.46666667), (0.058333334, 0.45), (0.058333334, 0.45), (0.058333334, 0.46666667), (0.05, 0.46666667), (0.05, 0.45), (0.05, 0.45), (0.05, 0.46666667), (0.041666668, 0.46666667), (0.041666668, 0.45), (0.041666668, 0.45), (0.041666668, 0.46666667), (0.033333335, 0.46666667), (0.033333335, 0.45), (0.033333335, 0.45), (0.033333335, 0.46666667), (0.025, 0.46666667), (0.025, 0.45), (0.025, 0.45), (0.025, 0.46666667), (0.016666668, 0.46666667), (0.016666668, 0.45), (0.016666668, 0.45), (0.016666668, 0.46666667), (0.008333334, 0.46666667), (0.008333334, 0.45), (0.008333334, 0.45), (0.008333334, 0.46666667), (0, 0.46666667), (0, 0.45), (1, 0.46666667), (1, 0.48333332), (0.9916667, 0.48333332), (0.9916667, 0.46666667), (0.9916667, 0.46666667), (0.9916667, 0.48333332), (0.98333335, 0.48333332), (0.98333335, 0.46666667), (0.98333335, 0.46666667), (0.98333335, 0.48333332), (0.975, 0.48333332), (0.975, 0.46666667), (0.975, 0.46666667), (0.975, 0.48333332), (0.96666664, 0.48333332), (0.96666664, 0.46666667), (0.96666664, 0.46666667), (0.96666664, 0.48333332), (0.9583333, 0.48333332), (0.9583333, 0.46666667), (0.9583333, 0.46666667), (0.9583333, 0.48333332), (0.95, 0.48333332), (0.95, 0.46666667), (0.95, 0.46666667), (0.95, 0.48333332), (0.94166666, 0.48333332), (0.94166666, 0.46666667), (0.94166666, 0.46666667), (0.94166666, 0.48333332), (0.93333334, 0.48333332), (0.93333334, 0.46666667), (0.93333334, 0.46666667), (0.93333334, 0.48333332), (0.925, 0.48333332), (0.925, 0.46666667), (0.925, 0.46666667), (0.925, 0.48333332), (0.9166667, 0.48333332), (0.9166667, 0.46666667), (0.9166667, 0.46666667), (0.9166667, 0.48333332), (0.90833336, 0.48333332), (0.90833336, 0.46666667), (0.90833336, 0.46666667), (0.90833336, 0.48333332), (0.9, 0.48333332), (0.9, 0.46666667), (0.9, 0.46666667), (0.9, 0.48333332), (0.89166665, 0.48333332), (0.89166665, 0.46666667), (0.89166665, 0.46666667), (0.89166665, 0.48333332), (0.8833333, 0.48333332), (0.8833333, 0.46666667), (0.8833333, 0.46666667), (0.8833333, 0.48333332), (0.875, 0.48333332), (0.875, 0.46666667), (0.875, 0.46666667), (0.875, 0.48333332), (0.8666667, 0.48333332), (0.8666667, 0.46666667), (0.8666667, 0.46666667), (0.8666667, 0.48333332), (0.85833335, 0.48333332), (0.85833335, 0.46666667), (0.85833335, 0.46666667), (0.85833335, 0.48333332), (0.85, 0.48333332), (0.85, 0.46666667), (0.85, 0.46666667), (0.85, 0.48333332), (0.84166664, 0.48333332), (0.84166664, 0.46666667), (0.84166664, 0.46666667), (0.84166664, 0.48333332), (0.8333333, 0.48333332), (0.8333333, 0.46666667), (0.8333333, 0.46666667), (0.8333333, 0.48333332), (0.825, 0.48333332), (0.825, 0.46666667), (0.825, 0.46666667), (0.825, 0.48333332), (0.81666666, 0.48333332), (0.81666666, 0.46666667), (0.81666666, 0.46666667), (0.81666666, 0.48333332), (0.80833334, 0.48333332), (0.80833334, 0.46666667), (0.80833334, 0.46666667), (0.80833334, 0.48333332), (0.8, 0.48333332), (0.8, 0.46666667), (0.8, 0.46666667), (0.8, 0.48333332), (0.7916667, 0.48333332), (0.7916667, 0.46666667), (0.7916667, 0.46666667), (0.7916667, 0.48333332), (0.78333336, 0.48333332), (0.78333336, 0.46666667), (0.78333336, 0.46666667), (0.78333336, 0.48333332), (0.775, 0.48333332), (0.775, 0.46666667), (0.775, 0.46666667), (0.775, 0.48333332), (0.76666665, 0.48333332), (0.76666665, 0.46666667), (0.76666665, 0.46666667), (0.76666665, 0.48333332), (0.7583333, 0.48333332), (0.7583333, 0.46666667), (0.7583333, 0.46666667), (0.7583333, 0.48333332), (0.75, 0.48333332), (0.75, 0.46666667), (0.75, 0.46666667), (0.75, 0.48333332), (0.7416667, 0.48333332), (0.7416667, 0.46666667), (0.7416667, 0.46666667), (0.7416667, 0.48333332), (0.73333335, 0.48333332), (0.73333335, 0.46666667), (0.73333335, 0.46666667), (0.73333335, 0.48333332), (0.725, 0.48333332), (0.725, 0.46666667), (0.725, 0.46666667), (0.725, 0.48333332), (0.71666664, 0.48333332), (0.71666664, 0.46666667), (0.71666664, 0.46666667), (0.71666664, 0.48333332), (0.7083333, 0.48333332), (0.7083333, 0.46666667), (0.7083333, 0.46666667), (0.7083333, 0.48333332), (0.7, 0.48333332), (0.7, 0.46666667), (0.7, 0.46666667), (0.7, 0.48333332), (0.69166666, 0.48333332), (0.69166666, 0.46666667), (0.69166666, 0.46666667), (0.69166666, 0.48333332), (0.68333334, 0.48333332), (0.68333334, 0.46666667), (0.68333334, 0.46666667), (0.68333334, 0.48333332), (0.675, 0.48333332), (0.675, 0.46666667), (0.675, 0.46666667), (0.675, 0.48333332), (0.6666667, 0.48333332), (0.6666667, 0.46666667), (0.6666667, 0.46666667), (0.6666667, 0.48333332), (0.65833336, 0.48333332), (0.65833336, 0.46666667), (0.65833336, 0.46666667), (0.65833336, 0.48333332), (0.65, 0.48333332), (0.65, 0.46666667), (0.65, 0.46666667), (0.65, 0.48333332), (0.64166665, 0.48333332), (0.64166665, 0.46666667), (0.64166665, 0.46666667), (0.64166665, 0.48333332), (0.6333333, 0.48333332), (0.6333333, 0.46666667), (0.6333333, 0.46666667), (0.6333333, 0.48333332), (0.625, 0.48333332), (0.625, 0.46666667), (0.625, 0.46666667), (0.625, 0.48333332), (0.6166667, 0.48333332), (0.6166667, 0.46666667), (0.6166667, 0.46666667), (0.6166667, 0.48333332), (0.60833335, 0.48333332), (0.60833335, 0.46666667), (0.60833335, 0.46666667), (0.60833335, 0.48333332), (0.6, 0.48333332), (0.6, 0.46666667), (0.6, 0.46666667), (0.6, 0.48333332), (0.59166664, 0.48333332), (0.59166664, 0.46666667), (0.59166664, 0.46666667), (0.59166664, 0.48333332), (0.5833333, 0.48333332), (0.5833333, 0.46666667), (0.5833333, 0.46666667), (0.5833333, 0.48333332), (0.575, 0.48333332), (0.575, 0.46666667), (0.575, 0.46666667), (0.575, 0.48333332), (0.56666666, 0.48333332), (0.56666666, 0.46666667), (0.56666666, 0.46666667), (0.56666666, 0.48333332), (0.55833334, 0.48333332), (0.55833334, 0.46666667), (0.55833334, 0.46666667), (0.55833334, 0.48333332), (0.55, 0.48333332), (0.55, 0.46666667), (0.55, 0.46666667), (0.55, 0.48333332), (0.5416667, 0.48333332), (0.5416667, 0.46666667), (0.5416667, 0.46666667), (0.5416667, 0.48333332), (0.53333336, 0.48333332), (0.53333336, 0.46666667), (0.53333336, 0.46666667), (0.53333336, 0.48333332), (0.525, 0.48333332), (0.525, 0.46666667), (0.525, 0.46666667), (0.525, 0.48333332), (0.51666665, 0.48333332), (0.51666665, 0.46666667), (0.51666665, 0.46666667), (0.51666665, 0.48333332), (0.5083333, 0.48333332), (0.5083333, 0.46666667), (0.5083333, 0.46666667), (0.5083333, 0.48333332), (0.5, 0.48333332), (0.5, 0.46666667), (0.5, 0.46666667), (0.5, 0.48333332), (0.49166667, 0.48333332), (0.49166667, 0.46666667), (0.49166667, 0.46666667), (0.49166667, 0.48333332), (0.48333332, 0.48333332), (0.48333332, 0.46666667), (0.48333332, 0.46666667), (0.48333332, 0.48333332), (0.475, 0.48333332), (0.475, 0.46666667), (0.475, 0.46666667), (0.475, 0.48333332), (0.46666667, 0.48333332), (0.46666667, 0.46666667), (0.46666667, 0.46666667), (0.46666667, 0.48333332), (0.45833334, 0.48333332), (0.45833334, 0.46666667), (0.45833334, 0.46666667), (0.45833334, 0.48333332), (0.45, 0.48333332), (0.45, 0.46666667), (0.45, 0.46666667), (0.45, 0.48333332), (0.44166666, 0.48333332), (0.44166666, 0.46666667), (0.44166666, 0.46666667), (0.44166666, 0.48333332), (0.43333334, 0.48333332), (0.43333334, 0.46666667), (0.43333334, 0.46666667), (0.43333334, 0.48333332), (0.425, 0.48333332), (0.425, 0.46666667), (0.425, 0.46666667), (0.425, 0.48333332), (0.41666666, 0.48333332), (0.41666666, 0.46666667), (0.41666666, 0.46666667), (0.41666666, 0.48333332), (0.40833333, 0.48333332), (0.40833333, 0.46666667), (0.40833333, 0.46666667), (0.40833333, 0.48333332), (0.4, 0.48333332), (0.4, 0.46666667), (0.4, 0.46666667), (0.4, 0.48333332), (0.39166668, 0.48333332), (0.39166668, 0.46666667), (0.39166668, 0.46666667), (0.39166668, 0.48333332), (0.38333333, 0.48333332), (0.38333333, 0.46666667), (0.38333333, 0.46666667), (0.38333333, 0.48333332), (0.375, 0.48333332), (0.375, 0.46666667), (0.375, 0.46666667), (0.375, 0.48333332), (0.36666667, 0.48333332), (0.36666667, 0.46666667), (0.36666667, 0.46666667), (0.36666667, 0.48333332), (0.35833332, 0.48333332), (0.35833332, 0.46666667), (0.35833332, 0.46666667), (0.35833332, 0.48333332), (0.35, 0.48333332), (0.35, 0.46666667), (0.35, 0.46666667), (0.35, 0.48333332), (0.34166667, 0.48333332), (0.34166667, 0.46666667), (0.34166667, 0.46666667), (0.34166667, 0.48333332), (0.33333334, 0.48333332), (0.33333334, 0.46666667), (0.33333334, 0.46666667), (0.33333334, 0.48333332), (0.325, 0.48333332), (0.325, 0.46666667), (0.325, 0.46666667), (0.325, 0.48333332), (0.31666666, 0.48333332), (0.31666666, 0.46666667), (0.31666666, 0.46666667), (0.31666666, 0.48333332), (0.30833334, 0.48333332), (0.30833334, 0.46666667), (0.30833334, 0.46666667), (0.30833334, 0.48333332), (0.3, 0.48333332), (0.3, 0.46666667), (0.3, 0.46666667), (0.3, 0.48333332), (0.29166666, 0.48333332), (0.29166666, 0.46666667), (0.29166666, 0.46666667), (0.29166666, 0.48333332), (0.28333333, 0.48333332), (0.28333333, 0.46666667), (0.28333333, 0.46666667), (0.28333333, 0.48333332), (0.275, 0.48333332), (0.275, 0.46666667), (0.275, 0.46666667), (0.275, 0.48333332), (0.26666668, 0.48333332), (0.26666668, 0.46666667), (0.26666668, 0.46666667), (0.26666668, 0.48333332), (0.25833333, 0.48333332), (0.25833333, 0.46666667), (0.25833333, 0.46666667), (0.25833333, 0.48333332), (0.25, 0.48333332), (0.25, 0.46666667), (0.25, 0.46666667), (0.25, 0.48333332), (0.24166666, 0.48333332), (0.24166666, 0.46666667), (0.24166666, 0.46666667), (0.24166666, 0.48333332), (0.23333333, 0.48333332), (0.23333333, 0.46666667), (0.23333333, 0.46666667), (0.23333333, 0.48333332), (0.225, 0.48333332), (0.225, 0.46666667), (0.225, 0.46666667), (0.225, 0.48333332), (0.21666667, 0.48333332), (0.21666667, 0.46666667), (0.21666667, 0.46666667), (0.21666667, 0.48333332), (0.20833333, 0.48333332), (0.20833333, 0.46666667), (0.20833333, 0.46666667), (0.20833333, 0.48333332), (0.2, 0.48333332), (0.2, 0.46666667), (0.2, 0.46666667), (0.2, 0.48333332), (0.19166666, 0.48333332), (0.19166666, 0.46666667), (0.19166666, 0.46666667), (0.19166666, 0.48333332), (0.18333334, 0.48333332), (0.18333334, 0.46666667), (0.18333334, 0.46666667), (0.18333334, 0.48333332), (0.175, 0.48333332), (0.175, 0.46666667), (0.175, 0.46666667), (0.175, 0.48333332), (0.16666667, 0.48333332), (0.16666667, 0.46666667), (0.16666667, 0.46666667), (0.16666667, 0.48333332), (0.15833333, 0.48333332), (0.15833333, 0.46666667), (0.15833333, 0.46666667), (0.15833333, 0.48333332), (0.15, 0.48333332), (0.15, 0.46666667), (0.15, 0.46666667), (0.15, 0.48333332), (0.14166667, 0.48333332), (0.14166667, 0.46666667), (0.14166667, 0.46666667), (0.14166667, 0.48333332), (0.13333334, 0.48333332), (0.13333334, 0.46666667), (0.13333334, 0.46666667), (0.13333334, 0.48333332), (0.125, 0.48333332), (0.125, 0.46666667), (0.125, 0.46666667), (0.125, 0.48333332), (0.11666667, 0.48333332), (0.11666667, 0.46666667), (0.11666667, 0.46666667), (0.11666667, 0.48333332), (0.108333334, 0.48333332), (0.108333334, 0.46666667), (0.108333334, 0.46666667), (0.108333334, 0.48333332), (0.1, 0.48333332), (0.1, 0.46666667), (0.1, 0.46666667), (0.1, 0.48333332), (0.09166667, 0.48333332), (0.09166667, 0.46666667), (0.09166667, 0.46666667), (0.09166667, 0.48333332), (0.083333336, 0.48333332), (0.083333336, 0.46666667), (0.083333336, 0.46666667), (0.083333336, 0.48333332), (0.075, 0.48333332), (0.075, 0.46666667), (0.075, 0.46666667), (0.075, 0.48333332), (0.06666667, 0.48333332), (0.06666667, 0.46666667), (0.06666667, 0.46666667), (0.06666667, 0.48333332), (0.058333334, 0.48333332), (0.058333334, 0.46666667), (0.058333334, 0.46666667), (0.058333334, 0.48333332), (0.05, 0.48333332), (0.05, 0.46666667), (0.05, 0.46666667), (0.05, 0.48333332), (0.041666668, 0.48333332), (0.041666668, 0.46666667), (0.041666668, 0.46666667), (0.041666668, 0.48333332), (0.033333335, 0.48333332), (0.033333335, 0.46666667), (0.033333335, 0.46666667), (0.033333335, 0.48333332), (0.025, 0.48333332), (0.025, 0.46666667), (0.025, 0.46666667), (0.025, 0.48333332), (0.016666668, 0.48333332), (0.016666668, 0.46666667), (0.016666668, 0.46666667), (0.016666668, 0.48333332), (0.008333334, 0.48333332), (0.008333334, 0.46666667), (0.008333334, 0.46666667), (0.008333334, 0.48333332), (0, 0.48333332), (0, 0.46666667), (1, 0.48333332), (1, 0.5), (0.9916667, 0.5), (0.9916667, 0.48333332), (0.9916667, 0.48333332), (0.9916667, 0.5), (0.98333335, 0.5), (0.98333335, 0.48333332), (0.98333335, 0.48333332), (0.98333335, 0.5), (0.975, 0.5), (0.975, 0.48333332), (0.975, 0.48333332), (0.975, 0.5), (0.96666664, 0.5), (0.96666664, 0.48333332), (0.96666664, 0.48333332), (0.96666664, 0.5), (0.9583333, 0.5), (0.9583333, 0.48333332), (0.9583333, 0.48333332), (0.9583333, 0.5), (0.95, 0.5), (0.95, 0.48333332), (0.95, 0.48333332), (0.95, 0.5), (0.94166666, 0.5), (0.94166666, 0.48333332), (0.94166666, 0.48333332), (0.94166666, 0.5), (0.93333334, 0.5), (0.93333334, 0.48333332), (0.93333334, 0.48333332), (0.93333334, 0.5), (0.925, 0.5), (0.925, 0.48333332), (0.925, 0.48333332), (0.925, 0.5), (0.9166667, 0.5), (0.9166667, 0.48333332), (0.9166667, 0.48333332), (0.9166667, 0.5), (0.90833336, 0.5), (0.90833336, 0.48333332), (0.90833336, 0.48333332), (0.90833336, 0.5), (0.9, 0.5), (0.9, 0.48333332), (0.9, 0.48333332), (0.9, 0.5), (0.89166665, 0.5), (0.89166665, 0.48333332), (0.89166665, 0.48333332), (0.89166665, 0.5), (0.8833333, 0.5), (0.8833333, 0.48333332), (0.8833333, 0.48333332), (0.8833333, 0.5), (0.875, 0.5), (0.875, 0.48333332), (0.875, 0.48333332), (0.875, 0.5), (0.8666667, 0.5), (0.8666667, 0.48333332), (0.8666667, 0.48333332), (0.8666667, 0.5), (0.85833335, 0.5), (0.85833335, 0.48333332), (0.85833335, 0.48333332), (0.85833335, 0.5), (0.85, 0.5), (0.85, 0.48333332), (0.85, 0.48333332), (0.85, 0.5), (0.84166664, 0.5), (0.84166664, 0.48333332), (0.84166664, 0.48333332), (0.84166664, 0.5), (0.8333333, 0.5), (0.8333333, 0.48333332), (0.8333333, 0.48333332), (0.8333333, 0.5), (0.825, 0.5), (0.825, 0.48333332), (0.825, 0.48333332), (0.825, 0.5), (0.81666666, 0.5), (0.81666666, 0.48333332), (0.81666666, 0.48333332), (0.81666666, 0.5), (0.80833334, 0.5), (0.80833334, 0.48333332), (0.80833334, 0.48333332), (0.80833334, 0.5), (0.8, 0.5), (0.8, 0.48333332), (0.8, 0.48333332), (0.8, 0.5), (0.7916667, 0.5), (0.7916667, 0.48333332), (0.7916667, 0.48333332), (0.7916667, 0.5), (0.78333336, 0.5), (0.78333336, 0.48333332), (0.78333336, 0.48333332), (0.78333336, 0.5), (0.775, 0.5), (0.775, 0.48333332), (0.775, 0.48333332), (0.775, 0.5), (0.76666665, 0.5), (0.76666665, 0.48333332), (0.76666665, 0.48333332), (0.76666665, 0.5), (0.7583333, 0.5), (0.7583333, 0.48333332), (0.7583333, 0.48333332), (0.7583333, 0.5), (0.75, 0.5), (0.75, 0.48333332), (0.75, 0.48333332), (0.75, 0.5), (0.7416667, 0.5), (0.7416667, 0.48333332), (0.7416667, 0.48333332), (0.7416667, 0.5), (0.73333335, 0.5), (0.73333335, 0.48333332), (0.73333335, 0.48333332), (0.73333335, 0.5), (0.725, 0.5), (0.725, 0.48333332), (0.725, 0.48333332), (0.725, 0.5), (0.71666664, 0.5), (0.71666664, 0.48333332), (0.71666664, 0.48333332), (0.71666664, 0.5), (0.7083333, 0.5), (0.7083333, 0.48333332), (0.7083333, 0.48333332), (0.7083333, 0.5), (0.7, 0.5), (0.7, 0.48333332), (0.7, 0.48333332), (0.7, 0.5), (0.69166666, 0.5), (0.69166666, 0.48333332), (0.69166666, 0.48333332), (0.69166666, 0.5), (0.68333334, 0.5), (0.68333334, 0.48333332), (0.68333334, 0.48333332), (0.68333334, 0.5), (0.675, 0.5), (0.675, 0.48333332), (0.675, 0.48333332), (0.675, 0.5), (0.6666667, 0.5), (0.6666667, 0.48333332), (0.6666667, 0.48333332), (0.6666667, 0.5), (0.65833336, 0.5), (0.65833336, 0.48333332), (0.65833336, 0.48333332), (0.65833336, 0.5), (0.65, 0.5), (0.65, 0.48333332), (0.65, 0.48333332), (0.65, 0.5), (0.64166665, 0.5), (0.64166665, 0.48333332), (0.64166665, 0.48333332), (0.64166665, 0.5), (0.6333333, 0.5), (0.6333333, 0.48333332), (0.6333333, 0.48333332), (0.6333333, 0.5), (0.625, 0.5), (0.625, 0.48333332), (0.625, 0.48333332), (0.625, 0.5), (0.6166667, 0.5), (0.6166667, 0.48333332), (0.6166667, 0.48333332), (0.6166667, 0.5), (0.60833335, 0.5), (0.60833335, 0.48333332), (0.60833335, 0.48333332), (0.60833335, 0.5), (0.6, 0.5), (0.6, 0.48333332), (0.6, 0.48333332), (0.6, 0.5), (0.59166664, 0.5), (0.59166664, 0.48333332), (0.59166664, 0.48333332), (0.59166664, 0.5), (0.5833333, 0.5), (0.5833333, 0.48333332), (0.5833333, 0.48333332), (0.5833333, 0.5), (0.575, 0.5), (0.575, 0.48333332), (0.575, 0.48333332), (0.575, 0.5), (0.56666666, 0.5), (0.56666666, 0.48333332), (0.56666666, 0.48333332), (0.56666666, 0.5), (0.55833334, 0.5), (0.55833334, 0.48333332), (0.55833334, 0.48333332), (0.55833334, 0.5), (0.55, 0.5), (0.55, 0.48333332), (0.55, 0.48333332), (0.55, 0.5), (0.5416667, 0.5), (0.5416667, 0.48333332), (0.5416667, 0.48333332), (0.5416667, 0.5), (0.53333336, 0.5), (0.53333336, 0.48333332), (0.53333336, 0.48333332), (0.53333336, 0.5), (0.525, 0.5), (0.525, 0.48333332), (0.525, 0.48333332), (0.525, 0.5), (0.51666665, 0.5), (0.51666665, 0.48333332), (0.51666665, 0.48333332), (0.51666665, 0.5), (0.5083333, 0.5), (0.5083333, 0.48333332), (0.5083333, 0.48333332), (0.5083333, 0.5), (0.5, 0.5), (0.5, 0.48333332), (0.5, 0.48333332), (0.5, 0.5), (0.49166667, 0.5), (0.49166667, 0.48333332), (0.49166667, 0.48333332), (0.49166667, 0.5), (0.48333332, 0.5), (0.48333332, 0.48333332), (0.48333332, 0.48333332), (0.48333332, 0.5), (0.475, 0.5), (0.475, 0.48333332), (0.475, 0.48333332), (0.475, 0.5), (0.46666667, 0.5), (0.46666667, 0.48333332), (0.46666667, 0.48333332), (0.46666667, 0.5), (0.45833334, 0.5), (0.45833334, 0.48333332), (0.45833334, 0.48333332), (0.45833334, 0.5), (0.45, 0.5), (0.45, 0.48333332), (0.45, 0.48333332), (0.45, 0.5), (0.44166666, 0.5), (0.44166666, 0.48333332), (0.44166666, 0.48333332), (0.44166666, 0.5), (0.43333334, 0.5), (0.43333334, 0.48333332), (0.43333334, 0.48333332), (0.43333334, 0.5), (0.425, 0.5), (0.425, 0.48333332), (0.425, 0.48333332), (0.425, 0.5), (0.41666666, 0.5), (0.41666666, 0.48333332), (0.41666666, 0.48333332), (0.41666666, 0.5), (0.40833333, 0.5), (0.40833333, 0.48333332), (0.40833333, 0.48333332), (0.40833333, 0.5), (0.4, 0.5), (0.4, 0.48333332), (0.4, 0.48333332), (0.4, 0.5), (0.39166668, 0.5), (0.39166668, 0.48333332), (0.39166668, 0.48333332), (0.39166668, 0.5), (0.38333333, 0.5), (0.38333333, 0.48333332), (0.38333333, 0.48333332), (0.38333333, 0.5), (0.375, 0.5), (0.375, 0.48333332), (0.375, 0.48333332), (0.375, 0.5), (0.36666667, 0.5), (0.36666667, 0.48333332), (0.36666667, 0.48333332), (0.36666667, 0.5), (0.35833332, 0.5), (0.35833332, 0.48333332), (0.35833332, 0.48333332), (0.35833332, 0.5), (0.35, 0.5), (0.35, 0.48333332), (0.35, 0.48333332), (0.35, 0.5), (0.34166667, 0.5), (0.34166667, 0.48333332), (0.34166667, 0.48333332), (0.34166667, 0.5), (0.33333334, 0.5), (0.33333334, 0.48333332), (0.33333334, 0.48333332), (0.33333334, 0.5), (0.325, 0.5), (0.325, 0.48333332), (0.325, 0.48333332), (0.325, 0.5), (0.31666666, 0.5), (0.31666666, 0.48333332), (0.31666666, 0.48333332), (0.31666666, 0.5), (0.30833334, 0.5), (0.30833334, 0.48333332), (0.30833334, 0.48333332), (0.30833334, 0.5), (0.3, 0.5), (0.3, 0.48333332), (0.3, 0.48333332), (0.3, 0.5), (0.29166666, 0.5), (0.29166666, 0.48333332), (0.29166666, 0.48333332), (0.29166666, 0.5), (0.28333333, 0.5), (0.28333333, 0.48333332), (0.28333333, 0.48333332), (0.28333333, 0.5), (0.275, 0.5), (0.275, 0.48333332), (0.275, 0.48333332), (0.275, 0.5), (0.26666668, 0.5), (0.26666668, 0.48333332), (0.26666668, 0.48333332), (0.26666668, 0.5), (0.25833333, 0.5), (0.25833333, 0.48333332), (0.25833333, 0.48333332), (0.25833333, 0.5), (0.25, 0.5), (0.25, 0.48333332), (0.25, 0.48333332), (0.25, 0.5), (0.24166666, 0.5), (0.24166666, 0.48333332), (0.24166666, 0.48333332), (0.24166666, 0.5), (0.23333333, 0.5), (0.23333333, 0.48333332), (0.23333333, 0.48333332), (0.23333333, 0.5), (0.225, 0.5), (0.225, 0.48333332), (0.225, 0.48333332), (0.225, 0.5), (0.21666667, 0.5), (0.21666667, 0.48333332), (0.21666667, 0.48333332), (0.21666667, 0.5), (0.20833333, 0.5), (0.20833333, 0.48333332), (0.20833333, 0.48333332), (0.20833333, 0.5), (0.2, 0.5), (0.2, 0.48333332), (0.2, 0.48333332), (0.2, 0.5), (0.19166666, 0.5), (0.19166666, 0.48333332), (0.19166666, 0.48333332), (0.19166666, 0.5), (0.18333334, 0.5), (0.18333334, 0.48333332), (0.18333334, 0.48333332), (0.18333334, 0.5), (0.175, 0.5), (0.175, 0.48333332), (0.175, 0.48333332), (0.175, 0.5), (0.16666667, 0.5), (0.16666667, 0.48333332), (0.16666667, 0.48333332), (0.16666667, 0.5), (0.15833333, 0.5), (0.15833333, 0.48333332), (0.15833333, 0.48333332), (0.15833333, 0.5), (0.15, 0.5), (0.15, 0.48333332), (0.15, 0.48333332), (0.15, 0.5), (0.14166667, 0.5), (0.14166667, 0.48333332), (0.14166667, 0.48333332), (0.14166667, 0.5), (0.13333334, 0.5), (0.13333334, 0.48333332), (0.13333334, 0.48333332), (0.13333334, 0.5), (0.125, 0.5), (0.125, 0.48333332), (0.125, 0.48333332), (0.125, 0.5), (0.11666667, 0.5), (0.11666667, 0.48333332), (0.11666667, 0.48333332), (0.11666667, 0.5), (0.108333334, 0.5), (0.108333334, 0.48333332), (0.108333334, 0.48333332), (0.108333334, 0.5), (0.1, 0.5), (0.1, 0.48333332), (0.1, 0.48333332), (0.1, 0.5), (0.09166667, 0.5), (0.09166667, 0.48333332), (0.09166667, 0.48333332), (0.09166667, 0.5), (0.083333336, 0.5), (0.083333336, 0.48333332), (0.083333336, 0.48333332), (0.083333336, 0.5), (0.075, 0.5), (0.075, 0.48333332), (0.075, 0.48333332), (0.075, 0.5), (0.06666667, 0.5), (0.06666667, 0.48333332), (0.06666667, 0.48333332), (0.06666667, 0.5), (0.058333334, 0.5), (0.058333334, 0.48333332), (0.058333334, 0.48333332), (0.058333334, 0.5), (0.05, 0.5), (0.05, 0.48333332), (0.05, 0.48333332), (0.05, 0.5), (0.041666668, 0.5), (0.041666668, 0.48333332), (0.041666668, 0.48333332), (0.041666668, 0.5), (0.033333335, 0.5), (0.033333335, 0.48333332), (0.033333335, 0.48333332), (0.033333335, 0.5), (0.025, 0.5), (0.025, 0.48333332), (0.025, 0.48333332), (0.025, 0.5), (0.016666668, 0.5), (0.016666668, 0.48333332), (0.016666668, 0.48333332), (0.016666668, 0.5), (0.008333334, 0.5), (0.008333334, 0.48333332), (0.008333334, 0.48333332), (0.008333334, 0.5), (0, 0.5), (0, 0.48333332), (1, 0.5), (1, 0.51666665), (0.9916667, 0.51666665), (0.9916667, 0.5), (0.9916667, 0.5), (0.9916667, 0.51666665), (0.98333335, 0.51666665), (0.98333335, 0.5), (0.98333335, 0.5), (0.98333335, 0.51666665), (0.975, 0.51666665), (0.975, 0.5), (0.975, 0.5), (0.975, 0.51666665), (0.96666664, 0.51666665), (0.96666664, 0.5), (0.96666664, 0.5), (0.96666664, 0.51666665), (0.9583333, 0.51666665), (0.9583333, 0.5), (0.9583333, 0.5), (0.9583333, 0.51666665), (0.95, 0.51666665), (0.95, 0.5), (0.95, 0.5), (0.95, 0.51666665), (0.94166666, 0.51666665), (0.94166666, 0.5), (0.94166666, 0.5), (0.94166666, 0.51666665), (0.93333334, 0.51666665), (0.93333334, 0.5), (0.93333334, 0.5), (0.93333334, 0.51666665), (0.925, 0.51666665), (0.925, 0.5), (0.925, 0.5), (0.925, 0.51666665), (0.9166667, 0.51666665), (0.9166667, 0.5), (0.9166667, 0.5), (0.9166667, 0.51666665), (0.90833336, 0.51666665), (0.90833336, 0.5), (0.90833336, 0.5), (0.90833336, 0.51666665), (0.9, 0.51666665), (0.9, 0.5), (0.9, 0.5), (0.9, 0.51666665), (0.89166665, 0.51666665), (0.89166665, 0.5), (0.89166665, 0.5), (0.89166665, 0.51666665), (0.8833333, 0.51666665), (0.8833333, 0.5), (0.8833333, 0.5), (0.8833333, 0.51666665), (0.875, 0.51666665), (0.875, 0.5), (0.875, 0.5), (0.875, 0.51666665), (0.8666667, 0.51666665), (0.8666667, 0.5), (0.8666667, 0.5), (0.8666667, 0.51666665), (0.85833335, 0.51666665), (0.85833335, 0.5), (0.85833335, 0.5), (0.85833335, 0.51666665), (0.85, 0.51666665), (0.85, 0.5), (0.85, 0.5), (0.85, 0.51666665), (0.84166664, 0.51666665), (0.84166664, 0.5), (0.84166664, 0.5), (0.84166664, 0.51666665), (0.8333333, 0.51666665), (0.8333333, 0.5), (0.8333333, 0.5), (0.8333333, 0.51666665), (0.825, 0.51666665), (0.825, 0.5), (0.825, 0.5), (0.825, 0.51666665), (0.81666666, 0.51666665), (0.81666666, 0.5), (0.81666666, 0.5), (0.81666666, 0.51666665), (0.80833334, 0.51666665), (0.80833334, 0.5), (0.80833334, 0.5), (0.80833334, 0.51666665), (0.8, 0.51666665), (0.8, 0.5), (0.8, 0.5), (0.8, 0.51666665), (0.7916667, 0.51666665), (0.7916667, 0.5), (0.7916667, 0.5), (0.7916667, 0.51666665), (0.78333336, 0.51666665), (0.78333336, 0.5), (0.78333336, 0.5), (0.78333336, 0.51666665), (0.775, 0.51666665), (0.775, 0.5), (0.775, 0.5), (0.775, 0.51666665), (0.76666665, 0.51666665), (0.76666665, 0.5), (0.76666665, 0.5), (0.76666665, 0.51666665), (0.7583333, 0.51666665), (0.7583333, 0.5), (0.7583333, 0.5), (0.7583333, 0.51666665), (0.75, 0.51666665), (0.75, 0.5), (0.75, 0.5), (0.75, 0.51666665), (0.7416667, 0.51666665), (0.7416667, 0.5), (0.7416667, 0.5), (0.7416667, 0.51666665), (0.73333335, 0.51666665), (0.73333335, 0.5), (0.73333335, 0.5), (0.73333335, 0.51666665), (0.725, 0.51666665), (0.725, 0.5), (0.725, 0.5), (0.725, 0.51666665), (0.71666664, 0.51666665), (0.71666664, 0.5), (0.71666664, 0.5), (0.71666664, 0.51666665), (0.7083333, 0.51666665), (0.7083333, 0.5), (0.7083333, 0.5), (0.7083333, 0.51666665), (0.7, 0.51666665), (0.7, 0.5), (0.7, 0.5), (0.7, 0.51666665), (0.69166666, 0.51666665), (0.69166666, 0.5), (0.69166666, 0.5), (0.69166666, 0.51666665), (0.68333334, 0.51666665), (0.68333334, 0.5), (0.68333334, 0.5), (0.68333334, 0.51666665), (0.675, 0.51666665), (0.675, 0.5), (0.675, 0.5), (0.675, 0.51666665), (0.6666667, 0.51666665), (0.6666667, 0.5), (0.6666667, 0.5), (0.6666667, 0.51666665), (0.65833336, 0.51666665), (0.65833336, 0.5), (0.65833336, 0.5), (0.65833336, 0.51666665), (0.65, 0.51666665), (0.65, 0.5), (0.65, 0.5), (0.65, 0.51666665), (0.64166665, 0.51666665), (0.64166665, 0.5), (0.64166665, 0.5), (0.64166665, 0.51666665), (0.6333333, 0.51666665), (0.6333333, 0.5), (0.6333333, 0.5), (0.6333333, 0.51666665), (0.625, 0.51666665), (0.625, 0.5), (0.625, 0.5), (0.625, 0.51666665), (0.6166667, 0.51666665), (0.6166667, 0.5), (0.6166667, 0.5), (0.6166667, 0.51666665), (0.60833335, 0.51666665), (0.60833335, 0.5), (0.60833335, 0.5), (0.60833335, 0.51666665), (0.6, 0.51666665), (0.6, 0.5), (0.6, 0.5), (0.6, 0.51666665), (0.59166664, 0.51666665), (0.59166664, 0.5), (0.59166664, 0.5), (0.59166664, 0.51666665), (0.5833333, 0.51666665), (0.5833333, 0.5), (0.5833333, 0.5), (0.5833333, 0.51666665), (0.575, 0.51666665), (0.575, 0.5), (0.575, 0.5), (0.575, 0.51666665), (0.56666666, 0.51666665), (0.56666666, 0.5), (0.56666666, 0.5), (0.56666666, 0.51666665), (0.55833334, 0.51666665), (0.55833334, 0.5), (0.55833334, 0.5), (0.55833334, 0.51666665), (0.55, 0.51666665), (0.55, 0.5), (0.55, 0.5), (0.55, 0.51666665), (0.5416667, 0.51666665), (0.5416667, 0.5), (0.5416667, 0.5), (0.5416667, 0.51666665), (0.53333336, 0.51666665), (0.53333336, 0.5), (0.53333336, 0.5), (0.53333336, 0.51666665), (0.525, 0.51666665), (0.525, 0.5), (0.525, 0.5), (0.525, 0.51666665), (0.51666665, 0.51666665), (0.51666665, 0.5), (0.51666665, 0.5), (0.51666665, 0.51666665), (0.5083333, 0.51666665), (0.5083333, 0.5), (0.5083333, 0.5), (0.5083333, 0.51666665), (0.5, 0.51666665), (0.5, 0.5), (0.5, 0.5), (0.5, 0.51666665), (0.49166667, 0.51666665), (0.49166667, 0.5), (0.49166667, 0.5), (0.49166667, 0.51666665), (0.48333332, 0.51666665), (0.48333332, 0.5), (0.48333332, 0.5), (0.48333332, 0.51666665), (0.475, 0.51666665), (0.475, 0.5), (0.475, 0.5), (0.475, 0.51666665), (0.46666667, 0.51666665), (0.46666667, 0.5), (0.46666667, 0.5), (0.46666667, 0.51666665), (0.45833334, 0.51666665), (0.45833334, 0.5), (0.45833334, 0.5), (0.45833334, 0.51666665), (0.45, 0.51666665), (0.45, 0.5), (0.45, 0.5), (0.45, 0.51666665), (0.44166666, 0.51666665), (0.44166666, 0.5), (0.44166666, 0.5), (0.44166666, 0.51666665), (0.43333334, 0.51666665), (0.43333334, 0.5), (0.43333334, 0.5), (0.43333334, 0.51666665), (0.425, 0.51666665), (0.425, 0.5), (0.425, 0.5), (0.425, 0.51666665), (0.41666666, 0.51666665), (0.41666666, 0.5), (0.41666666, 0.5), (0.41666666, 0.51666665), (0.40833333, 0.51666665), (0.40833333, 0.5), (0.40833333, 0.5), (0.40833333, 0.51666665), (0.4, 0.51666665), (0.4, 0.5), (0.4, 0.5), (0.4, 0.51666665), (0.39166668, 0.51666665), (0.39166668, 0.5), (0.39166668, 0.5), (0.39166668, 0.51666665), (0.38333333, 0.51666665), (0.38333333, 0.5), (0.38333333, 0.5), (0.38333333, 0.51666665), (0.375, 0.51666665), (0.375, 0.5), (0.375, 0.5), (0.375, 0.51666665), (0.36666667, 0.51666665), (0.36666667, 0.5), (0.36666667, 0.5), (0.36666667, 0.51666665), (0.35833332, 0.51666665), (0.35833332, 0.5), (0.35833332, 0.5), (0.35833332, 0.51666665), (0.35, 0.51666665), (0.35, 0.5), (0.35, 0.5), (0.35, 0.51666665), (0.34166667, 0.51666665), (0.34166667, 0.5), (0.34166667, 0.5), (0.34166667, 0.51666665), (0.33333334, 0.51666665), (0.33333334, 0.5), (0.33333334, 0.5), (0.33333334, 0.51666665), (0.325, 0.51666665), (0.325, 0.5), (0.325, 0.5), (0.325, 0.51666665), (0.31666666, 0.51666665), (0.31666666, 0.5), (0.31666666, 0.5), (0.31666666, 0.51666665), (0.30833334, 0.51666665), (0.30833334, 0.5), (0.30833334, 0.5), (0.30833334, 0.51666665), (0.3, 0.51666665), (0.3, 0.5), (0.3, 0.5), (0.3, 0.51666665), (0.29166666, 0.51666665), (0.29166666, 0.5), (0.29166666, 0.5), (0.29166666, 0.51666665), (0.28333333, 0.51666665), (0.28333333, 0.5), (0.28333333, 0.5), (0.28333333, 0.51666665), (0.275, 0.51666665), (0.275, 0.5), (0.275, 0.5), (0.275, 0.51666665), (0.26666668, 0.51666665), (0.26666668, 0.5), (0.26666668, 0.5), (0.26666668, 0.51666665), (0.25833333, 0.51666665), (0.25833333, 0.5), (0.25833333, 0.5), (0.25833333, 0.51666665), (0.25, 0.51666665), (0.25, 0.5), (0.25, 0.5), (0.25, 0.51666665), (0.24166666, 0.51666665), (0.24166666, 0.5), (0.24166666, 0.5), (0.24166666, 0.51666665), (0.23333333, 0.51666665), (0.23333333, 0.5), (0.23333333, 0.5), (0.23333333, 0.51666665), (0.225, 0.51666665), (0.225, 0.5), (0.225, 0.5), (0.225, 0.51666665), (0.21666667, 0.51666665), (0.21666667, 0.5), (0.21666667, 0.5), (0.21666667, 0.51666665), (0.20833333, 0.51666665), (0.20833333, 0.5), (0.20833333, 0.5), (0.20833333, 0.51666665), (0.2, 0.51666665), (0.2, 0.5), (0.2, 0.5), (0.2, 0.51666665), (0.19166666, 0.51666665), (0.19166666, 0.5), (0.19166666, 0.5), (0.19166666, 0.51666665), (0.18333334, 0.51666665), (0.18333334, 0.5), (0.18333334, 0.5), (0.18333334, 0.51666665), (0.175, 0.51666665), (0.175, 0.5), (0.175, 0.5), (0.175, 0.51666665), (0.16666667, 0.51666665), (0.16666667, 0.5), (0.16666667, 0.5), (0.16666667, 0.51666665), (0.15833333, 0.51666665), (0.15833333, 0.5), (0.15833333, 0.5), (0.15833333, 0.51666665), (0.15, 0.51666665), (0.15, 0.5), (0.15, 0.5), (0.15, 0.51666665), (0.14166667, 0.51666665), (0.14166667, 0.5), (0.14166667, 0.5), (0.14166667, 0.51666665), (0.13333334, 0.51666665), (0.13333334, 0.5), (0.13333334, 0.5), (0.13333334, 0.51666665), (0.125, 0.51666665), (0.125, 0.5), (0.125, 0.5), (0.125, 0.51666665), (0.11666667, 0.51666665), (0.11666667, 0.5), (0.11666667, 0.5), (0.11666667, 0.51666665), (0.108333334, 0.51666665), (0.108333334, 0.5), (0.108333334, 0.5), (0.108333334, 0.51666665), (0.1, 0.51666665), (0.1, 0.5), (0.1, 0.5), (0.1, 0.51666665), (0.09166667, 0.51666665), (0.09166667, 0.5), (0.09166667, 0.5), (0.09166667, 0.51666665), (0.083333336, 0.51666665), (0.083333336, 0.5), (0.083333336, 0.5), (0.083333336, 0.51666665), (0.075, 0.51666665), (0.075, 0.5), (0.075, 0.5), (0.075, 0.51666665), (0.06666667, 0.51666665), (0.06666667, 0.5), (0.06666667, 0.5), (0.06666667, 0.51666665), (0.058333334, 0.51666665), (0.058333334, 0.5), (0.058333334, 0.5), (0.058333334, 0.51666665), (0.05, 0.51666665), (0.05, 0.5), (0.05, 0.5), (0.05, 0.51666665), (0.041666668, 0.51666665), (0.041666668, 0.5), (0.041666668, 0.5), (0.041666668, 0.51666665), (0.033333335, 0.51666665), (0.033333335, 0.5), (0.033333335, 0.5), (0.033333335, 0.51666665), (0.025, 0.51666665), (0.025, 0.5), (0.025, 0.5), (0.025, 0.51666665), (0.016666668, 0.51666665), (0.016666668, 0.5), (0.016666668, 0.5), (0.016666668, 0.51666665), (0.008333334, 0.51666665), (0.008333334, 0.5), (0.008333334, 0.5), (0.008333334, 0.51666665), (0, 0.51666665), (0, 0.5), (1, 0.51666665), (1, 0.53333336), (0.9916667, 0.53333336), (0.9916667, 0.51666665), (0.9916667, 0.51666665), (0.9916667, 0.53333336), (0.98333335, 0.53333336), (0.98333335, 0.51666665), (0.98333335, 0.51666665), (0.98333335, 0.53333336), (0.975, 0.53333336), (0.975, 0.51666665), (0.975, 0.51666665), (0.975, 0.53333336), (0.96666664, 0.53333336), (0.96666664, 0.51666665), (0.96666664, 0.51666665), (0.96666664, 0.53333336), (0.9583333, 0.53333336), (0.9583333, 0.51666665), (0.9583333, 0.51666665), (0.9583333, 0.53333336), (0.95, 0.53333336), (0.95, 0.51666665), (0.95, 0.51666665), (0.95, 0.53333336), (0.94166666, 0.53333336), (0.94166666, 0.51666665), (0.94166666, 0.51666665), (0.94166666, 0.53333336), (0.93333334, 0.53333336), (0.93333334, 0.51666665), (0.93333334, 0.51666665), (0.93333334, 0.53333336), (0.925, 0.53333336), (0.925, 0.51666665), (0.925, 0.51666665), (0.925, 0.53333336), (0.9166667, 0.53333336), (0.9166667, 0.51666665), (0.9166667, 0.51666665), (0.9166667, 0.53333336), (0.90833336, 0.53333336), (0.90833336, 0.51666665), (0.90833336, 0.51666665), (0.90833336, 0.53333336), (0.9, 0.53333336), (0.9, 0.51666665), (0.9, 0.51666665), (0.9, 0.53333336), (0.89166665, 0.53333336), (0.89166665, 0.51666665), (0.89166665, 0.51666665), (0.89166665, 0.53333336), (0.8833333, 0.53333336), (0.8833333, 0.51666665), (0.8833333, 0.51666665), (0.8833333, 0.53333336), (0.875, 0.53333336), (0.875, 0.51666665), (0.875, 0.51666665), (0.875, 0.53333336), (0.8666667, 0.53333336), (0.8666667, 0.51666665), (0.8666667, 0.51666665), (0.8666667, 0.53333336), (0.85833335, 0.53333336), (0.85833335, 0.51666665), (0.85833335, 0.51666665), (0.85833335, 0.53333336), (0.85, 0.53333336), (0.85, 0.51666665), (0.85, 0.51666665), (0.85, 0.53333336), (0.84166664, 0.53333336), (0.84166664, 0.51666665), (0.84166664, 0.51666665), (0.84166664, 0.53333336), (0.8333333, 0.53333336), (0.8333333, 0.51666665), (0.8333333, 0.51666665), (0.8333333, 0.53333336), (0.825, 0.53333336), (0.825, 0.51666665), (0.825, 0.51666665), (0.825, 0.53333336), (0.81666666, 0.53333336), (0.81666666, 0.51666665), (0.81666666, 0.51666665), (0.81666666, 0.53333336), (0.80833334, 0.53333336), (0.80833334, 0.51666665), (0.80833334, 0.51666665), (0.80833334, 0.53333336), (0.8, 0.53333336), (0.8, 0.51666665), (0.8, 0.51666665), (0.8, 0.53333336), (0.7916667, 0.53333336), (0.7916667, 0.51666665), (0.7916667, 0.51666665), (0.7916667, 0.53333336), (0.78333336, 0.53333336), (0.78333336, 0.51666665), (0.78333336, 0.51666665), (0.78333336, 0.53333336), (0.775, 0.53333336), (0.775, 0.51666665), (0.775, 0.51666665), (0.775, 0.53333336), (0.76666665, 0.53333336), (0.76666665, 0.51666665), (0.76666665, 0.51666665), (0.76666665, 0.53333336), (0.7583333, 0.53333336), (0.7583333, 0.51666665), (0.7583333, 0.51666665), (0.7583333, 0.53333336), (0.75, 0.53333336), (0.75, 0.51666665), (0.75, 0.51666665), (0.75, 0.53333336), (0.7416667, 0.53333336), (0.7416667, 0.51666665), (0.7416667, 0.51666665), (0.7416667, 0.53333336), (0.73333335, 0.53333336), (0.73333335, 0.51666665), (0.73333335, 0.51666665), (0.73333335, 0.53333336), (0.725, 0.53333336), (0.725, 0.51666665), (0.725, 0.51666665), (0.725, 0.53333336), (0.71666664, 0.53333336), (0.71666664, 0.51666665), (0.71666664, 0.51666665), (0.71666664, 0.53333336), (0.7083333, 0.53333336), (0.7083333, 0.51666665), (0.7083333, 0.51666665), (0.7083333, 0.53333336), (0.7, 0.53333336), (0.7, 0.51666665), (0.7, 0.51666665), (0.7, 0.53333336), (0.69166666, 0.53333336), (0.69166666, 0.51666665), (0.69166666, 0.51666665), (0.69166666, 0.53333336), (0.68333334, 0.53333336), (0.68333334, 0.51666665), (0.68333334, 0.51666665), (0.68333334, 0.53333336), (0.675, 0.53333336), (0.675, 0.51666665), (0.675, 0.51666665), (0.675, 0.53333336), (0.6666667, 0.53333336), (0.6666667, 0.51666665), (0.6666667, 0.51666665), (0.6666667, 0.53333336), (0.65833336, 0.53333336), (0.65833336, 0.51666665), (0.65833336, 0.51666665), (0.65833336, 0.53333336), (0.65, 0.53333336), (0.65, 0.51666665), (0.65, 0.51666665), (0.65, 0.53333336), (0.64166665, 0.53333336), (0.64166665, 0.51666665), (0.64166665, 0.51666665), (0.64166665, 0.53333336), (0.6333333, 0.53333336), (0.6333333, 0.51666665), (0.6333333, 0.51666665), (0.6333333, 0.53333336), (0.625, 0.53333336), (0.625, 0.51666665), (0.625, 0.51666665), (0.625, 0.53333336), (0.6166667, 0.53333336), (0.6166667, 0.51666665), (0.6166667, 0.51666665), (0.6166667, 0.53333336), (0.60833335, 0.53333336), (0.60833335, 0.51666665), (0.60833335, 0.51666665), (0.60833335, 0.53333336), (0.6, 0.53333336), (0.6, 0.51666665), (0.6, 0.51666665), (0.6, 0.53333336), (0.59166664, 0.53333336), (0.59166664, 0.51666665), (0.59166664, 0.51666665), (0.59166664, 0.53333336), (0.5833333, 0.53333336), (0.5833333, 0.51666665), (0.5833333, 0.51666665), (0.5833333, 0.53333336), (0.575, 0.53333336), (0.575, 0.51666665), (0.575, 0.51666665), (0.575, 0.53333336), (0.56666666, 0.53333336), (0.56666666, 0.51666665), (0.56666666, 0.51666665), (0.56666666, 0.53333336), (0.55833334, 0.53333336), (0.55833334, 0.51666665), (0.55833334, 0.51666665), (0.55833334, 0.53333336), (0.55, 0.53333336), (0.55, 0.51666665), (0.55, 0.51666665), (0.55, 0.53333336), (0.5416667, 0.53333336), (0.5416667, 0.51666665), (0.5416667, 0.51666665), (0.5416667, 0.53333336), (0.53333336, 0.53333336), (0.53333336, 0.51666665), (0.53333336, 0.51666665), (0.53333336, 0.53333336), (0.525, 0.53333336), (0.525, 0.51666665), (0.525, 0.51666665), (0.525, 0.53333336), (0.51666665, 0.53333336), (0.51666665, 0.51666665), (0.51666665, 0.51666665), (0.51666665, 0.53333336), (0.5083333, 0.53333336), (0.5083333, 0.51666665), (0.5083333, 0.51666665), (0.5083333, 0.53333336), (0.5, 0.53333336), (0.5, 0.51666665), (0.5, 0.51666665), (0.5, 0.53333336), (0.49166667, 0.53333336), (0.49166667, 0.51666665), (0.49166667, 0.51666665), (0.49166667, 0.53333336), (0.48333332, 0.53333336), (0.48333332, 0.51666665), (0.48333332, 0.51666665), (0.48333332, 0.53333336), (0.475, 0.53333336), (0.475, 0.51666665), (0.475, 0.51666665), (0.475, 0.53333336), (0.46666667, 0.53333336), (0.46666667, 0.51666665), (0.46666667, 0.51666665), (0.46666667, 0.53333336), (0.45833334, 0.53333336), (0.45833334, 0.51666665), (0.45833334, 0.51666665), (0.45833334, 0.53333336), (0.45, 0.53333336), (0.45, 0.51666665), (0.45, 0.51666665), (0.45, 0.53333336), (0.44166666, 0.53333336), (0.44166666, 0.51666665), (0.44166666, 0.51666665), (0.44166666, 0.53333336), (0.43333334, 0.53333336), (0.43333334, 0.51666665), (0.43333334, 0.51666665), (0.43333334, 0.53333336), (0.425, 0.53333336), (0.425, 0.51666665), (0.425, 0.51666665), (0.425, 0.53333336), (0.41666666, 0.53333336), (0.41666666, 0.51666665), (0.41666666, 0.51666665), (0.41666666, 0.53333336), (0.40833333, 0.53333336), (0.40833333, 0.51666665), (0.40833333, 0.51666665), (0.40833333, 0.53333336), (0.4, 0.53333336), (0.4, 0.51666665), (0.4, 0.51666665), (0.4, 0.53333336), (0.39166668, 0.53333336), (0.39166668, 0.51666665), (0.39166668, 0.51666665), (0.39166668, 0.53333336), (0.38333333, 0.53333336), (0.38333333, 0.51666665), (0.38333333, 0.51666665), (0.38333333, 0.53333336), (0.375, 0.53333336), (0.375, 0.51666665), (0.375, 0.51666665), (0.375, 0.53333336), (0.36666667, 0.53333336), (0.36666667, 0.51666665), (0.36666667, 0.51666665), (0.36666667, 0.53333336), (0.35833332, 0.53333336), (0.35833332, 0.51666665), (0.35833332, 0.51666665), (0.35833332, 0.53333336), (0.35, 0.53333336), (0.35, 0.51666665), (0.35, 0.51666665), (0.35, 0.53333336), (0.34166667, 0.53333336), (0.34166667, 0.51666665), (0.34166667, 0.51666665), (0.34166667, 0.53333336), (0.33333334, 0.53333336), (0.33333334, 0.51666665), (0.33333334, 0.51666665), (0.33333334, 0.53333336), (0.325, 0.53333336), (0.325, 0.51666665), (0.325, 0.51666665), (0.325, 0.53333336), (0.31666666, 0.53333336), (0.31666666, 0.51666665), (0.31666666, 0.51666665), (0.31666666, 0.53333336), (0.30833334, 0.53333336), (0.30833334, 0.51666665), (0.30833334, 0.51666665), (0.30833334, 0.53333336), (0.3, 0.53333336), (0.3, 0.51666665), (0.3, 0.51666665), (0.3, 0.53333336), (0.29166666, 0.53333336), (0.29166666, 0.51666665), (0.29166666, 0.51666665), (0.29166666, 0.53333336), (0.28333333, 0.53333336), (0.28333333, 0.51666665), (0.28333333, 0.51666665), (0.28333333, 0.53333336), (0.275, 0.53333336), (0.275, 0.51666665), (0.275, 0.51666665), (0.275, 0.53333336), (0.26666668, 0.53333336), (0.26666668, 0.51666665), (0.26666668, 0.51666665), (0.26666668, 0.53333336), (0.25833333, 0.53333336), (0.25833333, 0.51666665), (0.25833333, 0.51666665), (0.25833333, 0.53333336), (0.25, 0.53333336), (0.25, 0.51666665), (0.25, 0.51666665), (0.25, 0.53333336), (0.24166666, 0.53333336), (0.24166666, 0.51666665), (0.24166666, 0.51666665), (0.24166666, 0.53333336), (0.23333333, 0.53333336), (0.23333333, 0.51666665), (0.23333333, 0.51666665), (0.23333333, 0.53333336), (0.225, 0.53333336), (0.225, 0.51666665), (0.225, 0.51666665), (0.225, 0.53333336), (0.21666667, 0.53333336), (0.21666667, 0.51666665), (0.21666667, 0.51666665), (0.21666667, 0.53333336), (0.20833333, 0.53333336), (0.20833333, 0.51666665), (0.20833333, 0.51666665), (0.20833333, 0.53333336), (0.2, 0.53333336), (0.2, 0.51666665), (0.2, 0.51666665), (0.2, 0.53333336), (0.19166666, 0.53333336), (0.19166666, 0.51666665), (0.19166666, 0.51666665), (0.19166666, 0.53333336), (0.18333334, 0.53333336), (0.18333334, 0.51666665), (0.18333334, 0.51666665), (0.18333334, 0.53333336), (0.175, 0.53333336), (0.175, 0.51666665), (0.175, 0.51666665), (0.175, 0.53333336), (0.16666667, 0.53333336), (0.16666667, 0.51666665), (0.16666667, 0.51666665), (0.16666667, 0.53333336), (0.15833333, 0.53333336), (0.15833333, 0.51666665), (0.15833333, 0.51666665), (0.15833333, 0.53333336), (0.15, 0.53333336), (0.15, 0.51666665), (0.15, 0.51666665), (0.15, 0.53333336), (0.14166667, 0.53333336), (0.14166667, 0.51666665), (0.14166667, 0.51666665), (0.14166667, 0.53333336), (0.13333334, 0.53333336), (0.13333334, 0.51666665), (0.13333334, 0.51666665), (0.13333334, 0.53333336), (0.125, 0.53333336), (0.125, 0.51666665), (0.125, 0.51666665), (0.125, 0.53333336), (0.11666667, 0.53333336), (0.11666667, 0.51666665), (0.11666667, 0.51666665), (0.11666667, 0.53333336), (0.108333334, 0.53333336), (0.108333334, 0.51666665), (0.108333334, 0.51666665), (0.108333334, 0.53333336), (0.1, 0.53333336), (0.1, 0.51666665), (0.1, 0.51666665), (0.1, 0.53333336), (0.09166667, 0.53333336), (0.09166667, 0.51666665), (0.09166667, 0.51666665), (0.09166667, 0.53333336), (0.083333336, 0.53333336), (0.083333336, 0.51666665), (0.083333336, 0.51666665), (0.083333336, 0.53333336), (0.075, 0.53333336), (0.075, 0.51666665), (0.075, 0.51666665), (0.075, 0.53333336), (0.06666667, 0.53333336), (0.06666667, 0.51666665), (0.06666667, 0.51666665), (0.06666667, 0.53333336), (0.058333334, 0.53333336), (0.058333334, 0.51666665), (0.058333334, 0.51666665), (0.058333334, 0.53333336), (0.05, 0.53333336), (0.05, 0.51666665), (0.05, 0.51666665), (0.05, 0.53333336), (0.041666668, 0.53333336), (0.041666668, 0.51666665), (0.041666668, 0.51666665), (0.041666668, 0.53333336), (0.033333335, 0.53333336), (0.033333335, 0.51666665), (0.033333335, 0.51666665), (0.033333335, 0.53333336), (0.025, 0.53333336), (0.025, 0.51666665), (0.025, 0.51666665), (0.025, 0.53333336), (0.016666668, 0.53333336), (0.016666668, 0.51666665), (0.016666668, 0.51666665), (0.016666668, 0.53333336), (0.008333334, 0.53333336), (0.008333334, 0.51666665), (0.008333334, 0.51666665), (0.008333334, 0.53333336), (0, 0.53333336), (0, 0.51666665), (1, 0.53333336), (1, 0.55), (0.9916667, 0.55), (0.9916667, 0.53333336), (0.9916667, 0.53333336), (0.9916667, 0.55), (0.98333335, 0.55), (0.98333335, 0.53333336), (0.98333335, 0.53333336), (0.98333335, 0.55), (0.975, 0.55), (0.975, 0.53333336), (0.975, 0.53333336), (0.975, 0.55), (0.96666664, 0.55), (0.96666664, 0.53333336), (0.96666664, 0.53333336), (0.96666664, 0.55), (0.9583333, 0.55), (0.9583333, 0.53333336), (0.9583333, 0.53333336), (0.9583333, 0.55), (0.95, 0.55), (0.95, 0.53333336), (0.95, 0.53333336), (0.95, 0.55), (0.94166666, 0.55), (0.94166666, 0.53333336), (0.94166666, 0.53333336), (0.94166666, 0.55), (0.93333334, 0.55), (0.93333334, 0.53333336), (0.93333334, 0.53333336), (0.93333334, 0.55), (0.925, 0.55), (0.925, 0.53333336), (0.925, 0.53333336), (0.925, 0.55), (0.9166667, 0.55), (0.9166667, 0.53333336), (0.9166667, 0.53333336), (0.9166667, 0.55), (0.90833336, 0.55), (0.90833336, 0.53333336), (0.90833336, 0.53333336), (0.90833336, 0.55), (0.9, 0.55), (0.9, 0.53333336), (0.9, 0.53333336), (0.9, 0.55), (0.89166665, 0.55), (0.89166665, 0.53333336), (0.89166665, 0.53333336), (0.89166665, 0.55), (0.8833333, 0.55), (0.8833333, 0.53333336), (0.8833333, 0.53333336), (0.8833333, 0.55), (0.875, 0.55), (0.875, 0.53333336), (0.875, 0.53333336), (0.875, 0.55), (0.8666667, 0.55), (0.8666667, 0.53333336), (0.8666667, 0.53333336), (0.8666667, 0.55), (0.85833335, 0.55), (0.85833335, 0.53333336), (0.85833335, 0.53333336), (0.85833335, 0.55), (0.85, 0.55), (0.85, 0.53333336), (0.85, 0.53333336), (0.85, 0.55), (0.84166664, 0.55), (0.84166664, 0.53333336), (0.84166664, 0.53333336), (0.84166664, 0.55), (0.8333333, 0.55), (0.8333333, 0.53333336), (0.8333333, 0.53333336), (0.8333333, 0.55), (0.825, 0.55), (0.825, 0.53333336), (0.825, 0.53333336), (0.825, 0.55), (0.81666666, 0.55), (0.81666666, 0.53333336), (0.81666666, 0.53333336), (0.81666666, 0.55), (0.80833334, 0.55), (0.80833334, 0.53333336), (0.80833334, 0.53333336), (0.80833334, 0.55), (0.8, 0.55), (0.8, 0.53333336), (0.8, 0.53333336), (0.8, 0.55), (0.7916667, 0.55), (0.7916667, 0.53333336), (0.7916667, 0.53333336), (0.7916667, 0.55), (0.78333336, 0.55), (0.78333336, 0.53333336), (0.78333336, 0.53333336), (0.78333336, 0.55), (0.775, 0.55), (0.775, 0.53333336), (0.775, 0.53333336), (0.775, 0.55), (0.76666665, 0.55), (0.76666665, 0.53333336), (0.76666665, 0.53333336), (0.76666665, 0.55), (0.7583333, 0.55), (0.7583333, 0.53333336), (0.7583333, 0.53333336), (0.7583333, 0.55), (0.75, 0.55), (0.75, 0.53333336), (0.75, 0.53333336), (0.75, 0.55), (0.7416667, 0.55), (0.7416667, 0.53333336), (0.7416667, 0.53333336), (0.7416667, 0.55), (0.73333335, 0.55), (0.73333335, 0.53333336), (0.73333335, 0.53333336), (0.73333335, 0.55), (0.725, 0.55), (0.725, 0.53333336), (0.725, 0.53333336), (0.725, 0.55), (0.71666664, 0.55), (0.71666664, 0.53333336), (0.71666664, 0.53333336), (0.71666664, 0.55), (0.7083333, 0.55), (0.7083333, 0.53333336), (0.7083333, 0.53333336), (0.7083333, 0.55), (0.7, 0.55), (0.7, 0.53333336), (0.7, 0.53333336), (0.7, 0.55), (0.69166666, 0.55), (0.69166666, 0.53333336), (0.69166666, 0.53333336), (0.69166666, 0.55), (0.68333334, 0.55), (0.68333334, 0.53333336), (0.68333334, 0.53333336), (0.68333334, 0.55), (0.675, 0.55), (0.675, 0.53333336), (0.675, 0.53333336), (0.675, 0.55), (0.6666667, 0.55), (0.6666667, 0.53333336), (0.6666667, 0.53333336), (0.6666667, 0.55), (0.65833336, 0.55), (0.65833336, 0.53333336), (0.65833336, 0.53333336), (0.65833336, 0.55), (0.65, 0.55), (0.65, 0.53333336), (0.65, 0.53333336), (0.65, 0.55), (0.64166665, 0.55), (0.64166665, 0.53333336), (0.64166665, 0.53333336), (0.64166665, 0.55), (0.6333333, 0.55), (0.6333333, 0.53333336), (0.6333333, 0.53333336), (0.6333333, 0.55), (0.625, 0.55), (0.625, 0.53333336), (0.625, 0.53333336), (0.625, 0.55), (0.6166667, 0.55), (0.6166667, 0.53333336), (0.6166667, 0.53333336), (0.6166667, 0.55), (0.60833335, 0.55), (0.60833335, 0.53333336), (0.60833335, 0.53333336), (0.60833335, 0.55), (0.6, 0.55), (0.6, 0.53333336), (0.6, 0.53333336), (0.6, 0.55), (0.59166664, 0.55), (0.59166664, 0.53333336), (0.59166664, 0.53333336), (0.59166664, 0.55), (0.5833333, 0.55), (0.5833333, 0.53333336), (0.5833333, 0.53333336), (0.5833333, 0.55), (0.575, 0.55), (0.575, 0.53333336), (0.575, 0.53333336), (0.575, 0.55), (0.56666666, 0.55), (0.56666666, 0.53333336), (0.56666666, 0.53333336), (0.56666666, 0.55), (0.55833334, 0.55), (0.55833334, 0.53333336), (0.55833334, 0.53333336), (0.55833334, 0.55), (0.55, 0.55), (0.55, 0.53333336), (0.55, 0.53333336), (0.55, 0.55), (0.5416667, 0.55), (0.5416667, 0.53333336), (0.5416667, 0.53333336), (0.5416667, 0.55), (0.53333336, 0.55), (0.53333336, 0.53333336), (0.53333336, 0.53333336), (0.53333336, 0.55), (0.525, 0.55), (0.525, 0.53333336), (0.525, 0.53333336), (0.525, 0.55), (0.51666665, 0.55), (0.51666665, 0.53333336), (0.51666665, 0.53333336), (0.51666665, 0.55), (0.5083333, 0.55), (0.5083333, 0.53333336), (0.5083333, 0.53333336), (0.5083333, 0.55), (0.5, 0.55), (0.5, 0.53333336), (0.5, 0.53333336), (0.5, 0.55), (0.49166667, 0.55), (0.49166667, 0.53333336), (0.49166667, 0.53333336), (0.49166667, 0.55), (0.48333332, 0.55), (0.48333332, 0.53333336), (0.48333332, 0.53333336), (0.48333332, 0.55), (0.475, 0.55), (0.475, 0.53333336), (0.475, 0.53333336), (0.475, 0.55), (0.46666667, 0.55), (0.46666667, 0.53333336), (0.46666667, 0.53333336), (0.46666667, 0.55), (0.45833334, 0.55), (0.45833334, 0.53333336), (0.45833334, 0.53333336), (0.45833334, 0.55), (0.45, 0.55), (0.45, 0.53333336), (0.45, 0.53333336), (0.45, 0.55), (0.44166666, 0.55), (0.44166666, 0.53333336), (0.44166666, 0.53333336), (0.44166666, 0.55), (0.43333334, 0.55), (0.43333334, 0.53333336), (0.43333334, 0.53333336), (0.43333334, 0.55), (0.425, 0.55), (0.425, 0.53333336), (0.425, 0.53333336), (0.425, 0.55), (0.41666666, 0.55), (0.41666666, 0.53333336), (0.41666666, 0.53333336), (0.41666666, 0.55), (0.40833333, 0.55), (0.40833333, 0.53333336), (0.40833333, 0.53333336), (0.40833333, 0.55), (0.4, 0.55), (0.4, 0.53333336), (0.4, 0.53333336), (0.4, 0.55), (0.39166668, 0.55), (0.39166668, 0.53333336), (0.39166668, 0.53333336), (0.39166668, 0.55), (0.38333333, 0.55), (0.38333333, 0.53333336), (0.38333333, 0.53333336), (0.38333333, 0.55), (0.375, 0.55), (0.375, 0.53333336), (0.375, 0.53333336), (0.375, 0.55), (0.36666667, 0.55), (0.36666667, 0.53333336), (0.36666667, 0.53333336), (0.36666667, 0.55), (0.35833332, 0.55), (0.35833332, 0.53333336), (0.35833332, 0.53333336), (0.35833332, 0.55), (0.35, 0.55), (0.35, 0.53333336), (0.35, 0.53333336), (0.35, 0.55), (0.34166667, 0.55), (0.34166667, 0.53333336), (0.34166667, 0.53333336), (0.34166667, 0.55), (0.33333334, 0.55), (0.33333334, 0.53333336), (0.33333334, 0.53333336), (0.33333334, 0.55), (0.325, 0.55), (0.325, 0.53333336), (0.325, 0.53333336), (0.325, 0.55), (0.31666666, 0.55), (0.31666666, 0.53333336), (0.31666666, 0.53333336), (0.31666666, 0.55), (0.30833334, 0.55), (0.30833334, 0.53333336), (0.30833334, 0.53333336), (0.30833334, 0.55), (0.3, 0.55), (0.3, 0.53333336), (0.3, 0.53333336), (0.3, 0.55), (0.29166666, 0.55), (0.29166666, 0.53333336), (0.29166666, 0.53333336), (0.29166666, 0.55), (0.28333333, 0.55), (0.28333333, 0.53333336), (0.28333333, 0.53333336), (0.28333333, 0.55), (0.275, 0.55), (0.275, 0.53333336), (0.275, 0.53333336), (0.275, 0.55), (0.26666668, 0.55), (0.26666668, 0.53333336), (0.26666668, 0.53333336), (0.26666668, 0.55), (0.25833333, 0.55), (0.25833333, 0.53333336), (0.25833333, 0.53333336), (0.25833333, 0.55), (0.25, 0.55), (0.25, 0.53333336), (0.25, 0.53333336), (0.25, 0.55), (0.24166666, 0.55), (0.24166666, 0.53333336), (0.24166666, 0.53333336), (0.24166666, 0.55), (0.23333333, 0.55), (0.23333333, 0.53333336), (0.23333333, 0.53333336), (0.23333333, 0.55), (0.225, 0.55), (0.225, 0.53333336), (0.225, 0.53333336), (0.225, 0.55), (0.21666667, 0.55), (0.21666667, 0.53333336), (0.21666667, 0.53333336), (0.21666667, 0.55), (0.20833333, 0.55), (0.20833333, 0.53333336), (0.20833333, 0.53333336), (0.20833333, 0.55), (0.2, 0.55), (0.2, 0.53333336), (0.2, 0.53333336), (0.2, 0.55), (0.19166666, 0.55), (0.19166666, 0.53333336), (0.19166666, 0.53333336), (0.19166666, 0.55), (0.18333334, 0.55), (0.18333334, 0.53333336), (0.18333334, 0.53333336), (0.18333334, 0.55), (0.175, 0.55), (0.175, 0.53333336), (0.175, 0.53333336), (0.175, 0.55), (0.16666667, 0.55), (0.16666667, 0.53333336), (0.16666667, 0.53333336), (0.16666667, 0.55), (0.15833333, 0.55), (0.15833333, 0.53333336), (0.15833333, 0.53333336), (0.15833333, 0.55), (0.15, 0.55), (0.15, 0.53333336), (0.15, 0.53333336), (0.15, 0.55), (0.14166667, 0.55), (0.14166667, 0.53333336), (0.14166667, 0.53333336), (0.14166667, 0.55), (0.13333334, 0.55), (0.13333334, 0.53333336), (0.13333334, 0.53333336), (0.13333334, 0.55), (0.125, 0.55), (0.125, 0.53333336), (0.125, 0.53333336), (0.125, 0.55), (0.11666667, 0.55), (0.11666667, 0.53333336), (0.11666667, 0.53333336), (0.11666667, 0.55), (0.108333334, 0.55), (0.108333334, 0.53333336), (0.108333334, 0.53333336), (0.108333334, 0.55), (0.1, 0.55), (0.1, 0.53333336), (0.1, 0.53333336), (0.1, 0.55), (0.09166667, 0.55), (0.09166667, 0.53333336), (0.09166667, 0.53333336), (0.09166667, 0.55), (0.083333336, 0.55), (0.083333336, 0.53333336), (0.083333336, 0.53333336), (0.083333336, 0.55), (0.075, 0.55), (0.075, 0.53333336), (0.075, 0.53333336), (0.075, 0.55), (0.06666667, 0.55), (0.06666667, 0.53333336), (0.06666667, 0.53333336), (0.06666667, 0.55), (0.058333334, 0.55), (0.058333334, 0.53333336), (0.058333334, 0.53333336), (0.058333334, 0.55), (0.05, 0.55), (0.05, 0.53333336), (0.05, 0.53333336), (0.05, 0.55), (0.041666668, 0.55), (0.041666668, 0.53333336), (0.041666668, 0.53333336), (0.041666668, 0.55), (0.033333335, 0.55), (0.033333335, 0.53333336), (0.033333335, 0.53333336), (0.033333335, 0.55), (0.025, 0.55), (0.025, 0.53333336), (0.025, 0.53333336), (0.025, 0.55), (0.016666668, 0.55), (0.016666668, 0.53333336), (0.016666668, 0.53333336), (0.016666668, 0.55), (0.008333334, 0.55), (0.008333334, 0.53333336), (0.008333334, 0.53333336), (0.008333334, 0.55), (0, 0.55), (0, 0.53333336), (1, 0.55), (1, 0.56666666), (0.9916667, 0.56666666), (0.9916667, 0.55), (0.9916667, 0.55), (0.9916667, 0.56666666), (0.98333335, 0.56666666), (0.98333335, 0.55), (0.98333335, 0.55), (0.98333335, 0.56666666), (0.975, 0.56666666), (0.975, 0.55), (0.975, 0.55), (0.975, 0.56666666), (0.96666664, 0.56666666), (0.96666664, 0.55), (0.96666664, 0.55), (0.96666664, 0.56666666), (0.9583333, 0.56666666), (0.9583333, 0.55), (0.9583333, 0.55), (0.9583333, 0.56666666), (0.95, 0.56666666), (0.95, 0.55), (0.95, 0.55), (0.95, 0.56666666), (0.94166666, 0.56666666), (0.94166666, 0.55), (0.94166666, 0.55), (0.94166666, 0.56666666), (0.93333334, 0.56666666), (0.93333334, 0.55), (0.93333334, 0.55), (0.93333334, 0.56666666), (0.925, 0.56666666), (0.925, 0.55), (0.925, 0.55), (0.925, 0.56666666), (0.9166667, 0.56666666), (0.9166667, 0.55), (0.9166667, 0.55), (0.9166667, 0.56666666), (0.90833336, 0.56666666), (0.90833336, 0.55), (0.90833336, 0.55), (0.90833336, 0.56666666), (0.9, 0.56666666), (0.9, 0.55), (0.9, 0.55), (0.9, 0.56666666), (0.89166665, 0.56666666), (0.89166665, 0.55), (0.89166665, 0.55), (0.89166665, 0.56666666), (0.8833333, 0.56666666), (0.8833333, 0.55), (0.8833333, 0.55), (0.8833333, 0.56666666), (0.875, 0.56666666), (0.875, 0.55), (0.875, 0.55), (0.875, 0.56666666), (0.8666667, 0.56666666), (0.8666667, 0.55), (0.8666667, 0.55), (0.8666667, 0.56666666), (0.85833335, 0.56666666), (0.85833335, 0.55), (0.85833335, 0.55), (0.85833335, 0.56666666), (0.85, 0.56666666), (0.85, 0.55), (0.85, 0.55), (0.85, 0.56666666), (0.84166664, 0.56666666), (0.84166664, 0.55), (0.84166664, 0.55), (0.84166664, 0.56666666), (0.8333333, 0.56666666), (0.8333333, 0.55), (0.8333333, 0.55), (0.8333333, 0.56666666), (0.825, 0.56666666), (0.825, 0.55), (0.825, 0.55), (0.825, 0.56666666), (0.81666666, 0.56666666), (0.81666666, 0.55), (0.81666666, 0.55), (0.81666666, 0.56666666), (0.80833334, 0.56666666), (0.80833334, 0.55), (0.80833334, 0.55), (0.80833334, 0.56666666), (0.8, 0.56666666), (0.8, 0.55), (0.8, 0.55), (0.8, 0.56666666), (0.7916667, 0.56666666), (0.7916667, 0.55), (0.7916667, 0.55), (0.7916667, 0.56666666), (0.78333336, 0.56666666), (0.78333336, 0.55), (0.78333336, 0.55), (0.78333336, 0.56666666), (0.775, 0.56666666), (0.775, 0.55), (0.775, 0.55), (0.775, 0.56666666), (0.76666665, 0.56666666), (0.76666665, 0.55), (0.76666665, 0.55), (0.76666665, 0.56666666), (0.7583333, 0.56666666), (0.7583333, 0.55), (0.7583333, 0.55), (0.7583333, 0.56666666), (0.75, 0.56666666), (0.75, 0.55), (0.75, 0.55), (0.75, 0.56666666), (0.7416667, 0.56666666), (0.7416667, 0.55), (0.7416667, 0.55), (0.7416667, 0.56666666), (0.73333335, 0.56666666), (0.73333335, 0.55), (0.73333335, 0.55), (0.73333335, 0.56666666), (0.725, 0.56666666), (0.725, 0.55), (0.725, 0.55), (0.725, 0.56666666), (0.71666664, 0.56666666), (0.71666664, 0.55), (0.71666664, 0.55), (0.71666664, 0.56666666), (0.7083333, 0.56666666), (0.7083333, 0.55), (0.7083333, 0.55), (0.7083333, 0.56666666), (0.7, 0.56666666), (0.7, 0.55), (0.7, 0.55), (0.7, 0.56666666), (0.69166666, 0.56666666), (0.69166666, 0.55), (0.69166666, 0.55), (0.69166666, 0.56666666), (0.68333334, 0.56666666), (0.68333334, 0.55), (0.68333334, 0.55), (0.68333334, 0.56666666), (0.675, 0.56666666), (0.675, 0.55), (0.675, 0.55), (0.675, 0.56666666), (0.6666667, 0.56666666), (0.6666667, 0.55), (0.6666667, 0.55), (0.6666667, 0.56666666), (0.65833336, 0.56666666), (0.65833336, 0.55), (0.65833336, 0.55), (0.65833336, 0.56666666), (0.65, 0.56666666), (0.65, 0.55), (0.65, 0.55), (0.65, 0.56666666), (0.64166665, 0.56666666), (0.64166665, 0.55), (0.64166665, 0.55), (0.64166665, 0.56666666), (0.6333333, 0.56666666), (0.6333333, 0.55), (0.6333333, 0.55), (0.6333333, 0.56666666), (0.625, 0.56666666), (0.625, 0.55), (0.625, 0.55), (0.625, 0.56666666), (0.6166667, 0.56666666), (0.6166667, 0.55), (0.6166667, 0.55), (0.6166667, 0.56666666), (0.60833335, 0.56666666), (0.60833335, 0.55), (0.60833335, 0.55), (0.60833335, 0.56666666), (0.6, 0.56666666), (0.6, 0.55), (0.6, 0.55), (0.6, 0.56666666), (0.59166664, 0.56666666), (0.59166664, 0.55), (0.59166664, 0.55), (0.59166664, 0.56666666), (0.5833333, 0.56666666), (0.5833333, 0.55), (0.5833333, 0.55), (0.5833333, 0.56666666), (0.575, 0.56666666), (0.575, 0.55), (0.575, 0.55), (0.575, 0.56666666), (0.56666666, 0.56666666), (0.56666666, 0.55), (0.56666666, 0.55), (0.56666666, 0.56666666), (0.55833334, 0.56666666), (0.55833334, 0.55), (0.55833334, 0.55), (0.55833334, 0.56666666), (0.55, 0.56666666), (0.55, 0.55), (0.55, 0.55), (0.55, 0.56666666), (0.5416667, 0.56666666), (0.5416667, 0.55), (0.5416667, 0.55), (0.5416667, 0.56666666), (0.53333336, 0.56666666), (0.53333336, 0.55), (0.53333336, 0.55), (0.53333336, 0.56666666), (0.525, 0.56666666), (0.525, 0.55), (0.525, 0.55), (0.525, 0.56666666), (0.51666665, 0.56666666), (0.51666665, 0.55), (0.51666665, 0.55), (0.51666665, 0.56666666), (0.5083333, 0.56666666), (0.5083333, 0.55), (0.5083333, 0.55), (0.5083333, 0.56666666), (0.5, 0.56666666), (0.5, 0.55), (0.5, 0.55), (0.5, 0.56666666), (0.49166667, 0.56666666), (0.49166667, 0.55), (0.49166667, 0.55), (0.49166667, 0.56666666), (0.48333332, 0.56666666), (0.48333332, 0.55), (0.48333332, 0.55), (0.48333332, 0.56666666), (0.475, 0.56666666), (0.475, 0.55), (0.475, 0.55), (0.475, 0.56666666), (0.46666667, 0.56666666), (0.46666667, 0.55), (0.46666667, 0.55), (0.46666667, 0.56666666), (0.45833334, 0.56666666), (0.45833334, 0.55), (0.45833334, 0.55), (0.45833334, 0.56666666), (0.45, 0.56666666), (0.45, 0.55), (0.45, 0.55), (0.45, 0.56666666), (0.44166666, 0.56666666), (0.44166666, 0.55), (0.44166666, 0.55), (0.44166666, 0.56666666), (0.43333334, 0.56666666), (0.43333334, 0.55), (0.43333334, 0.55), (0.43333334, 0.56666666), (0.425, 0.56666666), (0.425, 0.55), (0.425, 0.55), (0.425, 0.56666666), (0.41666666, 0.56666666), (0.41666666, 0.55), (0.41666666, 0.55), (0.41666666, 0.56666666), (0.40833333, 0.56666666), (0.40833333, 0.55), (0.40833333, 0.55), (0.40833333, 0.56666666), (0.4, 0.56666666), (0.4, 0.55), (0.4, 0.55), (0.4, 0.56666666), (0.39166668, 0.56666666), (0.39166668, 0.55), (0.39166668, 0.55), (0.39166668, 0.56666666), (0.38333333, 0.56666666), (0.38333333, 0.55), (0.38333333, 0.55), (0.38333333, 0.56666666), (0.375, 0.56666666), (0.375, 0.55), (0.375, 0.55), (0.375, 0.56666666), (0.36666667, 0.56666666), (0.36666667, 0.55), (0.36666667, 0.55), (0.36666667, 0.56666666), (0.35833332, 0.56666666), (0.35833332, 0.55), (0.35833332, 0.55), (0.35833332, 0.56666666), (0.35, 0.56666666), (0.35, 0.55), (0.35, 0.55), (0.35, 0.56666666), (0.34166667, 0.56666666), (0.34166667, 0.55), (0.34166667, 0.55), (0.34166667, 0.56666666), (0.33333334, 0.56666666), (0.33333334, 0.55), (0.33333334, 0.55), (0.33333334, 0.56666666), (0.325, 0.56666666), (0.325, 0.55), (0.325, 0.55), (0.325, 0.56666666), (0.31666666, 0.56666666), (0.31666666, 0.55), (0.31666666, 0.55), (0.31666666, 0.56666666), (0.30833334, 0.56666666), (0.30833334, 0.55), (0.30833334, 0.55), (0.30833334, 0.56666666), (0.3, 0.56666666), (0.3, 0.55), (0.3, 0.55), (0.3, 0.56666666), (0.29166666, 0.56666666), (0.29166666, 0.55), (0.29166666, 0.55), (0.29166666, 0.56666666), (0.28333333, 0.56666666), (0.28333333, 0.55), (0.28333333, 0.55), (0.28333333, 0.56666666), (0.275, 0.56666666), (0.275, 0.55), (0.275, 0.55), (0.275, 0.56666666), (0.26666668, 0.56666666), (0.26666668, 0.55), (0.26666668, 0.55), (0.26666668, 0.56666666), (0.25833333, 0.56666666), (0.25833333, 0.55), (0.25833333, 0.55), (0.25833333, 0.56666666), (0.25, 0.56666666), (0.25, 0.55), (0.25, 0.55), (0.25, 0.56666666), (0.24166666, 0.56666666), (0.24166666, 0.55), (0.24166666, 0.55), (0.24166666, 0.56666666), (0.23333333, 0.56666666), (0.23333333, 0.55), (0.23333333, 0.55), (0.23333333, 0.56666666), (0.225, 0.56666666), (0.225, 0.55), (0.225, 0.55), (0.225, 0.56666666), (0.21666667, 0.56666666), (0.21666667, 0.55), (0.21666667, 0.55), (0.21666667, 0.56666666), (0.20833333, 0.56666666), (0.20833333, 0.55), (0.20833333, 0.55), (0.20833333, 0.56666666), (0.2, 0.56666666), (0.2, 0.55), (0.2, 0.55), (0.2, 0.56666666), (0.19166666, 0.56666666), (0.19166666, 0.55), (0.19166666, 0.55), (0.19166666, 0.56666666), (0.18333334, 0.56666666), (0.18333334, 0.55), (0.18333334, 0.55), (0.18333334, 0.56666666), (0.175, 0.56666666), (0.175, 0.55), (0.175, 0.55), (0.175, 0.56666666), (0.16666667, 0.56666666), (0.16666667, 0.55), (0.16666667, 0.55), (0.16666667, 0.56666666), (0.15833333, 0.56666666), (0.15833333, 0.55), (0.15833333, 0.55), (0.15833333, 0.56666666), (0.15, 0.56666666), (0.15, 0.55), (0.15, 0.55), (0.15, 0.56666666), (0.14166667, 0.56666666), (0.14166667, 0.55), (0.14166667, 0.55), (0.14166667, 0.56666666), (0.13333334, 0.56666666), (0.13333334, 0.55), (0.13333334, 0.55), (0.13333334, 0.56666666), (0.125, 0.56666666), (0.125, 0.55), (0.125, 0.55), (0.125, 0.56666666), (0.11666667, 0.56666666), (0.11666667, 0.55), (0.11666667, 0.55), (0.11666667, 0.56666666), (0.108333334, 0.56666666), (0.108333334, 0.55), (0.108333334, 0.55), (0.108333334, 0.56666666), (0.1, 0.56666666), (0.1, 0.55), (0.1, 0.55), (0.1, 0.56666666), (0.09166667, 0.56666666), (0.09166667, 0.55), (0.09166667, 0.55), (0.09166667, 0.56666666), (0.083333336, 0.56666666), (0.083333336, 0.55), (0.083333336, 0.55), (0.083333336, 0.56666666), (0.075, 0.56666666), (0.075, 0.55), (0.075, 0.55), (0.075, 0.56666666), (0.06666667, 0.56666666), (0.06666667, 0.55), (0.06666667, 0.55), (0.06666667, 0.56666666), (0.058333334, 0.56666666), (0.058333334, 0.55), (0.058333334, 0.55), (0.058333334, 0.56666666), (0.05, 0.56666666), (0.05, 0.55), (0.05, 0.55), (0.05, 0.56666666), (0.041666668, 0.56666666), (0.041666668, 0.55), (0.041666668, 0.55), (0.041666668, 0.56666666), (0.033333335, 0.56666666), (0.033333335, 0.55), (0.033333335, 0.55), (0.033333335, 0.56666666), (0.025, 0.56666666), (0.025, 0.55), (0.025, 0.55), (0.025, 0.56666666), (0.016666668, 0.56666666), (0.016666668, 0.55), (0.016666668, 0.55), (0.016666668, 0.56666666), (0.008333334, 0.56666666), (0.008333334, 0.55), (0.008333334, 0.55), (0.008333334, 0.56666666), (0, 0.56666666), (0, 0.55), (1, 0.56666666), (1, 0.5833333), (0.9916667, 0.5833333), (0.9916667, 0.56666666), (0.9916667, 0.56666666), (0.9916667, 0.5833333), (0.98333335, 0.5833333), (0.98333335, 0.56666666), (0.98333335, 0.56666666), (0.98333335, 0.5833333), (0.975, 0.5833333), (0.975, 0.56666666), (0.975, 0.56666666), (0.975, 0.5833333), (0.96666664, 0.5833333), (0.96666664, 0.56666666), (0.96666664, 0.56666666), (0.96666664, 0.5833333), (0.9583333, 0.5833333), (0.9583333, 0.56666666), (0.9583333, 0.56666666), (0.9583333, 0.5833333), (0.95, 0.5833333), (0.95, 0.56666666), (0.95, 0.56666666), (0.95, 0.5833333), (0.94166666, 0.5833333), (0.94166666, 0.56666666), (0.94166666, 0.56666666), (0.94166666, 0.5833333), (0.93333334, 0.5833333), (0.93333334, 0.56666666), (0.93333334, 0.56666666), (0.93333334, 0.5833333), (0.925, 0.5833333), (0.925, 0.56666666), (0.925, 0.56666666), (0.925, 0.5833333), (0.9166667, 0.5833333), (0.9166667, 0.56666666), (0.9166667, 0.56666666), (0.9166667, 0.5833333), (0.90833336, 0.5833333), (0.90833336, 0.56666666), (0.90833336, 0.56666666), (0.90833336, 0.5833333), (0.9, 0.5833333), (0.9, 0.56666666), (0.9, 0.56666666), (0.9, 0.5833333), (0.89166665, 0.5833333), (0.89166665, 0.56666666), (0.89166665, 0.56666666), (0.89166665, 0.5833333), (0.8833333, 0.5833333), (0.8833333, 0.56666666), (0.8833333, 0.56666666), (0.8833333, 0.5833333), (0.875, 0.5833333), (0.875, 0.56666666), (0.875, 0.56666666), (0.875, 0.5833333), (0.8666667, 0.5833333), (0.8666667, 0.56666666), (0.8666667, 0.56666666), (0.8666667, 0.5833333), (0.85833335, 0.5833333), (0.85833335, 0.56666666), (0.85833335, 0.56666666), (0.85833335, 0.5833333), (0.85, 0.5833333), (0.85, 0.56666666), (0.85, 0.56666666), (0.85, 0.5833333), (0.84166664, 0.5833333), (0.84166664, 0.56666666), (0.84166664, 0.56666666), (0.84166664, 0.5833333), (0.8333333, 0.5833333), (0.8333333, 0.56666666), (0.8333333, 0.56666666), (0.8333333, 0.5833333), (0.825, 0.5833333), (0.825, 0.56666666), (0.825, 0.56666666), (0.825, 0.5833333), (0.81666666, 0.5833333), (0.81666666, 0.56666666), (0.81666666, 0.56666666), (0.81666666, 0.5833333), (0.80833334, 0.5833333), (0.80833334, 0.56666666), (0.80833334, 0.56666666), (0.80833334, 0.5833333), (0.8, 0.5833333), (0.8, 0.56666666), (0.8, 0.56666666), (0.8, 0.5833333), (0.7916667, 0.5833333), (0.7916667, 0.56666666), (0.7916667, 0.56666666), (0.7916667, 0.5833333), (0.78333336, 0.5833333), (0.78333336, 0.56666666), (0.78333336, 0.56666666), (0.78333336, 0.5833333), (0.775, 0.5833333), (0.775, 0.56666666), (0.775, 0.56666666), (0.775, 0.5833333), (0.76666665, 0.5833333), (0.76666665, 0.56666666), (0.76666665, 0.56666666), (0.76666665, 0.5833333), (0.7583333, 0.5833333), (0.7583333, 0.56666666), (0.7583333, 0.56666666), (0.7583333, 0.5833333), (0.75, 0.5833333), (0.75, 0.56666666), (0.75, 0.56666666), (0.75, 0.5833333), (0.7416667, 0.5833333), (0.7416667, 0.56666666), (0.7416667, 0.56666666), (0.7416667, 0.5833333), (0.73333335, 0.5833333), (0.73333335, 0.56666666), (0.73333335, 0.56666666), (0.73333335, 0.5833333), (0.725, 0.5833333), (0.725, 0.56666666), (0.725, 0.56666666), (0.725, 0.5833333), (0.71666664, 0.5833333), (0.71666664, 0.56666666), (0.71666664, 0.56666666), (0.71666664, 0.5833333), (0.7083333, 0.5833333), (0.7083333, 0.56666666), (0.7083333, 0.56666666), (0.7083333, 0.5833333), (0.7, 0.5833333), (0.7, 0.56666666), (0.7, 0.56666666), (0.7, 0.5833333), (0.69166666, 0.5833333), (0.69166666, 0.56666666), (0.69166666, 0.56666666), (0.69166666, 0.5833333), (0.68333334, 0.5833333), (0.68333334, 0.56666666), (0.68333334, 0.56666666), (0.68333334, 0.5833333), (0.675, 0.5833333), (0.675, 0.56666666), (0.675, 0.56666666), (0.675, 0.5833333), (0.6666667, 0.5833333), (0.6666667, 0.56666666), (0.6666667, 0.56666666), (0.6666667, 0.5833333), (0.65833336, 0.5833333), (0.65833336, 0.56666666), (0.65833336, 0.56666666), (0.65833336, 0.5833333), (0.65, 0.5833333), (0.65, 0.56666666), (0.65, 0.56666666), (0.65, 0.5833333), (0.64166665, 0.5833333), (0.64166665, 0.56666666), (0.64166665, 0.56666666), (0.64166665, 0.5833333), (0.6333333, 0.5833333), (0.6333333, 0.56666666), (0.6333333, 0.56666666), (0.6333333, 0.5833333), (0.625, 0.5833333), (0.625, 0.56666666), (0.625, 0.56666666), (0.625, 0.5833333), (0.6166667, 0.5833333), (0.6166667, 0.56666666), (0.6166667, 0.56666666), (0.6166667, 0.5833333), (0.60833335, 0.5833333), (0.60833335, 0.56666666), (0.60833335, 0.56666666), (0.60833335, 0.5833333), (0.6, 0.5833333), (0.6, 0.56666666), (0.6, 0.56666666), (0.6, 0.5833333), (0.59166664, 0.5833333), (0.59166664, 0.56666666), (0.59166664, 0.56666666), (0.59166664, 0.5833333), (0.5833333, 0.5833333), (0.5833333, 0.56666666), (0.5833333, 0.56666666), (0.5833333, 0.5833333), (0.575, 0.5833333), (0.575, 0.56666666), (0.575, 0.56666666), (0.575, 0.5833333), (0.56666666, 0.5833333), (0.56666666, 0.56666666), (0.56666666, 0.56666666), (0.56666666, 0.5833333), (0.55833334, 0.5833333), (0.55833334, 0.56666666), (0.55833334, 0.56666666), (0.55833334, 0.5833333), (0.55, 0.5833333), (0.55, 0.56666666), (0.55, 0.56666666), (0.55, 0.5833333), (0.5416667, 0.5833333), (0.5416667, 0.56666666), (0.5416667, 0.56666666), (0.5416667, 0.5833333), (0.53333336, 0.5833333), (0.53333336, 0.56666666), (0.53333336, 0.56666666), (0.53333336, 0.5833333), (0.525, 0.5833333), (0.525, 0.56666666), (0.525, 0.56666666), (0.525, 0.5833333), (0.51666665, 0.5833333), (0.51666665, 0.56666666), (0.51666665, 0.56666666), (0.51666665, 0.5833333), (0.5083333, 0.5833333), (0.5083333, 0.56666666), (0.5083333, 0.56666666), (0.5083333, 0.5833333), (0.5, 0.5833333), (0.5, 0.56666666), (0.5, 0.56666666), (0.5, 0.5833333), (0.49166667, 0.5833333), (0.49166667, 0.56666666), (0.49166667, 0.56666666), (0.49166667, 0.5833333), (0.48333332, 0.5833333), (0.48333332, 0.56666666), (0.48333332, 0.56666666), (0.48333332, 0.5833333), (0.475, 0.5833333), (0.475, 0.56666666), (0.475, 0.56666666), (0.475, 0.5833333), (0.46666667, 0.5833333), (0.46666667, 0.56666666), (0.46666667, 0.56666666), (0.46666667, 0.5833333), (0.45833334, 0.5833333), (0.45833334, 0.56666666), (0.45833334, 0.56666666), (0.45833334, 0.5833333), (0.45, 0.5833333), (0.45, 0.56666666), (0.45, 0.56666666), (0.45, 0.5833333), (0.44166666, 0.5833333), (0.44166666, 0.56666666), (0.44166666, 0.56666666), (0.44166666, 0.5833333), (0.43333334, 0.5833333), (0.43333334, 0.56666666), (0.43333334, 0.56666666), (0.43333334, 0.5833333), (0.425, 0.5833333), (0.425, 0.56666666), (0.425, 0.56666666), (0.425, 0.5833333), (0.41666666, 0.5833333), (0.41666666, 0.56666666), (0.41666666, 0.56666666), (0.41666666, 0.5833333), (0.40833333, 0.5833333), (0.40833333, 0.56666666), (0.40833333, 0.56666666), (0.40833333, 0.5833333), (0.4, 0.5833333), (0.4, 0.56666666), (0.4, 0.56666666), (0.4, 0.5833333), (0.39166668, 0.5833333), (0.39166668, 0.56666666), (0.39166668, 0.56666666), (0.39166668, 0.5833333), (0.38333333, 0.5833333), (0.38333333, 0.56666666), (0.38333333, 0.56666666), (0.38333333, 0.5833333), (0.375, 0.5833333), (0.375, 0.56666666), (0.375, 0.56666666), (0.375, 0.5833333), (0.36666667, 0.5833333), (0.36666667, 0.56666666), (0.36666667, 0.56666666), (0.36666667, 0.5833333), (0.35833332, 0.5833333), (0.35833332, 0.56666666), (0.35833332, 0.56666666), (0.35833332, 0.5833333), (0.35, 0.5833333), (0.35, 0.56666666), (0.35, 0.56666666), (0.35, 0.5833333), (0.34166667, 0.5833333), (0.34166667, 0.56666666), (0.34166667, 0.56666666), (0.34166667, 0.5833333), (0.33333334, 0.5833333), (0.33333334, 0.56666666), (0.33333334, 0.56666666), (0.33333334, 0.5833333), (0.325, 0.5833333), (0.325, 0.56666666), (0.325, 0.56666666), (0.325, 0.5833333), (0.31666666, 0.5833333), (0.31666666, 0.56666666), (0.31666666, 0.56666666), (0.31666666, 0.5833333), (0.30833334, 0.5833333), (0.30833334, 0.56666666), (0.30833334, 0.56666666), (0.30833334, 0.5833333), (0.3, 0.5833333), (0.3, 0.56666666), (0.3, 0.56666666), (0.3, 0.5833333), (0.29166666, 0.5833333), (0.29166666, 0.56666666), (0.29166666, 0.56666666), (0.29166666, 0.5833333), (0.28333333, 0.5833333), (0.28333333, 0.56666666), (0.28333333, 0.56666666), (0.28333333, 0.5833333), (0.275, 0.5833333), (0.275, 0.56666666), (0.275, 0.56666666), (0.275, 0.5833333), (0.26666668, 0.5833333), (0.26666668, 0.56666666), (0.26666668, 0.56666666), (0.26666668, 0.5833333), (0.25833333, 0.5833333), (0.25833333, 0.56666666), (0.25833333, 0.56666666), (0.25833333, 0.5833333), (0.25, 0.5833333), (0.25, 0.56666666), (0.25, 0.56666666), (0.25, 0.5833333), (0.24166666, 0.5833333), (0.24166666, 0.56666666), (0.24166666, 0.56666666), (0.24166666, 0.5833333), (0.23333333, 0.5833333), (0.23333333, 0.56666666), (0.23333333, 0.56666666), (0.23333333, 0.5833333), (0.225, 0.5833333), (0.225, 0.56666666), (0.225, 0.56666666), (0.225, 0.5833333), (0.21666667, 0.5833333), (0.21666667, 0.56666666), (0.21666667, 0.56666666), (0.21666667, 0.5833333), (0.20833333, 0.5833333), (0.20833333, 0.56666666), (0.20833333, 0.56666666), (0.20833333, 0.5833333), (0.2, 0.5833333), (0.2, 0.56666666), (0.2, 0.56666666), (0.2, 0.5833333), (0.19166666, 0.5833333), (0.19166666, 0.56666666), (0.19166666, 0.56666666), (0.19166666, 0.5833333), (0.18333334, 0.5833333), (0.18333334, 0.56666666), (0.18333334, 0.56666666), (0.18333334, 0.5833333), (0.175, 0.5833333), (0.175, 0.56666666), (0.175, 0.56666666), (0.175, 0.5833333), (0.16666667, 0.5833333), (0.16666667, 0.56666666), (0.16666667, 0.56666666), (0.16666667, 0.5833333), (0.15833333, 0.5833333), (0.15833333, 0.56666666), (0.15833333, 0.56666666), (0.15833333, 0.5833333), (0.15, 0.5833333), (0.15, 0.56666666), (0.15, 0.56666666), (0.15, 0.5833333), (0.14166667, 0.5833333), (0.14166667, 0.56666666), (0.14166667, 0.56666666), (0.14166667, 0.5833333), (0.13333334, 0.5833333), (0.13333334, 0.56666666), (0.13333334, 0.56666666), (0.13333334, 0.5833333), (0.125, 0.5833333), (0.125, 0.56666666), (0.125, 0.56666666), (0.125, 0.5833333), (0.11666667, 0.5833333), (0.11666667, 0.56666666), (0.11666667, 0.56666666), (0.11666667, 0.5833333), (0.108333334, 0.5833333), (0.108333334, 0.56666666), (0.108333334, 0.56666666), (0.108333334, 0.5833333), (0.1, 0.5833333), (0.1, 0.56666666), (0.1, 0.56666666), (0.1, 0.5833333), (0.09166667, 0.5833333), (0.09166667, 0.56666666), (0.09166667, 0.56666666), (0.09166667, 0.5833333), (0.083333336, 0.5833333), (0.083333336, 0.56666666), (0.083333336, 0.56666666), (0.083333336, 0.5833333), (0.075, 0.5833333), (0.075, 0.56666666), (0.075, 0.56666666), (0.075, 0.5833333), (0.06666667, 0.5833333), (0.06666667, 0.56666666), (0.06666667, 0.56666666), (0.06666667, 0.5833333), (0.058333334, 0.5833333), (0.058333334, 0.56666666), (0.058333334, 0.56666666), (0.058333334, 0.5833333), (0.05, 0.5833333), (0.05, 0.56666666), (0.05, 0.56666666), (0.05, 0.5833333), (0.041666668, 0.5833333), (0.041666668, 0.56666666), (0.041666668, 0.56666666), (0.041666668, 0.5833333), (0.033333335, 0.5833333), (0.033333335, 0.56666666), (0.033333335, 0.56666666), (0.033333335, 0.5833333), (0.025, 0.5833333), (0.025, 0.56666666), (0.025, 0.56666666), (0.025, 0.5833333), (0.016666668, 0.5833333), (0.016666668, 0.56666666), (0.016666668, 0.56666666), (0.016666668, 0.5833333), (0.008333334, 0.5833333), (0.008333334, 0.56666666), (0.008333334, 0.56666666), (0.008333334, 0.5833333), (0, 0.5833333), (0, 0.56666666), (1, 0.5833333), (1, 0.6), (0.9916667, 0.6), (0.9916667, 0.5833333), (0.9916667, 0.5833333), (0.9916667, 0.6), (0.98333335, 0.6), (0.98333335, 0.5833333), (0.98333335, 0.5833333), (0.98333335, 0.6), (0.975, 0.6), (0.975, 0.5833333), (0.975, 0.5833333), (0.975, 0.6), (0.96666664, 0.6), (0.96666664, 0.5833333), (0.96666664, 0.5833333), (0.96666664, 0.6), (0.9583333, 0.6), (0.9583333, 0.5833333), (0.9583333, 0.5833333), (0.9583333, 0.6), (0.95, 0.6), (0.95, 0.5833333), (0.95, 0.5833333), (0.95, 0.6), (0.94166666, 0.6), (0.94166666, 0.5833333), (0.94166666, 0.5833333), (0.94166666, 0.6), (0.93333334, 0.6), (0.93333334, 0.5833333), (0.93333334, 0.5833333), (0.93333334, 0.6), (0.925, 0.6), (0.925, 0.5833333), (0.925, 0.5833333), (0.925, 0.6), (0.9166667, 0.6), (0.9166667, 0.5833333), (0.9166667, 0.5833333), (0.9166667, 0.6), (0.90833336, 0.6), (0.90833336, 0.5833333), (0.90833336, 0.5833333), (0.90833336, 0.6), (0.9, 0.6), (0.9, 0.5833333), (0.9, 0.5833333), (0.9, 0.6), (0.89166665, 0.6), (0.89166665, 0.5833333), (0.89166665, 0.5833333), (0.89166665, 0.6), (0.8833333, 0.6), (0.8833333, 0.5833333), (0.8833333, 0.5833333), (0.8833333, 0.6), (0.875, 0.6), (0.875, 0.5833333), (0.875, 0.5833333), (0.875, 0.6), (0.8666667, 0.6), (0.8666667, 0.5833333), (0.8666667, 0.5833333), (0.8666667, 0.6), (0.85833335, 0.6), (0.85833335, 0.5833333), (0.85833335, 0.5833333), (0.85833335, 0.6), (0.85, 0.6), (0.85, 0.5833333), (0.85, 0.5833333), (0.85, 0.6), (0.84166664, 0.6), (0.84166664, 0.5833333), (0.84166664, 0.5833333), (0.84166664, 0.6), (0.8333333, 0.6), (0.8333333, 0.5833333), (0.8333333, 0.5833333), (0.8333333, 0.6), (0.825, 0.6), (0.825, 0.5833333), (0.825, 0.5833333), (0.825, 0.6), (0.81666666, 0.6), (0.81666666, 0.5833333), (0.81666666, 0.5833333), (0.81666666, 0.6), (0.80833334, 0.6), (0.80833334, 0.5833333), (0.80833334, 0.5833333), (0.80833334, 0.6), (0.8, 0.6), (0.8, 0.5833333), (0.8, 0.5833333), (0.8, 0.6), (0.7916667, 0.6), (0.7916667, 0.5833333), (0.7916667, 0.5833333), (0.7916667, 0.6), (0.78333336, 0.6), (0.78333336, 0.5833333), (0.78333336, 0.5833333), (0.78333336, 0.6), (0.775, 0.6), (0.775, 0.5833333), (0.775, 0.5833333), (0.775, 0.6), (0.76666665, 0.6), (0.76666665, 0.5833333), (0.76666665, 0.5833333), (0.76666665, 0.6), (0.7583333, 0.6), (0.7583333, 0.5833333), (0.7583333, 0.5833333), (0.7583333, 0.6), (0.75, 0.6), (0.75, 0.5833333), (0.75, 0.5833333), (0.75, 0.6), (0.7416667, 0.6), (0.7416667, 0.5833333), (0.7416667, 0.5833333), (0.7416667, 0.6), (0.73333335, 0.6), (0.73333335, 0.5833333), (0.73333335, 0.5833333), (0.73333335, 0.6), (0.725, 0.6), (0.725, 0.5833333), (0.725, 0.5833333), (0.725, 0.6), (0.71666664, 0.6), (0.71666664, 0.5833333), (0.71666664, 0.5833333), (0.71666664, 0.6), (0.7083333, 0.6), (0.7083333, 0.5833333), (0.7083333, 0.5833333), (0.7083333, 0.6), (0.7, 0.6), (0.7, 0.5833333), (0.7, 0.5833333), (0.7, 0.6), (0.69166666, 0.6), (0.69166666, 0.5833333), (0.69166666, 0.5833333), (0.69166666, 0.6), (0.68333334, 0.6), (0.68333334, 0.5833333), (0.68333334, 0.5833333), (0.68333334, 0.6), (0.675, 0.6), (0.675, 0.5833333), (0.675, 0.5833333), (0.675, 0.6), (0.6666667, 0.6), (0.6666667, 0.5833333), (0.6666667, 0.5833333), (0.6666667, 0.6), (0.65833336, 0.6), (0.65833336, 0.5833333), (0.65833336, 0.5833333), (0.65833336, 0.6), (0.65, 0.6), (0.65, 0.5833333), (0.65, 0.5833333), (0.65, 0.6), (0.64166665, 0.6), (0.64166665, 0.5833333), (0.64166665, 0.5833333), (0.64166665, 0.6), (0.6333333, 0.6), (0.6333333, 0.5833333), (0.6333333, 0.5833333), (0.6333333, 0.6), (0.625, 0.6), (0.625, 0.5833333), (0.625, 0.5833333), (0.625, 0.6), (0.6166667, 0.6), (0.6166667, 0.5833333), (0.6166667, 0.5833333), (0.6166667, 0.6), (0.60833335, 0.6), (0.60833335, 0.5833333), (0.60833335, 0.5833333), (0.60833335, 0.6), (0.6, 0.6), (0.6, 0.5833333), (0.6, 0.5833333), (0.6, 0.6), (0.59166664, 0.6), (0.59166664, 0.5833333), (0.59166664, 0.5833333), (0.59166664, 0.6), (0.5833333, 0.6), (0.5833333, 0.5833333), (0.5833333, 0.5833333), (0.5833333, 0.6), (0.575, 0.6), (0.575, 0.5833333), (0.575, 0.5833333), (0.575, 0.6), (0.56666666, 0.6), (0.56666666, 0.5833333), (0.56666666, 0.5833333), (0.56666666, 0.6), (0.55833334, 0.6), (0.55833334, 0.5833333), (0.55833334, 0.5833333), (0.55833334, 0.6), (0.55, 0.6), (0.55, 0.5833333), (0.55, 0.5833333), (0.55, 0.6), (0.5416667, 0.6), (0.5416667, 0.5833333), (0.5416667, 0.5833333), (0.5416667, 0.6), (0.53333336, 0.6), (0.53333336, 0.5833333), (0.53333336, 0.5833333), (0.53333336, 0.6), (0.525, 0.6), (0.525, 0.5833333), (0.525, 0.5833333), (0.525, 0.6), (0.51666665, 0.6), (0.51666665, 0.5833333), (0.51666665, 0.5833333), (0.51666665, 0.6), (0.5083333, 0.6), (0.5083333, 0.5833333), (0.5083333, 0.5833333), (0.5083333, 0.6), (0.5, 0.6), (0.5, 0.5833333), (0.5, 0.5833333), (0.5, 0.6), (0.49166667, 0.6), (0.49166667, 0.5833333), (0.49166667, 0.5833333), (0.49166667, 0.6), (0.48333332, 0.6), (0.48333332, 0.5833333), (0.48333332, 0.5833333), (0.48333332, 0.6), (0.475, 0.6), (0.475, 0.5833333), (0.475, 0.5833333), (0.475, 0.6), (0.46666667, 0.6), (0.46666667, 0.5833333), (0.46666667, 0.5833333), (0.46666667, 0.6), (0.45833334, 0.6), (0.45833334, 0.5833333), (0.45833334, 0.5833333), (0.45833334, 0.6), (0.45, 0.6), (0.45, 0.5833333), (0.45, 0.5833333), (0.45, 0.6), (0.44166666, 0.6), (0.44166666, 0.5833333), (0.44166666, 0.5833333), (0.44166666, 0.6), (0.43333334, 0.6), (0.43333334, 0.5833333), (0.43333334, 0.5833333), (0.43333334, 0.6), (0.425, 0.6), (0.425, 0.5833333), (0.425, 0.5833333), (0.425, 0.6), (0.41666666, 0.6), (0.41666666, 0.5833333), (0.41666666, 0.5833333), (0.41666666, 0.6), (0.40833333, 0.6), (0.40833333, 0.5833333), (0.40833333, 0.5833333), (0.40833333, 0.6), (0.4, 0.6), (0.4, 0.5833333), (0.4, 0.5833333), (0.4, 0.6), (0.39166668, 0.6), (0.39166668, 0.5833333), (0.39166668, 0.5833333), (0.39166668, 0.6), (0.38333333, 0.6), (0.38333333, 0.5833333), (0.38333333, 0.5833333), (0.38333333, 0.6), (0.375, 0.6), (0.375, 0.5833333), (0.375, 0.5833333), (0.375, 0.6), (0.36666667, 0.6), (0.36666667, 0.5833333), (0.36666667, 0.5833333), (0.36666667, 0.6), (0.35833332, 0.6), (0.35833332, 0.5833333), (0.35833332, 0.5833333), (0.35833332, 0.6), (0.35, 0.6), (0.35, 0.5833333), (0.35, 0.5833333), (0.35, 0.6), (0.34166667, 0.6), (0.34166667, 0.5833333), (0.34166667, 0.5833333), (0.34166667, 0.6), (0.33333334, 0.6), (0.33333334, 0.5833333), (0.33333334, 0.5833333), (0.33333334, 0.6), (0.325, 0.6), (0.325, 0.5833333), (0.325, 0.5833333), (0.325, 0.6), (0.31666666, 0.6), (0.31666666, 0.5833333), (0.31666666, 0.5833333), (0.31666666, 0.6), (0.30833334, 0.6), (0.30833334, 0.5833333), (0.30833334, 0.5833333), (0.30833334, 0.6), (0.3, 0.6), (0.3, 0.5833333), (0.3, 0.5833333), (0.3, 0.6), (0.29166666, 0.6), (0.29166666, 0.5833333), (0.29166666, 0.5833333), (0.29166666, 0.6), (0.28333333, 0.6), (0.28333333, 0.5833333), (0.28333333, 0.5833333), (0.28333333, 0.6), (0.275, 0.6), (0.275, 0.5833333), (0.275, 0.5833333), (0.275, 0.6), (0.26666668, 0.6), (0.26666668, 0.5833333), (0.26666668, 0.5833333), (0.26666668, 0.6), (0.25833333, 0.6), (0.25833333, 0.5833333), (0.25833333, 0.5833333), (0.25833333, 0.6), (0.25, 0.6), (0.25, 0.5833333), (0.25, 0.5833333), (0.25, 0.6), (0.24166666, 0.6), (0.24166666, 0.5833333), (0.24166666, 0.5833333), (0.24166666, 0.6), (0.23333333, 0.6), (0.23333333, 0.5833333), (0.23333333, 0.5833333), (0.23333333, 0.6), (0.225, 0.6), (0.225, 0.5833333), (0.225, 0.5833333), (0.225, 0.6), (0.21666667, 0.6), (0.21666667, 0.5833333), (0.21666667, 0.5833333), (0.21666667, 0.6), (0.20833333, 0.6), (0.20833333, 0.5833333), (0.20833333, 0.5833333), (0.20833333, 0.6), (0.2, 0.6), (0.2, 0.5833333), (0.2, 0.5833333), (0.2, 0.6), (0.19166666, 0.6), (0.19166666, 0.5833333), (0.19166666, 0.5833333), (0.19166666, 0.6), (0.18333334, 0.6), (0.18333334, 0.5833333), (0.18333334, 0.5833333), (0.18333334, 0.6), (0.175, 0.6), (0.175, 0.5833333), (0.175, 0.5833333), (0.175, 0.6), (0.16666667, 0.6), (0.16666667, 0.5833333), (0.16666667, 0.5833333), (0.16666667, 0.6), (0.15833333, 0.6), (0.15833333, 0.5833333), (0.15833333, 0.5833333), (0.15833333, 0.6), (0.15, 0.6), (0.15, 0.5833333), (0.15, 0.5833333), (0.15, 0.6), (0.14166667, 0.6), (0.14166667, 0.5833333), (0.14166667, 0.5833333), (0.14166667, 0.6), (0.13333334, 0.6), (0.13333334, 0.5833333), (0.13333334, 0.5833333), (0.13333334, 0.6), (0.125, 0.6), (0.125, 0.5833333), (0.125, 0.5833333), (0.125, 0.6), (0.11666667, 0.6), (0.11666667, 0.5833333), (0.11666667, 0.5833333), (0.11666667, 0.6), (0.108333334, 0.6), (0.108333334, 0.5833333), (0.108333334, 0.5833333), (0.108333334, 0.6), (0.1, 0.6), (0.1, 0.5833333), (0.1, 0.5833333), (0.1, 0.6), (0.09166667, 0.6), (0.09166667, 0.5833333), (0.09166667, 0.5833333), (0.09166667, 0.6), (0.083333336, 0.6), (0.083333336, 0.5833333), (0.083333336, 0.5833333), (0.083333336, 0.6), (0.075, 0.6), (0.075, 0.5833333), (0.075, 0.5833333), (0.075, 0.6), (0.06666667, 0.6), (0.06666667, 0.5833333), (0.06666667, 0.5833333), (0.06666667, 0.6), (0.058333334, 0.6), (0.058333334, 0.5833333), (0.058333334, 0.5833333), (0.058333334, 0.6), (0.05, 0.6), (0.05, 0.5833333), (0.05, 0.5833333), (0.05, 0.6), (0.041666668, 0.6), (0.041666668, 0.5833333), (0.041666668, 0.5833333), (0.041666668, 0.6), (0.033333335, 0.6), (0.033333335, 0.5833333), (0.033333335, 0.5833333), (0.033333335, 0.6), (0.025, 0.6), (0.025, 0.5833333), (0.025, 0.5833333), (0.025, 0.6), (0.016666668, 0.6), (0.016666668, 0.5833333), (0.016666668, 0.5833333), (0.016666668, 0.6), (0.008333334, 0.6), (0.008333334, 0.5833333), (0.008333334, 0.5833333), (0.008333334, 0.6), (0, 0.6), (0, 0.5833333), (1, 0.6), (1, 0.6166667), (0.9916667, 0.6166667), (0.9916667, 0.6), (0.9916667, 0.6), (0.9916667, 0.6166667), (0.98333335, 0.6166667), (0.98333335, 0.6), (0.98333335, 0.6), (0.98333335, 0.6166667), (0.975, 0.6166667), (0.975, 0.6), (0.975, 0.6), (0.975, 0.6166667), (0.96666664, 0.6166667), (0.96666664, 0.6), (0.96666664, 0.6), (0.96666664, 0.6166667), (0.9583333, 0.6166667), (0.9583333, 0.6), (0.9583333, 0.6), (0.9583333, 0.6166667), (0.95, 0.6166667), (0.95, 0.6), (0.95, 0.6), (0.95, 0.6166667), (0.94166666, 0.6166667), (0.94166666, 0.6), (0.94166666, 0.6), (0.94166666, 0.6166667), (0.93333334, 0.6166667), (0.93333334, 0.6), (0.93333334, 0.6), (0.93333334, 0.6166667), (0.925, 0.6166667), (0.925, 0.6), (0.925, 0.6), (0.925, 0.6166667), (0.9166667, 0.6166667), (0.9166667, 0.6), (0.9166667, 0.6), (0.9166667, 0.6166667), (0.90833336, 0.6166667), (0.90833336, 0.6), (0.90833336, 0.6), (0.90833336, 0.6166667), (0.9, 0.6166667), (0.9, 0.6), (0.9, 0.6), (0.9, 0.6166667), (0.89166665, 0.6166667), (0.89166665, 0.6), (0.89166665, 0.6), (0.89166665, 0.6166667), (0.8833333, 0.6166667), (0.8833333, 0.6), (0.8833333, 0.6), (0.8833333, 0.6166667), (0.875, 0.6166667), (0.875, 0.6), (0.875, 0.6), (0.875, 0.6166667), (0.8666667, 0.6166667), (0.8666667, 0.6), (0.8666667, 0.6), (0.8666667, 0.6166667), (0.85833335, 0.6166667), (0.85833335, 0.6), (0.85833335, 0.6), (0.85833335, 0.6166667), (0.85, 0.6166667), (0.85, 0.6), (0.85, 0.6), (0.85, 0.6166667), (0.84166664, 0.6166667), (0.84166664, 0.6), (0.84166664, 0.6), (0.84166664, 0.6166667), (0.8333333, 0.6166667), (0.8333333, 0.6), (0.8333333, 0.6), (0.8333333, 0.6166667), (0.825, 0.6166667), (0.825, 0.6), (0.825, 0.6), (0.825, 0.6166667), (0.81666666, 0.6166667), (0.81666666, 0.6), (0.81666666, 0.6), (0.81666666, 0.6166667), (0.80833334, 0.6166667), (0.80833334, 0.6), (0.80833334, 0.6), (0.80833334, 0.6166667), (0.8, 0.6166667), (0.8, 0.6), (0.8, 0.6), (0.8, 0.6166667), (0.7916667, 0.6166667), (0.7916667, 0.6), (0.7916667, 0.6), (0.7916667, 0.6166667), (0.78333336, 0.6166667), (0.78333336, 0.6), (0.78333336, 0.6), (0.78333336, 0.6166667), (0.775, 0.6166667), (0.775, 0.6), (0.775, 0.6), (0.775, 0.6166667), (0.76666665, 0.6166667), (0.76666665, 0.6), (0.76666665, 0.6), (0.76666665, 0.6166667), (0.7583333, 0.6166667), (0.7583333, 0.6), (0.7583333, 0.6), (0.7583333, 0.6166667), (0.75, 0.6166667), (0.75, 0.6), (0.75, 0.6), (0.75, 0.6166667), (0.7416667, 0.6166667), (0.7416667, 0.6), (0.7416667, 0.6), (0.7416667, 0.6166667), (0.73333335, 0.6166667), (0.73333335, 0.6), (0.73333335, 0.6), (0.73333335, 0.6166667), (0.725, 0.6166667), (0.725, 0.6), (0.725, 0.6), (0.725, 0.6166667), (0.71666664, 0.6166667), (0.71666664, 0.6), (0.71666664, 0.6), (0.71666664, 0.6166667), (0.7083333, 0.6166667), (0.7083333, 0.6), (0.7083333, 0.6), (0.7083333, 0.6166667), (0.7, 0.6166667), (0.7, 0.6), (0.7, 0.6), (0.7, 0.6166667), (0.69166666, 0.6166667), (0.69166666, 0.6), (0.69166666, 0.6), (0.69166666, 0.6166667), (0.68333334, 0.6166667), (0.68333334, 0.6), (0.68333334, 0.6), (0.68333334, 0.6166667), (0.675, 0.6166667), (0.675, 0.6), (0.675, 0.6), (0.675, 0.6166667), (0.6666667, 0.6166667), (0.6666667, 0.6), (0.6666667, 0.6), (0.6666667, 0.6166667), (0.65833336, 0.6166667), (0.65833336, 0.6), (0.65833336, 0.6), (0.65833336, 0.6166667), (0.65, 0.6166667), (0.65, 0.6), (0.65, 0.6), (0.65, 0.6166667), (0.64166665, 0.6166667), (0.64166665, 0.6), (0.64166665, 0.6), (0.64166665, 0.6166667), (0.6333333, 0.6166667), (0.6333333, 0.6), (0.6333333, 0.6), (0.6333333, 0.6166667), (0.625, 0.6166667), (0.625, 0.6), (0.625, 0.6), (0.625, 0.6166667), (0.6166667, 0.6166667), (0.6166667, 0.6), (0.6166667, 0.6), (0.6166667, 0.6166667), (0.60833335, 0.6166667), (0.60833335, 0.6), (0.60833335, 0.6), (0.60833335, 0.6166667), (0.6, 0.6166667), (0.6, 0.6), (0.6, 0.6), (0.6, 0.6166667), (0.59166664, 0.6166667), (0.59166664, 0.6), (0.59166664, 0.6), (0.59166664, 0.6166667), (0.5833333, 0.6166667), (0.5833333, 0.6), (0.5833333, 0.6), (0.5833333, 0.6166667), (0.575, 0.6166667), (0.575, 0.6), (0.575, 0.6), (0.575, 0.6166667), (0.56666666, 0.6166667), (0.56666666, 0.6), (0.56666666, 0.6), (0.56666666, 0.6166667), (0.55833334, 0.6166667), (0.55833334, 0.6), (0.55833334, 0.6), (0.55833334, 0.6166667), (0.55, 0.6166667), (0.55, 0.6), (0.55, 0.6), (0.55, 0.6166667), (0.5416667, 0.6166667), (0.5416667, 0.6), (0.5416667, 0.6), (0.5416667, 0.6166667), (0.53333336, 0.6166667), (0.53333336, 0.6), (0.53333336, 0.6), (0.53333336, 0.6166667), (0.525, 0.6166667), (0.525, 0.6), (0.525, 0.6), (0.525, 0.6166667), (0.51666665, 0.6166667), (0.51666665, 0.6), (0.51666665, 0.6), (0.51666665, 0.6166667), (0.5083333, 0.6166667), (0.5083333, 0.6), (0.5083333, 0.6), (0.5083333, 0.6166667), (0.5, 0.6166667), (0.5, 0.6), (0.5, 0.6), (0.5, 0.6166667), (0.49166667, 0.6166667), (0.49166667, 0.6), (0.49166667, 0.6), (0.49166667, 0.6166667), (0.48333332, 0.6166667), (0.48333332, 0.6), (0.48333332, 0.6), (0.48333332, 0.6166667), (0.475, 0.6166667), (0.475, 0.6), (0.475, 0.6), (0.475, 0.6166667), (0.46666667, 0.6166667), (0.46666667, 0.6), (0.46666667, 0.6), (0.46666667, 0.6166667), (0.45833334, 0.6166667), (0.45833334, 0.6), (0.45833334, 0.6), (0.45833334, 0.6166667), (0.45, 0.6166667), (0.45, 0.6), (0.45, 0.6), (0.45, 0.6166667), (0.44166666, 0.6166667), (0.44166666, 0.6), (0.44166666, 0.6), (0.44166666, 0.6166667), (0.43333334, 0.6166667), (0.43333334, 0.6), (0.43333334, 0.6), (0.43333334, 0.6166667), (0.425, 0.6166667), (0.425, 0.6), (0.425, 0.6), (0.425, 0.6166667), (0.41666666, 0.6166667), (0.41666666, 0.6), (0.41666666, 0.6), (0.41666666, 0.6166667), (0.40833333, 0.6166667), (0.40833333, 0.6), (0.40833333, 0.6), (0.40833333, 0.6166667), (0.4, 0.6166667), (0.4, 0.6), (0.4, 0.6), (0.4, 0.6166667), (0.39166668, 0.6166667), (0.39166668, 0.6), (0.39166668, 0.6), (0.39166668, 0.6166667), (0.38333333, 0.6166667), (0.38333333, 0.6), (0.38333333, 0.6), (0.38333333, 0.6166667), (0.375, 0.6166667), (0.375, 0.6), (0.375, 0.6), (0.375, 0.6166667), (0.36666667, 0.6166667), (0.36666667, 0.6), (0.36666667, 0.6), (0.36666667, 0.6166667), (0.35833332, 0.6166667), (0.35833332, 0.6), (0.35833332, 0.6), (0.35833332, 0.6166667), (0.35, 0.6166667), (0.35, 0.6), (0.35, 0.6), (0.35, 0.6166667), (0.34166667, 0.6166667), (0.34166667, 0.6), (0.34166667, 0.6), (0.34166667, 0.6166667), (0.33333334, 0.6166667), (0.33333334, 0.6), (0.33333334, 0.6), (0.33333334, 0.6166667), (0.325, 0.6166667), (0.325, 0.6), (0.325, 0.6), (0.325, 0.6166667), (0.31666666, 0.6166667), (0.31666666, 0.6), (0.31666666, 0.6), (0.31666666, 0.6166667), (0.30833334, 0.6166667), (0.30833334, 0.6), (0.30833334, 0.6), (0.30833334, 0.6166667), (0.3, 0.6166667), (0.3, 0.6), (0.3, 0.6), (0.3, 0.6166667), (0.29166666, 0.6166667), (0.29166666, 0.6), (0.29166666, 0.6), (0.29166666, 0.6166667), (0.28333333, 0.6166667), (0.28333333, 0.6), (0.28333333, 0.6), (0.28333333, 0.6166667), (0.275, 0.6166667), (0.275, 0.6), (0.275, 0.6), (0.275, 0.6166667), (0.26666668, 0.6166667), (0.26666668, 0.6), (0.26666668, 0.6), (0.26666668, 0.6166667), (0.25833333, 0.6166667), (0.25833333, 0.6), (0.25833333, 0.6), (0.25833333, 0.6166667), (0.25, 0.6166667), (0.25, 0.6), (0.25, 0.6), (0.25, 0.6166667), (0.24166666, 0.6166667), (0.24166666, 0.6), (0.24166666, 0.6), (0.24166666, 0.6166667), (0.23333333, 0.6166667), (0.23333333, 0.6), (0.23333333, 0.6), (0.23333333, 0.6166667), (0.225, 0.6166667), (0.225, 0.6), (0.225, 0.6), (0.225, 0.6166667), (0.21666667, 0.6166667), (0.21666667, 0.6), (0.21666667, 0.6), (0.21666667, 0.6166667), (0.20833333, 0.6166667), (0.20833333, 0.6), (0.20833333, 0.6), (0.20833333, 0.6166667), (0.2, 0.6166667), (0.2, 0.6), (0.2, 0.6), (0.2, 0.6166667), (0.19166666, 0.6166667), (0.19166666, 0.6), (0.19166666, 0.6), (0.19166666, 0.6166667), (0.18333334, 0.6166667), (0.18333334, 0.6), (0.18333334, 0.6), (0.18333334, 0.6166667), (0.175, 0.6166667), (0.175, 0.6), (0.175, 0.6), (0.175, 0.6166667), (0.16666667, 0.6166667), (0.16666667, 0.6), (0.16666667, 0.6), (0.16666667, 0.6166667), (0.15833333, 0.6166667), (0.15833333, 0.6), (0.15833333, 0.6), (0.15833333, 0.6166667), (0.15, 0.6166667), (0.15, 0.6), (0.15, 0.6), (0.15, 0.6166667), (0.14166667, 0.6166667), (0.14166667, 0.6), (0.14166667, 0.6), (0.14166667, 0.6166667), (0.13333334, 0.6166667), (0.13333334, 0.6), (0.13333334, 0.6), (0.13333334, 0.6166667), (0.125, 0.6166667), (0.125, 0.6), (0.125, 0.6), (0.125, 0.6166667), (0.11666667, 0.6166667), (0.11666667, 0.6), (0.11666667, 0.6), (0.11666667, 0.6166667), (0.108333334, 0.6166667), (0.108333334, 0.6), (0.108333334, 0.6), (0.108333334, 0.6166667), (0.1, 0.6166667), (0.1, 0.6), (0.1, 0.6), (0.1, 0.6166667), (0.09166667, 0.6166667), (0.09166667, 0.6), (0.09166667, 0.6), (0.09166667, 0.6166667), (0.083333336, 0.6166667), (0.083333336, 0.6), (0.083333336, 0.6), (0.083333336, 0.6166667), (0.075, 0.6166667), (0.075, 0.6), (0.075, 0.6), (0.075, 0.6166667), (0.06666667, 0.6166667), (0.06666667, 0.6), (0.06666667, 0.6), (0.06666667, 0.6166667), (0.058333334, 0.6166667), (0.058333334, 0.6), (0.058333334, 0.6), (0.058333334, 0.6166667), (0.05, 0.6166667), (0.05, 0.6), (0.05, 0.6), (0.05, 0.6166667), (0.041666668, 0.6166667), (0.041666668, 0.6), (0.041666668, 0.6), (0.041666668, 0.6166667), (0.033333335, 0.6166667), (0.033333335, 0.6), (0.033333335, 0.6), (0.033333335, 0.6166667), (0.025, 0.6166667), (0.025, 0.6), (0.025, 0.6), (0.025, 0.6166667), (0.016666668, 0.6166667), (0.016666668, 0.6), (0.016666668, 0.6), (0.016666668, 0.6166667), (0.008333334, 0.6166667), (0.008333334, 0.6), (0.008333334, 0.6), (0.008333334, 0.6166667), (0, 0.6166667), (0, 0.6), (1, 0.6166667), (1, 0.6333333), (0.9916667, 0.6333333), (0.9916667, 0.6166667), (0.9916667, 0.6166667), (0.9916667, 0.6333333), (0.98333335, 0.6333333), (0.98333335, 0.6166667), (0.98333335, 0.6166667), (0.98333335, 0.6333333), (0.975, 0.6333333), (0.975, 0.6166667), (0.975, 0.6166667), (0.975, 0.6333333), (0.96666664, 0.6333333), (0.96666664, 0.6166667), (0.96666664, 0.6166667), (0.96666664, 0.6333333), (0.9583333, 0.6333333), (0.9583333, 0.6166667), (0.9583333, 0.6166667), (0.9583333, 0.6333333), (0.95, 0.6333333), (0.95, 0.6166667), (0.95, 0.6166667), (0.95, 0.6333333), (0.94166666, 0.6333333), (0.94166666, 0.6166667), (0.94166666, 0.6166667), (0.94166666, 0.6333333), (0.93333334, 0.6333333), (0.93333334, 0.6166667), (0.93333334, 0.6166667), (0.93333334, 0.6333333), (0.925, 0.6333333), (0.925, 0.6166667), (0.925, 0.6166667), (0.925, 0.6333333), (0.9166667, 0.6333333), (0.9166667, 0.6166667), (0.9166667, 0.6166667), (0.9166667, 0.6333333), (0.90833336, 0.6333333), (0.90833336, 0.6166667), (0.90833336, 0.6166667), (0.90833336, 0.6333333), (0.9, 0.6333333), (0.9, 0.6166667), (0.9, 0.6166667), (0.9, 0.6333333), (0.89166665, 0.6333333), (0.89166665, 0.6166667), (0.89166665, 0.6166667), (0.89166665, 0.6333333), (0.8833333, 0.6333333), (0.8833333, 0.6166667), (0.8833333, 0.6166667), (0.8833333, 0.6333333), (0.875, 0.6333333), (0.875, 0.6166667), (0.875, 0.6166667), (0.875, 0.6333333), (0.8666667, 0.6333333), (0.8666667, 0.6166667), (0.8666667, 0.6166667), (0.8666667, 0.6333333), (0.85833335, 0.6333333), (0.85833335, 0.6166667), (0.85833335, 0.6166667), (0.85833335, 0.6333333), (0.85, 0.6333333), (0.85, 0.6166667), (0.85, 0.6166667), (0.85, 0.6333333), (0.84166664, 0.6333333), (0.84166664, 0.6166667), (0.84166664, 0.6166667), (0.84166664, 0.6333333), (0.8333333, 0.6333333), (0.8333333, 0.6166667), (0.8333333, 0.6166667), (0.8333333, 0.6333333), (0.825, 0.6333333), (0.825, 0.6166667), (0.825, 0.6166667), (0.825, 0.6333333), (0.81666666, 0.6333333), (0.81666666, 0.6166667), (0.81666666, 0.6166667), (0.81666666, 0.6333333), (0.80833334, 0.6333333), (0.80833334, 0.6166667), (0.80833334, 0.6166667), (0.80833334, 0.6333333), (0.8, 0.6333333), (0.8, 0.6166667), (0.8, 0.6166667), (0.8, 0.6333333), (0.7916667, 0.6333333), (0.7916667, 0.6166667), (0.7916667, 0.6166667), (0.7916667, 0.6333333), (0.78333336, 0.6333333), (0.78333336, 0.6166667), (0.78333336, 0.6166667), (0.78333336, 0.6333333), (0.775, 0.6333333), (0.775, 0.6166667), (0.775, 0.6166667), (0.775, 0.6333333), (0.76666665, 0.6333333), (0.76666665, 0.6166667), (0.76666665, 0.6166667), (0.76666665, 0.6333333), (0.7583333, 0.6333333), (0.7583333, 0.6166667), (0.7583333, 0.6166667), (0.7583333, 0.6333333), (0.75, 0.6333333), (0.75, 0.6166667), (0.75, 0.6166667), (0.75, 0.6333333), (0.7416667, 0.6333333), (0.7416667, 0.6166667), (0.7416667, 0.6166667), (0.7416667, 0.6333333), (0.73333335, 0.6333333), (0.73333335, 0.6166667), (0.73333335, 0.6166667), (0.73333335, 0.6333333), (0.725, 0.6333333), (0.725, 0.6166667), (0.725, 0.6166667), (0.725, 0.6333333), (0.71666664, 0.6333333), (0.71666664, 0.6166667), (0.71666664, 0.6166667), (0.71666664, 0.6333333), (0.7083333, 0.6333333), (0.7083333, 0.6166667), (0.7083333, 0.6166667), (0.7083333, 0.6333333), (0.7, 0.6333333), (0.7, 0.6166667), (0.7, 0.6166667), (0.7, 0.6333333), (0.69166666, 0.6333333), (0.69166666, 0.6166667), (0.69166666, 0.6166667), (0.69166666, 0.6333333), (0.68333334, 0.6333333), (0.68333334, 0.6166667), (0.68333334, 0.6166667), (0.68333334, 0.6333333), (0.675, 0.6333333), (0.675, 0.6166667), (0.675, 0.6166667), (0.675, 0.6333333), (0.6666667, 0.6333333), (0.6666667, 0.6166667), (0.6666667, 0.6166667), (0.6666667, 0.6333333), (0.65833336, 0.6333333), (0.65833336, 0.6166667), (0.65833336, 0.6166667), (0.65833336, 0.6333333), (0.65, 0.6333333), (0.65, 0.6166667), (0.65, 0.6166667), (0.65, 0.6333333), (0.64166665, 0.6333333), (0.64166665, 0.6166667), (0.64166665, 0.6166667), (0.64166665, 0.6333333), (0.6333333, 0.6333333), (0.6333333, 0.6166667), (0.6333333, 0.6166667), (0.6333333, 0.6333333), (0.625, 0.6333333), (0.625, 0.6166667), (0.625, 0.6166667), (0.625, 0.6333333), (0.6166667, 0.6333333), (0.6166667, 0.6166667), (0.6166667, 0.6166667), (0.6166667, 0.6333333), (0.60833335, 0.6333333), (0.60833335, 0.6166667), (0.60833335, 0.6166667), (0.60833335, 0.6333333), (0.6, 0.6333333), (0.6, 0.6166667), (0.6, 0.6166667), (0.6, 0.6333333), (0.59166664, 0.6333333), (0.59166664, 0.6166667), (0.59166664, 0.6166667), (0.59166664, 0.6333333), (0.5833333, 0.6333333), (0.5833333, 0.6166667), (0.5833333, 0.6166667), (0.5833333, 0.6333333), (0.575, 0.6333333), (0.575, 0.6166667), (0.575, 0.6166667), (0.575, 0.6333333), (0.56666666, 0.6333333), (0.56666666, 0.6166667), (0.56666666, 0.6166667), (0.56666666, 0.6333333), (0.55833334, 0.6333333), (0.55833334, 0.6166667), (0.55833334, 0.6166667), (0.55833334, 0.6333333), (0.55, 0.6333333), (0.55, 0.6166667), (0.55, 0.6166667), (0.55, 0.6333333), (0.5416667, 0.6333333), (0.5416667, 0.6166667), (0.5416667, 0.6166667), (0.5416667, 0.6333333), (0.53333336, 0.6333333), (0.53333336, 0.6166667), (0.53333336, 0.6166667), (0.53333336, 0.6333333), (0.525, 0.6333333), (0.525, 0.6166667), (0.525, 0.6166667), (0.525, 0.6333333), (0.51666665, 0.6333333), (0.51666665, 0.6166667), (0.51666665, 0.6166667), (0.51666665, 0.6333333), (0.5083333, 0.6333333), (0.5083333, 0.6166667), (0.5083333, 0.6166667), (0.5083333, 0.6333333), (0.5, 0.6333333), (0.5, 0.6166667), (0.5, 0.6166667), (0.5, 0.6333333), (0.49166667, 0.6333333), (0.49166667, 0.6166667), (0.49166667, 0.6166667), (0.49166667, 0.6333333), (0.48333332, 0.6333333), (0.48333332, 0.6166667), (0.48333332, 0.6166667), (0.48333332, 0.6333333), (0.475, 0.6333333), (0.475, 0.6166667), (0.475, 0.6166667), (0.475, 0.6333333), (0.46666667, 0.6333333), (0.46666667, 0.6166667), (0.46666667, 0.6166667), (0.46666667, 0.6333333), (0.45833334, 0.6333333), (0.45833334, 0.6166667), (0.45833334, 0.6166667), (0.45833334, 0.6333333), (0.45, 0.6333333), (0.45, 0.6166667), (0.45, 0.6166667), (0.45, 0.6333333), (0.44166666, 0.6333333), (0.44166666, 0.6166667), (0.44166666, 0.6166667), (0.44166666, 0.6333333), (0.43333334, 0.6333333), (0.43333334, 0.6166667), (0.43333334, 0.6166667), (0.43333334, 0.6333333), (0.425, 0.6333333), (0.425, 0.6166667), (0.425, 0.6166667), (0.425, 0.6333333), (0.41666666, 0.6333333), (0.41666666, 0.6166667), (0.41666666, 0.6166667), (0.41666666, 0.6333333), (0.40833333, 0.6333333), (0.40833333, 0.6166667), (0.40833333, 0.6166667), (0.40833333, 0.6333333), (0.4, 0.6333333), (0.4, 0.6166667), (0.4, 0.6166667), (0.4, 0.6333333), (0.39166668, 0.6333333), (0.39166668, 0.6166667), (0.39166668, 0.6166667), (0.39166668, 0.6333333), (0.38333333, 0.6333333), (0.38333333, 0.6166667), (0.38333333, 0.6166667), (0.38333333, 0.6333333), (0.375, 0.6333333), (0.375, 0.6166667), (0.375, 0.6166667), (0.375, 0.6333333), (0.36666667, 0.6333333), (0.36666667, 0.6166667), (0.36666667, 0.6166667), (0.36666667, 0.6333333), (0.35833332, 0.6333333), (0.35833332, 0.6166667), (0.35833332, 0.6166667), (0.35833332, 0.6333333), (0.35, 0.6333333), (0.35, 0.6166667), (0.35, 0.6166667), (0.35, 0.6333333), (0.34166667, 0.6333333), (0.34166667, 0.6166667), (0.34166667, 0.6166667), (0.34166667, 0.6333333), (0.33333334, 0.6333333), (0.33333334, 0.6166667), (0.33333334, 0.6166667), (0.33333334, 0.6333333), (0.325, 0.6333333), (0.325, 0.6166667), (0.325, 0.6166667), (0.325, 0.6333333), (0.31666666, 0.6333333), (0.31666666, 0.6166667), (0.31666666, 0.6166667), (0.31666666, 0.6333333), (0.30833334, 0.6333333), (0.30833334, 0.6166667), (0.30833334, 0.6166667), (0.30833334, 0.6333333), (0.3, 0.6333333), (0.3, 0.6166667), (0.3, 0.6166667), (0.3, 0.6333333), (0.29166666, 0.6333333), (0.29166666, 0.6166667), (0.29166666, 0.6166667), (0.29166666, 0.6333333), (0.28333333, 0.6333333), (0.28333333, 0.6166667), (0.28333333, 0.6166667), (0.28333333, 0.6333333), (0.275, 0.6333333), (0.275, 0.6166667), (0.275, 0.6166667), (0.275, 0.6333333), (0.26666668, 0.6333333), (0.26666668, 0.6166667), (0.26666668, 0.6166667), (0.26666668, 0.6333333), (0.25833333, 0.6333333), (0.25833333, 0.6166667), (0.25833333, 0.6166667), (0.25833333, 0.6333333), (0.25, 0.6333333), (0.25, 0.6166667), (0.25, 0.6166667), (0.25, 0.6333333), (0.24166666, 0.6333333), (0.24166666, 0.6166667), (0.24166666, 0.6166667), (0.24166666, 0.6333333), (0.23333333, 0.6333333), (0.23333333, 0.6166667), (0.23333333, 0.6166667), (0.23333333, 0.6333333), (0.225, 0.6333333), (0.225, 0.6166667), (0.225, 0.6166667), (0.225, 0.6333333), (0.21666667, 0.6333333), (0.21666667, 0.6166667), (0.21666667, 0.6166667), (0.21666667, 0.6333333), (0.20833333, 0.6333333), (0.20833333, 0.6166667), (0.20833333, 0.6166667), (0.20833333, 0.6333333), (0.2, 0.6333333), (0.2, 0.6166667), (0.2, 0.6166667), (0.2, 0.6333333), (0.19166666, 0.6333333), (0.19166666, 0.6166667), (0.19166666, 0.6166667), (0.19166666, 0.6333333), (0.18333334, 0.6333333), (0.18333334, 0.6166667), (0.18333334, 0.6166667), (0.18333334, 0.6333333), (0.175, 0.6333333), (0.175, 0.6166667), (0.175, 0.6166667), (0.175, 0.6333333), (0.16666667, 0.6333333), (0.16666667, 0.6166667), (0.16666667, 0.6166667), (0.16666667, 0.6333333), (0.15833333, 0.6333333), (0.15833333, 0.6166667), (0.15833333, 0.6166667), (0.15833333, 0.6333333), (0.15, 0.6333333), (0.15, 0.6166667), (0.15, 0.6166667), (0.15, 0.6333333), (0.14166667, 0.6333333), (0.14166667, 0.6166667), (0.14166667, 0.6166667), (0.14166667, 0.6333333), (0.13333334, 0.6333333), (0.13333334, 0.6166667), (0.13333334, 0.6166667), (0.13333334, 0.6333333), (0.125, 0.6333333), (0.125, 0.6166667), (0.125, 0.6166667), (0.125, 0.6333333), (0.11666667, 0.6333333), (0.11666667, 0.6166667), (0.11666667, 0.6166667), (0.11666667, 0.6333333), (0.108333334, 0.6333333), (0.108333334, 0.6166667), (0.108333334, 0.6166667), (0.108333334, 0.6333333), (0.1, 0.6333333), (0.1, 0.6166667), (0.1, 0.6166667), (0.1, 0.6333333), (0.09166667, 0.6333333), (0.09166667, 0.6166667), (0.09166667, 0.6166667), (0.09166667, 0.6333333), (0.083333336, 0.6333333), (0.083333336, 0.6166667), (0.083333336, 0.6166667), (0.083333336, 0.6333333), (0.075, 0.6333333), (0.075, 0.6166667), (0.075, 0.6166667), (0.075, 0.6333333), (0.06666667, 0.6333333), (0.06666667, 0.6166667), (0.06666667, 0.6166667), (0.06666667, 0.6333333), (0.058333334, 0.6333333), (0.058333334, 0.6166667), (0.058333334, 0.6166667), (0.058333334, 0.6333333), (0.05, 0.6333333), (0.05, 0.6166667), (0.05, 0.6166667), (0.05, 0.6333333), (0.041666668, 0.6333333), (0.041666668, 0.6166667), (0.041666668, 0.6166667), (0.041666668, 0.6333333), (0.033333335, 0.6333333), (0.033333335, 0.6166667), (0.033333335, 0.6166667), (0.033333335, 0.6333333), (0.025, 0.6333333), (0.025, 0.6166667), (0.025, 0.6166667), (0.025, 0.6333333), (0.016666668, 0.6333333), (0.016666668, 0.6166667), (0.016666668, 0.6166667), (0.016666668, 0.6333333), (0.008333334, 0.6333333), (0.008333334, 0.6166667), (0.008333334, 0.6166667), (0.008333334, 0.6333333), (0, 0.6333333), (0, 0.6166667), (1, 0.6333333), (1, 0.65), (0.9916667, 0.65), (0.9916667, 0.6333333), (0.9916667, 0.6333333), (0.9916667, 0.65), (0.98333335, 0.65), (0.98333335, 0.6333333), (0.98333335, 0.6333333), (0.98333335, 0.65), (0.975, 0.65), (0.975, 0.6333333), (0.975, 0.6333333), (0.975, 0.65), (0.96666664, 0.65), (0.96666664, 0.6333333), (0.96666664, 0.6333333), (0.96666664, 0.65), (0.9583333, 0.65), (0.9583333, 0.6333333), (0.9583333, 0.6333333), (0.9583333, 0.65), (0.95, 0.65), (0.95, 0.6333333), (0.95, 0.6333333), (0.95, 0.65), (0.94166666, 0.65), (0.94166666, 0.6333333), (0.94166666, 0.6333333), (0.94166666, 0.65), (0.93333334, 0.65), (0.93333334, 0.6333333), (0.93333334, 0.6333333), (0.93333334, 0.65), (0.925, 0.65), (0.925, 0.6333333), (0.925, 0.6333333), (0.925, 0.65), (0.9166667, 0.65), (0.9166667, 0.6333333), (0.9166667, 0.6333333), (0.9166667, 0.65), (0.90833336, 0.65), (0.90833336, 0.6333333), (0.90833336, 0.6333333), (0.90833336, 0.65), (0.9, 0.65), (0.9, 0.6333333), (0.9, 0.6333333), (0.9, 0.65), (0.89166665, 0.65), (0.89166665, 0.6333333), (0.89166665, 0.6333333), (0.89166665, 0.65), (0.8833333, 0.65), (0.8833333, 0.6333333), (0.8833333, 0.6333333), (0.8833333, 0.65), (0.875, 0.65), (0.875, 0.6333333), (0.875, 0.6333333), (0.875, 0.65), (0.8666667, 0.65), (0.8666667, 0.6333333), (0.8666667, 0.6333333), (0.8666667, 0.65), (0.85833335, 0.65), (0.85833335, 0.6333333), (0.85833335, 0.6333333), (0.85833335, 0.65), (0.85, 0.65), (0.85, 0.6333333), (0.85, 0.6333333), (0.85, 0.65), (0.84166664, 0.65), (0.84166664, 0.6333333), (0.84166664, 0.6333333), (0.84166664, 0.65), (0.8333333, 0.65), (0.8333333, 0.6333333), (0.8333333, 0.6333333), (0.8333333, 0.65), (0.825, 0.65), (0.825, 0.6333333), (0.825, 0.6333333), (0.825, 0.65), (0.81666666, 0.65), (0.81666666, 0.6333333), (0.81666666, 0.6333333), (0.81666666, 0.65), (0.80833334, 0.65), (0.80833334, 0.6333333), (0.80833334, 0.6333333), (0.80833334, 0.65), (0.8, 0.65), (0.8, 0.6333333), (0.8, 0.6333333), (0.8, 0.65), (0.7916667, 0.65), (0.7916667, 0.6333333), (0.7916667, 0.6333333), (0.7916667, 0.65), (0.78333336, 0.65), (0.78333336, 0.6333333), (0.78333336, 0.6333333), (0.78333336, 0.65), (0.775, 0.65), (0.775, 0.6333333), (0.775, 0.6333333), (0.775, 0.65), (0.76666665, 0.65), (0.76666665, 0.6333333), (0.76666665, 0.6333333), (0.76666665, 0.65), (0.7583333, 0.65), (0.7583333, 0.6333333), (0.7583333, 0.6333333), (0.7583333, 0.65), (0.75, 0.65), (0.75, 0.6333333), (0.75, 0.6333333), (0.75, 0.65), (0.7416667, 0.65), (0.7416667, 0.6333333), (0.7416667, 0.6333333), (0.7416667, 0.65), (0.73333335, 0.65), (0.73333335, 0.6333333), (0.73333335, 0.6333333), (0.73333335, 0.65), (0.725, 0.65), (0.725, 0.6333333), (0.725, 0.6333333), (0.725, 0.65), (0.71666664, 0.65), (0.71666664, 0.6333333), (0.71666664, 0.6333333), (0.71666664, 0.65), (0.7083333, 0.65), (0.7083333, 0.6333333), (0.7083333, 0.6333333), (0.7083333, 0.65), (0.7, 0.65), (0.7, 0.6333333), (0.7, 0.6333333), (0.7, 0.65), (0.69166666, 0.65), (0.69166666, 0.6333333), (0.69166666, 0.6333333), (0.69166666, 0.65), (0.68333334, 0.65), (0.68333334, 0.6333333), (0.68333334, 0.6333333), (0.68333334, 0.65), (0.675, 0.65), (0.675, 0.6333333), (0.675, 0.6333333), (0.675, 0.65), (0.6666667, 0.65), (0.6666667, 0.6333333), (0.6666667, 0.6333333), (0.6666667, 0.65), (0.65833336, 0.65), (0.65833336, 0.6333333), (0.65833336, 0.6333333), (0.65833336, 0.65), (0.65, 0.65), (0.65, 0.6333333), (0.65, 0.6333333), (0.65, 0.65), (0.64166665, 0.65), (0.64166665, 0.6333333), (0.64166665, 0.6333333), (0.64166665, 0.65), (0.6333333, 0.65), (0.6333333, 0.6333333), (0.6333333, 0.6333333), (0.6333333, 0.65), (0.625, 0.65), (0.625, 0.6333333), (0.625, 0.6333333), (0.625, 0.65), (0.6166667, 0.65), (0.6166667, 0.6333333), (0.6166667, 0.6333333), (0.6166667, 0.65), (0.60833335, 0.65), (0.60833335, 0.6333333), (0.60833335, 0.6333333), (0.60833335, 0.65), (0.6, 0.65), (0.6, 0.6333333), (0.6, 0.6333333), (0.6, 0.65), (0.59166664, 0.65), (0.59166664, 0.6333333), (0.59166664, 0.6333333), (0.59166664, 0.65), (0.5833333, 0.65), (0.5833333, 0.6333333), (0.5833333, 0.6333333), (0.5833333, 0.65), (0.575, 0.65), (0.575, 0.6333333), (0.575, 0.6333333), (0.575, 0.65), (0.56666666, 0.65), (0.56666666, 0.6333333), (0.56666666, 0.6333333), (0.56666666, 0.65), (0.55833334, 0.65), (0.55833334, 0.6333333), (0.55833334, 0.6333333), (0.55833334, 0.65), (0.55, 0.65), (0.55, 0.6333333), (0.55, 0.6333333), (0.55, 0.65), (0.5416667, 0.65), (0.5416667, 0.6333333), (0.5416667, 0.6333333), (0.5416667, 0.65), (0.53333336, 0.65), (0.53333336, 0.6333333), (0.53333336, 0.6333333), (0.53333336, 0.65), (0.525, 0.65), (0.525, 0.6333333), (0.525, 0.6333333), (0.525, 0.65), (0.51666665, 0.65), (0.51666665, 0.6333333), (0.51666665, 0.6333333), (0.51666665, 0.65), (0.5083333, 0.65), (0.5083333, 0.6333333), (0.5083333, 0.6333333), (0.5083333, 0.65), (0.5, 0.65), (0.5, 0.6333333), (0.5, 0.6333333), (0.5, 0.65), (0.49166667, 0.65), (0.49166667, 0.6333333), (0.49166667, 0.6333333), (0.49166667, 0.65), (0.48333332, 0.65), (0.48333332, 0.6333333), (0.48333332, 0.6333333), (0.48333332, 0.65), (0.475, 0.65), (0.475, 0.6333333), (0.475, 0.6333333), (0.475, 0.65), (0.46666667, 0.65), (0.46666667, 0.6333333), (0.46666667, 0.6333333), (0.46666667, 0.65), (0.45833334, 0.65), (0.45833334, 0.6333333), (0.45833334, 0.6333333), (0.45833334, 0.65), (0.45, 0.65), (0.45, 0.6333333), (0.45, 0.6333333), (0.45, 0.65), (0.44166666, 0.65), (0.44166666, 0.6333333), (0.44166666, 0.6333333), (0.44166666, 0.65), (0.43333334, 0.65), (0.43333334, 0.6333333), (0.43333334, 0.6333333), (0.43333334, 0.65), (0.425, 0.65), (0.425, 0.6333333), (0.425, 0.6333333), (0.425, 0.65), (0.41666666, 0.65), (0.41666666, 0.6333333), (0.41666666, 0.6333333), (0.41666666, 0.65), (0.40833333, 0.65), (0.40833333, 0.6333333), (0.40833333, 0.6333333), (0.40833333, 0.65), (0.4, 0.65), (0.4, 0.6333333), (0.4, 0.6333333), (0.4, 0.65), (0.39166668, 0.65), (0.39166668, 0.6333333), (0.39166668, 0.6333333), (0.39166668, 0.65), (0.38333333, 0.65), (0.38333333, 0.6333333), (0.38333333, 0.6333333), (0.38333333, 0.65), (0.375, 0.65), (0.375, 0.6333333), (0.375, 0.6333333), (0.375, 0.65), (0.36666667, 0.65), (0.36666667, 0.6333333), (0.36666667, 0.6333333), (0.36666667, 0.65), (0.35833332, 0.65), (0.35833332, 0.6333333), (0.35833332, 0.6333333), (0.35833332, 0.65), (0.35, 0.65), (0.35, 0.6333333), (0.35, 0.6333333), (0.35, 0.65), (0.34166667, 0.65), (0.34166667, 0.6333333), (0.34166667, 0.6333333), (0.34166667, 0.65), (0.33333334, 0.65), (0.33333334, 0.6333333), (0.33333334, 0.6333333), (0.33333334, 0.65), (0.325, 0.65), (0.325, 0.6333333), (0.325, 0.6333333), (0.325, 0.65), (0.31666666, 0.65), (0.31666666, 0.6333333), (0.31666666, 0.6333333), (0.31666666, 0.65), (0.30833334, 0.65), (0.30833334, 0.6333333), (0.30833334, 0.6333333), (0.30833334, 0.65), (0.3, 0.65), (0.3, 0.6333333), (0.3, 0.6333333), (0.3, 0.65), (0.29166666, 0.65), (0.29166666, 0.6333333), (0.29166666, 0.6333333), (0.29166666, 0.65), (0.28333333, 0.65), (0.28333333, 0.6333333), (0.28333333, 0.6333333), (0.28333333, 0.65), (0.275, 0.65), (0.275, 0.6333333), (0.275, 0.6333333), (0.275, 0.65), (0.26666668, 0.65), (0.26666668, 0.6333333), (0.26666668, 0.6333333), (0.26666668, 0.65), (0.25833333, 0.65), (0.25833333, 0.6333333), (0.25833333, 0.6333333), (0.25833333, 0.65), (0.25, 0.65), (0.25, 0.6333333), (0.25, 0.6333333), (0.25, 0.65), (0.24166666, 0.65), (0.24166666, 0.6333333), (0.24166666, 0.6333333), (0.24166666, 0.65), (0.23333333, 0.65), (0.23333333, 0.6333333), (0.23333333, 0.6333333), (0.23333333, 0.65), (0.225, 0.65), (0.225, 0.6333333), (0.225, 0.6333333), (0.225, 0.65), (0.21666667, 0.65), (0.21666667, 0.6333333), (0.21666667, 0.6333333), (0.21666667, 0.65), (0.20833333, 0.65), (0.20833333, 0.6333333), (0.20833333, 0.6333333), (0.20833333, 0.65), (0.2, 0.65), (0.2, 0.6333333), (0.2, 0.6333333), (0.2, 0.65), (0.19166666, 0.65), (0.19166666, 0.6333333), (0.19166666, 0.6333333), (0.19166666, 0.65), (0.18333334, 0.65), (0.18333334, 0.6333333), (0.18333334, 0.6333333), (0.18333334, 0.65), (0.175, 0.65), (0.175, 0.6333333), (0.175, 0.6333333), (0.175, 0.65), (0.16666667, 0.65), (0.16666667, 0.6333333), (0.16666667, 0.6333333), (0.16666667, 0.65), (0.15833333, 0.65), (0.15833333, 0.6333333), (0.15833333, 0.6333333), (0.15833333, 0.65), (0.15, 0.65), (0.15, 0.6333333), (0.15, 0.6333333), (0.15, 0.65), (0.14166667, 0.65), (0.14166667, 0.6333333), (0.14166667, 0.6333333), (0.14166667, 0.65), (0.13333334, 0.65), (0.13333334, 0.6333333), (0.13333334, 0.6333333), (0.13333334, 0.65), (0.125, 0.65), (0.125, 0.6333333), (0.125, 0.6333333), (0.125, 0.65), (0.11666667, 0.65), (0.11666667, 0.6333333), (0.11666667, 0.6333333), (0.11666667, 0.65), (0.108333334, 0.65), (0.108333334, 0.6333333), (0.108333334, 0.6333333), (0.108333334, 0.65), (0.1, 0.65), (0.1, 0.6333333), (0.1, 0.6333333), (0.1, 0.65), (0.09166667, 0.65), (0.09166667, 0.6333333), (0.09166667, 0.6333333), (0.09166667, 0.65), (0.083333336, 0.65), (0.083333336, 0.6333333), (0.083333336, 0.6333333), (0.083333336, 0.65), (0.075, 0.65), (0.075, 0.6333333), (0.075, 0.6333333), (0.075, 0.65), (0.06666667, 0.65), (0.06666667, 0.6333333), (0.06666667, 0.6333333), (0.06666667, 0.65), (0.058333334, 0.65), (0.058333334, 0.6333333), (0.058333334, 0.6333333), (0.058333334, 0.65), (0.05, 0.65), (0.05, 0.6333333), (0.05, 0.6333333), (0.05, 0.65), (0.041666668, 0.65), (0.041666668, 0.6333333), (0.041666668, 0.6333333), (0.041666668, 0.65), (0.033333335, 0.65), (0.033333335, 0.6333333), (0.033333335, 0.6333333), (0.033333335, 0.65), (0.025, 0.65), (0.025, 0.6333333), (0.025, 0.6333333), (0.025, 0.65), (0.016666668, 0.65), (0.016666668, 0.6333333), (0.016666668, 0.6333333), (0.016666668, 0.65), (0.008333334, 0.65), (0.008333334, 0.6333333), (0.008333334, 0.6333333), (0.008333334, 0.65), (0, 0.65), (0, 0.6333333), (1, 0.65), (1, 0.6666667), (0.9916667, 0.6666667), (0.9916667, 0.65), (0.9916667, 0.65), (0.9916667, 0.6666667), (0.98333335, 0.6666667), (0.98333335, 0.65), (0.98333335, 0.65), (0.98333335, 0.6666667), (0.975, 0.6666667), (0.975, 0.65), (0.975, 0.65), (0.975, 0.6666667), (0.96666664, 0.6666667), (0.96666664, 0.65), (0.96666664, 0.65), (0.96666664, 0.6666667), (0.9583333, 0.6666667), (0.9583333, 0.65), (0.9583333, 0.65), (0.9583333, 0.6666667), (0.95, 0.6666667), (0.95, 0.65), (0.95, 0.65), (0.95, 0.6666667), (0.94166666, 0.6666667), (0.94166666, 0.65), (0.94166666, 0.65), (0.94166666, 0.6666667), (0.93333334, 0.6666667), (0.93333334, 0.65), (0.93333334, 0.65), (0.93333334, 0.6666667), (0.925, 0.6666667), (0.925, 0.65), (0.925, 0.65), (0.925, 0.6666667), (0.9166667, 0.6666667), (0.9166667, 0.65), (0.9166667, 0.65), (0.9166667, 0.6666667), (0.90833336, 0.6666667), (0.90833336, 0.65), (0.90833336, 0.65), (0.90833336, 0.6666667), (0.9, 0.6666667), (0.9, 0.65), (0.9, 0.65), (0.9, 0.6666667), (0.89166665, 0.6666667), (0.89166665, 0.65), (0.89166665, 0.65), (0.89166665, 0.6666667), (0.8833333, 0.6666667), (0.8833333, 0.65), (0.8833333, 0.65), (0.8833333, 0.6666667), (0.875, 0.6666667), (0.875, 0.65), (0.875, 0.65), (0.875, 0.6666667), (0.8666667, 0.6666667), (0.8666667, 0.65), (0.8666667, 0.65), (0.8666667, 0.6666667), (0.85833335, 0.6666667), (0.85833335, 0.65), (0.85833335, 0.65), (0.85833335, 0.6666667), (0.85, 0.6666667), (0.85, 0.65), (0.85, 0.65), (0.85, 0.6666667), (0.84166664, 0.6666667), (0.84166664, 0.65), (0.84166664, 0.65), (0.84166664, 0.6666667), (0.8333333, 0.6666667), (0.8333333, 0.65), (0.8333333, 0.65), (0.8333333, 0.6666667), (0.825, 0.6666667), (0.825, 0.65), (0.825, 0.65), (0.825, 0.6666667), (0.81666666, 0.6666667), (0.81666666, 0.65), (0.81666666, 0.65), (0.81666666, 0.6666667), (0.80833334, 0.6666667), (0.80833334, 0.65), (0.80833334, 0.65), (0.80833334, 0.6666667), (0.8, 0.6666667), (0.8, 0.65), (0.8, 0.65), (0.8, 0.6666667), (0.7916667, 0.6666667), (0.7916667, 0.65), (0.7916667, 0.65), (0.7916667, 0.6666667), (0.78333336, 0.6666667), (0.78333336, 0.65), (0.78333336, 0.65), (0.78333336, 0.6666667), (0.775, 0.6666667), (0.775, 0.65), (0.775, 0.65), (0.775, 0.6666667), (0.76666665, 0.6666667), (0.76666665, 0.65), (0.76666665, 0.65), (0.76666665, 0.6666667), (0.7583333, 0.6666667), (0.7583333, 0.65), (0.7583333, 0.65), (0.7583333, 0.6666667), (0.75, 0.6666667), (0.75, 0.65), (0.75, 0.65), (0.75, 0.6666667), (0.7416667, 0.6666667), (0.7416667, 0.65), (0.7416667, 0.65), (0.7416667, 0.6666667), (0.73333335, 0.6666667), (0.73333335, 0.65), (0.73333335, 0.65), (0.73333335, 0.6666667), (0.725, 0.6666667), (0.725, 0.65), (0.725, 0.65), (0.725, 0.6666667), (0.71666664, 0.6666667), (0.71666664, 0.65), (0.71666664, 0.65), (0.71666664, 0.6666667), (0.7083333, 0.6666667), (0.7083333, 0.65), (0.7083333, 0.65), (0.7083333, 0.6666667), (0.7, 0.6666667), (0.7, 0.65), (0.7, 0.65), (0.7, 0.6666667), (0.69166666, 0.6666667), (0.69166666, 0.65), (0.69166666, 0.65), (0.69166666, 0.6666667), (0.68333334, 0.6666667), (0.68333334, 0.65), (0.68333334, 0.65), (0.68333334, 0.6666667), (0.675, 0.6666667), (0.675, 0.65), (0.675, 0.65), (0.675, 0.6666667), (0.6666667, 0.6666667), (0.6666667, 0.65), (0.6666667, 0.65), (0.6666667, 0.6666667), (0.65833336, 0.6666667), (0.65833336, 0.65), (0.65833336, 0.65), (0.65833336, 0.6666667), (0.65, 0.6666667), (0.65, 0.65), (0.65, 0.65), (0.65, 0.6666667), (0.64166665, 0.6666667), (0.64166665, 0.65), (0.64166665, 0.65), (0.64166665, 0.6666667), (0.6333333, 0.6666667), (0.6333333, 0.65), (0.6333333, 0.65), (0.6333333, 0.6666667), (0.625, 0.6666667), (0.625, 0.65), (0.625, 0.65), (0.625, 0.6666667), (0.6166667, 0.6666667), (0.6166667, 0.65), (0.6166667, 0.65), (0.6166667, 0.6666667), (0.60833335, 0.6666667), (0.60833335, 0.65), (0.60833335, 0.65), (0.60833335, 0.6666667), (0.6, 0.6666667), (0.6, 0.65), (0.6, 0.65), (0.6, 0.6666667), (0.59166664, 0.6666667), (0.59166664, 0.65), (0.59166664, 0.65), (0.59166664, 0.6666667), (0.5833333, 0.6666667), (0.5833333, 0.65), (0.5833333, 0.65), (0.5833333, 0.6666667), (0.575, 0.6666667), (0.575, 0.65), (0.575, 0.65), (0.575, 0.6666667), (0.56666666, 0.6666667), (0.56666666, 0.65), (0.56666666, 0.65), (0.56666666, 0.6666667), (0.55833334, 0.6666667), (0.55833334, 0.65), (0.55833334, 0.65), (0.55833334, 0.6666667), (0.55, 0.6666667), (0.55, 0.65), (0.55, 0.65), (0.55, 0.6666667), (0.5416667, 0.6666667), (0.5416667, 0.65), (0.5416667, 0.65), (0.5416667, 0.6666667), (0.53333336, 0.6666667), (0.53333336, 0.65), (0.53333336, 0.65), (0.53333336, 0.6666667), (0.525, 0.6666667), (0.525, 0.65), (0.525, 0.65), (0.525, 0.6666667), (0.51666665, 0.6666667), (0.51666665, 0.65), (0.51666665, 0.65), (0.51666665, 0.6666667), (0.5083333, 0.6666667), (0.5083333, 0.65), (0.5083333, 0.65), (0.5083333, 0.6666667), (0.5, 0.6666667), (0.5, 0.65), (0.5, 0.65), (0.5, 0.6666667), (0.49166667, 0.6666667), (0.49166667, 0.65), (0.49166667, 0.65), (0.49166667, 0.6666667), (0.48333332, 0.6666667), (0.48333332, 0.65), (0.48333332, 0.65), (0.48333332, 0.6666667), (0.475, 0.6666667), (0.475, 0.65), (0.475, 0.65), (0.475, 0.6666667), (0.46666667, 0.6666667), (0.46666667, 0.65), (0.46666667, 0.65), (0.46666667, 0.6666667), (0.45833334, 0.6666667), (0.45833334, 0.65), (0.45833334, 0.65), (0.45833334, 0.6666667), (0.45, 0.6666667), (0.45, 0.65), (0.45, 0.65), (0.45, 0.6666667), (0.44166666, 0.6666667), (0.44166666, 0.65), (0.44166666, 0.65), (0.44166666, 0.6666667), (0.43333334, 0.6666667), (0.43333334, 0.65), (0.43333334, 0.65), (0.43333334, 0.6666667), (0.425, 0.6666667), (0.425, 0.65), (0.425, 0.65), (0.425, 0.6666667), (0.41666666, 0.6666667), (0.41666666, 0.65), (0.41666666, 0.65), (0.41666666, 0.6666667), (0.40833333, 0.6666667), (0.40833333, 0.65), (0.40833333, 0.65), (0.40833333, 0.6666667), (0.4, 0.6666667), (0.4, 0.65), (0.4, 0.65), (0.4, 0.6666667), (0.39166668, 0.6666667), (0.39166668, 0.65), (0.39166668, 0.65), (0.39166668, 0.6666667), (0.38333333, 0.6666667), (0.38333333, 0.65), (0.38333333, 0.65), (0.38333333, 0.6666667), (0.375, 0.6666667), (0.375, 0.65), (0.375, 0.65), (0.375, 0.6666667), (0.36666667, 0.6666667), (0.36666667, 0.65), (0.36666667, 0.65), (0.36666667, 0.6666667), (0.35833332, 0.6666667), (0.35833332, 0.65), (0.35833332, 0.65), (0.35833332, 0.6666667), (0.35, 0.6666667), (0.35, 0.65), (0.35, 0.65), (0.35, 0.6666667), (0.34166667, 0.6666667), (0.34166667, 0.65), (0.34166667, 0.65), (0.34166667, 0.6666667), (0.33333334, 0.6666667), (0.33333334, 0.65), (0.33333334, 0.65), (0.33333334, 0.6666667), (0.325, 0.6666667), (0.325, 0.65), (0.325, 0.65), (0.325, 0.6666667), (0.31666666, 0.6666667), (0.31666666, 0.65), (0.31666666, 0.65), (0.31666666, 0.6666667), (0.30833334, 0.6666667), (0.30833334, 0.65), (0.30833334, 0.65), (0.30833334, 0.6666667), (0.3, 0.6666667), (0.3, 0.65), (0.3, 0.65), (0.3, 0.6666667), (0.29166666, 0.6666667), (0.29166666, 0.65), (0.29166666, 0.65), (0.29166666, 0.6666667), (0.28333333, 0.6666667), (0.28333333, 0.65), (0.28333333, 0.65), (0.28333333, 0.6666667), (0.275, 0.6666667), (0.275, 0.65), (0.275, 0.65), (0.275, 0.6666667), (0.26666668, 0.6666667), (0.26666668, 0.65), (0.26666668, 0.65), (0.26666668, 0.6666667), (0.25833333, 0.6666667), (0.25833333, 0.65), (0.25833333, 0.65), (0.25833333, 0.6666667), (0.25, 0.6666667), (0.25, 0.65), (0.25, 0.65), (0.25, 0.6666667), (0.24166666, 0.6666667), (0.24166666, 0.65), (0.24166666, 0.65), (0.24166666, 0.6666667), (0.23333333, 0.6666667), (0.23333333, 0.65), (0.23333333, 0.65), (0.23333333, 0.6666667), (0.225, 0.6666667), (0.225, 0.65), (0.225, 0.65), (0.225, 0.6666667), (0.21666667, 0.6666667), (0.21666667, 0.65), (0.21666667, 0.65), (0.21666667, 0.6666667), (0.20833333, 0.6666667), (0.20833333, 0.65), (0.20833333, 0.65), (0.20833333, 0.6666667), (0.2, 0.6666667), (0.2, 0.65), (0.2, 0.65), (0.2, 0.6666667), (0.19166666, 0.6666667), (0.19166666, 0.65), (0.19166666, 0.65), (0.19166666, 0.6666667), (0.18333334, 0.6666667), (0.18333334, 0.65), (0.18333334, 0.65), (0.18333334, 0.6666667), (0.175, 0.6666667), (0.175, 0.65), (0.175, 0.65), (0.175, 0.6666667), (0.16666667, 0.6666667), (0.16666667, 0.65), (0.16666667, 0.65), (0.16666667, 0.6666667), (0.15833333, 0.6666667), (0.15833333, 0.65), (0.15833333, 0.65), (0.15833333, 0.6666667), (0.15, 0.6666667), (0.15, 0.65), (0.15, 0.65), (0.15, 0.6666667), (0.14166667, 0.6666667), (0.14166667, 0.65), (0.14166667, 0.65), (0.14166667, 0.6666667), (0.13333334, 0.6666667), (0.13333334, 0.65), (0.13333334, 0.65), (0.13333334, 0.6666667), (0.125, 0.6666667), (0.125, 0.65), (0.125, 0.65), (0.125, 0.6666667), (0.11666667, 0.6666667), (0.11666667, 0.65), (0.11666667, 0.65), (0.11666667, 0.6666667), (0.108333334, 0.6666667), (0.108333334, 0.65), (0.108333334, 0.65), (0.108333334, 0.6666667), (0.1, 0.6666667), (0.1, 0.65), (0.1, 0.65), (0.1, 0.6666667), (0.09166667, 0.6666667), (0.09166667, 0.65), (0.09166667, 0.65), (0.09166667, 0.6666667), (0.083333336, 0.6666667), (0.083333336, 0.65), (0.083333336, 0.65), (0.083333336, 0.6666667), (0.075, 0.6666667), (0.075, 0.65), (0.075, 0.65), (0.075, 0.6666667), (0.06666667, 0.6666667), (0.06666667, 0.65), (0.06666667, 0.65), (0.06666667, 0.6666667), (0.058333334, 0.6666667), (0.058333334, 0.65), (0.058333334, 0.65), (0.058333334, 0.6666667), (0.05, 0.6666667), (0.05, 0.65), (0.05, 0.65), (0.05, 0.6666667), (0.041666668, 0.6666667), (0.041666668, 0.65), (0.041666668, 0.65), (0.041666668, 0.6666667), (0.033333335, 0.6666667), (0.033333335, 0.65), (0.033333335, 0.65), (0.033333335, 0.6666667), (0.025, 0.6666667), (0.025, 0.65), (0.025, 0.65), (0.025, 0.6666667), (0.016666668, 0.6666667), (0.016666668, 0.65), (0.016666668, 0.65), (0.016666668, 0.6666667), (0.008333334, 0.6666667), (0.008333334, 0.65), (0.008333334, 0.65), (0.008333334, 0.6666667), (0, 0.6666667), (0, 0.65), (1, 0.6666667), (1, 0.68333334), (0.9916667, 0.68333334), (0.9916667, 0.6666667), (0.9916667, 0.6666667), (0.9916667, 0.68333334), (0.98333335, 0.68333334), (0.98333335, 0.6666667), (0.98333335, 0.6666667), (0.98333335, 0.68333334), (0.975, 0.68333334), (0.975, 0.6666667), (0.975, 0.6666667), (0.975, 0.68333334), (0.96666664, 0.68333334), (0.96666664, 0.6666667), (0.96666664, 0.6666667), (0.96666664, 0.68333334), (0.9583333, 0.68333334), (0.9583333, 0.6666667), (0.9583333, 0.6666667), (0.9583333, 0.68333334), (0.95, 0.68333334), (0.95, 0.6666667), (0.95, 0.6666667), (0.95, 0.68333334), (0.94166666, 0.68333334), (0.94166666, 0.6666667), (0.94166666, 0.6666667), (0.94166666, 0.68333334), (0.93333334, 0.68333334), (0.93333334, 0.6666667), (0.93333334, 0.6666667), (0.93333334, 0.68333334), (0.925, 0.68333334), (0.925, 0.6666667), (0.925, 0.6666667), (0.925, 0.68333334), (0.9166667, 0.68333334), (0.9166667, 0.6666667), (0.9166667, 0.6666667), (0.9166667, 0.68333334), (0.90833336, 0.68333334), (0.90833336, 0.6666667), (0.90833336, 0.6666667), (0.90833336, 0.68333334), (0.9, 0.68333334), (0.9, 0.6666667), (0.9, 0.6666667), (0.9, 0.68333334), (0.89166665, 0.68333334), (0.89166665, 0.6666667), (0.89166665, 0.6666667), (0.89166665, 0.68333334), (0.8833333, 0.68333334), (0.8833333, 0.6666667), (0.8833333, 0.6666667), (0.8833333, 0.68333334), (0.875, 0.68333334), (0.875, 0.6666667), (0.875, 0.6666667), (0.875, 0.68333334), (0.8666667, 0.68333334), (0.8666667, 0.6666667), (0.8666667, 0.6666667), (0.8666667, 0.68333334), (0.85833335, 0.68333334), (0.85833335, 0.6666667), (0.85833335, 0.6666667), (0.85833335, 0.68333334), (0.85, 0.68333334), (0.85, 0.6666667), (0.85, 0.6666667), (0.85, 0.68333334), (0.84166664, 0.68333334), (0.84166664, 0.6666667), (0.84166664, 0.6666667), (0.84166664, 0.68333334), (0.8333333, 0.68333334), (0.8333333, 0.6666667), (0.8333333, 0.6666667), (0.8333333, 0.68333334), (0.825, 0.68333334), (0.825, 0.6666667), (0.825, 0.6666667), (0.825, 0.68333334), (0.81666666, 0.68333334), (0.81666666, 0.6666667), (0.81666666, 0.6666667), (0.81666666, 0.68333334), (0.80833334, 0.68333334), (0.80833334, 0.6666667), (0.80833334, 0.6666667), (0.80833334, 0.68333334), (0.8, 0.68333334), (0.8, 0.6666667), (0.8, 0.6666667), (0.8, 0.68333334), (0.7916667, 0.68333334), (0.7916667, 0.6666667), (0.7916667, 0.6666667), (0.7916667, 0.68333334), (0.78333336, 0.68333334), (0.78333336, 0.6666667), (0.78333336, 0.6666667), (0.78333336, 0.68333334), (0.775, 0.68333334), (0.775, 0.6666667), (0.775, 0.6666667), (0.775, 0.68333334), (0.76666665, 0.68333334), (0.76666665, 0.6666667), (0.76666665, 0.6666667), (0.76666665, 0.68333334), (0.7583333, 0.68333334), (0.7583333, 0.6666667), (0.7583333, 0.6666667), (0.7583333, 0.68333334), (0.75, 0.68333334), (0.75, 0.6666667), (0.75, 0.6666667), (0.75, 0.68333334), (0.7416667, 0.68333334), (0.7416667, 0.6666667), (0.7416667, 0.6666667), (0.7416667, 0.68333334), (0.73333335, 0.68333334), (0.73333335, 0.6666667), (0.73333335, 0.6666667), (0.73333335, 0.68333334), (0.725, 0.68333334), (0.725, 0.6666667), (0.725, 0.6666667), (0.725, 0.68333334), (0.71666664, 0.68333334), (0.71666664, 0.6666667), (0.71666664, 0.6666667), (0.71666664, 0.68333334), (0.7083333, 0.68333334), (0.7083333, 0.6666667), (0.7083333, 0.6666667), (0.7083333, 0.68333334), (0.7, 0.68333334), (0.7, 0.6666667), (0.7, 0.6666667), (0.7, 0.68333334), (0.69166666, 0.68333334), (0.69166666, 0.6666667), (0.69166666, 0.6666667), (0.69166666, 0.68333334), (0.68333334, 0.68333334), (0.68333334, 0.6666667), (0.68333334, 0.6666667), (0.68333334, 0.68333334), (0.675, 0.68333334), (0.675, 0.6666667), (0.675, 0.6666667), (0.675, 0.68333334), (0.6666667, 0.68333334), (0.6666667, 0.6666667), (0.6666667, 0.6666667), (0.6666667, 0.68333334), (0.65833336, 0.68333334), (0.65833336, 0.6666667), (0.65833336, 0.6666667), (0.65833336, 0.68333334), (0.65, 0.68333334), (0.65, 0.6666667), (0.65, 0.6666667), (0.65, 0.68333334), (0.64166665, 0.68333334), (0.64166665, 0.6666667), (0.64166665, 0.6666667), (0.64166665, 0.68333334), (0.6333333, 0.68333334), (0.6333333, 0.6666667), (0.6333333, 0.6666667), (0.6333333, 0.68333334), (0.625, 0.68333334), (0.625, 0.6666667), (0.625, 0.6666667), (0.625, 0.68333334), (0.6166667, 0.68333334), (0.6166667, 0.6666667), (0.6166667, 0.6666667), (0.6166667, 0.68333334), (0.60833335, 0.68333334), (0.60833335, 0.6666667), (0.60833335, 0.6666667), (0.60833335, 0.68333334), (0.6, 0.68333334), (0.6, 0.6666667), (0.6, 0.6666667), (0.6, 0.68333334), (0.59166664, 0.68333334), (0.59166664, 0.6666667), (0.59166664, 0.6666667), (0.59166664, 0.68333334), (0.5833333, 0.68333334), (0.5833333, 0.6666667), (0.5833333, 0.6666667), (0.5833333, 0.68333334), (0.575, 0.68333334), (0.575, 0.6666667), (0.575, 0.6666667), (0.575, 0.68333334), (0.56666666, 0.68333334), (0.56666666, 0.6666667), (0.56666666, 0.6666667), (0.56666666, 0.68333334), (0.55833334, 0.68333334), (0.55833334, 0.6666667), (0.55833334, 0.6666667), (0.55833334, 0.68333334), (0.55, 0.68333334), (0.55, 0.6666667), (0.55, 0.6666667), (0.55, 0.68333334), (0.5416667, 0.68333334), (0.5416667, 0.6666667), (0.5416667, 0.6666667), (0.5416667, 0.68333334), (0.53333336, 0.68333334), (0.53333336, 0.6666667), (0.53333336, 0.6666667), (0.53333336, 0.68333334), (0.525, 0.68333334), (0.525, 0.6666667), (0.525, 0.6666667), (0.525, 0.68333334), (0.51666665, 0.68333334), (0.51666665, 0.6666667), (0.51666665, 0.6666667), (0.51666665, 0.68333334), (0.5083333, 0.68333334), (0.5083333, 0.6666667), (0.5083333, 0.6666667), (0.5083333, 0.68333334), (0.5, 0.68333334), (0.5, 0.6666667), (0.5, 0.6666667), (0.5, 0.68333334), (0.49166667, 0.68333334), (0.49166667, 0.6666667), (0.49166667, 0.6666667), (0.49166667, 0.68333334), (0.48333332, 0.68333334), (0.48333332, 0.6666667), (0.48333332, 0.6666667), (0.48333332, 0.68333334), (0.475, 0.68333334), (0.475, 0.6666667), (0.475, 0.6666667), (0.475, 0.68333334), (0.46666667, 0.68333334), (0.46666667, 0.6666667), (0.46666667, 0.6666667), (0.46666667, 0.68333334), (0.45833334, 0.68333334), (0.45833334, 0.6666667), (0.45833334, 0.6666667), (0.45833334, 0.68333334), (0.45, 0.68333334), (0.45, 0.6666667), (0.45, 0.6666667), (0.45, 0.68333334), (0.44166666, 0.68333334), (0.44166666, 0.6666667), (0.44166666, 0.6666667), (0.44166666, 0.68333334), (0.43333334, 0.68333334), (0.43333334, 0.6666667), (0.43333334, 0.6666667), (0.43333334, 0.68333334), (0.425, 0.68333334), (0.425, 0.6666667), (0.425, 0.6666667), (0.425, 0.68333334), (0.41666666, 0.68333334), (0.41666666, 0.6666667), (0.41666666, 0.6666667), (0.41666666, 0.68333334), (0.40833333, 0.68333334), (0.40833333, 0.6666667), (0.40833333, 0.6666667), (0.40833333, 0.68333334), (0.4, 0.68333334), (0.4, 0.6666667), (0.4, 0.6666667), (0.4, 0.68333334), (0.39166668, 0.68333334), (0.39166668, 0.6666667), (0.39166668, 0.6666667), (0.39166668, 0.68333334), (0.38333333, 0.68333334), (0.38333333, 0.6666667), (0.38333333, 0.6666667), (0.38333333, 0.68333334), (0.375, 0.68333334), (0.375, 0.6666667), (0.375, 0.6666667), (0.375, 0.68333334), (0.36666667, 0.68333334), (0.36666667, 0.6666667), (0.36666667, 0.6666667), (0.36666667, 0.68333334), (0.35833332, 0.68333334), (0.35833332, 0.6666667), (0.35833332, 0.6666667), (0.35833332, 0.68333334), (0.35, 0.68333334), (0.35, 0.6666667), (0.35, 0.6666667), (0.35, 0.68333334), (0.34166667, 0.68333334), (0.34166667, 0.6666667), (0.34166667, 0.6666667), (0.34166667, 0.68333334), (0.33333334, 0.68333334), (0.33333334, 0.6666667), (0.33333334, 0.6666667), (0.33333334, 0.68333334), (0.325, 0.68333334), (0.325, 0.6666667), (0.325, 0.6666667), (0.325, 0.68333334), (0.31666666, 0.68333334), (0.31666666, 0.6666667), (0.31666666, 0.6666667), (0.31666666, 0.68333334), (0.30833334, 0.68333334), (0.30833334, 0.6666667), (0.30833334, 0.6666667), (0.30833334, 0.68333334), (0.3, 0.68333334), (0.3, 0.6666667), (0.3, 0.6666667), (0.3, 0.68333334), (0.29166666, 0.68333334), (0.29166666, 0.6666667), (0.29166666, 0.6666667), (0.29166666, 0.68333334), (0.28333333, 0.68333334), (0.28333333, 0.6666667), (0.28333333, 0.6666667), (0.28333333, 0.68333334), (0.275, 0.68333334), (0.275, 0.6666667), (0.275, 0.6666667), (0.275, 0.68333334), (0.26666668, 0.68333334), (0.26666668, 0.6666667), (0.26666668, 0.6666667), (0.26666668, 0.68333334), (0.25833333, 0.68333334), (0.25833333, 0.6666667), (0.25833333, 0.6666667), (0.25833333, 0.68333334), (0.25, 0.68333334), (0.25, 0.6666667), (0.25, 0.6666667), (0.25, 0.68333334), (0.24166666, 0.68333334), (0.24166666, 0.6666667), (0.24166666, 0.6666667), (0.24166666, 0.68333334), (0.23333333, 0.68333334), (0.23333333, 0.6666667), (0.23333333, 0.6666667), (0.23333333, 0.68333334), (0.225, 0.68333334), (0.225, 0.6666667), (0.225, 0.6666667), (0.225, 0.68333334), (0.21666667, 0.68333334), (0.21666667, 0.6666667), (0.21666667, 0.6666667), (0.21666667, 0.68333334), (0.20833333, 0.68333334), (0.20833333, 0.6666667), (0.20833333, 0.6666667), (0.20833333, 0.68333334), (0.2, 0.68333334), (0.2, 0.6666667), (0.2, 0.6666667), (0.2, 0.68333334), (0.19166666, 0.68333334), (0.19166666, 0.6666667), (0.19166666, 0.6666667), (0.19166666, 0.68333334), (0.18333334, 0.68333334), (0.18333334, 0.6666667), (0.18333334, 0.6666667), (0.18333334, 0.68333334), (0.175, 0.68333334), (0.175, 0.6666667), (0.175, 0.6666667), (0.175, 0.68333334), (0.16666667, 0.68333334), (0.16666667, 0.6666667), (0.16666667, 0.6666667), (0.16666667, 0.68333334), (0.15833333, 0.68333334), (0.15833333, 0.6666667), (0.15833333, 0.6666667), (0.15833333, 0.68333334), (0.15, 0.68333334), (0.15, 0.6666667), (0.15, 0.6666667), (0.15, 0.68333334), (0.14166667, 0.68333334), (0.14166667, 0.6666667), (0.14166667, 0.6666667), (0.14166667, 0.68333334), (0.13333334, 0.68333334), (0.13333334, 0.6666667), (0.13333334, 0.6666667), (0.13333334, 0.68333334), (0.125, 0.68333334), (0.125, 0.6666667), (0.125, 0.6666667), (0.125, 0.68333334), (0.11666667, 0.68333334), (0.11666667, 0.6666667), (0.11666667, 0.6666667), (0.11666667, 0.68333334), (0.108333334, 0.68333334), (0.108333334, 0.6666667), (0.108333334, 0.6666667), (0.108333334, 0.68333334), (0.1, 0.68333334), (0.1, 0.6666667), (0.1, 0.6666667), (0.1, 0.68333334), (0.09166667, 0.68333334), (0.09166667, 0.6666667), (0.09166667, 0.6666667), (0.09166667, 0.68333334), (0.083333336, 0.68333334), (0.083333336, 0.6666667), (0.083333336, 0.6666667), (0.083333336, 0.68333334), (0.075, 0.68333334), (0.075, 0.6666667), (0.075, 0.6666667), (0.075, 0.68333334), (0.06666667, 0.68333334), (0.06666667, 0.6666667), (0.06666667, 0.6666667), (0.06666667, 0.68333334), (0.058333334, 0.68333334), (0.058333334, 0.6666667), (0.058333334, 0.6666667), (0.058333334, 0.68333334), (0.05, 0.68333334), (0.05, 0.6666667), (0.05, 0.6666667), (0.05, 0.68333334), (0.041666668, 0.68333334), (0.041666668, 0.6666667), (0.041666668, 0.6666667), (0.041666668, 0.68333334), (0.033333335, 0.68333334), (0.033333335, 0.6666667), (0.033333335, 0.6666667), (0.033333335, 0.68333334), (0.025, 0.68333334), (0.025, 0.6666667), (0.025, 0.6666667), (0.025, 0.68333334), (0.016666668, 0.68333334), (0.016666668, 0.6666667), (0.016666668, 0.6666667), (0.016666668, 0.68333334), (0.008333334, 0.68333334), (0.008333334, 0.6666667), (0.008333334, 0.6666667), (0.008333334, 0.68333334), (0, 0.68333334), (0, 0.6666667), (1, 0.68333334), (1, 0.7), (0.9916667, 0.7), (0.9916667, 0.68333334), (0.9916667, 0.68333334), (0.9916667, 0.7), (0.98333335, 0.7), (0.98333335, 0.68333334), (0.98333335, 0.68333334), (0.98333335, 0.7), (0.975, 0.7), (0.975, 0.68333334), (0.975, 0.68333334), (0.975, 0.7), (0.96666664, 0.7), (0.96666664, 0.68333334), (0.96666664, 0.68333334), (0.96666664, 0.7), (0.9583333, 0.7), (0.9583333, 0.68333334), (0.9583333, 0.68333334), (0.9583333, 0.7), (0.95, 0.7), (0.95, 0.68333334), (0.95, 0.68333334), (0.95, 0.7), (0.94166666, 0.7), (0.94166666, 0.68333334), (0.94166666, 0.68333334), (0.94166666, 0.7), (0.93333334, 0.7), (0.93333334, 0.68333334), (0.93333334, 0.68333334), (0.93333334, 0.7), (0.925, 0.7), (0.925, 0.68333334), (0.925, 0.68333334), (0.925, 0.7), (0.9166667, 0.7), (0.9166667, 0.68333334), (0.9166667, 0.68333334), (0.9166667, 0.7), (0.90833336, 0.7), (0.90833336, 0.68333334), (0.90833336, 0.68333334), (0.90833336, 0.7), (0.9, 0.7), (0.9, 0.68333334), (0.9, 0.68333334), (0.9, 0.7), (0.89166665, 0.7), (0.89166665, 0.68333334), (0.89166665, 0.68333334), (0.89166665, 0.7), (0.8833333, 0.7), (0.8833333, 0.68333334), (0.8833333, 0.68333334), (0.8833333, 0.7), (0.875, 0.7), (0.875, 0.68333334), (0.875, 0.68333334), (0.875, 0.7), (0.8666667, 0.7), (0.8666667, 0.68333334), (0.8666667, 0.68333334), (0.8666667, 0.7), (0.85833335, 0.7), (0.85833335, 0.68333334), (0.85833335, 0.68333334), (0.85833335, 0.7), (0.85, 0.7), (0.85, 0.68333334), (0.85, 0.68333334), (0.85, 0.7), (0.84166664, 0.7), (0.84166664, 0.68333334), (0.84166664, 0.68333334), (0.84166664, 0.7), (0.8333333, 0.7), (0.8333333, 0.68333334), (0.8333333, 0.68333334), (0.8333333, 0.7), (0.825, 0.7), (0.825, 0.68333334), (0.825, 0.68333334), (0.825, 0.7), (0.81666666, 0.7), (0.81666666, 0.68333334), (0.81666666, 0.68333334), (0.81666666, 0.7), (0.80833334, 0.7), (0.80833334, 0.68333334), (0.80833334, 0.68333334), (0.80833334, 0.7), (0.8, 0.7), (0.8, 0.68333334), (0.8, 0.68333334), (0.8, 0.7), (0.7916667, 0.7), (0.7916667, 0.68333334), (0.7916667, 0.68333334), (0.7916667, 0.7), (0.78333336, 0.7), (0.78333336, 0.68333334), (0.78333336, 0.68333334), (0.78333336, 0.7), (0.775, 0.7), (0.775, 0.68333334), (0.775, 0.68333334), (0.775, 0.7), (0.76666665, 0.7), (0.76666665, 0.68333334), (0.76666665, 0.68333334), (0.76666665, 0.7), (0.7583333, 0.7), (0.7583333, 0.68333334), (0.7583333, 0.68333334), (0.7583333, 0.7), (0.75, 0.7), (0.75, 0.68333334), (0.75, 0.68333334), (0.75, 0.7), (0.7416667, 0.7), (0.7416667, 0.68333334), (0.7416667, 0.68333334), (0.7416667, 0.7), (0.73333335, 0.7), (0.73333335, 0.68333334), (0.73333335, 0.68333334), (0.73333335, 0.7), (0.725, 0.7), (0.725, 0.68333334), (0.725, 0.68333334), (0.725, 0.7), (0.71666664, 0.7), (0.71666664, 0.68333334), (0.71666664, 0.68333334), (0.71666664, 0.7), (0.7083333, 0.7), (0.7083333, 0.68333334), (0.7083333, 0.68333334), (0.7083333, 0.7), (0.7, 0.7), (0.7, 0.68333334), (0.7, 0.68333334), (0.7, 0.7), (0.69166666, 0.7), (0.69166666, 0.68333334), (0.69166666, 0.68333334), (0.69166666, 0.7), (0.68333334, 0.7), (0.68333334, 0.68333334), (0.68333334, 0.68333334), (0.68333334, 0.7), (0.675, 0.7), (0.675, 0.68333334), (0.675, 0.68333334), (0.675, 0.7), (0.6666667, 0.7), (0.6666667, 0.68333334), (0.6666667, 0.68333334), (0.6666667, 0.7), (0.65833336, 0.7), (0.65833336, 0.68333334), (0.65833336, 0.68333334), (0.65833336, 0.7), (0.65, 0.7), (0.65, 0.68333334), (0.65, 0.68333334), (0.65, 0.7), (0.64166665, 0.7), (0.64166665, 0.68333334), (0.64166665, 0.68333334), (0.64166665, 0.7), (0.6333333, 0.7), (0.6333333, 0.68333334), (0.6333333, 0.68333334), (0.6333333, 0.7), (0.625, 0.7), (0.625, 0.68333334), (0.625, 0.68333334), (0.625, 0.7), (0.6166667, 0.7), (0.6166667, 0.68333334), (0.6166667, 0.68333334), (0.6166667, 0.7), (0.60833335, 0.7), (0.60833335, 0.68333334), (0.60833335, 0.68333334), (0.60833335, 0.7), (0.6, 0.7), (0.6, 0.68333334), (0.6, 0.68333334), (0.6, 0.7), (0.59166664, 0.7), (0.59166664, 0.68333334), (0.59166664, 0.68333334), (0.59166664, 0.7), (0.5833333, 0.7), (0.5833333, 0.68333334), (0.5833333, 0.68333334), (0.5833333, 0.7), (0.575, 0.7), (0.575, 0.68333334), (0.575, 0.68333334), (0.575, 0.7), (0.56666666, 0.7), (0.56666666, 0.68333334), (0.56666666, 0.68333334), (0.56666666, 0.7), (0.55833334, 0.7), (0.55833334, 0.68333334), (0.55833334, 0.68333334), (0.55833334, 0.7), (0.55, 0.7), (0.55, 0.68333334), (0.55, 0.68333334), (0.55, 0.7), (0.5416667, 0.7), (0.5416667, 0.68333334), (0.5416667, 0.68333334), (0.5416667, 0.7), (0.53333336, 0.7), (0.53333336, 0.68333334), (0.53333336, 0.68333334), (0.53333336, 0.7), (0.525, 0.7), (0.525, 0.68333334), (0.525, 0.68333334), (0.525, 0.7), (0.51666665, 0.7), (0.51666665, 0.68333334), (0.51666665, 0.68333334), (0.51666665, 0.7), (0.5083333, 0.7), (0.5083333, 0.68333334), (0.5083333, 0.68333334), (0.5083333, 0.7), (0.5, 0.7), (0.5, 0.68333334), (0.5, 0.68333334), (0.5, 0.7), (0.49166667, 0.7), (0.49166667, 0.68333334), (0.49166667, 0.68333334), (0.49166667, 0.7), (0.48333332, 0.7), (0.48333332, 0.68333334), (0.48333332, 0.68333334), (0.48333332, 0.7), (0.475, 0.7), (0.475, 0.68333334), (0.475, 0.68333334), (0.475, 0.7), (0.46666667, 0.7), (0.46666667, 0.68333334), (0.46666667, 0.68333334), (0.46666667, 0.7), (0.45833334, 0.7), (0.45833334, 0.68333334), (0.45833334, 0.68333334), (0.45833334, 0.7), (0.45, 0.7), (0.45, 0.68333334), (0.45, 0.68333334), (0.45, 0.7), (0.44166666, 0.7), (0.44166666, 0.68333334), (0.44166666, 0.68333334), (0.44166666, 0.7), (0.43333334, 0.7), (0.43333334, 0.68333334), (0.43333334, 0.68333334), (0.43333334, 0.7), (0.425, 0.7), (0.425, 0.68333334), (0.425, 0.68333334), (0.425, 0.7), (0.41666666, 0.7), (0.41666666, 0.68333334), (0.41666666, 0.68333334), (0.41666666, 0.7), (0.40833333, 0.7), (0.40833333, 0.68333334), (0.40833333, 0.68333334), (0.40833333, 0.7), (0.4, 0.7), (0.4, 0.68333334), (0.4, 0.68333334), (0.4, 0.7), (0.39166668, 0.7), (0.39166668, 0.68333334), (0.39166668, 0.68333334), (0.39166668, 0.7), (0.38333333, 0.7), (0.38333333, 0.68333334), (0.38333333, 0.68333334), (0.38333333, 0.7), (0.375, 0.7), (0.375, 0.68333334), (0.375, 0.68333334), (0.375, 0.7), (0.36666667, 0.7), (0.36666667, 0.68333334), (0.36666667, 0.68333334), (0.36666667, 0.7), (0.35833332, 0.7), (0.35833332, 0.68333334), (0.35833332, 0.68333334), (0.35833332, 0.7), (0.35, 0.7), (0.35, 0.68333334), (0.35, 0.68333334), (0.35, 0.7), (0.34166667, 0.7), (0.34166667, 0.68333334), (0.34166667, 0.68333334), (0.34166667, 0.7), (0.33333334, 0.7), (0.33333334, 0.68333334), (0.33333334, 0.68333334), (0.33333334, 0.7), (0.325, 0.7), (0.325, 0.68333334), (0.325, 0.68333334), (0.325, 0.7), (0.31666666, 0.7), (0.31666666, 0.68333334), (0.31666666, 0.68333334), (0.31666666, 0.7), (0.30833334, 0.7), (0.30833334, 0.68333334), (0.30833334, 0.68333334), (0.30833334, 0.7), (0.3, 0.7), (0.3, 0.68333334), (0.3, 0.68333334), (0.3, 0.7), (0.29166666, 0.7), (0.29166666, 0.68333334), (0.29166666, 0.68333334), (0.29166666, 0.7), (0.28333333, 0.7), (0.28333333, 0.68333334), (0.28333333, 0.68333334), (0.28333333, 0.7), (0.275, 0.7), (0.275, 0.68333334), (0.275, 0.68333334), (0.275, 0.7), (0.26666668, 0.7), (0.26666668, 0.68333334), (0.26666668, 0.68333334), (0.26666668, 0.7), (0.25833333, 0.7), (0.25833333, 0.68333334), (0.25833333, 0.68333334), (0.25833333, 0.7), (0.25, 0.7), (0.25, 0.68333334), (0.25, 0.68333334), (0.25, 0.7), (0.24166666, 0.7), (0.24166666, 0.68333334), (0.24166666, 0.68333334), (0.24166666, 0.7), (0.23333333, 0.7), (0.23333333, 0.68333334), (0.23333333, 0.68333334), (0.23333333, 0.7), (0.225, 0.7), (0.225, 0.68333334), (0.225, 0.68333334), (0.225, 0.7), (0.21666667, 0.7), (0.21666667, 0.68333334), (0.21666667, 0.68333334), (0.21666667, 0.7), (0.20833333, 0.7), (0.20833333, 0.68333334), (0.20833333, 0.68333334), (0.20833333, 0.7), (0.2, 0.7), (0.2, 0.68333334), (0.2, 0.68333334), (0.2, 0.7), (0.19166666, 0.7), (0.19166666, 0.68333334), (0.19166666, 0.68333334), (0.19166666, 0.7), (0.18333334, 0.7), (0.18333334, 0.68333334), (0.18333334, 0.68333334), (0.18333334, 0.7), (0.175, 0.7), (0.175, 0.68333334), (0.175, 0.68333334), (0.175, 0.7), (0.16666667, 0.7), (0.16666667, 0.68333334), (0.16666667, 0.68333334), (0.16666667, 0.7), (0.15833333, 0.7), (0.15833333, 0.68333334), (0.15833333, 0.68333334), (0.15833333, 0.7), (0.15, 0.7), (0.15, 0.68333334), (0.15, 0.68333334), (0.15, 0.7), (0.14166667, 0.7), (0.14166667, 0.68333334), (0.14166667, 0.68333334), (0.14166667, 0.7), (0.13333334, 0.7), (0.13333334, 0.68333334), (0.13333334, 0.68333334), (0.13333334, 0.7), (0.125, 0.7), (0.125, 0.68333334), (0.125, 0.68333334), (0.125, 0.7), (0.11666667, 0.7), (0.11666667, 0.68333334), (0.11666667, 0.68333334), (0.11666667, 0.7), (0.108333334, 0.7), (0.108333334, 0.68333334), (0.108333334, 0.68333334), (0.108333334, 0.7), (0.1, 0.7), (0.1, 0.68333334), (0.1, 0.68333334), (0.1, 0.7), (0.09166667, 0.7), (0.09166667, 0.68333334), (0.09166667, 0.68333334), (0.09166667, 0.7), (0.083333336, 0.7), (0.083333336, 0.68333334), (0.083333336, 0.68333334), (0.083333336, 0.7), (0.075, 0.7), (0.075, 0.68333334), (0.075, 0.68333334), (0.075, 0.7), (0.06666667, 0.7), (0.06666667, 0.68333334), (0.06666667, 0.68333334), (0.06666667, 0.7), (0.058333334, 0.7), (0.058333334, 0.68333334), (0.058333334, 0.68333334), (0.058333334, 0.7), (0.05, 0.7), (0.05, 0.68333334), (0.05, 0.68333334), (0.05, 0.7), (0.041666668, 0.7), (0.041666668, 0.68333334), (0.041666668, 0.68333334), (0.041666668, 0.7), (0.033333335, 0.7), (0.033333335, 0.68333334), (0.033333335, 0.68333334), (0.033333335, 0.7), (0.025, 0.7), (0.025, 0.68333334), (0.025, 0.68333334), (0.025, 0.7), (0.016666668, 0.7), (0.016666668, 0.68333334), (0.016666668, 0.68333334), (0.016666668, 0.7), (0.008333334, 0.7), (0.008333334, 0.68333334), (0.008333334, 0.68333334), (0.008333334, 0.7), (0, 0.7), (0, 0.68333334), (1, 0.7), (1, 0.71666664), (0.9916667, 0.71666664), (0.9916667, 0.7), (0.9916667, 0.7), (0.9916667, 0.71666664), (0.98333335, 0.71666664), (0.98333335, 0.7), (0.98333335, 0.7), (0.98333335, 0.71666664), (0.975, 0.71666664), (0.975, 0.7), (0.975, 0.7), (0.975, 0.71666664), (0.96666664, 0.71666664), (0.96666664, 0.7), (0.96666664, 0.7), (0.96666664, 0.71666664), (0.9583333, 0.71666664), (0.9583333, 0.7), (0.9583333, 0.7), (0.9583333, 0.71666664), (0.95, 0.71666664), (0.95, 0.7), (0.95, 0.7), (0.95, 0.71666664), (0.94166666, 0.71666664), (0.94166666, 0.7), (0.94166666, 0.7), (0.94166666, 0.71666664), (0.93333334, 0.71666664), (0.93333334, 0.7), (0.93333334, 0.7), (0.93333334, 0.71666664), (0.925, 0.71666664), (0.925, 0.7), (0.925, 0.7), (0.925, 0.71666664), (0.9166667, 0.71666664), (0.9166667, 0.7), (0.9166667, 0.7), (0.9166667, 0.71666664), (0.90833336, 0.71666664), (0.90833336, 0.7), (0.90833336, 0.7), (0.90833336, 0.71666664), (0.9, 0.71666664), (0.9, 0.7), (0.9, 0.7), (0.9, 0.71666664), (0.89166665, 0.71666664), (0.89166665, 0.7), (0.89166665, 0.7), (0.89166665, 0.71666664), (0.8833333, 0.71666664), (0.8833333, 0.7), (0.8833333, 0.7), (0.8833333, 0.71666664), (0.875, 0.71666664), (0.875, 0.7), (0.875, 0.7), (0.875, 0.71666664), (0.8666667, 0.71666664), (0.8666667, 0.7), (0.8666667, 0.7), (0.8666667, 0.71666664), (0.85833335, 0.71666664), (0.85833335, 0.7), (0.85833335, 0.7), (0.85833335, 0.71666664), (0.85, 0.71666664), (0.85, 0.7), (0.85, 0.7), (0.85, 0.71666664), (0.84166664, 0.71666664), (0.84166664, 0.7), (0.84166664, 0.7), (0.84166664, 0.71666664), (0.8333333, 0.71666664), (0.8333333, 0.7), (0.8333333, 0.7), (0.8333333, 0.71666664), (0.825, 0.71666664), (0.825, 0.7), (0.825, 0.7), (0.825, 0.71666664), (0.81666666, 0.71666664), (0.81666666, 0.7), (0.81666666, 0.7), (0.81666666, 0.71666664), (0.80833334, 0.71666664), (0.80833334, 0.7), (0.80833334, 0.7), (0.80833334, 0.71666664), (0.8, 0.71666664), (0.8, 0.7), (0.8, 0.7), (0.8, 0.71666664), (0.7916667, 0.71666664), (0.7916667, 0.7), (0.7916667, 0.7), (0.7916667, 0.71666664), (0.78333336, 0.71666664), (0.78333336, 0.7), (0.78333336, 0.7), (0.78333336, 0.71666664), (0.775, 0.71666664), (0.775, 0.7), (0.775, 0.7), (0.775, 0.71666664), (0.76666665, 0.71666664), (0.76666665, 0.7), (0.76666665, 0.7), (0.76666665, 0.71666664), (0.7583333, 0.71666664), (0.7583333, 0.7), (0.7583333, 0.7), (0.7583333, 0.71666664), (0.75, 0.71666664), (0.75, 0.7), (0.75, 0.7), (0.75, 0.71666664), (0.7416667, 0.71666664), (0.7416667, 0.7), (0.7416667, 0.7), (0.7416667, 0.71666664), (0.73333335, 0.71666664), (0.73333335, 0.7), (0.73333335, 0.7), (0.73333335, 0.71666664), (0.725, 0.71666664), (0.725, 0.7), (0.725, 0.7), (0.725, 0.71666664), (0.71666664, 0.71666664), (0.71666664, 0.7), (0.71666664, 0.7), (0.71666664, 0.71666664), (0.7083333, 0.71666664), (0.7083333, 0.7), (0.7083333, 0.7), (0.7083333, 0.71666664), (0.7, 0.71666664), (0.7, 0.7), (0.7, 0.7), (0.7, 0.71666664), (0.69166666, 0.71666664), (0.69166666, 0.7), (0.69166666, 0.7), (0.69166666, 0.71666664), (0.68333334, 0.71666664), (0.68333334, 0.7), (0.68333334, 0.7), (0.68333334, 0.71666664), (0.675, 0.71666664), (0.675, 0.7), (0.675, 0.7), (0.675, 0.71666664), (0.6666667, 0.71666664), (0.6666667, 0.7), (0.6666667, 0.7), (0.6666667, 0.71666664), (0.65833336, 0.71666664), (0.65833336, 0.7), (0.65833336, 0.7), (0.65833336, 0.71666664), (0.65, 0.71666664), (0.65, 0.7), (0.65, 0.7), (0.65, 0.71666664), (0.64166665, 0.71666664), (0.64166665, 0.7), (0.64166665, 0.7), (0.64166665, 0.71666664), (0.6333333, 0.71666664), (0.6333333, 0.7), (0.6333333, 0.7), (0.6333333, 0.71666664), (0.625, 0.71666664), (0.625, 0.7), (0.625, 0.7), (0.625, 0.71666664), (0.6166667, 0.71666664), (0.6166667, 0.7), (0.6166667, 0.7), (0.6166667, 0.71666664), (0.60833335, 0.71666664), (0.60833335, 0.7), (0.60833335, 0.7), (0.60833335, 0.71666664), (0.6, 0.71666664), (0.6, 0.7), (0.6, 0.7), (0.6, 0.71666664), (0.59166664, 0.71666664), (0.59166664, 0.7), (0.59166664, 0.7), (0.59166664, 0.71666664), (0.5833333, 0.71666664), (0.5833333, 0.7), (0.5833333, 0.7), (0.5833333, 0.71666664), (0.575, 0.71666664), (0.575, 0.7), (0.575, 0.7), (0.575, 0.71666664), (0.56666666, 0.71666664), (0.56666666, 0.7), (0.56666666, 0.7), (0.56666666, 0.71666664), (0.55833334, 0.71666664), (0.55833334, 0.7), (0.55833334, 0.7), (0.55833334, 0.71666664), (0.55, 0.71666664), (0.55, 0.7), (0.55, 0.7), (0.55, 0.71666664), (0.5416667, 0.71666664), (0.5416667, 0.7), (0.5416667, 0.7), (0.5416667, 0.71666664), (0.53333336, 0.71666664), (0.53333336, 0.7), (0.53333336, 0.7), (0.53333336, 0.71666664), (0.525, 0.71666664), (0.525, 0.7), (0.525, 0.7), (0.525, 0.71666664), (0.51666665, 0.71666664), (0.51666665, 0.7), (0.51666665, 0.7), (0.51666665, 0.71666664), (0.5083333, 0.71666664), (0.5083333, 0.7), (0.5083333, 0.7), (0.5083333, 0.71666664), (0.5, 0.71666664), (0.5, 0.7), (0.5, 0.7), (0.5, 0.71666664), (0.49166667, 0.71666664), (0.49166667, 0.7), (0.49166667, 0.7), (0.49166667, 0.71666664), (0.48333332, 0.71666664), (0.48333332, 0.7), (0.48333332, 0.7), (0.48333332, 0.71666664), (0.475, 0.71666664), (0.475, 0.7), (0.475, 0.7), (0.475, 0.71666664), (0.46666667, 0.71666664), (0.46666667, 0.7), (0.46666667, 0.7), (0.46666667, 0.71666664), (0.45833334, 0.71666664), (0.45833334, 0.7), (0.45833334, 0.7), (0.45833334, 0.71666664), (0.45, 0.71666664), (0.45, 0.7), (0.45, 0.7), (0.45, 0.71666664), (0.44166666, 0.71666664), (0.44166666, 0.7), (0.44166666, 0.7), (0.44166666, 0.71666664), (0.43333334, 0.71666664), (0.43333334, 0.7), (0.43333334, 0.7), (0.43333334, 0.71666664), (0.425, 0.71666664), (0.425, 0.7), (0.425, 0.7), (0.425, 0.71666664), (0.41666666, 0.71666664), (0.41666666, 0.7), (0.41666666, 0.7), (0.41666666, 0.71666664), (0.40833333, 0.71666664), (0.40833333, 0.7), (0.40833333, 0.7), (0.40833333, 0.71666664), (0.4, 0.71666664), (0.4, 0.7), (0.4, 0.7), (0.4, 0.71666664), (0.39166668, 0.71666664), (0.39166668, 0.7), (0.39166668, 0.7), (0.39166668, 0.71666664), (0.38333333, 0.71666664), (0.38333333, 0.7), (0.38333333, 0.7), (0.38333333, 0.71666664), (0.375, 0.71666664), (0.375, 0.7), (0.375, 0.7), (0.375, 0.71666664), (0.36666667, 0.71666664), (0.36666667, 0.7), (0.36666667, 0.7), (0.36666667, 0.71666664), (0.35833332, 0.71666664), (0.35833332, 0.7), (0.35833332, 0.7), (0.35833332, 0.71666664), (0.35, 0.71666664), (0.35, 0.7), (0.35, 0.7), (0.35, 0.71666664), (0.34166667, 0.71666664), (0.34166667, 0.7), (0.34166667, 0.7), (0.34166667, 0.71666664), (0.33333334, 0.71666664), (0.33333334, 0.7), (0.33333334, 0.7), (0.33333334, 0.71666664), (0.325, 0.71666664), (0.325, 0.7), (0.325, 0.7), (0.325, 0.71666664), (0.31666666, 0.71666664), (0.31666666, 0.7), (0.31666666, 0.7), (0.31666666, 0.71666664), (0.30833334, 0.71666664), (0.30833334, 0.7), (0.30833334, 0.7), (0.30833334, 0.71666664), (0.3, 0.71666664), (0.3, 0.7), (0.3, 0.7), (0.3, 0.71666664), (0.29166666, 0.71666664), (0.29166666, 0.7), (0.29166666, 0.7), (0.29166666, 0.71666664), (0.28333333, 0.71666664), (0.28333333, 0.7), (0.28333333, 0.7), (0.28333333, 0.71666664), (0.275, 0.71666664), (0.275, 0.7), (0.275, 0.7), (0.275, 0.71666664), (0.26666668, 0.71666664), (0.26666668, 0.7), (0.26666668, 0.7), (0.26666668, 0.71666664), (0.25833333, 0.71666664), (0.25833333, 0.7), (0.25833333, 0.7), (0.25833333, 0.71666664), (0.25, 0.71666664), (0.25, 0.7), (0.25, 0.7), (0.25, 0.71666664), (0.24166666, 0.71666664), (0.24166666, 0.7), (0.24166666, 0.7), (0.24166666, 0.71666664), (0.23333333, 0.71666664), (0.23333333, 0.7), (0.23333333, 0.7), (0.23333333, 0.71666664), (0.225, 0.71666664), (0.225, 0.7), (0.225, 0.7), (0.225, 0.71666664), (0.21666667, 0.71666664), (0.21666667, 0.7), (0.21666667, 0.7), (0.21666667, 0.71666664), (0.20833333, 0.71666664), (0.20833333, 0.7), (0.20833333, 0.7), (0.20833333, 0.71666664), (0.2, 0.71666664), (0.2, 0.7), (0.2, 0.7), (0.2, 0.71666664), (0.19166666, 0.71666664), (0.19166666, 0.7), (0.19166666, 0.7), (0.19166666, 0.71666664), (0.18333334, 0.71666664), (0.18333334, 0.7), (0.18333334, 0.7), (0.18333334, 0.71666664), (0.175, 0.71666664), (0.175, 0.7), (0.175, 0.7), (0.175, 0.71666664), (0.16666667, 0.71666664), (0.16666667, 0.7), (0.16666667, 0.7), (0.16666667, 0.71666664), (0.15833333, 0.71666664), (0.15833333, 0.7), (0.15833333, 0.7), (0.15833333, 0.71666664), (0.15, 0.71666664), (0.15, 0.7), (0.15, 0.7), (0.15, 0.71666664), (0.14166667, 0.71666664), (0.14166667, 0.7), (0.14166667, 0.7), (0.14166667, 0.71666664), (0.13333334, 0.71666664), (0.13333334, 0.7), (0.13333334, 0.7), (0.13333334, 0.71666664), (0.125, 0.71666664), (0.125, 0.7), (0.125, 0.7), (0.125, 0.71666664), (0.11666667, 0.71666664), (0.11666667, 0.7), (0.11666667, 0.7), (0.11666667, 0.71666664), (0.108333334, 0.71666664), (0.108333334, 0.7), (0.108333334, 0.7), (0.108333334, 0.71666664), (0.1, 0.71666664), (0.1, 0.7), (0.1, 0.7), (0.1, 0.71666664), (0.09166667, 0.71666664), (0.09166667, 0.7), (0.09166667, 0.7), (0.09166667, 0.71666664), (0.083333336, 0.71666664), (0.083333336, 0.7), (0.083333336, 0.7), (0.083333336, 0.71666664), (0.075, 0.71666664), (0.075, 0.7), (0.075, 0.7), (0.075, 0.71666664), (0.06666667, 0.71666664), (0.06666667, 0.7), (0.06666667, 0.7), (0.06666667, 0.71666664), (0.058333334, 0.71666664), (0.058333334, 0.7), (0.058333334, 0.7), (0.058333334, 0.71666664), (0.05, 0.71666664), (0.05, 0.7), (0.05, 0.7), (0.05, 0.71666664), (0.041666668, 0.71666664), (0.041666668, 0.7), (0.041666668, 0.7), (0.041666668, 0.71666664), (0.033333335, 0.71666664), (0.033333335, 0.7), (0.033333335, 0.7), (0.033333335, 0.71666664), (0.025, 0.71666664), (0.025, 0.7), (0.025, 0.7), (0.025, 0.71666664), (0.016666668, 0.71666664), (0.016666668, 0.7), (0.016666668, 0.7), (0.016666668, 0.71666664), (0.008333334, 0.71666664), (0.008333334, 0.7), (0.008333334, 0.7), (0.008333334, 0.71666664), (0, 0.71666664), (0, 0.7), (1, 0.71666664), (1, 0.73333335), (0.9916667, 0.73333335), (0.9916667, 0.71666664), (0.9916667, 0.71666664), (0.9916667, 0.73333335), (0.98333335, 0.73333335), (0.98333335, 0.71666664), (0.98333335, 0.71666664), (0.98333335, 0.73333335), (0.975, 0.73333335), (0.975, 0.71666664), (0.975, 0.71666664), (0.975, 0.73333335), (0.96666664, 0.73333335), (0.96666664, 0.71666664), (0.96666664, 0.71666664), (0.96666664, 0.73333335), (0.9583333, 0.73333335), (0.9583333, 0.71666664), (0.9583333, 0.71666664), (0.9583333, 0.73333335), (0.95, 0.73333335), (0.95, 0.71666664), (0.95, 0.71666664), (0.95, 0.73333335), (0.94166666, 0.73333335), (0.94166666, 0.71666664), (0.94166666, 0.71666664), (0.94166666, 0.73333335), (0.93333334, 0.73333335), (0.93333334, 0.71666664), (0.93333334, 0.71666664), (0.93333334, 0.73333335), (0.925, 0.73333335), (0.925, 0.71666664), (0.925, 0.71666664), (0.925, 0.73333335), (0.9166667, 0.73333335), (0.9166667, 0.71666664), (0.9166667, 0.71666664), (0.9166667, 0.73333335), (0.90833336, 0.73333335), (0.90833336, 0.71666664), (0.90833336, 0.71666664), (0.90833336, 0.73333335), (0.9, 0.73333335), (0.9, 0.71666664), (0.9, 0.71666664), (0.9, 0.73333335), (0.89166665, 0.73333335), (0.89166665, 0.71666664), (0.89166665, 0.71666664), (0.89166665, 0.73333335), (0.8833333, 0.73333335), (0.8833333, 0.71666664), (0.8833333, 0.71666664), (0.8833333, 0.73333335), (0.875, 0.73333335), (0.875, 0.71666664), (0.875, 0.71666664), (0.875, 0.73333335), (0.8666667, 0.73333335), (0.8666667, 0.71666664), (0.8666667, 0.71666664), (0.8666667, 0.73333335), (0.85833335, 0.73333335), (0.85833335, 0.71666664), (0.85833335, 0.71666664), (0.85833335, 0.73333335), (0.85, 0.73333335), (0.85, 0.71666664), (0.85, 0.71666664), (0.85, 0.73333335), (0.84166664, 0.73333335), (0.84166664, 0.71666664), (0.84166664, 0.71666664), (0.84166664, 0.73333335), (0.8333333, 0.73333335), (0.8333333, 0.71666664), (0.8333333, 0.71666664), (0.8333333, 0.73333335), (0.825, 0.73333335), (0.825, 0.71666664), (0.825, 0.71666664), (0.825, 0.73333335), (0.81666666, 0.73333335), (0.81666666, 0.71666664), (0.81666666, 0.71666664), (0.81666666, 0.73333335), (0.80833334, 0.73333335), (0.80833334, 0.71666664), (0.80833334, 0.71666664), (0.80833334, 0.73333335), (0.8, 0.73333335), (0.8, 0.71666664), (0.8, 0.71666664), (0.8, 0.73333335), (0.7916667, 0.73333335), (0.7916667, 0.71666664), (0.7916667, 0.71666664), (0.7916667, 0.73333335), (0.78333336, 0.73333335), (0.78333336, 0.71666664), (0.78333336, 0.71666664), (0.78333336, 0.73333335), (0.775, 0.73333335), (0.775, 0.71666664), (0.775, 0.71666664), (0.775, 0.73333335), (0.76666665, 0.73333335), (0.76666665, 0.71666664), (0.76666665, 0.71666664), (0.76666665, 0.73333335), (0.7583333, 0.73333335), (0.7583333, 0.71666664), (0.7583333, 0.71666664), (0.7583333, 0.73333335), (0.75, 0.73333335), (0.75, 0.71666664), (0.75, 0.71666664), (0.75, 0.73333335), (0.7416667, 0.73333335), (0.7416667, 0.71666664), (0.7416667, 0.71666664), (0.7416667, 0.73333335), (0.73333335, 0.73333335), (0.73333335, 0.71666664), (0.73333335, 0.71666664), (0.73333335, 0.73333335), (0.725, 0.73333335), (0.725, 0.71666664), (0.725, 0.71666664), (0.725, 0.73333335), (0.71666664, 0.73333335), (0.71666664, 0.71666664), (0.71666664, 0.71666664), (0.71666664, 0.73333335), (0.7083333, 0.73333335), (0.7083333, 0.71666664), (0.7083333, 0.71666664), (0.7083333, 0.73333335), (0.7, 0.73333335), (0.7, 0.71666664), (0.7, 0.71666664), (0.7, 0.73333335), (0.69166666, 0.73333335), (0.69166666, 0.71666664), (0.69166666, 0.71666664), (0.69166666, 0.73333335), (0.68333334, 0.73333335), (0.68333334, 0.71666664), (0.68333334, 0.71666664), (0.68333334, 0.73333335), (0.675, 0.73333335), (0.675, 0.71666664), (0.675, 0.71666664), (0.675, 0.73333335), (0.6666667, 0.73333335), (0.6666667, 0.71666664), (0.6666667, 0.71666664), (0.6666667, 0.73333335), (0.65833336, 0.73333335), (0.65833336, 0.71666664), (0.65833336, 0.71666664), (0.65833336, 0.73333335), (0.65, 0.73333335), (0.65, 0.71666664), (0.65, 0.71666664), (0.65, 0.73333335), (0.64166665, 0.73333335), (0.64166665, 0.71666664), (0.64166665, 0.71666664), (0.64166665, 0.73333335), (0.6333333, 0.73333335), (0.6333333, 0.71666664), (0.6333333, 0.71666664), (0.6333333, 0.73333335), (0.625, 0.73333335), (0.625, 0.71666664), (0.625, 0.71666664), (0.625, 0.73333335), (0.6166667, 0.73333335), (0.6166667, 0.71666664), (0.6166667, 0.71666664), (0.6166667, 0.73333335), (0.60833335, 0.73333335), (0.60833335, 0.71666664), (0.60833335, 0.71666664), (0.60833335, 0.73333335), (0.6, 0.73333335), (0.6, 0.71666664), (0.6, 0.71666664), (0.6, 0.73333335), (0.59166664, 0.73333335), (0.59166664, 0.71666664), (0.59166664, 0.71666664), (0.59166664, 0.73333335), (0.5833333, 0.73333335), (0.5833333, 0.71666664), (0.5833333, 0.71666664), (0.5833333, 0.73333335), (0.575, 0.73333335), (0.575, 0.71666664), (0.575, 0.71666664), (0.575, 0.73333335), (0.56666666, 0.73333335), (0.56666666, 0.71666664), (0.56666666, 0.71666664), (0.56666666, 0.73333335), (0.55833334, 0.73333335), (0.55833334, 0.71666664), (0.55833334, 0.71666664), (0.55833334, 0.73333335), (0.55, 0.73333335), (0.55, 0.71666664), (0.55, 0.71666664), (0.55, 0.73333335), (0.5416667, 0.73333335), (0.5416667, 0.71666664), (0.5416667, 0.71666664), (0.5416667, 0.73333335), (0.53333336, 0.73333335), (0.53333336, 0.71666664), (0.53333336, 0.71666664), (0.53333336, 0.73333335), (0.525, 0.73333335), (0.525, 0.71666664), (0.525, 0.71666664), (0.525, 0.73333335), (0.51666665, 0.73333335), (0.51666665, 0.71666664), (0.51666665, 0.71666664), (0.51666665, 0.73333335), (0.5083333, 0.73333335), (0.5083333, 0.71666664), (0.5083333, 0.71666664), (0.5083333, 0.73333335), (0.5, 0.73333335), (0.5, 0.71666664), (0.5, 0.71666664), (0.5, 0.73333335), (0.49166667, 0.73333335), (0.49166667, 0.71666664), (0.49166667, 0.71666664), (0.49166667, 0.73333335), (0.48333332, 0.73333335), (0.48333332, 0.71666664), (0.48333332, 0.71666664), (0.48333332, 0.73333335), (0.475, 0.73333335), (0.475, 0.71666664), (0.475, 0.71666664), (0.475, 0.73333335), (0.46666667, 0.73333335), (0.46666667, 0.71666664), (0.46666667, 0.71666664), (0.46666667, 0.73333335), (0.45833334, 0.73333335), (0.45833334, 0.71666664), (0.45833334, 0.71666664), (0.45833334, 0.73333335), (0.45, 0.73333335), (0.45, 0.71666664), (0.45, 0.71666664), (0.45, 0.73333335), (0.44166666, 0.73333335), (0.44166666, 0.71666664), (0.44166666, 0.71666664), (0.44166666, 0.73333335), (0.43333334, 0.73333335), (0.43333334, 0.71666664), (0.43333334, 0.71666664), (0.43333334, 0.73333335), (0.425, 0.73333335), (0.425, 0.71666664), (0.425, 0.71666664), (0.425, 0.73333335), (0.41666666, 0.73333335), (0.41666666, 0.71666664), (0.41666666, 0.71666664), (0.41666666, 0.73333335), (0.40833333, 0.73333335), (0.40833333, 0.71666664), (0.40833333, 0.71666664), (0.40833333, 0.73333335), (0.4, 0.73333335), (0.4, 0.71666664), (0.4, 0.71666664), (0.4, 0.73333335), (0.39166668, 0.73333335), (0.39166668, 0.71666664), (0.39166668, 0.71666664), (0.39166668, 0.73333335), (0.38333333, 0.73333335), (0.38333333, 0.71666664), (0.38333333, 0.71666664), (0.38333333, 0.73333335), (0.375, 0.73333335), (0.375, 0.71666664), (0.375, 0.71666664), (0.375, 0.73333335), (0.36666667, 0.73333335), (0.36666667, 0.71666664), (0.36666667, 0.71666664), (0.36666667, 0.73333335), (0.35833332, 0.73333335), (0.35833332, 0.71666664), (0.35833332, 0.71666664), (0.35833332, 0.73333335), (0.35, 0.73333335), (0.35, 0.71666664), (0.35, 0.71666664), (0.35, 0.73333335), (0.34166667, 0.73333335), (0.34166667, 0.71666664), (0.34166667, 0.71666664), (0.34166667, 0.73333335), (0.33333334, 0.73333335), (0.33333334, 0.71666664), (0.33333334, 0.71666664), (0.33333334, 0.73333335), (0.325, 0.73333335), (0.325, 0.71666664), (0.325, 0.71666664), (0.325, 0.73333335), (0.31666666, 0.73333335), (0.31666666, 0.71666664), (0.31666666, 0.71666664), (0.31666666, 0.73333335), (0.30833334, 0.73333335), (0.30833334, 0.71666664), (0.30833334, 0.71666664), (0.30833334, 0.73333335), (0.3, 0.73333335), (0.3, 0.71666664), (0.3, 0.71666664), (0.3, 0.73333335), (0.29166666, 0.73333335), (0.29166666, 0.71666664), (0.29166666, 0.71666664), (0.29166666, 0.73333335), (0.28333333, 0.73333335), (0.28333333, 0.71666664), (0.28333333, 0.71666664), (0.28333333, 0.73333335), (0.275, 0.73333335), (0.275, 0.71666664), (0.275, 0.71666664), (0.275, 0.73333335), (0.26666668, 0.73333335), (0.26666668, 0.71666664), (0.26666668, 0.71666664), (0.26666668, 0.73333335), (0.25833333, 0.73333335), (0.25833333, 0.71666664), (0.25833333, 0.71666664), (0.25833333, 0.73333335), (0.25, 0.73333335), (0.25, 0.71666664), (0.25, 0.71666664), (0.25, 0.73333335), (0.24166666, 0.73333335), (0.24166666, 0.71666664), (0.24166666, 0.71666664), (0.24166666, 0.73333335), (0.23333333, 0.73333335), (0.23333333, 0.71666664), (0.23333333, 0.71666664), (0.23333333, 0.73333335), (0.225, 0.73333335), (0.225, 0.71666664), (0.225, 0.71666664), (0.225, 0.73333335), (0.21666667, 0.73333335), (0.21666667, 0.71666664), (0.21666667, 0.71666664), (0.21666667, 0.73333335), (0.20833333, 0.73333335), (0.20833333, 0.71666664), (0.20833333, 0.71666664), (0.20833333, 0.73333335), (0.2, 0.73333335), (0.2, 0.71666664), (0.2, 0.71666664), (0.2, 0.73333335), (0.19166666, 0.73333335), (0.19166666, 0.71666664), (0.19166666, 0.71666664), (0.19166666, 0.73333335), (0.18333334, 0.73333335), (0.18333334, 0.71666664), (0.18333334, 0.71666664), (0.18333334, 0.73333335), (0.175, 0.73333335), (0.175, 0.71666664), (0.175, 0.71666664), (0.175, 0.73333335), (0.16666667, 0.73333335), (0.16666667, 0.71666664), (0.16666667, 0.71666664), (0.16666667, 0.73333335), (0.15833333, 0.73333335), (0.15833333, 0.71666664), (0.15833333, 0.71666664), (0.15833333, 0.73333335), (0.15, 0.73333335), (0.15, 0.71666664), (0.15, 0.71666664), (0.15, 0.73333335), (0.14166667, 0.73333335), (0.14166667, 0.71666664), (0.14166667, 0.71666664), (0.14166667, 0.73333335), (0.13333334, 0.73333335), (0.13333334, 0.71666664), (0.13333334, 0.71666664), (0.13333334, 0.73333335), (0.125, 0.73333335), (0.125, 0.71666664), (0.125, 0.71666664), (0.125, 0.73333335), (0.11666667, 0.73333335), (0.11666667, 0.71666664), (0.11666667, 0.71666664), (0.11666667, 0.73333335), (0.108333334, 0.73333335), (0.108333334, 0.71666664), (0.108333334, 0.71666664), (0.108333334, 0.73333335), (0.1, 0.73333335), (0.1, 0.71666664), (0.1, 0.71666664), (0.1, 0.73333335), (0.09166667, 0.73333335), (0.09166667, 0.71666664), (0.09166667, 0.71666664), (0.09166667, 0.73333335), (0.083333336, 0.73333335), (0.083333336, 0.71666664), (0.083333336, 0.71666664), (0.083333336, 0.73333335), (0.075, 0.73333335), (0.075, 0.71666664), (0.075, 0.71666664), (0.075, 0.73333335), (0.06666667, 0.73333335), (0.06666667, 0.71666664), (0.06666667, 0.71666664), (0.06666667, 0.73333335), (0.058333334, 0.73333335), (0.058333334, 0.71666664), (0.058333334, 0.71666664), (0.058333334, 0.73333335), (0.05, 0.73333335), (0.05, 0.71666664), (0.05, 0.71666664), (0.05, 0.73333335), (0.041666668, 0.73333335), (0.041666668, 0.71666664), (0.041666668, 0.71666664), (0.041666668, 0.73333335), (0.033333335, 0.73333335), (0.033333335, 0.71666664), (0.033333335, 0.71666664), (0.033333335, 0.73333335), (0.025, 0.73333335), (0.025, 0.71666664), (0.025, 0.71666664), (0.025, 0.73333335), (0.016666668, 0.73333335), (0.016666668, 0.71666664), (0.016666668, 0.71666664), (0.016666668, 0.73333335), (0.008333334, 0.73333335), (0.008333334, 0.71666664), (0.008333334, 0.71666664), (0.008333334, 0.73333335), (0, 0.73333335), (0, 0.71666664), (1, 0.73333335), (1, 0.75), (0.9916667, 0.75), (0.9916667, 0.73333335), (0.9916667, 0.73333335), (0.9916667, 0.75), (0.98333335, 0.75), (0.98333335, 0.73333335), (0.98333335, 0.73333335), (0.98333335, 0.75), (0.975, 0.75), (0.975, 0.73333335), (0.975, 0.73333335), (0.975, 0.75), (0.96666664, 0.75), (0.96666664, 0.73333335), (0.96666664, 0.73333335), (0.96666664, 0.75), (0.9583333, 0.75), (0.9583333, 0.73333335), (0.9583333, 0.73333335), (0.9583333, 0.75), (0.95, 0.75), (0.95, 0.73333335), (0.95, 0.73333335), (0.95, 0.75), (0.94166666, 0.75), (0.94166666, 0.73333335), (0.94166666, 0.73333335), (0.94166666, 0.75), (0.93333334, 0.75), (0.93333334, 0.73333335), (0.93333334, 0.73333335), (0.93333334, 0.75), (0.925, 0.75), (0.925, 0.73333335), (0.925, 0.73333335), (0.925, 0.75), (0.9166667, 0.75), (0.9166667, 0.73333335), (0.9166667, 0.73333335), (0.9166667, 0.75), (0.90833336, 0.75), (0.90833336, 0.73333335), (0.90833336, 0.73333335), (0.90833336, 0.75), (0.9, 0.75), (0.9, 0.73333335), (0.9, 0.73333335), (0.9, 0.75), (0.89166665, 0.75), (0.89166665, 0.73333335), (0.89166665, 0.73333335), (0.89166665, 0.75), (0.8833333, 0.75), (0.8833333, 0.73333335), (0.8833333, 0.73333335), (0.8833333, 0.75), (0.875, 0.75), (0.875, 0.73333335), (0.875, 0.73333335), (0.875, 0.75), (0.8666667, 0.75), (0.8666667, 0.73333335), (0.8666667, 0.73333335), (0.8666667, 0.75), (0.85833335, 0.75), (0.85833335, 0.73333335), (0.85833335, 0.73333335), (0.85833335, 0.75), (0.85, 0.75), (0.85, 0.73333335), (0.85, 0.73333335), (0.85, 0.75), (0.84166664, 0.75), (0.84166664, 0.73333335), (0.84166664, 0.73333335), (0.84166664, 0.75), (0.8333333, 0.75), (0.8333333, 0.73333335), (0.8333333, 0.73333335), (0.8333333, 0.75), (0.825, 0.75), (0.825, 0.73333335), (0.825, 0.73333335), (0.825, 0.75), (0.81666666, 0.75), (0.81666666, 0.73333335), (0.81666666, 0.73333335), (0.81666666, 0.75), (0.80833334, 0.75), (0.80833334, 0.73333335), (0.80833334, 0.73333335), (0.80833334, 0.75), (0.8, 0.75), (0.8, 0.73333335), (0.8, 0.73333335), (0.8, 0.75), (0.7916667, 0.75), (0.7916667, 0.73333335), (0.7916667, 0.73333335), (0.7916667, 0.75), (0.78333336, 0.75), (0.78333336, 0.73333335), (0.78333336, 0.73333335), (0.78333336, 0.75), (0.775, 0.75), (0.775, 0.73333335), (0.775, 0.73333335), (0.775, 0.75), (0.76666665, 0.75), (0.76666665, 0.73333335), (0.76666665, 0.73333335), (0.76666665, 0.75), (0.7583333, 0.75), (0.7583333, 0.73333335), (0.7583333, 0.73333335), (0.7583333, 0.75), (0.75, 0.75), (0.75, 0.73333335), (0.75, 0.73333335), (0.75, 0.75), (0.7416667, 0.75), (0.7416667, 0.73333335), (0.7416667, 0.73333335), (0.7416667, 0.75), (0.73333335, 0.75), (0.73333335, 0.73333335), (0.73333335, 0.73333335), (0.73333335, 0.75), (0.725, 0.75), (0.725, 0.73333335), (0.725, 0.73333335), (0.725, 0.75), (0.71666664, 0.75), (0.71666664, 0.73333335), (0.71666664, 0.73333335), (0.71666664, 0.75), (0.7083333, 0.75), (0.7083333, 0.73333335), (0.7083333, 0.73333335), (0.7083333, 0.75), (0.7, 0.75), (0.7, 0.73333335), (0.7, 0.73333335), (0.7, 0.75), (0.69166666, 0.75), (0.69166666, 0.73333335), (0.69166666, 0.73333335), (0.69166666, 0.75), (0.68333334, 0.75), (0.68333334, 0.73333335), (0.68333334, 0.73333335), (0.68333334, 0.75), (0.675, 0.75), (0.675, 0.73333335), (0.675, 0.73333335), (0.675, 0.75), (0.6666667, 0.75), (0.6666667, 0.73333335), (0.6666667, 0.73333335), (0.6666667, 0.75), (0.65833336, 0.75), (0.65833336, 0.73333335), (0.65833336, 0.73333335), (0.65833336, 0.75), (0.65, 0.75), (0.65, 0.73333335), (0.65, 0.73333335), (0.65, 0.75), (0.64166665, 0.75), (0.64166665, 0.73333335), (0.64166665, 0.73333335), (0.64166665, 0.75), (0.6333333, 0.75), (0.6333333, 0.73333335), (0.6333333, 0.73333335), (0.6333333, 0.75), (0.625, 0.75), (0.625, 0.73333335), (0.625, 0.73333335), (0.625, 0.75), (0.6166667, 0.75), (0.6166667, 0.73333335), (0.6166667, 0.73333335), (0.6166667, 0.75), (0.60833335, 0.75), (0.60833335, 0.73333335), (0.60833335, 0.73333335), (0.60833335, 0.75), (0.6, 0.75), (0.6, 0.73333335), (0.6, 0.73333335), (0.6, 0.75), (0.59166664, 0.75), (0.59166664, 0.73333335), (0.59166664, 0.73333335), (0.59166664, 0.75), (0.5833333, 0.75), (0.5833333, 0.73333335), (0.5833333, 0.73333335), (0.5833333, 0.75), (0.575, 0.75), (0.575, 0.73333335), (0.575, 0.73333335), (0.575, 0.75), (0.56666666, 0.75), (0.56666666, 0.73333335), (0.56666666, 0.73333335), (0.56666666, 0.75), (0.55833334, 0.75), (0.55833334, 0.73333335), (0.55833334, 0.73333335), (0.55833334, 0.75), (0.55, 0.75), (0.55, 0.73333335), (0.55, 0.73333335), (0.55, 0.75), (0.5416667, 0.75), (0.5416667, 0.73333335), (0.5416667, 0.73333335), (0.5416667, 0.75), (0.53333336, 0.75), (0.53333336, 0.73333335), (0.53333336, 0.73333335), (0.53333336, 0.75), (0.525, 0.75), (0.525, 0.73333335), (0.525, 0.73333335), (0.525, 0.75), (0.51666665, 0.75), (0.51666665, 0.73333335), (0.51666665, 0.73333335), (0.51666665, 0.75), (0.5083333, 0.75), (0.5083333, 0.73333335), (0.5083333, 0.73333335), (0.5083333, 0.75), (0.5, 0.75), (0.5, 0.73333335), (0.5, 0.73333335), (0.5, 0.75), (0.49166667, 0.75), (0.49166667, 0.73333335), (0.49166667, 0.73333335), (0.49166667, 0.75), (0.48333332, 0.75), (0.48333332, 0.73333335), (0.48333332, 0.73333335), (0.48333332, 0.75), (0.475, 0.75), (0.475, 0.73333335), (0.475, 0.73333335), (0.475, 0.75), (0.46666667, 0.75), (0.46666667, 0.73333335), (0.46666667, 0.73333335), (0.46666667, 0.75), (0.45833334, 0.75), (0.45833334, 0.73333335), (0.45833334, 0.73333335), (0.45833334, 0.75), (0.45, 0.75), (0.45, 0.73333335), (0.45, 0.73333335), (0.45, 0.75), (0.44166666, 0.75), (0.44166666, 0.73333335), (0.44166666, 0.73333335), (0.44166666, 0.75), (0.43333334, 0.75), (0.43333334, 0.73333335), (0.43333334, 0.73333335), (0.43333334, 0.75), (0.425, 0.75), (0.425, 0.73333335), (0.425, 0.73333335), (0.425, 0.75), (0.41666666, 0.75), (0.41666666, 0.73333335), (0.41666666, 0.73333335), (0.41666666, 0.75), (0.40833333, 0.75), (0.40833333, 0.73333335), (0.40833333, 0.73333335), (0.40833333, 0.75), (0.4, 0.75), (0.4, 0.73333335), (0.4, 0.73333335), (0.4, 0.75), (0.39166668, 0.75), (0.39166668, 0.73333335), (0.39166668, 0.73333335), (0.39166668, 0.75), (0.38333333, 0.75), (0.38333333, 0.73333335), (0.38333333, 0.73333335), (0.38333333, 0.75), (0.375, 0.75), (0.375, 0.73333335), (0.375, 0.73333335), (0.375, 0.75), (0.36666667, 0.75), (0.36666667, 0.73333335), (0.36666667, 0.73333335), (0.36666667, 0.75), (0.35833332, 0.75), (0.35833332, 0.73333335), (0.35833332, 0.73333335), (0.35833332, 0.75), (0.35, 0.75), (0.35, 0.73333335), (0.35, 0.73333335), (0.35, 0.75), (0.34166667, 0.75), (0.34166667, 0.73333335), (0.34166667, 0.73333335), (0.34166667, 0.75), (0.33333334, 0.75), (0.33333334, 0.73333335), (0.33333334, 0.73333335), (0.33333334, 0.75), (0.325, 0.75), (0.325, 0.73333335), (0.325, 0.73333335), (0.325, 0.75), (0.31666666, 0.75), (0.31666666, 0.73333335), (0.31666666, 0.73333335), (0.31666666, 0.75), (0.30833334, 0.75), (0.30833334, 0.73333335), (0.30833334, 0.73333335), (0.30833334, 0.75), (0.3, 0.75), (0.3, 0.73333335), (0.3, 0.73333335), (0.3, 0.75), (0.29166666, 0.75), (0.29166666, 0.73333335), (0.29166666, 0.73333335), (0.29166666, 0.75), (0.28333333, 0.75), (0.28333333, 0.73333335), (0.28333333, 0.73333335), (0.28333333, 0.75), (0.275, 0.75), (0.275, 0.73333335), (0.275, 0.73333335), (0.275, 0.75), (0.26666668, 0.75), (0.26666668, 0.73333335), (0.26666668, 0.73333335), (0.26666668, 0.75), (0.25833333, 0.75), (0.25833333, 0.73333335), (0.25833333, 0.73333335), (0.25833333, 0.75), (0.25, 0.75), (0.25, 0.73333335), (0.25, 0.73333335), (0.25, 0.75), (0.24166666, 0.75), (0.24166666, 0.73333335), (0.24166666, 0.73333335), (0.24166666, 0.75), (0.23333333, 0.75), (0.23333333, 0.73333335), (0.23333333, 0.73333335), (0.23333333, 0.75), (0.225, 0.75), (0.225, 0.73333335), (0.225, 0.73333335), (0.225, 0.75), (0.21666667, 0.75), (0.21666667, 0.73333335), (0.21666667, 0.73333335), (0.21666667, 0.75), (0.20833333, 0.75), (0.20833333, 0.73333335), (0.20833333, 0.73333335), (0.20833333, 0.75), (0.2, 0.75), (0.2, 0.73333335), (0.2, 0.73333335), (0.2, 0.75), (0.19166666, 0.75), (0.19166666, 0.73333335), (0.19166666, 0.73333335), (0.19166666, 0.75), (0.18333334, 0.75), (0.18333334, 0.73333335), (0.18333334, 0.73333335), (0.18333334, 0.75), (0.175, 0.75), (0.175, 0.73333335), (0.175, 0.73333335), (0.175, 0.75), (0.16666667, 0.75), (0.16666667, 0.73333335), (0.16666667, 0.73333335), (0.16666667, 0.75), (0.15833333, 0.75), (0.15833333, 0.73333335), (0.15833333, 0.73333335), (0.15833333, 0.75), (0.15, 0.75), (0.15, 0.73333335), (0.15, 0.73333335), (0.15, 0.75), (0.14166667, 0.75), (0.14166667, 0.73333335), (0.14166667, 0.73333335), (0.14166667, 0.75), (0.13333334, 0.75), (0.13333334, 0.73333335), (0.13333334, 0.73333335), (0.13333334, 0.75), (0.125, 0.75), (0.125, 0.73333335), (0.125, 0.73333335), (0.125, 0.75), (0.11666667, 0.75), (0.11666667, 0.73333335), (0.11666667, 0.73333335), (0.11666667, 0.75), (0.108333334, 0.75), (0.108333334, 0.73333335), (0.108333334, 0.73333335), (0.108333334, 0.75), (0.1, 0.75), (0.1, 0.73333335), (0.1, 0.73333335), (0.1, 0.75), (0.09166667, 0.75), (0.09166667, 0.73333335), (0.09166667, 0.73333335), (0.09166667, 0.75), (0.083333336, 0.75), (0.083333336, 0.73333335), (0.083333336, 0.73333335), (0.083333336, 0.75), (0.075, 0.75), (0.075, 0.73333335), (0.075, 0.73333335), (0.075, 0.75), (0.06666667, 0.75), (0.06666667, 0.73333335), (0.06666667, 0.73333335), (0.06666667, 0.75), (0.058333334, 0.75), (0.058333334, 0.73333335), (0.058333334, 0.73333335), (0.058333334, 0.75), (0.05, 0.75), (0.05, 0.73333335), (0.05, 0.73333335), (0.05, 0.75), (0.041666668, 0.75), (0.041666668, 0.73333335), (0.041666668, 0.73333335), (0.041666668, 0.75), (0.033333335, 0.75), (0.033333335, 0.73333335), (0.033333335, 0.73333335), (0.033333335, 0.75), (0.025, 0.75), (0.025, 0.73333335), (0.025, 0.73333335), (0.025, 0.75), (0.016666668, 0.75), (0.016666668, 0.73333335), (0.016666668, 0.73333335), (0.016666668, 0.75), (0.008333334, 0.75), (0.008333334, 0.73333335), (0.008333334, 0.73333335), (0.008333334, 0.75), (0, 0.75), (0, 0.73333335), (1, 0.75), (1, 0.76666665), (0.9916667, 0.76666665), (0.9916667, 0.75), (0.9916667, 0.75), (0.9916667, 0.76666665), (0.98333335, 0.76666665), (0.98333335, 0.75), (0.98333335, 0.75), (0.98333335, 0.76666665), (0.975, 0.76666665), (0.975, 0.75), (0.975, 0.75), (0.975, 0.76666665), (0.96666664, 0.76666665), (0.96666664, 0.75), (0.96666664, 0.75), (0.96666664, 0.76666665), (0.9583333, 0.76666665), (0.9583333, 0.75), (0.9583333, 0.75), (0.9583333, 0.76666665), (0.95, 0.76666665), (0.95, 0.75), (0.95, 0.75), (0.95, 0.76666665), (0.94166666, 0.76666665), (0.94166666, 0.75), (0.94166666, 0.75), (0.94166666, 0.76666665), (0.93333334, 0.76666665), (0.93333334, 0.75), (0.93333334, 0.75), (0.93333334, 0.76666665), (0.925, 0.76666665), (0.925, 0.75), (0.925, 0.75), (0.925, 0.76666665), (0.9166667, 0.76666665), (0.9166667, 0.75), (0.9166667, 0.75), (0.9166667, 0.76666665), (0.90833336, 0.76666665), (0.90833336, 0.75), (0.90833336, 0.75), (0.90833336, 0.76666665), (0.9, 0.76666665), (0.9, 0.75), (0.9, 0.75), (0.9, 0.76666665), (0.89166665, 0.76666665), (0.89166665, 0.75), (0.89166665, 0.75), (0.89166665, 0.76666665), (0.8833333, 0.76666665), (0.8833333, 0.75), (0.8833333, 0.75), (0.8833333, 0.76666665), (0.875, 0.76666665), (0.875, 0.75), (0.875, 0.75), (0.875, 0.76666665), (0.8666667, 0.76666665), (0.8666667, 0.75), (0.8666667, 0.75), (0.8666667, 0.76666665), (0.85833335, 0.76666665), (0.85833335, 0.75), (0.85833335, 0.75), (0.85833335, 0.76666665), (0.85, 0.76666665), (0.85, 0.75), (0.85, 0.75), (0.85, 0.76666665), (0.84166664, 0.76666665), (0.84166664, 0.75), (0.84166664, 0.75), (0.84166664, 0.76666665), (0.8333333, 0.76666665), (0.8333333, 0.75), (0.8333333, 0.75), (0.8333333, 0.76666665), (0.825, 0.76666665), (0.825, 0.75), (0.825, 0.75), (0.825, 0.76666665), (0.81666666, 0.76666665), (0.81666666, 0.75), (0.81666666, 0.75), (0.81666666, 0.76666665), (0.80833334, 0.76666665), (0.80833334, 0.75), (0.80833334, 0.75), (0.80833334, 0.76666665), (0.8, 0.76666665), (0.8, 0.75), (0.8, 0.75), (0.8, 0.76666665), (0.7916667, 0.76666665), (0.7916667, 0.75), (0.7916667, 0.75), (0.7916667, 0.76666665), (0.78333336, 0.76666665), (0.78333336, 0.75), (0.78333336, 0.75), (0.78333336, 0.76666665), (0.775, 0.76666665), (0.775, 0.75), (0.775, 0.75), (0.775, 0.76666665), (0.76666665, 0.76666665), (0.76666665, 0.75), (0.76666665, 0.75), (0.76666665, 0.76666665), (0.7583333, 0.76666665), (0.7583333, 0.75), (0.7583333, 0.75), (0.7583333, 0.76666665), (0.75, 0.76666665), (0.75, 0.75), (0.75, 0.75), (0.75, 0.76666665), (0.7416667, 0.76666665), (0.7416667, 0.75), (0.7416667, 0.75), (0.7416667, 0.76666665), (0.73333335, 0.76666665), (0.73333335, 0.75), (0.73333335, 0.75), (0.73333335, 0.76666665), (0.725, 0.76666665), (0.725, 0.75), (0.725, 0.75), (0.725, 0.76666665), (0.71666664, 0.76666665), (0.71666664, 0.75), (0.71666664, 0.75), (0.71666664, 0.76666665), (0.7083333, 0.76666665), (0.7083333, 0.75), (0.7083333, 0.75), (0.7083333, 0.76666665), (0.7, 0.76666665), (0.7, 0.75), (0.7, 0.75), (0.7, 0.76666665), (0.69166666, 0.76666665), (0.69166666, 0.75), (0.69166666, 0.75), (0.69166666, 0.76666665), (0.68333334, 0.76666665), (0.68333334, 0.75), (0.68333334, 0.75), (0.68333334, 0.76666665), (0.675, 0.76666665), (0.675, 0.75), (0.675, 0.75), (0.675, 0.76666665), (0.6666667, 0.76666665), (0.6666667, 0.75), (0.6666667, 0.75), (0.6666667, 0.76666665), (0.65833336, 0.76666665), (0.65833336, 0.75), (0.65833336, 0.75), (0.65833336, 0.76666665), (0.65, 0.76666665), (0.65, 0.75), (0.65, 0.75), (0.65, 0.76666665), (0.64166665, 0.76666665), (0.64166665, 0.75), (0.64166665, 0.75), (0.64166665, 0.76666665), (0.6333333, 0.76666665), (0.6333333, 0.75), (0.6333333, 0.75), (0.6333333, 0.76666665), (0.625, 0.76666665), (0.625, 0.75), (0.625, 0.75), (0.625, 0.76666665), (0.6166667, 0.76666665), (0.6166667, 0.75), (0.6166667, 0.75), (0.6166667, 0.76666665), (0.60833335, 0.76666665), (0.60833335, 0.75), (0.60833335, 0.75), (0.60833335, 0.76666665), (0.6, 0.76666665), (0.6, 0.75), (0.6, 0.75), (0.6, 0.76666665), (0.59166664, 0.76666665), (0.59166664, 0.75), (0.59166664, 0.75), (0.59166664, 0.76666665), (0.5833333, 0.76666665), (0.5833333, 0.75), (0.5833333, 0.75), (0.5833333, 0.76666665), (0.575, 0.76666665), (0.575, 0.75), (0.575, 0.75), (0.575, 0.76666665), (0.56666666, 0.76666665), (0.56666666, 0.75), (0.56666666, 0.75), (0.56666666, 0.76666665), (0.55833334, 0.76666665), (0.55833334, 0.75), (0.55833334, 0.75), (0.55833334, 0.76666665), (0.55, 0.76666665), (0.55, 0.75), (0.55, 0.75), (0.55, 0.76666665), (0.5416667, 0.76666665), (0.5416667, 0.75), (0.5416667, 0.75), (0.5416667, 0.76666665), (0.53333336, 0.76666665), (0.53333336, 0.75), (0.53333336, 0.75), (0.53333336, 0.76666665), (0.525, 0.76666665), (0.525, 0.75), (0.525, 0.75), (0.525, 0.76666665), (0.51666665, 0.76666665), (0.51666665, 0.75), (0.51666665, 0.75), (0.51666665, 0.76666665), (0.5083333, 0.76666665), (0.5083333, 0.75), (0.5083333, 0.75), (0.5083333, 0.76666665), (0.5, 0.76666665), (0.5, 0.75), (0.5, 0.75), (0.5, 0.76666665), (0.49166667, 0.76666665), (0.49166667, 0.75), (0.49166667, 0.75), (0.49166667, 0.76666665), (0.48333332, 0.76666665), (0.48333332, 0.75), (0.48333332, 0.75), (0.48333332, 0.76666665), (0.475, 0.76666665), (0.475, 0.75), (0.475, 0.75), (0.475, 0.76666665), (0.46666667, 0.76666665), (0.46666667, 0.75), (0.46666667, 0.75), (0.46666667, 0.76666665), (0.45833334, 0.76666665), (0.45833334, 0.75), (0.45833334, 0.75), (0.45833334, 0.76666665), (0.45, 0.76666665), (0.45, 0.75), (0.45, 0.75), (0.45, 0.76666665), (0.44166666, 0.76666665), (0.44166666, 0.75), (0.44166666, 0.75), (0.44166666, 0.76666665), (0.43333334, 0.76666665), (0.43333334, 0.75), (0.43333334, 0.75), (0.43333334, 0.76666665), (0.425, 0.76666665), (0.425, 0.75), (0.425, 0.75), (0.425, 0.76666665), (0.41666666, 0.76666665), (0.41666666, 0.75), (0.41666666, 0.75), (0.41666666, 0.76666665), (0.40833333, 0.76666665), (0.40833333, 0.75), (0.40833333, 0.75), (0.40833333, 0.76666665), (0.4, 0.76666665), (0.4, 0.75), (0.4, 0.75), (0.4, 0.76666665), (0.39166668, 0.76666665), (0.39166668, 0.75), (0.39166668, 0.75), (0.39166668, 0.76666665), (0.38333333, 0.76666665), (0.38333333, 0.75), (0.38333333, 0.75), (0.38333333, 0.76666665), (0.375, 0.76666665), (0.375, 0.75), (0.375, 0.75), (0.375, 0.76666665), (0.36666667, 0.76666665), (0.36666667, 0.75), (0.36666667, 0.75), (0.36666667, 0.76666665), (0.35833332, 0.76666665), (0.35833332, 0.75), (0.35833332, 0.75), (0.35833332, 0.76666665), (0.35, 0.76666665), (0.35, 0.75), (0.35, 0.75), (0.35, 0.76666665), (0.34166667, 0.76666665), (0.34166667, 0.75), (0.34166667, 0.75), (0.34166667, 0.76666665), (0.33333334, 0.76666665), (0.33333334, 0.75), (0.33333334, 0.75), (0.33333334, 0.76666665), (0.325, 0.76666665), (0.325, 0.75), (0.325, 0.75), (0.325, 0.76666665), (0.31666666, 0.76666665), (0.31666666, 0.75), (0.31666666, 0.75), (0.31666666, 0.76666665), (0.30833334, 0.76666665), (0.30833334, 0.75), (0.30833334, 0.75), (0.30833334, 0.76666665), (0.3, 0.76666665), (0.3, 0.75), (0.3, 0.75), (0.3, 0.76666665), (0.29166666, 0.76666665), (0.29166666, 0.75), (0.29166666, 0.75), (0.29166666, 0.76666665), (0.28333333, 0.76666665), (0.28333333, 0.75), (0.28333333, 0.75), (0.28333333, 0.76666665), (0.275, 0.76666665), (0.275, 0.75), (0.275, 0.75), (0.275, 0.76666665), (0.26666668, 0.76666665), (0.26666668, 0.75), (0.26666668, 0.75), (0.26666668, 0.76666665), (0.25833333, 0.76666665), (0.25833333, 0.75), (0.25833333, 0.75), (0.25833333, 0.76666665), (0.25, 0.76666665), (0.25, 0.75), (0.25, 0.75), (0.25, 0.76666665), (0.24166666, 0.76666665), (0.24166666, 0.75), (0.24166666, 0.75), (0.24166666, 0.76666665), (0.23333333, 0.76666665), (0.23333333, 0.75), (0.23333333, 0.75), (0.23333333, 0.76666665), (0.225, 0.76666665), (0.225, 0.75), (0.225, 0.75), (0.225, 0.76666665), (0.21666667, 0.76666665), (0.21666667, 0.75), (0.21666667, 0.75), (0.21666667, 0.76666665), (0.20833333, 0.76666665), (0.20833333, 0.75), (0.20833333, 0.75), (0.20833333, 0.76666665), (0.2, 0.76666665), (0.2, 0.75), (0.2, 0.75), (0.2, 0.76666665), (0.19166666, 0.76666665), (0.19166666, 0.75), (0.19166666, 0.75), (0.19166666, 0.76666665), (0.18333334, 0.76666665), (0.18333334, 0.75), (0.18333334, 0.75), (0.18333334, 0.76666665), (0.175, 0.76666665), (0.175, 0.75), (0.175, 0.75), (0.175, 0.76666665), (0.16666667, 0.76666665), (0.16666667, 0.75), (0.16666667, 0.75), (0.16666667, 0.76666665), (0.15833333, 0.76666665), (0.15833333, 0.75), (0.15833333, 0.75), (0.15833333, 0.76666665), (0.15, 0.76666665), (0.15, 0.75), (0.15, 0.75), (0.15, 0.76666665), (0.14166667, 0.76666665), (0.14166667, 0.75), (0.14166667, 0.75), (0.14166667, 0.76666665), (0.13333334, 0.76666665), (0.13333334, 0.75), (0.13333334, 0.75), (0.13333334, 0.76666665), (0.125, 0.76666665), (0.125, 0.75), (0.125, 0.75), (0.125, 0.76666665), (0.11666667, 0.76666665), (0.11666667, 0.75), (0.11666667, 0.75), (0.11666667, 0.76666665), (0.108333334, 0.76666665), (0.108333334, 0.75), (0.108333334, 0.75), (0.108333334, 0.76666665), (0.1, 0.76666665), (0.1, 0.75), (0.1, 0.75), (0.1, 0.76666665), (0.09166667, 0.76666665), (0.09166667, 0.75), (0.09166667, 0.75), (0.09166667, 0.76666665), (0.083333336, 0.76666665), (0.083333336, 0.75), (0.083333336, 0.75), (0.083333336, 0.76666665), (0.075, 0.76666665), (0.075, 0.75), (0.075, 0.75), (0.075, 0.76666665), (0.06666667, 0.76666665), (0.06666667, 0.75), (0.06666667, 0.75), (0.06666667, 0.76666665), (0.058333334, 0.76666665), (0.058333334, 0.75), (0.058333334, 0.75), (0.058333334, 0.76666665), (0.05, 0.76666665), (0.05, 0.75), (0.05, 0.75), (0.05, 0.76666665), (0.041666668, 0.76666665), (0.041666668, 0.75), (0.041666668, 0.75), (0.041666668, 0.76666665), (0.033333335, 0.76666665), (0.033333335, 0.75), (0.033333335, 0.75), (0.033333335, 0.76666665), (0.025, 0.76666665), (0.025, 0.75), (0.025, 0.75), (0.025, 0.76666665), (0.016666668, 0.76666665), (0.016666668, 0.75), (0.016666668, 0.75), (0.016666668, 0.76666665), (0.008333334, 0.76666665), (0.008333334, 0.75), (0.008333334, 0.75), (0.008333334, 0.76666665), (0, 0.76666665), (0, 0.75), (1, 0.76666665), (1, 0.78333336), (0.9916667, 0.78333336), (0.9916667, 0.76666665), (0.9916667, 0.76666665), (0.9916667, 0.78333336), (0.98333335, 0.78333336), (0.98333335, 0.76666665), (0.98333335, 0.76666665), (0.98333335, 0.78333336), (0.975, 0.78333336), (0.975, 0.76666665), (0.975, 0.76666665), (0.975, 0.78333336), (0.96666664, 0.78333336), (0.96666664, 0.76666665), (0.96666664, 0.76666665), (0.96666664, 0.78333336), (0.9583333, 0.78333336), (0.9583333, 0.76666665), (0.9583333, 0.76666665), (0.9583333, 0.78333336), (0.95, 0.78333336), (0.95, 0.76666665), (0.95, 0.76666665), (0.95, 0.78333336), (0.94166666, 0.78333336), (0.94166666, 0.76666665), (0.94166666, 0.76666665), (0.94166666, 0.78333336), (0.93333334, 0.78333336), (0.93333334, 0.76666665), (0.93333334, 0.76666665), (0.93333334, 0.78333336), (0.925, 0.78333336), (0.925, 0.76666665), (0.925, 0.76666665), (0.925, 0.78333336), (0.9166667, 0.78333336), (0.9166667, 0.76666665), (0.9166667, 0.76666665), (0.9166667, 0.78333336), (0.90833336, 0.78333336), (0.90833336, 0.76666665), (0.90833336, 0.76666665), (0.90833336, 0.78333336), (0.9, 0.78333336), (0.9, 0.76666665), (0.9, 0.76666665), (0.9, 0.78333336), (0.89166665, 0.78333336), (0.89166665, 0.76666665), (0.89166665, 0.76666665), (0.89166665, 0.78333336), (0.8833333, 0.78333336), (0.8833333, 0.76666665), (0.8833333, 0.76666665), (0.8833333, 0.78333336), (0.875, 0.78333336), (0.875, 0.76666665), (0.875, 0.76666665), (0.875, 0.78333336), (0.8666667, 0.78333336), (0.8666667, 0.76666665), (0.8666667, 0.76666665), (0.8666667, 0.78333336), (0.85833335, 0.78333336), (0.85833335, 0.76666665), (0.85833335, 0.76666665), (0.85833335, 0.78333336), (0.85, 0.78333336), (0.85, 0.76666665), (0.85, 0.76666665), (0.85, 0.78333336), (0.84166664, 0.78333336), (0.84166664, 0.76666665), (0.84166664, 0.76666665), (0.84166664, 0.78333336), (0.8333333, 0.78333336), (0.8333333, 0.76666665), (0.8333333, 0.76666665), (0.8333333, 0.78333336), (0.825, 0.78333336), (0.825, 0.76666665), (0.825, 0.76666665), (0.825, 0.78333336), (0.81666666, 0.78333336), (0.81666666, 0.76666665), (0.81666666, 0.76666665), (0.81666666, 0.78333336), (0.80833334, 0.78333336), (0.80833334, 0.76666665), (0.80833334, 0.76666665), (0.80833334, 0.78333336), (0.8, 0.78333336), (0.8, 0.76666665), (0.8, 0.76666665), (0.8, 0.78333336), (0.7916667, 0.78333336), (0.7916667, 0.76666665), (0.7916667, 0.76666665), (0.7916667, 0.78333336), (0.78333336, 0.78333336), (0.78333336, 0.76666665), (0.78333336, 0.76666665), (0.78333336, 0.78333336), (0.775, 0.78333336), (0.775, 0.76666665), (0.775, 0.76666665), (0.775, 0.78333336), (0.76666665, 0.78333336), (0.76666665, 0.76666665), (0.76666665, 0.76666665), (0.76666665, 0.78333336), (0.7583333, 0.78333336), (0.7583333, 0.76666665), (0.7583333, 0.76666665), (0.7583333, 0.78333336), (0.75, 0.78333336), (0.75, 0.76666665), (0.75, 0.76666665), (0.75, 0.78333336), (0.7416667, 0.78333336), (0.7416667, 0.76666665), (0.7416667, 0.76666665), (0.7416667, 0.78333336), (0.73333335, 0.78333336), (0.73333335, 0.76666665), (0.73333335, 0.76666665), (0.73333335, 0.78333336), (0.725, 0.78333336), (0.725, 0.76666665), (0.725, 0.76666665), (0.725, 0.78333336), (0.71666664, 0.78333336), (0.71666664, 0.76666665), (0.71666664, 0.76666665), (0.71666664, 0.78333336), (0.7083333, 0.78333336), (0.7083333, 0.76666665), (0.7083333, 0.76666665), (0.7083333, 0.78333336), (0.7, 0.78333336), (0.7, 0.76666665), (0.7, 0.76666665), (0.7, 0.78333336), (0.69166666, 0.78333336), (0.69166666, 0.76666665), (0.69166666, 0.76666665), (0.69166666, 0.78333336), (0.68333334, 0.78333336), (0.68333334, 0.76666665), (0.68333334, 0.76666665), (0.68333334, 0.78333336), (0.675, 0.78333336), (0.675, 0.76666665), (0.675, 0.76666665), (0.675, 0.78333336), (0.6666667, 0.78333336), (0.6666667, 0.76666665), (0.6666667, 0.76666665), (0.6666667, 0.78333336), (0.65833336, 0.78333336), (0.65833336, 0.76666665), (0.65833336, 0.76666665), (0.65833336, 0.78333336), (0.65, 0.78333336), (0.65, 0.76666665), (0.65, 0.76666665), (0.65, 0.78333336), (0.64166665, 0.78333336), (0.64166665, 0.76666665), (0.64166665, 0.76666665), (0.64166665, 0.78333336), (0.6333333, 0.78333336), (0.6333333, 0.76666665), (0.6333333, 0.76666665), (0.6333333, 0.78333336), (0.625, 0.78333336), (0.625, 0.76666665), (0.625, 0.76666665), (0.625, 0.78333336), (0.6166667, 0.78333336), (0.6166667, 0.76666665), (0.6166667, 0.76666665), (0.6166667, 0.78333336), (0.60833335, 0.78333336), (0.60833335, 0.76666665), (0.60833335, 0.76666665), (0.60833335, 0.78333336), (0.6, 0.78333336), (0.6, 0.76666665), (0.6, 0.76666665), (0.6, 0.78333336), (0.59166664, 0.78333336), (0.59166664, 0.76666665), (0.59166664, 0.76666665), (0.59166664, 0.78333336), (0.5833333, 0.78333336), (0.5833333, 0.76666665), (0.5833333, 0.76666665), (0.5833333, 0.78333336), (0.575, 0.78333336), (0.575, 0.76666665), (0.575, 0.76666665), (0.575, 0.78333336), (0.56666666, 0.78333336), (0.56666666, 0.76666665), (0.56666666, 0.76666665), (0.56666666, 0.78333336), (0.55833334, 0.78333336), (0.55833334, 0.76666665), (0.55833334, 0.76666665), (0.55833334, 0.78333336), (0.55, 0.78333336), (0.55, 0.76666665), (0.55, 0.76666665), (0.55, 0.78333336), (0.5416667, 0.78333336), (0.5416667, 0.76666665), (0.5416667, 0.76666665), (0.5416667, 0.78333336), (0.53333336, 0.78333336), (0.53333336, 0.76666665), (0.53333336, 0.76666665), (0.53333336, 0.78333336), (0.525, 0.78333336), (0.525, 0.76666665), (0.525, 0.76666665), (0.525, 0.78333336), (0.51666665, 0.78333336), (0.51666665, 0.76666665), (0.51666665, 0.76666665), (0.51666665, 0.78333336), (0.5083333, 0.78333336), (0.5083333, 0.76666665), (0.5083333, 0.76666665), (0.5083333, 0.78333336), (0.5, 0.78333336), (0.5, 0.76666665), (0.5, 0.76666665), (0.5, 0.78333336), (0.49166667, 0.78333336), (0.49166667, 0.76666665), (0.49166667, 0.76666665), (0.49166667, 0.78333336), (0.48333332, 0.78333336), (0.48333332, 0.76666665), (0.48333332, 0.76666665), (0.48333332, 0.78333336), (0.475, 0.78333336), (0.475, 0.76666665), (0.475, 0.76666665), (0.475, 0.78333336), (0.46666667, 0.78333336), (0.46666667, 0.76666665), (0.46666667, 0.76666665), (0.46666667, 0.78333336), (0.45833334, 0.78333336), (0.45833334, 0.76666665), (0.45833334, 0.76666665), (0.45833334, 0.78333336), (0.45, 0.78333336), (0.45, 0.76666665), (0.45, 0.76666665), (0.45, 0.78333336), (0.44166666, 0.78333336), (0.44166666, 0.76666665), (0.44166666, 0.76666665), (0.44166666, 0.78333336), (0.43333334, 0.78333336), (0.43333334, 0.76666665), (0.43333334, 0.76666665), (0.43333334, 0.78333336), (0.425, 0.78333336), (0.425, 0.76666665), (0.425, 0.76666665), (0.425, 0.78333336), (0.41666666, 0.78333336), (0.41666666, 0.76666665), (0.41666666, 0.76666665), (0.41666666, 0.78333336), (0.40833333, 0.78333336), (0.40833333, 0.76666665), (0.40833333, 0.76666665), (0.40833333, 0.78333336), (0.4, 0.78333336), (0.4, 0.76666665), (0.4, 0.76666665), (0.4, 0.78333336), (0.39166668, 0.78333336), (0.39166668, 0.76666665), (0.39166668, 0.76666665), (0.39166668, 0.78333336), (0.38333333, 0.78333336), (0.38333333, 0.76666665), (0.38333333, 0.76666665), (0.38333333, 0.78333336), (0.375, 0.78333336), (0.375, 0.76666665), (0.375, 0.76666665), (0.375, 0.78333336), (0.36666667, 0.78333336), (0.36666667, 0.76666665), (0.36666667, 0.76666665), (0.36666667, 0.78333336), (0.35833332, 0.78333336), (0.35833332, 0.76666665), (0.35833332, 0.76666665), (0.35833332, 0.78333336), (0.35, 0.78333336), (0.35, 0.76666665), (0.35, 0.76666665), (0.35, 0.78333336), (0.34166667, 0.78333336), (0.34166667, 0.76666665), (0.34166667, 0.76666665), (0.34166667, 0.78333336), (0.33333334, 0.78333336), (0.33333334, 0.76666665), (0.33333334, 0.76666665), (0.33333334, 0.78333336), (0.325, 0.78333336), (0.325, 0.76666665), (0.325, 0.76666665), (0.325, 0.78333336), (0.31666666, 0.78333336), (0.31666666, 0.76666665), (0.31666666, 0.76666665), (0.31666666, 0.78333336), (0.30833334, 0.78333336), (0.30833334, 0.76666665), (0.30833334, 0.76666665), (0.30833334, 0.78333336), (0.3, 0.78333336), (0.3, 0.76666665), (0.3, 0.76666665), (0.3, 0.78333336), (0.29166666, 0.78333336), (0.29166666, 0.76666665), (0.29166666, 0.76666665), (0.29166666, 0.78333336), (0.28333333, 0.78333336), (0.28333333, 0.76666665), (0.28333333, 0.76666665), (0.28333333, 0.78333336), (0.275, 0.78333336), (0.275, 0.76666665), (0.275, 0.76666665), (0.275, 0.78333336), (0.26666668, 0.78333336), (0.26666668, 0.76666665), (0.26666668, 0.76666665), (0.26666668, 0.78333336), (0.25833333, 0.78333336), (0.25833333, 0.76666665), (0.25833333, 0.76666665), (0.25833333, 0.78333336), (0.25, 0.78333336), (0.25, 0.76666665), (0.25, 0.76666665), (0.25, 0.78333336), (0.24166666, 0.78333336), (0.24166666, 0.76666665), (0.24166666, 0.76666665), (0.24166666, 0.78333336), (0.23333333, 0.78333336), (0.23333333, 0.76666665), (0.23333333, 0.76666665), (0.23333333, 0.78333336), (0.225, 0.78333336), (0.225, 0.76666665), (0.225, 0.76666665), (0.225, 0.78333336), (0.21666667, 0.78333336), (0.21666667, 0.76666665), (0.21666667, 0.76666665), (0.21666667, 0.78333336), (0.20833333, 0.78333336), (0.20833333, 0.76666665), (0.20833333, 0.76666665), (0.20833333, 0.78333336), (0.2, 0.78333336), (0.2, 0.76666665), (0.2, 0.76666665), (0.2, 0.78333336), (0.19166666, 0.78333336), (0.19166666, 0.76666665), (0.19166666, 0.76666665), (0.19166666, 0.78333336), (0.18333334, 0.78333336), (0.18333334, 0.76666665), (0.18333334, 0.76666665), (0.18333334, 0.78333336), (0.175, 0.78333336), (0.175, 0.76666665), (0.175, 0.76666665), (0.175, 0.78333336), (0.16666667, 0.78333336), (0.16666667, 0.76666665), (0.16666667, 0.76666665), (0.16666667, 0.78333336), (0.15833333, 0.78333336), (0.15833333, 0.76666665), (0.15833333, 0.76666665), (0.15833333, 0.78333336), (0.15, 0.78333336), (0.15, 0.76666665), (0.15, 0.76666665), (0.15, 0.78333336), (0.14166667, 0.78333336), (0.14166667, 0.76666665), (0.14166667, 0.76666665), (0.14166667, 0.78333336), (0.13333334, 0.78333336), (0.13333334, 0.76666665), (0.13333334, 0.76666665), (0.13333334, 0.78333336), (0.125, 0.78333336), (0.125, 0.76666665), (0.125, 0.76666665), (0.125, 0.78333336), (0.11666667, 0.78333336), (0.11666667, 0.76666665), (0.11666667, 0.76666665), (0.11666667, 0.78333336), (0.108333334, 0.78333336), (0.108333334, 0.76666665), (0.108333334, 0.76666665), (0.108333334, 0.78333336), (0.1, 0.78333336), (0.1, 0.76666665), (0.1, 0.76666665), (0.1, 0.78333336), (0.09166667, 0.78333336), (0.09166667, 0.76666665), (0.09166667, 0.76666665), (0.09166667, 0.78333336), (0.083333336, 0.78333336), (0.083333336, 0.76666665), (0.083333336, 0.76666665), (0.083333336, 0.78333336), (0.075, 0.78333336), (0.075, 0.76666665), (0.075, 0.76666665), (0.075, 0.78333336), (0.06666667, 0.78333336), (0.06666667, 0.76666665), (0.06666667, 0.76666665), (0.06666667, 0.78333336), (0.058333334, 0.78333336), (0.058333334, 0.76666665), (0.058333334, 0.76666665), (0.058333334, 0.78333336), (0.05, 0.78333336), (0.05, 0.76666665), (0.05, 0.76666665), (0.05, 0.78333336), (0.041666668, 0.78333336), (0.041666668, 0.76666665), (0.041666668, 0.76666665), (0.041666668, 0.78333336), (0.033333335, 0.78333336), (0.033333335, 0.76666665), (0.033333335, 0.76666665), (0.033333335, 0.78333336), (0.025, 0.78333336), (0.025, 0.76666665), (0.025, 0.76666665), (0.025, 0.78333336), (0.016666668, 0.78333336), (0.016666668, 0.76666665), (0.016666668, 0.76666665), (0.016666668, 0.78333336), (0.008333334, 0.78333336), (0.008333334, 0.76666665), (0.008333334, 0.76666665), (0.008333334, 0.78333336), (0, 0.78333336), (0, 0.76666665), (1, 0.78333336), (1, 0.8), (0.9916667, 0.8), (0.9916667, 0.78333336), (0.9916667, 0.78333336), (0.9916667, 0.8), (0.98333335, 0.8), (0.98333335, 0.78333336), (0.98333335, 0.78333336), (0.98333335, 0.8), (0.975, 0.8), (0.975, 0.78333336), (0.975, 0.78333336), (0.975, 0.8), (0.96666664, 0.8), (0.96666664, 0.78333336), (0.96666664, 0.78333336), (0.96666664, 0.8), (0.9583333, 0.8), (0.9583333, 0.78333336), (0.9583333, 0.78333336), (0.9583333, 0.8), (0.95, 0.8), (0.95, 0.78333336), (0.95, 0.78333336), (0.95, 0.8), (0.94166666, 0.8), (0.94166666, 0.78333336), (0.94166666, 0.78333336), (0.94166666, 0.8), (0.93333334, 0.8), (0.93333334, 0.78333336), (0.93333334, 0.78333336), (0.93333334, 0.8), (0.925, 0.8), (0.925, 0.78333336), (0.925, 0.78333336), (0.925, 0.8), (0.9166667, 0.8), (0.9166667, 0.78333336), (0.9166667, 0.78333336), (0.9166667, 0.8), (0.90833336, 0.8), (0.90833336, 0.78333336), (0.90833336, 0.78333336), (0.90833336, 0.8), (0.9, 0.8), (0.9, 0.78333336), (0.9, 0.78333336), (0.9, 0.8), (0.89166665, 0.8), (0.89166665, 0.78333336), (0.89166665, 0.78333336), (0.89166665, 0.8), (0.8833333, 0.8), (0.8833333, 0.78333336), (0.8833333, 0.78333336), (0.8833333, 0.8), (0.875, 0.8), (0.875, 0.78333336), (0.875, 0.78333336), (0.875, 0.8), (0.8666667, 0.8), (0.8666667, 0.78333336), (0.8666667, 0.78333336), (0.8666667, 0.8), (0.85833335, 0.8), (0.85833335, 0.78333336), (0.85833335, 0.78333336), (0.85833335, 0.8), (0.85, 0.8), (0.85, 0.78333336), (0.85, 0.78333336), (0.85, 0.8), (0.84166664, 0.8), (0.84166664, 0.78333336), (0.84166664, 0.78333336), (0.84166664, 0.8), (0.8333333, 0.8), (0.8333333, 0.78333336), (0.8333333, 0.78333336), (0.8333333, 0.8), (0.825, 0.8), (0.825, 0.78333336), (0.825, 0.78333336), (0.825, 0.8), (0.81666666, 0.8), (0.81666666, 0.78333336), (0.81666666, 0.78333336), (0.81666666, 0.8), (0.80833334, 0.8), (0.80833334, 0.78333336), (0.80833334, 0.78333336), (0.80833334, 0.8), (0.8, 0.8), (0.8, 0.78333336), (0.8, 0.78333336), (0.8, 0.8), (0.7916667, 0.8), (0.7916667, 0.78333336), (0.7916667, 0.78333336), (0.7916667, 0.8), (0.78333336, 0.8), (0.78333336, 0.78333336), (0.78333336, 0.78333336), (0.78333336, 0.8), (0.775, 0.8), (0.775, 0.78333336), (0.775, 0.78333336), (0.775, 0.8), (0.76666665, 0.8), (0.76666665, 0.78333336), (0.76666665, 0.78333336), (0.76666665, 0.8), (0.7583333, 0.8), (0.7583333, 0.78333336), (0.7583333, 0.78333336), (0.7583333, 0.8), (0.75, 0.8), (0.75, 0.78333336), (0.75, 0.78333336), (0.75, 0.8), (0.7416667, 0.8), (0.7416667, 0.78333336), (0.7416667, 0.78333336), (0.7416667, 0.8), (0.73333335, 0.8), (0.73333335, 0.78333336), (0.73333335, 0.78333336), (0.73333335, 0.8), (0.725, 0.8), (0.725, 0.78333336), (0.725, 0.78333336), (0.725, 0.8), (0.71666664, 0.8), (0.71666664, 0.78333336), (0.71666664, 0.78333336), (0.71666664, 0.8), (0.7083333, 0.8), (0.7083333, 0.78333336), (0.7083333, 0.78333336), (0.7083333, 0.8), (0.7, 0.8), (0.7, 0.78333336), (0.7, 0.78333336), (0.7, 0.8), (0.69166666, 0.8), (0.69166666, 0.78333336), (0.69166666, 0.78333336), (0.69166666, 0.8), (0.68333334, 0.8), (0.68333334, 0.78333336), (0.68333334, 0.78333336), (0.68333334, 0.8), (0.675, 0.8), (0.675, 0.78333336), (0.675, 0.78333336), (0.675, 0.8), (0.6666667, 0.8), (0.6666667, 0.78333336), (0.6666667, 0.78333336), (0.6666667, 0.8), (0.65833336, 0.8), (0.65833336, 0.78333336), (0.65833336, 0.78333336), (0.65833336, 0.8), (0.65, 0.8), (0.65, 0.78333336), (0.65, 0.78333336), (0.65, 0.8), (0.64166665, 0.8), (0.64166665, 0.78333336), (0.64166665, 0.78333336), (0.64166665, 0.8), (0.6333333, 0.8), (0.6333333, 0.78333336), (0.6333333, 0.78333336), (0.6333333, 0.8), (0.625, 0.8), (0.625, 0.78333336), (0.625, 0.78333336), (0.625, 0.8), (0.6166667, 0.8), (0.6166667, 0.78333336), (0.6166667, 0.78333336), (0.6166667, 0.8), (0.60833335, 0.8), (0.60833335, 0.78333336), (0.60833335, 0.78333336), (0.60833335, 0.8), (0.6, 0.8), (0.6, 0.78333336), (0.6, 0.78333336), (0.6, 0.8), (0.59166664, 0.8), (0.59166664, 0.78333336), (0.59166664, 0.78333336), (0.59166664, 0.8), (0.5833333, 0.8), (0.5833333, 0.78333336), (0.5833333, 0.78333336), (0.5833333, 0.8), (0.575, 0.8), (0.575, 0.78333336), (0.575, 0.78333336), (0.575, 0.8), (0.56666666, 0.8), (0.56666666, 0.78333336), (0.56666666, 0.78333336), (0.56666666, 0.8), (0.55833334, 0.8), (0.55833334, 0.78333336), (0.55833334, 0.78333336), (0.55833334, 0.8), (0.55, 0.8), (0.55, 0.78333336), (0.55, 0.78333336), (0.55, 0.8), (0.5416667, 0.8), (0.5416667, 0.78333336), (0.5416667, 0.78333336), (0.5416667, 0.8), (0.53333336, 0.8), (0.53333336, 0.78333336), (0.53333336, 0.78333336), (0.53333336, 0.8), (0.525, 0.8), (0.525, 0.78333336), (0.525, 0.78333336), (0.525, 0.8), (0.51666665, 0.8), (0.51666665, 0.78333336), (0.51666665, 0.78333336), (0.51666665, 0.8), (0.5083333, 0.8), (0.5083333, 0.78333336), (0.5083333, 0.78333336), (0.5083333, 0.8), (0.5, 0.8), (0.5, 0.78333336), (0.5, 0.78333336), (0.5, 0.8), (0.49166667, 0.8), (0.49166667, 0.78333336), (0.49166667, 0.78333336), (0.49166667, 0.8), (0.48333332, 0.8), (0.48333332, 0.78333336), (0.48333332, 0.78333336), (0.48333332, 0.8), (0.475, 0.8), (0.475, 0.78333336), (0.475, 0.78333336), (0.475, 0.8), (0.46666667, 0.8), (0.46666667, 0.78333336), (0.46666667, 0.78333336), (0.46666667, 0.8), (0.45833334, 0.8), (0.45833334, 0.78333336), (0.45833334, 0.78333336), (0.45833334, 0.8), (0.45, 0.8), (0.45, 0.78333336), (0.45, 0.78333336), (0.45, 0.8), (0.44166666, 0.8), (0.44166666, 0.78333336), (0.44166666, 0.78333336), (0.44166666, 0.8), (0.43333334, 0.8), (0.43333334, 0.78333336), (0.43333334, 0.78333336), (0.43333334, 0.8), (0.425, 0.8), (0.425, 0.78333336), (0.425, 0.78333336), (0.425, 0.8), (0.41666666, 0.8), (0.41666666, 0.78333336), (0.41666666, 0.78333336), (0.41666666, 0.8), (0.40833333, 0.8), (0.40833333, 0.78333336), (0.40833333, 0.78333336), (0.40833333, 0.8), (0.4, 0.8), (0.4, 0.78333336), (0.4, 0.78333336), (0.4, 0.8), (0.39166668, 0.8), (0.39166668, 0.78333336), (0.39166668, 0.78333336), (0.39166668, 0.8), (0.38333333, 0.8), (0.38333333, 0.78333336), (0.38333333, 0.78333336), (0.38333333, 0.8), (0.375, 0.8), (0.375, 0.78333336), (0.375, 0.78333336), (0.375, 0.8), (0.36666667, 0.8), (0.36666667, 0.78333336), (0.36666667, 0.78333336), (0.36666667, 0.8), (0.35833332, 0.8), (0.35833332, 0.78333336), (0.35833332, 0.78333336), (0.35833332, 0.8), (0.35, 0.8), (0.35, 0.78333336), (0.35, 0.78333336), (0.35, 0.8), (0.34166667, 0.8), (0.34166667, 0.78333336), (0.34166667, 0.78333336), (0.34166667, 0.8), (0.33333334, 0.8), (0.33333334, 0.78333336), (0.33333334, 0.78333336), (0.33333334, 0.8), (0.325, 0.8), (0.325, 0.78333336), (0.325, 0.78333336), (0.325, 0.8), (0.31666666, 0.8), (0.31666666, 0.78333336), (0.31666666, 0.78333336), (0.31666666, 0.8), (0.30833334, 0.8), (0.30833334, 0.78333336), (0.30833334, 0.78333336), (0.30833334, 0.8), (0.3, 0.8), (0.3, 0.78333336), (0.3, 0.78333336), (0.3, 0.8), (0.29166666, 0.8), (0.29166666, 0.78333336), (0.29166666, 0.78333336), (0.29166666, 0.8), (0.28333333, 0.8), (0.28333333, 0.78333336), (0.28333333, 0.78333336), (0.28333333, 0.8), (0.275, 0.8), (0.275, 0.78333336), (0.275, 0.78333336), (0.275, 0.8), (0.26666668, 0.8), (0.26666668, 0.78333336), (0.26666668, 0.78333336), (0.26666668, 0.8), (0.25833333, 0.8), (0.25833333, 0.78333336), (0.25833333, 0.78333336), (0.25833333, 0.8), (0.25, 0.8), (0.25, 0.78333336), (0.25, 0.78333336), (0.25, 0.8), (0.24166666, 0.8), (0.24166666, 0.78333336), (0.24166666, 0.78333336), (0.24166666, 0.8), (0.23333333, 0.8), (0.23333333, 0.78333336), (0.23333333, 0.78333336), (0.23333333, 0.8), (0.225, 0.8), (0.225, 0.78333336), (0.225, 0.78333336), (0.225, 0.8), (0.21666667, 0.8), (0.21666667, 0.78333336), (0.21666667, 0.78333336), (0.21666667, 0.8), (0.20833333, 0.8), (0.20833333, 0.78333336), (0.20833333, 0.78333336), (0.20833333, 0.8), (0.2, 0.8), (0.2, 0.78333336), (0.2, 0.78333336), (0.2, 0.8), (0.19166666, 0.8), (0.19166666, 0.78333336), (0.19166666, 0.78333336), (0.19166666, 0.8), (0.18333334, 0.8), (0.18333334, 0.78333336), (0.18333334, 0.78333336), (0.18333334, 0.8), (0.175, 0.8), (0.175, 0.78333336), (0.175, 0.78333336), (0.175, 0.8), (0.16666667, 0.8), (0.16666667, 0.78333336), (0.16666667, 0.78333336), (0.16666667, 0.8), (0.15833333, 0.8), (0.15833333, 0.78333336), (0.15833333, 0.78333336), (0.15833333, 0.8), (0.15, 0.8), (0.15, 0.78333336), (0.15, 0.78333336), (0.15, 0.8), (0.14166667, 0.8), (0.14166667, 0.78333336), (0.14166667, 0.78333336), (0.14166667, 0.8), (0.13333334, 0.8), (0.13333334, 0.78333336), (0.13333334, 0.78333336), (0.13333334, 0.8), (0.125, 0.8), (0.125, 0.78333336), (0.125, 0.78333336), (0.125, 0.8), (0.11666667, 0.8), (0.11666667, 0.78333336), (0.11666667, 0.78333336), (0.11666667, 0.8), (0.108333334, 0.8), (0.108333334, 0.78333336), (0.108333334, 0.78333336), (0.108333334, 0.8), (0.1, 0.8), (0.1, 0.78333336), (0.1, 0.78333336), (0.1, 0.8), (0.09166667, 0.8), (0.09166667, 0.78333336), (0.09166667, 0.78333336), (0.09166667, 0.8), (0.083333336, 0.8), (0.083333336, 0.78333336), (0.083333336, 0.78333336), (0.083333336, 0.8), (0.075, 0.8), (0.075, 0.78333336), (0.075, 0.78333336), (0.075, 0.8), (0.06666667, 0.8), (0.06666667, 0.78333336), (0.06666667, 0.78333336), (0.06666667, 0.8), (0.058333334, 0.8), (0.058333334, 0.78333336), (0.058333334, 0.78333336), (0.058333334, 0.8), (0.05, 0.8), (0.05, 0.78333336), (0.05, 0.78333336), (0.05, 0.8), (0.041666668, 0.8), (0.041666668, 0.78333336), (0.041666668, 0.78333336), (0.041666668, 0.8), (0.033333335, 0.8), (0.033333335, 0.78333336), (0.033333335, 0.78333336), (0.033333335, 0.8), (0.025, 0.8), (0.025, 0.78333336), (0.025, 0.78333336), (0.025, 0.8), (0.016666668, 0.8), (0.016666668, 0.78333336), (0.016666668, 0.78333336), (0.016666668, 0.8), (0.008333334, 0.8), (0.008333334, 0.78333336), (0.008333334, 0.78333336), (0.008333334, 0.8), (0, 0.8), (0, 0.78333336), (1, 0.8), (1, 0.81666666), (0.9916667, 0.81666666), (0.9916667, 0.8), (0.9916667, 0.8), (0.9916667, 0.81666666), (0.98333335, 0.81666666), (0.98333335, 0.8), (0.98333335, 0.8), (0.98333335, 0.81666666), (0.975, 0.81666666), (0.975, 0.8), (0.975, 0.8), (0.975, 0.81666666), (0.96666664, 0.81666666), (0.96666664, 0.8), (0.96666664, 0.8), (0.96666664, 0.81666666), (0.9583333, 0.81666666), (0.9583333, 0.8), (0.9583333, 0.8), (0.9583333, 0.81666666), (0.95, 0.81666666), (0.95, 0.8), (0.95, 0.8), (0.95, 0.81666666), (0.94166666, 0.81666666), (0.94166666, 0.8), (0.94166666, 0.8), (0.94166666, 0.81666666), (0.93333334, 0.81666666), (0.93333334, 0.8), (0.93333334, 0.8), (0.93333334, 0.81666666), (0.925, 0.81666666), (0.925, 0.8), (0.925, 0.8), (0.925, 0.81666666), (0.9166667, 0.81666666), (0.9166667, 0.8), (0.9166667, 0.8), (0.9166667, 0.81666666), (0.90833336, 0.81666666), (0.90833336, 0.8), (0.90833336, 0.8), (0.90833336, 0.81666666), (0.9, 0.81666666), (0.9, 0.8), (0.9, 0.8), (0.9, 0.81666666), (0.89166665, 0.81666666), (0.89166665, 0.8), (0.89166665, 0.8), (0.89166665, 0.81666666), (0.8833333, 0.81666666), (0.8833333, 0.8), (0.8833333, 0.8), (0.8833333, 0.81666666), (0.875, 0.81666666), (0.875, 0.8), (0.875, 0.8), (0.875, 0.81666666), (0.8666667, 0.81666666), (0.8666667, 0.8), (0.8666667, 0.8), (0.8666667, 0.81666666), (0.85833335, 0.81666666), (0.85833335, 0.8), (0.85833335, 0.8), (0.85833335, 0.81666666), (0.85, 0.81666666), (0.85, 0.8), (0.85, 0.8), (0.85, 0.81666666), (0.84166664, 0.81666666), (0.84166664, 0.8), (0.84166664, 0.8), (0.84166664, 0.81666666), (0.8333333, 0.81666666), (0.8333333, 0.8), (0.8333333, 0.8), (0.8333333, 0.81666666), (0.825, 0.81666666), (0.825, 0.8), (0.825, 0.8), (0.825, 0.81666666), (0.81666666, 0.81666666), (0.81666666, 0.8), (0.81666666, 0.8), (0.81666666, 0.81666666), (0.80833334, 0.81666666), (0.80833334, 0.8), (0.80833334, 0.8), (0.80833334, 0.81666666), (0.8, 0.81666666), (0.8, 0.8), (0.8, 0.8), (0.8, 0.81666666), (0.7916667, 0.81666666), (0.7916667, 0.8), (0.7916667, 0.8), (0.7916667, 0.81666666), (0.78333336, 0.81666666), (0.78333336, 0.8), (0.78333336, 0.8), (0.78333336, 0.81666666), (0.775, 0.81666666), (0.775, 0.8), (0.775, 0.8), (0.775, 0.81666666), (0.76666665, 0.81666666), (0.76666665, 0.8), (0.76666665, 0.8), (0.76666665, 0.81666666), (0.7583333, 0.81666666), (0.7583333, 0.8), (0.7583333, 0.8), (0.7583333, 0.81666666), (0.75, 0.81666666), (0.75, 0.8), (0.75, 0.8), (0.75, 0.81666666), (0.7416667, 0.81666666), (0.7416667, 0.8), (0.7416667, 0.8), (0.7416667, 0.81666666), (0.73333335, 0.81666666), (0.73333335, 0.8), (0.73333335, 0.8), (0.73333335, 0.81666666), (0.725, 0.81666666), (0.725, 0.8), (0.725, 0.8), (0.725, 0.81666666), (0.71666664, 0.81666666), (0.71666664, 0.8), (0.71666664, 0.8), (0.71666664, 0.81666666), (0.7083333, 0.81666666), (0.7083333, 0.8), (0.7083333, 0.8), (0.7083333, 0.81666666), (0.7, 0.81666666), (0.7, 0.8), (0.7, 0.8), (0.7, 0.81666666), (0.69166666, 0.81666666), (0.69166666, 0.8), (0.69166666, 0.8), (0.69166666, 0.81666666), (0.68333334, 0.81666666), (0.68333334, 0.8), (0.68333334, 0.8), (0.68333334, 0.81666666), (0.675, 0.81666666), (0.675, 0.8), (0.675, 0.8), (0.675, 0.81666666), (0.6666667, 0.81666666), (0.6666667, 0.8), (0.6666667, 0.8), (0.6666667, 0.81666666), (0.65833336, 0.81666666), (0.65833336, 0.8), (0.65833336, 0.8), (0.65833336, 0.81666666), (0.65, 0.81666666), (0.65, 0.8), (0.65, 0.8), (0.65, 0.81666666), (0.64166665, 0.81666666), (0.64166665, 0.8), (0.64166665, 0.8), (0.64166665, 0.81666666), (0.6333333, 0.81666666), (0.6333333, 0.8), (0.6333333, 0.8), (0.6333333, 0.81666666), (0.625, 0.81666666), (0.625, 0.8), (0.625, 0.8), (0.625, 0.81666666), (0.6166667, 0.81666666), (0.6166667, 0.8), (0.6166667, 0.8), (0.6166667, 0.81666666), (0.60833335, 0.81666666), (0.60833335, 0.8), (0.60833335, 0.8), (0.60833335, 0.81666666), (0.6, 0.81666666), (0.6, 0.8), (0.6, 0.8), (0.6, 0.81666666), (0.59166664, 0.81666666), (0.59166664, 0.8), (0.59166664, 0.8), (0.59166664, 0.81666666), (0.5833333, 0.81666666), (0.5833333, 0.8), (0.5833333, 0.8), (0.5833333, 0.81666666), (0.575, 0.81666666), (0.575, 0.8), (0.575, 0.8), (0.575, 0.81666666), (0.56666666, 0.81666666), (0.56666666, 0.8), (0.56666666, 0.8), (0.56666666, 0.81666666), (0.55833334, 0.81666666), (0.55833334, 0.8), (0.55833334, 0.8), (0.55833334, 0.81666666), (0.55, 0.81666666), (0.55, 0.8), (0.55, 0.8), (0.55, 0.81666666), (0.5416667, 0.81666666), (0.5416667, 0.8), (0.5416667, 0.8), (0.5416667, 0.81666666), (0.53333336, 0.81666666), (0.53333336, 0.8), (0.53333336, 0.8), (0.53333336, 0.81666666), (0.525, 0.81666666), (0.525, 0.8), (0.525, 0.8), (0.525, 0.81666666), (0.51666665, 0.81666666), (0.51666665, 0.8), (0.51666665, 0.8), (0.51666665, 0.81666666), (0.5083333, 0.81666666), (0.5083333, 0.8), (0.5083333, 0.8), (0.5083333, 0.81666666), (0.5, 0.81666666), (0.5, 0.8), (0.5, 0.8), (0.5, 0.81666666), (0.49166667, 0.81666666), (0.49166667, 0.8), (0.49166667, 0.8), (0.49166667, 0.81666666), (0.48333332, 0.81666666), (0.48333332, 0.8), (0.48333332, 0.8), (0.48333332, 0.81666666), (0.475, 0.81666666), (0.475, 0.8), (0.475, 0.8), (0.475, 0.81666666), (0.46666667, 0.81666666), (0.46666667, 0.8), (0.46666667, 0.8), (0.46666667, 0.81666666), (0.45833334, 0.81666666), (0.45833334, 0.8), (0.45833334, 0.8), (0.45833334, 0.81666666), (0.45, 0.81666666), (0.45, 0.8), (0.45, 0.8), (0.45, 0.81666666), (0.44166666, 0.81666666), (0.44166666, 0.8), (0.44166666, 0.8), (0.44166666, 0.81666666), (0.43333334, 0.81666666), (0.43333334, 0.8), (0.43333334, 0.8), (0.43333334, 0.81666666), (0.425, 0.81666666), (0.425, 0.8), (0.425, 0.8), (0.425, 0.81666666), (0.41666666, 0.81666666), (0.41666666, 0.8), (0.41666666, 0.8), (0.41666666, 0.81666666), (0.40833333, 0.81666666), (0.40833333, 0.8), (0.40833333, 0.8), (0.40833333, 0.81666666), (0.4, 0.81666666), (0.4, 0.8), (0.4, 0.8), (0.4, 0.81666666), (0.39166668, 0.81666666), (0.39166668, 0.8), (0.39166668, 0.8), (0.39166668, 0.81666666), (0.38333333, 0.81666666), (0.38333333, 0.8), (0.38333333, 0.8), (0.38333333, 0.81666666), (0.375, 0.81666666), (0.375, 0.8), (0.375, 0.8), (0.375, 0.81666666), (0.36666667, 0.81666666), (0.36666667, 0.8), (0.36666667, 0.8), (0.36666667, 0.81666666), (0.35833332, 0.81666666), (0.35833332, 0.8), (0.35833332, 0.8), (0.35833332, 0.81666666), (0.35, 0.81666666), (0.35, 0.8), (0.35, 0.8), (0.35, 0.81666666), (0.34166667, 0.81666666), (0.34166667, 0.8), (0.34166667, 0.8), (0.34166667, 0.81666666), (0.33333334, 0.81666666), (0.33333334, 0.8), (0.33333334, 0.8), (0.33333334, 0.81666666), (0.325, 0.81666666), (0.325, 0.8), (0.325, 0.8), (0.325, 0.81666666), (0.31666666, 0.81666666), (0.31666666, 0.8), (0.31666666, 0.8), (0.31666666, 0.81666666), (0.30833334, 0.81666666), (0.30833334, 0.8), (0.30833334, 0.8), (0.30833334, 0.81666666), (0.3, 0.81666666), (0.3, 0.8), (0.3, 0.8), (0.3, 0.81666666), (0.29166666, 0.81666666), (0.29166666, 0.8), (0.29166666, 0.8), (0.29166666, 0.81666666), (0.28333333, 0.81666666), (0.28333333, 0.8), (0.28333333, 0.8), (0.28333333, 0.81666666), (0.275, 0.81666666), (0.275, 0.8), (0.275, 0.8), (0.275, 0.81666666), (0.26666668, 0.81666666), (0.26666668, 0.8), (0.26666668, 0.8), (0.26666668, 0.81666666), (0.25833333, 0.81666666), (0.25833333, 0.8), (0.25833333, 0.8), (0.25833333, 0.81666666), (0.25, 0.81666666), (0.25, 0.8), (0.25, 0.8), (0.25, 0.81666666), (0.24166666, 0.81666666), (0.24166666, 0.8), (0.24166666, 0.8), (0.24166666, 0.81666666), (0.23333333, 0.81666666), (0.23333333, 0.8), (0.23333333, 0.8), (0.23333333, 0.81666666), (0.225, 0.81666666), (0.225, 0.8), (0.225, 0.8), (0.225, 0.81666666), (0.21666667, 0.81666666), (0.21666667, 0.8), (0.21666667, 0.8), (0.21666667, 0.81666666), (0.20833333, 0.81666666), (0.20833333, 0.8), (0.20833333, 0.8), (0.20833333, 0.81666666), (0.2, 0.81666666), (0.2, 0.8), (0.2, 0.8), (0.2, 0.81666666), (0.19166666, 0.81666666), (0.19166666, 0.8), (0.19166666, 0.8), (0.19166666, 0.81666666), (0.18333334, 0.81666666), (0.18333334, 0.8), (0.18333334, 0.8), (0.18333334, 0.81666666), (0.175, 0.81666666), (0.175, 0.8), (0.175, 0.8), (0.175, 0.81666666), (0.16666667, 0.81666666), (0.16666667, 0.8), (0.16666667, 0.8), (0.16666667, 0.81666666), (0.15833333, 0.81666666), (0.15833333, 0.8), (0.15833333, 0.8), (0.15833333, 0.81666666), (0.15, 0.81666666), (0.15, 0.8), (0.15, 0.8), (0.15, 0.81666666), (0.14166667, 0.81666666), (0.14166667, 0.8), (0.14166667, 0.8), (0.14166667, 0.81666666), (0.13333334, 0.81666666), (0.13333334, 0.8), (0.13333334, 0.8), (0.13333334, 0.81666666), (0.125, 0.81666666), (0.125, 0.8), (0.125, 0.8), (0.125, 0.81666666), (0.11666667, 0.81666666), (0.11666667, 0.8), (0.11666667, 0.8), (0.11666667, 0.81666666), (0.108333334, 0.81666666), (0.108333334, 0.8), (0.108333334, 0.8), (0.108333334, 0.81666666), (0.1, 0.81666666), (0.1, 0.8), (0.1, 0.8), (0.1, 0.81666666), (0.09166667, 0.81666666), (0.09166667, 0.8), (0.09166667, 0.8), (0.09166667, 0.81666666), (0.083333336, 0.81666666), (0.083333336, 0.8), (0.083333336, 0.8), (0.083333336, 0.81666666), (0.075, 0.81666666), (0.075, 0.8), (0.075, 0.8), (0.075, 0.81666666), (0.06666667, 0.81666666), (0.06666667, 0.8), (0.06666667, 0.8), (0.06666667, 0.81666666), (0.058333334, 0.81666666), (0.058333334, 0.8), (0.058333334, 0.8), (0.058333334, 0.81666666), (0.05, 0.81666666), (0.05, 0.8), (0.05, 0.8), (0.05, 0.81666666), (0.041666668, 0.81666666), (0.041666668, 0.8), (0.041666668, 0.8), (0.041666668, 0.81666666), (0.033333335, 0.81666666), (0.033333335, 0.8), (0.033333335, 0.8), (0.033333335, 0.81666666), (0.025, 0.81666666), (0.025, 0.8), (0.025, 0.8), (0.025, 0.81666666), (0.016666668, 0.81666666), (0.016666668, 0.8), (0.016666668, 0.8), (0.016666668, 0.81666666), (0.008333334, 0.81666666), (0.008333334, 0.8), (0.008333334, 0.8), (0.008333334, 0.81666666), (0, 0.81666666), (0, 0.8), (1, 0.81666666), (1, 0.8333333), (0.9916667, 0.8333333), (0.9916667, 0.81666666), (0.9916667, 0.81666666), (0.9916667, 0.8333333), (0.98333335, 0.8333333), (0.98333335, 0.81666666), (0.98333335, 0.81666666), (0.98333335, 0.8333333), (0.975, 0.8333333), (0.975, 0.81666666), (0.975, 0.81666666), (0.975, 0.8333333), (0.96666664, 0.8333333), (0.96666664, 0.81666666), (0.96666664, 0.81666666), (0.96666664, 0.8333333), (0.9583333, 0.8333333), (0.9583333, 0.81666666), (0.9583333, 0.81666666), (0.9583333, 0.8333333), (0.95, 0.8333333), (0.95, 0.81666666), (0.95, 0.81666666), (0.95, 0.8333333), (0.94166666, 0.8333333), (0.94166666, 0.81666666), (0.94166666, 0.81666666), (0.94166666, 0.8333333), (0.93333334, 0.8333333), (0.93333334, 0.81666666), (0.93333334, 0.81666666), (0.93333334, 0.8333333), (0.925, 0.8333333), (0.925, 0.81666666), (0.925, 0.81666666), (0.925, 0.8333333), (0.9166667, 0.8333333), (0.9166667, 0.81666666), (0.9166667, 0.81666666), (0.9166667, 0.8333333), (0.90833336, 0.8333333), (0.90833336, 0.81666666), (0.90833336, 0.81666666), (0.90833336, 0.8333333), (0.9, 0.8333333), (0.9, 0.81666666), (0.9, 0.81666666), (0.9, 0.8333333), (0.89166665, 0.8333333), (0.89166665, 0.81666666), (0.89166665, 0.81666666), (0.89166665, 0.8333333), (0.8833333, 0.8333333), (0.8833333, 0.81666666), (0.8833333, 0.81666666), (0.8833333, 0.8333333), (0.875, 0.8333333), (0.875, 0.81666666), (0.875, 0.81666666), (0.875, 0.8333333), (0.8666667, 0.8333333), (0.8666667, 0.81666666), (0.8666667, 0.81666666), (0.8666667, 0.8333333), (0.85833335, 0.8333333), (0.85833335, 0.81666666), (0.85833335, 0.81666666), (0.85833335, 0.8333333), (0.85, 0.8333333), (0.85, 0.81666666), (0.85, 0.81666666), (0.85, 0.8333333), (0.84166664, 0.8333333), (0.84166664, 0.81666666), (0.84166664, 0.81666666), (0.84166664, 0.8333333), (0.8333333, 0.8333333), (0.8333333, 0.81666666), (0.8333333, 0.81666666), (0.8333333, 0.8333333), (0.825, 0.8333333), (0.825, 0.81666666), (0.825, 0.81666666), (0.825, 0.8333333), (0.81666666, 0.8333333), (0.81666666, 0.81666666), (0.81666666, 0.81666666), (0.81666666, 0.8333333), (0.80833334, 0.8333333), (0.80833334, 0.81666666), (0.80833334, 0.81666666), (0.80833334, 0.8333333), (0.8, 0.8333333), (0.8, 0.81666666), (0.8, 0.81666666), (0.8, 0.8333333), (0.7916667, 0.8333333), (0.7916667, 0.81666666), (0.7916667, 0.81666666), (0.7916667, 0.8333333), (0.78333336, 0.8333333), (0.78333336, 0.81666666), (0.78333336, 0.81666666), (0.78333336, 0.8333333), (0.775, 0.8333333), (0.775, 0.81666666), (0.775, 0.81666666), (0.775, 0.8333333), (0.76666665, 0.8333333), (0.76666665, 0.81666666), (0.76666665, 0.81666666), (0.76666665, 0.8333333), (0.7583333, 0.8333333), (0.7583333, 0.81666666), (0.7583333, 0.81666666), (0.7583333, 0.8333333), (0.75, 0.8333333), (0.75, 0.81666666), (0.75, 0.81666666), (0.75, 0.8333333), (0.7416667, 0.8333333), (0.7416667, 0.81666666), (0.7416667, 0.81666666), (0.7416667, 0.8333333), (0.73333335, 0.8333333), (0.73333335, 0.81666666), (0.73333335, 0.81666666), (0.73333335, 0.8333333), (0.725, 0.8333333), (0.725, 0.81666666), (0.725, 0.81666666), (0.725, 0.8333333), (0.71666664, 0.8333333), (0.71666664, 0.81666666), (0.71666664, 0.81666666), (0.71666664, 0.8333333), (0.7083333, 0.8333333), (0.7083333, 0.81666666), (0.7083333, 0.81666666), (0.7083333, 0.8333333), (0.7, 0.8333333), (0.7, 0.81666666), (0.7, 0.81666666), (0.7, 0.8333333), (0.69166666, 0.8333333), (0.69166666, 0.81666666), (0.69166666, 0.81666666), (0.69166666, 0.8333333), (0.68333334, 0.8333333), (0.68333334, 0.81666666), (0.68333334, 0.81666666), (0.68333334, 0.8333333), (0.675, 0.8333333), (0.675, 0.81666666), (0.675, 0.81666666), (0.675, 0.8333333), (0.6666667, 0.8333333), (0.6666667, 0.81666666), (0.6666667, 0.81666666), (0.6666667, 0.8333333), (0.65833336, 0.8333333), (0.65833336, 0.81666666), (0.65833336, 0.81666666), (0.65833336, 0.8333333), (0.65, 0.8333333), (0.65, 0.81666666), (0.65, 0.81666666), (0.65, 0.8333333), (0.64166665, 0.8333333), (0.64166665, 0.81666666), (0.64166665, 0.81666666), (0.64166665, 0.8333333), (0.6333333, 0.8333333), (0.6333333, 0.81666666), (0.6333333, 0.81666666), (0.6333333, 0.8333333), (0.625, 0.8333333), (0.625, 0.81666666), (0.625, 0.81666666), (0.625, 0.8333333), (0.6166667, 0.8333333), (0.6166667, 0.81666666), (0.6166667, 0.81666666), (0.6166667, 0.8333333), (0.60833335, 0.8333333), (0.60833335, 0.81666666), (0.60833335, 0.81666666), (0.60833335, 0.8333333), (0.6, 0.8333333), (0.6, 0.81666666), (0.6, 0.81666666), (0.6, 0.8333333), (0.59166664, 0.8333333), (0.59166664, 0.81666666), (0.59166664, 0.81666666), (0.59166664, 0.8333333), (0.5833333, 0.8333333), (0.5833333, 0.81666666), (0.5833333, 0.81666666), (0.5833333, 0.8333333), (0.575, 0.8333333), (0.575, 0.81666666), (0.575, 0.81666666), (0.575, 0.8333333), (0.56666666, 0.8333333), (0.56666666, 0.81666666), (0.56666666, 0.81666666), (0.56666666, 0.8333333), (0.55833334, 0.8333333), (0.55833334, 0.81666666), (0.55833334, 0.81666666), (0.55833334, 0.8333333), (0.55, 0.8333333), (0.55, 0.81666666), (0.55, 0.81666666), (0.55, 0.8333333), (0.5416667, 0.8333333), (0.5416667, 0.81666666), (0.5416667, 0.81666666), (0.5416667, 0.8333333), (0.53333336, 0.8333333), (0.53333336, 0.81666666), (0.53333336, 0.81666666), (0.53333336, 0.8333333), (0.525, 0.8333333), (0.525, 0.81666666), (0.525, 0.81666666), (0.525, 0.8333333), (0.51666665, 0.8333333), (0.51666665, 0.81666666), (0.51666665, 0.81666666), (0.51666665, 0.8333333), (0.5083333, 0.8333333), (0.5083333, 0.81666666), (0.5083333, 0.81666666), (0.5083333, 0.8333333), (0.5, 0.8333333), (0.5, 0.81666666), (0.5, 0.81666666), (0.5, 0.8333333), (0.49166667, 0.8333333), (0.49166667, 0.81666666), (0.49166667, 0.81666666), (0.49166667, 0.8333333), (0.48333332, 0.8333333), (0.48333332, 0.81666666), (0.48333332, 0.81666666), (0.48333332, 0.8333333), (0.475, 0.8333333), (0.475, 0.81666666), (0.475, 0.81666666), (0.475, 0.8333333), (0.46666667, 0.8333333), (0.46666667, 0.81666666), (0.46666667, 0.81666666), (0.46666667, 0.8333333), (0.45833334, 0.8333333), (0.45833334, 0.81666666), (0.45833334, 0.81666666), (0.45833334, 0.8333333), (0.45, 0.8333333), (0.45, 0.81666666), (0.45, 0.81666666), (0.45, 0.8333333), (0.44166666, 0.8333333), (0.44166666, 0.81666666), (0.44166666, 0.81666666), (0.44166666, 0.8333333), (0.43333334, 0.8333333), (0.43333334, 0.81666666), (0.43333334, 0.81666666), (0.43333334, 0.8333333), (0.425, 0.8333333), (0.425, 0.81666666), (0.425, 0.81666666), (0.425, 0.8333333), (0.41666666, 0.8333333), (0.41666666, 0.81666666), (0.41666666, 0.81666666), (0.41666666, 0.8333333), (0.40833333, 0.8333333), (0.40833333, 0.81666666), (0.40833333, 0.81666666), (0.40833333, 0.8333333), (0.4, 0.8333333), (0.4, 0.81666666), (0.4, 0.81666666), (0.4, 0.8333333), (0.39166668, 0.8333333), (0.39166668, 0.81666666), (0.39166668, 0.81666666), (0.39166668, 0.8333333), (0.38333333, 0.8333333), (0.38333333, 0.81666666), (0.38333333, 0.81666666), (0.38333333, 0.8333333), (0.375, 0.8333333), (0.375, 0.81666666), (0.375, 0.81666666), (0.375, 0.8333333), (0.36666667, 0.8333333), (0.36666667, 0.81666666), (0.36666667, 0.81666666), (0.36666667, 0.8333333), (0.35833332, 0.8333333), (0.35833332, 0.81666666), (0.35833332, 0.81666666), (0.35833332, 0.8333333), (0.35, 0.8333333), (0.35, 0.81666666), (0.35, 0.81666666), (0.35, 0.8333333), (0.34166667, 0.8333333), (0.34166667, 0.81666666), (0.34166667, 0.81666666), (0.34166667, 0.8333333), (0.33333334, 0.8333333), (0.33333334, 0.81666666), (0.33333334, 0.81666666), (0.33333334, 0.8333333), (0.325, 0.8333333), (0.325, 0.81666666), (0.325, 0.81666666), (0.325, 0.8333333), (0.31666666, 0.8333333), (0.31666666, 0.81666666), (0.31666666, 0.81666666), (0.31666666, 0.8333333), (0.30833334, 0.8333333), (0.30833334, 0.81666666), (0.30833334, 0.81666666), (0.30833334, 0.8333333), (0.3, 0.8333333), (0.3, 0.81666666), (0.3, 0.81666666), (0.3, 0.8333333), (0.29166666, 0.8333333), (0.29166666, 0.81666666), (0.29166666, 0.81666666), (0.29166666, 0.8333333), (0.28333333, 0.8333333), (0.28333333, 0.81666666), (0.28333333, 0.81666666), (0.28333333, 0.8333333), (0.275, 0.8333333), (0.275, 0.81666666), (0.275, 0.81666666), (0.275, 0.8333333), (0.26666668, 0.8333333), (0.26666668, 0.81666666), (0.26666668, 0.81666666), (0.26666668, 0.8333333), (0.25833333, 0.8333333), (0.25833333, 0.81666666), (0.25833333, 0.81666666), (0.25833333, 0.8333333), (0.25, 0.8333333), (0.25, 0.81666666), (0.25, 0.81666666), (0.25, 0.8333333), (0.24166666, 0.8333333), (0.24166666, 0.81666666), (0.24166666, 0.81666666), (0.24166666, 0.8333333), (0.23333333, 0.8333333), (0.23333333, 0.81666666), (0.23333333, 0.81666666), (0.23333333, 0.8333333), (0.225, 0.8333333), (0.225, 0.81666666), (0.225, 0.81666666), (0.225, 0.8333333), (0.21666667, 0.8333333), (0.21666667, 0.81666666), (0.21666667, 0.81666666), (0.21666667, 0.8333333), (0.20833333, 0.8333333), (0.20833333, 0.81666666), (0.20833333, 0.81666666), (0.20833333, 0.8333333), (0.2, 0.8333333), (0.2, 0.81666666), (0.2, 0.81666666), (0.2, 0.8333333), (0.19166666, 0.8333333), (0.19166666, 0.81666666), (0.19166666, 0.81666666), (0.19166666, 0.8333333), (0.18333334, 0.8333333), (0.18333334, 0.81666666), (0.18333334, 0.81666666), (0.18333334, 0.8333333), (0.175, 0.8333333), (0.175, 0.81666666), (0.175, 0.81666666), (0.175, 0.8333333), (0.16666667, 0.8333333), (0.16666667, 0.81666666), (0.16666667, 0.81666666), (0.16666667, 0.8333333), (0.15833333, 0.8333333), (0.15833333, 0.81666666), (0.15833333, 0.81666666), (0.15833333, 0.8333333), (0.15, 0.8333333), (0.15, 0.81666666), (0.15, 0.81666666), (0.15, 0.8333333), (0.14166667, 0.8333333), (0.14166667, 0.81666666), (0.14166667, 0.81666666), (0.14166667, 0.8333333), (0.13333334, 0.8333333), (0.13333334, 0.81666666), (0.13333334, 0.81666666), (0.13333334, 0.8333333), (0.125, 0.8333333), (0.125, 0.81666666), (0.125, 0.81666666), (0.125, 0.8333333), (0.11666667, 0.8333333), (0.11666667, 0.81666666), (0.11666667, 0.81666666), (0.11666667, 0.8333333), (0.108333334, 0.8333333), (0.108333334, 0.81666666), (0.108333334, 0.81666666), (0.108333334, 0.8333333), (0.1, 0.8333333), (0.1, 0.81666666), (0.1, 0.81666666), (0.1, 0.8333333), (0.09166667, 0.8333333), (0.09166667, 0.81666666), (0.09166667, 0.81666666), (0.09166667, 0.8333333), (0.083333336, 0.8333333), (0.083333336, 0.81666666), (0.083333336, 0.81666666), (0.083333336, 0.8333333), (0.075, 0.8333333), (0.075, 0.81666666), (0.075, 0.81666666), (0.075, 0.8333333), (0.06666667, 0.8333333), (0.06666667, 0.81666666), (0.06666667, 0.81666666), (0.06666667, 0.8333333), (0.058333334, 0.8333333), (0.058333334, 0.81666666), (0.058333334, 0.81666666), (0.058333334, 0.8333333), (0.05, 0.8333333), (0.05, 0.81666666), (0.05, 0.81666666), (0.05, 0.8333333), (0.041666668, 0.8333333), (0.041666668, 0.81666666), (0.041666668, 0.81666666), (0.041666668, 0.8333333), (0.033333335, 0.8333333), (0.033333335, 0.81666666), (0.033333335, 0.81666666), (0.033333335, 0.8333333), (0.025, 0.8333333), (0.025, 0.81666666), (0.025, 0.81666666), (0.025, 0.8333333), (0.016666668, 0.8333333), (0.016666668, 0.81666666), (0.016666668, 0.81666666), (0.016666668, 0.8333333), (0.008333334, 0.8333333), (0.008333334, 0.81666666), (0.008333334, 0.81666666), (0.008333334, 0.8333333), (0, 0.8333333), (0, 0.81666666), (1, 0.8333333), (1, 0.85), (0.9916667, 0.85), (0.9916667, 0.8333333), (0.9916667, 0.8333333), (0.9916667, 0.85), (0.98333335, 0.85), (0.98333335, 0.8333333), (0.98333335, 0.8333333), (0.98333335, 0.85), (0.975, 0.85), (0.975, 0.8333333), (0.975, 0.8333333), (0.975, 0.85), (0.96666664, 0.85), (0.96666664, 0.8333333), (0.96666664, 0.8333333), (0.96666664, 0.85), (0.9583333, 0.85), (0.9583333, 0.8333333), (0.9583333, 0.8333333), (0.9583333, 0.85), (0.95, 0.85), (0.95, 0.8333333), (0.95, 0.8333333), (0.95, 0.85), (0.94166666, 0.85), (0.94166666, 0.8333333), (0.94166666, 0.8333333), (0.94166666, 0.85), (0.93333334, 0.85), (0.93333334, 0.8333333), (0.93333334, 0.8333333), (0.93333334, 0.85), (0.925, 0.85), (0.925, 0.8333333), (0.925, 0.8333333), (0.925, 0.85), (0.9166667, 0.85), (0.9166667, 0.8333333), (0.9166667, 0.8333333), (0.9166667, 0.85), (0.90833336, 0.85), (0.90833336, 0.8333333), (0.90833336, 0.8333333), (0.90833336, 0.85), (0.9, 0.85), (0.9, 0.8333333), (0.9, 0.8333333), (0.9, 0.85), (0.89166665, 0.85), (0.89166665, 0.8333333), (0.89166665, 0.8333333), (0.89166665, 0.85), (0.8833333, 0.85), (0.8833333, 0.8333333), (0.8833333, 0.8333333), (0.8833333, 0.85), (0.875, 0.85), (0.875, 0.8333333), (0.875, 0.8333333), (0.875, 0.85), (0.8666667, 0.85), (0.8666667, 0.8333333), (0.8666667, 0.8333333), (0.8666667, 0.85), (0.85833335, 0.85), (0.85833335, 0.8333333), (0.85833335, 0.8333333), (0.85833335, 0.85), (0.85, 0.85), (0.85, 0.8333333), (0.85, 0.8333333), (0.85, 0.85), (0.84166664, 0.85), (0.84166664, 0.8333333), (0.84166664, 0.8333333), (0.84166664, 0.85), (0.8333333, 0.85), (0.8333333, 0.8333333), (0.8333333, 0.8333333), (0.8333333, 0.85), (0.825, 0.85), (0.825, 0.8333333), (0.825, 0.8333333), (0.825, 0.85), (0.81666666, 0.85), (0.81666666, 0.8333333), (0.81666666, 0.8333333), (0.81666666, 0.85), (0.80833334, 0.85), (0.80833334, 0.8333333), (0.80833334, 0.8333333), (0.80833334, 0.85), (0.8, 0.85), (0.8, 0.8333333), (0.8, 0.8333333), (0.8, 0.85), (0.7916667, 0.85), (0.7916667, 0.8333333), (0.7916667, 0.8333333), (0.7916667, 0.85), (0.78333336, 0.85), (0.78333336, 0.8333333), (0.78333336, 0.8333333), (0.78333336, 0.85), (0.775, 0.85), (0.775, 0.8333333), (0.775, 0.8333333), (0.775, 0.85), (0.76666665, 0.85), (0.76666665, 0.8333333), (0.76666665, 0.8333333), (0.76666665, 0.85), (0.7583333, 0.85), (0.7583333, 0.8333333), (0.7583333, 0.8333333), (0.7583333, 0.85), (0.75, 0.85), (0.75, 0.8333333), (0.75, 0.8333333), (0.75, 0.85), (0.7416667, 0.85), (0.7416667, 0.8333333), (0.7416667, 0.8333333), (0.7416667, 0.85), (0.73333335, 0.85), (0.73333335, 0.8333333), (0.73333335, 0.8333333), (0.73333335, 0.85), (0.725, 0.85), (0.725, 0.8333333), (0.725, 0.8333333), (0.725, 0.85), (0.71666664, 0.85), (0.71666664, 0.8333333), (0.71666664, 0.8333333), (0.71666664, 0.85), (0.7083333, 0.85), (0.7083333, 0.8333333), (0.7083333, 0.8333333), (0.7083333, 0.85), (0.7, 0.85), (0.7, 0.8333333), (0.7, 0.8333333), (0.7, 0.85), (0.69166666, 0.85), (0.69166666, 0.8333333), (0.69166666, 0.8333333), (0.69166666, 0.85), (0.68333334, 0.85), (0.68333334, 0.8333333), (0.68333334, 0.8333333), (0.68333334, 0.85), (0.675, 0.85), (0.675, 0.8333333), (0.675, 0.8333333), (0.675, 0.85), (0.6666667, 0.85), (0.6666667, 0.8333333), (0.6666667, 0.8333333), (0.6666667, 0.85), (0.65833336, 0.85), (0.65833336, 0.8333333), (0.65833336, 0.8333333), (0.65833336, 0.85), (0.65, 0.85), (0.65, 0.8333333), (0.65, 0.8333333), (0.65, 0.85), (0.64166665, 0.85), (0.64166665, 0.8333333), (0.64166665, 0.8333333), (0.64166665, 0.85), (0.6333333, 0.85), (0.6333333, 0.8333333), (0.6333333, 0.8333333), (0.6333333, 0.85), (0.625, 0.85), (0.625, 0.8333333), (0.625, 0.8333333), (0.625, 0.85), (0.6166667, 0.85), (0.6166667, 0.8333333), (0.6166667, 0.8333333), (0.6166667, 0.85), (0.60833335, 0.85), (0.60833335, 0.8333333), (0.60833335, 0.8333333), (0.60833335, 0.85), (0.6, 0.85), (0.6, 0.8333333), (0.6, 0.8333333), (0.6, 0.85), (0.59166664, 0.85), (0.59166664, 0.8333333), (0.59166664, 0.8333333), (0.59166664, 0.85), (0.5833333, 0.85), (0.5833333, 0.8333333), (0.5833333, 0.8333333), (0.5833333, 0.85), (0.575, 0.85), (0.575, 0.8333333), (0.575, 0.8333333), (0.575, 0.85), (0.56666666, 0.85), (0.56666666, 0.8333333), (0.56666666, 0.8333333), (0.56666666, 0.85), (0.55833334, 0.85), (0.55833334, 0.8333333), (0.55833334, 0.8333333), (0.55833334, 0.85), (0.55, 0.85), (0.55, 0.8333333), (0.55, 0.8333333), (0.55, 0.85), (0.5416667, 0.85), (0.5416667, 0.8333333), (0.5416667, 0.8333333), (0.5416667, 0.85), (0.53333336, 0.85), (0.53333336, 0.8333333), (0.53333336, 0.8333333), (0.53333336, 0.85), (0.525, 0.85), (0.525, 0.8333333), (0.525, 0.8333333), (0.525, 0.85), (0.51666665, 0.85), (0.51666665, 0.8333333), (0.51666665, 0.8333333), (0.51666665, 0.85), (0.5083333, 0.85), (0.5083333, 0.8333333), (0.5083333, 0.8333333), (0.5083333, 0.85), (0.5, 0.85), (0.5, 0.8333333), (0.5, 0.8333333), (0.5, 0.85), (0.49166667, 0.85), (0.49166667, 0.8333333), (0.49166667, 0.8333333), (0.49166667, 0.85), (0.48333332, 0.85), (0.48333332, 0.8333333), (0.48333332, 0.8333333), (0.48333332, 0.85), (0.475, 0.85), (0.475, 0.8333333), (0.475, 0.8333333), (0.475, 0.85), (0.46666667, 0.85), (0.46666667, 0.8333333), (0.46666667, 0.8333333), (0.46666667, 0.85), (0.45833334, 0.85), (0.45833334, 0.8333333), (0.45833334, 0.8333333), (0.45833334, 0.85), (0.45, 0.85), (0.45, 0.8333333), (0.45, 0.8333333), (0.45, 0.85), (0.44166666, 0.85), (0.44166666, 0.8333333), (0.44166666, 0.8333333), (0.44166666, 0.85), (0.43333334, 0.85), (0.43333334, 0.8333333), (0.43333334, 0.8333333), (0.43333334, 0.85), (0.425, 0.85), (0.425, 0.8333333), (0.425, 0.8333333), (0.425, 0.85), (0.41666666, 0.85), (0.41666666, 0.8333333), (0.41666666, 0.8333333), (0.41666666, 0.85), (0.40833333, 0.85), (0.40833333, 0.8333333), (0.40833333, 0.8333333), (0.40833333, 0.85), (0.4, 0.85), (0.4, 0.8333333), (0.4, 0.8333333), (0.4, 0.85), (0.39166668, 0.85), (0.39166668, 0.8333333), (0.39166668, 0.8333333), (0.39166668, 0.85), (0.38333333, 0.85), (0.38333333, 0.8333333), (0.38333333, 0.8333333), (0.38333333, 0.85), (0.375, 0.85), (0.375, 0.8333333), (0.375, 0.8333333), (0.375, 0.85), (0.36666667, 0.85), (0.36666667, 0.8333333), (0.36666667, 0.8333333), (0.36666667, 0.85), (0.35833332, 0.85), (0.35833332, 0.8333333), (0.35833332, 0.8333333), (0.35833332, 0.85), (0.35, 0.85), (0.35, 0.8333333), (0.35, 0.8333333), (0.35, 0.85), (0.34166667, 0.85), (0.34166667, 0.8333333), (0.34166667, 0.8333333), (0.34166667, 0.85), (0.33333334, 0.85), (0.33333334, 0.8333333), (0.33333334, 0.8333333), (0.33333334, 0.85), (0.325, 0.85), (0.325, 0.8333333), (0.325, 0.8333333), (0.325, 0.85), (0.31666666, 0.85), (0.31666666, 0.8333333), (0.31666666, 0.8333333), (0.31666666, 0.85), (0.30833334, 0.85), (0.30833334, 0.8333333), (0.30833334, 0.8333333), (0.30833334, 0.85), (0.3, 0.85), (0.3, 0.8333333), (0.3, 0.8333333), (0.3, 0.85), (0.29166666, 0.85), (0.29166666, 0.8333333), (0.29166666, 0.8333333), (0.29166666, 0.85), (0.28333333, 0.85), (0.28333333, 0.8333333), (0.28333333, 0.8333333), (0.28333333, 0.85), (0.275, 0.85), (0.275, 0.8333333), (0.275, 0.8333333), (0.275, 0.85), (0.26666668, 0.85), (0.26666668, 0.8333333), (0.26666668, 0.8333333), (0.26666668, 0.85), (0.25833333, 0.85), (0.25833333, 0.8333333), (0.25833333, 0.8333333), (0.25833333, 0.85), (0.25, 0.85), (0.25, 0.8333333), (0.25, 0.8333333), (0.25, 0.85), (0.24166666, 0.85), (0.24166666, 0.8333333), (0.24166666, 0.8333333), (0.24166666, 0.85), (0.23333333, 0.85), (0.23333333, 0.8333333), (0.23333333, 0.8333333), (0.23333333, 0.85), (0.225, 0.85), (0.225, 0.8333333), (0.225, 0.8333333), (0.225, 0.85), (0.21666667, 0.85), (0.21666667, 0.8333333), (0.21666667, 0.8333333), (0.21666667, 0.85), (0.20833333, 0.85), (0.20833333, 0.8333333), (0.20833333, 0.8333333), (0.20833333, 0.85), (0.2, 0.85), (0.2, 0.8333333), (0.2, 0.8333333), (0.2, 0.85), (0.19166666, 0.85), (0.19166666, 0.8333333), (0.19166666, 0.8333333), (0.19166666, 0.85), (0.18333334, 0.85), (0.18333334, 0.8333333), (0.18333334, 0.8333333), (0.18333334, 0.85), (0.175, 0.85), (0.175, 0.8333333), (0.175, 0.8333333), (0.175, 0.85), (0.16666667, 0.85), (0.16666667, 0.8333333), (0.16666667, 0.8333333), (0.16666667, 0.85), (0.15833333, 0.85), (0.15833333, 0.8333333), (0.15833333, 0.8333333), (0.15833333, 0.85), (0.15, 0.85), (0.15, 0.8333333), (0.15, 0.8333333), (0.15, 0.85), (0.14166667, 0.85), (0.14166667, 0.8333333), (0.14166667, 0.8333333), (0.14166667, 0.85), (0.13333334, 0.85), (0.13333334, 0.8333333), (0.13333334, 0.8333333), (0.13333334, 0.85), (0.125, 0.85), (0.125, 0.8333333), (0.125, 0.8333333), (0.125, 0.85), (0.11666667, 0.85), (0.11666667, 0.8333333), (0.11666667, 0.8333333), (0.11666667, 0.85), (0.108333334, 0.85), (0.108333334, 0.8333333), (0.108333334, 0.8333333), (0.108333334, 0.85), (0.1, 0.85), (0.1, 0.8333333), (0.1, 0.8333333), (0.1, 0.85), (0.09166667, 0.85), (0.09166667, 0.8333333), (0.09166667, 0.8333333), (0.09166667, 0.85), (0.083333336, 0.85), (0.083333336, 0.8333333), (0.083333336, 0.8333333), (0.083333336, 0.85), (0.075, 0.85), (0.075, 0.8333333), (0.075, 0.8333333), (0.075, 0.85), (0.06666667, 0.85), (0.06666667, 0.8333333), (0.06666667, 0.8333333), (0.06666667, 0.85), (0.058333334, 0.85), (0.058333334, 0.8333333), (0.058333334, 0.8333333), (0.058333334, 0.85), (0.05, 0.85), (0.05, 0.8333333), (0.05, 0.8333333), (0.05, 0.85), (0.041666668, 0.85), (0.041666668, 0.8333333), (0.041666668, 0.8333333), (0.041666668, 0.85), (0.033333335, 0.85), (0.033333335, 0.8333333), (0.033333335, 0.8333333), (0.033333335, 0.85), (0.025, 0.85), (0.025, 0.8333333), (0.025, 0.8333333), (0.025, 0.85), (0.016666668, 0.85), (0.016666668, 0.8333333), (0.016666668, 0.8333333), (0.016666668, 0.85), (0.008333334, 0.85), (0.008333334, 0.8333333), (0.008333334, 0.8333333), (0.008333334, 0.85), (0, 0.85), (0, 0.8333333), (1, 0.85), (1, 0.8666667), (0.9916667, 0.8666667), (0.9916667, 0.85), (0.9916667, 0.85), (0.9916667, 0.8666667), (0.98333335, 0.8666667), (0.98333335, 0.85), (0.98333335, 0.85), (0.98333335, 0.8666667), (0.975, 0.8666667), (0.975, 0.85), (0.975, 0.85), (0.975, 0.8666667), (0.96666664, 0.8666667), (0.96666664, 0.85), (0.96666664, 0.85), (0.96666664, 0.8666667), (0.9583333, 0.8666667), (0.9583333, 0.85), (0.9583333, 0.85), (0.9583333, 0.8666667), (0.95, 0.8666667), (0.95, 0.85), (0.95, 0.85), (0.95, 0.8666667), (0.94166666, 0.8666667), (0.94166666, 0.85), (0.94166666, 0.85), (0.94166666, 0.8666667), (0.93333334, 0.8666667), (0.93333334, 0.85), (0.93333334, 0.85), (0.93333334, 0.8666667), (0.925, 0.8666667), (0.925, 0.85), (0.925, 0.85), (0.925, 0.8666667), (0.9166667, 0.8666667), (0.9166667, 0.85), (0.9166667, 0.85), (0.9166667, 0.8666667), (0.90833336, 0.8666667), (0.90833336, 0.85), (0.90833336, 0.85), (0.90833336, 0.8666667), (0.9, 0.8666667), (0.9, 0.85), (0.9, 0.85), (0.9, 0.8666667), (0.89166665, 0.8666667), (0.89166665, 0.85), (0.89166665, 0.85), (0.89166665, 0.8666667), (0.8833333, 0.8666667), (0.8833333, 0.85), (0.8833333, 0.85), (0.8833333, 0.8666667), (0.875, 0.8666667), (0.875, 0.85), (0.875, 0.85), (0.875, 0.8666667), (0.8666667, 0.8666667), (0.8666667, 0.85), (0.8666667, 0.85), (0.8666667, 0.8666667), (0.85833335, 0.8666667), (0.85833335, 0.85), (0.85833335, 0.85), (0.85833335, 0.8666667), (0.85, 0.8666667), (0.85, 0.85), (0.85, 0.85), (0.85, 0.8666667), (0.84166664, 0.8666667), (0.84166664, 0.85), (0.84166664, 0.85), (0.84166664, 0.8666667), (0.8333333, 0.8666667), (0.8333333, 0.85), (0.8333333, 0.85), (0.8333333, 0.8666667), (0.825, 0.8666667), (0.825, 0.85), (0.825, 0.85), (0.825, 0.8666667), (0.81666666, 0.8666667), (0.81666666, 0.85), (0.81666666, 0.85), (0.81666666, 0.8666667), (0.80833334, 0.8666667), (0.80833334, 0.85), (0.80833334, 0.85), (0.80833334, 0.8666667), (0.8, 0.8666667), (0.8, 0.85), (0.8, 0.85), (0.8, 0.8666667), (0.7916667, 0.8666667), (0.7916667, 0.85), (0.7916667, 0.85), (0.7916667, 0.8666667), (0.78333336, 0.8666667), (0.78333336, 0.85), (0.78333336, 0.85), (0.78333336, 0.8666667), (0.775, 0.8666667), (0.775, 0.85), (0.775, 0.85), (0.775, 0.8666667), (0.76666665, 0.8666667), (0.76666665, 0.85), (0.76666665, 0.85), (0.76666665, 0.8666667), (0.7583333, 0.8666667), (0.7583333, 0.85), (0.7583333, 0.85), (0.7583333, 0.8666667), (0.75, 0.8666667), (0.75, 0.85), (0.75, 0.85), (0.75, 0.8666667), (0.7416667, 0.8666667), (0.7416667, 0.85), (0.7416667, 0.85), (0.7416667, 0.8666667), (0.73333335, 0.8666667), (0.73333335, 0.85), (0.73333335, 0.85), (0.73333335, 0.8666667), (0.725, 0.8666667), (0.725, 0.85), (0.725, 0.85), (0.725, 0.8666667), (0.71666664, 0.8666667), (0.71666664, 0.85), (0.71666664, 0.85), (0.71666664, 0.8666667), (0.7083333, 0.8666667), (0.7083333, 0.85), (0.7083333, 0.85), (0.7083333, 0.8666667), (0.7, 0.8666667), (0.7, 0.85), (0.7, 0.85), (0.7, 0.8666667), (0.69166666, 0.8666667), (0.69166666, 0.85), (0.69166666, 0.85), (0.69166666, 0.8666667), (0.68333334, 0.8666667), (0.68333334, 0.85), (0.68333334, 0.85), (0.68333334, 0.8666667), (0.675, 0.8666667), (0.675, 0.85), (0.675, 0.85), (0.675, 0.8666667), (0.6666667, 0.8666667), (0.6666667, 0.85), (0.6666667, 0.85), (0.6666667, 0.8666667), (0.65833336, 0.8666667), (0.65833336, 0.85), (0.65833336, 0.85), (0.65833336, 0.8666667), (0.65, 0.8666667), (0.65, 0.85), (0.65, 0.85), (0.65, 0.8666667), (0.64166665, 0.8666667), (0.64166665, 0.85), (0.64166665, 0.85), (0.64166665, 0.8666667), (0.6333333, 0.8666667), (0.6333333, 0.85), (0.6333333, 0.85), (0.6333333, 0.8666667), (0.625, 0.8666667), (0.625, 0.85), (0.625, 0.85), (0.625, 0.8666667), (0.6166667, 0.8666667), (0.6166667, 0.85), (0.6166667, 0.85), (0.6166667, 0.8666667), (0.60833335, 0.8666667), (0.60833335, 0.85), (0.60833335, 0.85), (0.60833335, 0.8666667), (0.6, 0.8666667), (0.6, 0.85), (0.6, 0.85), (0.6, 0.8666667), (0.59166664, 0.8666667), (0.59166664, 0.85), (0.59166664, 0.85), (0.59166664, 0.8666667), (0.5833333, 0.8666667), (0.5833333, 0.85), (0.5833333, 0.85), (0.5833333, 0.8666667), (0.575, 0.8666667), (0.575, 0.85), (0.575, 0.85), (0.575, 0.8666667), (0.56666666, 0.8666667), (0.56666666, 0.85), (0.56666666, 0.85), (0.56666666, 0.8666667), (0.55833334, 0.8666667), (0.55833334, 0.85), (0.55833334, 0.85), (0.55833334, 0.8666667), (0.55, 0.8666667), (0.55, 0.85), (0.55, 0.85), (0.55, 0.8666667), (0.5416667, 0.8666667), (0.5416667, 0.85), (0.5416667, 0.85), (0.5416667, 0.8666667), (0.53333336, 0.8666667), (0.53333336, 0.85), (0.53333336, 0.85), (0.53333336, 0.8666667), (0.525, 0.8666667), (0.525, 0.85), (0.525, 0.85), (0.525, 0.8666667), (0.51666665, 0.8666667), (0.51666665, 0.85), (0.51666665, 0.85), (0.51666665, 0.8666667), (0.5083333, 0.8666667), (0.5083333, 0.85), (0.5083333, 0.85), (0.5083333, 0.8666667), (0.5, 0.8666667), (0.5, 0.85), (0.5, 0.85), (0.5, 0.8666667), (0.49166667, 0.8666667), (0.49166667, 0.85), (0.49166667, 0.85), (0.49166667, 0.8666667), (0.48333332, 0.8666667), (0.48333332, 0.85), (0.48333332, 0.85), (0.48333332, 0.8666667), (0.475, 0.8666667), (0.475, 0.85), (0.475, 0.85), (0.475, 0.8666667), (0.46666667, 0.8666667), (0.46666667, 0.85), (0.46666667, 0.85), (0.46666667, 0.8666667), (0.45833334, 0.8666667), (0.45833334, 0.85), (0.45833334, 0.85), (0.45833334, 0.8666667), (0.45, 0.8666667), (0.45, 0.85), (0.45, 0.85), (0.45, 0.8666667), (0.44166666, 0.8666667), (0.44166666, 0.85), (0.44166666, 0.85), (0.44166666, 0.8666667), (0.43333334, 0.8666667), (0.43333334, 0.85), (0.43333334, 0.85), (0.43333334, 0.8666667), (0.425, 0.8666667), (0.425, 0.85), (0.425, 0.85), (0.425, 0.8666667), (0.41666666, 0.8666667), (0.41666666, 0.85), (0.41666666, 0.85), (0.41666666, 0.8666667), (0.40833333, 0.8666667), (0.40833333, 0.85), (0.40833333, 0.85), (0.40833333, 0.8666667), (0.4, 0.8666667), (0.4, 0.85), (0.4, 0.85), (0.4, 0.8666667), (0.39166668, 0.8666667), (0.39166668, 0.85), (0.39166668, 0.85), (0.39166668, 0.8666667), (0.38333333, 0.8666667), (0.38333333, 0.85), (0.38333333, 0.85), (0.38333333, 0.8666667), (0.375, 0.8666667), (0.375, 0.85), (0.375, 0.85), (0.375, 0.8666667), (0.36666667, 0.8666667), (0.36666667, 0.85), (0.36666667, 0.85), (0.36666667, 0.8666667), (0.35833332, 0.8666667), (0.35833332, 0.85), (0.35833332, 0.85), (0.35833332, 0.8666667), (0.35, 0.8666667), (0.35, 0.85), (0.35, 0.85), (0.35, 0.8666667), (0.34166667, 0.8666667), (0.34166667, 0.85), (0.34166667, 0.85), (0.34166667, 0.8666667), (0.33333334, 0.8666667), (0.33333334, 0.85), (0.33333334, 0.85), (0.33333334, 0.8666667), (0.325, 0.8666667), (0.325, 0.85), (0.325, 0.85), (0.325, 0.8666667), (0.31666666, 0.8666667), (0.31666666, 0.85), (0.31666666, 0.85), (0.31666666, 0.8666667), (0.30833334, 0.8666667), (0.30833334, 0.85), (0.30833334, 0.85), (0.30833334, 0.8666667), (0.3, 0.8666667), (0.3, 0.85), (0.3, 0.85), (0.3, 0.8666667), (0.29166666, 0.8666667), (0.29166666, 0.85), (0.29166666, 0.85), (0.29166666, 0.8666667), (0.28333333, 0.8666667), (0.28333333, 0.85), (0.28333333, 0.85), (0.28333333, 0.8666667), (0.275, 0.8666667), (0.275, 0.85), (0.275, 0.85), (0.275, 0.8666667), (0.26666668, 0.8666667), (0.26666668, 0.85), (0.26666668, 0.85), (0.26666668, 0.8666667), (0.25833333, 0.8666667), (0.25833333, 0.85), (0.25833333, 0.85), (0.25833333, 0.8666667), (0.25, 0.8666667), (0.25, 0.85), (0.25, 0.85), (0.25, 0.8666667), (0.24166666, 0.8666667), (0.24166666, 0.85), (0.24166666, 0.85), (0.24166666, 0.8666667), (0.23333333, 0.8666667), (0.23333333, 0.85), (0.23333333, 0.85), (0.23333333, 0.8666667), (0.225, 0.8666667), (0.225, 0.85), (0.225, 0.85), (0.225, 0.8666667), (0.21666667, 0.8666667), (0.21666667, 0.85), (0.21666667, 0.85), (0.21666667, 0.8666667), (0.20833333, 0.8666667), (0.20833333, 0.85), (0.20833333, 0.85), (0.20833333, 0.8666667), (0.2, 0.8666667), (0.2, 0.85), (0.2, 0.85), (0.2, 0.8666667), (0.19166666, 0.8666667), (0.19166666, 0.85), (0.19166666, 0.85), (0.19166666, 0.8666667), (0.18333334, 0.8666667), (0.18333334, 0.85), (0.18333334, 0.85), (0.18333334, 0.8666667), (0.175, 0.8666667), (0.175, 0.85), (0.175, 0.85), (0.175, 0.8666667), (0.16666667, 0.8666667), (0.16666667, 0.85), (0.16666667, 0.85), (0.16666667, 0.8666667), (0.15833333, 0.8666667), (0.15833333, 0.85), (0.15833333, 0.85), (0.15833333, 0.8666667), (0.15, 0.8666667), (0.15, 0.85), (0.15, 0.85), (0.15, 0.8666667), (0.14166667, 0.8666667), (0.14166667, 0.85), (0.14166667, 0.85), (0.14166667, 0.8666667), (0.13333334, 0.8666667), (0.13333334, 0.85), (0.13333334, 0.85), (0.13333334, 0.8666667), (0.125, 0.8666667), (0.125, 0.85), (0.125, 0.85), (0.125, 0.8666667), (0.11666667, 0.8666667), (0.11666667, 0.85), (0.11666667, 0.85), (0.11666667, 0.8666667), (0.108333334, 0.8666667), (0.108333334, 0.85), (0.108333334, 0.85), (0.108333334, 0.8666667), (0.1, 0.8666667), (0.1, 0.85), (0.1, 0.85), (0.1, 0.8666667), (0.09166667, 0.8666667), (0.09166667, 0.85), (0.09166667, 0.85), (0.09166667, 0.8666667), (0.083333336, 0.8666667), (0.083333336, 0.85), (0.083333336, 0.85), (0.083333336, 0.8666667), (0.075, 0.8666667), (0.075, 0.85), (0.075, 0.85), (0.075, 0.8666667), (0.06666667, 0.8666667), (0.06666667, 0.85), (0.06666667, 0.85), (0.06666667, 0.8666667), (0.058333334, 0.8666667), (0.058333334, 0.85), (0.058333334, 0.85), (0.058333334, 0.8666667), (0.05, 0.8666667), (0.05, 0.85), (0.05, 0.85), (0.05, 0.8666667), (0.041666668, 0.8666667), (0.041666668, 0.85), (0.041666668, 0.85), (0.041666668, 0.8666667), (0.033333335, 0.8666667), (0.033333335, 0.85), (0.033333335, 0.85), (0.033333335, 0.8666667), (0.025, 0.8666667), (0.025, 0.85), (0.025, 0.85), (0.025, 0.8666667), (0.016666668, 0.8666667), (0.016666668, 0.85), (0.016666668, 0.85), (0.016666668, 0.8666667), (0.008333334, 0.8666667), (0.008333334, 0.85), (0.008333334, 0.85), (0.008333334, 0.8666667), (0, 0.8666667), (0, 0.85), (1, 0.8666667), (1, 0.8833333), (0.9916667, 0.8833333), (0.9916667, 0.8666667), (0.9916667, 0.8666667), (0.9916667, 0.8833333), (0.98333335, 0.8833333), (0.98333335, 0.8666667), (0.98333335, 0.8666667), (0.98333335, 0.8833333), (0.975, 0.8833333), (0.975, 0.8666667), (0.975, 0.8666667), (0.975, 0.8833333), (0.96666664, 0.8833333), (0.96666664, 0.8666667), (0.96666664, 0.8666667), (0.96666664, 0.8833333), (0.9583333, 0.8833333), (0.9583333, 0.8666667), (0.9583333, 0.8666667), (0.9583333, 0.8833333), (0.95, 0.8833333), (0.95, 0.8666667), (0.95, 0.8666667), (0.95, 0.8833333), (0.94166666, 0.8833333), (0.94166666, 0.8666667), (0.94166666, 0.8666667), (0.94166666, 0.8833333), (0.93333334, 0.8833333), (0.93333334, 0.8666667), (0.93333334, 0.8666667), (0.93333334, 0.8833333), (0.925, 0.8833333), (0.925, 0.8666667), (0.925, 0.8666667), (0.925, 0.8833333), (0.9166667, 0.8833333), (0.9166667, 0.8666667), (0.9166667, 0.8666667), (0.9166667, 0.8833333), (0.90833336, 0.8833333), (0.90833336, 0.8666667), (0.90833336, 0.8666667), (0.90833336, 0.8833333), (0.9, 0.8833333), (0.9, 0.8666667), (0.9, 0.8666667), (0.9, 0.8833333), (0.89166665, 0.8833333), (0.89166665, 0.8666667), (0.89166665, 0.8666667), (0.89166665, 0.8833333), (0.8833333, 0.8833333), (0.8833333, 0.8666667), (0.8833333, 0.8666667), (0.8833333, 0.8833333), (0.875, 0.8833333), (0.875, 0.8666667), (0.875, 0.8666667), (0.875, 0.8833333), (0.8666667, 0.8833333), (0.8666667, 0.8666667), (0.8666667, 0.8666667), (0.8666667, 0.8833333), (0.85833335, 0.8833333), (0.85833335, 0.8666667), (0.85833335, 0.8666667), (0.85833335, 0.8833333), (0.85, 0.8833333), (0.85, 0.8666667), (0.85, 0.8666667), (0.85, 0.8833333), (0.84166664, 0.8833333), (0.84166664, 0.8666667), (0.84166664, 0.8666667), (0.84166664, 0.8833333), (0.8333333, 0.8833333), (0.8333333, 0.8666667), (0.8333333, 0.8666667), (0.8333333, 0.8833333), (0.825, 0.8833333), (0.825, 0.8666667), (0.825, 0.8666667), (0.825, 0.8833333), (0.81666666, 0.8833333), (0.81666666, 0.8666667), (0.81666666, 0.8666667), (0.81666666, 0.8833333), (0.80833334, 0.8833333), (0.80833334, 0.8666667), (0.80833334, 0.8666667), (0.80833334, 0.8833333), (0.8, 0.8833333), (0.8, 0.8666667), (0.8, 0.8666667), (0.8, 0.8833333), (0.7916667, 0.8833333), (0.7916667, 0.8666667), (0.7916667, 0.8666667), (0.7916667, 0.8833333), (0.78333336, 0.8833333), (0.78333336, 0.8666667), (0.78333336, 0.8666667), (0.78333336, 0.8833333), (0.775, 0.8833333), (0.775, 0.8666667), (0.775, 0.8666667), (0.775, 0.8833333), (0.76666665, 0.8833333), (0.76666665, 0.8666667), (0.76666665, 0.8666667), (0.76666665, 0.8833333), (0.7583333, 0.8833333), (0.7583333, 0.8666667), (0.7583333, 0.8666667), (0.7583333, 0.8833333), (0.75, 0.8833333), (0.75, 0.8666667), (0.75, 0.8666667), (0.75, 0.8833333), (0.7416667, 0.8833333), (0.7416667, 0.8666667), (0.7416667, 0.8666667), (0.7416667, 0.8833333), (0.73333335, 0.8833333), (0.73333335, 0.8666667), (0.73333335, 0.8666667), (0.73333335, 0.8833333), (0.725, 0.8833333), (0.725, 0.8666667), (0.725, 0.8666667), (0.725, 0.8833333), (0.71666664, 0.8833333), (0.71666664, 0.8666667), (0.71666664, 0.8666667), (0.71666664, 0.8833333), (0.7083333, 0.8833333), (0.7083333, 0.8666667), (0.7083333, 0.8666667), (0.7083333, 0.8833333), (0.7, 0.8833333), (0.7, 0.8666667), (0.7, 0.8666667), (0.7, 0.8833333), (0.69166666, 0.8833333), (0.69166666, 0.8666667), (0.69166666, 0.8666667), (0.69166666, 0.8833333), (0.68333334, 0.8833333), (0.68333334, 0.8666667), (0.68333334, 0.8666667), (0.68333334, 0.8833333), (0.675, 0.8833333), (0.675, 0.8666667), (0.675, 0.8666667), (0.675, 0.8833333), (0.6666667, 0.8833333), (0.6666667, 0.8666667), (0.6666667, 0.8666667), (0.6666667, 0.8833333), (0.65833336, 0.8833333), (0.65833336, 0.8666667), (0.65833336, 0.8666667), (0.65833336, 0.8833333), (0.65, 0.8833333), (0.65, 0.8666667), (0.65, 0.8666667), (0.65, 0.8833333), (0.64166665, 0.8833333), (0.64166665, 0.8666667), (0.64166665, 0.8666667), (0.64166665, 0.8833333), (0.6333333, 0.8833333), (0.6333333, 0.8666667), (0.6333333, 0.8666667), (0.6333333, 0.8833333), (0.625, 0.8833333), (0.625, 0.8666667), (0.625, 0.8666667), (0.625, 0.8833333), (0.6166667, 0.8833333), (0.6166667, 0.8666667), (0.6166667, 0.8666667), (0.6166667, 0.8833333), (0.60833335, 0.8833333), (0.60833335, 0.8666667), (0.60833335, 0.8666667), (0.60833335, 0.8833333), (0.6, 0.8833333), (0.6, 0.8666667), (0.6, 0.8666667), (0.6, 0.8833333), (0.59166664, 0.8833333), (0.59166664, 0.8666667), (0.59166664, 0.8666667), (0.59166664, 0.8833333), (0.5833333, 0.8833333), (0.5833333, 0.8666667), (0.5833333, 0.8666667), (0.5833333, 0.8833333), (0.575, 0.8833333), (0.575, 0.8666667), (0.575, 0.8666667), (0.575, 0.8833333), (0.56666666, 0.8833333), (0.56666666, 0.8666667), (0.56666666, 0.8666667), (0.56666666, 0.8833333), (0.55833334, 0.8833333), (0.55833334, 0.8666667), (0.55833334, 0.8666667), (0.55833334, 0.8833333), (0.55, 0.8833333), (0.55, 0.8666667), (0.55, 0.8666667), (0.55, 0.8833333), (0.5416667, 0.8833333), (0.5416667, 0.8666667), (0.5416667, 0.8666667), (0.5416667, 0.8833333), (0.53333336, 0.8833333), (0.53333336, 0.8666667), (0.53333336, 0.8666667), (0.53333336, 0.8833333), (0.525, 0.8833333), (0.525, 0.8666667), (0.525, 0.8666667), (0.525, 0.8833333), (0.51666665, 0.8833333), (0.51666665, 0.8666667), (0.51666665, 0.8666667), (0.51666665, 0.8833333), (0.5083333, 0.8833333), (0.5083333, 0.8666667), (0.5083333, 0.8666667), (0.5083333, 0.8833333), (0.5, 0.8833333), (0.5, 0.8666667), (0.5, 0.8666667), (0.5, 0.8833333), (0.49166667, 0.8833333), (0.49166667, 0.8666667), (0.49166667, 0.8666667), (0.49166667, 0.8833333), (0.48333332, 0.8833333), (0.48333332, 0.8666667), (0.48333332, 0.8666667), (0.48333332, 0.8833333), (0.475, 0.8833333), (0.475, 0.8666667), (0.475, 0.8666667), (0.475, 0.8833333), (0.46666667, 0.8833333), (0.46666667, 0.8666667), (0.46666667, 0.8666667), (0.46666667, 0.8833333), (0.45833334, 0.8833333), (0.45833334, 0.8666667), (0.45833334, 0.8666667), (0.45833334, 0.8833333), (0.45, 0.8833333), (0.45, 0.8666667), (0.45, 0.8666667), (0.45, 0.8833333), (0.44166666, 0.8833333), (0.44166666, 0.8666667), (0.44166666, 0.8666667), (0.44166666, 0.8833333), (0.43333334, 0.8833333), (0.43333334, 0.8666667), (0.43333334, 0.8666667), (0.43333334, 0.8833333), (0.425, 0.8833333), (0.425, 0.8666667), (0.425, 0.8666667), (0.425, 0.8833333), (0.41666666, 0.8833333), (0.41666666, 0.8666667), (0.41666666, 0.8666667), (0.41666666, 0.8833333), (0.40833333, 0.8833333), (0.40833333, 0.8666667), (0.40833333, 0.8666667), (0.40833333, 0.8833333), (0.4, 0.8833333), (0.4, 0.8666667), (0.4, 0.8666667), (0.4, 0.8833333), (0.39166668, 0.8833333), (0.39166668, 0.8666667), (0.39166668, 0.8666667), (0.39166668, 0.8833333), (0.38333333, 0.8833333), (0.38333333, 0.8666667), (0.38333333, 0.8666667), (0.38333333, 0.8833333), (0.375, 0.8833333), (0.375, 0.8666667), (0.375, 0.8666667), (0.375, 0.8833333), (0.36666667, 0.8833333), (0.36666667, 0.8666667), (0.36666667, 0.8666667), (0.36666667, 0.8833333), (0.35833332, 0.8833333), (0.35833332, 0.8666667), (0.35833332, 0.8666667), (0.35833332, 0.8833333), (0.35, 0.8833333), (0.35, 0.8666667), (0.35, 0.8666667), (0.35, 0.8833333), (0.34166667, 0.8833333), (0.34166667, 0.8666667), (0.34166667, 0.8666667), (0.34166667, 0.8833333), (0.33333334, 0.8833333), (0.33333334, 0.8666667), (0.33333334, 0.8666667), (0.33333334, 0.8833333), (0.325, 0.8833333), (0.325, 0.8666667), (0.325, 0.8666667), (0.325, 0.8833333), (0.31666666, 0.8833333), (0.31666666, 0.8666667), (0.31666666, 0.8666667), (0.31666666, 0.8833333), (0.30833334, 0.8833333), (0.30833334, 0.8666667), (0.30833334, 0.8666667), (0.30833334, 0.8833333), (0.3, 0.8833333), (0.3, 0.8666667), (0.3, 0.8666667), (0.3, 0.8833333), (0.29166666, 0.8833333), (0.29166666, 0.8666667), (0.29166666, 0.8666667), (0.29166666, 0.8833333), (0.28333333, 0.8833333), (0.28333333, 0.8666667), (0.28333333, 0.8666667), (0.28333333, 0.8833333), (0.275, 0.8833333), (0.275, 0.8666667), (0.275, 0.8666667), (0.275, 0.8833333), (0.26666668, 0.8833333), (0.26666668, 0.8666667), (0.26666668, 0.8666667), (0.26666668, 0.8833333), (0.25833333, 0.8833333), (0.25833333, 0.8666667), (0.25833333, 0.8666667), (0.25833333, 0.8833333), (0.25, 0.8833333), (0.25, 0.8666667), (0.25, 0.8666667), (0.25, 0.8833333), (0.24166666, 0.8833333), (0.24166666, 0.8666667), (0.24166666, 0.8666667), (0.24166666, 0.8833333), (0.23333333, 0.8833333), (0.23333333, 0.8666667), (0.23333333, 0.8666667), (0.23333333, 0.8833333), (0.225, 0.8833333), (0.225, 0.8666667), (0.225, 0.8666667), (0.225, 0.8833333), (0.21666667, 0.8833333), (0.21666667, 0.8666667), (0.21666667, 0.8666667), (0.21666667, 0.8833333), (0.20833333, 0.8833333), (0.20833333, 0.8666667), (0.20833333, 0.8666667), (0.20833333, 0.8833333), (0.2, 0.8833333), (0.2, 0.8666667), (0.2, 0.8666667), (0.2, 0.8833333), (0.19166666, 0.8833333), (0.19166666, 0.8666667), (0.19166666, 0.8666667), (0.19166666, 0.8833333), (0.18333334, 0.8833333), (0.18333334, 0.8666667), (0.18333334, 0.8666667), (0.18333334, 0.8833333), (0.175, 0.8833333), (0.175, 0.8666667), (0.175, 0.8666667), (0.175, 0.8833333), (0.16666667, 0.8833333), (0.16666667, 0.8666667), (0.16666667, 0.8666667), (0.16666667, 0.8833333), (0.15833333, 0.8833333), (0.15833333, 0.8666667), (0.15833333, 0.8666667), (0.15833333, 0.8833333), (0.15, 0.8833333), (0.15, 0.8666667), (0.15, 0.8666667), (0.15, 0.8833333), (0.14166667, 0.8833333), (0.14166667, 0.8666667), (0.14166667, 0.8666667), (0.14166667, 0.8833333), (0.13333334, 0.8833333), (0.13333334, 0.8666667), (0.13333334, 0.8666667), (0.13333334, 0.8833333), (0.125, 0.8833333), (0.125, 0.8666667), (0.125, 0.8666667), (0.125, 0.8833333), (0.11666667, 0.8833333), (0.11666667, 0.8666667), (0.11666667, 0.8666667), (0.11666667, 0.8833333), (0.108333334, 0.8833333), (0.108333334, 0.8666667), (0.108333334, 0.8666667), (0.108333334, 0.8833333), (0.1, 0.8833333), (0.1, 0.8666667), (0.1, 0.8666667), (0.1, 0.8833333), (0.09166667, 0.8833333), (0.09166667, 0.8666667), (0.09166667, 0.8666667), (0.09166667, 0.8833333), (0.083333336, 0.8833333), (0.083333336, 0.8666667), (0.083333336, 0.8666667), (0.083333336, 0.8833333), (0.075, 0.8833333), (0.075, 0.8666667), (0.075, 0.8666667), (0.075, 0.8833333), (0.06666667, 0.8833333), (0.06666667, 0.8666667), (0.06666667, 0.8666667), (0.06666667, 0.8833333), (0.058333334, 0.8833333), (0.058333334, 0.8666667), (0.058333334, 0.8666667), (0.058333334, 0.8833333), (0.05, 0.8833333), (0.05, 0.8666667), (0.05, 0.8666667), (0.05, 0.8833333), (0.041666668, 0.8833333), (0.041666668, 0.8666667), (0.041666668, 0.8666667), (0.041666668, 0.8833333), (0.033333335, 0.8833333), (0.033333335, 0.8666667), (0.033333335, 0.8666667), (0.033333335, 0.8833333), (0.025, 0.8833333), (0.025, 0.8666667), (0.025, 0.8666667), (0.025, 0.8833333), (0.016666668, 0.8833333), (0.016666668, 0.8666667), (0.016666668, 0.8666667), (0.016666668, 0.8833333), (0.008333334, 0.8833333), (0.008333334, 0.8666667), (0.008333334, 0.8666667), (0.008333334, 0.8833333), (0, 0.8833333), (0, 0.8666667), (1, 0.8833333), (1, 0.9), (0.9916667, 0.9), (0.9916667, 0.8833333), (0.9916667, 0.8833333), (0.9916667, 0.9), (0.98333335, 0.9), (0.98333335, 0.8833333), (0.98333335, 0.8833333), (0.98333335, 0.9), (0.975, 0.9), (0.975, 0.8833333), (0.975, 0.8833333), (0.975, 0.9), (0.96666664, 0.9), (0.96666664, 0.8833333), (0.96666664, 0.8833333), (0.96666664, 0.9), (0.9583333, 0.9), (0.9583333, 0.8833333), (0.9583333, 0.8833333), (0.9583333, 0.9), (0.95, 0.9), (0.95, 0.8833333), (0.95, 0.8833333), (0.95, 0.9), (0.94166666, 0.9), (0.94166666, 0.8833333), (0.94166666, 0.8833333), (0.94166666, 0.9), (0.93333334, 0.9), (0.93333334, 0.8833333), (0.93333334, 0.8833333), (0.93333334, 0.9), (0.925, 0.9), (0.925, 0.8833333), (0.925, 0.8833333), (0.925, 0.9), (0.9166667, 0.9), (0.9166667, 0.8833333), (0.9166667, 0.8833333), (0.9166667, 0.9), (0.90833336, 0.9), (0.90833336, 0.8833333), (0.90833336, 0.8833333), (0.90833336, 0.9), (0.9, 0.9), (0.9, 0.8833333), (0.9, 0.8833333), (0.9, 0.9), (0.89166665, 0.9), (0.89166665, 0.8833333), (0.89166665, 0.8833333), (0.89166665, 0.9), (0.8833333, 0.9), (0.8833333, 0.8833333), (0.8833333, 0.8833333), (0.8833333, 0.9), (0.875, 0.9), (0.875, 0.8833333), (0.875, 0.8833333), (0.875, 0.9), (0.8666667, 0.9), (0.8666667, 0.8833333), (0.8666667, 0.8833333), (0.8666667, 0.9), (0.85833335, 0.9), (0.85833335, 0.8833333), (0.85833335, 0.8833333), (0.85833335, 0.9), (0.85, 0.9), (0.85, 0.8833333), (0.85, 0.8833333), (0.85, 0.9), (0.84166664, 0.9), (0.84166664, 0.8833333), (0.84166664, 0.8833333), (0.84166664, 0.9), (0.8333333, 0.9), (0.8333333, 0.8833333), (0.8333333, 0.8833333), (0.8333333, 0.9), (0.825, 0.9), (0.825, 0.8833333), (0.825, 0.8833333), (0.825, 0.9), (0.81666666, 0.9), (0.81666666, 0.8833333), (0.81666666, 0.8833333), (0.81666666, 0.9), (0.80833334, 0.9), (0.80833334, 0.8833333), (0.80833334, 0.8833333), (0.80833334, 0.9), (0.8, 0.9), (0.8, 0.8833333), (0.8, 0.8833333), (0.8, 0.9), (0.7916667, 0.9), (0.7916667, 0.8833333), (0.7916667, 0.8833333), (0.7916667, 0.9), (0.78333336, 0.9), (0.78333336, 0.8833333), (0.78333336, 0.8833333), (0.78333336, 0.9), (0.775, 0.9), (0.775, 0.8833333), (0.775, 0.8833333), (0.775, 0.9), (0.76666665, 0.9), (0.76666665, 0.8833333), (0.76666665, 0.8833333), (0.76666665, 0.9), (0.7583333, 0.9), (0.7583333, 0.8833333), (0.7583333, 0.8833333), (0.7583333, 0.9), (0.75, 0.9), (0.75, 0.8833333), (0.75, 0.8833333), (0.75, 0.9), (0.7416667, 0.9), (0.7416667, 0.8833333), (0.7416667, 0.8833333), (0.7416667, 0.9), (0.73333335, 0.9), (0.73333335, 0.8833333), (0.73333335, 0.8833333), (0.73333335, 0.9), (0.725, 0.9), (0.725, 0.8833333), (0.725, 0.8833333), (0.725, 0.9), (0.71666664, 0.9), (0.71666664, 0.8833333), (0.71666664, 0.8833333), (0.71666664, 0.9), (0.7083333, 0.9), (0.7083333, 0.8833333), (0.7083333, 0.8833333), (0.7083333, 0.9), (0.7, 0.9), (0.7, 0.8833333), (0.7, 0.8833333), (0.7, 0.9), (0.69166666, 0.9), (0.69166666, 0.8833333), (0.69166666, 0.8833333), (0.69166666, 0.9), (0.68333334, 0.9), (0.68333334, 0.8833333), (0.68333334, 0.8833333), (0.68333334, 0.9), (0.675, 0.9), (0.675, 0.8833333), (0.675, 0.8833333), (0.675, 0.9), (0.6666667, 0.9), (0.6666667, 0.8833333), (0.6666667, 0.8833333), (0.6666667, 0.9), (0.65833336, 0.9), (0.65833336, 0.8833333), (0.65833336, 0.8833333), (0.65833336, 0.9), (0.65, 0.9), (0.65, 0.8833333), (0.65, 0.8833333), (0.65, 0.9), (0.64166665, 0.9), (0.64166665, 0.8833333), (0.64166665, 0.8833333), (0.64166665, 0.9), (0.6333333, 0.9), (0.6333333, 0.8833333), (0.6333333, 0.8833333), (0.6333333, 0.9), (0.625, 0.9), (0.625, 0.8833333), (0.625, 0.8833333), (0.625, 0.9), (0.6166667, 0.9), (0.6166667, 0.8833333), (0.6166667, 0.8833333), (0.6166667, 0.9), (0.60833335, 0.9), (0.60833335, 0.8833333), (0.60833335, 0.8833333), (0.60833335, 0.9), (0.6, 0.9), (0.6, 0.8833333), (0.6, 0.8833333), (0.6, 0.9), (0.59166664, 0.9), (0.59166664, 0.8833333), (0.59166664, 0.8833333), (0.59166664, 0.9), (0.5833333, 0.9), (0.5833333, 0.8833333), (0.5833333, 0.8833333), (0.5833333, 0.9), (0.575, 0.9), (0.575, 0.8833333), (0.575, 0.8833333), (0.575, 0.9), (0.56666666, 0.9), (0.56666666, 0.8833333), (0.56666666, 0.8833333), (0.56666666, 0.9), (0.55833334, 0.9), (0.55833334, 0.8833333), (0.55833334, 0.8833333), (0.55833334, 0.9), (0.55, 0.9), (0.55, 0.8833333), (0.55, 0.8833333), (0.55, 0.9), (0.5416667, 0.9), (0.5416667, 0.8833333), (0.5416667, 0.8833333), (0.5416667, 0.9), (0.53333336, 0.9), (0.53333336, 0.8833333), (0.53333336, 0.8833333), (0.53333336, 0.9), (0.525, 0.9), (0.525, 0.8833333), (0.525, 0.8833333), (0.525, 0.9), (0.51666665, 0.9), (0.51666665, 0.8833333), (0.51666665, 0.8833333), (0.51666665, 0.9), (0.5083333, 0.9), (0.5083333, 0.8833333), (0.5083333, 0.8833333), (0.5083333, 0.9), (0.5, 0.9), (0.5, 0.8833333), (0.5, 0.8833333), (0.5, 0.9), (0.49166667, 0.9), (0.49166667, 0.8833333), (0.49166667, 0.8833333), (0.49166667, 0.9), (0.48333332, 0.9), (0.48333332, 0.8833333), (0.48333332, 0.8833333), (0.48333332, 0.9), (0.475, 0.9), (0.475, 0.8833333), (0.475, 0.8833333), (0.475, 0.9), (0.46666667, 0.9), (0.46666667, 0.8833333), (0.46666667, 0.8833333), (0.46666667, 0.9), (0.45833334, 0.9), (0.45833334, 0.8833333), (0.45833334, 0.8833333), (0.45833334, 0.9), (0.45, 0.9), (0.45, 0.8833333), (0.45, 0.8833333), (0.45, 0.9), (0.44166666, 0.9), (0.44166666, 0.8833333), (0.44166666, 0.8833333), (0.44166666, 0.9), (0.43333334, 0.9), (0.43333334, 0.8833333), (0.43333334, 0.8833333), (0.43333334, 0.9), (0.425, 0.9), (0.425, 0.8833333), (0.425, 0.8833333), (0.425, 0.9), (0.41666666, 0.9), (0.41666666, 0.8833333), (0.41666666, 0.8833333), (0.41666666, 0.9), (0.40833333, 0.9), (0.40833333, 0.8833333), (0.40833333, 0.8833333), (0.40833333, 0.9), (0.4, 0.9), (0.4, 0.8833333), (0.4, 0.8833333), (0.4, 0.9), (0.39166668, 0.9), (0.39166668, 0.8833333), (0.39166668, 0.8833333), (0.39166668, 0.9), (0.38333333, 0.9), (0.38333333, 0.8833333), (0.38333333, 0.8833333), (0.38333333, 0.9), (0.375, 0.9), (0.375, 0.8833333), (0.375, 0.8833333), (0.375, 0.9), (0.36666667, 0.9), (0.36666667, 0.8833333), (0.36666667, 0.8833333), (0.36666667, 0.9), (0.35833332, 0.9), (0.35833332, 0.8833333), (0.35833332, 0.8833333), (0.35833332, 0.9), (0.35, 0.9), (0.35, 0.8833333), (0.35, 0.8833333), (0.35, 0.9), (0.34166667, 0.9), (0.34166667, 0.8833333), (0.34166667, 0.8833333), (0.34166667, 0.9), (0.33333334, 0.9), (0.33333334, 0.8833333), (0.33333334, 0.8833333), (0.33333334, 0.9), (0.325, 0.9), (0.325, 0.8833333), (0.325, 0.8833333), (0.325, 0.9), (0.31666666, 0.9), (0.31666666, 0.8833333), (0.31666666, 0.8833333), (0.31666666, 0.9), (0.30833334, 0.9), (0.30833334, 0.8833333), (0.30833334, 0.8833333), (0.30833334, 0.9), (0.3, 0.9), (0.3, 0.8833333), (0.3, 0.8833333), (0.3, 0.9), (0.29166666, 0.9), (0.29166666, 0.8833333), (0.29166666, 0.8833333), (0.29166666, 0.9), (0.28333333, 0.9), (0.28333333, 0.8833333), (0.28333333, 0.8833333), (0.28333333, 0.9), (0.275, 0.9), (0.275, 0.8833333), (0.275, 0.8833333), (0.275, 0.9), (0.26666668, 0.9), (0.26666668, 0.8833333), (0.26666668, 0.8833333), (0.26666668, 0.9), (0.25833333, 0.9), (0.25833333, 0.8833333), (0.25833333, 0.8833333), (0.25833333, 0.9), (0.25, 0.9), (0.25, 0.8833333), (0.25, 0.8833333), (0.25, 0.9), (0.24166666, 0.9), (0.24166666, 0.8833333), (0.24166666, 0.8833333), (0.24166666, 0.9), (0.23333333, 0.9), (0.23333333, 0.8833333), (0.23333333, 0.8833333), (0.23333333, 0.9), (0.225, 0.9), (0.225, 0.8833333), (0.225, 0.8833333), (0.225, 0.9), (0.21666667, 0.9), (0.21666667, 0.8833333), (0.21666667, 0.8833333), (0.21666667, 0.9), (0.20833333, 0.9), (0.20833333, 0.8833333), (0.20833333, 0.8833333), (0.20833333, 0.9), (0.2, 0.9), (0.2, 0.8833333), (0.2, 0.8833333), (0.2, 0.9), (0.19166666, 0.9), (0.19166666, 0.8833333), (0.19166666, 0.8833333), (0.19166666, 0.9), (0.18333334, 0.9), (0.18333334, 0.8833333), (0.18333334, 0.8833333), (0.18333334, 0.9), (0.175, 0.9), (0.175, 0.8833333), (0.175, 0.8833333), (0.175, 0.9), (0.16666667, 0.9), (0.16666667, 0.8833333), (0.16666667, 0.8833333), (0.16666667, 0.9), (0.15833333, 0.9), (0.15833333, 0.8833333), (0.15833333, 0.8833333), (0.15833333, 0.9), (0.15, 0.9), (0.15, 0.8833333), (0.15, 0.8833333), (0.15, 0.9), (0.14166667, 0.9), (0.14166667, 0.8833333), (0.14166667, 0.8833333), (0.14166667, 0.9), (0.13333334, 0.9), (0.13333334, 0.8833333), (0.13333334, 0.8833333), (0.13333334, 0.9), (0.125, 0.9), (0.125, 0.8833333), (0.125, 0.8833333), (0.125, 0.9), (0.11666667, 0.9), (0.11666667, 0.8833333), (0.11666667, 0.8833333), (0.11666667, 0.9), (0.108333334, 0.9), (0.108333334, 0.8833333), (0.108333334, 0.8833333), (0.108333334, 0.9), (0.1, 0.9), (0.1, 0.8833333), (0.1, 0.8833333), (0.1, 0.9), (0.09166667, 0.9), (0.09166667, 0.8833333), (0.09166667, 0.8833333), (0.09166667, 0.9), (0.083333336, 0.9), (0.083333336, 0.8833333), (0.083333336, 0.8833333), (0.083333336, 0.9), (0.075, 0.9), (0.075, 0.8833333), (0.075, 0.8833333), (0.075, 0.9), (0.06666667, 0.9), (0.06666667, 0.8833333), (0.06666667, 0.8833333), (0.06666667, 0.9), (0.058333334, 0.9), (0.058333334, 0.8833333), (0.058333334, 0.8833333), (0.058333334, 0.9), (0.05, 0.9), (0.05, 0.8833333), (0.05, 0.8833333), (0.05, 0.9), (0.041666668, 0.9), (0.041666668, 0.8833333), (0.041666668, 0.8833333), (0.041666668, 0.9), (0.033333335, 0.9), (0.033333335, 0.8833333), (0.033333335, 0.8833333), (0.033333335, 0.9), (0.025, 0.9), (0.025, 0.8833333), (0.025, 0.8833333), (0.025, 0.9), (0.016666668, 0.9), (0.016666668, 0.8833333), (0.016666668, 0.8833333), (0.016666668, 0.9), (0.008333334, 0.9), (0.008333334, 0.8833333), (0.008333334, 0.8833333), (0.008333334, 0.9), (0, 0.9), (0, 0.8833333), (1, 0.9), (1, 0.9166667), (0.9916667, 0.9166667), (0.9916667, 0.9), (0.9916667, 0.9), (0.9916667, 0.9166667), (0.98333335, 0.9166667), (0.98333335, 0.9), (0.98333335, 0.9), (0.98333335, 0.9166667), (0.975, 0.9166667), (0.975, 0.9), (0.975, 0.9), (0.975, 0.9166667), (0.96666664, 0.9166667), (0.96666664, 0.9), (0.96666664, 0.9), (0.96666664, 0.9166667), (0.9583333, 0.9166667), (0.9583333, 0.9), (0.9583333, 0.9), (0.9583333, 0.9166667), (0.95, 0.9166667), (0.95, 0.9), (0.95, 0.9), (0.95, 0.9166667), (0.94166666, 0.9166667), (0.94166666, 0.9), (0.94166666, 0.9), (0.94166666, 0.9166667), (0.93333334, 0.9166667), (0.93333334, 0.9), (0.93333334, 0.9), (0.93333334, 0.9166667), (0.925, 0.9166667), (0.925, 0.9), (0.925, 0.9), (0.925, 0.9166667), (0.9166667, 0.9166667), (0.9166667, 0.9), (0.9166667, 0.9), (0.9166667, 0.9166667), (0.90833336, 0.9166667), (0.90833336, 0.9), (0.90833336, 0.9), (0.90833336, 0.9166667), (0.9, 0.9166667), (0.9, 0.9), (0.9, 0.9), (0.9, 0.9166667), (0.89166665, 0.9166667), (0.89166665, 0.9), (0.89166665, 0.9), (0.89166665, 0.9166667), (0.8833333, 0.9166667), (0.8833333, 0.9), (0.8833333, 0.9), (0.8833333, 0.9166667), (0.875, 0.9166667), (0.875, 0.9), (0.875, 0.9), (0.875, 0.9166667), (0.8666667, 0.9166667), (0.8666667, 0.9), (0.8666667, 0.9), (0.8666667, 0.9166667), (0.85833335, 0.9166667), (0.85833335, 0.9), (0.85833335, 0.9), (0.85833335, 0.9166667), (0.85, 0.9166667), (0.85, 0.9), (0.85, 0.9), (0.85, 0.9166667), (0.84166664, 0.9166667), (0.84166664, 0.9), (0.84166664, 0.9), (0.84166664, 0.9166667), (0.8333333, 0.9166667), (0.8333333, 0.9), (0.8333333, 0.9), (0.8333333, 0.9166667), (0.825, 0.9166667), (0.825, 0.9), (0.825, 0.9), (0.825, 0.9166667), (0.81666666, 0.9166667), (0.81666666, 0.9), (0.81666666, 0.9), (0.81666666, 0.9166667), (0.80833334, 0.9166667), (0.80833334, 0.9), (0.80833334, 0.9), (0.80833334, 0.9166667), (0.8, 0.9166667), (0.8, 0.9), (0.8, 0.9), (0.8, 0.9166667), (0.7916667, 0.9166667), (0.7916667, 0.9), (0.7916667, 0.9), (0.7916667, 0.9166667), (0.78333336, 0.9166667), (0.78333336, 0.9), (0.78333336, 0.9), (0.78333336, 0.9166667), (0.775, 0.9166667), (0.775, 0.9), (0.775, 0.9), (0.775, 0.9166667), (0.76666665, 0.9166667), (0.76666665, 0.9), (0.76666665, 0.9), (0.76666665, 0.9166667), (0.7583333, 0.9166667), (0.7583333, 0.9), (0.7583333, 0.9), (0.7583333, 0.9166667), (0.75, 0.9166667), (0.75, 0.9), (0.75, 0.9), (0.75, 0.9166667), (0.7416667, 0.9166667), (0.7416667, 0.9), (0.7416667, 0.9), (0.7416667, 0.9166667), (0.73333335, 0.9166667), (0.73333335, 0.9), (0.73333335, 0.9), (0.73333335, 0.9166667), (0.725, 0.9166667), (0.725, 0.9), (0.725, 0.9), (0.725, 0.9166667), (0.71666664, 0.9166667), (0.71666664, 0.9), (0.71666664, 0.9), (0.71666664, 0.9166667), (0.7083333, 0.9166667), (0.7083333, 0.9), (0.7083333, 0.9), (0.7083333, 0.9166667), (0.7, 0.9166667), (0.7, 0.9), (0.7, 0.9), (0.7, 0.9166667), (0.69166666, 0.9166667), (0.69166666, 0.9), (0.69166666, 0.9), (0.69166666, 0.9166667), (0.68333334, 0.9166667), (0.68333334, 0.9), (0.68333334, 0.9), (0.68333334, 0.9166667), (0.675, 0.9166667), (0.675, 0.9), (0.675, 0.9), (0.675, 0.9166667), (0.6666667, 0.9166667), (0.6666667, 0.9), (0.6666667, 0.9), (0.6666667, 0.9166667), (0.65833336, 0.9166667), (0.65833336, 0.9), (0.65833336, 0.9), (0.65833336, 0.9166667), (0.65, 0.9166667), (0.65, 0.9), (0.65, 0.9), (0.65, 0.9166667), (0.64166665, 0.9166667), (0.64166665, 0.9), (0.64166665, 0.9), (0.64166665, 0.9166667), (0.6333333, 0.9166667), (0.6333333, 0.9), (0.6333333, 0.9), (0.6333333, 0.9166667), (0.625, 0.9166667), (0.625, 0.9), (0.625, 0.9), (0.625, 0.9166667), (0.6166667, 0.9166667), (0.6166667, 0.9), (0.6166667, 0.9), (0.6166667, 0.9166667), (0.60833335, 0.9166667), (0.60833335, 0.9), (0.60833335, 0.9), (0.60833335, 0.9166667), (0.6, 0.9166667), (0.6, 0.9), (0.6, 0.9), (0.6, 0.9166667), (0.59166664, 0.9166667), (0.59166664, 0.9), (0.59166664, 0.9), (0.59166664, 0.9166667), (0.5833333, 0.9166667), (0.5833333, 0.9), (0.5833333, 0.9), (0.5833333, 0.9166667), (0.575, 0.9166667), (0.575, 0.9), (0.575, 0.9), (0.575, 0.9166667), (0.56666666, 0.9166667), (0.56666666, 0.9), (0.56666666, 0.9), (0.56666666, 0.9166667), (0.55833334, 0.9166667), (0.55833334, 0.9), (0.55833334, 0.9), (0.55833334, 0.9166667), (0.55, 0.9166667), (0.55, 0.9), (0.55, 0.9), (0.55, 0.9166667), (0.5416667, 0.9166667), (0.5416667, 0.9), (0.5416667, 0.9), (0.5416667, 0.9166667), (0.53333336, 0.9166667), (0.53333336, 0.9), (0.53333336, 0.9), (0.53333336, 0.9166667), (0.525, 0.9166667), (0.525, 0.9), (0.525, 0.9), (0.525, 0.9166667), (0.51666665, 0.9166667), (0.51666665, 0.9), (0.51666665, 0.9), (0.51666665, 0.9166667), (0.5083333, 0.9166667), (0.5083333, 0.9), (0.5083333, 0.9), (0.5083333, 0.9166667), (0.5, 0.9166667), (0.5, 0.9), (0.5, 0.9), (0.5, 0.9166667), (0.49166667, 0.9166667), (0.49166667, 0.9), (0.49166667, 0.9), (0.49166667, 0.9166667), (0.48333332, 0.9166667), (0.48333332, 0.9), (0.48333332, 0.9), (0.48333332, 0.9166667), (0.475, 0.9166667), (0.475, 0.9), (0.475, 0.9), (0.475, 0.9166667), (0.46666667, 0.9166667), (0.46666667, 0.9), (0.46666667, 0.9), (0.46666667, 0.9166667), (0.45833334, 0.9166667), (0.45833334, 0.9), (0.45833334, 0.9), (0.45833334, 0.9166667), (0.45, 0.9166667), (0.45, 0.9), (0.45, 0.9), (0.45, 0.9166667), (0.44166666, 0.9166667), (0.44166666, 0.9), (0.44166666, 0.9), (0.44166666, 0.9166667), (0.43333334, 0.9166667), (0.43333334, 0.9), (0.43333334, 0.9), (0.43333334, 0.9166667), (0.425, 0.9166667), (0.425, 0.9), (0.425, 0.9), (0.425, 0.9166667), (0.41666666, 0.9166667), (0.41666666, 0.9), (0.41666666, 0.9), (0.41666666, 0.9166667), (0.40833333, 0.9166667), (0.40833333, 0.9), (0.40833333, 0.9), (0.40833333, 0.9166667), (0.4, 0.9166667), (0.4, 0.9), (0.4, 0.9), (0.4, 0.9166667), (0.39166668, 0.9166667), (0.39166668, 0.9), (0.39166668, 0.9), (0.39166668, 0.9166667), (0.38333333, 0.9166667), (0.38333333, 0.9), (0.38333333, 0.9), (0.38333333, 0.9166667), (0.375, 0.9166667), (0.375, 0.9), (0.375, 0.9), (0.375, 0.9166667), (0.36666667, 0.9166667), (0.36666667, 0.9), (0.36666667, 0.9), (0.36666667, 0.9166667), (0.35833332, 0.9166667), (0.35833332, 0.9), (0.35833332, 0.9), (0.35833332, 0.9166667), (0.35, 0.9166667), (0.35, 0.9), (0.35, 0.9), (0.35, 0.9166667), (0.34166667, 0.9166667), (0.34166667, 0.9), (0.34166667, 0.9), (0.34166667, 0.9166667), (0.33333334, 0.9166667), (0.33333334, 0.9), (0.33333334, 0.9), (0.33333334, 0.9166667), (0.325, 0.9166667), (0.325, 0.9), (0.325, 0.9), (0.325, 0.9166667), (0.31666666, 0.9166667), (0.31666666, 0.9), (0.31666666, 0.9), (0.31666666, 0.9166667), (0.30833334, 0.9166667), (0.30833334, 0.9), (0.30833334, 0.9), (0.30833334, 0.9166667), (0.3, 0.9166667), (0.3, 0.9), (0.3, 0.9), (0.3, 0.9166667), (0.29166666, 0.9166667), (0.29166666, 0.9), (0.29166666, 0.9), (0.29166666, 0.9166667), (0.28333333, 0.9166667), (0.28333333, 0.9), (0.28333333, 0.9), (0.28333333, 0.9166667), (0.275, 0.9166667), (0.275, 0.9), (0.275, 0.9), (0.275, 0.9166667), (0.26666668, 0.9166667), (0.26666668, 0.9), (0.26666668, 0.9), (0.26666668, 0.9166667), (0.25833333, 0.9166667), (0.25833333, 0.9), (0.25833333, 0.9), (0.25833333, 0.9166667), (0.25, 0.9166667), (0.25, 0.9), (0.25, 0.9), (0.25, 0.9166667), (0.24166666, 0.9166667), (0.24166666, 0.9), (0.24166666, 0.9), (0.24166666, 0.9166667), (0.23333333, 0.9166667), (0.23333333, 0.9), (0.23333333, 0.9), (0.23333333, 0.9166667), (0.225, 0.9166667), (0.225, 0.9), (0.225, 0.9), (0.225, 0.9166667), (0.21666667, 0.9166667), (0.21666667, 0.9), (0.21666667, 0.9), (0.21666667, 0.9166667), (0.20833333, 0.9166667), (0.20833333, 0.9), (0.20833333, 0.9), (0.20833333, 0.9166667), (0.2, 0.9166667), (0.2, 0.9), (0.2, 0.9), (0.2, 0.9166667), (0.19166666, 0.9166667), (0.19166666, 0.9), (0.19166666, 0.9), (0.19166666, 0.9166667), (0.18333334, 0.9166667), (0.18333334, 0.9), (0.18333334, 0.9), (0.18333334, 0.9166667), (0.175, 0.9166667), (0.175, 0.9), (0.175, 0.9), (0.175, 0.9166667), (0.16666667, 0.9166667), (0.16666667, 0.9), (0.16666667, 0.9), (0.16666667, 0.9166667), (0.15833333, 0.9166667), (0.15833333, 0.9), (0.15833333, 0.9), (0.15833333, 0.9166667), (0.15, 0.9166667), (0.15, 0.9), (0.15, 0.9), (0.15, 0.9166667), (0.14166667, 0.9166667), (0.14166667, 0.9), (0.14166667, 0.9), (0.14166667, 0.9166667), (0.13333334, 0.9166667), (0.13333334, 0.9), (0.13333334, 0.9), (0.13333334, 0.9166667), (0.125, 0.9166667), (0.125, 0.9), (0.125, 0.9), (0.125, 0.9166667), (0.11666667, 0.9166667), (0.11666667, 0.9), (0.11666667, 0.9), (0.11666667, 0.9166667), (0.108333334, 0.9166667), (0.108333334, 0.9), (0.108333334, 0.9), (0.108333334, 0.9166667), (0.1, 0.9166667), (0.1, 0.9), (0.1, 0.9), (0.1, 0.9166667), (0.09166667, 0.9166667), (0.09166667, 0.9), (0.09166667, 0.9), (0.09166667, 0.9166667), (0.083333336, 0.9166667), (0.083333336, 0.9), (0.083333336, 0.9), (0.083333336, 0.9166667), (0.075, 0.9166667), (0.075, 0.9), (0.075, 0.9), (0.075, 0.9166667), (0.06666667, 0.9166667), (0.06666667, 0.9), (0.06666667, 0.9), (0.06666667, 0.9166667), (0.058333334, 0.9166667), (0.058333334, 0.9), (0.058333334, 0.9), (0.058333334, 0.9166667), (0.05, 0.9166667), (0.05, 0.9), (0.05, 0.9), (0.05, 0.9166667), (0.041666668, 0.9166667), (0.041666668, 0.9), (0.041666668, 0.9), (0.041666668, 0.9166667), (0.033333335, 0.9166667), (0.033333335, 0.9), (0.033333335, 0.9), (0.033333335, 0.9166667), (0.025, 0.9166667), (0.025, 0.9), (0.025, 0.9), (0.025, 0.9166667), (0.016666668, 0.9166667), (0.016666668, 0.9), (0.016666668, 0.9), (0.016666668, 0.9166667), (0.008333334, 0.9166667), (0.008333334, 0.9), (0.008333334, 0.9), (0.008333334, 0.9166667), (0, 0.9166667), (0, 0.9), (1, 0.9166667), (1, 0.93333334), (0.9916667, 0.93333334), (0.9916667, 0.9166667), (0.9916667, 0.9166667), (0.9916667, 0.93333334), (0.98333335, 0.93333334), (0.98333335, 0.9166667), (0.98333335, 0.9166667), (0.98333335, 0.93333334), (0.975, 0.93333334), (0.975, 0.9166667), (0.975, 0.9166667), (0.975, 0.93333334), (0.96666664, 0.93333334), (0.96666664, 0.9166667), (0.96666664, 0.9166667), (0.96666664, 0.93333334), (0.9583333, 0.93333334), (0.9583333, 0.9166667), (0.9583333, 0.9166667), (0.9583333, 0.93333334), (0.95, 0.93333334), (0.95, 0.9166667), (0.95, 0.9166667), (0.95, 0.93333334), (0.94166666, 0.93333334), (0.94166666, 0.9166667), (0.94166666, 0.9166667), (0.94166666, 0.93333334), (0.93333334, 0.93333334), (0.93333334, 0.9166667), (0.93333334, 0.9166667), (0.93333334, 0.93333334), (0.925, 0.93333334), (0.925, 0.9166667), (0.925, 0.9166667), (0.925, 0.93333334), (0.9166667, 0.93333334), (0.9166667, 0.9166667), (0.9166667, 0.9166667), (0.9166667, 0.93333334), (0.90833336, 0.93333334), (0.90833336, 0.9166667), (0.90833336, 0.9166667), (0.90833336, 0.93333334), (0.9, 0.93333334), (0.9, 0.9166667), (0.9, 0.9166667), (0.9, 0.93333334), (0.89166665, 0.93333334), (0.89166665, 0.9166667), (0.89166665, 0.9166667), (0.89166665, 0.93333334), (0.8833333, 0.93333334), (0.8833333, 0.9166667), (0.8833333, 0.9166667), (0.8833333, 0.93333334), (0.875, 0.93333334), (0.875, 0.9166667), (0.875, 0.9166667), (0.875, 0.93333334), (0.8666667, 0.93333334), (0.8666667, 0.9166667), (0.8666667, 0.9166667), (0.8666667, 0.93333334), (0.85833335, 0.93333334), (0.85833335, 0.9166667), (0.85833335, 0.9166667), (0.85833335, 0.93333334), (0.85, 0.93333334), (0.85, 0.9166667), (0.85, 0.9166667), (0.85, 0.93333334), (0.84166664, 0.93333334), (0.84166664, 0.9166667), (0.84166664, 0.9166667), (0.84166664, 0.93333334), (0.8333333, 0.93333334), (0.8333333, 0.9166667), (0.8333333, 0.9166667), (0.8333333, 0.93333334), (0.825, 0.93333334), (0.825, 0.9166667), (0.825, 0.9166667), (0.825, 0.93333334), (0.81666666, 0.93333334), (0.81666666, 0.9166667), (0.81666666, 0.9166667), (0.81666666, 0.93333334), (0.80833334, 0.93333334), (0.80833334, 0.9166667), (0.80833334, 0.9166667), (0.80833334, 0.93333334), (0.8, 0.93333334), (0.8, 0.9166667), (0.8, 0.9166667), (0.8, 0.93333334), (0.7916667, 0.93333334), (0.7916667, 0.9166667), (0.7916667, 0.9166667), (0.7916667, 0.93333334), (0.78333336, 0.93333334), (0.78333336, 0.9166667), (0.78333336, 0.9166667), (0.78333336, 0.93333334), (0.775, 0.93333334), (0.775, 0.9166667), (0.775, 0.9166667), (0.775, 0.93333334), (0.76666665, 0.93333334), (0.76666665, 0.9166667), (0.76666665, 0.9166667), (0.76666665, 0.93333334), (0.7583333, 0.93333334), (0.7583333, 0.9166667), (0.7583333, 0.9166667), (0.7583333, 0.93333334), (0.75, 0.93333334), (0.75, 0.9166667), (0.75, 0.9166667), (0.75, 0.93333334), (0.7416667, 0.93333334), (0.7416667, 0.9166667), (0.7416667, 0.9166667), (0.7416667, 0.93333334), (0.73333335, 0.93333334), (0.73333335, 0.9166667), (0.73333335, 0.9166667), (0.73333335, 0.93333334), (0.725, 0.93333334), (0.725, 0.9166667), (0.725, 0.9166667), (0.725, 0.93333334), (0.71666664, 0.93333334), (0.71666664, 0.9166667), (0.71666664, 0.9166667), (0.71666664, 0.93333334), (0.7083333, 0.93333334), (0.7083333, 0.9166667), (0.7083333, 0.9166667), (0.7083333, 0.93333334), (0.7, 0.93333334), (0.7, 0.9166667), (0.7, 0.9166667), (0.7, 0.93333334), (0.69166666, 0.93333334), (0.69166666, 0.9166667), (0.69166666, 0.9166667), (0.69166666, 0.93333334), (0.68333334, 0.93333334), (0.68333334, 0.9166667), (0.68333334, 0.9166667), (0.68333334, 0.93333334), (0.675, 0.93333334), (0.675, 0.9166667), (0.675, 0.9166667), (0.675, 0.93333334), (0.6666667, 0.93333334), (0.6666667, 0.9166667), (0.6666667, 0.9166667), (0.6666667, 0.93333334), (0.65833336, 0.93333334), (0.65833336, 0.9166667), (0.65833336, 0.9166667), (0.65833336, 0.93333334), (0.65, 0.93333334), (0.65, 0.9166667), (0.65, 0.9166667), (0.65, 0.93333334), (0.64166665, 0.93333334), (0.64166665, 0.9166667), (0.64166665, 0.9166667), (0.64166665, 0.93333334), (0.6333333, 0.93333334), (0.6333333, 0.9166667), (0.6333333, 0.9166667), (0.6333333, 0.93333334), (0.625, 0.93333334), (0.625, 0.9166667), (0.625, 0.9166667), (0.625, 0.93333334), (0.6166667, 0.93333334), (0.6166667, 0.9166667), (0.6166667, 0.9166667), (0.6166667, 0.93333334), (0.60833335, 0.93333334), (0.60833335, 0.9166667), (0.60833335, 0.9166667), (0.60833335, 0.93333334), (0.6, 0.93333334), (0.6, 0.9166667), (0.6, 0.9166667), (0.6, 0.93333334), (0.59166664, 0.93333334), (0.59166664, 0.9166667), (0.59166664, 0.9166667), (0.59166664, 0.93333334), (0.5833333, 0.93333334), (0.5833333, 0.9166667), (0.5833333, 0.9166667), (0.5833333, 0.93333334), (0.575, 0.93333334), (0.575, 0.9166667), (0.575, 0.9166667), (0.575, 0.93333334), (0.56666666, 0.93333334), (0.56666666, 0.9166667), (0.56666666, 0.9166667), (0.56666666, 0.93333334), (0.55833334, 0.93333334), (0.55833334, 0.9166667), (0.55833334, 0.9166667), (0.55833334, 0.93333334), (0.55, 0.93333334), (0.55, 0.9166667), (0.55, 0.9166667), (0.55, 0.93333334), (0.5416667, 0.93333334), (0.5416667, 0.9166667), (0.5416667, 0.9166667), (0.5416667, 0.93333334), (0.53333336, 0.93333334), (0.53333336, 0.9166667), (0.53333336, 0.9166667), (0.53333336, 0.93333334), (0.525, 0.93333334), (0.525, 0.9166667), (0.525, 0.9166667), (0.525, 0.93333334), (0.51666665, 0.93333334), (0.51666665, 0.9166667), (0.51666665, 0.9166667), (0.51666665, 0.93333334), (0.5083333, 0.93333334), (0.5083333, 0.9166667), (0.5083333, 0.9166667), (0.5083333, 0.93333334), (0.5, 0.93333334), (0.5, 0.9166667), (0.5, 0.9166667), (0.5, 0.93333334), (0.49166667, 0.93333334), (0.49166667, 0.9166667), (0.49166667, 0.9166667), (0.49166667, 0.93333334), (0.48333332, 0.93333334), (0.48333332, 0.9166667), (0.48333332, 0.9166667), (0.48333332, 0.93333334), (0.475, 0.93333334), (0.475, 0.9166667), (0.475, 0.9166667), (0.475, 0.93333334), (0.46666667, 0.93333334), (0.46666667, 0.9166667), (0.46666667, 0.9166667), (0.46666667, 0.93333334), (0.45833334, 0.93333334), (0.45833334, 0.9166667), (0.45833334, 0.9166667), (0.45833334, 0.93333334), (0.45, 0.93333334), (0.45, 0.9166667), (0.45, 0.9166667), (0.45, 0.93333334), (0.44166666, 0.93333334), (0.44166666, 0.9166667), (0.44166666, 0.9166667), (0.44166666, 0.93333334), (0.43333334, 0.93333334), (0.43333334, 0.9166667), (0.43333334, 0.9166667), (0.43333334, 0.93333334), (0.425, 0.93333334), (0.425, 0.9166667), (0.425, 0.9166667), (0.425, 0.93333334), (0.41666666, 0.93333334), (0.41666666, 0.9166667), (0.41666666, 0.9166667), (0.41666666, 0.93333334), (0.40833333, 0.93333334), (0.40833333, 0.9166667), (0.40833333, 0.9166667), (0.40833333, 0.93333334), (0.4, 0.93333334), (0.4, 0.9166667), (0.4, 0.9166667), (0.4, 0.93333334), (0.39166668, 0.93333334), (0.39166668, 0.9166667), (0.39166668, 0.9166667), (0.39166668, 0.93333334), (0.38333333, 0.93333334), (0.38333333, 0.9166667), (0.38333333, 0.9166667), (0.38333333, 0.93333334), (0.375, 0.93333334), (0.375, 0.9166667), (0.375, 0.9166667), (0.375, 0.93333334), (0.36666667, 0.93333334), (0.36666667, 0.9166667), (0.36666667, 0.9166667), (0.36666667, 0.93333334), (0.35833332, 0.93333334), (0.35833332, 0.9166667), (0.35833332, 0.9166667), (0.35833332, 0.93333334), (0.35, 0.93333334), (0.35, 0.9166667), (0.35, 0.9166667), (0.35, 0.93333334), (0.34166667, 0.93333334), (0.34166667, 0.9166667), (0.34166667, 0.9166667), (0.34166667, 0.93333334), (0.33333334, 0.93333334), (0.33333334, 0.9166667), (0.33333334, 0.9166667), (0.33333334, 0.93333334), (0.325, 0.93333334), (0.325, 0.9166667), (0.325, 0.9166667), (0.325, 0.93333334), (0.31666666, 0.93333334), (0.31666666, 0.9166667), (0.31666666, 0.9166667), (0.31666666, 0.93333334), (0.30833334, 0.93333334), (0.30833334, 0.9166667), (0.30833334, 0.9166667), (0.30833334, 0.93333334), (0.3, 0.93333334), (0.3, 0.9166667), (0.3, 0.9166667), (0.3, 0.93333334), (0.29166666, 0.93333334), (0.29166666, 0.9166667), (0.29166666, 0.9166667), (0.29166666, 0.93333334), (0.28333333, 0.93333334), (0.28333333, 0.9166667), (0.28333333, 0.9166667), (0.28333333, 0.93333334), (0.275, 0.93333334), (0.275, 0.9166667), (0.275, 0.9166667), (0.275, 0.93333334), (0.26666668, 0.93333334), (0.26666668, 0.9166667), (0.26666668, 0.9166667), (0.26666668, 0.93333334), (0.25833333, 0.93333334), (0.25833333, 0.9166667), (0.25833333, 0.9166667), (0.25833333, 0.93333334), (0.25, 0.93333334), (0.25, 0.9166667), (0.25, 0.9166667), (0.25, 0.93333334), (0.24166666, 0.93333334), (0.24166666, 0.9166667), (0.24166666, 0.9166667), (0.24166666, 0.93333334), (0.23333333, 0.93333334), (0.23333333, 0.9166667), (0.23333333, 0.9166667), (0.23333333, 0.93333334), (0.225, 0.93333334), (0.225, 0.9166667), (0.225, 0.9166667), (0.225, 0.93333334), (0.21666667, 0.93333334), (0.21666667, 0.9166667), (0.21666667, 0.9166667), (0.21666667, 0.93333334), (0.20833333, 0.93333334), (0.20833333, 0.9166667), (0.20833333, 0.9166667), (0.20833333, 0.93333334), (0.2, 0.93333334), (0.2, 0.9166667), (0.2, 0.9166667), (0.2, 0.93333334), (0.19166666, 0.93333334), (0.19166666, 0.9166667), (0.19166666, 0.9166667), (0.19166666, 0.93333334), (0.18333334, 0.93333334), (0.18333334, 0.9166667), (0.18333334, 0.9166667), (0.18333334, 0.93333334), (0.175, 0.93333334), (0.175, 0.9166667), (0.175, 0.9166667), (0.175, 0.93333334), (0.16666667, 0.93333334), (0.16666667, 0.9166667), (0.16666667, 0.9166667), (0.16666667, 0.93333334), (0.15833333, 0.93333334), (0.15833333, 0.9166667), (0.15833333, 0.9166667), (0.15833333, 0.93333334), (0.15, 0.93333334), (0.15, 0.9166667), (0.15, 0.9166667), (0.15, 0.93333334), (0.14166667, 0.93333334), (0.14166667, 0.9166667), (0.14166667, 0.9166667), (0.14166667, 0.93333334), (0.13333334, 0.93333334), (0.13333334, 0.9166667), (0.13333334, 0.9166667), (0.13333334, 0.93333334), (0.125, 0.93333334), (0.125, 0.9166667), (0.125, 0.9166667), (0.125, 0.93333334), (0.11666667, 0.93333334), (0.11666667, 0.9166667), (0.11666667, 0.9166667), (0.11666667, 0.93333334), (0.108333334, 0.93333334), (0.108333334, 0.9166667), (0.108333334, 0.9166667), (0.108333334, 0.93333334), (0.1, 0.93333334), (0.1, 0.9166667), (0.1, 0.9166667), (0.1, 0.93333334), (0.09166667, 0.93333334), (0.09166667, 0.9166667), (0.09166667, 0.9166667), (0.09166667, 0.93333334), (0.083333336, 0.93333334), (0.083333336, 0.9166667), (0.083333336, 0.9166667), (0.083333336, 0.93333334), (0.075, 0.93333334), (0.075, 0.9166667), (0.075, 0.9166667), (0.075, 0.93333334), (0.06666667, 0.93333334), (0.06666667, 0.9166667), (0.06666667, 0.9166667), (0.06666667, 0.93333334), (0.058333334, 0.93333334), (0.058333334, 0.9166667), (0.058333334, 0.9166667), (0.058333334, 0.93333334), (0.05, 0.93333334), (0.05, 0.9166667), (0.05, 0.9166667), (0.05, 0.93333334), (0.041666668, 0.93333334), (0.041666668, 0.9166667), (0.041666668, 0.9166667), (0.041666668, 0.93333334), (0.033333335, 0.93333334), (0.033333335, 0.9166667), (0.033333335, 0.9166667), (0.033333335, 0.93333334), (0.025, 0.93333334), (0.025, 0.9166667), (0.025, 0.9166667), (0.025, 0.93333334), (0.016666668, 0.93333334), (0.016666668, 0.9166667), (0.016666668, 0.9166667), (0.016666668, 0.93333334), (0.008333334, 0.93333334), (0.008333334, 0.9166667), (0.008333334, 0.9166667), (0.008333334, 0.93333334), (0, 0.93333334), (0, 0.9166667), (1, 0.93333334), (1, 0.95), (0.9916667, 0.95), (0.9916667, 0.93333334), (0.9916667, 0.93333334), (0.9916667, 0.95), (0.98333335, 0.95), (0.98333335, 0.93333334), (0.98333335, 0.93333334), (0.98333335, 0.95), (0.975, 0.95), (0.975, 0.93333334), (0.975, 0.93333334), (0.975, 0.95), (0.96666664, 0.95), (0.96666664, 0.93333334), (0.96666664, 0.93333334), (0.96666664, 0.95), (0.9583333, 0.95), (0.9583333, 0.93333334), (0.9583333, 0.93333334), (0.9583333, 0.95), (0.95, 0.95), (0.95, 0.93333334), (0.95, 0.93333334), (0.95, 0.95), (0.94166666, 0.95), (0.94166666, 0.93333334), (0.94166666, 0.93333334), (0.94166666, 0.95), (0.93333334, 0.95), (0.93333334, 0.93333334), (0.93333334, 0.93333334), (0.93333334, 0.95), (0.925, 0.95), (0.925, 0.93333334), (0.925, 0.93333334), (0.925, 0.95), (0.9166667, 0.95), (0.9166667, 0.93333334), (0.9166667, 0.93333334), (0.9166667, 0.95), (0.90833336, 0.95), (0.90833336, 0.93333334), (0.90833336, 0.93333334), (0.90833336, 0.95), (0.9, 0.95), (0.9, 0.93333334), (0.9, 0.93333334), (0.9, 0.95), (0.89166665, 0.95), (0.89166665, 0.93333334), (0.89166665, 0.93333334), (0.89166665, 0.95), (0.8833333, 0.95), (0.8833333, 0.93333334), (0.8833333, 0.93333334), (0.8833333, 0.95), (0.875, 0.95), (0.875, 0.93333334), (0.875, 0.93333334), (0.875, 0.95), (0.8666667, 0.95), (0.8666667, 0.93333334), (0.8666667, 0.93333334), (0.8666667, 0.95), (0.85833335, 0.95), (0.85833335, 0.93333334), (0.85833335, 0.93333334), (0.85833335, 0.95), (0.85, 0.95), (0.85, 0.93333334), (0.85, 0.93333334), (0.85, 0.95), (0.84166664, 0.95), (0.84166664, 0.93333334), (0.84166664, 0.93333334), (0.84166664, 0.95), (0.8333333, 0.95), (0.8333333, 0.93333334), (0.8333333, 0.93333334), (0.8333333, 0.95), (0.825, 0.95), (0.825, 0.93333334), (0.825, 0.93333334), (0.825, 0.95), (0.81666666, 0.95), (0.81666666, 0.93333334), (0.81666666, 0.93333334), (0.81666666, 0.95), (0.80833334, 0.95), (0.80833334, 0.93333334), (0.80833334, 0.93333334), (0.80833334, 0.95), (0.8, 0.95), (0.8, 0.93333334), (0.8, 0.93333334), (0.8, 0.95), (0.7916667, 0.95), (0.7916667, 0.93333334), (0.7916667, 0.93333334), (0.7916667, 0.95), (0.78333336, 0.95), (0.78333336, 0.93333334), (0.78333336, 0.93333334), (0.78333336, 0.95), (0.775, 0.95), (0.775, 0.93333334), (0.775, 0.93333334), (0.775, 0.95), (0.76666665, 0.95), (0.76666665, 0.93333334), (0.76666665, 0.93333334), (0.76666665, 0.95), (0.7583333, 0.95), (0.7583333, 0.93333334), (0.7583333, 0.93333334), (0.7583333, 0.95), (0.75, 0.95), (0.75, 0.93333334), (0.75, 0.93333334), (0.75, 0.95), (0.7416667, 0.95), (0.7416667, 0.93333334), (0.7416667, 0.93333334), (0.7416667, 0.95), (0.73333335, 0.95), (0.73333335, 0.93333334), (0.73333335, 0.93333334), (0.73333335, 0.95), (0.725, 0.95), (0.725, 0.93333334), (0.725, 0.93333334), (0.725, 0.95), (0.71666664, 0.95), (0.71666664, 0.93333334), (0.71666664, 0.93333334), (0.71666664, 0.95), (0.7083333, 0.95), (0.7083333, 0.93333334), (0.7083333, 0.93333334), (0.7083333, 0.95), (0.7, 0.95), (0.7, 0.93333334), (0.7, 0.93333334), (0.7, 0.95), (0.69166666, 0.95), (0.69166666, 0.93333334), (0.69166666, 0.93333334), (0.69166666, 0.95), (0.68333334, 0.95), (0.68333334, 0.93333334), (0.68333334, 0.93333334), (0.68333334, 0.95), (0.675, 0.95), (0.675, 0.93333334), (0.675, 0.93333334), (0.675, 0.95), (0.6666667, 0.95), (0.6666667, 0.93333334), (0.6666667, 0.93333334), (0.6666667, 0.95), (0.65833336, 0.95), (0.65833336, 0.93333334), (0.65833336, 0.93333334), (0.65833336, 0.95), (0.65, 0.95), (0.65, 0.93333334), (0.65, 0.93333334), (0.65, 0.95), (0.64166665, 0.95), (0.64166665, 0.93333334), (0.64166665, 0.93333334), (0.64166665, 0.95), (0.6333333, 0.95), (0.6333333, 0.93333334), (0.6333333, 0.93333334), (0.6333333, 0.95), (0.625, 0.95), (0.625, 0.93333334), (0.625, 0.93333334), (0.625, 0.95), (0.6166667, 0.95), (0.6166667, 0.93333334), (0.6166667, 0.93333334), (0.6166667, 0.95), (0.60833335, 0.95), (0.60833335, 0.93333334), (0.60833335, 0.93333334), (0.60833335, 0.95), (0.6, 0.95), (0.6, 0.93333334), (0.6, 0.93333334), (0.6, 0.95), (0.59166664, 0.95), (0.59166664, 0.93333334), (0.59166664, 0.93333334), (0.59166664, 0.95), (0.5833333, 0.95), (0.5833333, 0.93333334), (0.5833333, 0.93333334), (0.5833333, 0.95), (0.575, 0.95), (0.575, 0.93333334), (0.575, 0.93333334), (0.575, 0.95), (0.56666666, 0.95), (0.56666666, 0.93333334), (0.56666666, 0.93333334), (0.56666666, 0.95), (0.55833334, 0.95), (0.55833334, 0.93333334), (0.55833334, 0.93333334), (0.55833334, 0.95), (0.55, 0.95), (0.55, 0.93333334), (0.55, 0.93333334), (0.55, 0.95), (0.5416667, 0.95), (0.5416667, 0.93333334), (0.5416667, 0.93333334), (0.5416667, 0.95), (0.53333336, 0.95), (0.53333336, 0.93333334), (0.53333336, 0.93333334), (0.53333336, 0.95), (0.525, 0.95), (0.525, 0.93333334), (0.525, 0.93333334), (0.525, 0.95), (0.51666665, 0.95), (0.51666665, 0.93333334), (0.51666665, 0.93333334), (0.51666665, 0.95), (0.5083333, 0.95), (0.5083333, 0.93333334), (0.5083333, 0.93333334), (0.5083333, 0.95), (0.5, 0.95), (0.5, 0.93333334), (0.5, 0.93333334), (0.5, 0.95), (0.49166667, 0.95), (0.49166667, 0.93333334), (0.49166667, 0.93333334), (0.49166667, 0.95), (0.48333332, 0.95), (0.48333332, 0.93333334), (0.48333332, 0.93333334), (0.48333332, 0.95), (0.475, 0.95), (0.475, 0.93333334), (0.475, 0.93333334), (0.475, 0.95), (0.46666667, 0.95), (0.46666667, 0.93333334), (0.46666667, 0.93333334), (0.46666667, 0.95), (0.45833334, 0.95), (0.45833334, 0.93333334), (0.45833334, 0.93333334), (0.45833334, 0.95), (0.45, 0.95), (0.45, 0.93333334), (0.45, 0.93333334), (0.45, 0.95), (0.44166666, 0.95), (0.44166666, 0.93333334), (0.44166666, 0.93333334), (0.44166666, 0.95), (0.43333334, 0.95), (0.43333334, 0.93333334), (0.43333334, 0.93333334), (0.43333334, 0.95), (0.425, 0.95), (0.425, 0.93333334), (0.425, 0.93333334), (0.425, 0.95), (0.41666666, 0.95), (0.41666666, 0.93333334), (0.41666666, 0.93333334), (0.41666666, 0.95), (0.40833333, 0.95), (0.40833333, 0.93333334), (0.40833333, 0.93333334), (0.40833333, 0.95), (0.4, 0.95), (0.4, 0.93333334), (0.4, 0.93333334), (0.4, 0.95), (0.39166668, 0.95), (0.39166668, 0.93333334), (0.39166668, 0.93333334), (0.39166668, 0.95), (0.38333333, 0.95), (0.38333333, 0.93333334), (0.38333333, 0.93333334), (0.38333333, 0.95), (0.375, 0.95), (0.375, 0.93333334), (0.375, 0.93333334), (0.375, 0.95), (0.36666667, 0.95), (0.36666667, 0.93333334), (0.36666667, 0.93333334), (0.36666667, 0.95), (0.35833332, 0.95), (0.35833332, 0.93333334), (0.35833332, 0.93333334), (0.35833332, 0.95), (0.35, 0.95), (0.35, 0.93333334), (0.35, 0.93333334), (0.35, 0.95), (0.34166667, 0.95), (0.34166667, 0.93333334), (0.34166667, 0.93333334), (0.34166667, 0.95), (0.33333334, 0.95), (0.33333334, 0.93333334), (0.33333334, 0.93333334), (0.33333334, 0.95), (0.325, 0.95), (0.325, 0.93333334), (0.325, 0.93333334), (0.325, 0.95), (0.31666666, 0.95), (0.31666666, 0.93333334), (0.31666666, 0.93333334), (0.31666666, 0.95), (0.30833334, 0.95), (0.30833334, 0.93333334), (0.30833334, 0.93333334), (0.30833334, 0.95), (0.3, 0.95), (0.3, 0.93333334), (0.3, 0.93333334), (0.3, 0.95), (0.29166666, 0.95), (0.29166666, 0.93333334), (0.29166666, 0.93333334), (0.29166666, 0.95), (0.28333333, 0.95), (0.28333333, 0.93333334), (0.28333333, 0.93333334), (0.28333333, 0.95), (0.275, 0.95), (0.275, 0.93333334), (0.275, 0.93333334), (0.275, 0.95), (0.26666668, 0.95), (0.26666668, 0.93333334), (0.26666668, 0.93333334), (0.26666668, 0.95), (0.25833333, 0.95), (0.25833333, 0.93333334), (0.25833333, 0.93333334), (0.25833333, 0.95), (0.25, 0.95), (0.25, 0.93333334), (0.25, 0.93333334), (0.25, 0.95), (0.24166666, 0.95), (0.24166666, 0.93333334), (0.24166666, 0.93333334), (0.24166666, 0.95), (0.23333333, 0.95), (0.23333333, 0.93333334), (0.23333333, 0.93333334), (0.23333333, 0.95), (0.225, 0.95), (0.225, 0.93333334), (0.225, 0.93333334), (0.225, 0.95), (0.21666667, 0.95), (0.21666667, 0.93333334), (0.21666667, 0.93333334), (0.21666667, 0.95), (0.20833333, 0.95), (0.20833333, 0.93333334), (0.20833333, 0.93333334), (0.20833333, 0.95), (0.2, 0.95), (0.2, 0.93333334), (0.2, 0.93333334), (0.2, 0.95), (0.19166666, 0.95), (0.19166666, 0.93333334), (0.19166666, 0.93333334), (0.19166666, 0.95), (0.18333334, 0.95), (0.18333334, 0.93333334), (0.18333334, 0.93333334), (0.18333334, 0.95), (0.175, 0.95), (0.175, 0.93333334), (0.175, 0.93333334), (0.175, 0.95), (0.16666667, 0.95), (0.16666667, 0.93333334), (0.16666667, 0.93333334), (0.16666667, 0.95), (0.15833333, 0.95), (0.15833333, 0.93333334), (0.15833333, 0.93333334), (0.15833333, 0.95), (0.15, 0.95), (0.15, 0.93333334), (0.15, 0.93333334), (0.15, 0.95), (0.14166667, 0.95), (0.14166667, 0.93333334), (0.14166667, 0.93333334), (0.14166667, 0.95), (0.13333334, 0.95), (0.13333334, 0.93333334), (0.13333334, 0.93333334), (0.13333334, 0.95), (0.125, 0.95), (0.125, 0.93333334), (0.125, 0.93333334), (0.125, 0.95), (0.11666667, 0.95), (0.11666667, 0.93333334), (0.11666667, 0.93333334), (0.11666667, 0.95), (0.108333334, 0.95), (0.108333334, 0.93333334), (0.108333334, 0.93333334), (0.108333334, 0.95), (0.1, 0.95), (0.1, 0.93333334), (0.1, 0.93333334), (0.1, 0.95), (0.09166667, 0.95), (0.09166667, 0.93333334), (0.09166667, 0.93333334), (0.09166667, 0.95), (0.083333336, 0.95), (0.083333336, 0.93333334), (0.083333336, 0.93333334), (0.083333336, 0.95), (0.075, 0.95), (0.075, 0.93333334), (0.075, 0.93333334), (0.075, 0.95), (0.06666667, 0.95), (0.06666667, 0.93333334), (0.06666667, 0.93333334), (0.06666667, 0.95), (0.058333334, 0.95), (0.058333334, 0.93333334), (0.058333334, 0.93333334), (0.058333334, 0.95), (0.05, 0.95), (0.05, 0.93333334), (0.05, 0.93333334), (0.05, 0.95), (0.041666668, 0.95), (0.041666668, 0.93333334), (0.041666668, 0.93333334), (0.041666668, 0.95), (0.033333335, 0.95), (0.033333335, 0.93333334), (0.033333335, 0.93333334), (0.033333335, 0.95), (0.025, 0.95), (0.025, 0.93333334), (0.025, 0.93333334), (0.025, 0.95), (0.016666668, 0.95), (0.016666668, 0.93333334), (0.016666668, 0.93333334), (0.016666668, 0.95), (0.008333334, 0.95), (0.008333334, 0.93333334), (0.008333334, 0.93333334), (0.008333334, 0.95), (0, 0.95), (0, 0.93333334), (1, 0.95), (1, 0.96666664), (0.9916667, 0.96666664), (0.9916667, 0.95), (0.9916667, 0.95), (0.9916667, 0.96666664), (0.98333335, 0.96666664), (0.98333335, 0.95), (0.98333335, 0.95), (0.98333335, 0.96666664), (0.975, 0.96666664), (0.975, 0.95), (0.975, 0.95), (0.975, 0.96666664), (0.96666664, 0.96666664), (0.96666664, 0.95), (0.96666664, 0.95), (0.96666664, 0.96666664), (0.9583333, 0.96666664), (0.9583333, 0.95), (0.9583333, 0.95), (0.9583333, 0.96666664), (0.95, 0.96666664), (0.95, 0.95), (0.95, 0.95), (0.95, 0.96666664), (0.94166666, 0.96666664), (0.94166666, 0.95), (0.94166666, 0.95), (0.94166666, 0.96666664), (0.93333334, 0.96666664), (0.93333334, 0.95), (0.93333334, 0.95), (0.93333334, 0.96666664), (0.925, 0.96666664), (0.925, 0.95), (0.925, 0.95), (0.925, 0.96666664), (0.9166667, 0.96666664), (0.9166667, 0.95), (0.9166667, 0.95), (0.9166667, 0.96666664), (0.90833336, 0.96666664), (0.90833336, 0.95), (0.90833336, 0.95), (0.90833336, 0.96666664), (0.9, 0.96666664), (0.9, 0.95), (0.9, 0.95), (0.9, 0.96666664), (0.89166665, 0.96666664), (0.89166665, 0.95), (0.89166665, 0.95), (0.89166665, 0.96666664), (0.8833333, 0.96666664), (0.8833333, 0.95), (0.8833333, 0.95), (0.8833333, 0.96666664), (0.875, 0.96666664), (0.875, 0.95), (0.875, 0.95), (0.875, 0.96666664), (0.8666667, 0.96666664), (0.8666667, 0.95), (0.8666667, 0.95), (0.8666667, 0.96666664), (0.85833335, 0.96666664), (0.85833335, 0.95), (0.85833335, 0.95), (0.85833335, 0.96666664), (0.85, 0.96666664), (0.85, 0.95), (0.85, 0.95), (0.85, 0.96666664), (0.84166664, 0.96666664), (0.84166664, 0.95), (0.84166664, 0.95), (0.84166664, 0.96666664), (0.8333333, 0.96666664), (0.8333333, 0.95), (0.8333333, 0.95), (0.8333333, 0.96666664), (0.825, 0.96666664), (0.825, 0.95), (0.825, 0.95), (0.825, 0.96666664), (0.81666666, 0.96666664), (0.81666666, 0.95), (0.81666666, 0.95), (0.81666666, 0.96666664), (0.80833334, 0.96666664), (0.80833334, 0.95), (0.80833334, 0.95), (0.80833334, 0.96666664), (0.8, 0.96666664), (0.8, 0.95), (0.8, 0.95), (0.8, 0.96666664), (0.7916667, 0.96666664), (0.7916667, 0.95), (0.7916667, 0.95), (0.7916667, 0.96666664), (0.78333336, 0.96666664), (0.78333336, 0.95), (0.78333336, 0.95), (0.78333336, 0.96666664), (0.775, 0.96666664), (0.775, 0.95), (0.775, 0.95), (0.775, 0.96666664), (0.76666665, 0.96666664), (0.76666665, 0.95), (0.76666665, 0.95), (0.76666665, 0.96666664), (0.7583333, 0.96666664), (0.7583333, 0.95), (0.7583333, 0.95), (0.7583333, 0.96666664), (0.75, 0.96666664), (0.75, 0.95), (0.75, 0.95), (0.75, 0.96666664), (0.7416667, 0.96666664), (0.7416667, 0.95), (0.7416667, 0.95), (0.7416667, 0.96666664), (0.73333335, 0.96666664), (0.73333335, 0.95), (0.73333335, 0.95), (0.73333335, 0.96666664), (0.725, 0.96666664), (0.725, 0.95), (0.725, 0.95), (0.725, 0.96666664), (0.71666664, 0.96666664), (0.71666664, 0.95), (0.71666664, 0.95), (0.71666664, 0.96666664), (0.7083333, 0.96666664), (0.7083333, 0.95), (0.7083333, 0.95), (0.7083333, 0.96666664), (0.7, 0.96666664), (0.7, 0.95), (0.7, 0.95), (0.7, 0.96666664), (0.69166666, 0.96666664), (0.69166666, 0.95), (0.69166666, 0.95), (0.69166666, 0.96666664), (0.68333334, 0.96666664), (0.68333334, 0.95), (0.68333334, 0.95), (0.68333334, 0.96666664), (0.675, 0.96666664), (0.675, 0.95), (0.675, 0.95), (0.675, 0.96666664), (0.6666667, 0.96666664), (0.6666667, 0.95), (0.6666667, 0.95), (0.6666667, 0.96666664), (0.65833336, 0.96666664), (0.65833336, 0.95), (0.65833336, 0.95), (0.65833336, 0.96666664), (0.65, 0.96666664), (0.65, 0.95), (0.65, 0.95), (0.65, 0.96666664), (0.64166665, 0.96666664), (0.64166665, 0.95), (0.64166665, 0.95), (0.64166665, 0.96666664), (0.6333333, 0.96666664), (0.6333333, 0.95), (0.6333333, 0.95), (0.6333333, 0.96666664), (0.625, 0.96666664), (0.625, 0.95), (0.625, 0.95), (0.625, 0.96666664), (0.6166667, 0.96666664), (0.6166667, 0.95), (0.6166667, 0.95), (0.6166667, 0.96666664), (0.60833335, 0.96666664), (0.60833335, 0.95), (0.60833335, 0.95), (0.60833335, 0.96666664), (0.6, 0.96666664), (0.6, 0.95), (0.6, 0.95), (0.6, 0.96666664), (0.59166664, 0.96666664), (0.59166664, 0.95), (0.59166664, 0.95), (0.59166664, 0.96666664), (0.5833333, 0.96666664), (0.5833333, 0.95), (0.5833333, 0.95), (0.5833333, 0.96666664), (0.575, 0.96666664), (0.575, 0.95), (0.575, 0.95), (0.575, 0.96666664), (0.56666666, 0.96666664), (0.56666666, 0.95), (0.56666666, 0.95), (0.56666666, 0.96666664), (0.55833334, 0.96666664), (0.55833334, 0.95), (0.55833334, 0.95), (0.55833334, 0.96666664), (0.55, 0.96666664), (0.55, 0.95), (0.55, 0.95), (0.55, 0.96666664), (0.5416667, 0.96666664), (0.5416667, 0.95), (0.5416667, 0.95), (0.5416667, 0.96666664), (0.53333336, 0.96666664), (0.53333336, 0.95), (0.53333336, 0.95), (0.53333336, 0.96666664), (0.525, 0.96666664), (0.525, 0.95), (0.525, 0.95), (0.525, 0.96666664), (0.51666665, 0.96666664), (0.51666665, 0.95), (0.51666665, 0.95), (0.51666665, 0.96666664), (0.5083333, 0.96666664), (0.5083333, 0.95), (0.5083333, 0.95), (0.5083333, 0.96666664), (0.5, 0.96666664), (0.5, 0.95), (0.5, 0.95), (0.5, 0.96666664), (0.49166667, 0.96666664), (0.49166667, 0.95), (0.49166667, 0.95), (0.49166667, 0.96666664), (0.48333332, 0.96666664), (0.48333332, 0.95), (0.48333332, 0.95), (0.48333332, 0.96666664), (0.475, 0.96666664), (0.475, 0.95), (0.475, 0.95), (0.475, 0.96666664), (0.46666667, 0.96666664), (0.46666667, 0.95), (0.46666667, 0.95), (0.46666667, 0.96666664), (0.45833334, 0.96666664), (0.45833334, 0.95), (0.45833334, 0.95), (0.45833334, 0.96666664), (0.45, 0.96666664), (0.45, 0.95), (0.45, 0.95), (0.45, 0.96666664), (0.44166666, 0.96666664), (0.44166666, 0.95), (0.44166666, 0.95), (0.44166666, 0.96666664), (0.43333334, 0.96666664), (0.43333334, 0.95), (0.43333334, 0.95), (0.43333334, 0.96666664), (0.425, 0.96666664), (0.425, 0.95), (0.425, 0.95), (0.425, 0.96666664), (0.41666666, 0.96666664), (0.41666666, 0.95), (0.41666666, 0.95), (0.41666666, 0.96666664), (0.40833333, 0.96666664), (0.40833333, 0.95), (0.40833333, 0.95), (0.40833333, 0.96666664), (0.4, 0.96666664), (0.4, 0.95), (0.4, 0.95), (0.4, 0.96666664), (0.39166668, 0.96666664), (0.39166668, 0.95), (0.39166668, 0.95), (0.39166668, 0.96666664), (0.38333333, 0.96666664), (0.38333333, 0.95), (0.38333333, 0.95), (0.38333333, 0.96666664), (0.375, 0.96666664), (0.375, 0.95), (0.375, 0.95), (0.375, 0.96666664), (0.36666667, 0.96666664), (0.36666667, 0.95), (0.36666667, 0.95), (0.36666667, 0.96666664), (0.35833332, 0.96666664), (0.35833332, 0.95), (0.35833332, 0.95), (0.35833332, 0.96666664), (0.35, 0.96666664), (0.35, 0.95), (0.35, 0.95), (0.35, 0.96666664), (0.34166667, 0.96666664), (0.34166667, 0.95), (0.34166667, 0.95), (0.34166667, 0.96666664), (0.33333334, 0.96666664), (0.33333334, 0.95), (0.33333334, 0.95), (0.33333334, 0.96666664), (0.325, 0.96666664), (0.325, 0.95), (0.325, 0.95), (0.325, 0.96666664), (0.31666666, 0.96666664), (0.31666666, 0.95), (0.31666666, 0.95), (0.31666666, 0.96666664), (0.30833334, 0.96666664), (0.30833334, 0.95), (0.30833334, 0.95), (0.30833334, 0.96666664), (0.3, 0.96666664), (0.3, 0.95), (0.3, 0.95), (0.3, 0.96666664), (0.29166666, 0.96666664), (0.29166666, 0.95), (0.29166666, 0.95), (0.29166666, 0.96666664), (0.28333333, 0.96666664), (0.28333333, 0.95), (0.28333333, 0.95), (0.28333333, 0.96666664), (0.275, 0.96666664), (0.275, 0.95), (0.275, 0.95), (0.275, 0.96666664), (0.26666668, 0.96666664), (0.26666668, 0.95), (0.26666668, 0.95), (0.26666668, 0.96666664), (0.25833333, 0.96666664), (0.25833333, 0.95), (0.25833333, 0.95), (0.25833333, 0.96666664), (0.25, 0.96666664), (0.25, 0.95), (0.25, 0.95), (0.25, 0.96666664), (0.24166666, 0.96666664), (0.24166666, 0.95), (0.24166666, 0.95), (0.24166666, 0.96666664), (0.23333333, 0.96666664), (0.23333333, 0.95), (0.23333333, 0.95), (0.23333333, 0.96666664), (0.225, 0.96666664), (0.225, 0.95), (0.225, 0.95), (0.225, 0.96666664), (0.21666667, 0.96666664), (0.21666667, 0.95), (0.21666667, 0.95), (0.21666667, 0.96666664), (0.20833333, 0.96666664), (0.20833333, 0.95), (0.20833333, 0.95), (0.20833333, 0.96666664), (0.2, 0.96666664), (0.2, 0.95), (0.2, 0.95), (0.2, 0.96666664), (0.19166666, 0.96666664), (0.19166666, 0.95), (0.19166666, 0.95), (0.19166666, 0.96666664), (0.18333334, 0.96666664), (0.18333334, 0.95), (0.18333334, 0.95), (0.18333334, 0.96666664), (0.175, 0.96666664), (0.175, 0.95), (0.175, 0.95), (0.175, 0.96666664), (0.16666667, 0.96666664), (0.16666667, 0.95), (0.16666667, 0.95), (0.16666667, 0.96666664), (0.15833333, 0.96666664), (0.15833333, 0.95), (0.15833333, 0.95), (0.15833333, 0.96666664), (0.15, 0.96666664), (0.15, 0.95), (0.15, 0.95), (0.15, 0.96666664), (0.14166667, 0.96666664), (0.14166667, 0.95), (0.14166667, 0.95), (0.14166667, 0.96666664), (0.13333334, 0.96666664), (0.13333334, 0.95), (0.13333334, 0.95), (0.13333334, 0.96666664), (0.125, 0.96666664), (0.125, 0.95), (0.125, 0.95), (0.125, 0.96666664), (0.11666667, 0.96666664), (0.11666667, 0.95), (0.11666667, 0.95), (0.11666667, 0.96666664), (0.108333334, 0.96666664), (0.108333334, 0.95), (0.108333334, 0.95), (0.108333334, 0.96666664), (0.1, 0.96666664), (0.1, 0.95), (0.1, 0.95), (0.1, 0.96666664), (0.09166667, 0.96666664), (0.09166667, 0.95), (0.09166667, 0.95), (0.09166667, 0.96666664), (0.083333336, 0.96666664), (0.083333336, 0.95), (0.083333336, 0.95), (0.083333336, 0.96666664), (0.075, 0.96666664), (0.075, 0.95), (0.075, 0.95), (0.075, 0.96666664), (0.06666667, 0.96666664), (0.06666667, 0.95), (0.06666667, 0.95), (0.06666667, 0.96666664), (0.058333334, 0.96666664), (0.058333334, 0.95), (0.058333334, 0.95), (0.058333334, 0.96666664), (0.05, 0.96666664), (0.05, 0.95), (0.05, 0.95), (0.05, 0.96666664), (0.041666668, 0.96666664), (0.041666668, 0.95), (0.041666668, 0.95), (0.041666668, 0.96666664), (0.033333335, 0.96666664), (0.033333335, 0.95), (0.033333335, 0.95), (0.033333335, 0.96666664), (0.025, 0.96666664), (0.025, 0.95), (0.025, 0.95), (0.025, 0.96666664), (0.016666668, 0.96666664), (0.016666668, 0.95), (0.016666668, 0.95), (0.016666668, 0.96666664), (0.008333334, 0.96666664), (0.008333334, 0.95), (0.008333334, 0.95), (0.008333334, 0.96666664), (0, 0.96666664), (0, 0.95), (1, 0.96666664), (1, 0.98333335), (0.9916667, 0.98333335), (0.9916667, 0.96666664), (0.9916667, 0.96666664), (0.9916667, 0.98333335), (0.98333335, 0.98333335), (0.98333335, 0.96666664), (0.98333335, 0.96666664), (0.98333335, 0.98333335), (0.975, 0.98333335), (0.975, 0.96666664), (0.975, 0.96666664), (0.975, 0.98333335), (0.96666664, 0.98333335), (0.96666664, 0.96666664), (0.96666664, 0.96666664), (0.96666664, 0.98333335), (0.9583333, 0.98333335), (0.9583333, 0.96666664), (0.9583333, 0.96666664), (0.9583333, 0.98333335), (0.95, 0.98333335), (0.95, 0.96666664), (0.95, 0.96666664), (0.95, 0.98333335), (0.94166666, 0.98333335), (0.94166666, 0.96666664), (0.94166666, 0.96666664), (0.94166666, 0.98333335), (0.93333334, 0.98333335), (0.93333334, 0.96666664), (0.93333334, 0.96666664), (0.93333334, 0.98333335), (0.925, 0.98333335), (0.925, 0.96666664), (0.925, 0.96666664), (0.925, 0.98333335), (0.9166667, 0.98333335), (0.9166667, 0.96666664), (0.9166667, 0.96666664), (0.9166667, 0.98333335), (0.90833336, 0.98333335), (0.90833336, 0.96666664), (0.90833336, 0.96666664), (0.90833336, 0.98333335), (0.9, 0.98333335), (0.9, 0.96666664), (0.9, 0.96666664), (0.9, 0.98333335), (0.89166665, 0.98333335), (0.89166665, 0.96666664), (0.89166665, 0.96666664), (0.89166665, 0.98333335), (0.8833333, 0.98333335), (0.8833333, 0.96666664), (0.8833333, 0.96666664), (0.8833333, 0.98333335), (0.875, 0.98333335), (0.875, 0.96666664), (0.875, 0.96666664), (0.875, 0.98333335), (0.8666667, 0.98333335), (0.8666667, 0.96666664), (0.8666667, 0.96666664), (0.8666667, 0.98333335), (0.85833335, 0.98333335), (0.85833335, 0.96666664), (0.85833335, 0.96666664), (0.85833335, 0.98333335), (0.85, 0.98333335), (0.85, 0.96666664), (0.85, 0.96666664), (0.85, 0.98333335), (0.84166664, 0.98333335), (0.84166664, 0.96666664), (0.84166664, 0.96666664), (0.84166664, 0.98333335), (0.8333333, 0.98333335), (0.8333333, 0.96666664), (0.8333333, 0.96666664), (0.8333333, 0.98333335), (0.825, 0.98333335), (0.825, 0.96666664), (0.825, 0.96666664), (0.825, 0.98333335), (0.81666666, 0.98333335), (0.81666666, 0.96666664), (0.81666666, 0.96666664), (0.81666666, 0.98333335), (0.80833334, 0.98333335), (0.80833334, 0.96666664), (0.80833334, 0.96666664), (0.80833334, 0.98333335), (0.8, 0.98333335), (0.8, 0.96666664), (0.8, 0.96666664), (0.8, 0.98333335), (0.7916667, 0.98333335), (0.7916667, 0.96666664), (0.7916667, 0.96666664), (0.7916667, 0.98333335), (0.78333336, 0.98333335), (0.78333336, 0.96666664), (0.78333336, 0.96666664), (0.78333336, 0.98333335), (0.775, 0.98333335), (0.775, 0.96666664), (0.775, 0.96666664), (0.775, 0.98333335), (0.76666665, 0.98333335), (0.76666665, 0.96666664), (0.76666665, 0.96666664), (0.76666665, 0.98333335), (0.7583333, 0.98333335), (0.7583333, 0.96666664), (0.7583333, 0.96666664), (0.7583333, 0.98333335), (0.75, 0.98333335), (0.75, 0.96666664), (0.75, 0.96666664), (0.75, 0.98333335), (0.7416667, 0.98333335), (0.7416667, 0.96666664), (0.7416667, 0.96666664), (0.7416667, 0.98333335), (0.73333335, 0.98333335), (0.73333335, 0.96666664), (0.73333335, 0.96666664), (0.73333335, 0.98333335), (0.725, 0.98333335), (0.725, 0.96666664), (0.725, 0.96666664), (0.725, 0.98333335), (0.71666664, 0.98333335), (0.71666664, 0.96666664), (0.71666664, 0.96666664), (0.71666664, 0.98333335), (0.7083333, 0.98333335), (0.7083333, 0.96666664), (0.7083333, 0.96666664), (0.7083333, 0.98333335), (0.7, 0.98333335), (0.7, 0.96666664), (0.7, 0.96666664), (0.7, 0.98333335), (0.69166666, 0.98333335), (0.69166666, 0.96666664), (0.69166666, 0.96666664), (0.69166666, 0.98333335), (0.68333334, 0.98333335), (0.68333334, 0.96666664), (0.68333334, 0.96666664), (0.68333334, 0.98333335), (0.675, 0.98333335), (0.675, 0.96666664), (0.675, 0.96666664), (0.675, 0.98333335), (0.6666667, 0.98333335), (0.6666667, 0.96666664), (0.6666667, 0.96666664), (0.6666667, 0.98333335), (0.65833336, 0.98333335), (0.65833336, 0.96666664), (0.65833336, 0.96666664), (0.65833336, 0.98333335), (0.65, 0.98333335), (0.65, 0.96666664), (0.65, 0.96666664), (0.65, 0.98333335), (0.64166665, 0.98333335), (0.64166665, 0.96666664), (0.64166665, 0.96666664), (0.64166665, 0.98333335), (0.6333333, 0.98333335), (0.6333333, 0.96666664), (0.6333333, 0.96666664), (0.6333333, 0.98333335), (0.625, 0.98333335), (0.625, 0.96666664), (0.625, 0.96666664), (0.625, 0.98333335), (0.6166667, 0.98333335), (0.6166667, 0.96666664), (0.6166667, 0.96666664), (0.6166667, 0.98333335), (0.60833335, 0.98333335), (0.60833335, 0.96666664), (0.60833335, 0.96666664), (0.60833335, 0.98333335), (0.6, 0.98333335), (0.6, 0.96666664), (0.6, 0.96666664), (0.6, 0.98333335), (0.59166664, 0.98333335), (0.59166664, 0.96666664), (0.59166664, 0.96666664), (0.59166664, 0.98333335), (0.5833333, 0.98333335), (0.5833333, 0.96666664), (0.5833333, 0.96666664), (0.5833333, 0.98333335), (0.575, 0.98333335), (0.575, 0.96666664), (0.575, 0.96666664), (0.575, 0.98333335), (0.56666666, 0.98333335), (0.56666666, 0.96666664), (0.56666666, 0.96666664), (0.56666666, 0.98333335), (0.55833334, 0.98333335), (0.55833334, 0.96666664), (0.55833334, 0.96666664), (0.55833334, 0.98333335), (0.55, 0.98333335), (0.55, 0.96666664), (0.55, 0.96666664), (0.55, 0.98333335), (0.5416667, 0.98333335), (0.5416667, 0.96666664), (0.5416667, 0.96666664), (0.5416667, 0.98333335), (0.53333336, 0.98333335), (0.53333336, 0.96666664), (0.53333336, 0.96666664), (0.53333336, 0.98333335), (0.525, 0.98333335), (0.525, 0.96666664), (0.525, 0.96666664), (0.525, 0.98333335), (0.51666665, 0.98333335), (0.51666665, 0.96666664), (0.51666665, 0.96666664), (0.51666665, 0.98333335), (0.5083333, 0.98333335), (0.5083333, 0.96666664), (0.5083333, 0.96666664), (0.5083333, 0.98333335), (0.5, 0.98333335), (0.5, 0.96666664), (0.5, 0.96666664), (0.5, 0.98333335), (0.49166667, 0.98333335), (0.49166667, 0.96666664), (0.49166667, 0.96666664), (0.49166667, 0.98333335), (0.48333332, 0.98333335), (0.48333332, 0.96666664), (0.48333332, 0.96666664), (0.48333332, 0.98333335), (0.475, 0.98333335), (0.475, 0.96666664), (0.475, 0.96666664), (0.475, 0.98333335), (0.46666667, 0.98333335), (0.46666667, 0.96666664), (0.46666667, 0.96666664), (0.46666667, 0.98333335), (0.45833334, 0.98333335), (0.45833334, 0.96666664), (0.45833334, 0.96666664), (0.45833334, 0.98333335), (0.45, 0.98333335), (0.45, 0.96666664), (0.45, 0.96666664), (0.45, 0.98333335), (0.44166666, 0.98333335), (0.44166666, 0.96666664), (0.44166666, 0.96666664), (0.44166666, 0.98333335), (0.43333334, 0.98333335), (0.43333334, 0.96666664), (0.43333334, 0.96666664), (0.43333334, 0.98333335), (0.425, 0.98333335), (0.425, 0.96666664), (0.425, 0.96666664), (0.425, 0.98333335), (0.41666666, 0.98333335), (0.41666666, 0.96666664), (0.41666666, 0.96666664), (0.41666666, 0.98333335), (0.40833333, 0.98333335), (0.40833333, 0.96666664), (0.40833333, 0.96666664), (0.40833333, 0.98333335), (0.4, 0.98333335), (0.4, 0.96666664), (0.4, 0.96666664), (0.4, 0.98333335), (0.39166668, 0.98333335), (0.39166668, 0.96666664), (0.39166668, 0.96666664), (0.39166668, 0.98333335), (0.38333333, 0.98333335), (0.38333333, 0.96666664), (0.38333333, 0.96666664), (0.38333333, 0.98333335), (0.375, 0.98333335), (0.375, 0.96666664), (0.375, 0.96666664), (0.375, 0.98333335), (0.36666667, 0.98333335), (0.36666667, 0.96666664), (0.36666667, 0.96666664), (0.36666667, 0.98333335), (0.35833332, 0.98333335), (0.35833332, 0.96666664), (0.35833332, 0.96666664), (0.35833332, 0.98333335), (0.35, 0.98333335), (0.35, 0.96666664), (0.35, 0.96666664), (0.35, 0.98333335), (0.34166667, 0.98333335), (0.34166667, 0.96666664), (0.34166667, 0.96666664), (0.34166667, 0.98333335), (0.33333334, 0.98333335), (0.33333334, 0.96666664), (0.33333334, 0.96666664), (0.33333334, 0.98333335), (0.325, 0.98333335), (0.325, 0.96666664), (0.325, 0.96666664), (0.325, 0.98333335), (0.31666666, 0.98333335), (0.31666666, 0.96666664), (0.31666666, 0.96666664), (0.31666666, 0.98333335), (0.30833334, 0.98333335), (0.30833334, 0.96666664), (0.30833334, 0.96666664), (0.30833334, 0.98333335), (0.3, 0.98333335), (0.3, 0.96666664), (0.3, 0.96666664), (0.3, 0.98333335), (0.29166666, 0.98333335), (0.29166666, 0.96666664), (0.29166666, 0.96666664), (0.29166666, 0.98333335), (0.28333333, 0.98333335), (0.28333333, 0.96666664), (0.28333333, 0.96666664), (0.28333333, 0.98333335), (0.275, 0.98333335), (0.275, 0.96666664), (0.275, 0.96666664), (0.275, 0.98333335), (0.26666668, 0.98333335), (0.26666668, 0.96666664), (0.26666668, 0.96666664), (0.26666668, 0.98333335), (0.25833333, 0.98333335), (0.25833333, 0.96666664), (0.25833333, 0.96666664), (0.25833333, 0.98333335), (0.25, 0.98333335), (0.25, 0.96666664), (0.25, 0.96666664), (0.25, 0.98333335), (0.24166666, 0.98333335), (0.24166666, 0.96666664), (0.24166666, 0.96666664), (0.24166666, 0.98333335), (0.23333333, 0.98333335), (0.23333333, 0.96666664), (0.23333333, 0.96666664), (0.23333333, 0.98333335), (0.225, 0.98333335), (0.225, 0.96666664), (0.225, 0.96666664), (0.225, 0.98333335), (0.21666667, 0.98333335), (0.21666667, 0.96666664), (0.21666667, 0.96666664), (0.21666667, 0.98333335), (0.20833333, 0.98333335), (0.20833333, 0.96666664), (0.20833333, 0.96666664), (0.20833333, 0.98333335), (0.2, 0.98333335), (0.2, 0.96666664), (0.2, 0.96666664), (0.2, 0.98333335), (0.19166666, 0.98333335), (0.19166666, 0.96666664), (0.19166666, 0.96666664), (0.19166666, 0.98333335), (0.18333334, 0.98333335), (0.18333334, 0.96666664), (0.18333334, 0.96666664), (0.18333334, 0.98333335), (0.175, 0.98333335), (0.175, 0.96666664), (0.175, 0.96666664), (0.175, 0.98333335), (0.16666667, 0.98333335), (0.16666667, 0.96666664), (0.16666667, 0.96666664), (0.16666667, 0.98333335), (0.15833333, 0.98333335), (0.15833333, 0.96666664), (0.15833333, 0.96666664), (0.15833333, 0.98333335), (0.15, 0.98333335), (0.15, 0.96666664), (0.15, 0.96666664), (0.15, 0.98333335), (0.14166667, 0.98333335), (0.14166667, 0.96666664), (0.14166667, 0.96666664), (0.14166667, 0.98333335), (0.13333334, 0.98333335), (0.13333334, 0.96666664), (0.13333334, 0.96666664), (0.13333334, 0.98333335), (0.125, 0.98333335), (0.125, 0.96666664), (0.125, 0.96666664), (0.125, 0.98333335), (0.11666667, 0.98333335), (0.11666667, 0.96666664), (0.11666667, 0.96666664), (0.11666667, 0.98333335), (0.108333334, 0.98333335), (0.108333334, 0.96666664), (0.108333334, 0.96666664), (0.108333334, 0.98333335), (0.1, 0.98333335), (0.1, 0.96666664), (0.1, 0.96666664), (0.1, 0.98333335), (0.09166667, 0.98333335), (0.09166667, 0.96666664), (0.09166667, 0.96666664), (0.09166667, 0.98333335), (0.083333336, 0.98333335), (0.083333336, 0.96666664), (0.083333336, 0.96666664), (0.083333336, 0.98333335), (0.075, 0.98333335), (0.075, 0.96666664), (0.075, 0.96666664), (0.075, 0.98333335), (0.06666667, 0.98333335), (0.06666667, 0.96666664), (0.06666667, 0.96666664), (0.06666667, 0.98333335), (0.058333334, 0.98333335), (0.058333334, 0.96666664), (0.058333334, 0.96666664), (0.058333334, 0.98333335), (0.05, 0.98333335), (0.05, 0.96666664), (0.05, 0.96666664), (0.05, 0.98333335), (0.041666668, 0.98333335), (0.041666668, 0.96666664), (0.041666668, 0.96666664), (0.041666668, 0.98333335), (0.033333335, 0.98333335), (0.033333335, 0.96666664), (0.033333335, 0.96666664), (0.033333335, 0.98333335), (0.025, 0.98333335), (0.025, 0.96666664), (0.025, 0.96666664), (0.025, 0.98333335), (0.016666668, 0.98333335), (0.016666668, 0.96666664), (0.016666668, 0.96666664), (0.016666668, 0.98333335), (0.008333334, 0.98333335), (0.008333334, 0.96666664), (0.008333334, 0.96666664), (0.008333334, 0.98333335), (0, 0.98333335), (0, 0.96666664), (0.5, 1), (0.9916667, 0.98333335), (1, 0.98333335), (0.5, 1), (0.98333335, 0.98333335), (0.9916667, 0.98333335), (0.5, 1), (0.975, 0.98333335), (0.98333335, 0.98333335), (0.5, 1), (0.96666664, 0.98333335), (0.975, 0.98333335), (0.5, 1), (0.9583333, 0.98333335), (0.96666664, 0.98333335), (0.5, 1), (0.95, 0.98333335), (0.9583333, 0.98333335), (0.5, 1), (0.94166666, 0.98333335), (0.95, 0.98333335), (0.5, 1), (0.93333334, 0.98333335), (0.94166666, 0.98333335), (0.5, 1), (0.925, 0.98333335), (0.93333334, 0.98333335), (0.5, 1), (0.9166667, 0.98333335), (0.925, 0.98333335), (0.5, 1), (0.90833336, 0.98333335), (0.9166667, 0.98333335), (0.5, 1), (0.9, 0.98333335), (0.90833336, 0.98333335), (0.5, 1), (0.89166665, 0.98333335), (0.9, 0.98333335), (0.5, 1), (0.8833333, 0.98333335), (0.89166665, 0.98333335), (0.5, 1), (0.875, 0.98333335), (0.8833333, 0.98333335), (0.5, 1), (0.8666667, 0.98333335), (0.875, 0.98333335), (0.5, 1), (0.85833335, 0.98333335), (0.8666667, 0.98333335), (0.5, 1), (0.85, 0.98333335), (0.85833335, 0.98333335), (0.5, 1), (0.84166664, 0.98333335), (0.85, 0.98333335), (0.5, 1), (0.8333333, 0.98333335), (0.84166664, 0.98333335), (0.5, 1), (0.825, 0.98333335), (0.8333333, 0.98333335), (0.5, 1), (0.81666666, 0.98333335), (0.825, 0.98333335), (0.5, 1), (0.80833334, 0.98333335), (0.81666666, 0.98333335), (0.5, 1), (0.8, 0.98333335), (0.80833334, 0.98333335), (0.5, 1), (0.7916667, 0.98333335), (0.8, 0.98333335), (0.5, 1), (0.78333336, 0.98333335), (0.7916667, 0.98333335), (0.5, 1), (0.775, 0.98333335), (0.78333336, 0.98333335), (0.5, 1), (0.76666665, 0.98333335), (0.775, 0.98333335), (0.5, 1), (0.7583333, 0.98333335), (0.76666665, 0.98333335), (0.5, 1), (0.75, 0.98333335), (0.7583333, 0.98333335), (0.5, 1), (0.7416667, 0.98333335), (0.75, 0.98333335), (0.5, 1), (0.73333335, 0.98333335), (0.7416667, 0.98333335), (0.5, 1), (0.725, 0.98333335), (0.73333335, 0.98333335), (0.5, 1), (0.71666664, 0.98333335), (0.725, 0.98333335), (0.5, 1), (0.7083333, 0.98333335), (0.71666664, 0.98333335), (0.5, 1), (0.7, 0.98333335), (0.7083333, 0.98333335), (0.5, 1), (0.69166666, 0.98333335), (0.7, 0.98333335), (0.5, 1), (0.68333334, 0.98333335), (0.69166666, 0.98333335), (0.5, 1), (0.675, 0.98333335), (0.68333334, 0.98333335), (0.5, 1), (0.6666667, 0.98333335), (0.675, 0.98333335), (0.5, 1), (0.65833336, 0.98333335), (0.6666667, 0.98333335), (0.5, 1), (0.65, 0.98333335), (0.65833336, 0.98333335), (0.5, 1), (0.64166665, 0.98333335), (0.65, 0.98333335), (0.5, 1), (0.6333333, 0.98333335), (0.64166665, 0.98333335), (0.5, 1), (0.625, 0.98333335), (0.6333333, 0.98333335), (0.5, 1), (0.6166667, 0.98333335), (0.625, 0.98333335), (0.5, 1), (0.60833335, 0.98333335), (0.6166667, 0.98333335), (0.5, 1), (0.6, 0.98333335), (0.60833335, 0.98333335), (0.5, 1), (0.59166664, 0.98333335), (0.6, 0.98333335), (0.5, 1), (0.5833333, 0.98333335), (0.59166664, 0.98333335), (0.5, 1), (0.575, 0.98333335), (0.5833333, 0.98333335), (0.5, 1), (0.56666666, 0.98333335), (0.575, 0.98333335), (0.5, 1), (0.55833334, 0.98333335), (0.56666666, 0.98333335), (0.5, 1), (0.55, 0.98333335), (0.55833334, 0.98333335), (0.5, 1), (0.5416667, 0.98333335), (0.55, 0.98333335), (0.5, 1), (0.53333336, 0.98333335), (0.5416667, 0.98333335), (0.5, 1), (0.525, 0.98333335), (0.53333336, 0.98333335), (0.5, 1), (0.51666665, 0.98333335), (0.525, 0.98333335), (0.5, 1), (0.5083333, 0.98333335), (0.51666665, 0.98333335), (0.5, 1), (0.5, 0.98333335), (0.5083333, 0.98333335), (0.5, 1), (0.49166667, 0.98333335), (0.5, 0.98333335), (0.5, 1), (0.48333332, 0.98333335), (0.49166667, 0.98333335), (0.5, 1), (0.475, 0.98333335), (0.48333332, 0.98333335), (0.5, 1), (0.46666667, 0.98333335), (0.475, 0.98333335), (0.5, 1), (0.45833334, 0.98333335), (0.46666667, 0.98333335), (0.5, 1), (0.45, 0.98333335), (0.45833334, 0.98333335), (0.5, 1), (0.44166666, 0.98333335), (0.45, 0.98333335), (0.5, 1), (0.43333334, 0.98333335), (0.44166666, 0.98333335), (0.5, 1), (0.425, 0.98333335), (0.43333334, 0.98333335), (0.5, 1), (0.41666666, 0.98333335), (0.425, 0.98333335), (0.5, 1), (0.40833333, 0.98333335), (0.41666666, 0.98333335), (0.5, 1), (0.4, 0.98333335), (0.40833333, 0.98333335), (0.5, 1), (0.39166668, 0.98333335), (0.4, 0.98333335), (0.5, 1), (0.38333333, 0.98333335), (0.39166668, 0.98333335), (0.5, 1), (0.375, 0.98333335), (0.38333333, 0.98333335), (0.5, 1), (0.36666667, 0.98333335), (0.375, 0.98333335), (0.5, 1), (0.35833332, 0.98333335), (0.36666667, 0.98333335), (0.5, 1), (0.35, 0.98333335), (0.35833332, 0.98333335), (0.5, 1), (0.34166667, 0.98333335), (0.35, 0.98333335), (0.5, 1), (0.33333334, 0.98333335), (0.34166667, 0.98333335), (0.5, 1), (0.325, 0.98333335), (0.33333334, 0.98333335), (0.5, 1), (0.31666666, 0.98333335), (0.325, 0.98333335), (0.5, 1), (0.30833334, 0.98333335), (0.31666666, 0.98333335), (0.5, 1), (0.3, 0.98333335), (0.30833334, 0.98333335), (0.5, 1), (0.29166666, 0.98333335), (0.3, 0.98333335), (0.5, 1), (0.28333333, 0.98333335), (0.29166666, 0.98333335), (0.5, 1), (0.275, 0.98333335), (0.28333333, 0.98333335), (0.5, 1), (0.26666668, 0.98333335), (0.275, 0.98333335), (0.5, 1), (0.25833333, 0.98333335), (0.26666668, 0.98333335), (0.5, 1), (0.25, 0.98333335), (0.25833333, 0.98333335), (0.5, 1), (0.24166666, 0.98333335), (0.25, 0.98333335), (0.5, 1), (0.23333333, 0.98333335), (0.24166666, 0.98333335), (0.5, 1), (0.225, 0.98333335), (0.23333333, 0.98333335), (0.5, 1), (0.21666667, 0.98333335), (0.225, 0.98333335), (0.5, 1), (0.20833333, 0.98333335), (0.21666667, 0.98333335), (0.5, 1), (0.2, 0.98333335), (0.20833333, 0.98333335), (0.5, 1), (0.19166666, 0.98333335), (0.2, 0.98333335), (0.5, 1), (0.18333334, 0.98333335), (0.19166666, 0.98333335), (0.5, 1), (0.175, 0.98333335), (0.18333334, 0.98333335), (0.5, 1), (0.16666667, 0.98333335), (0.175, 0.98333335), (0.5, 1), (0.15833333, 0.98333335), (0.16666667, 0.98333335), (0.5, 1), (0.15, 0.98333335), (0.15833333, 0.98333335), (0.5, 1), (0.14166667, 0.98333335), (0.15, 0.98333335), (0.5, 1), (0.13333334, 0.98333335), (0.14166667, 0.98333335), (0.5, 1), (0.125, 0.98333335), (0.13333334, 0.98333335), (0.5, 1), (0.11666667, 0.98333335), (0.125, 0.98333335), (0.5, 1), (0.108333334, 0.98333335), (0.11666667, 0.98333335), (0.5, 1), (0.1, 0.98333335), (0.108333334, 0.98333335), (0.5, 1), (0.09166667, 0.98333335), (0.1, 0.98333335), (0.5, 1), (0.083333336, 0.98333335), (0.09166667, 0.98333335), (0.5, 1), (0.075, 0.98333335), (0.083333336, 0.98333335), (0.5, 1), (0.06666667, 0.98333335), (0.075, 0.98333335), (0.5, 1), (0.058333334, 0.98333335), (0.06666667, 0.98333335), (0.5, 1), (0.05, 0.98333335), (0.058333334, 0.98333335), (0.5, 1), (0.041666668, 0.98333335), (0.05, 0.98333335), (0.5, 1), (0.033333335, 0.98333335), (0.041666668, 0.98333335), (0.5, 1), (0.025, 0.98333335), (0.033333335, 0.98333335), (0.5, 1), (0.016666668, 0.98333335), (0.025, 0.98333335), (0.5, 1), (0.008333334, 0.98333335), (0.016666668, 0.98333335), (0.5, 1), (0, 0.98333335), (0.008333334, 0.98333335)] ( + interpolation = "faceVarying" + ) + uniform token subdivisionScheme = "none" + double3 xformOp:rotateXYZ = (0, 0, 0) + double3 xformOp:scale = (1, 1, 1) + double3 xformOp:translate = (76.13928838360349, 0, -64.82907345040853) + delete double3 xformOp:translate.connect = + prepend double3 xformOp:translate.connect = + uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ", "xformOp:scale"] + } + + def ComputeNode "on_tick" + { + custom uint inputs:framePeriod = 0 + custom token node:type = "omni.graph.action.OnTick" + custom int node:typeVersion = 1 + custom double outputs:deltaSeconds + custom uint outputs:tick + + def ComputeNodeMetaData "metaData" + { + custom token AttributeDownstreamConnection____outputs:deltaSeconds = "/World/script_node.inputs:data" + custom token AttributeDownstreamConnection____outputs:tick = "/World/script_node.inputs:execIn" + } + } + + def ComputeNode "script_node" + { + custom token inputs:data + prepend token inputs:data.connect = + custom uint inputs:execIn + delete uint inputs:execIn.connect = + prepend uint inputs:execIn.connect = + custom string inputs:script = """if (state.initialized == False): + state.time = 0.0 + state.initialized = True + +# animate in a circle +radius = 100.0 +x = math.cos(state.time)*radius +z = math.sin(state.time)*radius +dt = db.inputs.data + +state.time += dt + +db.outputs.data = (x, 0.0, z) +""" + custom token node:type = "airlab.airstack.AscentNode" + custom int node:typeVersion = 1 + custom token outputs:data + custom uint outputs:execOut + + def ComputeNodeMetaData "metaData" + { + custom token AttributeDownstreamConnection____outputs:data = "/World/Sphere.xformOp:translate" + custom token inputs:data = "ExtendedAttributeType-->Any" + custom token outputs:data = "ExtendedAttributeType-->Any" + } + } +} + diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/data/icon.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/data/icon.png new file mode 100644 index 00000000..8f3c3b4e Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/data/icon.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/data/preview.png b/docker/extras/kit-app-template/source/extensions/airlab.airstack/data/preview.png new file mode 100644 index 00000000..1117604d Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/data/preview.png differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/docs/CHANGELOG.md b/docker/extras/kit-app-template/source/extensions/airlab.airstack/docs/CHANGELOG.md new file mode 100644 index 00000000..48b0e50e --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/docs/CHANGELOG.md @@ -0,0 +1,257 @@ +(changelog_airlab.airstack)= + +# Changelog + +This document records all notable changes to the **airlab.airstack** extension. + +The format is based on [Keep a Changelog](https://keepachangelog.com). The project adheres to [Semantic Versioning](https://semver.org). + +## [1.19.1] - 2024-05-30 +### Changed +- Updated the formatting + +## [1.19.0] - 2024-05-17 +### Added +- Update the 'support_level' entry in the configuration files to match the release requirements + +## [1.18.2] - 2024-04-26 +### Fixed +- The warp test uses the same CUDA device as OmniGraph in MGPU environments. + +## [1.18.1] - 2024-04-17 +### Added +- Add a 'support_level' entry to the configuration file of the extensions + +## [1.18.0] - 2024-04-15 +### Changed +- Updated the warp extension dependency to get the latest instead of a specific version + +## [1.17.0] - 2024-03-20 +### Changed +- Bumped dependency on omni.graph to version 1.134.1 +- Bumped dependency on omni.graph.core to version 2.168.1 + +## [1.16.0] - 2024-02-09 +### Changed +- Updated version number to work after the Kit branch was renamed from 105.2 to 106. + +## [1.9.0] - 2024-02-05 +### Changed +- Bumped dependency on omni.graph to version 1.134.0 +- Bumped dependency on omni.graph.core to version 2.167.1 +- Bumped dependency on omni.graph.tools to version 1.76.0 + +## [1.8.1] - 2024-01-30 +### Fixed +- Incremented version to compensate for a pipeline failure last week. + +## [1.7.0] - 2024-01-23 +### Fixed +- Made dependency on omni.warp to an explicit version to get the latest + +## [1.6.0] - 2024-01-15 +### Fixed +- Minor problems in Warp snippet + +## [1.5.1] - 2024-01-13 +### Fixed +- Repository URL in config file. + +## [1.5.0] - 2024-01-12 +### Changed +- Bumped dependency on omni.graph to version 1.133.4 +- Bumped dependency on omni.graph.core to version 2.165.3 +- Bumped dependency on omni.graph.tools to version 1.69.0 + +## [1.4.0] - 2024-01-10 +### Added +- Tests for code coverage +### Fixed +- Minor problems in script node + +## [1.3.0] - 2023-12-12 +### Changed +- Bumped dependency on omni.graph.core to version 2.165.3 +- Bumped dependency on omni.graph to version 1.133.2 +- Bumped dependency on omni.graph.tools to version 1.65.0 + +## [1.2.0] - 2023-12-11 +### Changed +- Bumped dependency on omni.graph.core to version 2.165.3 +- Bumped dependency on omni.graph to version 1.133.2 +- Bumped dependency on omni.graph.tools to version 1.65.0 + +## [1.1.9] - 2023-11-28 +### Changed +- Changed deprecated internal state functions to their new version + +## [1.1.8] - 2023-11-13 +### Changed +- Manual version bump + +## [1.1.7] - 2023-11-10 +### Added +- Check for missing path in state + +## [1.1.6] - 2023-08-03 +### Changed +- Targeted a specific version of the Kit SDK + +## [1.1.5] - 2023-07-31 +### Changed +- Migrated the extension from the Kit repo + +## [1.1.4] - 2023-07-11 +### Removed +- Obsolete docs debugging link + +## [1.1.3] - 2023-06-27 +### Fixed +- Refactored OmniGraph documentation to point to locally generated files + +## [1.1.2] - 2023-06-06 +### Fixed +- Fixed AscentNode to work in instanced graphs. + +## [1.1.1] - 2023-05-31 +### Fixed +- Adjusted the CRLF settings for the generated .md node table of content files + +## [1.1.0] - 2023-05-29 +### Added +- Regenerated node table of contents + +## [1.0.1] - 2023-05-11 +### Fixed +- Bugs loading a script from a file +- Bug in timing of opt-in dialog + +## [1.0.0] - 2023-05-05 +### Changed +- Improved performance with file-based scripts +- 'Reload Script' press now required instead of continuous re-compile +- state:omni_intitialized can be set to False to trigger a reload by script + +## [0.12.0] - 2023-04-26 +### Changed +- use omni.client to read script file +- rework the property panel UI + +## [0.11.5] - 2023-04-11 +### Added +- Table of documentation links for nodes in the extension + +## [0.11.4] - 2023-03-16 +### Added +- "usd-write" scheduling hint to OgnAscentNode node. + +## [0.11.3] - 2023-02-25 +### Changed +- Modifed format of Overview to be consistent with the rest of Kit + +## [0.11.2] - 2023-02-22 +### Added +- Links to JIRA tickets regarding filling in the missing documentation + +## [0.11.1] - 2023-02-19 +### Changed +- Added label to the main doc page so that higher level docs can reference the extension +- Tagged for adding links to node documentation +- Added information on the security risks of the extension + +## [0.11.0] - 2023-02-07 +### Changed +- opt-in is enabled by /app/airlab.airstack/enable_opt_in +- modify the dialog to appear after loading +- disable all graphs until opt-in is verified + +## [0.10.2] - 2023-02-02 +### Fixed +- Lint error that appeared when pylint updated + +## [0.10.1] - 2023-01-30 +### Changed +- Removed the kit-sdk landing page +- Moved all of the documentation into the new omni.graph.docs extension + +## [0.10.0] - 2022-12-07 +### Changed +- demonstrate how to use GPU dynamic attributes in Warp snippet + +## [0.9.0] - 2022-09-12 +### Added +- opt-in mechanism on attach. Controlled by /app/airlab.airstack/enable_opt_in and /app/airlab.airstack/opt_in + +## [0.8.0] - 2022-08-31 +### Added +- User-defined callbacks 'compute', 'setup', and 'cleanup', along with a reset button +- Ability to "remove" outputs:execOut by hiding it +- Support for warp, inspect, ast, and other modules by saving inputs:script to a temp file +- Script path input for reading scripts from files +- Improved textbox UI for inputs:script using omni.kit.widget.text_editor + +## [0.7.2] - 2022-08-23 +### Changed +- Removed security warnings. We don't want to advertise the problem. + +## [0.7.1] - 2022-08-09 +### Fixed +- Applied formatting to all of the Python files + +## [0.7.0] - 2022-08-09 +### Changed +- Removed omni.graph.action dependency + +## [0.6.0] - 2022-07-07 +### Changed +- Refactored imports from omni.graph.tools to get the new locations + +## [0.5.0] - 2022-03-30 +### Changed +- Give each example code snippet a title, which will be displayed when you click on the Code Snippets button +- Change title of Add Attribute window from "Create a new attribute..." to "Create Attribute" +- Disable resizing of the Add Attribute dialog +- Add Cancel button to the Add Attribute dialog +- Make the Add Attribute/Remove Attribute/Code Snippets buttons left aligned +- Allow users to add Script Node to push graphs by removing the graph:action category +### Fixed +- Fixed a bug where Remove Attribute button allows you to remove the node-as-bundle output attribute + +## [0.4.1] - 2022-03-10 +### Fixed +- Made property panel only display non-None props +- Renamed some variables to better match what they are doing + +## [0.4.0] - 2022-02-28 +### Added +- Gave user the ability to add and remove dynamic attribute from the script node via UI +- Also allowed user to select a fixed, static type for their new attributes +- Created a popup dialog window for the Add Attribute button, which has a search bar for the attribute types +### Removed +- Removed the existing inputs:data and outputs:data attributes which are of type "any" + +## [0.3.0] - 2022-02-18 +### Added +- A default script with a simple example, and some comments explaining how to use the script node +- Three example scripts to illustrate the various functionalities of the script node +### Changed +- Move the script node widget into a template +- Move the multiline editor to the top of property window, so that we don't have two multiline editors +- Compile the script before executing it +- Catch errors and log the errors + +## [0.2.0] - 2022-02-15 +### Added +- icon and category + +## [0.1.2] - 2021-10-19 +### Modified +- Restructured plugin files as part of repo relocation + +## [0.1.1] - 2021-06-30 +### Modified +- Change bundle input to Any type + +## [0.1.0] - 2021-06-30 +### Added +- Initial publish diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/docs/Overview.md b/docker/extras/kit-app-template/source/extensions/airlab.airstack/docs/Overview.md new file mode 100644 index 00000000..17da6d05 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/docs/Overview.md @@ -0,0 +1,29 @@ +```{csv-table} +**Extension**: {{ extension_version }},**Documentation Generated**: {sub-ref}`today`,{ref}`changelog_airlab.airstack` +``` + +(ext_airlab.airstack)= + +# Overview + +This extension provides an implementation of an OmniGraph node that allows you to write scripts that mimic the +functionality of bespoke nodes. This node type executes custom python code when any node of its type is computed. +The python code is compiled and computed when the graph runs using the embedded interpreter in Kit. The python script +itself is stored as an attribute value in the USD where the graph is stored. Dynamic inputs and output attributes can +be added to the node to provide inputs and outputs to the script. + +```{warning} +As this node executes arbitrary Python code there is an inherent security risk when the node is evaluated without +first being validated as being safe by the user. There is a setting that allows the user to opt in to using such +nodes until a more robust approach can be put in place. +``` + +See the {doc}`complete instructions for the script node` +to learn how it works. + +```{toctree} +:maxdepth: 1 +:hidden: + +GeneratedNodeDocumentation/OgnAscentNode +``` diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/docs/README.md b/docker/extras/kit-app-template/source/extensions/airlab.airstack/docs/README.md new file mode 100644 index 00000000..1117dc14 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/docs/README.md @@ -0,0 +1,4 @@ +# OgnAscentNode [airlab.airstack] + +Provides the Script Node for use in OmniGraph graphs. This node allows custom python code to be executed when the node is computed. The python code is compiled and computed when the graph runs using the embedded interpreter in Kit. The python script itself is stored as an attribute value in the USD where the graph is stored. Dynamic inputs and output attributes can be added to the node to provide inputs and outputs from the script. + diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/fonts/DejaVuSansMono.ttf b/docker/extras/kit-app-template/source/extensions/airlab.airstack/fonts/DejaVuSansMono.ttf new file mode 100644 index 00000000..f5786022 Binary files /dev/null and b/docker/extras/kit-app-template/source/extensions/airlab.airstack/fonts/DejaVuSansMono.ttf differ diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/icons/external_link.svg b/docker/extras/kit-app-template/source/extensions/airlab.airstack/icons/external_link.svg new file mode 100644 index 00000000..2b3f6d98 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/icons/external_link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/icons/folder_open.svg b/docker/extras/kit-app-template/source/extensions/airlab.airstack/icons/folder_open.svg new file mode 100644 index 00000000..066741c0 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/icons/folder_open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/ogn/docs/OgnAscentNode.rst b/docker/extras/kit-app-template/source/extensions/airlab.airstack/ogn/docs/OgnAscentNode.rst new file mode 100644 index 00000000..f5e77e55 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/ogn/docs/OgnAscentNode.rst @@ -0,0 +1,475 @@ +.. _airlab.airstack_AscentNode_2: + +.. _airlab.airstack_AscentNode: + +.. ================================================================================ +.. THIS PAGE IS AUTO-GENERATED. DO NOT MANUALLY EDIT. +.. ================================================================================ + +:orphan: + +.. meta:: + :title: Script Node + :keywords: lang-en omnigraph node script WriteOnly ascentnode script-node + + +Script Node +=========== + +.. + +This script node allows you to execute arbitrary Python code inside an OmniGraph. +The compute function is defined by you at runtime and can be unique in every instance of a script node +that you create. Inside that function you can access the database for the node, which is used for +getting and setting all attribute values that you define. + + +.. + +.. contents:: Exploring The Script Node + :backlinks: entry + :local: + :depth: 1 + +What Is A Script Node? +---------------------- + +A script node is an implementation of a single node type for |omnigraph| that can be used to create many different +behaviors at runtime. Unlike most node types, whose behavior is hardcoded, each instantiation of a script node type +can have its own custom behavior, implemented as a Python script on the node. + +Some of the best uses of a script node are, to make quick prototypes of functionality to validate concepts you are +trying out, and to write one-off nodes that are so simple that it is easier to write them yourself rather than to +try to find an equivalent node (e.g. write a node that computes the hexadecimal string equivalent of an integer). + +Using The Script Node +--------------------- + +These are the three steps you need to add a customized script node to your |omnigraph|: + +- Create a script node. +- Add the Python code required to implement the runtime behavior of the node. +- Add necessary attributes for its operation. + +In practice steps 2 and 3 can be done in either order, though we think you will find it easier to first define your +function and then from that decide the list of attributes to be added. + +.. important:: + + The script node will not be operational until you have added the extra attributes required. In the graph editor + this execution failure shows up as a red coloring on the node. Once you have added the attributes normal execution + will resume. + +The script node can be used either directly from the UI via the graph editor and property panel, or indirectly through +Python scripting, either in the script editor or in external files. The instructions below show both approaches - +choose the one that you feel most comfortable with. + +Creation +++++++++ + +To start using the script node you must first create an |omnigraph| in which it can live, and then create an instance +of the script node in that graph. + +.. tab-set:: + + .. tab-item:: Graph Editor + + Open the :ref:`Action Graph Editor` using the *Visual Scripting* menu + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeGraphMenu.png + :alt: The graph being created + + Create a new |actiongraph| to hold the script node + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeGraphCreate.png + :alt: The graph being created + + Drag the script node icon from the navigation bar on the left onto the newly created graph + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeCreate.png + :alt: The Script Node being added to a graph + + Once you have created a script node it will look something like this in your graph editor. The script node is + suitable for use in any type of graph. In an |actiongraph| the node will have an *execIn* pin to trigger its + execution and an *execOut* pin to trigger other nodes when its compute completes. + + .. tab-item:: Python Code + + The |controller| is the main class through which you can manipulate an |omnigraph| using a script file or + the script editor. This script will create an |actiongraph| and add a script node to it. + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :start-after: begin-script-node-boilerplate + :end-before: end-script-node-boilerplate + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :dedent: 8 + :start-after: begin-script-node-creation + :end-before: end-script-node-creation + +Writing A Compute Function +++++++++++++++++++++++++++ + +The actual input from the script node can come from one of two sources - a string set directly on the node, or an +external file containing the script. These are defined using shared attributes, present in all script nodes. The +extra attributes you will use as part of your computation will be added later. + +Contents Of The Script +~~~~~~~~~~~~~~~~~~~~~~ + +The script node creates a limited override of the API accessible from :py:class:`omni.graph.core.NodeType`. +The following callback functions can be defined in the script, and will be used as the runtime implementations of +the equivalent functions on the node type API. + +- ``compute(db)``: called every time the node computes (should always be defined). +- ``setup(db)``: called before compute the first time, or after the reset attribute value is set. +- ``cleanup(db)``: called when the node is deleted or the reset attribute value is set. + +*db:* :py:class:`omni.graph.core.Database` is the node interface where attributes are exposed like ``db.inputs.foo``. +This includes the predefined attributes used by the script node as described below, as well as any dynamic attributes +added to a script node instance by the user. The predefined functions ``db.log_error`` or ``db.log_warning`` should be +used to report problems in the node's computation. + +In addition, for convenience the :py:mod:`omni.graph.core` module is imported under the variable named ``og``. + +`import` statements, function/class definitions, and global variables may be placed, +outside of the callbacks, as you would in any other Python module definition. + +Variables may be added to the ``db.per_instance_state`` state object for persistence across nodes that are instanced +in more than one graph. See how the +:ref:`sample snippet for the Fibonacci function ` makes use of this feature to +walk through the values in the Fibonacci sequence on each successive evaluation. + +Overriding the ``db.setup(db)`` and ``db.cleanup(db)`` functions can be used to let your script node define values +that will be used through multiple evaluations, but which you do not wish to persist when the script node itself is +deleted. See how the +:ref:`sample snippet for the Controller function ` makes use of this feature to +initialize and clean up the USD stage for a script node that is responsible for creating cubes. + +.. note:: + + The `setup` function corresponds to the :py:meth:`omni.graph.core.NodeType.initialize` function on the node type + and the `cleanup` function corresponds to the :py:meth:`omni.graph.core.NodeType.release` function. The reason they + are different is that they will also be called when the script node is reset whereas the API functions only get + called when the node is created and destroyed. + +All of the attribute values you get back from calling the ``db.inputs`` or ``db.outputs`` properties have a specific +data type based on their attribute type. +You can find a description of all of the data types returned from the database for the supported attribute types +by looking through the :ref:`data type descriptions`. + +.. _omni_graph_script_node_as_text: + +Setting The Script With Text +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The attribute `inputs:script` is a simple text string which will be later translated into Python. + +.. tab-set:: + + .. tab-item:: Graph Editor + + After creation of the script node it should be selected and its properties should be visible in the + property panel. If you don't have the property panel visible you can turn it on with this menu + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodePropertyPanelMenu.png + :alt: The menu entry to turn on the property panel + + This is what the property panel for your script node will look like on creation. Notice how the script + field has been pre-populated with some placeholders for the functions you are allowed to write as well as some + instructions on what the script can contain. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodePropertyPanel.png + :alt: The graph being created + + Here is the full text of the instructions: + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Default Script" + :end-before: # # # DELIMITER # # # + + Ignoring the `setup(db)` and `cleanup(db)` functions for now copy-paste this simple node type definition string + and replace the **Script** text field with it. + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :dedent: 8 + :start-after: begin-script-node-script + :end-before: end-script-node-script + + .. tab-item:: Python Code + + The attribute values required to point the script node at a file can be set through the |controller|. + Here is an example of a simple script that defines a script node that will output a boolean indicating + whether the first input is greater than the second input. + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :dedent: 8 + :start-after: begin-script-node-set-to-script + :end-before: end-script-node-set-to-script + +.. tip:: + + As script nodes do not have unique node type definitions it is always a good idea to add Python docstrings as + documentation as a reminder of exactly what the node does. + +Now that you have a script defined you can skip ahead to :ref:`omni_graph_script_node_adding_attributes`. + +Setting The Script With A File +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you want to use an external file then you set the *Use Path* attribute to **True** and set the *Script Path* +attribute to be a string containing the path to the script file on disk. It can be an absolute path name, which will be +highly reliant on your file system configuration, or it can be relative to the USD edit layer so that the script can +be passed along with your USD file as a "sidecar" file. + +.. tab-set:: + + .. tab-item:: Graph Editor + + After creation of the script node it should be selected and its properties should be visible in the + property panel. If you don't have the property panel visible you can turn it on with this menu + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodePropertyPanelMenu.png + :alt: The menu entry to turn on the property panel + + This is what the property panel for your script node will look like on creation. Notice how the script + field has been pre-populated with some placeholders for the functions you are allowed to write as well as some + instructions on what the script can contain. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodePropertyPanel.png + :alt: The graph being created + + Now check the *Use Path* checkbox to tell the script node that it is getting its input from a file rather than + the *Script* value above. Next set the *Script File Path* value to point to a file in which you have put your + script. (See the :ref:`omni_graph_script_node_as_text` script section above for an example of what you + might put into your file.) When you are done your property panel should look something like this. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeAsFile.png + :alt: The property panel with a file script specified + + .. tab-item:: Python Code + + The attribute values required to point the script node at a file can be set through the |controller|. + This example creates a temporary file with the same script as the example above and accesses it. + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :dedent: 8 + :start-after: begin-script-node-set-to-file + :end-before: end-script-node-set-to-file + +.. _omni_graph_script_node_adding_attributes: + +Adding Attributes ++++++++++++++++++ + +Since there is no .ogn description of the node your script node will rely on |dynamicattributes| to define the inputs +and outputs of the node. A dynamic attribute is just one that is not predefined by the node type. In the script +you have written above these appear as anything in your `compute()` functions accessed as **db.inputs.X** for input +attributes and **db.outputs.Y** for output attributes. + +As the intent of your code is unknown (e.g. did you mean to add two integers or two arrays of points when you typed +*db.inputs.a + db.inputs.b*) you must manually add each of the attributes with the types you intend to use. + +.. tab-set:: + + .. tab-item:: Graph Editor + + In the script node property panel you will see a button labeled **Add Attribute...**. You will click on it + once for each attribute that your `compute()` function requires; in this case it will be two inputs and one + output. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeAddingAttributes.png + :alt: Property panel for adding attributes + + This brings up a dialog where you can define your attributes. Here is what you will enter in order to define the + first attribute as an integer value. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeAddInput.png + :alt: An input being added to a script node in the property panel + + Repeat this for the other input *second_input* and then once again for the output attribute. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeAddOutput.png + :alt: An output being added to a script node in the property panel + + Notice here that you must also click the **output** button to specify that the new attribute will be an output. + As a rule of thumb, inputs are values that you read and outputs are values that you write. + + Once you have created a script node it will look something like this in your graph editor. The script node is + suitable for use in any type of graph. In an |actiongraph| the node will have an *execIn* pin to trigger its + execution and an *execOut* pin to trigger other nodes when its compute completes. + + .. image:: ../../../../../source/extensions/airlab.airstack/python/nodes/images/AscentNodeFinalNode.png + :alt: The Script Node in the editor after adding attributes + + .. tab-item:: Python Code + + The |controller| can also be used to add attributes to a node. This example makes our two inputs *integer* + types and the output a *boolean* type. Note that this is a continuation of the previous script as it must + appear inside the *TemporaryDirectory* context to work properly. + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/tests/test_ascentnode.py + :language: python + :dedent: 8 + :start-after: begin-script-node-add-attributes + :end-before: end-script-node-add-attributes + +.. note:: + + You may have seen references to another type of attribute port beyond input and output. The *state* attribute port + is just like an *output* port except that it is guaranteed to retain its value between executions of the + `compute()` function. Use state attributes for temporarily caching information. + +Tradeoffs: Script Node vs. Python Node +-------------------------------------- + +The script node, accessible when you load the extension :ref:`airlab.airstack`, +provides a generic node type inside |omnigraph|. It includes an input attribute that holds a Python script +encoded as a string. This string acts as the implementation of this node. + +Although the syntax is slightly different from what you might find in a normal Python node +the benefit of the script node is that you do not have to write any external files, including any +.ogn definitions to implement the new node. + +The downside is that, since the script node you write is not on disk, it is more difficult to share the implementation +with other users. + +.. note:: + + This is an important distinction. In simple terms, a **node type** is like a blueprint for making nodes. The + blueprint can be used by scripts or by the graph editor to create as many nodes of the same type as you wish. + A **node** is the actual thing created based on that blueprint. Think of it like a cookie cutter (node type) + used to make cookies (nodes). + + The **script node type** then is a general template for creating nodes that run scripts. A **script node** is a + specific cookie made using that template, having its unique attributes and a Python script to run. While everyone + can use the same cookie cutter (script node type) to make cookies (nodes) using standard tools, to create a new, + specific cookie (script node), you'd have to duplicate an existing one. + +.. _omni_graph_script_node_samples: + +Code Snippets: Pre-Packaged Code Samples +---------------------------------------- + +If you have been using the property panel for editing you may have noticed a button labeled **Code Snippets**. This +button accesses a drop-down menu that will populate your `compute()` function with working examples. You may have to +enable extra extensions to make them work (e.g. **omni.warp**), and you will definitely have to inspect the snippets +to see what types of attributes they are expecting as those must still be added manually by you. + +.. tab-set:: + + .. tab-item:: Compute Count + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Compute Count" + :end-before: # # # DELIMITER # # # + + .. tab-item:: Fibonacci + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Fibonacci" + :end-before: # # # DELIMITER # # # + + .. tab-item:: Controller + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Controller" + :end-before: # # # DELIMITER # # # + + .. tab-item:: Warp + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Sine Deformer With Warp" + :end-before: # # # DELIMITER # # # + + .. tab-item:: Callbacks + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Value Changed Callbacks" + :end-before: # # # DELIMITER # # # + + .. tab-item:: Timer + + .. literalinclude:: ../../../../../source/extensions/airlab.airstack/python/_impl/ascentnode_example_scripts.py + :language: python + :start-after: Title = "Compute Timer" + + +Installation +------------ + +To use this node enable :ref:`airlab.airstack` in the Extension Manager. + + +Inputs +------ +.. csv-table:: + :header: "Name", "Type", "Descripton", "Default" + :widths: 20, 20, 50, 10 + + "Exec In (*inputs:execIn*)", "``execution``", "Signal to the graph that this node is ready to be executed.", "None" + "Inline Script (*inputs:script*)", "``string``", "A string containing a Python script that may define code to be executed when the script node computes. See the default and example scripts for more information.", "None" + "Script File Path (*inputs:scriptPath*)", "``token``", "The path of a file containing a Python script that may define code to be executed when the script node computes. See the default and example scripts for more info.", "None" + "", "Metadata", "*uiType* = filePath", "" + "", "Metadata", "*fileExts* = Python Scripts (\\*.py)", "" + "Use Script File (*inputs:usePath*)", "``bool``", "When true, the python script is read from the file specified in 'Script File Path' (*inputs:scriptPath*), instead of the string in 'Inline Script' (*inputs:script*).", "False" + + +Outputs +------- +.. csv-table:: + :header: "Name", "Type", "Descripton", "Default" + :widths: 20, 20, 50, 10 + + "Exec Out (*outputs:execOut*)", "``execution``", "Signal to the graph that execution can continue downstream.", "None" + + +State +----- +.. csv-table:: + :header: "Name", "Type", "Descripton", "Default" + :widths: 20, 20, 50, 10 + + "Omni Initialized (*state:omni_initialized*)", "``bool``", "State attribute used to control when the script should be reloaded. This should be set to false to trigger a reload of the script.", "None" + + +Metadata +-------- +.. csv-table:: + :header: "Name", "Value" + :widths: 30,70 + + "Unique ID", "airlab.airstack.AscentNode" + "Version", "2" + "Extension", "airlab.airstack" + "Icon", "ogn/icons/airlab.airstack.AscentNode.svg" + "Has State?", "True" + "Implementation Language", "Python" + "Default Memory Type", "cpu" + "Generated Code Exclusions", "None" + "uiName", "Script Node" + "Categories", "script" + "Generated Class Name", "OgnAscentNodeDatabase" + "Python Module", "airlab.airstack" + +Related Extensions +------------------ + +The Python database implementation comes from the :ref:`omni.graph` extension. + +The database definition is generated using the :ref:`omni.graph.tools` extension. + +The graph editors described above for visual addition of dynamic attributes to the script node can be found in +:ref:`omni.graph.window.action`. + diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/ogn/icons/omni.graph.ascentnode.AscentNode.svg b/docker/extras/kit-app-template/source/extensions/airlab.airstack/ogn/icons/omni.graph.ascentnode.AscentNode.svg new file mode 100644 index 00000000..71a4d86d --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/ogn/icons/omni.graph.ascentnode.AscentNode.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docker/extras/kit-app-template/source/extensions/airlab.airstack/ogn/nodes.json b/docker/extras/kit-app-template/source/extensions/airlab.airstack/ogn/nodes.json new file mode 100644 index 00000000..12b10bb4 --- /dev/null +++ b/docker/extras/kit-app-template/source/extensions/airlab.airstack/ogn/nodes.json @@ -0,0 +1,16 @@ +{ + "extension": "airlab.airstack", + "nodes": { + "AscentNode": { + "description": [ + "This script node allows you to execute arbitrary Python code inside an OmniGraph.\n", + "The compute function is defined by you at runtime and can be unique in every instance of a script node\n", + "that you create. Inside that function you can access the database for the node, which is used for\n", + "getting and setting all attribute values that you define.\n" + ], + "version": 2, + "uiName": "Script Node", + "language": "Python" + } + } +} \ No newline at end of file diff --git a/docker/extras/kit-app-template/source/extensions/airlab.tmux_manager/airlab/tmux_manager/extension.py b/docker/extras/kit-app-template/source/extensions/airlab.tmux_manager/airlab/tmux_manager/extension.py index 0d2cf215..a50e016e 100644 --- a/docker/extras/kit-app-template/source/extensions/airlab.tmux_manager/airlab/tmux_manager/extension.py +++ b/docker/extras/kit-app-template/source/extensions/airlab.tmux_manager/airlab/tmux_manager/extension.py @@ -12,6 +12,157 @@ import omni.ui as ui import subprocess +# common omnigraphs test +from pathlib import Path +import omni.graph.core as og +import omni.ui as ui +import omni.usd +from omni.isaac.core.utils.stage import get_next_free_path +from omni.isaac.ui.callbacks import on_docs_link_clicked, on_open_IDE_clicked +from omni.isaac.ui.style import get_style +from omni.isaac.ui.ui_utils import dropdown_builder +from omni.isaac.ui.widgets import ParamWidget, SelectPrimWidget +from omni.kit.notification_manager import NotificationStatus, post_notification +from omni.kit.window.extensions import SimpleCheckBox +from pxr import OmniGraphSchema, Sdf +from omni.isaac.ui.menu import make_menu_item_description +from omni.kit.menu.utils import MenuItemDescription, add_menu_items, remove_menu_items + +def make_camera_graph(): + timeline = omni.timeline.get_timeline_interface() + timeline.stop() + + keys = og.Controller.Keys + (graph, nodes, _, _) = og.Controller.edit( + {"graph_path": "/airstack_camera", "evaluator_name": "execution"}, + { + keys.CREATE_NODES: [ + ("OnPlaybackTick", "omni.graph.action.OnPlaybackTick"), + ("IsaacRunOneSimulationFrame", "omni.isaac.core_nodes.OgnIsaacRunOneSimulationFrame"), + ("ScriptNode", "omni.graph.scriptnode.ScriptNode"), + ("IsaacCreateRenderProduct", "omni.isaac.core_nodes.IsaacCreateRenderProduct"), + ("ROS2CameraHelper", "omni.isaac.ros2_bridge.ROS2CameraHelper"), + ], + keys.CONNECT: [ + ("OnPlaybackTick.outputs:tick", "IsaacRunOneSimulationFrame.inputs:execIn"), + ("IsaacRunOneSimulationFrame.outputs:step", "ScriptNode.inputs:execIn"), + ("ScriptNode.outputs:execOut", "IsaacCreateRenderProduct.inputs:execIn"), + ("IsaacCreateRenderProduct.outputs:execOut", "ROS2CameraHelper.inputs:execIn"), + ("IsaacCreateRenderProduct.outputs:renderProductPath", "ROS2CameraHelper.inputs:renderProductPath"), + ("ScriptNode.outputs:frameId", "ROS2CameraHelper.inputs:frameId"), + ("ScriptNode.outputs:nodeNamespace", "ROS2CameraHelper.inputs:nodeNamespace"), + ("ScriptNode.outputs:topicName", "ROS2CameraHelper.inputs:topicName"), + ("ScriptNode.outputs:cameraPrim", "IsaacCreateRenderProduct.inputs:cameraPrim"), + ], + keys.CREATE_ATTRIBUTES: [ + ("ScriptNode.inputs:namespaceDepthFromRoot", "uint"), + ("ScriptNode.inputs:overrideNamespace", "string"), + ("ScriptNode.outputs:cameraPrim", "target"), + ("ScriptNode.outputs:cameraPrimRight", "target"), + ("ScriptNode.outputs:frameId", "string"), + ("ScriptNode.outputs:frameIdRight", "string"), + ("ScriptNode.outputs:nodeNamespace", "string"), + ("ScriptNode.outputs:topicName", "string"), + ("ScriptNode.outputs:topicNameRight", "string"), + ("ScriptNode.outputs:topicNameDepth", "string"), + ("ScriptNode.outputs:topicNameDepthRight", "string"), + ("ScriptNode.outputs:isStereo", "bool"), + ], + keys.SET_VALUES: [ + ("ScriptNode.inputs:namespaceDepthFromRoot", 1), + ("ScriptNode.inputs:isStereo", False), + ("ScriptNode.inputs:script", open("/extras/omnigraph_sensor_parameters.py").read()), + ], + }, + ) + +def make_stereo_camera_graph(): + timeline = omni.timeline.get_timeline_interface() + timeline.stop() + + keys = og.Controller.Keys + (graph, nodes, _, _) = og.Controller.edit( + {"graph_path": "/airstack_stereo_camera", "evaluator_name": "execution"}, + { + keys.CREATE_NODES: [ + ("OnPlaybackTick", "omni.graph.action.OnPlaybackTick"), + ("IsaacRunOneSimulationFrame", "omni.isaac.core_nodes.OgnIsaacRunOneSimulationFrame"), + ("ScriptNode", "omni.graph.scriptnode.ScriptNode"), + ("IsaacCreateRenderProductLeft", "omni.isaac.core_nodes.IsaacCreateRenderProduct"), + ("IsaacCreateRenderProductRight", "omni.isaac.core_nodes.IsaacCreateRenderProduct"), + ("ROS2CameraHelperLeftImage", "omni.isaac.ros2_bridge.ROS2CameraHelper"), + ("ROS2CameraHelperRightImage", "omni.isaac.ros2_bridge.ROS2CameraHelper"), + ("ROS2CameraHelperLeftDepth", "omni.isaac.ros2_bridge.ROS2CameraHelper"), + ("ROS2CameraHelperRightDepth", "omni.isaac.ros2_bridge.ROS2CameraHelper"), + ("ROS2CameraInfoHelper", "omni.isaac.ros2_bridge.ROS2CameraInfoHelper"), + ], + keys.CONNECT: [ + ("OnPlaybackTick.outputs:tick", "IsaacRunOneSimulationFrame.inputs:execIn"), + ("IsaacRunOneSimulationFrame.outputs:step", "ScriptNode.inputs:execIn"), + + ("ScriptNode.outputs:execOut", "IsaacCreateRenderProductRight.inputs:execIn"), + ("ScriptNode.outputs:execOut", "IsaacCreateRenderProductLeft.inputs:execIn"), + + ("IsaacCreateRenderProductLeft.outputs:execOut", "ROS2CameraHelperLeftImage.inputs:execIn"), + ("IsaacCreateRenderProductLeft.outputs:execOut", "ROS2CameraHelperLeftDepth.inputs:execIn"), + ("IsaacCreateRenderProductLeft.outputs:execOut", "ROS2CameraInfoHelper.inputs:execIn"), + ("IsaacCreateRenderProductLeft.outputs:renderProductPath", "ROS2CameraHelperLeftImage.inputs:renderProductPath"), + ("IsaacCreateRenderProductLeft.outputs:renderProductPath", "ROS2CameraHelperLeftDepth.inputs:renderProductPath"), + ("IsaacCreateRenderProductLeft.outputs:renderProductPath", "ROS2CameraInfoHelper.inputs:renderProductPath"), + + ("IsaacCreateRenderProductRight.outputs:execOut", "ROS2CameraHelperRightImage.inputs:execIn"), + ("IsaacCreateRenderProductRight.outputs:execOut", "ROS2CameraHelperRightDepth.inputs:execIn"), + ("IsaacCreateRenderProductRight.outputs:renderProductPath", "ROS2CameraHelperRightImage.inputs:renderProductPath"), + ("IsaacCreateRenderProductRight.outputs:renderProductPath", "ROS2CameraHelperRightDepth.inputs:renderProductPath"), + ("IsaacCreateRenderProductRight.outputs:renderProductPath", "ROS2CameraInfoHelper.inputs:renderProductPathRight"), + + ("ScriptNode.outputs:frameId", "ROS2CameraHelperLeftImage.inputs:frameId"), + ("ScriptNode.outputs:frameIdRight", "ROS2CameraHelperLeftDepth.inputs:frameId"), + ("ScriptNode.outputs:frameId", "ROS2CameraHelperRightImage.inputs:frameId"), + ("ScriptNode.outputs:frameIdRight", "ROS2CameraHelperRightDepth.inputs:frameId"), + ("ScriptNode.outputs:frameId", "ROS2CameraInfoHelper.inputs:frameId"), + ("ScriptNode.outputs:frameIdRight", "ROS2CameraInfoHelper.inputs:frameIdRight"), + ("ScriptNode.outputs:infoTopicName", "ROS2CameraInfoHelper.inputs:topicName"), + ("ScriptNode.outputs:infoTopicNameRight", "ROS2CameraInfoHelper.inputs:topicNameRight"), + ("ScriptNode.outputs:nodeNamespace", "ROS2CameraHelperLeftImage.inputs:nodeNamespace"), + ("ScriptNode.outputs:nodeNamespace", "ROS2CameraHelperRightImage.inputs:nodeNamespace"), + ("ScriptNode.outputs:nodeNamespace", "ROS2CameraHelperLeftDepth.inputs:nodeNamespace"), + ("ScriptNode.outputs:nodeNamespace", "ROS2CameraHelperRightDepth.inputs:nodeNamespace"), + ("ScriptNode.outputs:topicName", "ROS2CameraHelperLeftImage.inputs:topicName"), + ("ScriptNode.outputs:topicNameRight", "ROS2CameraHelperRightImage.inputs:topicName"), + ("ScriptNode.outputs:topicNameDepth", "ROS2CameraHelperLeftDepth.inputs:topicName"), + ("ScriptNode.outputs:topicNameDepthRight", "ROS2CameraHelperRightDepth.inputs:topicName"), + ("ScriptNode.outputs:cameraPrim", "IsaacCreateRenderProductLeft.inputs:cameraPrim"), + ("ScriptNode.outputs:cameraPrimRight", "IsaacCreateRenderProductRight.inputs:cameraPrim"), + ], + keys.CREATE_ATTRIBUTES: [ + ("ScriptNode.inputs:namespaceDepthFromRoot", "uint"), + ("ScriptNode.inputs:overrideNamespace", "string"), + ("ScriptNode.inputs:isStereo", "bool"), + ("ScriptNode.outputs:cameraPrim", "target"), + ("ScriptNode.outputs:cameraPrimRight", "target"), + ("ScriptNode.outputs:frameId", "string"), + ("ScriptNode.outputs:frameIdRight", "string"), + ("ScriptNode.outputs:nodeNamespace", "string"), + ("ScriptNode.outputs:topicName", "string"), + ("ScriptNode.outputs:topicNameRight", "string"), + ("ScriptNode.outputs:topicNameDepth", "string"), + ("ScriptNode.outputs:topicNameDepthRight", "string"), + ("ScriptNode.outputs:infoTopicName", "string"), + ("ScriptNode.outputs:infoTopicNameRight", "string"), + ], + keys.SET_VALUES: [ + ("ScriptNode.inputs:namespaceDepthFromRoot", 1), + ("ScriptNode.inputs:isStereo", True), + #("ScriptNode.inputs:script", open("/extras/omnigraph_sensor_parameters.py").read()), + ("ScriptNode.inputs:usePath", True), + ("ScriptNode.inputs:scriptPath", "/extras/omnigraph_sensor_parameters.py"), + ("ROS2CameraHelperLeftDepth.inputs:type", "depth"), + ("ROS2CameraHelperRightDepth.inputs:type", "depth"), + ], + }, + ) + # Functions and vars are available to other extensions as usual in python: `airlab.tmux_manager.some_public_function(x)` def some_public_function(x: int): print(f"[airlab.tmux_manager] some_public_function was called with {x}") @@ -33,6 +184,20 @@ class MyExtension(omni.ext.IExt): # like where this extension is located on the filesystem. def on_startup(self, ext_id): print("[airlab.tmux_manager] Extension startup") + self.window_handle = None + ros_og_menu = [ + make_menu_item_description(ext_id, "AirStack Camera", onclick_fun=make_camera_graph), + make_menu_item_description(ext_id, "AirStack Stereo Camera", onclick_fun=make_stereo_camera_graph), + ] + + self._menu_items = [ + MenuItemDescription( + name="Common Omnigraphs", + sub_menu=ros_og_menu, + ) + ] + + add_menu_items(self._menu_items, "Airstack") self._count = 0 diff --git a/docker/extras/kit-app-template/source/extensions/airlab.tmux_manager/config/extension.toml b/docker/extras/kit-app-template/source/extensions/airlab.tmux_manager/config/extension.toml index bb5ac49c..5c8be722 100644 --- a/docker/extras/kit-app-template/source/extensions/airlab.tmux_manager/config/extension.toml +++ b/docker/extras/kit-app-template/source/extensions/airlab.tmux_manager/config/extension.toml @@ -37,6 +37,11 @@ category = "Example" # Keywords for the extension keywords = ["kit", "example"] +# Watch the .ogn files for hot reloading (only works for Python files) +[fswatcher.patterns] +include = ["*.ogn", "*.py"] +exclude = ["Ogn*Database.py"] + # Preview image and icon. Folder named "data" automatically goes in git lfs (see .gitattributes file). # Preview image is shown in "Overview" of Extensions window. Screenshot of an extension might be a good preview image. preview_image = "data/preview.png" @@ -47,6 +52,8 @@ icon = "data/icon.png" # Use omni.ui to build simple UI [dependencies] "omni.kit.uiapp" = {} +"omni.kit.test" = {} +"omni.graph" = {} # Main python module this extension provides, it will be publicly available as "import airlab.tmux_manager". [[python.module]] diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/config/extension.toml b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/config/extension.toml deleted file mode 100644 index 6c131bcd..00000000 --- a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/config/extension.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -# Semantic Versionning is used: https://semver.org/ -version = "1.0.0" - -# The title and description fields are primarily for displaying extension info in UI -title = "Spawn Primitives" -description="Spawn different primitives utilizing omni kit's commands." - -# Path (relative to the root) or content of readme markdown file for UI. -readme = "docs/README.md" - -# URL of the extension source repository. -repository = "" - -# One of categories for UI. -category = "Example" - -# Keywords for the extension -keywords = ["kit", "example"] - - -# Use omni.ui to build simple UI -[dependencies] -"omni.kit.uiapp" = {} - -# Main python module this extension provides, it will be publicly available as "import omni.hello.world". -[[python.module]] -name = "omni.example.spawn_prims" diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/docs/README.md b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/docs/README.md deleted file mode 100644 index 5e8cdad0..00000000 --- a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/docs/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Spawn Primitives (omni.example.spawn_prims) -![Preview](../tutorial/images/spawnprim_tutorial7.gif) - -## Overview - -The Spawn Primitives Sample extension creates a new window and has a button for each primitive type. Selecting these buttons will spawn in a primitive corresponding to the label on the button. - -See [Adding the Extension](../../../README.md#adding-this-extension) on how to add the extension to your project. - -## [Tutorial](../tutorial/tutorial.md) -This extension sample also includes a step-by-step tutorial to accelerate your growth as you learn to build your own -Omniverse Kit extensions. [Get started with the tutorial.](../tutorial/tutorial.md) - -## Usage -### Spawn Primitives -* Click on the **Cube**, **Disk**, **Cone**, etc buttons to spawn the corresponding primitive. diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/README.md b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/README.md deleted file mode 100644 index 979d99b4..00000000 --- a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Download the AscentAeroSystemsSITLPackage.zip from [Google Drive](https://drive.google.com/drive/folders/1vuyRA7h6u7eS_HI16r5HVDxIklFObluO) and unzip into this directory. - diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_tmux.bash b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_tmux.bash deleted file mode 100755 index ab4c325f..00000000 --- a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_tmux.bash +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -cd $SCRIPT_DIR/AscentAeroSystemsSITLPackage - -#export BASE_PORT=5760 -#export ASCENT_SITL_PORT=14552 # port to talk to QGC -#export ISAAC_SIM_PORT=14553 # port for Isaac Sim -#export AUTONOMY_STACK_PORT=14554 # port for our autonomy stack - -export BASE_PORT=$1 -export ASCENT_SITL_PORT=$2 # port to talk to QGC -export ISAAC_SIM_PORT=$3 # port for Isaac Sim -export AUTONOMY_STACK_PORT=$4 # port for our autonomy stack -export MAVROS_LAUNCH_PORT=$5 -export ROBOT_NUM=$6 -export SESSION_NAME=ascent$6 - -tmuxp load -d ascent_sitl.yaml -s $SESSION_NAME diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_tmux.sh b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_tmux.sh deleted file mode 100644 index ce70a832..00000000 --- a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/ascent_sitl_tmux.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -cd $SCRIPT_DIR/AscentAeroSystemsSITLPackage - -export ASCENT_SITL_PORT=14552 # port to talk to QGC -export ISAAC_SIM_PORT=14553 # port for Isaac Sim -export AUTONOMY_STACK_PORT=14554 # port for our autonomy stack - -tmuxp load -d ascent_sitl.yaml diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/launch_ascent_sitl.bash b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/launch_ascent_sitl.bash deleted file mode 100755 index 70203369..00000000 --- a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/launch_ascent_sitl.bash +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# Description: this script launches the AscentAeroSystems SITL package -# Author: Andrew Jong (ajong@andrew.cmu.edu) -# Copyright (c) 2024. This file is developed as part of software from the AirLab at the -# Robotics Institute at Carnegie Mellon University (https://theairlab.org). - -set -ex - -# kill all child processes on interrupt -trap 'pkill -P $$; exit' SIGINT SIGTERM - - -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -ASCENT_DIR="$SCRIPT_DIR/AscentAeroSystemsSITLPackage" - -ASCENT_SITL_PORT=14552 # port to talk to QGC -ISAAC_SIM_PORT=14553 # port for Isaac Sim -AUTONOMY_STACK_PORT=14554 # port for our autonomy stack - - -# launch QGC, SITL, and mavproxy as child processes - -cd $ASCENT_DIR -# ./AscentQLinux/AscentQ & \ -./spirit_sitl -S --model coaxial -I0 & \ -\ -mavproxy.py --streamrate=100 --master tcp:127.0.0.1:5760 \ - --out udp:127.0.0.1:$ASCENT_SITL_PORT \ - --out udp:127.0.0.1:$ISAAC_SIM_PORT \ - --out udp:127.0.0.1:$AUTONOMY_STACK_PORT - -wait diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/__init__.py b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/__init__.py deleted file mode 100644 index 7e0d6726..00000000 --- a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. -# -# NVIDIA CORPORATION and its licensors retain all intellectual property -# and proprietary rights in and to this software, related documentation -# and any modifications thereto. Any use, reproduction, disclosure or -# distribution of this software and related documentation without an express -# license agreement from NVIDIA CORPORATION is strictly prohibited. - -from .extension import * diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/behavior_script.py b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/behavior_script.py deleted file mode 100644 index e9bd0c2d..00000000 --- a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/behavior_script.py +++ /dev/null @@ -1,158 +0,0 @@ -from omni.kit.scripting import BehaviorScript -import omni.ext -import omni.ui as ui -import omni.kit.commands - -from omni.isaac.core.utils.stage import get_current_stage -from omni.isaac.core.utils.prims import define_prim, get_prim_at_path - -import sys -import dronekit -import os -import numpy as np -from scipy.spatial.transform import Rotation -import carb -import omni -import omni.graph.core as og -import omni.replicator.core as rep -import omni.timeline -import usdrt.Sdf -from omni.isaac.core.prims import GeometryPrim, RigidPrim -from omni.isaac.core.utils import extensions, stage -from omni.isaac.core.world import World -from pxr import Gf, Usd, UsdGeom -from .AscentAeroSystems.ascent_sitl_launch_tool import AscentSitlLaunchTool -import time -import threading -import struct -import socket - -import asyncio - -#========================================================================================== -# ------------------------------------- Time Sync Server ---------------------------------- -#========================================================================================== - -mutex = threading.Lock() -client_count = 1 -current_sim_time = 0. -def get_sim_time(): - return current_sim_time - -def handle_client(conn, addr): - global client_count - print(f'Connected by {addr}') - - initial_sitl_time = -1. - initial_sim_time = -1. - - with conn: - while True: - data = conn.recv(16) - if not data: - break - - #print('data', len(data), data) - message_type, t = struct.unpack('cQ', data) - #print('message type', message_type, t) - if message_type == b't': - s = get_sim_time() - - if initial_sitl_time < 0: - initial_sitl_time = t - initial_sim_time = s - - sitl_time = t - initial_sitl_time - sim_time = (s - initial_sim_time)*1000000 - time_to_sleep = int(sitl_time - sim_time) - - conn.sendall(struct.pack('i', time_to_sleep)) - elif message_type == b'n': - print('message type', message_type, t) - with mutex: - client_count += 1 - conn.sendall(struct.pack('i', client_count)) - -def start_server(host='127.0.0.1', port=65432): - try: - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.bind((host, port)) - s.listen() - print(f'Server listening on {host}:{port}') - def f(): - while True: - conn, addr = s.accept() - client_thread = threading.Thread(target=handle_client, args=(conn, addr)) - client_thread.start() - threading.Thread(target=f).start() - return 1 - except: - client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - client.connect((host, port)) - message = struct.pack('cQ', b'n', 0) - client.sendall(message) - drone_count = struct.unpack('i', client.recv(4))[0] - return drone_count - - -#========================================================================================== -# ------------------------------------- Behavior Script ----------------------------------- -#========================================================================================== - -class TestScript(BehaviorScript): - def on_init(self): - self.p = self.stage.GetPrimAtPath(self.prim_path) - print(self.p.GetAttributes()) - self.p.GetAttribute('xformOp:translate').Set((0,0, 0)) - self.q_type = type(self.p.GetAttribute("xformOp:orient").Get()) - self.p.GetAttribute('xformOp:orient').Set(self.p.GetAttribute("xformOp:orient").Get()) - print(self.p.GetAttribute("xformOp:translate").Get()) - self.dronekit_connection = None - self.initialized = False - self.drone_count = 0 - - def on_update(self, current_time, delta_time): - #print('update', current_time, delta_time) - global current_sim_time - current_sim_time = current_time - - if self.dronekit_connection == None: - if not self.initialized: - self.initialized = True - script_dir = os.path.dirname(os.path.realpath(__file__)) + "/AscentAeroSystems" - self.drone_count = start_server() - self.sitl_tool = AscentSitlLaunchTool(script_dir, self.drone_count) - self.sitl_tool.launch() - #self.thread = threading.Thread(target=start_server) - #self.thread.start() - def f(): - self.dronekit_connection = dronekit.connect(self.sitl_tool.get_dronekit_address(), - wait_ready=True, timeout=999999, rate=120) - threading.Thread(target=f).start() - else: - r = self.dronekit_connection._roll + np.pi / 2 - p = self.dronekit_connection._pitch - y = self.dronekit_connection._yaw - - rot = Rotation.from_euler("xyz", [r, p, y], degrees=False) - # quaternion: xyzw - q = rot.as_quat() - - o = self.q_type(q[3], q[0], q[1], q[2]) - - n, e, d = ( - self.dronekit_connection.location.local_frame.east, - self.dronekit_connection.location.local_frame.north, - self.dronekit_connection.location.local_frame.down, - ) - if d is not None: - # quaternion: wxyz - p = (e, n, -d) # enu - #self.p.set_world_pose(p, o) - self.p.GetAttribute('xformOp:translate').Set(p) - self.p.GetAttribute('xformOp:orient').Set(o) - else: - print("Drone location from dronekit is None") - - def on_destroy(self): - print('destroy') diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/extension.py b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/extension.py deleted file mode 100644 index 5ec46e11..00000000 --- a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/extension.py +++ /dev/null @@ -1,275 +0,0 @@ -# Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. -# -# NVIDIA CORPORATION and its licensors retain all intellectual property -# and proprietary rights in and to this software, related documentation -# and any modifications thereto. Any use, reproduction, disclosure or -# distribution of this software and related documentation without an express -# license agreement from NVIDIA CORPORATION is strictly prohibited. - -import omni.ext -import omni.ui as ui -import omni.kit.commands - -from omni.isaac.core.utils.stage import get_current_stage -from omni.isaac.core.utils.prims import define_prim, get_prim_at_path - -import sys -import dronekit -import os -import numpy as np -from scipy.spatial.transform import Rotation -import carb -import omni -import omni.graph.core as og -import omni.replicator.core as rep -import omni.timeline -import usdrt.Sdf -from omni.isaac.core.prims import GeometryPrim, RigidPrim -from omni.isaac.core.utils import extensions, stage -from omni.isaac.core.world import World -from pxr import Gf, Usd, UsdGeom -from .AscentAeroSystems.ascent_sitl_launch_tool import AscentSitlLaunchTool -import time -import threading -import struct -import socket - -import asyncio - - -vehicle_num = 0 -# enable ROS bridge extension -#extensions.enable_extension("omni.isaac.ros2_bridge") - -#simulation_app.update() - -mutex = threading.Lock() -client_count = 1 -current_sim_time = 0. -def get_sim_time(): - return current_sim_time - -def handle_client(conn, addr): - global client_count - print(f'Connected by {addr}') - - initial_sitl_time = -1. - initial_sim_time = -1. - - with conn: - while True: - data = conn.recv(16) - if not data: - break - - #print('data', len(data), data) - message_type, t = struct.unpack('cQ', data) - #print('message type', message_type, t) - if message_type == b't': - s = get_sim_time() - - if initial_sitl_time < 0: - initial_sitl_time = t - initial_sim_time = s - - sitl_time = t - initial_sitl_time - sim_time = (s - initial_sim_time)*1000000 - time_to_sleep = int(sitl_time - sim_time) - - conn.sendall(struct.pack('i', time_to_sleep)) - elif message_type == b'n': - print('message type', message_type, t) - with mutex: - client_count += 1 - conn.sendall(struct.pack('i', client_count)) - -def start_server(host='127.0.0.1', port=65432): - try: - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.bind((host, port)) - s.listen() - print(f'Server listening on {host}:{port}') - def f(): - while True: - conn, addr = s.accept() - client_thread = threading.Thread(target=handle_client, args=(conn, addr)) - client_thread.start() - threading.Thread(target=f).start() - return 1 - except: - client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - client.connect((host, port)) - message = struct.pack('cQ', b'n', 0) - client.sendall(message) - drone_count = struct.unpack('i', client.recv(4))[0] - return drone_count - - -class Drone: - def __init__(self, vehicle_id, vehicle_num, init_pos, world, usd_path): - print(world) - self.vehicle_id = vehicle_id - self.vehicle_num = vehicle_num - self._usd_path = usd_path - self._init_pos = init_pos - self._world = world - self._drone_prim = None - self.scale = 1.0 - - script_dir = os.path.dirname(os.path.realpath(__file__)) + "/AscentAeroSystems" - self.sitl_tool = AscentSitlLaunchTool(script_dir, vehicle_num) - - self.sitl_tool.launch() - self.thread = None - - if world._physics_context == None: - print('starting thread') - self.thread = threading.Thread(target=start_server) - self.thread.start() - print('done starting thread') - async def init_physics(): - if world._physics_context == None: - await world.initialize_simulation_context_async() - world.add_physics_callback("update_drone_state_" + str(self.vehicle_num), self.update_state_from_mavlink) - world.play() - print('1') - asyncio.ensure_future(init_physics()) - print('2') - - print('3') - self._create_prim(vehicle_id, usd_path, init_pos) - print('4') - self.set_world_position(init_pos) - print('5') - self.last_time = time.time() - print('6') - def f(): - self._dronekit_connection = dronekit.connect(self.sitl_tool.get_dronekit_address(), wait_ready=True, timeout=999999, rate=120) - threading.Thread(target=f).start() - print('7') - - #world.add_physics_callback("update_drone_state", self.update_state_from_mavlink) - - def _create_prim(self, vehicle_id, usd_path, position=[0.0, 0.0, 0.0], orientation=None): - self.stage_path = f"/World/drone{vehicle_id}" - stage.add_reference_to_stage(usd_path=usd_path, prim_path=self.stage_path) - - self._drone_prim = self._world.scene.add( - GeometryPrim( - prim_path=self.stage_path, - name=f"drone_{vehicle_id}", - position=position, - orientation=orientation, - scale=[self.scale, self.scale, self.scale], - collision=True, - ) - ) - - def update_state_from_mavlink(self, args): - #print(self._drone_prim.GetPropertyNames()) - global current_sim_time - current_sim_time += args - - current_time = time.time() - elapsed = self.last_time - current_time - self.last_time = current_time - print(self.vehicle_id, args, elapsed) - args # is required function definition for the physics callback - - r = self._dronekit_connection._roll + np.pi / 2 - p = self._dronekit_connection._pitch - y = self._dronekit_connection._yaw - - rot = Rotation.from_euler("xyz", [r, p, y], degrees=False) - # quaternion: xyzw - q = rot.as_quat() - - o = [q[3], q[0], q[1], q[2]] - - n, e, d = ( - self._dronekit_connection.location.local_frame.east, - self._dronekit_connection.location.local_frame.north, - self._dronekit_connection.location.local_frame.down, - ) - if d is not None: - # quaternion: wxyz - p = (e, n, -d) # enu - self.set_world_pose(p, o) - else: - print("Drone location from dronekit is None") - - def get_world_pose(self): - return self._drone_prim.get_world_pose() - - def set_world_pose(self, position, orientation): - self._drone_prim.set_world_pose(position, orientation) - - def set_world_position(self, position): - _, orientation = self._drone_prim.get_world_pose() - self._drone_prim.set_world_pose(position, orientation) - - def set_orientation_z_angle(self, angle): - position, _ = self._drone_prim.get_world_pose() - o = Rotation.from_euler("XYZ", [0.0, 0.0, angle]).as_quat() - orienatation = [o[3], o[0], o[1], o[2]] - self._drone_prim.set_world_pose(position, orienatation) - -# Any class derived from `omni.ext.IExt` in top level module (defined in `python.modules` of `extension.toml`) will be -# instantiated when extension gets enabled and `on_startup(ext_id)` will be called. Later when extension gets disabled -# on_shutdown() is called. -class MyExtension(omni.ext.IExt): - # ext_id is current extension id. It can be used with extension manager to query additional information, like where - # this extension is located on filesystem. - def on_startup(self, ext_id): - """ - Called when MyExtension starts. - - Args: - ext_id : id of the extension that is - """ - print("[omni.example.spawn_prims] MyExtension startup") - - self._window = ui.Window("Spawn Primitives", width=300, height=300) - self._window.deferred_dock_in("Property", ui.DockPolicy.CURRENT_WINDOW_IS_ACTIVE) - with self._window.frame: - # VStack which will layout UI elements vertically - with ui.VStack(): - def on_click(prim_type): - """ - Creates a mesh primitive of the given type. - - Args: - prim_type : The type of primitive to - """ - # omni.kit.commands.execute will execute the given command that is passed followed by the commands arguments - omni.kit.commands.execute('CreateMeshPrimWithDefaultXform', - prim_type=prim_type, - above_ground=True) - - def spawn_ascent(): - global vehicle_num - print('ascent') - prim_path = '/World/drone_0' - usd_path = 'omniverse://nucleusserver.andrew.cmu.edu/Library/Assets/Ascent_Aerosystems/Spirit_UAV/spirit_uav_red_yellow.prop.usd' - world = World() - print(world) - drone = Drone("spirit_" + str(vehicle_num), vehicle_num, [0.0, 0.0, 0.7], world, usd_path=usd_path) - vehicle_num += 1 - ''' - prim = get_prim_at_path(prim_path) - if not prim.IsValid(): - prim = define_prim(prim_path, 'Xform') - prim.GetReferences().AddReference(usd_path) - ''' - - - - - # Button UI Elements - ui.Button("Spawn Ascent", clicked_fn=lambda: spawn_ascent()) - - def on_shutdown(self): - """ - Called when the extension is shutting down. - """ - print("[omni.example.spawn_prims] MyExtension shutdown") diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/commands_window.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/commands_window.png deleted file mode 100644 index 50a15ba2..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/commands_window.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/extensions_panel.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/extensions_panel.png deleted file mode 100644 index 6700ad4a..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/extensions_panel.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/logo.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/logo.png deleted file mode 100644 index 797f0bbd..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/logo.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial1.gif b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial1.gif deleted file mode 100644 index eacdd7f8..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial1.gif and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial10.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial10.png deleted file mode 100644 index d7c476bb..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial10.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial11.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial11.png deleted file mode 100644 index fe58cde7..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial11.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial12.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial12.png deleted file mode 100644 index 805d2968..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial12.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial13.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial13.png deleted file mode 100644 index 65c642ad..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial13.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial14.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial14.png deleted file mode 100644 index 49d0e45b..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial14.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial15.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial15.png deleted file mode 100644 index dcb5f4d7..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial15.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial16.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial16.png deleted file mode 100644 index 43c7fc73..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial16.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial2.gif b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial2.gif deleted file mode 100644 index f8029b91..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial2.gif and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial2.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial2.png deleted file mode 100644 index bcf3bcac..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial2.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial3.gif b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial3.gif deleted file mode 100644 index bd1a90bb..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial3.gif and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial3.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial3.png deleted file mode 100644 index 8beb33ef..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial3.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial4.gif b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial4.gif deleted file mode 100644 index 1af865d3..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial4.gif and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial4.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial4.png deleted file mode 100644 index 3e8d0361..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial4.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial5.gif b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial5.gif deleted file mode 100644 index 7d0db022..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial5.gif and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial5.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial5.png deleted file mode 100644 index cdae890b..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial5.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial6.gif b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial6.gif deleted file mode 100644 index b0bfefb8..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial6.gif and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial6.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial6.png deleted file mode 100644 index 65548b2a..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial6.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial7.gif b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial7.gif deleted file mode 100644 index 7ce79437..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial7.gif and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial7.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial7.png deleted file mode 100644 index 6af5c0a1..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial7.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial8.gif b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial8.gif deleted file mode 100644 index fb2c407b..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial8.gif and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial8.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial8.png deleted file mode 100644 index f2351054..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial8.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial9.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial9.png deleted file mode 100644 index ae3f6e77..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/spawnprim_tutorial9.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/step1-1.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/step1-1.png deleted file mode 100644 index bdb74d90..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/step1-1.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/step1-3.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/step1-3.png deleted file mode 100644 index 007d3b37..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/step1-3.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/step6-1.gif b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/step6-1.gif deleted file mode 100644 index f1272f35..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/step6-1.gif and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/window_extensions.png b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/window_extensions.png deleted file mode 100644 index a09bd3d7..00000000 Binary files a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/images/window_extensions.png and /dev/null differ diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/tutorial.md b/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/tutorial.md deleted file mode 100644 index be594c3c..00000000 --- a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/tutorial/tutorial.md +++ /dev/null @@ -1,632 +0,0 @@ -![](images/logo.png) - -# Make an Extension To Spawn Primitives - -In this document you learn how to create an Extension inside of your Application. Extensions are what make up Kit Applications. This tutorial is ideal for those who are beginners to Kit. - -## Learning Objectives - -- Create an Extension -- Use Kit Commands in your Application -- Make a functional Button -- Update the Extension's title and description -- Dock the Extension Window - -# Prerequisites - -- Cloned [Kit App Template](https://github.com/NVIDIA-Omniverse/kit-app-template/tree/main) -- Created a [Kit Base Editor](https://github.com/NVIDIA-Omniverse/kit-app-template/tree/main/templates/apps/kit_base_editor) - -## Step 1: Create an Extension - -Kit Applications is made up of all kinds of Extensions that were created by developers. In this section, you create an Extension and learn how the code gets reflected back in your Application. - -### Step 1.1: Open the Terminal - -In VSCode **open** a new terminal window, if one is not already open. - -![](images/step1-1.png) - -### Step 1.2: Create New Extension - -In the terminal, run the `template new` command. - -**Linux:** -```bash -./repo.sh template new -``` - -**Windows:** -```powershell -.\repo.bat template new -``` - -Follow the prompt instructions, Use the arrow keys to move and Enter to select/continue: -- **? Select with arrow keys what you want to create:** Extension -- **? Select with arrow keys your desired template:**: Python UI Extension -- **? Enter name of extension [name-spaced, lowercase, alphanumeric]:**: my.spawn_prims.ext -- **? Enter extension_display_name:**: Spawn Primitives -- **? Enter version:**: 0.1.0 - -### Step 1.3 Add the New Extension to the Application - -In VSCode, **go to** `source > apps > [YOUR KIT BASE EDITOR APP].kit`, **scroll** to the `[dependencies]` section. - -![](images/step1-3.png) - -At the bottom of the `[dependencies]` section, add the following line: - -``` json -"my.spawn_prims.ext" = {} -``` - -**Save** the `.kit` file. - - -### Step 1.3: Run a Build - -After a new extension has been added to the .kit file, the application should be rebuilt to ensure extensions are populated to the build directory. - -In the terminal, **run** the `build` command. - -**Linux:** -```bash -./repo.sh build -``` - -**Windows:** -```powershell -.\repo.bat build -``` - -### Step 1.4: Launch the Application - -In the terminal, **run** the `launch` command. - -**Linux:** -```bash -./repo.sh launch -``` -**Windows:** -```powershell -.\repo.bat launch -``` - -**? Select with arrow keys which App would you like to launch:** [Select the desired editor application] - -***NOTE:* The initial startup may take 5 to 8 minutes as shaders compile for the first time. After initial shader compilation, startup time will reduce dramatically** - -Upon launching your Application, a new window appears in your Application, called "Spawn Primitives": - -![My window](images/spawnprim_tutorial8.png) - -If you click **Add** in *Spawn Primitives*, the `empty` text changes to `count: 1`, indicating that the button was clicked. Pressing **Add** again increases the number for count. Pressing **Reset** will reset it back to `empty`: - -![Console log](images/spawnprim_tutorial1.gif) - -You use this button later to spawn a primitive. - -**DO NOT** close out of the Application. - -## Step 2: Update Your Extension's Interface - -Currently, your window is called "My Window", and there are two buttons that says, "Add" and "Reset". In this step, you make some changes to better reflect the purpose of your Extension. - -### Step 2.1: Navigate to `extension.py` - -In Visual Studio Code, navigate to `source\extensions\my.spawn_prims.ext\my\spawn_prims\ext\extension.py` to find the following source code: - -``` python -import omni.ext -import omni.ui as ui - - -# Functions and vars are available to other extension as usual in python: `example.python_ext.some_public_function(x)` -def some_public_function(x: int): - print("[my.spawn_prims.ext] some_public_function was called with x: ", x) - return x ** x - - -# Any class derived from `omni.ext.IExt` in top level module (defined in `python.modules` of `extension.toml`) will be -# instantiated when extension gets enabled and `on_startup(ext_id)` will be called. Later when extension gets disabled -# on_shutdown() is called. -class MySpawn_primsExtExtension(omni.ext.IExt): - # ext_id is current extension id. It can be used with extension manager to query additional information, like where - # this extension is located on filesystem. - def on_startup(self, ext_id): - print("[my.spawn_prims.ext] my spawn_prims ext startup") - - self._count = 0 - - self._window = ui.Window("My Window", width=300, height=300) - with self._window.frame: - with ui.VStack(): - label = ui.Label("") - - - def on_click(): - self._count += 1 - label.text = f"count: {self._count}" - - def on_reset(): - self._count = 0 - label.text = "empty" - - on_reset() - - with ui.HStack(): - ui.Button("Add", clicked_fn=on_click) - ui.Button("Reset", clicked_fn=on_reset) - - def on_shutdown(self): - print("[my.spawn_prims.ext] my spawn_prims ext shutdown") - -``` - -Next, change some values to better reflect what your Extension does. - -### Step 2.2: Update the Window Title - -Initialize `ui.Window` with the title "Spawn Primitives", instead of "My window": - -``` python -self._window = ui.Window("Spawn Primitives", width=300, height=300) -``` - -### Step 2.3: Remove the Label and Reset Functionality - -Remove the following lines and add `pass` inside `on_click()` - -``` python -def on_startup(self, ext_id): - print("[my.spawn_prims.ext] my spawn_prims ext startup") - - self._count = 0 # DELETE THIS LINE - - self._window = ui.Window("Spawn Primitives", width=300, height=300) - with self._window.frame: - with ui.VStack(): - label = ui.Label("") # DELETE THIS LINE - - - def on_click(): - pass # ADD THIS LINE - self._count += 1 # DELETE THIS LINE - label.text = f"count: {self._count}" # DELETE THIS LINE - - def on_reset(): # DELETE THIS LINE - self._count = 0 # DELETE THIS LINE - label.text = "empty" # DELETE THIS LINE - - on_reset() # DELETE THIS LINE - - with ui.HStack(): - ui.Button("Add", clicked_fn=on_click) - ui.Button("Reset", clicked_fn=on_reset) # DELETE THIS LINE -``` - -What your code should look like after removing the lines: -``` python -def on_startup(self, ext_id): - print("[my.spawn_prims.ext] my spawn_prims ext startup") - - self._window = ui.Window("Spawn Primitives", width=300, height=300) - with self._window.frame: - with ui.VStack(): - - def on_click(): - pass - - with ui.HStack(): - ui.Button("Add", clicked_fn=on_click) -``` - - -### Step 2.4: Update the Button Text - -Update the `Button` text to "Spawn Cube". - -``` python -ui.Button("Spawn Cube", clicked_fn=on_click) -``` - -### Step 2.5: Review Your Changes - -After making the above changes, your code should read as follows: - -``` python -import omni.ext -import omni.ui as ui - - -# Functions and vars are available to other extension as usual in python: `example.python_ext.some_public_function(x)` -def some_public_function(x: int): - print("[my.spawn_prims.ext] some_public_function was called with x: ", x) - return x ** x - - -# Any class derived from `omni.ext.IExt` in top level module (defined in `python.modules` of `extension.toml`) will be -# instantiated when extension gets enabled and `on_startup(ext_id)` will be called. Later when extension gets disabled -# on_shutdown() is called. -class MySpawn_primsExtExtension(omni.ext.IExt): - # ext_id is current extension id. It can be used with extension manager to query additional information, like where - # this extension is located on filesystem. - def on_startup(self, ext_id): - print("[my.spawn_prims.ext] my spawn_prims ext startup") - - self._window = ui.Window("Spawn Primitives", width=300, height=300) - with self._window.frame: - with ui.VStack(): - - def on_click(): - pass - - with ui.HStack(): - ui.Button("Spawn Cube", clicked_fn=on_click) - - def on_shutdown(self): - print("[my.spawn_prims.ext] my spawn_prims ext shutdown") - -``` - -Save the file, and return to your Application. There, you'll see your new window with a large button saying "Spawn Cube". - -![New window](images/spawnprim_tutorial11.png) - -### Step 3: Dock the Extension Window - -Kit Applications allows you to move Extensions and dock them in any location. To do so, click and drag your window to the desired location. - -![Drag your Extension](images/spawnprim_tutorial2.gif) - -## Step 4: Prepare Your Commands Window - -Commands are actions that take place inside your Application. A simple command could be creating an object or changing a color. Commands are composed of a `do` and an `undo` feature. To read more about what commands are and how to create custom commands, read our [documentation](https://docs.omniverse.nvidia.com/kit/docs/omni.kit.commands/latest/Overview.html). - -Kit Applications allows users and developers to see what commands are being executed as they work in the application. You can find this information in the *Commands* window: - -![Commands window](images/commands_window.png) - -You'll use this window to quickly build out command-based functionality. - - -### Step 4.1: Add the Commands Window to your Application - -Close your Application. - -In your `.kit` file, under the [dependencies] section, **add** the following line: - -``` json -"omni.kit.window.commands" = {} # Commands Extension Window -``` - -**Relaunch** your Application using the `launch` command. - -**Linux:** -```bash -./repo.sh launch -``` -**Windows:** -```powershell -.\repo.bat launch -``` - -> **Note:** If you don't see the *Commands* window, go to **Window > Commands** - -### Step 4.2: Move Your Commands Window - -Move the Commands window to get a better view, or dock it somewhere convenient: - -![Move the Commands window](images/spawnprim_tutorial8.gif) - -### Step 4.3: Clear Old Commands - -Select the **Clear History** button in the *Commands* window. This makes it easier to see what action takes place when you try to create a cube: - -![spawnprim_tut_png12](images/spawnprim_tutorial12.png) - -### Step 5: Getting the Command Code - -Now that you have the necessary tools, you learn how you can grab one of these commands and use it in the extension. Specifically, you use it create a cube. There are different ways you can create the cube, but for this example, you use **Create** menu in the top bar. - -### Step 5.1: Create a Cube - -Click **Create > Mesh > Cube** from the top bar: - -![Create a cube](images/spawnprim_tutorial3.gif) - -If the *Create Menu* is not avaliable, go to *Stage Window* and **Right Click > Create > Mesh > Cube** - -![](images/step6-1.gif) - -In the *Viewport*, you'll see your new cube. In the *Commands Window*, you'll see a new command. - -> **Note:** If you cannot see the Cube try adding a light to the stage. **Create > Light > Distant Light** - -### Step 5.2: Copy the Create Mesh Command - -Select the new line **CreateMeshPrimWithDefaultXform** in the Command Window, then click **Selected Commands** to copy the command to the clipboard: - -![spawnprim_tut_png13](images/spawnprim_tutorial13.png) - -### Step 5.3: Use the Command in Your Extension - -Paste the copied command into `on_click()`. The whole file looks like this: - -``` python -import omni.ext -import omni.ui as ui - -# Functions and vars are available to other extension as usual in python: `example.python_ext.some_public_function(x)` -def some_public_function(x: int): - print("[my.spawn_prims.ext] some_public_function was called with x: ", x) - return x ** x - -# Any class derived from `omni.ext.IExt` in top level module (defined in `python.modules` of `extension.toml`) will be -# instantiated when extension gets enabled and `on_startup(ext_id)` will be called. Later when extension gets disabled -# on_shutdown() is called. -class MySpawn_primsExtExtension(omni.ext.IExt): - # ext_id is current extension id. It can be used with extension manager to query additional information, like where - # this extension is located on filesystem. - def on_startup(self, ext_id): - print("[my.spawn_prims.ext] my spawn_prims ext startup") - - self._window = ui.Window("Spawn Primitives", width=300, height=300) - with self._window.frame: - with ui.VStack(): - - def on_click(): - import omni.kit.commands - - omni.kit.commands.execute('CreateMeshPrimWithDefaultXform', - prim_type='Cube', - above_ground=True) - - - with ui.HStack(): - ui.Button("Spawn Cube", clicked_fn=on_click) - - def on_shutdown(self): - print("[my.spawn_prims.ext] my spawn_prims ext shutdown") - -``` - -You added a new import and a command that creates a cube. - -### Step 5.4: Group Your Imports - -Move the import statement to the top of the module with the other imports: - -```python -import omni.ext -import omni.ui as ui -import omni.kit.commands -``` - -### Step 5.5: Relocate Create Command - -Place `omni.kit.commands.execute()` inside the `on_click()` definition and remove `pass`. - -``` python -def on_click(): - omni.kit.commands.execute('CreateMeshPrimWithDefaultXform', - prim_type='Cube', - above_ground=True) -``` - -### Step 5.6: Review and Save - -Ensure your code matches ours: - -``` python -import omni.ext -import omni.ui as ui -import omni.kit.commands - - -# Functions and vars are available to other extension as usual in python: `example.python_ext.some_public_function(x)` -def some_public_function(x: int): - print("[my.spawn_prims.ext] some_public_function was called with x: ", x) - return x ** x - - -# Any class derived from `omni.ext.IExt` in top level module (defined in `python.modules` of `extension.toml`) will be -# instantiated when extension gets enabled and `on_startup(ext_id)` will be called. Later when extension gets disabled -# on_shutdown() is called. -class MySpawn_primsExtExtension(omni.ext.IExt): - # ext_id is current extension id. It can be used with extension manager to query additional information, like where - # this extension is located on filesystem. - def on_startup(self, ext_id): - print("[my.spawn_prims.ext] my spawn_prims ext startup") - - self._window = ui.Window("Spawn Primitives", width=300, height=300) - with self._window.frame: - with ui.VStack(): - - def on_click(): - omni.kit.commands.execute('CreateMeshPrimWithDefaultXform', - prim_type='Cube', - above_ground=True) - - with ui.HStack(): - ui.Button("Spawn Cube", clicked_fn=on_click) - - def on_shutdown(self): - print("[my.spawn_prims.ext] my spawn_prims ext shutdown") -``` - -Save your code, and switch back to your Application. - -### Step 6: Test Your Work - -In your Application, test your extension by clicking **Spawn Cube**. You should see that a new Cube prim is created with each button press. - -![Spawn Cube](images/spawnprim_tutorial4.gif) - -Excellent, you now know how to spawn a cube using a function. What's more, you didn't have to reference anything as your Application was kind enough to deliver everything you needed. - -Continuing on and via same methods, construct a second button that spawns a cone in the same interface. - -## Step 7: Spawn a Cone - -In this step, you create a new button that spawns a cone. -### Step 7.1: Add a Button - -Create a new button below the spawn cube button to spawn a cone: - -```python -def on_startup(self, ext_id): - print("[omni.example.spawn_prims] MyExtension startup") - - self._window = ui.Window("Spawn Primitives", width=300, height=300) - with self._window.frame: - with ui.VStack(): - - def on_click(): - omni.kit.commands.execute('CreateMeshPrimWithDefaultXform', - prim_type='Cube', - above_ground=True) - - ui.Button("Spawn Cube", clicked_fn=on_click) - ui.Button("Spawn Cone", clicked_fn=on_click) -``` - -### Step 7.2: Save and Review - -Save the file, switch back to your Application, and test your new button: - -![Incorrect mesh](images/spawnprim_tutorial5.gif) - -Notice that both buttons use the same function and, therefore, both spawn a `Cube`, despite their labels. - -### Step 7.3: Create a Cone from the Menu - -Using the same *Create* menu in your Application, create a Cone (**Create > Mesh > Cone**). - -### Step 7.4: Copy the Commands to your Extension - -Copy the command in the *Commands* tab with the **Selected Commands** button. - -### Step 7.5: Implement Your New Button - -Paste the command into `extensions.py` like you did before: - -![Review new button](images/spawnprim_tutorial6.gif) - - -``` python -def on_click(): - #Create a Cube - omni.kit.commands.execute('CreateMeshPrimWithDefaultXform', - prim_type='Cube', - above_ground=True) - - #Create a Cone - omni.kit.commands.execute('CreateMeshPrimWithDefaultXform', - prim_type='Cone', - above_ground=True) -``` - -Notice the command is the same, and only the `prim_type` is different: - -- To spawn a cube, you pass `'Cube'` -- To spawn a cone, you pass `'Cone'` - -### Step 7.6: Accept a Prim Type in `on_click()` - -Add a `prim_type` argument to `on_click()`: - -``` python -def on_click(prim_type): -``` - -With this value, you can delete the second `omni.kit.commands.execute()` call. Next, you'll use `prim_type` to determine what shape to create. - -### Step 7.7: Use the Prim Type in `on_click()` - -Replace `prim_type='Cube'` with `prim_type=prim_type`: - -``` python -omni.kit.commands.execute('CreateMeshPrimWithDefaultXform', - prim_type=prim_type, - above_ground=True) -``` - -`on_click()` should now look like this: - -``` python -def on_click(prim_type): - omni.kit.commands.execute('CreateMeshPrimWithDefaultXform', - prim_type=prim_type, - above_ground=True) -``` - -### Step 7.8: Pass the Prim Type to `on_click()` - -Update the `clicked_fn` for both UI Buttons to pass the `prim_type`: - -``` python -ui.Button("Spawn Cube", clicked_fn=on_click("Cube")) -ui.Button("Spawn Cone", clicked_fn=on_click("Cone")) -``` - -### Step 7.9: Save and Test - -Save the file, and test the updates to your *Spawn Primitives* Extension: - -![Correct spawn](images/spawnprim_tutorial7.gif) - -## Step 8: Conclusion - -Great job! You've successfully created a second button that spawns a second mesh, all within the same Extension. This, of course, can be expanded upon. - -> **Optional Challenge:** Add a button for every mesh type on your own. -> -> ![All the buttons](images/spawnprim_tutorial15.png) -> -> Below you can find a completed "cheat sheet" if you need help or just want to copy it for your own use. -> ->
-> Click to show the final code -> -> ``` -> import omni.ext -> import omni.ui as ui -> import omni.kit.commands -> -> # Functions and vars are available to other extension as usual in python: `example.python_ext some_public_function(x)` -> def some_public_function(x: int): -> print("[my.spawn_prims.ext] some_public_function was called with x: ", x) -> return x ** x -> -> # Any class derived from `omni.ext.IExt` in top level module (defined in `python.modules` of `extension.toml`) will be -> # instantiated when extension gets enabled and `on_startup(ext_id)` will be called. Later when extension gets disabled -> # on_shutdown() is called. -> class MyExtension(omni.ext.IExt): -> # ext_id is current extension id. It can be used with extension manager to query additional information, like where -> # this extension is located on filesystem. -> def on_startup(self, ext_id): -> print("[omni.example.spawn_prims] MyExtension startup") -> -> self._window = ui.Window("Spawn Primitives", width=300, height=300) -> with self._window.frame: -> with ui.VStack(): -> -> def on_click(prim_type): -> omni.kit.commands.execute('CreateMeshPrimWithDefaultXform', -> prim_type=prim_type, -> above_ground=True) -> -> ui.Button("Spawn Cube", clicked_fn=on_click("Cube")) -> ui.Button("Spawn Cone", clicked_fn=on_click("Cone")) -> ui.Button("Spawn Cylinder", clicked_fn=on_click("Cylinder")) -> ui.Button("Spawn Disk", clicked_fn=on_click("Disk")) -> ui.Button("Spawn Plane", clicked_fn=on_click("Plane")) -> ui.Button("Spawn Sphere", clicked_fn=on_click("Sphere")) -> ui.Button("Spawn Torus", clicked_fn=on_click("Torus")) -> -> def on_shutdown(self): -> print("[omni.example.spawn_prims] MyExtension shutdown") -> ``` -> ->
\ No newline at end of file diff --git a/docker/extras/one_drone_world.usd b/docker/extras/one_drone_world.usd deleted file mode 100644 index 9c0305fe..00000000 Binary files a/docker/extras/one_drone_world.usd and /dev/null differ diff --git a/docker/extras/spirit_drone.usd b/docker/extras/spirit_drone.usd deleted file mode 100644 index 0eb1b62a..00000000 Binary files a/docker/extras/spirit_drone.usd and /dev/null differ diff --git a/docker/extras/two_drone_world.usd b/docker/extras/two_drone_world.usd deleted file mode 100644 index 3ed2b078..00000000 Binary files a/docker/extras/two_drone_world.usd and /dev/null differ diff --git a/docker/.bashrc b/docker/ground_control_station/.bashrc similarity index 81% rename from docker/.bashrc rename to docker/ground_control_station/.bashrc index 0b4b55bb..adb1e9e1 100644 --- a/docker/.bashrc +++ b/docker/ground_control_station/.bashrc @@ -1,3 +1,4 @@ +# ========== BASHRC FOR ROBOT DOCKER CONTAINER ========== # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples @@ -50,9 +51,9 @@ if [ -n "$force_color_prompt" ]; then fi if [ "$color_prompt" = yes ]; then - PS1='[DOCKER]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' + PS1='[GCS]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' else - PS1='[DOCKER]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' + PS1='[GCS]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' fi unset color_prompt force_color_prompt @@ -87,6 +88,9 @@ alias l='ls -CF' # ~/.bash_aliases, instead of adding them here directly. # See /usr/share/doc/bash-doc/examples in the bash-doc package. +alias emacs='emacs -nw' +alias sis='source install/setup.bash' + if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi @@ -97,22 +101,23 @@ fi #if [ -f /etc/bash_completion ] && ! shopt -oq posix; then # . /etc/bash_completion #fi -alias runapp=/isaac-sim/runapp.sh -alias runheadless.native=/isaac-sim/runheadless.native.sh -alias runheadless.webrtc=/isaac-sim/runheadless.webrtc.sh -source /opt/ros/humble/setup.bash +# --- ROS2 workspace setup --- + +# needed for communication with Isaac Sim ROS2 # https://docs.omniverse.nvidia.com/isaacsim/latest/installation/install_ros.html#enabling-the-ros-bridge-extension export FASTRTPS_DEFAULT_PROFILES_FILE="/root/AirStack/ros_ws/fastdds.xml" -export ISAACSIM_PATH=/isaac-sim -alias ISAACSIM_PYTHON="${ISAACSIM_PATH}/python.sh" -alias ISAACSIM="${ISAACSIM_PATH}/isaac-sim.sh" - -alias emacs='emacs -nw' -alias sis='source install/setup.bash' # Define the ROS2 workspace directory ROS2_WS_DIR="$HOME/AirStack/ros_ws" +# for local development, prevent conflict with other desktops +export ROS_LOCALHOST_ONLY=1 + +# fix ROS2 humble setuptools deprecation warning https://robotics.stackexchange.com/questions/24230/setuptoolsdeprecationwarning-in-ros2-humble/24349#24349 +PYTHONWARNINGS="ignore:easy_install command is deprecated,ignore:setup.py install is deprecated" +export PYTHONWARNINGS + +# Convenience functions for ROS2 workspace function bws(){ echo "Running \`colcon build\` in $ROS2_WS_DIR" @@ -124,7 +129,7 @@ function sws(){ } # Function to prompt user for confirmation -confirm() { +confirm_cws() { while true; do read -p "Are you sure you want to clean the ROS2 workspace under $ROS2_WS_DIR? (y/N): " yn yn=${yn:-no} # Default to 'no' if no answer is given @@ -137,10 +142,12 @@ confirm() { } function cws(){ # Call the confirmation function - if confirm; then + if confirm_sws; then echo "Cleaning ROS2 workspace..." set -x rm -rf "$ROS2_WS_DIR"/build/ "$ROS2_WS_DIR"/install/ "$ROS2_WS_DIR"/log/ + export AMENT_PREFIX_PATH="/opt/ros/humble" + export CMAKE_PREFIX_PATH="" { set +x; } 2>/dev/null # set +x w/out it being printed echo "ROS2 workspace has been cleaned." else @@ -148,4 +155,5 @@ function cws(){ fi } -sws +source /opt/ros/humble/setup.bash +sws # source the ROS2 workspace by default diff --git a/docker/isaac-sim/.bashrc b/docker/isaac-sim/.bashrc new file mode 100644 index 00000000..2fb9c751 --- /dev/null +++ b/docker/isaac-sim/.bashrc @@ -0,0 +1,121 @@ +# ========== BASHRC FOR ISAAC SIM DOCKER CONTAINER ========== +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + +# don't put duplicate lines in the history. See bash(1) for more options +# ... or force ignoredups and ignorespace +HISTCONTROL=ignoredups:ignorespace + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# make less more friendly for non-text input files, see lesspipe(1) +[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='[DOCKER Isaac]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='[DOCKER Isaac]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' +fi +unset color_prompt force_color_prompt + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' +fi + +# some more ls aliases +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +alias emacs='emacs -nw' +alias sis='source install/setup.bash' + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then +# . /etc/bash_completion +#fi + +# --- ROS2 setup --- +source /opt/ros/humble/setup.bash +source /humble_ws/install/setup.bash # isaacsim ros2 package +# needed for communication with Isaac Sim ROS2 # https://docs.omniverse.nvidia.com/isaacsim/latest/installation/install_ros.html#enabling-the-ros-bridge-extension +export FASTRTPS_DEFAULT_PROFILES_FILE="/isaac-sim/fastdds.xml" +export RMW_IMPLEMENTATION=rmw_fastrtps_cpp +# for local development, prevent conflict with other desktops +export ROS_LOCALHOST_ONLY=1 + +# --- Isaac Setup --- +alias runapp="/isaac-sim/runapp.sh --path omniverse://airlab-storage.andrew.cmu.edu:8443/Library/Assets/Ascent_Aerosystems/Spirit_UAV/spirit_uav_red_yellow.prop.usd" +alias runheadless.native=/isaac-sim/runheadless.native.sh +alias runheadless.webrtc=/isaac-sim/runheadless.webrtc.sh + +export ISAACSIM_PATH=/isaac-sim +alias ISAACSIM_PYTHON="${ISAACSIM_PATH}/python.sh" + diff --git a/simulation/AscentAeroSystems/.gitignore b/docker/isaac-sim/.gitignore similarity index 67% rename from simulation/AscentAeroSystems/.gitignore rename to docker/isaac-sim/.gitignore index dec1f7e4..104f905f 100644 --- a/simulation/AscentAeroSystems/.gitignore +++ b/docker/isaac-sim/.gitignore @@ -1 +1,2 @@ +omni_pass.env AscentAeroSystemsSITLPackage/ \ No newline at end of file diff --git a/docker/isaac-sim/Dockerfile b/docker/isaac-sim/Dockerfile new file mode 100644 index 00000000..8a6a733e --- /dev/null +++ b/docker/isaac-sim/Dockerfile @@ -0,0 +1,73 @@ +# expects context to be the root of the repository, i.e. AirStack/. this is so we can access AirStack/ros_ws/ +FROM nvcr.io/nvidia/isaac-sim:4.1.0 + +WORKDIR /isaac-sim + +# setup timezone +RUN echo 'Etc/UTC' > /etc/timezone && \ + ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime && \ + apt-get update && \ + apt-get install -q -y --no-install-recommends tzdata && \ + rm -rf /var/lib/apt/lists/* + +# install packages +RUN apt-get update && apt-get install -q -y --no-install-recommends \ + dirmngr \ + gnupg2 \ + unzip \ + && rm -rf /var/lib/apt/lists/* + +# setup keys +RUN set -eux; \ + key='C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654'; \ + export GNUPGHOME="$(mktemp -d)"; \ + gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \ + mkdir -p /usr/share/keyrings; \ + gpg --batch --export "$key" > /usr/share/keyrings/ros2-latest-archive-keyring.gpg; \ + gpgconf --kill all; \ + rm -rf "$GNUPGHOME" + +# setup sources.list +RUN echo "deb [ signed-by=/usr/share/keyrings/ros2-latest-archive-keyring.gpg ] http://packages.ros.org/ros2/ubuntu jammy main" > /etc/apt/sources.list.d/ros2-latest.list + +# setup environment +ENV LANG=C.UTF-8 +ENV LC_ALL=C.UTF-8 +ENV ROS_DISTRO=humble + +# Install ROS2 packages +RUN apt update && apt install -y --no-install-recommends curl emacs vim nano tmux gdb xterm \ + cmake \ + git \ + ros-humble-desktop \ + ros-dev-tools \ + python3-pip \ + python3-rosdep \ + ros-humble-tf2* \ + ros-humble-mavros + +RUN /opt/ros/humble/lib/mavros/install_geographiclib_datasets.sh + +RUN /isaac-sim/python.sh -m pip install git+https://github.com/dronekit/dronekit-python#egg=dronekit +RUN pip install PyYAML mavproxy tmuxp scipy + +# Install Isaac Sim ROS2 workspace so that we can run the isaacsim ROS package +RUN cd /tmp/ && \ + curl -L -O https://github.com/isaac-sim/IsaacSim-ros_workspaces/archive/main.zip && \ + unzip main.zip && \ + mv IsaacSim-ros_workspaces-main/humble_ws /humble_ws && \ + cd /humble_ws && \ + . /opt/ros/humble/setup.sh && \ + colcon build --symlink-install && \ + rm -rf /tmp/IsaacSim-ros_workspaces-main + +# copy over the AscentAeroSystemsSITLPackage +COPY docker/isaac-sim/AscentAeroSystemsSITLPackage /AscentAeroSystemsSITLPackage + +COPY ros_ws/fastdds.xml /isaac-sim/fastdds.xml + +# Cleanup. Prevent people accidentally doing git commits as root in Docker +RUN apt purge -y git && apt autoremove -y \ + && apt clean -y \ + && rm -rf /var/lib/apt/lists/* + diff --git a/docker/isaac-sim/omni_pass_TEMPLATE.env b/docker/isaac-sim/omni_pass_TEMPLATE.env new file mode 100644 index 00000000..13c990a1 --- /dev/null +++ b/docker/isaac-sim/omni_pass_TEMPLATE.env @@ -0,0 +1,29 @@ +######################################################################### +## Custom settings for the Isaac-Sim container +######################################################################### + +# Copy this file and rename it to omni_pass.env to paste in your info. + +######################################################################### +## Nucleus Login information +# This can either be your username and password or the nucleus login token +# The login token method is preferred. You can get the token by going to +# the nucleus server website. For us +# https://airlab-storage.andrew.cmu.edu:8443/omni/web3/ +# logging in. +# Then right clicking on the cloud and click the "API Tokens" window +# to generate an API token and copy it to "OMNI_PASS" + +######################################################################### + +# api token method +OMNI_USER='$omni-api-token' # don't touch this line +OMNI_PASS=PASTE-YOUR-API-TOKEN + + +# username password method +#OMNI_USER= +#OMNI_PASS= + +######################################################################### + diff --git a/docker/robot/.bashrc b/docker/robot/.bashrc new file mode 100644 index 00000000..3cd80547 --- /dev/null +++ b/docker/robot/.bashrc @@ -0,0 +1,166 @@ +# ========== BASHRC FOR ROBOT DOCKER CONTAINER ========== +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + +# don't put duplicate lines in the history. See bash(1) for more options +# ... or force ignoredups and ignorespace +HISTCONTROL=ignoredups:ignorespace + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# make less more friendly for non-text input files, see lesspipe(1) +[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='[$ROBOT_NAME]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='[$ROBOT_NAME]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' +fi +unset color_prompt force_color_prompt + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' +fi + +# some more ls aliases +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +alias emacs='emacs -nw' +alias sis='source install/setup.bash' + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then +# . /etc/bash_completion +#fi + +# --- ROS2 workspace setup --- + +# needed for communication with Isaac Sim ROS2 # https://docs.omniverse.nvidia.com/isaacsim/latest/installation/install_ros.html#enabling-the-ros-bridge-extension +export FASTRTPS_DEFAULT_PROFILES_FILE="/root/AirStack/ros_ws/fastdds.xml" + + +# Define the ROS2 workspace directory +ROS2_WS_DIR="$HOME/AirStack/ros_ws" +# for local development, prevent conflict with other desktops +export ROS_LOCALHOST_ONLY=1 + +# fix ROS2 humble setuptools deprecation warning https://robotics.stackexchange.com/questions/24230/setuptoolsdeprecationwarning-in-ros2-humble/24349#24349 +PYTHONWARNINGS="ignore:easy_install command is deprecated,ignore:setup.py install is deprecated" +export PYTHONWARNINGS + +# Convenience functions for ROS2 workspace + +function bws(){ + echo "Running \`colcon build\` in $ROS2_WS_DIR" + COLCON_LOG_PATH="$ROS2_WS_DIR"/log colcon build --symlink-install --base-paths "$ROS2_WS_DIR"/ --build-base "$ROS2_WS_DIR"/build/ --install-base "$ROS2_WS_DIR"/install/ "$@" +} +function sws(){ + echo "Sourcing "$ROS2_WS_DIR"/install/local_setup.bash" + source "$ROS2_WS_DIR"/install/local_setup.bash +} + +# Function to prompt user for confirmation +confirm_cws() { + while true; do + read -p "Are you sure you want to clean the ROS2 workspace under $ROS2_WS_DIR? (y/N): " yn + yn=${yn:-no} # Default to 'no' if no answer is given + case $yn in + [Yy] | [Yy][Ee][Ss] ) return 0;; + [Nn] | [Nn][Oo] ) return 1;; + * ) echo "Please answer yes or no.";; + esac + done +} +function cws(){ + # Call the confirmation function + if confirm_cws; then + echo "Cleaning ROS2 workspace..." + set -x + rm -rf "$ROS2_WS_DIR"/build/ "$ROS2_WS_DIR"/install/ "$ROS2_WS_DIR"/log/ + export AMENT_PREFIX_PATH="/opt/ros/humble" + export CMAKE_PREFIX_PATH="" + { set +x; } 2>/dev/null # set +x w/out it being printed + echo "ROS2 workspace has been cleaned." + else + echo "Operation cancelled." + fi +} + +source /opt/ros/humble/setup.bash +sws # source the ROS2 workspace by default + +container_name=$(curl -s --unix-socket /var/run/docker.sock http://localhost/containers/$HOSTNAME/json | jq -r .Name) + +export ROBOT_NAME=$(echo "$container_name" | sed 's#/docker-##' | sed 's#-#_#') +export ROS_DOMAIN_ID=$(echo "$ROBOT_NAME" | awk -F'_' '{print $NF}') + +export RCUTILS_COLORIZED_OUTPUT=1 # get colored output from ROS2 tools \ No newline at end of file diff --git a/docker/custom_rosdep.yaml b/docker/robot/custom_rosdep.yaml similarity index 100% rename from docker/custom_rosdep.yaml rename to docker/robot/custom_rosdep.yaml diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/eeprom.bin b/docs/.README.md.swp similarity index 62% rename from simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/eeprom.bin rename to docs/.README.md.swp index 16bd8f46..1a5f3165 100644 Binary files a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/eeprom.bin and b/docs/.README.md.swp differ diff --git a/docs/README.md b/docs/README.md index 8080e384..9bad2f32 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,41 @@ -# AirStack +# AirStack Boilerplate -Welcome to the AirLab Autonomy Stack! +Welcome to the AirStack Boilerplate! This repository template serves to kickstart the development of your own robotics autonomy stack. You're encouraged to customize your version in any way to best suit your project's needs. -It is maintained by the [AirLab](https://theairlab.org) at Carnegie Mellon University's Robotics Institute. +This boilerplate is maintained by the [AirLab](https://theairlab.org) at Carnegie Mellon University's Robotics Institute. -Please head to our [Getting Started](https://docs.theairlab.org/user_guide/getting_started/) page to start. \ No newline at end of file +Please head to our [Getting Started](getting_started.md) page to start. + + + + +![Overview](overview.png) +*AirStack* + + +
+ + +![version](https://img.shields.io/github/v/release/castacks/AirStack) +![Github contributors](https://img.shields.io/github/contributors/castacks/AirStack) + +![Build Status](https://github.com/castacks/AirStack/actions/workflows/ci.yaml/badge.svg) +![Last Commit](https://img.shields.io/github/last-commit/castacks/AirStack) + +![Github issues](https://img.shields.io/github/issues/castacks/AirStack) +![Github pull requests](https://img.shields.io/github/issues-pr/castacks/AirStack) + +![Downloads](https://img.shields.io/github/downloads/castacks/AirStack/total) + +![Github forks](https://img.shields.io/github/forks/castacks/AirStack?style=social) + +![Github stars](https://img.shields.io/github/stars/castacks/AirStack) + +![Github watchers](https://img.shields.io/github/watchers/castacks/AirStack?style=social) + + + + + + \ No newline at end of file diff --git a/docs/about.md b/docs/about.md index 287c6a2c..414cd30b 100644 --- a/docs/about.md +++ b/docs/about.md @@ -1,4 +1,6 @@ # About -This stack is built by the AirLab at Carnegie Mellon University's Robotics Institute. Our main site is [https://theairlab.org](https://theairlab.org). -The stack is maintained by Andrew Jong and John Keller. \ No newline at end of file +This stack is built and maintained by the [AirLab](https://theairlab.org) at Carnegie Mellon University's Robotics Institute. + +# License +Not sure yet but probably Apache 2.0 or MIT for the open source parts. \ No newline at end of file diff --git a/docs/developer_guide/autonomy/controls.md b/docs/developer_guide/autonomy/controls.md deleted file mode 100644 index 82a3d9e4..00000000 --- a/docs/developer_guide/autonomy/controls.md +++ /dev/null @@ -1,77 +0,0 @@ -# Controls - -Code located in `AirStack/ros_ws/src/robot/autonomy/controls/`. - -## Launch - -Launch files are under `src/robot/autonomy/controls/controls_bringup/launch`. - -Can be launched with `ros2 launch controls_bringup launch_controls.yaml` - - -## RobotInterface - -Package `robot_interface` is a ROS2 node that interfaces with the robot's hardware. -The `RobotInterface` _gets robot state_ and forwards it to the autonomy stack, -and also _translates control commands_ from the autonomy stack into the command for the underlying hardware. -Note the base class is unimplemented. -Specific implementations should extend `class RobotInterface` in `robot_interface.hpp`, for example MAVROSInterface. - -### State -The `RobotInterface` broadcasts the robot's pose as a TF2 transform. -It also publishes the robot's odometry as a `nav_msgs/Odometry` message to `$(arg robot_name)/controls/robot_interface/odometry`. - -### Commands -The commands are variations of the two main command modes: Attitude control and Position control. -These are reflected in [MAVLink](https://mavlink.io/en/messages/common.html#SET_POSITION_TARGET_LOCAL_NED) and supported by both PX4 and [Ardupilot](https://ardupilot.org/dev/docs/copter-commands-in-guided-mode.html#movement-commands). - -The RobotInterface node subscribes to: - -- `$(arg robot_name)/controls/robot_interface/cmd_attitude_thrust` of type `mav_msgs/AttitudeThrust.msg` -- `$(arg robot_name)/controls/robot_interface/cmd_rate_thrust` of type `mav_msgs/RateThrust.msg` -- `$(arg robot_name)/controls/robot_interface/cmd_roll_pitch_yawrate_thrust` of type `mav_msgs/RollPitchYawrateThrust.msg` -- `$(arg robot_name)/controls/robot_interface/cmd_torque_thrust` of type `mav_msgs/TorqueThrust.msg` -- `$(arg robot_name)/controls/robot_interface/cmd_velocity` of type `geometry_msgs/TwistStamped.msg` -- `$(arg robot_name)/controls/robot_interface/cmd_position` of type `geometry_msgs/PoseStamped.msg` - -All messages are in the robot's body frame, except `velocity` and `position` which use the frame specified by the message header. - - -## Custom Robot Interface -Implementations should do the following: - -### Broadcast State -Implementations of `RobotInterface` should obtain the robot's pose and broadcast it as a TF2 transform. - -Should look something like: -```c++ -// callback function triggered by some loop -void your_callback_function(){ - // ... - geometry_msgs::msg::TransformStamped t; - // populate the transform, e.g.: - t.header = // some header - t.transform.translation.x = // some value - t.transform.translation.y = // some value - t.transform.translation.z = // some value - t.transform.rotation = // some quaternion - // Send the transformation - this->tf_broadcaster_->sendTransform(t); - // ... -} -``` - -### Override Command Handling -Should override all `virtual` functions in `robot_interface.hpp`: - -- `cmd_attitude_thrust_callback` -- `cmd_rate_thrust_callback` -- `cmd_roll_pitch_yawrate_thrust_callback` -- `cmd_torque_thrust_callback` -- `cmd_velocity_callback` -- `cmd_position_callback` -- `request_control` -- `arm` -- `disarm` -- `is_armed` -- `has_control` diff --git a/docs/developer_guide/autonomy/global_planning.md b/docs/developer_guide/autonomy/global_planning.md deleted file mode 100644 index 6e6c39fa..00000000 --- a/docs/developer_guide/autonomy/global_planning.md +++ /dev/null @@ -1,49 +0,0 @@ - - -Global planners output a high level, coarse trajectory for the robot to follow. - -A trajectory is a spatial path plus a schedule. -This means each waypoint in the trajectory has a time associated with it, indicating when the robot should reach that waypoint. -These timestamps are fed to the local planner to determine speed and acceleration. - -If a waypoint's header timestamp is empty, the local planner should assume there's no time constraint and follow the trajectory at its own pace. - -The global planner should make a trajectory that is collision-free according to the global map. -However, avoiding fine obstacles is delegated to the local planner that operates at a faster rate. - -## ROS Interfaces - -### Actions Interface -The global planner should provide an action server for the topic `$(arg robot_name)/global_planner/plan` of message type `nav_msgs/GetPlan`. - -``` -``` - -### Subscribers -In general, the global planner needs access to components of the world model. - -The most common one is the Occupancy Grids, which are published by the `map_server` node. - -### Publishers - -The global planner must publish a trajectory to the topic `$(arg robot_name)/global_planner/trajectory` of message type `nav_msgs/Path`. - -The header of the `nav_msgs/Path` message should contain the coordinate frame of the trajectory, and the timestamp should indicate when the trajectory was generated. -Each waypoint's header should contain the coordinate frame of the waypoint, and the timestamp should indicate when the waypoint should be reached. - -``` -nav_msgs/Path.msg - - std_msgs/Header header - - time stamp: when the trajectory was generated - - frame_id: the coordinate frame of the trajectory - - geometry_msgs/PoseStamped[] poses: the trajectory - - geometry_msgs/PoseStamped pose - - std_msgs/Header header - - time stamp: when the waypoint should be reached - - string frame_id: the coordinate frame of the waypoint - - geometry_msgs/Pose pose: the position and orientation of the waypoint -``` - - - -The global planner can do whatever it wants internally. \ No newline at end of file diff --git a/docs/developer_guide/simulation.md b/docs/developer_guide/simulation.md deleted file mode 100644 index 3668dcdf..00000000 --- a/docs/developer_guide/simulation.md +++ /dev/null @@ -1,13 +0,0 @@ -# Simulation - -Code located in `AirStack/simulation/` - -## Types of Simulation - -### Simulation Engine - -For graphics and dynamics - -### Software/Hardware in the Loop - -For drone dynamics diff --git a/docs/developer_guide/contributing.md b/docs/development/contributing.md similarity index 64% rename from docs/developer_guide/contributing.md rename to docs/development/contributing.md index e32bf5c1..421d50d4 100644 --- a/docs/developer_guide/contributing.md +++ b/docs/development/contributing.md @@ -11,12 +11,10 @@ If you need to add a dependency that's not in the docker image, please add a sec ## Documentation Please make sure to document your work. -Docs are under `AirStack/docs/` +Docs are under `AirStack/docs/`. The navigation tree is under `AirStack/mkdocs.yml`. -This documentation is built with Material MKDocs - -For full documentation visit [mkdocs.org](https://www.mkdocs.org). -and [mkdocs-material](https://squidfunk.github.io/mkdocs-material/) +This documentation is built with Material MKDocs. +Visit [mkdocs.org](https://www.mkdocs.org) and [mkdocs-material](https://squidfunk.github.io/mkdocs-material/) to learn how to use it. ### Commands @@ -24,6 +22,7 @@ and [mkdocs-material](https://squidfunk.github.io/mkdocs-material/) pip install mkdocs-material mkdocs serve ``` +Launches docs on https://localhost:8000. - `mkdocs -h` - Print help message and exit. @@ -37,3 +36,7 @@ mkdocs serve ## Merge Submit a pull request. + +All tests must pass before merging. + +Regression tests are run so that we don't break anything. \ No newline at end of file diff --git a/docs/development/docker_usage.md b/docs/development/docker_usage.md new file mode 100644 index 00000000..36483b75 --- /dev/null +++ b/docs/development/docker_usage.md @@ -0,0 +1,99 @@ + +AirStack is designed for multi-robot development, and is setup to run multiple robots in simulation. + +To mimic interacting with real world robots, we use Docker Compose to manage Docker containers that isolate the simulation, each robot, and the ground control station. + + +The details of the docker compose setup is in `AirStack/docker/docker-compose.yaml`. + +In essence, the compose file launches: + +- Isaac Sim +- ground control station +- robots + +all get created on the same default Docker bridge network. +This lets them communicate with ROS2 on the same network. + + +Each robot has its own ROS_DOMAIN_ID. + +## Start and Stop +Start +```bash +docker compose up -d --scale robot=[NUM_ROBOTS] + +# see running containers +docker ps -a +``` + +Stop +```bash +docker compose down +``` + + +## SSH into Robots +The containers mimic the robots' onboard computers on the same network. Therefore we intend to interface with the robots through ssh. + +The `ground-control-station` and `docker-robot-*` containers are setup with ssh daemon, so you can ssh into the containers using the IP address. + +You can get the IP address of each container by running the following command: + +```bash +docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [CONTAINER-NAME] +``` +Then ssh in, for example: +```bash +ssh root@172.18.0.6 +``` + +The ssh password is `airstack`. + + +## Container Details + + +### Isaac Sim +Start a bash shell in the Isaac Sim container: +```bash +docker exec -it isaac-sim bash +``` + + +`runapp` launches Isaac Sim. +The `--path` argument can be passed with a path to a `.usd` file to load a scene. + +It can also be run in headless mode with `./runheadless.native.sh` to stream to Omniverse Streaming Client or `./runheadless.webrtc.sh` to stream to a web browser. + +The container also has the isaacsim ROS2 package within that can be launched with `ros2 launch isaacsim run_isaacsim.launch.py`. + +### Robot +Start a bash shell in a robot container, e.g. for robot_1: +```bash +docker exec -it docker-robot-1 bash +``` + +```bash +# in robot docker +cws # cleans workspace +bws # builds workspace +sws # sources workspace +ros2 launch robot_bringup robot.launch.xml # top-level launch +``` + +These aliases are in the `~/.bashrc` file. + +Each robot has `ROS_DOMAIN_ID` set to its ID number. `ROBOT_NAME` is set to `robot_$ROS_DOMAIN_ID`. + +### Ground Control Station +Currently the ground control station uses the same image as the robot container. This may change in the future. + +Start a bash shell in a robot container: +```bash +docker exec -it ground-control-station bash +``` + +The commands are currently the same. + +`ROS_DOMAIN_ID` is set to 0. \ No newline at end of file diff --git a/docs/developer_guide/documentation.md b/docs/development/documentation.md similarity index 100% rename from docs/developer_guide/documentation.md rename to docs/development/documentation.md diff --git a/docs/development/frame_conventions.md b/docs/development/frame_conventions.md new file mode 100644 index 00000000..c89577e1 --- /dev/null +++ b/docs/development/frame_conventions.md @@ -0,0 +1,3 @@ + + +Isaac Sim follows the Forward-Left-Up (FLU) coordinate system. This means that the X-axis points forward, the Y-axis points left, and the Z-axis points up. This is the same convention used in the Isaac SDK and Isaac Sim's parent platform, Omniverse. [Isaac Docs](https://docs.omniverse.nvidia.com/isaacsim/latest/reference_conventions.html) \ No newline at end of file diff --git a/docs/developer_guide/overview.md b/docs/development/index.md similarity index 58% rename from docs/developer_guide/overview.md rename to docs/development/index.md index ec857ba4..fe17ff6c 100644 --- a/docs/developer_guide/overview.md +++ b/docs/development/index.md @@ -3,9 +3,5 @@ Welcome developers! This guide documents how to extend the autonomy stack for your own needs. The stack has been designed with modularity in mind, and aims to make it straight forward to swap out any component. -```bash -# clean workspace, removes all build and install directories -cws -# build workspace and source workspace. these are aliases in ~/.bashrc -bws && sws -``` \ No newline at end of file +We assume you're developing first on a local machine with simulation. + diff --git a/docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/.gitignore b/docs/development/testing/ci_cd.md similarity index 100% rename from docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/.gitignore rename to docs/development/testing/ci_cd.md diff --git a/docs/development/testing/index.md b/docs/development/testing/index.md new file mode 100644 index 00000000..94cfd7d7 --- /dev/null +++ b/docs/development/testing/index.md @@ -0,0 +1 @@ +# Testing \ No newline at end of file diff --git a/docs/developer_guide/autonomy/mapping.md b/docs/development/testing/integration_testing.md similarity index 100% rename from docs/developer_guide/autonomy/mapping.md rename to docs/development/testing/integration_testing.md diff --git a/docs/developer_guide/autonomy/perception.md b/docs/development/testing/system_testing.md similarity index 100% rename from docs/developer_guide/autonomy/perception.md rename to docs/development/testing/system_testing.md diff --git a/ros_ws/src/robot/autonomy/controls/mavros_interface/include/mavros_interface/.gitkeep b/docs/development/testing/testing_frameworks.md similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mavros_interface/include/mavros_interface/.gitkeep rename to docs/development/testing/testing_frameworks.md diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/src/rqt_fixed_trajectory_selector/__init__.py b/docs/development/testing/unit_testing.md similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/src/rqt_fixed_trajectory_selector/__init__.py rename to docs/development/testing/unit_testing.md diff --git a/docs/getting_started.md b/docs/getting_started.md new file mode 100644 index 00000000..2af6d0f7 --- /dev/null +++ b/docs/getting_started.md @@ -0,0 +1,148 @@ +# Getting Started + +By the end of this tutorial, you will have the autonomy stack running on your machine. + +## Requirements + +You need at least 25GB free to install the Docker image. + +Have an NVIDIA GPU >= RTX 3070 to run Isaac Sim locally. + +## Setup + +### Clone +``` +git clone --recursive -j8 git@github.com:castacks/AirStack.git +``` +### Docker +Install [Docker Desktop](https://docs.docker.com/desktop/install/ubuntu/). This should come installed with docker compose. + +## Configure + +Follow the instructions in `docker/isaac-sim/omni_pass.env` to configure the required settings for your Omniverse Nucelus Server token. +To generate a token, follow the NVIDIA docs [here](https://docs.omniverse.nvidia.com/nucleus/latest/config-and-info/api_tokens.html). See here for more information: + https://airlab.slite.com/app/docs/X8dZ8w5S3GP9tw + +Also set the default OMNI_SERVER and accept the license terms. (Basti: The omni_server variable doesn't seem to work. The content browser might have to be edited manually the first time. To do that click: +"Add new connection ..." and enter airlab-storage.andrew.cmu.edu:8443 in the server field. Also if there is a localhost it should be removed since we are not running a local Nucleus server. + +## Getting Docker Images Ready +Now you have two options on how to proceed. You can build the docker image from scratch or pull the existing image on the airlab docker registry. Building the image from scratch can be useful if you would like to add new dependencies or add new custom functionality. For most users just pulling the existing image will be more conveninent and fast since it doesn't require access to the Nvidia registry. + +### Option 1 (Preferred): Use the Airlab Docker registry + +To use the AirLab docker registry do the following +```bash +cd AirStack/docker/ +docker login airlab-storage.andrew.cmu.edu:5001 +## +## + +## Pull the images in the docker compose file +docker compose pull +``` +When you execute docker compose pull in the next step the image will be pulled from the server automatically. This might take a while since the image is large. + + +#### Option 2: Setup from Scratch +1. SITL (Required until we add to docker image) + + Download the Ascent Spirit SITL software packages from [this link](https://drive.google.com/file/d/1UxgezaTrHe4WJ28zsVeRhv1VYfOU5VK8/view?usp=drive_link). + + Then unzip the file AscentAeroSystemsSITLPackage.zip in this folder: + ``` + cd AirStack/docker/isaac-sim/ + unzip ~/Downloads/AscentAeroSystemsSITLPackage.zip -d . + ``` + +2. Gain access to NVIDIA NGC Containers by following [these instructions](https://docs.nvidia.com/launchpad/ai/base-command-coe/latest/bc-coe-docker-basics-step-02.html). + + Then: + ```bash + cd AirStack/docker/ + docker compose build # build the images locally + ``` + +IF you have permission you can now push an updated images to the docker server (only if it changed and is required) +```bash +docker compose push +``` + +## Launch + +### Initialize Docker Containers +```bash +xhost + # allow docker access to X-Server + +# Make sure you are in the AirStack/docker directory. + +# Start docker compose services, +# you can append `--scale robot=[NUM_ROBOTS]` for more robots, default is 1 +docker compose up -d +# view running containers +docker ps -a +``` + +### Launch Isaac Sim: + +```bash +# in another terminal under AirStack/docker +docker exec -it isaac-sim bash +# within isaac-sim docker +runapp +``` +In the Isaac content browser, under "Omniverse", click "Add New Connection ...". +Type in `airlab-storage.andrew.cmu.edu:8443`. + +It takes a few seconds to connect. + +Then open the stage from the Nucleus server: +`airlab-storage.andrew.cmu.edu:8443/Projects/AirStack/ascent_fire_academy.usd` + + +### Launch Robot: + +```bash + +# create a bash shell in the docker-robot-1 container +docker exec -it docker-robot-1 bash + +# in robot docker +bws && sws # build workspace and source workspace. these are aliases in ~/.bashrc +ros2 launch robot_bringup robot.launch.xml +``` + +## Move Robot + + +Once Isaac Sim launches, hit the gray triangle "Play" button on the left side bar. It takes a minute for the GPS to initialize. + +Then, find the RQT GUI window. Hit `Takeoff`, then hit `Publish` in the trajectory window like in this video: + + + +Note you can also use the `ros2 topic pub` command to move the robot. For example, to fly to a position: + +```bash +# start another terminal in docker container +docker exec -it docker-robot-1 bash +# in docker +# FLY TO POSITION. Put whatever position you want +ros2 topic pub /robot_1/interface/mavros/setpoint_position/local geometry_msgs/PoseStamped \ + "{ header: { stamp: { sec: 0, nanosec: 0 }, frame_id: 'base_link' }, \ + pose: { position: { x: 10.0, y: 0.0, z: 20.0 }, orientation: { x: 0.0, y: 0.0, z: 0.0, w: 1.0 } } }" -1 +``` + +## Shutdown + +To pause containers: + +```bash +docker compose stop +``` + +To shutdown and remove docker containers: + +```bash +docker compose down +``` diff --git a/docs/ground_control_station/index.md b/docs/ground_control_station/index.md new file mode 100644 index 00000000..ca3491c3 --- /dev/null +++ b/docs/ground_control_station/index.md @@ -0,0 +1,3 @@ +# Ground Control Station + +The Ground Control Station (GCS) is for operators to monitor and control the robots. \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/perception/.gitkeep b/docs/ground_control_station/multi_robot/multi_robot.md similarity index 100% rename from ros_ws/src/robot/autonomy/perception/.gitkeep rename to docs/ground_control_station/multi_robot/multi_robot.md diff --git a/ros_ws/src/robot/autonomy/planning/global/.gitkeep b/docs/ground_control_station/usage/user_interface.md similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/.gitkeep rename to docs/ground_control_station/usage/user_interface.md diff --git a/docs/overview.png b/docs/overview.png new file mode 100644 index 00000000..73f5a3a2 Binary files /dev/null and b/docs/overview.png differ diff --git a/docs/real_world/index.md b/docs/real_world/index.md new file mode 100644 index 00000000..e10b5621 --- /dev/null +++ b/docs/real_world/index.md @@ -0,0 +1,5 @@ +# Real World Overview + +Fly robots in da wild. + +That's wild. \ No newline at end of file diff --git a/docs/real_world/installation/index.md b/docs/real_world/installation/index.md new file mode 100644 index 00000000..f6491851 --- /dev/null +++ b/docs/real_world/installation/index.md @@ -0,0 +1 @@ +# Installation on Hardware \ No newline at end of file diff --git a/docs/robot/autonomy/0_interface/index.md b/docs/robot/autonomy/0_interface/index.md new file mode 100644 index 00000000..495a0c64 --- /dev/null +++ b/docs/robot/autonomy/0_interface/index.md @@ -0,0 +1,86 @@ +# Interface + +The interface defines the communication between the autonomy stack running on the onboard computer and the robot's control unit. +For example, for drones it converts the control commands from the autonomy stack into MAVLink messages for the flight controller. + +==TODO: This is not our diagram, must replace.== +![Interface Diagram](https://404warehouse.net/wp-content/uploads/2016/08/softwareoverview.png?w=800) + +The code is located under `AirStack/ros_ws/src/robot/autonomy/0_interface/`. + +## Launch + +Launch files are under `src/robot/autonomy/0_interface/interface_bringup/launch`. + +The main launch command is `ros2 launch interface_bringup interface.launch.xml`. + + +## RobotInterface + +Package `robot_interface` is a ROS2 node that interfaces with the robot's hardware. +The `RobotInterface` _gets robot state_ and forwards it to the autonomy stack, +and also _translates control commands_ from the autonomy stack into the command for the underlying hardware. +Note the base class is unimplemented. +Specific implementations should extend `class RobotInterface` in `robot_interface.hpp`, for example `class MAVROSInterface`. + +### State +The `RobotInterface` class broadcasts the robot's pose as a TF2 transform. +It also publishes the robot's odometry as a `nav_msgs/Odometry` message to `$(arg robot_name)/0_interface/robot_0_interface/odometry`. + +### Commands +The commands are variations of the two main command modes: Attitude control and Position control. +These are reflected in [MAVLink](https://mavlink.io/en/messages/common.html#SET_POSITION_TARGET_LOCAL_NED) and supported by both PX4 and [Ardupilot](https://ardupilot.org/dev/docs/copter-commands-in-guided-mode.html#movement-commands). + +The Robot0_interface node subscribes to: + +- `/$(arg robot_name)/interface/cmd_attitude_thrust` of type `mav_msgs/AttitudeThrust.msg` +- `/$(arg robot_name)/interface/cmd_rate_thrust` of type `mav_msgs/RateThrust.msg` +- `/$(arg robot_name)/interface/cmd_roll_pitch_yawrate_thrust` of type `mav_msgs/RollPitchYawrateThrust.msg` +- `/$(arg robot_name)/interface/cmd_torque_thrust` of type `mav_msgs/TorqueThrust.msg` +- `/$(arg robot_name)/interface/cmd_velocity` of type `geometry_msgs/TwistStamped.msg` +- `/$(arg robot_name)/interface/cmd_position` of type `geometry_msgs/PoseStamped.msg` + +All messages are in the robot's body frame, except `velocity` and `position` which use the frame specified by the message header. + +## MAVROSInterface +The available implementation in AirStack is called `MAVROSInterface` implemented in `mavros_interface.cpp`. It simply forwards the control commands to the Ascent flight controller (based on Ardupilot) using MAVROS. + +## Custom Robot Interface +If you're using a different robot control unit with its own custom API, then you need to create an associated RobotInterface. Implementations should do the following: + +### Broadcast State +Implementations of `RobotInterface` should obtain the robot's pose and broadcast it as a TF2 transform. + +Should look something like: +```c++ +// callback function triggered by some loop +void your_callback_function(){ + // ... + geometry_msgs::msg::TransformStamped t; + // populate the transform, e.g.: + t.header = // some header + t.transform.translation.x = // some value + t.transform.translation.y = // some value + t.transform.translation.z = // some value + t.transform.rotation = // some quaternion + // Send the transformation + this->tf_broadcaster_->sendTransform(t); + // ... +} +``` +==TODO: our code doesn't currently do it like this, it instead uses an external odometry_conversion node.== + +### Override Command Handling +Should override all `virtual` functions in `robot_interface.hpp`: + +- `cmd_attitude_thrust_callback` +- `cmd_rate_thrust_callback` +- `cmd_roll_pitch_yawrate_thrust_callback` +- `cmd_torque_thrust_callback` +- `cmd_velocity_callback` +- `cmd_position_callback` +- `request_control` +- `arm` +- `disarm` +- `is_armed` +- `has_control` diff --git a/docs/robot/autonomy/0_interface/mavlink.webp b/docs/robot/autonomy/0_interface/mavlink.webp new file mode 100644 index 00000000..c852a76d Binary files /dev/null and b/docs/robot/autonomy/0_interface/mavlink.webp differ diff --git a/docs/robot/autonomy/1_sensors/index.md b/docs/robot/autonomy/1_sensors/index.md new file mode 100644 index 00000000..13cdd61d --- /dev/null +++ b/docs/robot/autonomy/1_sensors/index.md @@ -0,0 +1 @@ +We'll fill this with different things like the ZED-X package, LiDAR, etc \ No newline at end of file diff --git a/docs/robot/autonomy/2_perception/index.md b/docs/robot/autonomy/2_perception/index.md new file mode 100644 index 00000000..557d41a0 --- /dev/null +++ b/docs/robot/autonomy/2_perception/index.md @@ -0,0 +1,9 @@ +# Perception +These modules process raw sensor data into useful information for the robot. For example: for detecting obstacles, localizing the robot, and recognizing objects. + +Perception modules typically output topics in image space or point cloud space. This information then gets aggregated into global and local world models later in the pipeline. + +Common perception modules include: + +- semantic segmentation +- VIO (Visual Inertial Odometry) \ No newline at end of file diff --git a/docs/robot/autonomy/2_perception/state_estimation.md b/docs/robot/autonomy/2_perception/state_estimation.md new file mode 100644 index 00000000..382a8c28 --- /dev/null +++ b/docs/robot/autonomy/2_perception/state_estimation.md @@ -0,0 +1,2 @@ + +Hey Yuheng your stuff goes here:) \ No newline at end of file diff --git a/docs/robot/autonomy/3_local/controls.md b/docs/robot/autonomy/3_local/controls.md new file mode 100644 index 00000000..59a572b0 --- /dev/null +++ b/docs/robot/autonomy/3_local/controls.md @@ -0,0 +1,6 @@ +# Local Controls + +The controller should publish control commands directly to topics defined by the [Robot Interface](../0_interface/robot_interface.md). + +## Trajectory Controller + diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/resource/rqt_behavior_tree b/docs/robot/autonomy/3_local/index.md similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/resource/rqt_behavior_tree rename to docs/robot/autonomy/3_local/index.md diff --git a/docs/developer_guide/autonomy/local_planning.md b/docs/robot/autonomy/3_local/planning.md similarity index 72% rename from docs/developer_guide/autonomy/local_planning.md rename to docs/robot/autonomy/3_local/planning.md index 187b1684..8f2f4c6c 100644 --- a/docs/developer_guide/autonomy/local_planning.md +++ b/docs/robot/autonomy/3_local/planning.md @@ -1,5 +1,7 @@ -Local planner +# Local Planning Part of the local planner is the Waypoint Manager. -The Waypoint Manager subscribes to the global waypoints and the drone's current position and publishes the next waypoint to the local planner. \ No newline at end of file +The Waypoint Manager subscribes to the global waypoints and the drone's current position and publishes the next waypoint to the local planner. + +We plan for this baseline to be DROAN \ No newline at end of file diff --git a/docs/robot/autonomy/3_local/world_model.md b/docs/robot/autonomy/3_local/world_model.md new file mode 100644 index 00000000..5051a0ef --- /dev/null +++ b/docs/robot/autonomy/3_local/world_model.md @@ -0,0 +1 @@ +# Local World Model \ No newline at end of file diff --git a/docs/robot/autonomy/4_global/global_trajectory.png b/docs/robot/autonomy/4_global/global_trajectory.png new file mode 100644 index 00000000..8dd6da42 Binary files /dev/null and b/docs/robot/autonomy/4_global/global_trajectory.png differ diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/__init__.py b/docs/robot/autonomy/4_global/index.md similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/__init__.py rename to docs/robot/autonomy/4_global/index.md diff --git a/docs/robot/autonomy/4_global/planning.md b/docs/robot/autonomy/4_global/planning.md new file mode 100644 index 00000000..6355ace1 --- /dev/null +++ b/docs/robot/autonomy/4_global/planning.md @@ -0,0 +1,105 @@ +# Global Planning + +![global_trajectory_diagram](global_trajectory.png) + +Global planners output a high level, coarse trajectory for the robot to follow. + +A **trajectory** is a spatial path plus a schedule. +This means each waypoint in the trajectory has a time associated with it, indicating when the robot should reach that waypoint. +These timestamps are fed to the local planner and controller to determine velocity and acceleration. + +If a waypoint's header timestamp is empty, the local planner should assume there's no time constraint and follow the trajectory at its own pace. + +The global planner should make a trajectory that is collision-free according to the global map. +However, avoiding fine obstacles is delegated to the local planner that operates at a faster rate. + +We intend the global planners to be modular. _AirStack_ implements a basic Random Walk planner as a baseline. +Feel free to implement your own through the following interfaces. + +## ROS Interfaces + +Global planners are meant to be modules that can be swapped out easily. +They can be thought of as different high level behaviors for the robot to follow. +The Behavior Executive may run multiple global planners in parallel and choose the best plan for the current situation. + +As such, the global planner should be implemented as a ROS2 action server that can be queried for a plan. +The Behavior Executive will then publish the best plan to `/$(arg robot_name)/global/trajectory` for the local planner to follow. + +``` mermaid +sequenceDiagram + autonumber + Behavior Executive->>Global Planner: GetPlan.action: goal + loop Planning + Global Planner->>Behavior Executive: GetPlan.action: feedback + end + Global Planner-->>Behavior Executive: GetPlan.action: result (nav_msgs/Path) + Behavior Executive-->>Local Planner: /$ROBOT_NAME/global/trajectory (nav_msgs/Path) +``` + +### Actions Interface + +Global Planner implementations should define a custom **GetPlan** action server and associated `GetPlan.action` message. +The action message may be defined with whatever input parameters necessary for the planner to generate a plan. +Your `GetPlan.action` _must_ return a `nav_msgs/Path` message. + +An example `GetPlan.action` message is shown below. +``` +# Define a goal +std_msgs/Duration timeout # maximum time to spend planning +geometry_msgs/Polygon bounds # boundary that the plan must stay within +--- +# Define the result that will be published after the action execution ends. +{==nav_msgs/Path trajectory # REQUIRED FIELD==} +--- +# Define a feedback message that will be published during action execution. +float32 percent_complete +``` + + +#### Goal +The goal defines the parameters that the global planner needs to generate a plan. All fields are optional. + + +#### Result +The global planner must have a return field `trajectory` of message type `nav_msgs/Path`. +`trajectory` defines high level waypoints to reach by a given time. + +The `nav_msgs/Path` message type contains a `header` field and `poses` field. + +- The top level header of `nav_msgs/Path` message should contain the coordinate frame of the trajectory, and its timestamp should indicate when the trajectory was published. +- Within the `poses` field, each `geometry_msgs/PoseStamped`'s header should contain a timestamp that indicates when that waypoint should be reached + +``` +nav_msgs/Path.msg + - std_msgs/Header header + - time stamp: when the trajectory was generated + - frame_id: the coordinate frame of the trajectory + - geometry_msgs/PoseStamped[] poses: the trajectory + - geometry_msgs/PoseStamped pose + - std_msgs/Header header + - time stamp: when the waypoint should be reached + - string frame_id: the coordinate frame of the waypoint + - geometry_msgs/Pose pose: the position and orientation of the waypoint +``` +#### Feedback +All other fields are optional. + + +More info about ROS2 actions may be found in the official [tutorial](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Actions/Understanding-ROS2-Actions.html) and [design philosophy](https://design.ros2.org/articles/actions.html) documents. + + +### Subscribers +In general, the global planner needs to access components of the world model such as the map and drone state. + +The most common map is Occupancy Grids that is published by {==TODO==} node. + +The global planner can also access the robot's current state and expected state in the future. For example, if the global planner takes 20 seconds to plan a trajectory, +it can query where the robot expects to be in 20 seconds. This ROS2 service is available under {==TODO==}. + +The global planner can do whatever it wants internally with this information. + +## Example Planners + +### Random Walk planner + +The random walk planner replans when the robot is getting close to the goal. The random walk planner is a trivial planner that generates a plan by randomly selecting a direction to move in. The random walk planner is useful for testing the robot's ability to follow a plan. \ No newline at end of file diff --git a/docs/robot/autonomy/4_global/world_model.md b/docs/robot/autonomy/4_global/world_model.md new file mode 100644 index 00000000..eb0bac39 --- /dev/null +++ b/docs/robot/autonomy/4_global/world_model.md @@ -0,0 +1 @@ +# Global World Model \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/xdot/__init__.py b/docs/robot/autonomy/5_behavior/behavior_executive similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/xdot/__init__.py rename to docs/robot/autonomy/5_behavior/behavior_executive diff --git a/docs/robot/autonomy/5_behavior/behavior_tree.md b/docs/robot/autonomy/5_behavior/behavior_tree.md new file mode 100644 index 00000000..bd757753 --- /dev/null +++ b/docs/robot/autonomy/5_behavior/behavior_tree.md @@ -0,0 +1,95 @@ +# Behavior Trees + +Defines how a task in terms of conditions and actions which the user +implements. + +Other types of nodes, control flow and decorator nodes, control which +conditions will be checked and which actions will be activated. + +Nodes have statuses of either SUCCESS, RUNNING or FAILURE. + +![](./media/image1.png) + +## Why Behavior Trees? + +Maintainable - Easy to modify + +Scalable - Parts of sub-trees are modular and can be encapsulated + +Reusable - Sub-trees can be reused in different places + +Clear visualization and interpretation + +## Types of Nodes + +- **Execution Nodes** + - Condition Nodes + - Action Nodes +- **Decorator Nodes** + - Not Node +- **Control Flow Nodes** + - Sequence Nodes + - Fallback Nodes + +### Execution Nodes - Condition Nodes + +Condition nodes have a status of either SUCCESS or FAILURE + +![](./media/image2.png) ![](./media/image3.png) + +### Execution Nodes - Action Nodes + +Action nodes can either be active or inactive + +An inactive node's status is not checked by the behavior tree, it is +shown in white + +below + +An active node's status is checked, it can either be SUCCESS (green), +RUNNING (blue) or FAILURE (red) + +![green](./media/image4.png) ![white](./media/image5.png)![blue](./media/image6.png)![red](./media/image7.png) + +### Decorator Nodes - Not Nodes + +The not node must have one condition node has a child and inverts the +status of the child. + +If the child's status is SUCCESS, the not node's status will be FAILURE. + +If the child's status is FAILURE, the not node's status will be SUCCESS. + +![](./media/image8.png) + +### Control Flow Nodes - Fallback Nodes + +These nodes are shown with a ? + +This node returns FAILURE if and only if all of its children return +FAILURE + +If one of its children return RUNNING or SUCCESS, it returns RUNNING or +SUCCESS and no subsequent children's statuses are check + +Below shows a typical example, where an action will only be performed if +all of the preceding conditions are false. In this case a drone will only be +armed if it is not already armed, it is in offboard mode and it is stationary + +![](./media/image8.png) + +### Control Flow Nodes - Sequence Nodes + +These nodes are shown with a "-\>" + +This node returns SUCCESS if and only if all of its children return +SUCCESS + +If one of its children return RUNNING or FAILURE, it returns RUNNING or +FAILURE and no subsequent children's statuses are check + +Below shows a typical example where preceding conditions must be true in +order for an action to be performed. In this case the drone will land if the IMU +times out and it is in offboard mode + +![](./media/image8.png) diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/resource/rqt_behavior_tree_command b/docs/robot/autonomy/5_behavior/index.md similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/resource/rqt_behavior_tree_command rename to docs/robot/autonomy/5_behavior/index.md diff --git a/docs/robot/autonomy/5_behavior/media/image1.png b/docs/robot/autonomy/5_behavior/media/image1.png new file mode 100644 index 00000000..135407ae Binary files /dev/null and b/docs/robot/autonomy/5_behavior/media/image1.png differ diff --git a/docs/robot/autonomy/5_behavior/media/image10.png b/docs/robot/autonomy/5_behavior/media/image10.png new file mode 100644 index 00000000..81ecbd25 Binary files /dev/null and b/docs/robot/autonomy/5_behavior/media/image10.png differ diff --git a/docs/robot/autonomy/5_behavior/media/image2.png b/docs/robot/autonomy/5_behavior/media/image2.png new file mode 100644 index 00000000..efd5b594 Binary files /dev/null and b/docs/robot/autonomy/5_behavior/media/image2.png differ diff --git a/docs/robot/autonomy/5_behavior/media/image3.png b/docs/robot/autonomy/5_behavior/media/image3.png new file mode 100644 index 00000000..6b7f368d Binary files /dev/null and b/docs/robot/autonomy/5_behavior/media/image3.png differ diff --git a/docs/robot/autonomy/5_behavior/media/image4.png b/docs/robot/autonomy/5_behavior/media/image4.png new file mode 100644 index 00000000..ba20ef61 Binary files /dev/null and b/docs/robot/autonomy/5_behavior/media/image4.png differ diff --git a/docs/robot/autonomy/5_behavior/media/image5.png b/docs/robot/autonomy/5_behavior/media/image5.png new file mode 100644 index 00000000..35647b04 Binary files /dev/null and b/docs/robot/autonomy/5_behavior/media/image5.png differ diff --git a/docs/robot/autonomy/5_behavior/media/image6.png b/docs/robot/autonomy/5_behavior/media/image6.png new file mode 100644 index 00000000..3aefd3b4 Binary files /dev/null and b/docs/robot/autonomy/5_behavior/media/image6.png differ diff --git a/docs/robot/autonomy/5_behavior/media/image7.png b/docs/robot/autonomy/5_behavior/media/image7.png new file mode 100644 index 00000000..ae0061e0 Binary files /dev/null and b/docs/robot/autonomy/5_behavior/media/image7.png differ diff --git a/docs/robot/autonomy/5_behavior/media/image8.png b/docs/robot/autonomy/5_behavior/media/image8.png new file mode 100644 index 00000000..c6a313d6 Binary files /dev/null and b/docs/robot/autonomy/5_behavior/media/image8.png differ diff --git a/docs/robot/autonomy/5_behavior/media/image9.png b/docs/robot/autonomy/5_behavior/media/image9.png new file mode 100644 index 00000000..83265b26 Binary files /dev/null and b/docs/robot/autonomy/5_behavior/media/image9.png differ diff --git a/docs/robot/autonomy/airstack_system_diagram.png b/docs/robot/autonomy/airstack_system_diagram.png new file mode 100644 index 00000000..8438ea68 Binary files /dev/null and b/docs/robot/autonomy/airstack_system_diagram.png differ diff --git a/docs/robot/autonomy/index.md b/docs/robot/autonomy/index.md new file mode 100644 index 00000000..e97e3b2c --- /dev/null +++ b/docs/robot/autonomy/index.md @@ -0,0 +1,13 @@ +# Autonomy Modules + +## Modules + +- [0_interface](0_interface/index.md) +- [1_sensors](1_sensors/index.md) +- [2_perception](2_perception/README.md) +- [3_local](3_local/README.md) +- [4_global](4_global/README.md) +- [5_behavior](5_behavior/README.md) + +## System Diagram +![AirStack System Diagram](airstack_system_diagram.png) diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/__init__.py b/docs/robot/autonomy/mapping.md similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/__init__.py rename to docs/robot/autonomy/mapping.md diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/COLCON_IGNORE b/docs/robot/autonomy/perception.md similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/base_main_class/COLCON_IGNORE rename to docs/robot/autonomy/perception.md diff --git a/docs/robot/index.md b/docs/robot/index.md new file mode 100644 index 00000000..e0417343 --- /dev/null +++ b/docs/robot/index.md @@ -0,0 +1,4 @@ +# Robot + +## Launch Structure +Each high-level module has a `*_bringup` package that contains the launch files for that module. The launch files are located in the `launch` directory of the `*_bringup` package. The launch files are named `*.launch.(xml/yaml/py)` and can be launched with `ros2 launch _bringup .launch.(xml/yaml/py)`. diff --git a/simulation/extension_docker/dronekit-python/docs/_static/.gitignore b/docs/robot/logging/data_offloading.md similarity index 100% rename from simulation/extension_docker/dronekit-python/docs/_static/.gitignore rename to docs/robot/logging/data_offloading.md diff --git a/docs/robot/logging/index.md b/docs/robot/logging/index.md new file mode 100644 index 00000000..85f805b3 --- /dev/null +++ b/docs/robot/logging/index.md @@ -0,0 +1 @@ +# Logging \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/docs/_templates/.gitignore b/docs/robot/logging/rosbags.md similarity index 100% rename from simulation/extension_docker/dronekit-python/docs/_templates/.gitignore rename to docs/robot/logging/rosbags.md diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/unit/__init__.py b/docs/robot/static_transforms/index.md similarity index 100% rename from simulation/extension_docker/dronekit-python/dronekit/test/unit/__init__.py rename to docs/robot/static_transforms/index.md diff --git a/docs/simulation/docker_network.md b/docs/simulation/docker_network.md new file mode 100644 index 00000000..68dcac49 --- /dev/null +++ b/docs/simulation/docker_network.md @@ -0,0 +1,27 @@ +## Overview +The details of the docker containers setup is in the `docker-compose.yaml` file in the `AirStack/docker` directory. + + +Isaac Sim, the ground control station, and robots all get created on the same default Docker bridge network. +This lets them communicate with ROS2 on the same network. + + +Each robot has its own ROS_DOMAIN_ID. + + +## SSH into Robots +The `ground-control-station` and `docker-robot` containers are setup with ssh daemon, so you can ssh into the containers using the IP address. + +You can get the IP address of each container by running the following command: + +```bash +docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [CONTAINER-NAME] +``` +Then ssh in, for example: +```bash +ssh root@172.18.0.6 +``` + +The ssh password is `airstack`. + + diff --git a/docs/simulation/index.md b/docs/simulation/index.md new file mode 100644 index 00000000..a4301d1c --- /dev/null +++ b/docs/simulation/index.md @@ -0,0 +1,3 @@ +# Simulation + +We primarily support Isaac Sim. In the future we plan to support Gazebo. \ No newline at end of file diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/.gitignore b/docs/simulation/isaac_sim/ascent_sitl_extension.md similarity index 100% rename from simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/.gitignore rename to docs/simulation/isaac_sim/ascent_sitl_extension.md diff --git a/docs/simulation/isaac_sim/index.md b/docs/simulation/isaac_sim/index.md new file mode 100644 index 00000000..9ef2e30d --- /dev/null +++ b/docs/simulation/isaac_sim/index.md @@ -0,0 +1 @@ +# Isaac Sim \ No newline at end of file diff --git a/docs/simulation/isaac_sim/omnigraph_config.png b/docs/simulation/isaac_sim/omnigraph_config.png new file mode 100644 index 00000000..874d098f Binary files /dev/null and b/docs/simulation/isaac_sim/omnigraph_config.png differ diff --git a/docs/simulation/isaac_sim/scene_setup.md b/docs/simulation/isaac_sim/scene_setup.md new file mode 100644 index 00000000..adb00c95 --- /dev/null +++ b/docs/simulation/isaac_sim/scene_setup.md @@ -0,0 +1,24 @@ + +## Creating a New Scene +The easiest way is to reference and copy an existing scene. + +## ROS Publishers Through OmniGraph + + +### Configure Robot Name, ROS_DOMAIN_ID, and Topic Namespaces + +Under the Spirit drone prim is an `Omnigraph` component. This component is used to configure the ROS publishers for the robot. The `Omnigraph` component has the following fields: + +- `robot_name`: The name of the robot. This is used as the top-level namespace for ROS topics. +- `domain_id`: The ROS domain ID. This is used as the `ROS_DOMAIN_ID` for DDS networking. + +The Omnigraph has subgraphs for each ROS publisher type. For example, TFs, Images, and PointClouds. The top-level `robot_name` and `domain_id` fields get fed into the subgraphs. The `Topic Namespaces` field should be set to the topic namespace in the subgraphs. This is used to namespace the ROS topics. + +![Image of omnigraphs](omnigraph_config.png) + + +### Customizing the Omnigraph + +Common ROS graphs may be added through the top menu bar: `Isaac Utils > Common Graphs > ROS`. + +We recommend copying them into the top-level `Omnigraph` component. Connect the `robot_name` and `domain_id` fields to your workflow. Then, select all the nodes in your workflow, right-click, and create a subgraph. \ No newline at end of file diff --git a/docs/user_guide/getting_started.md b/docs/user_guide/getting_started.md deleted file mode 100644 index 25499464..00000000 --- a/docs/user_guide/getting_started.md +++ /dev/null @@ -1,91 +0,0 @@ -# Getting Started -Welcome to the AirLab Autonomy Stack. By the end of this guide, you will have the autonomy stack running on your machine. - -## Requirements - -You need at least 25GB free to install the Docker image. - -Have an NVIDIA GPU >= RTX 3070 to run Isaac Sim locally. - -## Setup -### Clone -``` -git clone --recursive -j8 git@github.com:castacks/AirStack.git -``` - -### Omniverse -Install the Omniverse launcher download from this link: - -``` -wget https://install.launcher.omniverse.nvidia.com/installers/omniverse-launcher-linux.AppImage -``` - -Follow these instructions to setup Nucleus : https://airlab.slite.com/app/docs/X8dZ8w5S3GP9tw - -### SITL -If you are using the Ascent Spirit drone download the SITL software packages from this link: -https://drive.google.com/file/d/1UxgezaTrHe4WJ28zsVeRhv1VYfOU5VK8/view?usp=drive_link - -Then unzip the file AscentAeroSystemsSITLPackage.zip in this folder: - -``` -cd AirStack/simulation/AscentAeroSystems -unzip ~/Downloads/AscentAeroSystemsSITLPackage.zip -d . -``` - -### Docker -- Install [Docker Desktop](https://docs.docker.com/desktop/install/ubuntu/). This should come installed with docker compose. -- Gain access to NVIDIA NGC Containers by following [these instructions](https://docs.nvidia.com/launchpad/ai/base-command-coe/latest/bc-coe-docker-basics-step-02.html) - -## Build and run the Docker image - -```bash -cd AirStack/docker/ -## build the image, it is named airlab-autonomy-dev:latest -docker compose --profile build build -## start docker compose service/container -docker compose up -d -``` - -## Launch - -Launch autonomy stack controls package: - -```bash -# start a new terminal in docker container -docker compose exec airstack_dev bash - -# in docker -bws && sws ## build workspace and source workspace. these are aliases in ~/.bashrc -ros2 launch robot_bringup launch_robot.yaml -``` - -Launch simulator (Isaac Sim and Ascent SITL): - -```bash -xhost + ## allow Docker access to Linux X-Server -# start another terminal in docker container -docker compose exec airstack_dev bash - -# in docker -ISAACSIM_PYTHON simulation/launch_sim.py -``` - -## Move Robot - -```bash -# start another terminal in docker container -docker compose exec airstack_dev bash - -# in docker -# set drone mode to GUIDED -ros2 service call /robot1/controls/mavros/set_mode mavros_msgs/SetMode "custom_mode: 'GUIDED'" -# ARM -ros2 service call /robot1/controls/mavros/cmd/arming mavros_msgs/srv/CommandBool "{value: True}" -# TAKEOFF -ros2 service call /robot1/controls/mavros/cmd/takeoff mavros_msgs/srv/CommandTOL "{altitude: 5}" -# FLY TO POSITION. Put whatever position you want -ros2 topic pub /controls/mavros/setpoint_position/local geometry_msgs/PoseStamped \ - "{ header: { stamp: { sec: 0, nanosec: 0 }, frame_id: 'base_link' }, \ - pose: { position: { x: 10.0, y: 0.0, z: 20.0 }, orientation: { x: 0.0, y: 0.0, z: 0.0, w: 1.0 } } }" -1 -``` diff --git a/docs/user_guide/isaac_sim.md b/docs/user_guide/isaac_sim.md deleted file mode 100644 index 935b0c42..00000000 --- a/docs/user_guide/isaac_sim.md +++ /dev/null @@ -1,3 +0,0 @@ -Will create - -The docker container will cache Nucleus assets to ~/docker/isaac-sim on your host. Keep this folder to prevent re-downloading assets from Nucleus each time. \ No newline at end of file diff --git a/docs/user_guide/planners.md b/docs/user_guide/planners.md deleted file mode 100644 index d2b1355a..00000000 --- a/docs/user_guide/planners.md +++ /dev/null @@ -1,11 +0,0 @@ -# Planners - -Planners are the core of the `planner` module. They are responsible for generating a plan for the robot to follow. The `planner` module provides a number of planners that can be used to generate plans for the robot to follow. The planners are divided into two categories: trivial planners and advanced planners. - - -## Trivial Planners - -### Random Walk planner -The random walk planner generates - -The random walk planner replans when the robot is getting close to the goal. The random walk planner is a trivial planner that generates a plan by randomly selecting a direction to move in. The random walk planner is useful for testing the robot's ability to follow a plan. \ No newline at end of file diff --git a/docs/user_guide/tutorials/launch.md b/docs/user_guide/tutorials/launch.md deleted file mode 100644 index 4255d7c5..00000000 --- a/docs/user_guide/tutorials/launch.md +++ /dev/null @@ -1,6 +0,0 @@ -# Launch - -Modules can be launched individually. For example, to launch controls only: -```bash -ros2 launch controls_bringup controls_launch.yaml -``` \ No newline at end of file diff --git a/docs/user_guide/tutorials/overview.md b/docs/user_guide/tutorials/overview.md deleted file mode 100644 index aa5f6b16..00000000 --- a/docs/user_guide/tutorials/overview.md +++ /dev/null @@ -1 +0,0 @@ -# Tutorials Overview \ No newline at end of file diff --git a/experiments/README.md b/experiments/README.md deleted file mode 100644 index 5b62be91..00000000 --- a/experiments/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Experiments - -experiments/ contains configs and results for each experiment - -Running something from experiments should exactly reproduce that experiment - -The experiments/ are .gitignored from the code base. -Instead, the experiments should be backed up to external data storage or a server. - - -launching will automatically generate a folder of this structure and log under experiments/ - -``` -experiments/ -- YYYY-MM-DD-HH-MM-SS_Experiment_Name/ - - field_test_plan.pdf - - launch_params/ - - launch_command.txt - - ros_params_dump.txt - - environment_variables.txt - - raw/ - - code-config-and-calibration/ - - the_code.zip - - run/ - - robot1/ - - device-date/ - - yyyy-mm-dd-hh-mm-ss_raw.mcap - - logs/ - - gcs/ - - device-date/ - - yyyy-mm-dd-hh-mm-ss_raw.mcap - - logs/ - - processed/ - - run/ - - device/ - - device-date/ - - yyyy-mm-dd-hh-mm-ss_processed.mcap - - logs/ - - media/ - - yyyy-mm-dd-hh-mm-ss_description.mp4 - - yyyy-mm-dd-hh-mm-ss_description.jpg - -- YYYY-MM-DD-HH-MM-SS_CFA_[description] -``` \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index e16c53be..039c7129 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,64 +1,14 @@ -site_name: "AirLab Autonomy Stack" -theme: - name: material - logo: assets/logo_horizontal_white.png - favicon: assets/StackedWhite.png - palette: - - scheme: default - primary: "#CC002B" - accent: pink - toggle: - icon: material/brightness-7 - name: Switch to dark mode - - # Palette toggle for dark mode - - scheme: slate - primary: "#CC002B" - accent: pink - toggle: - icon: material/brightness-4 - name: Switch to light mode - features: - - navigation.indexes - - navigation.path - - navigation.tabs - - search.highlight - - search.suggest - - toc.integrate - - content.code.copy - +--- +copyright: Copyright © 2024 - 2030 AirLab CMU +extra: + generator: false + social: + - icon: fontawesome/brands/github + link: https://github.com/castacks + - icon: fontawesome/brands/x-twitter + link: https://x.com/airlabcmu extra_css: - stylesheets/extra.css - -plugins: - - search - -nav: - - "Home": "README.md" - - "User Guide": - - "Getting Started": "user_guide/getting_started.md" - - "Tutorials": - - "Overview": "user_guide/tutorials/overview.md" - - "Launch": "user_guide/tutorials/launch.md" - - "Planners": "user_guide/planners.md" - - "API Reference": "user_guide/api_reference.md" - - "Developer Guide": - - "Overview": "developer_guide/overview.md" - - "Autonomy": - - "Overview": "developer_guide/autonomy/overview.md" - - "Perception": "developer_guide/autonomy/perception.md" - - "Mapping": "developer_guide/autonomy/mapping.md" - - "Global Planning": "developer_guide/autonomy/global_planning.md" - - "Local Planning": "developer_guide/autonomy/local_planning.md" - - "Controls": "developer_guide/autonomy/controls.md" - - "Simulation": "developer_guide/simulation.md" - - "Contributing": "developer_guide/contributing.md" - - "About": "about.md" - - "AirLab Website": "https://theairlab.org" - -repo_url: https://github.com/castacks/AirStack -repo_name: castacks/AirStack - markdown_extensions: - pymdownx.highlight: anchor_linenums: true @@ -66,5 +16,111 @@ markdown_extensions: pygments_lang_class: true - pymdownx.inlinehilite - pymdownx.snippets - - pymdownx.superfences - pymdownx.magiclink + - pymdownx.critic + - pymdownx.caret + - pymdownx.keys + - pymdownx.mark + - pymdownx.tilde + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format +nav: + - Home: README.md + - Getting Started: getting_started.md + - Development: + - development/index.md + - General Usage with Docker Compose: development/docker_usage.md + - Testing: + - development/testing/index.md + - Testing Frameworks: development/testing/testing_frameworks.md + - Integration Testing: development/testing/integration_testing.md + - Unit Testing: development/testing/unit_testing.md + - System Testing: development/testing/system_testing.md + - CI/CD Pipeline: development/testing/ci_cd.md + - Contributing: development/contributing.md + - ROS Frame Conventions: development/frame_conventions.md + - Robot: + - robot/index.md + - Autonomy Modules: + - robot/autonomy/index.md + - Interface: + - robot/autonomy/0_interface/index.md + - Sensors: + - robot/autonomy/1_sensors/index.md + - Perception: + - robot/autonomy/2_perception/index.md + - robot/autonomy/2_perception/state_estimation.md + - Local: + - robot/autonomy/3_local/index.md + - World Model: robot/autonomy/3_local/world_model.md + - Planning: robot/autonomy/3_local/planning.md + - Controls: robot/autonomy/3_local/controls.md + - Global: + - robot/autonomy/4_global/index.md + - World Model: robot/autonomy/4_global/world_model.md + - Planning: robot/autonomy/4_global/planning.md + - Behavior: + - robot/autonomy/5_behavior/index.md + - Behavior Tree: robot/autonomy/5_behavior/behavior_tree.md + - Behavior Executive: robot/autonomy/5_behavior/behavior_executive.md + - Static Transforms: + - robot/static_transforms/index.md + - Logging: + - robot/logging/index.md + - Ground Control Station: + - ground_control_station/index.md + - Usage: + - ground_control_station/usage/user_interface.md + - Multi-Robot: + - ground_control_station/multi_robot/multi_robot.md + - Simulation: + - simulation/index.md + - Isaac Sim: + - simulation/isaac_sim/index.md + - Scene Setup: simulation/isaac_sim/scene_setup.md + - Ascent SITL Extension: simulation/isaac_sim/ascent_sitl_extension.md + - Gazebo: + - simulation/gazebo/scene_setup.md + - Real World: + - real_world/index.md + - Installation on Hardware: + - real_world/installation/index.md + - About: about.md +plugins: + - search +repo_name: castacks/AirStack +repo_url: https://github.com/castacks/AirStack +site_name: AirLab Autonomy Stack +theme: + favicon: assets/StackedWhite.png + features: + - navigation.indexes + - navigation.path + - navigation.tabs + - navigation.expand + - navigation.footer + - navigation.top + - navigation.sections + - search.highlight + - search.suggest + - toc.integrate + - toc.follow + - content.code.copy + logo: assets/logo_horizontal_white.png + name: material + palette: + - accent: pink + primary: '#CC002B' + scheme: default + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - accent: pink + primary: '#CC002B' + scheme: slate + toggle: + icon: material/brightness-4 + name: Switch to light mode \ No newline at end of file diff --git a/ros_ws/src/airstack_common/CMakeLists.txt b/ros_ws/src/airstack_common/CMakeLists.txt index 5ec93c5a..6dab3e9b 100644 --- a/ros_ws/src/airstack_common/CMakeLists.txt +++ b/ros_ws/src/airstack_common/CMakeLists.txt @@ -92,23 +92,6 @@ install( ) ament_export_libraries(vislib) -# odometry conversion -add_executable(odometry_conversion src/odometry_conversion.cpp src/tflib.cpp src/ros2_helper.cpp) -target_include_directories(odometry_conversion PUBLIC - $ - $) -ament_target_dependencies(odometry_conversion - rclcpp - geometry_msgs - visualization_msgs - nav_msgs - tf2 - tf2_ros - tf2_geometry_msgs - airstack_msgs) -install(TARGETS odometry_conversion - DESTINATION lib/${PROJECT_NAME}) - # install ament_export_include_directories(include) @@ -117,7 +100,6 @@ install( DESTINATION include ) ament_export_dependencies(rclcpp nav_msgs geometry_msgs tf2 tf2_ros airstack_msgs tf2_geometry_msgs) -install(PROGRAMS scripts/odom_repub.py DESTINATION lib/${PROJECT_NAME}) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) diff --git a/ros_ws/src/airstack_common/include/airstack_common/ros2_helper.hpp b/ros_ws/src/airstack_common/include/airstack_common/ros2_helper.hpp index bfa13dd1..a1131a92 100644 --- a/ros_ws/src/airstack_common/include/airstack_common/ros2_helper.hpp +++ b/ros_ws/src/airstack_common/include/airstack_common/ros2_helper.hpp @@ -16,7 +16,10 @@ namespace airstack { template <> inline int get_param(rclcpp::Node* node, std::string name, int default_value, bool* set){ - node->declare_parameter(name, rclcpp::PARAMETER_INTEGER); + try{ + node->declare_parameter(name, rclcpp::PARAMETER_INTEGER); + } + catch(rclcpp::exceptions::ParameterAlreadyDeclaredException& e){} rclcpp::Parameter param; bool s = node->get_parameter_or(name, param, rclcpp::Parameter(name, default_value)); if(set != NULL) @@ -26,7 +29,10 @@ namespace airstack { template <> inline double get_param(rclcpp::Node* node, std::string name, double default_value, bool* set){ - node->declare_parameter(name, rclcpp::PARAMETER_DOUBLE); + try{ + node->declare_parameter(name, rclcpp::PARAMETER_DOUBLE); + } + catch(rclcpp::exceptions::ParameterAlreadyDeclaredException& e){} rclcpp::Parameter param; bool s = node->get_parameter_or(name, param, rclcpp::Parameter(name, default_value)); if(set != NULL) @@ -36,7 +42,10 @@ namespace airstack { template <> inline std::string get_param(rclcpp::Node* node, std::string name, std::string default_value, bool* set){ - node->declare_parameter(name, rclcpp::PARAMETER_STRING); + try{ + node->declare_parameter(name, rclcpp::PARAMETER_STRING); + } + catch(rclcpp::exceptions::ParameterAlreadyDeclaredException& e){} rclcpp::Parameter param; bool s = node->get_parameter_or(name, param, rclcpp::Parameter(name, default_value)); if(set != NULL) @@ -46,7 +55,10 @@ namespace airstack { template <> inline bool get_param(rclcpp::Node* node, std::string name, bool default_value, bool* set){ - node->declare_parameter(name, rclcpp::PARAMETER_BOOL); + try{ + node->declare_parameter(name, rclcpp::PARAMETER_BOOL); + } + catch(rclcpp::exceptions::ParameterAlreadyDeclaredException& e){} rclcpp::Parameter param; bool s = node->get_parameter_or(name, param, rclcpp::Parameter(name, default_value)); if(set != NULL) diff --git a/ros_ws/src/airstack_common/scripts/odom_repub.py b/ros_ws/src/airstack_common/scripts/odom_repub.py deleted file mode 100755 index f6e652a1..00000000 --- a/ros_ws/src/airstack_common/scripts/odom_repub.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/python3 -import rclpy -from rclpy.node import Node -from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSHistoryPolicy -from nav_msgs.msg import Odometry -from geometry_msgs.msg import Quaternion - -class OdomModifier(Node): - def __init__(self): - super().__init__('odom_modifier') - qos = QoSProfile( - reliability=QoSReliabilityPolicy.RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT, - history=QoSHistoryPolicy.RMW_QOS_POLICY_HISTORY_KEEP_LAST, - depth=1) - self.odom_subscriber = self.create_subscription(Odometry, 'odom_in', self.odom_callback, qos) - self.odom_publisher = self.create_publisher(Odometry, 'odom_out', 1) - - def odom_callback(self, msg): - modified_odom = Odometry() - modified_odom.header = msg.header - modified_odom.child_frame_id = msg.child_frame_id - modified_odom.twist = msg.twist - modified_odom.pose = msg.pose - - self.odom_publisher.publish(modified_odom) - -if __name__ == '__main__': - rclpy.init(args=None) - odom_modifier_node = OdomModifier() - rclpy.spin(odom_modifier_node) - odom_modifier_node.destroy_node() - rclpy.shutdown() diff --git a/ros_ws/src/airstack_common/src/odometry_conversion.cpp b/ros_ws/src/airstack_common/src/odometry_conversion.cpp deleted file mode 100644 index 80335a50..00000000 --- a/ros_ws/src/airstack_common/src/odometry_conversion.cpp +++ /dev/null @@ -1,124 +0,0 @@ -#include -#include -#include -#include - -class OdometryConversion : public rclcpp::Node -{ -private: - enum OdometryOutputType {NONE, TRANSFORM, OVERWRITE}; - - rclcpp::Subscription::SharedPtr odom_sub; - rclcpp::Publisher::SharedPtr odom_pub; - tf2_ros::Buffer* tf_buffer; - tf2_ros::TransformListener* tf_listener; - tf2_ros::TransformBroadcaster* tf_broadcaster; - - bool qos_best_effort; - std::string new_frame_id; - std::string new_child_frame_id; - OdometryOutputType odometry_output_type; - bool convert_odometry_to_transform; - bool convert_odometry_to_stabilized_transform; - bool restamp_now_pre, restamp_now_post; - tf2::Quaternion odom_orientation_rotation_pre, odom_orientation_rotation_post; - tf2::Vector3 odom_position_translation_pre, odom_position_translation_post; - -public: - OdometryConversion() - : Node("odometry_conversion"){; - qos_best_effort = airstack::get_param(this, "qos_best_effort", false); - new_frame_id = airstack::get_param(this, "new_frame_id", std::string("")); - new_child_frame_id = airstack::get_param(this, "new_child_frame_id", std::string("")); - odometry_output_type = (OdometryOutputType)airstack::get_param(this, "odometry_output_type", (int)NONE); - convert_odometry_to_transform = airstack::get_param(this, "convert_odometry_to_transform", false); - convert_odometry_to_stabilized_transform = airstack::get_param(this, "convert_odometry_to_stabilized_transform", false); - restamp_now_pre = airstack::get_param(this, "restamp_now_pre", false); - restamp_now_post = airstack::get_param(this, "restamp_now_post", false); - odom_orientation_rotation_pre = tf2::Quaternion(airstack::get_param(this, "odometry_orientation_rotation_pre_x", 0.), - airstack::get_param(this, "odometry_orientation_rotation_pre_y", 0.), - airstack::get_param(this, "odometry_orientation_rotation_pre_z", 0.), - airstack::get_param(this, "odometry_orientation_rotation_pre_w", 1.)); - odom_position_translation_pre = tf2::Vector3(airstack::get_param(this, "odometry_position_translation_pre_x", 0.), - airstack::get_param(this, "odometry_position_translation_pre_y", 0.), - airstack::get_param(this, "odometry_position_translation_pre_z", 0.)); - odom_orientation_rotation_post = tf2::Quaternion(airstack::get_param(this, "odometry_orientation_rotation_post_x", 0.), - airstack::get_param(this, "odometry_orientation_rotation_post_y", 0.), - airstack::get_param(this, "odometry_orientation_rotation_post_z", 0.), - airstack::get_param(this, "odometry_orientation_rotation_post_w", 1.)); - odom_position_translation_post = tf2::Vector3(airstack::get_param(this, "odometry_position_translation_post_x", 0.), - airstack::get_param(this, "odometry_position_translation_post_y", 0.), - airstack::get_param(this, "odometry_position_translation_post_z", 0.)); - - - rmw_qos_profile_t qos = rmw_qos_profile_sensor_data; - qos.history=RMW_QOS_POLICY_HISTORY_KEEP_LAST; - qos.depth=1; - if(qos_best_effort) - qos.reliability=RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT; - odom_sub = this->create_subscription("odometry_in", rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(qos), - qos), - std::bind(&OdometryConversion::odom_callback, - this, std::placeholders::_1)); - odom_pub = this->create_publisher("odometry_out", 1); - tf_buffer = new tf2_ros::Buffer(this->get_clock()); - tf_listener = new tf2_ros::TransformListener(*tf_buffer); - tf_broadcaster = new tf2_ros::TransformBroadcaster(*this); - } - - void odom_callback(const nav_msgs::msg::Odometry::SharedPtr msg){ - nav_msgs::msg::Odometry out_odom = *msg; - - if(restamp_now_pre) - out_odom.header.stamp = get_clock()->now(); - - out_odom.pose.pose.orientation = tflib::from_tf(tflib::to_tf(out_odom.pose.pose.orientation)*odom_orientation_rotation_pre); - - if(odometry_output_type == NONE){ - - } - else if(odometry_output_type == TRANSFORM){ - try{ - out_odom = tflib::transform_odometry(tf_buffer, out_odom, new_frame_id, new_child_frame_id); - } - catch(tf2::TransformException& ex){ - RCLCPP_ERROR_STREAM(get_logger(), "TransformException while transforming odometry: " << ex.what()); - return; - } - } - else if(odometry_output_type == OVERWRITE){ - out_odom.header.frame_id = new_frame_id; - out_odom.child_frame_id = new_child_frame_id; - } - else{ - RCLCPP_ERROR_STREAM(get_logger(), "Unsupported odometry output type: " << odometry_output_type); - } - - if(restamp_now_post) - out_odom.header.stamp = get_clock()->now(); - - out_odom.pose.pose.orientation = tflib::from_tf(tflib::to_tf(out_odom.pose.pose.orientation)*odom_orientation_rotation_post); - - if(convert_odometry_to_transform){ - geometry_msgs::msg::TransformStamped t = tf2::toMsg(tflib::to_tf(out_odom)); - t.child_frame_id = out_odom.child_frame_id; - tf_broadcaster->sendTransform(t); - } - - if(convert_odometry_to_stabilized_transform){ - geometry_msgs::msg::TransformStamped t = tf2::toMsg(tflib::to_tf(out_odom)); - t.child_frame_id = out_odom.child_frame_id + "_stabilized"; - t.transform.rotation = tflib::from_tf(tflib::get_stabilized(tflib::to_tf(out_odom.pose.pose.orientation))); - tf_broadcaster->sendTransform(t); - } - - odom_pub->publish(out_odom); - } -}; - -int main(int argc, char *argv[]){ - rclcpp::init(argc, argv); - rclcpp::spin(std::make_shared()); - rclcpp::shutdown(); - return 0; -} diff --git a/ros_ws/src/airstack_common/src/tflib.cpp b/ros_ws/src/airstack_common/src/tflib.cpp index 9889e151..b5cf2270 100644 --- a/ros_ws/src/airstack_common/src/tflib.cpp +++ b/ros_ws/src/airstack_common/src/tflib.cpp @@ -62,6 +62,12 @@ namespace tflib { // --------------------------------- Utils ---------------------------------- // ========================================================================== + /** + * @brief Get the stabilized object by setting roll and pitch to 0 + * + * @param q + * @return tf2::Quaternion + */ tf2::Quaternion get_stabilized(tf2::Quaternion q){ tf2::Quaternion stabilized_q; double roll, pitch, yaw; diff --git a/ros_ws/src/airstack_msgs/CMakeLists.txt b/ros_ws/src/airstack_msgs/CMakeLists.txt index 4de615a4..d568e42a 100644 --- a/ros_ws/src/airstack_msgs/CMakeLists.txt +++ b/ros_ws/src/airstack_msgs/CMakeLists.txt @@ -16,6 +16,11 @@ rosidl_generate_interfaces(${PROJECT_NAME} "msg/FixedTrajectory.msg" "msg/TrajectoryXYZVYaw.msg" "msg/WaypointXYZVYaw.msg" + "msg/KeepOutZone.msg" + "msg/PlanRequest.msg" + "msg/SearchMissionRequest.msg" + "msg/SearchPrior.msg" + "msg/TaskAssignment.msg" "srv/RobotCommand.srv" "srv/TrajectoryMode.srv" "srv/TakeoffLandingCommand.srv" diff --git a/ros_ws/src/airstack_msgs/msg/KeepOutZone.msg b/ros_ws/src/airstack_msgs/msg/KeepOutZone.msg new file mode 100644 index 00000000..87c0f5d1 --- /dev/null +++ b/ros_ws/src/airstack_msgs/msg/KeepOutZone.msg @@ -0,0 +1,6 @@ +std_msgs/Header header +float64 x +float64 y +float64 z_min +float64 z_max +float64 radius \ No newline at end of file diff --git a/ros_ws/src/airstack_msgs/msg/PlanRequest.msg b/ros_ws/src/airstack_msgs/msg/PlanRequest.msg new file mode 100644 index 00000000..5306fc5d --- /dev/null +++ b/ros_ws/src/airstack_msgs/msg/PlanRequest.msg @@ -0,0 +1,21 @@ +std_msgs/Header header + +# Initial condition information: +geometry_msgs/Pose start_pose #Plan from position and orientation +geometry_msgs/Vector3 wind_speed #Wind speed in m/s +float32 max_planning_time #seconds +float32 maximum_range #budget + +#Constraints and objectives: +float32 desired_speed #Desired flight speed in m/s +geometry_msgs/Polygon search_bounds + +#Prior information: +SearchPrior[] search_priors +KeepOutZone[] keep_out_zones + +# Replan flag +bool clear_tree + +# Scenario +uint32 scenario # To match up with the correct plan \ No newline at end of file diff --git a/ros_ws/src/airstack_msgs/msg/SearchMissionRequest.msg b/ros_ws/src/airstack_msgs/msg/SearchMissionRequest.msg new file mode 100644 index 00000000..96eb91b6 --- /dev/null +++ b/ros_ws/src/airstack_msgs/msg/SearchMissionRequest.msg @@ -0,0 +1,4 @@ +std_msgs/Header header +geometry_msgs/Polygon search_bounds +SearchPrior[] search_priors +KeepOutZone[] keep_out_zones \ No newline at end of file diff --git a/ros_ws/src/airstack_msgs/msg/SearchPrior.msg b/ros_ws/src/airstack_msgs/msg/SearchPrior.msg new file mode 100644 index 00000000..746dc982 --- /dev/null +++ b/ros_ws/src/airstack_msgs/msg/SearchPrior.msg @@ -0,0 +1,13 @@ +std_msgs/Header header + +uint8 POLYGON_PRIOR = 1 # must be convex polygon +uint8 LINE_SEG_PRIOR = 2 +uint8 POINT_PRIOR = 3 +uint8 grid_prior_type + +geometry_msgs/Polygon points_list # polygon, line seg, or list of point +float32 value # initial value for the polygon, line seg, or point + +# Optional values +float64 priority # Higher values mean higher priority. If empty then the priority is set to 1.0 +uint8 sensor_model_id # the type of sensor model for that region type. Default is 0 \ No newline at end of file diff --git a/ros_ws/src/airstack_msgs/msg/TaskAssignment.msg b/ros_ws/src/airstack_msgs/msg/TaskAssignment.msg new file mode 100644 index 00000000..86927420 --- /dev/null +++ b/ros_ws/src/airstack_msgs/msg/TaskAssignment.msg @@ -0,0 +1,8 @@ +std_msgs/Header header + +uint8 SEARCH = 1 +uint8 TRACK = 2 +uint8 assigned_task_type + +uint32 assigned_task_number # index of the target to track? +PlanRequest plan_request \ No newline at end of file diff --git a/ros_ws/src/ground_control_station/gcs_bringup/.gitkeep b/ros_ws/src/ground_control_station/gcs_bringup/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/ros_ws/src/ground_control_station/mission_manager/CMakeLists.txt b/ros_ws/src/ground_control_station/mission_manager/CMakeLists.txt new file mode 100644 index 00000000..91b5b78e --- /dev/null +++ b/ros_ws/src/ground_control_station/mission_manager/CMakeLists.txt @@ -0,0 +1,62 @@ +cmake_minimum_required(VERSION 3.8) +project(mission_manager) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(rclcpp REQUIRED) +find_package(std_msgs REQUIRED) +find_package(airstack_msgs REQUIRED) +find_package(grid_map_ros REQUIRED) + + +add_executable(mission_manager_node + src/mission_manager_node.cpp + src/MissionManager.cpp + src/BeliefMap.cpp) + +add_executable(example_search_request_node + src/example_search_request.cpp) + +ament_target_dependencies(mission_manager_node rclcpp std_msgs airstack_msgs grid_map_ros) +ament_target_dependencies(example_search_request_node rclcpp airstack_msgs) + +target_include_directories(mission_manager_node PUBLIC + $ + $) + +target_include_directories(example_search_request_node PUBLIC + $ + $) + +target_compile_features(mission_manager_node PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 +target_compile_features(example_search_request_node PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 + +install(TARGETS mission_manager_node + DESTINATION lib/${PROJECT_NAME}) + +install(TARGETS example_search_request_node + DESTINATION lib/${PROJECT_NAME}) + +install( + DIRECTORY launch config + DESTINATION share/${PROJECT_NAME} +) + + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +ament_package() diff --git a/ros_ws/src/ground_control_station/mission_manager/README.md b/ros_ws/src/ground_control_station/mission_manager/README.md new file mode 100644 index 00000000..c940d451 --- /dev/null +++ b/ros_ws/src/ground_control_station/mission_manager/README.md @@ -0,0 +1,18 @@ +# Mission Manager + +This package handles the allocation of tasks for the multiple agents. +It assigned agents to search or track. For search it divides the search space. + +``` +colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release +``` + +Debugging this node +``` +ros2 run --prefix 'gdb -ex run --args' mission_manager mission_manager_node +``` + +``` +ros2 launch mission_manager mission_manager_launch.py +ros2 run rviz2 rviz2 +``` \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/planning/global/central/config/core.rviz b/ros_ws/src/ground_control_station/mission_manager/config/mission_manager.rviz similarity index 57% rename from ros_ws/src/robot/autonomy/planning/global/central/config/core.rviz rename to ros_ws/src/ground_control_station/mission_manager/config/mission_manager.rviz index 579bee4d..c9e240f6 100644 --- a/ros_ws/src/robot/autonomy/planning/global/central/config/core.rviz +++ b/ros_ws/src/ground_control_station/mission_manager/config/mission_manager.rviz @@ -6,10 +6,9 @@ Panels: Expanded: - /Global Options1 - /Status1 - - /TF1/Frames1 - - /Odometry1/Topic1 + - /GridMap1 Splitter Ratio: 0.5 - Tree Height: 481 + Tree Height: 872 - Class: rviz_common/Selection Name: Selection - Class: rviz_common/Tool Properties @@ -49,94 +48,31 @@ Visualization Manager: Plane Cell Count: 10 Reference Frame: Value: true - - Class: rviz_default_plugins/TF + - Alpha: 1 + Autocompute Intensity Bounds: false + Class: grid_map_rviz_plugin/GridMap + Color: 200; 200; 200 + Color Layer: probability + Color Transformer: IntensityLayer Enabled: true - Frame Timeout: 15 - Frames: - All Enabled: true - Marker Scale: 1 - Name: TF - Show Arrows: true - Show Axes: true - Show Names: true - Tree: - {} - Update Interval: 0 - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: Traj Vis - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: trajectory_vis - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: Traj Debug - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: trajectory_controller_debug_markers - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: Traj Segment - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: trajectory_segment_vis - Value: true - - Angle Tolerance: 0 - Class: rviz_default_plugins/Odometry - Covariance: - Orientation: - Alpha: 0.5 - Color: 255; 255; 127 - Color Style: Unique - Frame: Local - Offset: 1 - Scale: 1 - Value: true - Position: - Alpha: 0.30000001192092896 - Color: 204; 51; 204 - Scale: 1 - Value: true - Value: true - Enabled: true - Keep: 1 - Name: Odometry - Position Tolerance: 0 - Shape: - Alpha: 1 - Axes Length: 1 - Axes Radius: 0.10000000149011612 - Color: 255; 25; 0 - Head Length: 0.30000001192092896 - Head Radius: 0.10000000149011612 - Shaft Length: 1 - Shaft Radius: 0.05000000074505806 - Value: Axes + Height Layer: probability + Height Transformer: GridMapLayer + History Length: 1 + Invert Rainbow: false + Max Color: 255; 255; 255 + Max Intensity: 2 + Min Color: 0; 0; 0 + Min Intensity: 0 + Name: GridMap + Show Grid Lines: true Topic: Depth: 5 Durability Policy: Volatile Filter size: 10 History Policy: Keep Last Reliability Policy: Reliable - Value: odometry + Value: /search_map_basestation + Use Rainbow: true Value: true Enabled: true Global Options: @@ -184,33 +120,33 @@ Visualization Manager: Views: Current: Class: rviz_default_plugins/Orbit - Distance: 11.33234691619873 + Distance: 660.692138671875 Enable Stereo Rendering: Stereo Eye Separation: 0.05999999865889549 Stereo Focal Distance: 1 Swap Stereo Eyes: false Value: false Focal Point: - X: 0 - Y: 0 - Z: 0 - Focal Shape Fixed Size: false + X: 92.63066101074219 + Y: 60.50679016113281 + Z: -87.42770385742188 + Focal Shape Fixed Size: true Focal Shape Size: 0.05000000074505806 Invert Z Axis: false Name: Current View Near Clip Distance: 0.009999999776482582 - Pitch: 0.695398211479187 + Pitch: 1.5047963857650757 Target Frame: Value: Orbit (rviz) - Yaw: 0.8153982162475586 + Yaw: 4.693580150604248 Saved: ~ Window Geometry: Displays: collapsed: false - Height: 772 + Height: 1163 Hide Left Dock: false - Hide Right Dock: true - QMainWindow State: 000000ff00000000fd0000000400000000000001560000026afc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003b0000026a000000c700fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f000002b4fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000003b000002b4000000a000fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000005040000003efc0100000002fb0000000800540069006d00650100000000000005040000025300fffffffb0000000800540069006d00650100000000000004500000000000000000000003a80000026a00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Hide Right Dock: false + QMainWindow State: 000000ff00000000fd0000000400000000000001bf000003f1fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003b000003f1000000c700fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f000003f1fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003b000003f1000000a000fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000007800000003efc0100000002fb0000000800540069006d00650100000000000007800000025300fffffffb0000000800540069006d00650100000000000004500000000000000000000004a6000003f100000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 Selection: collapsed: false Time: @@ -218,7 +154,7 @@ Window Geometry: Tool Properties: collapsed: false Views: - collapsed: true - Width: 1284 - X: 73 - Y: 29 + collapsed: false + Width: 1920 + X: 1920 + Y: 0 diff --git a/ros_ws/src/ground_control_station/mission_manager/include/mission_manager/BeliefMap.h b/ros_ws/src/ground_control_station/mission_manager/include/mission_manager/BeliefMap.h new file mode 100644 index 00000000..60c5bbae --- /dev/null +++ b/ros_ws/src/ground_control_station/mission_manager/include/mission_manager/BeliefMap.h @@ -0,0 +1,43 @@ +#ifndef BELIEFMAP_H +#define BELIEFMAP_H + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "airstack_msgs/msg/search_mission_request.hpp" +#include "airstack_msgs/msg/search_prior.hpp" +#include "airstack_msgs/msg/keep_out_zone.hpp" + +class BeliefMap +{ +public: + + std::vector> polygon_bounds; + + // std::vector prior_list; // list of priors + + // map of structs to keep track of various traits at each grid point + // std::vector> priority; + // std::vector> sensor_model_id; + + BeliefMap(); + bool reset_map(rclcpp::Logger logger, airstack_msgs::msg::SearchMissionRequest search_mission_request); + grid_map::GridMap map_; + + bool is_initialized() const + { + return !map_.getSize()(0) == 0; + } + +private: + +}; + +#endif // BELIEFMAP_H \ No newline at end of file diff --git a/ros_ws/src/ground_control_station/mission_manager/include/mission_manager/MissionManager.h b/ros_ws/src/ground_control_station/mission_manager/include/mission_manager/MissionManager.h new file mode 100644 index 00000000..eac347b3 --- /dev/null +++ b/ros_ws/src/ground_control_station/mission_manager/include/mission_manager/MissionManager.h @@ -0,0 +1,34 @@ +#ifndef MISSIONMANAGER_H_INCLUDED +#define MISSIONMANAGER_H_INCLUDED + +#include +#include +#include +#include +#include +#include + +#include "rclcpp/rclcpp.hpp" +#include "std_msgs/msg/string.hpp" +#include "airstack_msgs/msg/search_mission_request.hpp" +#include "airstack_msgs/msg/task_assignment.hpp" +#include "mission_manager/BeliefMap.h" + +class MissionManager +{ + public: + MissionManager(int max_number_agents); + + std::vector assign_tasks(rclcpp::Logger logger) const; + bool check_agent_changes(rclcpp::Logger logger, uint8_t robot_id, rclcpp::Time current_time); + bool check_target_changes(rclcpp::Logger logger, std::string target_list, rclcpp::Time current_time); + std::vector get_valid_agents() const { return valid_agents_; } + BeliefMap belief_map_; // TODO make private + + private: + int max_number_agents_; + std::vector time_of_last_call_; + std::vector valid_agents_; + + }; + #endif /* MISSIONMANAGER_H_INCLUDED */ \ No newline at end of file diff --git a/ros_ws/src/ground_control_station/mission_manager/include/mission_manager/mission_manager_node.h b/ros_ws/src/ground_control_station/mission_manager/include/mission_manager/mission_manager_node.h new file mode 100644 index 00000000..42525947 --- /dev/null +++ b/ros_ws/src/ground_control_station/mission_manager/include/mission_manager/mission_manager_node.h @@ -0,0 +1,170 @@ +#ifndef MISSION_MANAGER_NODE_H_INCLUDED +#define MISSION_MANAGER_NODE_H_INCLUDED + +#include +#include +#include +#include +#include +#include + +#include "rclcpp/rclcpp.hpp" +#include "std_msgs/msg/string.hpp" +#include "airstack_msgs/msg/search_mission_request.hpp" +#include "airstack_msgs/msg/task_assignment.hpp" +#include "mission_manager/BeliefMap.h" +#include "mission_manager/MissionManager.h" + +/* +Subscirbers +- all the drones odoms +- search map updates +- targets + +Publisher +- task assignment with plan request. Be together to avoid timing issues + +When receive mission request or change in number of targets or change in number of drones +- check how many targets +- check how many drones +- see how many left for search +- divide up the space based on number of drones +- assign nearest drone to each task (targets and search regions) +- send plan request to each drone +*/ + + +class MissionManagerNode : public rclcpp::Node +{ + public: + MissionManagerNode() + : Node("mission_manager"), count_(0) + { + mission_subscriber_ = this->create_subscription( + "search_mission_request", 1, std::bind(&MissionManagerNode::search_mission_request_callback, this, std::placeholders::_1)); + + // Create subscribers and publishers for max number of agents + for (uint8_t i = 0; i < max_number_agents_; i++) + { + std::string topic_name = "agent_" + std::to_string(i) + "/odom"; + agent_odoms_subs_.push_back( + this->create_subscription( + topic_name, 1, + [this, i](const std_msgs::msg::String::SharedPtr msg) { + this->agent_odom_callback(msg, i); + } + ) + ); + + + + std::string agent_topic = "agent_" + std::to_string(i) + "/plan_request"; + plan_request_pubs_.push_back( + this->create_publisher(agent_topic, 10)); + } + + tracked_targets_sub_ = this->create_subscription( + "tracked_targets", 1, std::bind(&MissionManagerNode::tracked_targets_callback, this, std::placeholders::_1)); + + search_map_sub_ = this->create_subscription( + "search_map_updates", 1, std::bind(&MissionManagerNode::search_map_callback, this, std::placeholders::_1)); + + mission_manager_ = std::make_shared(this->max_number_agents_); + + // TODO: set param for rate, make sure not communicated over network + search_map_publisher_ = this->create_publisher( + "search_map_basestation", rclcpp::QoS(1).transient_local()); + timer_ = this->create_wall_timer( + std::chrono::seconds(1), std::bind(&MissionManagerNode::search_map_publisher, this)); + } + + private: + /* --- ROS SPECIFIC --- */ + + // Publisher + std::vector::SharedPtr> plan_request_pubs_; + rclcpp::Publisher::SharedPtr search_map_publisher_; + + // Subscribers + rclcpp::Subscription::SharedPtr mission_subscriber_; + rclcpp::Subscription::SharedPtr tracked_targets_sub_; + std::vector::SharedPtr> agent_odoms_subs_; + rclcpp::Subscription::SharedPtr search_map_sub_; + + + /* --- MEMBER ATTRIBUTES --- */ + + size_t count_; + rclcpp::TimerBase::SharedPtr timer_; + int max_number_agents_ = 5; // TODO: get from param server + airstack_msgs::msg::SearchMissionRequest latest_search_mission_request_; + std::shared_ptr mission_manager_; + + void publish_tasks(std::vector tasks) const + { + std::vector valid_agents = this->mission_manager_->get_valid_agents(); + for (uint8_t i = 0; i < this->max_number_agents_; i++) + { + if (valid_agents[i]) + { + plan_request_pubs_[i]->publish(tasks[i]); + } + } + } + + void search_map_publisher() + { + if (this->mission_manager_->belief_map_.is_initialized()) + { + this->mission_manager_->belief_map_.map_.setTimestamp(this->now().nanoseconds()); + std::unique_ptr message; + message = grid_map::GridMapRosConverter::toMessage(this->mission_manager_->belief_map_.map_); + RCLCPP_DEBUG( + this->get_logger(), "Publishing grid map (timestamp %f).", + rclcpp::Time(message->header.stamp).nanoseconds() * 1e-9); + search_map_publisher_->publish(std::move(message)); + } + } + + void search_mission_request_callback(const airstack_msgs::msg::SearchMissionRequest::SharedPtr msg) + { + RCLCPP_INFO(this->get_logger(), "Received new search mission request"); + latest_search_mission_request_ = *msg; + + // TODO: clear the map knowledge? Only if the search area has changed? + + // TODO: visualize the seach mission request + this->mission_manager_->belief_map_.reset_map(this->get_logger(), *msg); + this->publish_tasks(this->mission_manager_->assign_tasks(this->get_logger())); + } + + void agent_odom_callback(const std_msgs::msg::String::SharedPtr msg, const uint8_t &robot_id) + { + RCLCPP_INFO(this->get_logger(), "Received agent odom '%s'", msg->data.c_str()); + if (this->mission_manager_->check_agent_changes(this->get_logger(), robot_id, this->now())) + { + this->publish_tasks(this->mission_manager_->assign_tasks(this->get_logger())); + } + } + + void tracked_targets_callback(const std_msgs::msg::String::SharedPtr msg) + { + RCLCPP_INFO(this->get_logger(), "Received target track list '%s'", msg->data.c_str()); + // TODO: save the list of tracked target + + // Check if change in the number of targets or id numbers + if (this->mission_manager_->check_target_changes(this->get_logger(), msg->data, this->now())) + { + this->publish_tasks(this->mission_manager_->assign_tasks(this->get_logger())); + } + } + + void search_map_callback(const std_msgs::msg::String::SharedPtr msg) const + { + RCLCPP_INFO(this->get_logger(), "Received search map '%s'", msg->data.c_str()); + + // TODO: save the search map using that class + } + +}; +#endif /* MISSION_MANAGER_NODE_H_INCLUDED */ \ No newline at end of file diff --git a/ros_ws/src/ground_control_station/mission_manager/launch/mission_manager_launch.py b/ros_ws/src/ground_control_station/mission_manager/launch/mission_manager_launch.py new file mode 100644 index 00000000..d077ddba --- /dev/null +++ b/ros_ws/src/ground_control_station/mission_manager/launch/mission_manager_launch.py @@ -0,0 +1,46 @@ +import os +from ament_index_python.packages import get_package_share_directory +from launch import LaunchDescription +from launch_ros.actions import Node + +def generate_launch_description(): + + # Get the package share directory + package_share_directory = get_package_share_directory('mission_manager') + print(package_share_directory) + + # Define the path to the configuration file + visualization_config_file = os.path.join(package_share_directory, 'config', 'grid_map.yaml') + rviz_config_file = os.path.join(package_share_directory, 'config', 'mission_manager.rviz') + + mission_manager = Node( + package='mission_manager', + # namespace='mission_manager', + executable='mission_manager_node', + output="screen", + name='mission_manager_node', + ) + + # grid_map_visualization_node = Node( + # package='grid_map_visualization', + # executable='grid_map_visualization', + # name='grid_map_visualization', + # output='screen', + # parameters=[visualization_config_file] + # ) + + rviz2_node = Node( + package='rviz2', + executable='rviz2', + name='rviz2', + output='screen', + arguments=['-d', rviz_config_file] + ) + + ld = LaunchDescription() + + ld.add_action(rviz2_node) + # ld.add_action(grid_map_visualization_node) + ld.add_action(mission_manager) + + return ld \ No newline at end of file diff --git a/ros_ws/src/ground_control_station/mission_manager/package.xml b/ros_ws/src/ground_control_station/mission_manager/package.xml new file mode 100644 index 00000000..ca599679 --- /dev/null +++ b/ros_ws/src/ground_control_station/mission_manager/package.xml @@ -0,0 +1,27 @@ + + + + mission_manager + 0.0.0 + + This package handles the allocation of tasks for the multiple agents. + It assigned agents to search or track. For search it divides the search space. + + root + TODO: License declaration + + ament_cmake + rclcpp + std_msgs + airstack_msgs + grid_map + + ament_lint_auto + ament_lint_common + + ros2launch + + + ament_cmake + + diff --git a/ros_ws/src/ground_control_station/mission_manager/src/BeliefMap.cpp b/ros_ws/src/ground_control_station/mission_manager/src/BeliefMap.cpp new file mode 100644 index 00000000..33b5ba07 --- /dev/null +++ b/ros_ws/src/ground_control_station/mission_manager/src/BeliefMap.cpp @@ -0,0 +1,91 @@ +#include "mission_manager/BeliefMap.h" + + +BeliefMap::BeliefMap() +: map_(std::vector({"probability"})) +{ } + +bool BeliefMap::reset_map(rclcpp::Logger logger, airstack_msgs::msg::SearchMissionRequest search_mission_request) +{ + RCLCPP_INFO(logger, "Resetting map"); + // Setting up map. + // Get the max and min x and y values from the search area + double resolution = 5.0; + double min_x = DBL_MAX; + double max_x = -DBL_MAX; + double min_y = DBL_MAX; + double max_y = -DBL_MAX; + for (const auto& point : search_mission_request.search_bounds.points) + { + if (point.x < min_x) + { + min_x = point.x; + } + if (point.x > max_x) + { + max_x = point.x; + } + if (point.y < min_y) + { + min_y = point.y; + } + if (point.y > max_y) + { + max_y = point.y; + } + } + // TODO param for grid resolution + // TODO fix coordinate frames. Match airstack to IPP to grid map. grid map is NWU, IPP is ENU, airstack is ... + // round to nearest resolution + min_x = std::floor(min_x / resolution) * resolution; + max_x = std::ceil(max_x / resolution) * resolution; + min_y = std::floor(min_y / resolution) * resolution; + max_y = std::ceil(max_y / resolution) * resolution; + double x_length = std::abs(max_x - min_x); + double y_length = std::abs(max_y - min_y); + + map_.setGeometry(grid_map::Length(x_length, y_length), + resolution, + grid_map::Position(std::round(min_x + x_length / 2.0), + std::round(min_y + y_length / 2.0))); + map_.setFrameId("map"); // TODO update to correct frame or set TF frame somewhere. There is already a map frame + map_.clearAll(); + + for (auto& search_prior : search_mission_request.search_priors) + { + if (search_prior.grid_prior_type == airstack_msgs::msg::SearchPrior::POLYGON_PRIOR) + { + grid_map::Polygon polygon; + polygon.setFrameId(map_.getFrameId()); + for (const auto& point : search_prior.points_list.points) + { + polygon.addVertex(grid_map::Position(point.x, point.y)); // TODO coordinate frame + } + for (grid_map::PolygonIterator iterator(map_, polygon); + !iterator.isPastEnd(); ++iterator) + { + float& current_value = map_.at("probability", *iterator); + if (std::isnan(current_value) || current_value < search_prior.value) { + current_value = search_prior.value; + } + } + } + else if (search_prior.grid_prior_type == airstack_msgs::msg::SearchPrior::LINE_SEG_PRIOR) + { + // TODO + } + else if (search_prior.grid_prior_type == airstack_msgs::msg::SearchPrior::POINT_PRIOR) + { + // TODO + } + else + { + RCLCPP_ERROR(logger, "Unknown grid prior type"); + } + } + + + return true; +} + +// TODO subscribe to the shared search areas for updates. \ No newline at end of file diff --git a/ros_ws/src/ground_control_station/mission_manager/src/MissionManager.cpp b/ros_ws/src/ground_control_station/mission_manager/src/MissionManager.cpp new file mode 100644 index 00000000..739dd5ee --- /dev/null +++ b/ros_ws/src/ground_control_station/mission_manager/src/MissionManager.cpp @@ -0,0 +1,78 @@ +#include "mission_manager/MissionManager.h" + +/* +Empty Constructor +*/ +MissionManager::MissionManager(int max_number_agents) : max_number_agents_(max_number_agents) +{ + rclcpp::Time default_time(0, 0, RCL_ROS_TIME); + time_of_last_call_.resize(max_number_agents_, default_time); + valid_agents_.resize(max_number_agents_, false); +} + +bool MissionManager::check_agent_changes(rclcpp::Logger logger, uint8_t robot_id, rclcpp::Time current_time) +{ + RCLCPP_INFO(logger, "Checking agent changes"); + + time_of_last_call_[robot_id] = current_time; + + // TODO this logic does not need to happen every time an odom is received + + // Check how many agents have reported in the last x seconds + // If change in the agents reporting, reassign tasks + std::vector curr_valid_agents{false, false, false, false, false}; + rclcpp::Duration time_till_agent_not_valid = rclcpp::Duration::from_seconds(10.0); + for (uint8_t i = 0; i < max_number_agents_; i++) + { + if (current_time - time_of_last_call_[i] < time_till_agent_not_valid) + { + curr_valid_agents[i] = true; + } + } + bool change_in_agents = false; + if (curr_valid_agents != valid_agents_) + { + change_in_agents = true; + } + valid_agents_ = curr_valid_agents; + + return change_in_agents; +} + +bool MissionManager::check_target_changes(rclcpp::Logger logger, std::string target_list, rclcpp::Time current_time) +{ + // TODO + RCLCPP_INFO_STREAM(logger, "Checking target changes at time " + << current_time.nanoseconds() << " with target list " << target_list); + return false; +} + + +// TODO +std::vector MissionManager::assign_tasks(rclcpp::Logger logger) const +{ + RCLCPP_INFO(logger, "Assigning tasks to drones"); + + // Find how many active robots + int number_of_agents = std::accumulate(valid_agents_.begin(), valid_agents_.end(), 0); + + // Decide how many search vs track tasks to assign + int number_of_track_tasks = 0; // TODO + int number_of_search_tasks = std::max(number_of_agents - number_of_track_tasks, 0); + RCLCPP_INFO_STREAM(logger, "Assigning " << number_of_search_tasks << " search tasks and " << number_of_track_tasks << " track tasks"); + + // Send out the request for the search map division + // TODO Nayana + + // Assign the search and track tasks to drones based on distance to the task + + // return the msg to be published + std::vector task_assignments(this->max_number_agents_); + for (int i = 0; i < this->max_number_agents_; i++) + { + task_assignments[i].assigned_task_type = airstack_msgs::msg::TaskAssignment::SEARCH; + task_assignments[i].assigned_task_number = i; + } + + return task_assignments; +} \ No newline at end of file diff --git a/ros_ws/src/ground_control_station/mission_manager/src/example_search_request.cpp b/ros_ws/src/ground_control_station/mission_manager/src/example_search_request.cpp new file mode 100644 index 00000000..f44c03bf --- /dev/null +++ b/ros_ws/src/ground_control_station/mission_manager/src/example_search_request.cpp @@ -0,0 +1,224 @@ +#include +#include +#include +#include + +#include "rclcpp/rclcpp.hpp" +#include "std_msgs/msg/string.hpp" +#include "airstack_msgs/msg/search_mission_request.hpp" +#include "airstack_msgs/msg/search_prior.hpp" +#include "airstack_msgs/msg/keep_out_zone.hpp" +#include "geometry_msgs/msg/polygon.hpp" +#include "geometry_msgs/msg/point32.hpp" + + +using namespace std::chrono_literals; + +/* This example creates a subclass of Node and uses std::bind() to register a +* member function as a callback from the timer. */ + +class MinimalPublisher : public rclcpp::Node +{ + public: + MinimalPublisher() + : Node("minimal_publisher") + { + publisher_ = this->create_publisher("search_mission_request", 10); + airstack_msgs::msg::SearchMissionRequest msg; + msg.header.stamp = this->now(); + msg.header.frame_id = "map"; // TODO + + geometry_msgs::msg::Polygon search_bounds; + geometry_msgs::msg::Point32 point; + point.x = 0; + point.y = 0; + point.z = 0; + search_bounds.points.push_back(point); + point.x = 100; + point.y = -28; + point.z = 0; + search_bounds.points.push_back(point); + point.x = 230; + point.y = 0; + point.z = 0; + search_bounds.points.push_back(point); + point.x = 250; + point.y = 100; + point.z = 0; + search_bounds.points.push_back(point); + point.x = 130; + point.y = 156; + point.z = 0; + search_bounds.points.push_back(point); + point.x = 110; + point.y = 191; + point.z = 0; + search_bounds.points.push_back(point); + point.x = -40; + point.y = 141; + point.z = 0; + search_bounds.points.push_back(point); + msg.search_bounds = search_bounds; + + airstack_msgs::msg::SearchPrior search_prior; + search_prior.value = 0.5; + search_prior.priority = 10.0; + search_prior.sensor_model_id = 0; + search_prior.grid_prior_type = 1; + search_prior.header.frame_id = "local_enu"; + geometry_msgs::msg::Polygon grid_bounds; + point.x = 0; + point.y = 160; + point.z = 0; + grid_bounds.points.push_back(point); + point.x = 12; + point.y = 135; + point.z = 0; + grid_bounds.points.push_back(point); + point.x = 92; + point.y = 150; + point.z = 0; + grid_bounds.points.push_back(point); + point.x = 80; + point.y = 175; + point.z = 0; + grid_bounds.points.push_back(point); + search_prior.points_list = grid_bounds; + msg.search_priors.push_back(search_prior); + + airstack_msgs::msg::SearchPrior search_prior2; + search_prior2.value = 0.2; + search_prior2.priority = 1.0; + search_prior2.sensor_model_id = 0; + search_prior2.grid_prior_type = 1; + search_prior2.header.frame_id = "local_enu"; + geometry_msgs::msg::Polygon points_list; + point.x = 0; + point.y = 0; + point.z = 0; + points_list.points.push_back(point); + point.x = 100; + point.y = -28; + point.z = 0; + points_list.points.push_back(point); + point.x = 230; + point.y = 0; + point.z = 0; + points_list.points.push_back(point); + point.x = 250; + point.y = 100; + point.z = 0; + points_list.points.push_back(point); + point.x = 130; + point.y = 156; + point.z = 0; + points_list.points.push_back(point); + point.x = 110; + point.y = 191; + point.z = 0; + points_list.points.push_back(point); + point.x = -40; + point.y = 141; + point.z = 0; + points_list.points.push_back(point); + search_prior2.points_list = points_list; + msg.search_priors.push_back(search_prior2); + + + + publisher_->publish(msg); + RCLCPP_INFO(this->get_logger(), "Publishing example search request"); + // Shutdown after publishing + // rclcpp::shutdown(); + } + + private: + rclcpp::Publisher::SharedPtr publisher_; +}; + +int main(int argc, char * argv[]) +{ + rclcpp::init(argc, argv); + rclcpp::spin(std::make_shared()); + rclcpp::shutdown(); + return 0; +} + + +/* + +target_priors: +- grid_prior: + bounds: + points: + - x: 0 + y: 0 + z: 0 + - x: 100 + y: -28 + z: 0 + - x: 230 + y: 0 + z: 0 + - x: 250 + y: 100 + z: 0 + - x: 130 + y: 156 + z: 0 + - x: 110 + y: 191 + z: 0 + - x: -40 + y: 141 + z: 0 + confidence: 0.2 + grid_prior_type: 1 + header: + frame_id: local_enu + priority: 1.0 + sensor_model_id: 0 +- grid_prior: + bounds: + points: + - x: 0 + y: 160 + z: 0 + - x: 12 + y: 135 + z: 0 + - x: 92 + y: 150 + z: 0 + - x: 80 + y: 175 + z: 0 + confidence: 0.5 + grid_prior_type: 1 + header: + frame_id: local_enu + priority: 10.0 + sensor_model_id: 0 + +# keep out zone +keep_out_zones: + - + header: + frame_id: "local_enu" + x: 0 + y: 139 + radius: 15 + - + header: + frame_id: "local_enu" + x: 192 + y: -21 + radius: 10 + - + header: + frame_id: "local_enu" + x: 210 + y: -10 + radius: 8 + +*/ \ No newline at end of file diff --git a/ros_ws/src/ground_control_station/mission_manager/src/mission_manager_node.cpp b/ros_ws/src/ground_control_station/mission_manager/src/mission_manager_node.cpp new file mode 100644 index 00000000..d3038e53 --- /dev/null +++ b/ros_ws/src/ground_control_station/mission_manager/src/mission_manager_node.cpp @@ -0,0 +1,10 @@ + +#include "mission_manager/mission_manager_node.h" + +int main(int argc, char * argv[]) +{ + rclcpp::init(argc, argv); + rclcpp::spin(std::make_shared()); + rclcpp::shutdown(); + return 0; +} diff --git a/ros_ws/src/robot/autonomy/0_interface/interface_bringup/CMakeLists.txt b/ros_ws/src/robot/autonomy/0_interface/interface_bringup/CMakeLists.txt new file mode 100644 index 00000000..d93f3f0d --- /dev/null +++ b/ros_ws/src/robot/autonomy/0_interface/interface_bringup/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.8) +project(interface_bringup) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +# uncomment the following section in order to fill in +# further dependencies manually. +# find_package( REQUIRED) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +# Install files. +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY rviz DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY params DESTINATION share/${PROJECT_NAME}) + +ament_package() diff --git a/simulation/extension_docker/dronekit-python/LICENSE b/ros_ws/src/robot/autonomy/0_interface/interface_bringup/LICENSE similarity index 99% rename from simulation/extension_docker/dronekit-python/LICENSE rename to ros_ws/src/robot/autonomy/0_interface/interface_bringup/LICENSE index e06d2081..d6456956 100644 --- a/simulation/extension_docker/dronekit-python/LICENSE +++ b/ros_ws/src/robot/autonomy/0_interface/interface_bringup/LICENSE @@ -1,4 +1,5 @@ -Apache License + + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -178,7 +179,7 @@ Apache License APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -186,7 +187,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -199,4 +200,3 @@ Apache License WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - diff --git a/ros_ws/src/robot/autonomy/0_interface/interface_bringup/launch/interface.launch.xml b/ros_ws/src/robot/autonomy/0_interface/interface_bringup/launch/interface.launch.xml new file mode 100644 index 00000000..fc855b77 --- /dev/null +++ b/ros_ws/src/robot/autonomy/0_interface/interface_bringup/launch/interface.launch.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/0_interface/interface_bringup/package.xml b/ros_ws/src/robot/autonomy/0_interface/interface_bringup/package.xml new file mode 100644 index 00000000..415a2be5 --- /dev/null +++ b/ros_ws/src/robot/autonomy/0_interface/interface_bringup/package.xml @@ -0,0 +1,18 @@ + + + + interface_bringup + 0.0.0 + TODO: Package description + andrew + Apache-2.0 + + ament_cmake + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/ros_ws/src/robot/autonomy/controls/mavros_interface/CMakeLists.txt b/ros_ws/src/robot/autonomy/0_interface/mavros_interface/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mavros_interface/CMakeLists.txt rename to ros_ws/src/robot/autonomy/0_interface/mavros_interface/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/0_interface/mavros_interface/include/mavros_interface/.gitkeep b/ros_ws/src/robot/autonomy/0_interface/mavros_interface/include/mavros_interface/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/ros_ws/src/robot/autonomy/controls/mavros_interface/package.xml b/ros_ws/src/robot/autonomy/0_interface/mavros_interface/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mavros_interface/package.xml rename to ros_ws/src/robot/autonomy/0_interface/mavros_interface/package.xml diff --git a/ros_ws/src/robot/autonomy/controls/mavros_interface/plugins.xml b/ros_ws/src/robot/autonomy/0_interface/mavros_interface/plugins.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mavros_interface/plugins.xml rename to ros_ws/src/robot/autonomy/0_interface/mavros_interface/plugins.xml diff --git a/ros_ws/src/robot/autonomy/controls/mavros_interface/scripts/position_setpoint_pub.py b/ros_ws/src/robot/autonomy/0_interface/mavros_interface/scripts/position_setpoint_pub.py similarity index 90% rename from ros_ws/src/robot/autonomy/controls/mavros_interface/scripts/position_setpoint_pub.py rename to ros_ws/src/robot/autonomy/0_interface/mavros_interface/scripts/position_setpoint_pub.py index 6f955f70..a47e2354 100755 --- a/ros_ws/src/robot/autonomy/controls/mavros_interface/scripts/position_setpoint_pub.py +++ b/ros_ws/src/robot/autonomy/0_interface/mavros_interface/scripts/position_setpoint_pub.py @@ -1,4 +1,6 @@ #!/usr/bin/python3 +import os + import rclpy from rclpy.node import Node from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSHistoryPolicy @@ -14,7 +16,7 @@ def __init__(self): history=QoSHistoryPolicy.RMW_QOS_POLICY_HISTORY_KEEP_LAST, depth=1) ''' - self.odom_subscriber = self.create_subscription(Odometry, 'tracking_point', self.odom_callback, 1) + self.odom_subscriber = self.create_subscription(Odometry, "/" + os.getenv('ROBOT_NAME', "") + '/trajectory_controller/tracking_point', self.odom_callback, 1) self.odom_publisher = self.create_publisher(PoseStamped, 'cmd_pose', 1) def odom_callback(self, msg): diff --git a/ros_ws/src/robot/autonomy/0_interface/mavros_interface/src/mavros_interface.cpp b/ros_ws/src/robot/autonomy/0_interface/mavros_interface/src/mavros_interface.cpp new file mode 100644 index 00000000..5fb9f05d --- /dev/null +++ b/ros_ws/src/robot/autonomy/0_interface/mavros_interface/src/mavros_interface.cpp @@ -0,0 +1,219 @@ +/** + * @file mavros_interface.cpp + * @author John Keller (jkeller2@andrew.cmu.edu), Andrew Jong + * (ajong@andrew.cmu.edu) + * @brief overrides the RobotInterface class to implement the PX4 flight control + * interface. + * @version 0.1 + * @date 2024-07-01 + * + * @copyright Copyright (c) 2024. This file is developed as part of software + * from the AirLab at the Robotics Institute at Carnegie Mellon University + * (https://theairlab.org). + * + */ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mavros_interface { + +class MAVROSInterface : public robot_interface::RobotInterface { + private: + // parameters + bool is_ardupilot; // TODO make this a launch file parameter + + bool is_state_received_ = false; + mavros_msgs::msg::State current_state_; + bool in_air = false; + rclcpp::Time in_air_start_time; + + // data from the flight control unit (FCU) + bool is_yaw_received_ = false; + float yaw_ = 0.0; + + rclcpp::CallbackGroup::SharedPtr service_callback_group; + rclcpp::Client::SharedPtr set_mode_client_; + rclcpp::Client::SharedPtr arming_client_; + rclcpp::Client::SharedPtr takeoff_client_; + + rclcpp::Publisher::SharedPtr attitude_target_pub_; + rclcpp::Publisher::SharedPtr local_position_target_pub_; + + rclcpp::Subscription::SharedPtr state_sub_; + rclcpp::Subscription::SharedPtr mavros_odometry_sub_; + + public: + MAVROSInterface() : RobotInterface("mavros_interface") { + // params + is_ardupilot = airstack::get_param(this, "is_ardupilot", false); + + // services + service_callback_group = + this->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive); + set_mode_client_ = this->create_client( + "mavros/set_mode", rmw_qos_profile_services_default, service_callback_group); + arming_client_ = this->create_client( + "mavros/cmd/arming", rmw_qos_profile_services_default, service_callback_group); + takeoff_client_ = this->create_client( + "mavros/cmd/takeoff", rmw_qos_profile_services_default, service_callback_group); + + // publishers + attitude_target_pub_ = this->create_publisher( + "mavros/setpoint_raw/attitude", 1); + local_position_target_pub_ = this->create_publisher( + "mavros/setpoint_position/local", 1); + + // subscribers + state_sub_ = this->create_subscription( + "mavros/state", 1, + std::bind(&MAVROSInterface::state_callback, this, std::placeholders::_1)); + } + + virtual ~MAVROSInterface() {} + + // Control Callbacks. Translates commands to fit the MAVROS API. + // The MAVROS API only has two types of control: Attitude Control and + // Position Control. + + void attitude_thrust_callback(const mav_msgs::msg::AttitudeThrust::SharedPtr cmd) override { + mavros_msgs::msg::AttitudeTarget mavros_cmd; + mavros_cmd.header.stamp = this->get_clock()->now(); //.to_msg(); + mavros_cmd.type_mask = mavros_msgs::msg::AttitudeTarget::IGNORE_ROLL_RATE | + mavros_msgs::msg::AttitudeTarget::IGNORE_PITCH_RATE | + mavros_msgs::msg::AttitudeTarget::IGNORE_YAW_RATE; + + mavros_cmd.thrust = cmd->thrust.z; + mavros_cmd.orientation = cmd->attitude; + + attitude_target_pub_->publish(mavros_cmd); + } + + void roll_pitch_yawrate_thrust_callback( + const mav_msgs::msg::RollPitchYawrateThrust::SharedPtr cmd) override { + if (!is_yaw_received_) { + RCLCPP_ERROR(this->get_logger(), + "roll_pitch_yawrate_thrust command called but haven't yet " + "received drone current yaw"); + return; + } + + mavros_msgs::msg::AttitudeTarget mavros_cmd; + mavros_cmd.header.stamp = this->get_clock()->now(); //.to_msg(); + mavros_cmd.type_mask = mavros_msgs::msg::AttitudeTarget::IGNORE_ROLL_RATE | + mavros_msgs::msg::AttitudeTarget::IGNORE_PITCH_RATE; + tf2::Matrix3x3 m; + m.setRPY(cmd->roll, cmd->pitch, yaw_); + tf2::Quaternion q; + m.getRotation(q); + mavros_cmd.body_rate.z = cmd->yaw_rate; + mavros_cmd.thrust = cmd->thrust.z; + + mavros_cmd.orientation.x = q.x(); + mavros_cmd.orientation.y = q.y(); + mavros_cmd.orientation.z = q.z(); + mavros_cmd.orientation.w = q.w(); + + attitude_target_pub_->publish(mavros_cmd); + } + + void pose_callback(const geometry_msgs::msg::PoseStamped::SharedPtr cmd) override { + if (!is_ardupilot || + (in_air && ((this->get_clock()->now() - in_air_start_time).seconds() > 5.))) { + geometry_msgs::msg::PoseStamped cmd_copy = *cmd; + local_position_target_pub_->publish(cmd_copy); + } + } + + // Command Functions + + bool request_control() override { + auto request = std::make_shared(); + if (is_ardupilot) + request->custom_mode = "GUIDED"; //"OFFBOARD"; + else + request->custom_mode = "OFFBOARD"; + + auto result = set_mode_client_->async_send_request(request); + std::cout << "waiting rc" << std::endl; + result.wait(); + std::cout << "done rc" << std::endl; + + return result.get()->mode_sent; + } + + bool arm() override { + auto request = std::make_shared(); + request->value = true; + + auto result = arming_client_->async_send_request(request); + std::cout << "waiting arm" << std::endl; + result.wait(); + std::cout << "done arm" << std::endl; + + return result.get()->success; + } + + bool disarm() override { + bool success = false; + + auto request = std::make_shared(); + request->value = false; + + auto result = arming_client_->async_send_request(request); + std::cout << "waiting disarm" << std::endl; + result.wait(); + std::cout << "done disarm" << std::endl; + + return result.get()->success; + } + + bool is_armed() override { return is_state_received_ && current_state_.armed; } + + bool has_control() override { + return is_state_received_ && + (is_ardupilot ? current_state_.mode == "GUIDED" : current_state_.mode == "OFFBOARD"); + } + + bool takeoff() override { + if (is_ardupilot) { + mavros_msgs::srv::CommandTOL::Request::SharedPtr takeoff_request = + std::make_shared(); + takeoff_request->altitude = 0.1; + + std::cout << "ardupilot takeoff 1" << std::endl; + auto takeoff_result = takeoff_client_->async_send_request(takeoff_request); + takeoff_result.wait(); + std::cout << "ardupilot takeoff 2" << std::endl; + if (takeoff_result.get()->success) { + in_air = true; + in_air_start_time = this->get_clock()->now(); + return true; + } else + return false; + } + + return true; + } + + bool land() override {} + + void state_callback(const mavros_msgs::msg::State::SharedPtr msg) { + is_state_received_ = true; + current_state_ = *msg; + } +}; +} // namespace mavros_interface +#include + +PLUGINLIB_EXPORT_CLASS(mavros_interface::MAVROSInterface, robot_interface::RobotInterface) diff --git a/ros_ws/src/robot/autonomy/controls/robot_interface/CMakeLists.txt b/ros_ws/src/robot/autonomy/0_interface/robot_interface/CMakeLists.txt similarity index 74% rename from ros_ws/src/robot/autonomy/controls/robot_interface/CMakeLists.txt rename to ros_ws/src/robot/autonomy/0_interface/robot_interface/CMakeLists.txt index ea2f5ebe..505aa239 100644 --- a/ros_ws/src/robot/autonomy/controls/robot_interface/CMakeLists.txt +++ b/ros_ws/src/robot/autonomy/0_interface/robot_interface/CMakeLists.txt @@ -11,6 +11,8 @@ find_package(rclcpp REQUIRED) find_package(pluginlib REQUIRED) find_package(mav_msgs REQUIRED) find_package(geometry_msgs REQUIRED) +find_package(visualization_msgs REQUIRED) +find_package(nav_msgs REQUIRED) find_package(tf2 REQUIRED) find_package(tf2_ros REQUIRED) find_package(airstack_msgs REQUIRED) @@ -23,6 +25,7 @@ target_include_directories(robot_interface PUBLIC target_compile_features(robot_interface PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 ament_target_dependencies( robot_interface + # Required dependencies geometry_msgs mav_msgs @@ -59,6 +62,27 @@ install( INCLUDES DESTINATION include ) +# odometry conversion +add_executable(odometry_conversion src/odometry_conversion.cpp) + +target_include_directories(odometry_conversion PUBLIC + $ + $) + +ament_target_dependencies(odometry_conversion + rclcpp + geometry_msgs + visualization_msgs + nav_msgs + tf2 + tf2_ros + tf2_geometry_msgs + airstack_msgs + airstack_common + ) +install(TARGETS odometry_conversion + DESTINATION lib/${PROJECT_NAME}) + ament_export_include_directories( include ${mav_msgs_INCLUDE_DIRS} @@ -79,4 +103,10 @@ if(BUILD_TESTING) ament_lint_auto_find_test_dependencies() endif() +# Install files. +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) + +# install(DIRECTORY rviz DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY params DESTINATION share/${PROJECT_NAME}) ament_package() diff --git a/ros_ws/src/robot/autonomy/controls/robot_interface/include/robot_interface/robot_interface.hpp b/ros_ws/src/robot/autonomy/0_interface/robot_interface/include/robot_interface/robot_interface.hpp similarity index 100% rename from ros_ws/src/robot/autonomy/controls/robot_interface/include/robot_interface/robot_interface.hpp rename to ros_ws/src/robot/autonomy/0_interface/robot_interface/include/robot_interface/robot_interface.hpp diff --git a/ros_ws/src/airstack_common/launch/odometry_conversion.xml b/ros_ws/src/robot/autonomy/0_interface/robot_interface/launch/odometry_conversion.xml similarity index 84% rename from ros_ws/src/airstack_common/launch/odometry_conversion.xml rename to ros_ws/src/robot/autonomy/0_interface/robot_interface/launch/odometry_conversion.xml index ed0b191c..0ca1c57c 100644 --- a/ros_ws/src/airstack_common/launch/odometry_conversion.xml +++ b/ros_ws/src/robot/autonomy/0_interface/robot_interface/launch/odometry_conversion.xml @@ -4,10 +4,10 @@ - - - - + + + + @@ -27,5 +27,5 @@ - - + + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/controls/robot_interface/package.xml b/ros_ws/src/robot/autonomy/0_interface/robot_interface/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/robot_interface/package.xml rename to ros_ws/src/robot/autonomy/0_interface/robot_interface/package.xml diff --git a/ros_ws/src/robot/autonomy/0_interface/robot_interface/src/odometry_conversion.cpp b/ros_ws/src/robot/autonomy/0_interface/robot_interface/src/odometry_conversion.cpp new file mode 100644 index 00000000..7c422ea8 --- /dev/null +++ b/ros_ws/src/robot/autonomy/0_interface/robot_interface/src/odometry_conversion.cpp @@ -0,0 +1,142 @@ +#include +#include +#include +#include + +/** + * @brief + * Does several things + * - if there's an odometry, republishes it with a new frame_id + * - if there's an odometry, republishes it as a transform + * - converts MAVROS odometry BEST_EFFORT to RELIABLE + * + */ + +class OdometryConversion : public rclcpp::Node { + private: + enum OdometryOutputType { NONE, TRANSFORM, OVERWRITE }; + + rclcpp::Subscription::SharedPtr odom_sub; + rclcpp::Publisher::SharedPtr odom_pub; + tf2_ros::Buffer* tf_buffer; + tf2_ros::TransformListener* tf_listener; + tf2_ros::TransformBroadcaster* tf_broadcaster; + + bool odom_input_qos_is_best_effort; + std::string new_frame_id; + std::string new_child_frame_id; + OdometryOutputType odometry_output_type; + bool convert_odometry_to_transform; + bool convert_odometry_to_stabilized_transform; + bool restamp_now_pre, restamp_now_post; + tf2::Quaternion odom_orientation_rotation_pre, odom_orientation_rotation_post; + tf2::Vector3 odom_position_translation_pre, odom_position_translation_post; + + public: + OdometryConversion() : Node("odometry_conversion") { + ; + odom_input_qos_is_best_effort = + airstack::get_param(this, "odom_input_qos_is_best_effort", false); + new_frame_id = airstack::get_param(this, "new_frame_id", std::string("")); + new_child_frame_id = airstack::get_param(this, "new_child_frame_id", std::string("")); + odometry_output_type = + (OdometryOutputType)airstack::get_param(this, "odometry_output_type", (int)NONE); + convert_odometry_to_transform = + airstack::get_param(this, "convert_odometry_to_transform", false); + convert_odometry_to_stabilized_transform = + airstack::get_param(this, "convert_odometry_to_stabilized_transform", false); + restamp_now_pre = airstack::get_param(this, "restamp_now_pre", false); + restamp_now_post = airstack::get_param(this, "restamp_now_post", false); + odom_orientation_rotation_pre = + tf2::Quaternion(airstack::get_param(this, "odometry_orientation_rotation_pre_x", 0.), + airstack::get_param(this, "odometry_orientation_rotation_pre_y", 0.), + airstack::get_param(this, "odometry_orientation_rotation_pre_z", 0.), + airstack::get_param(this, "odometry_orientation_rotation_pre_w", 1.)); + odom_position_translation_pre = + tf2::Vector3(airstack::get_param(this, "odometry_position_translation_pre_x", 0.), + airstack::get_param(this, "odometry_position_translation_pre_y", 0.), + airstack::get_param(this, "odometry_position_translation_pre_z", 0.)); + odom_orientation_rotation_post = + tf2::Quaternion(airstack::get_param(this, "odometry_orientation_rotation_post_x", 0.), + airstack::get_param(this, "odometry_orientation_rotation_post_y", 0.), + airstack::get_param(this, "odometry_orientation_rotation_post_z", 0.), + airstack::get_param(this, "odometry_orientation_rotation_post_w", 1.)); + odom_position_translation_post = + tf2::Vector3(airstack::get_param(this, "odometry_position_translation_post_x", 0.), + airstack::get_param(this, "odometry_position_translation_post_y", 0.), + airstack::get_param(this, "odometry_position_translation_post_z", 0.)); + + rmw_qos_profile_t qos = rmw_qos_profile_sensor_data; + qos.history = RMW_QOS_POLICY_HISTORY_KEEP_LAST; + qos.depth = 1; + if (odom_input_qos_is_best_effort) qos.reliability = RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT; + odom_sub = this->create_subscription( + "odometry_in", rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(qos), qos), + std::bind(&OdometryConversion::odom_callback, this, std::placeholders::_1)); + odom_pub = this->create_publisher("odometry_out", 1); + tf_buffer = new tf2_ros::Buffer(this->get_clock()); + tf_listener = new tf2_ros::TransformListener(*tf_buffer); + tf_broadcaster = new tf2_ros::TransformBroadcaster(*this); + } + + void odom_callback(const nav_msgs::msg::Odometry::SharedPtr msg) { + nav_msgs::msg::Odometry out_odom = *msg; + + if (restamp_now_pre) out_odom.header.stamp = get_clock()->now(); + + out_odom.pose.pose.orientation = tflib::from_tf( + tflib::to_tf(out_odom.pose.pose.orientation) * odom_orientation_rotation_pre); + + if (odometry_output_type == NONE) { + // do nothing + } + // transform mode transforms the odometry to a new frame, expects the new frame to exist in + // the same tf tree + else if (odometry_output_type == TRANSFORM) { + try { + out_odom = tflib::transform_odometry(tf_buffer, out_odom, new_frame_id, + new_child_frame_id); + } catch (tf2::TransformException& ex) { + RCLCPP_ERROR_STREAM( + get_logger(), "TransformException while transforming odometry: " << ex.what()); + return; + } + } + // overwrite mode simply overwrites the header with the desired frame id and child frame id + else if (odometry_output_type == OVERWRITE) { + out_odom.header.frame_id = new_frame_id; + out_odom.child_frame_id = new_child_frame_id; + } else { + RCLCPP_ERROR_STREAM(get_logger(), + "Unsupported odometry output type: " << odometry_output_type); + } + + if (restamp_now_post) out_odom.header.stamp = get_clock()->now(); + + out_odom.pose.pose.orientation = tflib::from_tf( + tflib::to_tf(out_odom.pose.pose.orientation) * odom_orientation_rotation_post); + + if (convert_odometry_to_transform) { + geometry_msgs::msg::TransformStamped t = tf2::toMsg(tflib::to_tf(out_odom)); + t.child_frame_id = out_odom.child_frame_id; + tf_broadcaster->sendTransform(t); + } + + if (convert_odometry_to_stabilized_transform) { + geometry_msgs::msg::TransformStamped t = tf2::toMsg(tflib::to_tf(out_odom)); + t.child_frame_id = out_odom.child_frame_id + "_stabilized"; + t.transform.rotation = + tflib::from_tf(tflib::get_stabilized(tflib::to_tf(out_odom.pose.pose.orientation))); + tf_broadcaster->sendTransform(t); + } + + odom_pub->publish(out_odom); + } +}; + +int main(int argc, char* argv[]) { + rclcpp::init(argc, argv); + rclcpp::spin(std::make_shared()); + rclcpp::shutdown(); + return 0; +} diff --git a/ros_ws/src/robot/autonomy/controls/robot_interface/src/robot_interface.cpp b/ros_ws/src/robot/autonomy/0_interface/robot_interface/src/robot_interface.cpp similarity index 100% rename from ros_ws/src/robot/autonomy/controls/robot_interface/src/robot_interface.cpp rename to ros_ws/src/robot/autonomy/0_interface/robot_interface/src/robot_interface.cpp diff --git a/ros_ws/src/robot/autonomy/0_interface/robot_interface/src/robot_interface_node.cpp b/ros_ws/src/robot/autonomy/0_interface/robot_interface/src/robot_interface_node.cpp new file mode 100644 index 00000000..5d20ba33 --- /dev/null +++ b/ros_ws/src/robot/autonomy/0_interface/robot_interface/src/robot_interface_node.cpp @@ -0,0 +1,151 @@ +/** + * @file robot_interface_node.cpp + * @author John Keller (jkeller2@andrew.cmu.edu), Andrew Jong + * (ajong@andrew.cmu.edu) + * @brief main function for the robot interface node + * @version 0.1 + * @date 2024-07-01 + * + * @copyright Copyright (c) 2024. This file is developed as part of software + * from the AirLab at the Robotics Institute at Carnegie Mellon University + * (https://theairlab.org). + * + */ +#include +#include +#include +#include +#include + +std::shared_ptr ri; + +rclcpp::Publisher::SharedPtr is_armed_pub; +rclcpp::Publisher::SharedPtr has_control_pub; + +void robot_command_callback( + const std::shared_ptr request, + std::shared_ptr response) { + // response->sum = request->a + request->b; + switch (request->command) { + case airstack_msgs::srv::RobotCommand::Request::REQUEST_CONTROL: + response->success = ri->request_control(); + break; + case airstack_msgs::srv::RobotCommand::Request::ARM: + response->success = ri->arm(); + break; + case airstack_msgs::srv::RobotCommand::Request::DISARM: + response->success = ri->disarm(); + break; + case airstack_msgs::srv::RobotCommand::Request::TAKEOFF: + response->success = ri->takeoff(); + break; + case airstack_msgs::srv::RobotCommand::Request::LAND: + response->success = ri->land(); + break; + /* + case airstack_msgs::srv::RobotCommand::Request::SET_LOW_THRUST_MODE: + drone_interface->set_low_thrust_mode(true); + response->success = true; + break; + case airstack_msgs::srv::RobotCommand::Request::UNSET_LOW_THRUST_MODE: + drone_interface->set_low_thrust_mode(false); + response->success = true; + break; + */ + } +} + +void attitude_thrust_callback(mav_msgs::msg::AttitudeThrust::SharedPtr msg) { + ri->attitude_thrust_callback(msg); +} + +void rate_thrust_callback(mav_msgs::msg::RateThrust::SharedPtr msg) { + ri->rate_thrust_callback(msg); +} + +void roll_pitch_yawrate_thrust_callback(mav_msgs::msg::RollPitchYawrateThrust::SharedPtr msg) { + ri->roll_pitch_yawrate_thrust_callback(msg); +} + +void torque_thrust_callback(mav_msgs::msg::TorqueThrust::SharedPtr msg) { + ri->torque_thrust_callback(msg); +} + +void velocity_callback(geometry_msgs::msg::TwistStamped::SharedPtr msg) { + ri->velocity_callback(msg); +} + +void pose_callback(geometry_msgs::msg::PoseStamped::SharedPtr msg) { ri->pose_callback(msg); } + +void timer_callback() { + std_msgs::msg::Bool is_armed; + is_armed.data = ri->is_armed(); + is_armed_pub->publish(is_armed); + + std_msgs::msg::Bool has_control; + has_control.data = ri->has_control(); + has_control_pub->publish(has_control); +} + +rclcpp::Subscription::SharedPtr attitude_thrust_sub; +rclcpp::Subscription::SharedPtr rate_thrust_sub; +rclcpp::Subscription::SharedPtr + roll_pitch_yawrate_thrust_sub; +rclcpp::Subscription::SharedPtr torque_thrust_sub; +rclcpp::Subscription::SharedPtr velocity_sub; +rclcpp::Subscription::SharedPtr pose_sub; + +int main(int argc, char** argv) { + rclcpp::init(argc, argv); + + // load the interface parameter + std::shared_ptr node = rclcpp::Node::make_shared("robot_interface_node"); + std::string interface = + airstack::get_param(node, "interface", std::string("mavros_interface::MAVROSInterface")); + node.reset(); + + pluginlib::ClassLoader loader( + "robot_interface", "robot_interface::RobotInterface"); + + try { + ri = loader.createSharedInstance("mavros_interface::MAVROSInterface"); + + // subscribers + attitude_thrust_sub = ri->create_subscription( + "attitude_thrust_command", 1, attitude_thrust_callback); + rate_thrust_sub = ri->create_subscription( + "rate_thrust_command", 1, rate_thrust_callback); + roll_pitch_yawrate_thrust_sub = + ri->create_subscription( + "roll_pitch_yawrate_thrust_command", 1, roll_pitch_yawrate_thrust_callback); + torque_thrust_sub = ri->create_subscription( + "torque_thrust_command", 1, torque_thrust_callback); + velocity_sub = ri->create_subscription( + "velocity_command", 1, velocity_callback); + pose_sub = ri->create_subscription("pose_command", 1, + pose_callback); + + // publishers + is_armed_pub = ri->create_publisher("is_armed", 1); + has_control_pub = ri->create_publisher("has_control", 1); + + // services + rclcpp::Service::SharedPtr service = + ri->create_service("robot_command", + &robot_command_callback); + + // timers + rclcpp::TimerBase::SharedPtr timer = rclcpp::create_timer( + ri, ri->get_clock(), rclcpp::Duration::from_seconds(1. / 20.), &timer_callback); + + rclcpp::executors::MultiThreadedExecutor executor; + executor.add_node(ri); + executor.spin(); + // rclcpp::spin(ri); + rclcpp::shutdown(); + } catch (pluginlib::PluginlibException& ex) { + std::cout << "The plugin failed to load. Error: " << ex.what() << std::endl; + } + + return 0; +} diff --git a/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/CMakeLists.txt b/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/CMakeLists.txt new file mode 100644 index 00000000..785bb640 --- /dev/null +++ b/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.8) +project(sensors_bringup) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +# uncomment the following section in order to fill in +# further dependencies manually. +# find_package( REQUIRED) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +# Install files. +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY rviz DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY params DESTINATION share/${PROJECT_NAME}) + +ament_package() diff --git a/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/LICENSE b/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/launch/sensors.launch.xml b/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/launch/sensors.launch.xml new file mode 100644 index 00000000..b5bebe8e --- /dev/null +++ b/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/launch/sensors.launch.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/package.xml b/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/package.xml new file mode 100644 index 00000000..0c14d91a --- /dev/null +++ b/ros_ws/src/robot/autonomy/1_sensors/sensors_bringup/package.xml @@ -0,0 +1,18 @@ + + + + sensors_bringup + 0.0.0 + TODO: Package description + andrew + Apache-2.0 + + ament_cmake + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/ros_ws/src/robot/autonomy/2_perception/.gitkeep b/ros_ws/src/robot/autonomy/2_perception/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/ros_ws/src/robot/autonomy/2_perception/perception_bringup/CMakeLists.txt b/ros_ws/src/robot/autonomy/2_perception/perception_bringup/CMakeLists.txt new file mode 100644 index 00000000..2384d3aa --- /dev/null +++ b/ros_ws/src/robot/autonomy/2_perception/perception_bringup/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.8) +project(perception_bringup) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +# uncomment the following section in order to fill in +# further dependencies manually. +# find_package( REQUIRED) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +# Install files. +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY rviz DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY params DESTINATION share/${PROJECT_NAME}) + +ament_package() diff --git a/ros_ws/src/robot/autonomy/2_perception/perception_bringup/LICENSE b/ros_ws/src/robot/autonomy/2_perception/perception_bringup/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/ros_ws/src/robot/autonomy/2_perception/perception_bringup/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ros_ws/src/robot/autonomy/2_perception/perception_bringup/launch/perception.launch.xml b/ros_ws/src/robot/autonomy/2_perception/perception_bringup/launch/perception.launch.xml new file mode 100644 index 00000000..0458d99e --- /dev/null +++ b/ros_ws/src/robot/autonomy/2_perception/perception_bringup/launch/perception.launch.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/2_perception/perception_bringup/package.xml b/ros_ws/src/robot/autonomy/2_perception/perception_bringup/package.xml new file mode 100644 index 00000000..90354365 --- /dev/null +++ b/ros_ws/src/robot/autonomy/2_perception/perception_bringup/package.xml @@ -0,0 +1,18 @@ + + + + perception_bringup + 0.0.0 + TODO: Package description + andrew + Apache-2.0 + + ament_cmake + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_expansion/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_expansion/CMakeLists.txt rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_expansion/LICENSE b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/LICENSE similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_expansion/LICENSE rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/LICENSE diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_expansion/README.md b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/README.md similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_expansion/README.md rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/README.md diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_expansion/config/disparity_expansion_params.yaml b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/config/disparity_expansion_params.yaml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_expansion/config/disparity_expansion_params.yaml rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/config/disparity_expansion_params.yaml diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_expansion/launch/disparity_expansion.xml b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/launch/disparity_expansion.launch.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_expansion/launch/disparity_expansion.xml rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/launch/disparity_expansion.launch.xml diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_expansion/launch/disparity_pcd.xml b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/launch/disparity_pcd.launch.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_expansion/launch/disparity_pcd.xml rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/launch/disparity_pcd.launch.xml diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_expansion/package.xml b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_expansion/package.xml rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/package.xml diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_expansion/src/disparity_conv.cpp b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/src/disparity_conv.cpp similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_expansion/src/disparity_conv.cpp rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/src/disparity_conv.cpp diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_expansion/src/disparity_expansion.cpp b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/src/disparity_expansion.cpp similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_expansion/src/disparity_expansion.cpp rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/src/disparity_expansion.cpp diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_expansion/src/disparity_pcd.cpp b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/src/disparity_pcd.cpp similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_expansion/src/disparity_pcd.cpp rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_expansion/src/disparity_pcd.cpp diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_graph/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_graph/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_graph/CMakeLists.txt rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_graph/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_graph/include/disparity_graph/disparity_graph.hpp b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_graph/include/disparity_graph/disparity_graph.hpp similarity index 99% rename from ros_ws/src/robot/autonomy/planning/local/disparity_graph/include/disparity_graph/disparity_graph.hpp rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_graph/include/disparity_graph/disparity_graph.hpp index ce577172..2f829210 100644 --- a/ros_ws/src/robot/autonomy/planning/local/disparity_graph/include/disparity_graph/disparity_graph.hpp +++ b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_graph/include/disparity_graph/disparity_graph.hpp @@ -115,7 +115,7 @@ class DisparityGraph : rclcpp::Node { std::bind(&DisparityGraph::get_cam_info, this, std::placeholders::_1)); } - virtual ~DisparityGraph(); + //virtual ~DisparityGraph(); void disp_cb(const sensor_msgs::msg::Image::ConstSharedPtr &disp_fg, const sensor_msgs::msg::Image::ConstSharedPtr &disp_bg) { diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_graph/package.xml b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_graph/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_graph/package.xml rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_graph/package.xml diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_graph/src/disparity_graph.cpp b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_graph/src/disparity_graph.cpp similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/disparity_graph/src/disparity_graph.cpp rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_graph/src/disparity_graph.cpp diff --git a/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/CMakeLists.txt new file mode 100644 index 00000000..c9abf61d --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/CMakeLists.txt @@ -0,0 +1,107 @@ +cmake_minimum_required(VERSION 3.5) +project(disparity_map_representation) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + + +find_package(ament_cmake REQUIRED) +find_package(ament_cmake_ros REQUIRED) +find_package(airstack_common REQUIRED) +find_package(airstack_msgs REQUIRED) +find_package(map_representation_interface REQUIRED) +find_package(cv_bridge REQUIRED) +find_package(disparity_graph REQUIRED) +find_package(geometry_msgs REQUIRED) +find_package(image_geometry REQUIRED) +find_package(image_transport REQUIRED) +find_package(nav_msgs REQUIRED) +find_package(pcl_msgs REQUIRED) +find_package(pluginlib REQUIRED) +find_package(rclcpp REQUIRED) +find_package(rclpy REQUIRED) +find_package(sensor_msgs REQUIRED) +find_package(std_msgs REQUIRED) +find_package(stereo_msgs REQUIRED) +find_package(tf2 REQUIRED) +find_package(tf2_eigen REQUIRED) +find_package(tf2_geometry_msgs REQUIRED) +find_package(tf2_ros REQUIRED) +find_package(visualization_msgs REQUIRED) + + +add_library(disparity_map_representation src/disparity_map_representation.cpp) +target_compile_features(disparity_map_representation PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 +target_include_directories(disparity_map_representation PUBLIC + $ + $) + +ament_target_dependencies( + disparity_map_representation + airstack_common + airstack_msgs + map_representation_interface + cv_bridge + disparity_graph + geometry_msgs + image_geometry + image_transport + nav_msgs + pcl_msgs + pluginlib + rclcpp + rclpy + sensor_msgs + std_msgs + stereo_msgs + tf2 + tf2_eigen + tf2_geometry_msgs + tf2_ros + visualization_msgs + ) + +pluginlib_export_plugin_description_file(map_representation_interface disparity_map_representation_plugin.xml) + +# Causes the visibility macros to use dllexport rather than dllimport, +# which is appropriate when building the dll but not consuming it. +#target_compile_definitions(disparity_map_representation PRIVATE "disparity_map_representation_INTERFACE_BUILDING_LIBRARY") + +install( + DIRECTORY include/ + DESTINATION include +) +install( + TARGETS disparity_map_representation + EXPORT export_${PROJECT_NAME} + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin +) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +ament_export_include_directories( + include +) +ament_export_libraries( + disparity_map_representation +) +ament_export_targets( + export_${PROJECT_NAME} +) + +ament_package() diff --git a/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/disparity_map_representation_plugin.xml b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/disparity_map_representation_plugin.xml new file mode 100644 index 00000000..1513218b --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/disparity_map_representation_plugin.xml @@ -0,0 +1,6 @@ + + + Disparity map representation plugin. + + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/include/disparity_map_representation/disparity_map_representation.hpp b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/include/disparity_map_representation/disparity_map_representation.hpp similarity index 87% rename from ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/include/disparity_map_representation/disparity_map_representation.hpp rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/include/disparity_map_representation/disparity_map_representation.hpp index 18829bc6..60506328 100644 --- a/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/include/disparity_map_representation/disparity_map_representation.hpp +++ b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/include/disparity_map_representation/disparity_map_representation.hpp @@ -1,6 +1,5 @@ #ifndef _DISPARITY_MAP_REPRESENTATION_ #define _DISPARITY_MAP_REPRESENTATION_ -#include #include #include #include @@ -9,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -18,7 +18,8 @@ #include #include -class DisparityMapRepresentation : public MapRepresentation { +namespace disparity_map_representation { +class DisparityMapRepresentation : public map_representation_interface::MapRepresentation { private: std::unique_ptr disp_graph; @@ -45,5 +46,6 @@ class DisparityMapRepresentation : public MapRepresentation { virtual std::vector > get_values( std::vector > trajectories); }; +} // namespace disparity_map_representation #endif diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/package.xml b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/package.xml similarity index 86% rename from ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/package.xml rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/package.xml index 2f4b6dec..2b50fd34 100644 --- a/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/package.xml +++ b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/package.xml @@ -12,7 +12,7 @@ airstack_common airstack_msgs - core_map_representation_interface + map_representation_interface cv_bridge disparity_graph geometry_msgs @@ -32,6 +32,5 @@ ament_cmake - - + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/src/disparity_map_representation.cpp b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/src/disparity_map_representation.cpp similarity index 97% rename from ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/src/disparity_map_representation.cpp rename to ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/src/disparity_map_representation.cpp index bca03044..1ec59963 100644 --- a/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/src/disparity_map_representation.cpp +++ b/ros_ws/src/robot/autonomy/3_local/a_world_models/disparity_map_representation/src/disparity_map_representation.cpp @@ -1,6 +1,5 @@ #include -#include - +namespace disparity_map_representation { DisparityMapRepresentation::DisparityMapRepresentation() : MapRepresentation(), disp_graph(std::make_unique()) { points.ns = "obstacles"; @@ -256,5 +255,8 @@ void DisparityMapRepresentation::publish_debug() { points.points.clear(); points.colors.clear(); } +} // namespace disparity_map_representation +#include -PLUGINLIB_EXPORT_CLASS(DisparityMapRepresentation, MapRepresentation) +PLUGINLIB_EXPORT_CLASS(disparity_map_representation::DisparityMapRepresentation, + map_representation_interface::MapRepresentation) diff --git a/ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/CMakeLists.txt new file mode 100644 index 00000000..42c0ed7b --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/CMakeLists.txt @@ -0,0 +1,78 @@ +cmake_minimum_required(VERSION 3.5) +project(map_representation_interface) + +# Find dependencies +find_package(ament_cmake REQUIRED) +find_package(airstack_msgs REQUIRED) +find_package(geometry_msgs REQUIRED) +find_package(nav_msgs REQUIRED) +find_package(pluginlib REQUIRED) +find_package(rclcpp REQUIRED) +find_package(rclpy REQUIRED) +find_package(sensor_msgs REQUIRED) +find_package(std_msgs REQUIRED) +find_package(tf2 REQUIRED) +find_package(tf2_ros REQUIRED) +find_package(visualization_msgs REQUIRED) + + +add_library(map_representation_interface src/map_representation_interface.cpp) +target_include_directories(map_representation_interface PUBLIC + $ + $) +target_compile_features(map_representation_interface PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 +ament_target_dependencies( + map_representation_interface + # Required dependencies + airstack_msgs + geometry_msgs + nav_msgs + pluginlib + rclcpp + rclpy + sensor_msgs + std_msgs + tf2 + tf2_ros + visualization_msgs +) +ament_export_targets(map_representation_interface HAS_LIBRARY_TARGET) +ament_export_dependencies(rclcpp geometry_msgs tf2 tf2_ros) + +install(TARGETS map_representation_interface + DESTINATION lib/${PROJECT_NAME}) + +install( + DIRECTORY include/ + DESTINATION include +) + +install( + TARGETS map_representation_interface + EXPORT map_representation_interface + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include +) + +ament_export_include_directories( + include + ${geometry_msgs_INCLUDE_DIRS} +) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +ament_package() diff --git a/ros_ws/src/robot/autonomy/planning/local/core_map_representation_interface/include/core_map_representation_interface/map_representation.h b/ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/include/map_representation_interface/map_representation.hpp similarity index 73% rename from ros_ws/src/robot/autonomy/planning/local/core_map_representation_interface/include/core_map_representation_interface/map_representation.h rename to ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/include/map_representation_interface/map_representation.hpp index f9b894cb..d46ff9ff 100644 --- a/ros_ws/src/robot/autonomy/planning/local/core_map_representation_interface/include/core_map_representation_interface/map_representation.h +++ b/ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/include/map_representation_interface/map_representation.hpp @@ -6,14 +6,16 @@ #include #include +namespace map_representation_interface { + class MapRepresentation : public rclcpp::Node { private: public: /** - Takes in a list of trajectories and outputs a value for each waypoint in each trajectory. - @return A vector of vectors containing values for each waypoint. There is a vector of vectors - for each trajectory. There is a vector of doubles for each waypoint within a trajectory. - */ + Takes in a list of trajectories and outputs a value for each waypoint in each trajectory. + @return A vector of vectors containing values for each waypoint. There is a vector of vectors + for each trajectory. There is a vector of doubles for each waypoint within a trajectory. + */ virtual std::vector > get_values( std::vector > @@ -26,12 +28,12 @@ class MapRepresentation : public rclcpp::Node { /** Clears the map. - */ + */ virtual void clear() { RCLCPP_ERROR(this->get_logger(), "clear CALLED BUT NOT IMPLEMENTED"); } /** Use this function to publish visualizations of the map that might be helpful for debugging. - */ + */ virtual void publish_debug() {} virtual ~MapRepresentation() {} @@ -41,4 +43,6 @@ class MapRepresentation : public rclcpp::Node { MapRepresentation() : Node("map_representation") {} }; +} // namespace map_representation_interface + #endif diff --git a/ros_ws/src/robot/autonomy/planning/local/core_map_representation_interface/package.xml b/ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/package.xml similarity index 85% rename from ros_ws/src/robot/autonomy/planning/local/core_map_representation_interface/package.xml rename to ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/package.xml index 52b15ab6..be4abab7 100644 --- a/ros_ws/src/robot/autonomy/planning/local/core_map_representation_interface/package.xml +++ b/ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/package.xml @@ -1,9 +1,9 @@ - core_map_representation_interface + map_representation_interface 0.0.0 - The core_map_representation_interface package + The map_representation_interface package john TODO @@ -28,4 +28,4 @@ ament_cmake - + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/src/map_representation_interface.cpp b/ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/src/map_representation_interface.cpp new file mode 100644 index 00000000..9ace4abe --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/a_world_models/map_representation_interface/src/map_representation_interface.cpp @@ -0,0 +1,3 @@ +#include + +int blank() { return 0; } diff --git a/ros_ws/src/robot/autonomy/planning/local/droan_local_planner/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/CMakeLists.txt similarity index 95% rename from ros_ws/src/robot/autonomy/planning/local/droan_local_planner/CMakeLists.txt rename to ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/CMakeLists.txt index 35b7ffa9..6cf1cd8b 100644 --- a/ros_ws/src/robot/autonomy/planning/local/droan_local_planner/CMakeLists.txt +++ b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(ament_cmake REQUIRED) find_package(airstack_common REQUIRED) find_package(airstack_msgs REQUIRED) -find_package(core_map_representation_interface REQUIRED) +find_package(map_representation_interface REQUIRED) # find_package(disparity_map_representation REQUIRED) find_package(pluginlib REQUIRED) find_package(rclcpp REQUIRED) @@ -29,7 +29,7 @@ ament_target_dependencies( droan_local_planner "airstack_msgs" "airstack_common" - "core_map_representation_interface" + "map_representation_interface" # "disparity_map_representation" "trajectory_controller" "trajectory_library" diff --git a/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/config/droan.yaml b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/config/droan.yaml new file mode 100644 index 00000000..ebfea010 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/config/droan.yaml @@ -0,0 +1,27 @@ +/**: + ros__parameters: + obstacle_distance_reward: 1.0 + forward_progress_reward_weight: 0.5 + robot_radius: 0.75 + look_past_distance: 2.0 + + # height parameters + height_mode: 0 + height_above_ground: 1.0 + fixed_height: 1.0 + # 0: use the yaw of the subscribed traj, 1: smoothly vary the yaw in the direction of the subscribed trajectory + yaw_mode: 0 + map_representation: PointCloudMapRepresentation + waypoint_buffer_duration: 30.0 + waypoint_angle_threshold: 30.0 + + # trajectory parameters + # trajectory_library_config: "$(find trajectory_library)/config/acceleration_magnitudes.yaml" + # tf_prefix: robot1 + trajectory_library_config: "/root/AirStack/ros_ws/install/trajectory_library/share/trajectory_library/config/acceleration_magnitudes.yaml" + waypoint_spacing: 0.5 + waypoint_spacing_threshold: 0.5 + + # custom waypoint parameters + custom_waypoint_timeout_factor: 0.3 + custom_waypoint_distance_threshold: 0.5 \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/planning/local/droan_local_planner/include/droan_local_planner/droan_local_planner.hpp b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/include/droan_local_planner/droan_local_planner.hpp similarity index 71% rename from ros_ws/src/robot/autonomy/planning/local/droan_local_planner/include/droan_local_planner/droan_local_planner.hpp rename to ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/include/droan_local_planner/droan_local_planner.hpp index bf9b7069..0aaba25d 100644 --- a/ros_ws/src/robot/autonomy/planning/local/droan_local_planner/include/droan_local_planner/droan_local_planner.hpp +++ b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/include/droan_local_planner/droan_local_planner.hpp @@ -1,10 +1,9 @@ #pragma once -#include - #include #include #include +#include #include #include // #include @@ -25,19 +24,21 @@ using std::placeholders::_1; class DroanLocalPlanner : public rclcpp::Node { private: + const std::string ROBOT_NAME = + std::getenv("ROBOT_NAME") == NULL ? "" : std::getenv("ROBOT_NAME"); std::unique_ptr traj_lib; - std::string map_representation; + std::string map_representation_class_string; bool is_global_plan_received; - airstack_msgs::msg::TrajectoryXYZVYaw global_plan; + airstack_msgs::msg::TrajectoryXYZVYaw global_plan_msg; double global_plan_trajectory_distance; bool is_look_ahead_received, is_tracking_point_received; airstack_msgs::msg::Odometry look_ahead_odom, tracking_point_odom; std::vector static_trajectories; - double waypoint_spacing, obstacle_check_radius, obstacle_penalty_weight, - forward_progress_penalty_weight; + double waypoint_spacing, obstacle_check_radius, obstacle_distance_reward, + forward_progress_reward_weight; double robot_radius; int obstacle_check_points; @@ -53,8 +54,6 @@ class DroanLocalPlanner : public rclcpp::Node { int height_mode; double height_above_ground; double fixed_height; - bool got_range_up, got_range_down; - sensor_msgs::msg::Range range_up, range_down; const int TRAJECTORY_YAW = 0; const int SMOOTH_YAW = 1; @@ -65,28 +64,17 @@ class DroanLocalPlanner : public rclcpp::Node { GoalMode goal_mode; double custom_waypoint_timeout_factor, custom_waypoint_distance_threshold; - // MapRepresentationDeprecated* map; - // MapRepresentation* pc_map; - std::shared_ptr pc_map; + std::shared_ptr map_representation; rclcpp::Subscription::SharedPtr global_plan_sub; rclcpp::Subscription::SharedPtr waypoint_sub; rclcpp::Subscription::SharedPtr look_ahead_sub; rclcpp::Subscription::SharedPtr tracking_point_sub; - rclcpp::Subscription::SharedPtr range_up_sub; - rclcpp::Subscription::SharedPtr range_down_sub; rclcpp::Subscription::SharedPtr custom_waypoint_sub; - // subscribers - // ros::Subscriber global_plan_sub, waypoint_sub, look_ahead_sub, tracking_point_sub, - // range_up_sub, - // range_down_sub, custom_waypoint_sub; tf2_ros::Buffer tf_buffer; tf2_ros::TransformListener tf_listener; - // publishers - // ros::Publisher vis_pub, traj_pub, traj_track_pub, obst_vis_pub, global_plan_vis_pub, - // look_past_vis_pub; rclcpp::Publisher::SharedPtr vis_pub; rclcpp::Publisher::SharedPtr traj_pub; rclcpp::Publisher::SharedPtr traj_track_pub; @@ -113,10 +101,6 @@ class DroanLocalPlanner : public rclcpp::Node { "look_ahead", 10, std::bind(&DroanLocalPlanner::look_ahead_callback, this, _1)); tracking_point_sub = this->create_subscription( "tracking_point", 10, std::bind(&DroanLocalPlanner::tracking_point_callback, this, _1)); - range_up_sub = this->create_subscription( - "range_up", 1, std::bind(&DroanLocalPlanner::range_up_callback, this, _1)); - range_down_sub = this->create_subscription( - "range_down", 1, std::bind(&DroanLocalPlanner::range_down_callback, this, _1)); custom_waypoint_sub = this->create_subscription( "custom_waypoint", 1, std::bind(&DroanLocalPlanner::custom_waypoint_callback, this, _1)); @@ -130,9 +114,10 @@ class DroanLocalPlanner : public rclcpp::Node { "local_planner_global_plan_vis", 10); look_past_vis_pub = this->create_publisher("look_past", 10); - traj_pub = this->create_publisher("trajectory", 10); - traj_track_pub = - this->create_publisher("trajectory_track", 10); + traj_pub = this->create_publisher( + "trajectory_segment_to_add", 10); + traj_track_pub = this->create_publisher( + "trajectory_override", 10); // services traj_mode_client = @@ -141,11 +126,11 @@ class DroanLocalPlanner : public rclcpp::Node { // init parameters this->declare_parameter("waypoint_spacing", 0.5); waypoint_spacing = this->get_parameter("waypoint_spacing").as_double(); - this->declare_parameter("obstacle_penalty_weight", 1.); - obstacle_penalty_weight = this->get_parameter("obstacle_penalty_weight").as_double(); - this->declare_parameter("forward_progress_penalty_weight", 0.5); - forward_progress_penalty_weight = - this->get_parameter("forward_progress_penalty_weight").as_double(); + this->declare_parameter("obstacle_distance_reward", 1.); + obstacle_distance_reward = this->get_parameter("obstacle_distance_reward").as_double(); + this->declare_parameter("forward_progress_reward_weight", 0.5); + forward_progress_reward_weight = + this->get_parameter("forward_progress_reward_weight").as_double(); this->declare_parameter("robot_radius", 0.75); robot_radius = this->get_parameter("robot_radius").as_double(); this->declare_parameter("look_past_distance", 0.0); @@ -159,7 +144,7 @@ class DroanLocalPlanner : public rclcpp::Node { this->declare_parameter("yaw_mode", 0); yaw_mode = this->get_parameter("yaw_mode").as_int(); this->declare_parameter("map_representation", std::string("PointCloudMapRepresentation")); - map_representation = this->get_parameter("map_representation").as_string(); + map_representation_class_string = this->get_parameter("map_representation").as_string(); this->declare_parameter("waypoint_buffer_duration", 30.); waypoint_buffer_duration = this->get_parameter("waypoint_buffer_duration").as_double(); this->declare_parameter("waypoint_spacing_threshold", 0.5); @@ -177,61 +162,43 @@ class DroanLocalPlanner : public rclcpp::Node { this->declare_parameter("trajectory_library_config", std::string("")); traj_lib = std::make_unique( this->get_parameter("trajectory_library_config").as_string(), this); + + pluginlib::ClassLoader + map_representation_loader("map_representation_interface", + "map_representation_interface::MapRepresentation"); + try { + map_representation = + map_representation_loader.createSharedInstance(map_representation_class_string); + } catch (pluginlib::PluginlibException& ex) { + RCLCPP_INFO(this->get_logger(), + "The MapRepresentation plugin failed to load. Error: %s", ex.what()); + } } virtual ~DroanLocalPlanner() {} + /** + * Sets the global plan height based on the height mode + */ + bool set_global_plan_height_inplace(Trajectory& global_plan) { + // fixed height mode + if (this->height_mode == FIXED_HEIGHT) { + global_plan.set_fixed_height(fixed_height); + } + } + virtual bool execute() { update_waypoint_mode(); if (!is_global_plan_received) return true; - Trajectory gp(this, global_plan); - - // set the height of the global plan - if (height_mode == FIXED_HEIGHT) { - gp.set_fixed_height(fixed_height); - } else if (height_mode == RANGE_SENSOR_HEIGHT) { - if (!got_range_up || !got_range_down) return true; - - try { - tf2::Stamped transform_up, transform_down; - - geometry_msgs::msg::TransformStamped tf_up_msg, tf_down_msg; - tf_buffer.canTransform(gp.get_frame_id(), range_up.header.frame_id, - range_up.header.stamp, rclcpp::Duration::from_seconds(0.1)); - tf_up_msg = tf_buffer.lookupTransform(gp.get_frame_id(), range_up.header.frame_id, - range_up.header.stamp); - tf2::fromMsg(tf_up_msg, transform_up); - tf_buffer.canTransform(gp.get_frame_id(), range_down.header.frame_id, - range_down.header.stamp, - rclcpp::Duration::from_seconds(0.1)); - tf_down_msg = tf_buffer.lookupTransform( - gp.get_frame_id(), range_down.header.frame_id, range_down.header.stamp); - tf2::fromMsg(tf_down_msg, transform_down); - - tf2::Vector3 range_up_gp_frame = transform_up * tf2::Vector3(range_up.range, 0, 0); - tf2::Vector3 range_down_gp_frame = - transform_down * tf2::Vector3(range_down.range, 0, 0); - - double tunnel_height = range_up_gp_frame.z() - range_down_gp_frame.z(); - double z_setpoint = (range_up_gp_frame.z() + range_down_gp_frame.z()) / 2.0; - if (tunnel_height / 2.0 >= height_above_ground) { - z_setpoint = range_down_gp_frame.z() + height_above_ground; - } - - gp.set_fixed_height(z_setpoint); - - } catch (tf2::TransformException& ex) { - RCLCPP_ERROR(this->get_logger(), "Failed to get transform: %s", ex.what()); - return true; - } - } + Trajectory global_plan(this, global_plan_msg); + set_global_plan_height_inplace(global_plan); // set the height of the global plan // transform the look ahead point to the global plan frame tf2::Vector3 look_ahead_position = tflib::to_tf(look_ahead_odom.pose.position); - bool success = - tflib::to_frame(&tf_buffer, look_ahead_position, look_ahead_odom.header.frame_id, - gp.get_frame_id(), look_ahead_odom.header.stamp, &look_ahead_position); + bool success = tflib::to_frame(&tf_buffer, look_ahead_position, + look_ahead_odom.header.frame_id, global_plan.get_frame_id(), + look_ahead_odom.header.stamp, &look_ahead_position); if (!success) { RCLCPP_ERROR_STREAM(this->get_logger(), "Couldn't transform from lookahead frame to global plan frame"); @@ -240,18 +207,19 @@ class DroanLocalPlanner : public rclcpp::Node { // increment how far along the global plan we are double trajectory_distance; - bool valid = - gp.get_trajectory_distance_at_closest_point(look_ahead_position, &trajectory_distance); + bool valid = global_plan.get_trajectory_distance_at_closest_point(look_ahead_position, + &trajectory_distance); if (valid) { global_plan_trajectory_distance += trajectory_distance; - gp = gp.get_subtrajectory_distance(global_plan_trajectory_distance, - global_plan_trajectory_distance + 10.0); + global_plan = global_plan.get_subtrajectory_distance( + global_plan_trajectory_distance, global_plan_trajectory_distance + 10.0); } else { RCLCPP_INFO(this->get_logger(), "invalid"); } // publish the segment of the global plan currently being used, for visualization - visualization_msgs::msg::MarkerArray global_markers = gp.get_markers(this->now(), 0, 0, 1); + visualization_msgs::msg::MarkerArray global_markers = + global_plan.get_markers(this->now(), 0, 0, 1); global_plan_vis_pub->publish(global_markers); // get the dynamic trajectories @@ -260,14 +228,15 @@ class DroanLocalPlanner : public rclcpp::Node { // pick the best trajectory Trajectory best_traj; - bool all_in_collision = this->get_best_trajectory(dynamic_trajectories, gp, &best_traj); + bool all_in_collision = + this->get_best_trajectory(dynamic_trajectories, global_plan, best_traj); // publish the trajectory if (!all_in_collision) { - airstack_msgs::msg::TrajectoryXYZVYaw path = best_traj.get_TrajectoryXYZVYaw(); + airstack_msgs::msg::TrajectoryXYZVYaw best_traj_msg = best_traj.get_TrajectoryXYZVYaw(); // set yaw - if (yaw_mode == SMOOTH_YAW && path.waypoints.size() > 0) { + if (yaw_mode == SMOOTH_YAW && best_traj.waypoint_count() > 0) { bool found_initial_heading = false; double initial_heading = 0; try { @@ -291,14 +260,15 @@ class DroanLocalPlanner : public rclcpp::Node { } if (found_initial_heading) { - path.waypoints[0].yaw = initial_heading; + best_traj_msg.waypoints[0].yaw = initial_heading; double alpha = 0.1; - double sin_yaw_prev = sin(path.waypoints[0].yaw); - double cos_yaw_prev = cos(path.waypoints[0].yaw); + double sin_yaw_prev = sin(best_traj_msg.waypoints[0].yaw); + double cos_yaw_prev = cos(best_traj_msg.waypoints[0].yaw); - for (size_t i = 1; i < path.waypoints.size(); i++) { - airstack_msgs::msg::WaypointXYZVYaw wp_prev = path.waypoints[i - 1]; - airstack_msgs::msg::WaypointXYZVYaw& wp_curr = path.waypoints[i]; + for (size_t i = 1; i < best_traj_msg.waypoints.size(); i++) { + airstack_msgs::msg::WaypointXYZVYaw wp_prev = + best_traj_msg.waypoints[i - 1]; + airstack_msgs::msg::WaypointXYZVYaw& wp_curr = best_traj_msg.waypoints[i]; double yaw = atan2(wp_curr.position.y - wp_prev.position.y, wp_curr.position.x - wp_prev.position.x); @@ -313,31 +283,45 @@ class DroanLocalPlanner : public rclcpp::Node { } } } - path.header.stamp = this->now(); - traj_pub->publish(path); + best_traj_msg.header.stamp = this->now(); + traj_pub->publish(best_traj_msg); } return true; } - bool get_best_trajectory(std::vector trajectories, Trajectory global_plan, - Trajectory* best_traj_ret) { + std::vector> get_trajectory_distances_from_map( + std::vector trajectory_candidates) { + // vector of trajectory candidates in PointStamped-vector form + std::vector> traj_cands_as_point_stamped; + for (size_t i = 0; i < trajectory_candidates.size(); i++) { + traj_cands_as_point_stamped.push_back( + trajectory_candidates[i].get_vector_PointStamped()); + } + // TODO: clearly we should refactor map_representation to accept Trajectory objects + std::vector> trajectory_distances_to_closest_obstacle = + this->map_representation->get_values(traj_cands_as_point_stamped); + return trajectory_distances_to_closest_obstacle; + } + + /** + * Choose the best trajectory based on the cost function. Minimize the cost + */ + bool get_best_trajectory(std::vector trajectory_candidates, Trajectory global_plan, + Trajectory& best_traj_ret) { double min_cost = std::numeric_limits::max(); size_t best_traj_index = 0; bool all_in_collision = true; auto now = this->now(); - visualization_msgs::msg::MarkerArray traj_lib_markers, look_past_markers; + auto trajectory_distances_to_closest_obstacle = + get_trajectory_distances_from_map(trajectory_candidates); - std::vector> trajs_as_point_stamped; - for (size_t i = 0; i < trajectories.size(); i++) { - trajs_as_point_stamped.push_back(trajectories[i].get_vector_PointStamped()); - } - std::vector> values = pc_map->get_values(trajs_as_point_stamped); + visualization_msgs::msg::MarkerArray traj_lib_markers, look_past_markers; - for (size_t i = 0; i < trajectories.size(); ++i) { - Trajectory traj = trajectories[i]; - double average_distance = std::numeric_limits::infinity(); + for (size_t i = 0; i < trajectory_candidates.size(); ++i) { + Trajectory traj = trajectory_candidates[i]; + double avg_distance_from_global_plan = std::numeric_limits::infinity(); double closest_obstacle_distance = std::numeric_limits::infinity(); Trajectory global_plan_in_traj_frame; @@ -349,6 +333,7 @@ class DroanLocalPlanner : public rclcpp::Node { return true; } + // for each waypoint in the trajectory, calculate the distance to the closest obstacle for (size_t j = 0; j < traj.waypoint_count(); j++) { Waypoint wp = traj.get_waypoint(j); @@ -356,25 +341,31 @@ class DroanLocalPlanner : public rclcpp::Node { geometry_msgs::msg::PoseStamped pose; pose.header = odom.header; pose.pose = odom.pose; - closest_obstacle_distance = std::min(closest_obstacle_distance, values[i][j]); + closest_obstacle_distance = + std::min(closest_obstacle_distance, + trajectory_distances_to_closest_obstacle.at(i).at(j)); - Waypoint closest_point(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + // get the closest global plan point to the current trajectory waypoint + Waypoint closest_point_from_global_plan(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); int wp_index; double path_distance; bool valid = global_plan_in_traj_frame.get_closest_point( - wp.position(), &closest_point, &wp_index, &path_distance); - double forward_progress_penalty = -forward_progress_penalty_weight * path_distance; + wp.position(), &closest_point_from_global_plan, &wp_index, &path_distance); + + // reward making progress along the global plan + double forward_progress_reward = -forward_progress_reward_weight * path_distance; if (valid) { - if (!std::isfinite(average_distance)) { - average_distance = 0; + if (!std::isfinite(avg_distance_from_global_plan)) { + avg_distance_from_global_plan = 0; } - average_distance += - closest_point.position().distance(wp.position()) + forward_progress_penalty; + avg_distance_from_global_plan += + closest_point_from_global_plan.position().distance(wp.position()) + + forward_progress_reward; } } + avg_distance_from_global_plan /= traj.waypoint_count(); - average_distance /= traj.waypoint_count(); bool collision = closest_obstacle_distance <= robot_radius; if (!collision) { all_in_collision = false; @@ -385,28 +376,33 @@ class DroanLocalPlanner : public rclcpp::Node { // red for collision traj_markers = traj.get_markers(this->now(), 1, 0, 0, .5); } else { + // green for no collision traj_markers = traj.get_markers(this->now(), 0, 1, 0, .5); } + // if look_past_distance is set, then use that to calculate the cost instead + // wtf this doesn't even make sense if (look_past_distance > 0) { if (traj.waypoint_count() >= 2) { Waypoint curr_wp = traj.get_waypoint(traj.waypoint_count() - 1); Waypoint prev_wp = traj.get_waypoint(traj.waypoint_count() - 2); - tf2::Vector3 segment = curr_wp.position() - prev_wp.position(); - segment.normalize(); + tf2::Vector3 direction = curr_wp.position() - prev_wp.position(); + direction.normalize(); - tf2::Vector3 position = curr_wp.position() + look_past_distance * segment; + tf2::Vector3 look_past_position = + curr_wp.position() + look_past_distance * direction; - Waypoint closest_point(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Waypoint closest_point_from_global_plan(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); int wp_index; bool valid = global_plan_in_traj_frame.get_closest_point( - position, &closest_point, &wp_index); + look_past_position, &closest_point_from_global_plan, &wp_index); if (!valid) { collision = true; } else { - average_distance = position.distance(closest_point.position()); + avg_distance_from_global_plan = + look_past_position.distance(closest_point_from_global_plan.position()); } visualization_msgs::msg::Marker marker; @@ -417,9 +413,9 @@ class DroanLocalPlanner : public rclcpp::Node { marker.type = visualization_msgs::msg::Marker::SPHERE; marker.action = visualization_msgs::msg::Marker::ADD; - marker.pose.position.x = position.x(); - marker.pose.position.y = position.y(); - marker.pose.position.z = position.z(); + marker.pose.position.x = look_past_position.x(); + marker.pose.position.y = look_past_position.y(); + marker.pose.position.z = look_past_position.z(); marker.pose.orientation.w = 1; marker.scale.x = 0.3; marker.scale.y = 0.3; @@ -434,13 +430,15 @@ class DroanLocalPlanner : public rclcpp::Node { traj_lib_markers.markers.insert(traj_lib_markers.markers.end(), traj_markers.markers.begin(), traj_markers.markers.end()); - double cost = - average_distance - obstacle_penalty_weight * - std::min(closest_obstacle_distance, obstacle_check_radius); + // bigger distance from obstacles makes the cost smaller (more negative). cap by the + // obstacle check radius + double cost = avg_distance_from_global_plan - + obstacle_distance_reward * + std::min(closest_obstacle_distance, obstacle_check_radius); if (!collision && cost < min_cost) { min_cost = cost; best_traj_index = i; - *best_traj_ret = traj; + best_traj_ret = traj; } } if (best_traj_index < look_past_markers.markers.size()) { @@ -451,18 +449,19 @@ class DroanLocalPlanner : public rclcpp::Node { } vis_pub->publish(traj_lib_markers); - pc_map->publish_debug(); + map_representation->publish_debug(); look_past_vis_pub->publish(look_past_markers); return all_in_collision; } // subscriber callbacks - void global_plan_callback(const airstack_msgs::msg::TrajectoryXYZVYaw::SharedPtr global_plan) { + void global_plan_callback( + const airstack_msgs::msg::TrajectoryXYZVYaw::SharedPtr global_plan_msg) { RCLCPP_INFO_STREAM(this->get_logger(), "GOT GLOBAL PLAN, goal_mode: " << goal_mode); if (goal_mode != TRAJECTORY) return; - this->global_plan = *global_plan; // copies + this->global_plan_msg = *global_plan_msg; // copies is_global_plan_received = true; global_plan_trajectory_distance = 0; } @@ -482,9 +481,9 @@ class DroanLocalPlanner : public rclcpp::Node { } // stitch together the history of waypoints - airstack_msgs::msg::TrajectoryXYZVYaw global_plan; - global_plan.header.frame_id = wp->header.frame_id; - global_plan.header.stamp = wp->header.stamp; + airstack_msgs::msg::TrajectoryXYZVYaw global_plan_msg; + global_plan_msg.header.frame_id = wp->header.frame_id; + global_plan_msg.header.stamp = wp->header.stamp; std::vector backwards_global_plan; @@ -538,7 +537,7 @@ class DroanLocalPlanner : public rclcpp::Node { } } for (size_t i = 0; i < backwards_global_plan.size(); i++) { - global_plan.waypoints.push_back( + global_plan_msg.waypoints.push_back( backwards_global_plan[backwards_global_plan.size() - 1 - i]); } if (is_tracking_point_received) { @@ -563,15 +562,15 @@ class DroanLocalPlanner : public rclcpp::Node { wp2.position.x = wp2_position.x(); wp2.position.y = wp2_position.y(); wp2.position.z = wp2_position.z(); - global_plan.waypoints.push_back(wp1); - global_plan.waypoints.push_back(wp2); + global_plan_msg.waypoints.push_back(wp1); + global_plan_msg.waypoints.push_back(wp2); } catch (tf2::TransformException& ex) { RCLCPP_ERROR(this->get_logger(), "Failed to get transform: %s", ex.what()); } } global_plan_trajectory_distance = 0; - this->global_plan = global_plan; + this->global_plan_msg = global_plan_msg; this->is_global_plan_received = true; } @@ -589,9 +588,9 @@ class DroanLocalPlanner : public rclcpp::Node { tf2::Vector3 la_position = tflib::to_tf(look_ahead_odom.pose.position); tf2::Vector3 wp_position = transform * tflib::to_tf(wp->pose.position); - airstack_msgs::msg::TrajectoryXYZVYaw global_plan; - global_plan.header.frame_id = look_ahead_odom.header.frame_id; - global_plan.header.stamp = this->now(); + airstack_msgs::msg::TrajectoryXYZVYaw global_plan_msg; + global_plan_msg.header.frame_id = look_ahead_odom.header.frame_id; + global_plan_msg.header.stamp = this->now(); airstack_msgs::msg::WaypointXYZVYaw wp1, wp2; wp1.position.x = la_position.x(); @@ -600,11 +599,11 @@ class DroanLocalPlanner : public rclcpp::Node { wp2.position.x = wp_position.x(); wp2.position.y = wp_position.y(); wp2.position.z = wp_position.z(); - global_plan.waypoints.push_back(wp1); - global_plan.waypoints.push_back(wp2); + global_plan_msg.waypoints.push_back(wp1); + global_plan_msg.waypoints.push_back(wp2); global_plan_trajectory_distance = 0; - this->global_plan = global_plan; + this->global_plan_msg = global_plan_msg; this->is_global_plan_received = true; goal_mode = CUSTOM_WAYPOINT; @@ -613,17 +612,20 @@ class DroanLocalPlanner : public rclcpp::Node { } } + /** + * Check if we should switch from CUSTOM_WAYPOINT to AUTO_WAYPOINT + */ void update_waypoint_mode() { if (goal_mode == CUSTOM_WAYPOINT) { - if (global_plan.waypoints.size() < 2) goal_mode = AUTO_WAYPOINT; + if (global_plan_msg.waypoints.size() < 2) goal_mode = AUTO_WAYPOINT; // check if the time limit for reaching the waypoint has elapsed - double elapsed_time = (this->now() - global_plan.header.stamp).seconds(); + double elapsed_time = (this->now() - global_plan_msg.header.stamp).seconds(); double distance = 0; - for (size_t i = 1; i < global_plan.waypoints.size(); i++) { + for (size_t i = 1; i < global_plan_msg.waypoints.size(); i++) { airstack_msgs::msg::WaypointXYZVYaw prev_wp, curr_wp; - prev_wp = global_plan.waypoints[i - 1]; - curr_wp = global_plan.waypoints[i]; + prev_wp = global_plan_msg.waypoints[i - 1]; + curr_wp = global_plan_msg.waypoints[i]; distance += sqrt(pow(prev_wp.position.x - curr_wp.position.x, 2) + pow(prev_wp.position.y - curr_wp.position.y, 2)); @@ -640,18 +642,18 @@ class DroanLocalPlanner : public rclcpp::Node { if (is_tracking_point_received) { try { tf2::Stamped transform; - tf_buffer.canTransform(tracking_point_odom.header.frame_id, - global_plan.header.frame_id, global_plan.header.stamp, - rclcpp::Duration::from_seconds(0.1)); + tf_buffer.canTransform( + tracking_point_odom.header.frame_id, global_plan_msg.header.frame_id, + global_plan_msg.header.stamp, rclcpp::Duration::from_seconds(0.1)); auto transform_msg = tf_buffer.lookupTransform( - tracking_point_odom.header.frame_id, global_plan.header.frame_id, - global_plan.header.stamp); + tracking_point_odom.header.frame_id, global_plan_msg.header.frame_id, + global_plan_msg.header.stamp); tf2::fromMsg(transform_msg, transform); tf2::Vector3 tp_position = tflib::to_tf(tracking_point_odom.pose.position); tp_position.setZ(0); tf2::Vector3 wp_position = - transform * tflib::to_tf(global_plan.waypoints.back().position); + transform * tflib::to_tf(global_plan_msg.waypoints.back().position); wp_position.setZ(0); if (tp_position.distance(wp_position) < custom_waypoint_distance_threshold) { @@ -674,12 +676,4 @@ class DroanLocalPlanner : public rclcpp::Node { is_tracking_point_received = true; tracking_point_odom = *odom; } - void range_up_callback(const sensor_msgs::msg::Range::SharedPtr range) { - got_range_up = true; - range_up = *range; - } - void range_down_callback(const sensor_msgs::msg::Range::SharedPtr range) { - got_range_down = true; - range_down = *range; - } }; diff --git a/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/launch/droan_local_planner_launch.xml b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/launch/droan_local_planner_launch.xml new file mode 100644 index 00000000..c1445250 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/launch/droan_local_planner_launch.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/launch/droan_local_planner_launch.yaml b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/launch/droan_local_planner_launch.yaml new file mode 100644 index 00000000..b1a89a75 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/launch/droan_local_planner_launch.yaml @@ -0,0 +1,16 @@ +launch: +# - arg: +# name: "robot_name" +# default: "robot1" +# - arg: +# name: "tf_prefix" +# default: "$(var robot_name)" +- node: + pkg: "droan_local_planner" + exec: "droan_local_planner" + name: "droan_local_planner" + namespace: "droan_local_planner" + param: + - + from: $(find-pkg-share droan_local_planner)/config/droan.yaml + # allow_substs: true diff --git a/ros_ws/src/robot/autonomy/planning/local/droan_local_planner/package.xml b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/package.xml similarity index 92% rename from ros_ws/src/robot/autonomy/planning/local/droan_local_planner/package.xml rename to ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/package.xml index 541df373..ef446e80 100644 --- a/ros_ws/src/robot/autonomy/planning/local/droan_local_planner/package.xml +++ b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/package.xml @@ -10,7 +10,7 @@ ament_cmake airstack_msgs - core_map_representation_interface + map_representation_interface pluginlib rclcpp std_msgs @@ -25,4 +25,4 @@ ament_cmake - + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/planning/local/droan_local_planner/src/droan_local_planner.cpp b/ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/src/droan_local_planner.cpp similarity index 100% rename from ros_ws/src/robot/autonomy/planning/local/droan_local_planner/src/droan_local_planner.cpp rename to ros_ws/src/robot/autonomy/3_local/b_planners/droan_local_planner/src/droan_local_planner.cpp diff --git a/ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/CMakeLists.txt rename to ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/README.md b/ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/README.md similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/README.md rename to ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/README.md diff --git a/ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/include/takeoff_landing_planner/takeoff_landing_planner.hpp b/ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/include/takeoff_landing_planner/takeoff_landing_planner.hpp similarity index 99% rename from ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/include/takeoff_landing_planner/takeoff_landing_planner.hpp rename to ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/include/takeoff_landing_planner/takeoff_landing_planner.hpp index b1023536..21fbc4a3 100644 --- a/ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/include/takeoff_landing_planner/takeoff_landing_planner.hpp +++ b/ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/include/takeoff_landing_planner/takeoff_landing_planner.hpp @@ -54,7 +54,7 @@ class TakeoffLandingPlanner : public rclcpp::Node { tf2_ros::TransformListener* tf_listener; // publishers - rclcpp::Publisher::SharedPtr traj_track_pub; + rclcpp::Publisher::SharedPtr traj_override_pub; rclcpp::Publisher::SharedPtr takeoff_state_pub; rclcpp::Publisher::SharedPtr landing_state_pub; diff --git a/ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/launch/takeoff_landing_planner.xml b/ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/launch/takeoff_landing_planner.launch.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/launch/takeoff_landing_planner.xml rename to ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/launch/takeoff_landing_planner.launch.xml diff --git a/ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/package.xml b/ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/package.xml rename to ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/package.xml diff --git a/ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/src/takeoff_landing_planner.cpp b/ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/src/takeoff_landing_planner.cpp similarity index 94% rename from ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/src/takeoff_landing_planner.cpp rename to ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/src/takeoff_landing_planner.cpp index 47581164..23153f9f 100644 --- a/ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/src/takeoff_landing_planner.cpp +++ b/ros_ws/src/robot/autonomy/3_local/b_planners/takeoff_landing_planner/src/takeoff_landing_planner.cpp @@ -37,8 +37,8 @@ TakeoffLandingPlanner::TakeoffLandingPlanner() : rclcpp::Node("takeoff_landing_p std::bind(&TakeoffLandingPlanner::high_takeoff_callback, this, std::placeholders::_1)); // init publishers - traj_track_pub = - this->create_publisher("trajectory_track", 1); + traj_override_pub = + this->create_publisher("trajectory_override", 1); takeoff_state_pub = this->create_publisher("takeoff_state", 1); landing_state_pub = this->create_publisher("landing_state", 1); @@ -232,21 +232,28 @@ void TakeoffLandingPlanner::set_takeoff_landing_command( // put the trajectory controller into track mode // traj_mode_client.call(track_mode_srv); // publish a takeoff trajectory + RCLCPP_INFO_STREAM(get_logger(), "takeofflanding 1"); + airstack_msgs::msg::Odometry takeoff_starting_point = tracking_point_odom; if (got_robot_odom && takeoff_path_relative_to_orientation) takeoff_starting_point.pose.orientation = robot_odom.pose.pose.orientation; - if (high_takeoff) - traj_track_pub->publish(high_takeoff_traj_gen->get_trajectory(takeoff_starting_point)); - else - traj_track_pub->publish(takeoff_traj_gen->get_trajectory(takeoff_starting_point)); + if (high_takeoff) { + RCLCPP_INFO_STREAM(get_logger(), "takeofflanding hightakeoff"); + traj_override_pub->publish( + high_takeoff_traj_gen->get_trajectory(takeoff_starting_point)); + } else { + RCLCPP_INFO_STREAM(get_logger(), "takeofflanding lowtakeoff"); + traj_override_pub->publish(takeoff_traj_gen->get_trajectory(takeoff_starting_point)); + } } else if (current_command == airstack_msgs::srv::TakeoffLandingCommand::Request::LAND) { robot_odoms.clear(); // put the trajectory controller into track mode // traj_mode_client.call(track_mode_srv); // publish a landing trajectory - traj_track_pub->publish(landing_traj_gen->get_trajectory(tracking_point_odom)); + traj_override_pub->publish(landing_traj_gen->get_trajectory(tracking_point_odom)); } + RCLCPP_INFO_STREAM(get_logger(), "takeofflanding end"); response->accepted = true; } diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/.gitignore b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/.gitignore similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/.gitignore rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/.gitignore diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/CMakeLists.txt rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/config/acceleration_magnitudes.yaml b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/acceleration_magnitudes.yaml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/config/acceleration_magnitudes.yaml rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/acceleration_magnitudes.yaml diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/config/acceleration_trajectories.yaml b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/acceleration_trajectories.yaml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/config/acceleration_trajectories.yaml rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/acceleration_trajectories.yaml diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/config/acceleration_trajectories_fast.yaml b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/acceleration_trajectories_fast.yaml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/config/acceleration_trajectories_fast.yaml rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/acceleration_trajectories_fast.yaml diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/config/backup.yaml b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/backup.yaml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/config/backup.yaml rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/backup.yaml diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/config/demo_trajectory_definitions.yaml b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/demo_trajectory_definitions.yaml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/config/demo_trajectory_definitions.yaml rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/demo_trajectory_definitions.yaml diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/config/fixed_trajectories.yaml b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/fixed_trajectories.yaml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/config/fixed_trajectories.yaml rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/fixed_trajectories.yaml diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/config/test.yaml b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/test.yaml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/config/test.yaml rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/config/test.yaml diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/include/trajectory_library/trajectory_library.hpp b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/include/trajectory_library/trajectory_library.hpp similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/include/trajectory_library/trajectory_library.hpp rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/include/trajectory_library/trajectory_library.hpp diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/package.xml b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/package.xml rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/package.xml diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/plugin.xml b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/plugin.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/plugin.xml rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/plugin.xml diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/scripts/fixed_trajectory_generator.py b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/scripts/fixed_trajectory_generator.py similarity index 51% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/scripts/fixed_trajectory_generator.py rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/scripts/fixed_trajectory_generator.py index 2f619aa2..0675cc68 100755 --- a/ros_ws/src/robot/autonomy/controls/trajectory_library/scripts/fixed_trajectory_generator.py +++ b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/scripts/fixed_trajectory_generator.py @@ -10,94 +10,101 @@ import rclpy from rclpy.node import Node + def get_velocities(traj, velocity, max_acc): - v_prev = 0. + v_prev = 0.0 for i in range(len(traj.waypoints)): - j = (i+1) % len(traj.waypoints) + j = (i + 1) % len(traj.waypoints) dx = traj.waypoints[j].position.x - traj.waypoints[i].position.x dy = traj.waypoints[j].position.y - traj.waypoints[i].position.y dist = np.sqrt(dx**2 + dy**2) - v_limit = np.sqrt(v_prev**2 + 2*max_acc*dist) + v_limit = np.sqrt(v_prev**2 + 2 * max_acc * dist) traj.waypoints[i].velocity = min(velocity, v_limit) v_prev = traj.waypoints[i].velocity + def get_velocities_dual(traj, velocity, max_acc): - v_prev = 0. + v_prev = 0.0 for i in range(len(traj.waypoints)): - j = (i+1) % len(traj.waypoints) + j = (i + 1) % len(traj.waypoints) dx = traj.waypoints[j].position.x - traj.waypoints[i].position.x dy = traj.waypoints[j].position.y - traj.waypoints[i].position.y dist = np.sqrt(dx**2 + dy**2) - v_limit = np.sqrt(v_prev**2 + 2*max_acc*dist) + v_limit = np.sqrt(v_prev**2 + 2 * max_acc * dist) traj.waypoints[i].velocity = min(velocity, v_limit) v_prev = traj.waypoints[i].velocity - v_prev = 0. - for i in range(len(traj.waypoints)-1, int(len(traj.waypoints)*0.85), -1): - j = (i-1) % len(traj.waypoints) + v_prev = 0.0 + for i in range(len(traj.waypoints) - 1, int(len(traj.waypoints) * 0.85), -1): + j = (i - 1) % len(traj.waypoints) dx = traj.waypoints[j].position.x - traj.waypoints[i].position.x dy = traj.waypoints[j].position.y - traj.waypoints[i].position.y dist = np.sqrt(dx**2 + dy**2) - v_limit = np.sqrt(v_prev**2 + 2*max_acc*dist) + v_limit = np.sqrt(v_prev**2 + 2 * max_acc * dist) traj.waypoints[i].velocity = min(velocity, v_limit) v_prev = traj.waypoints[i].velocity - traj.waypoints[len(traj.waypoints)-1].velocity = 0. + traj.waypoints[len(traj.waypoints) - 1].velocity = 0.0 + def get_accelerations(traj): - a_prev = 0. + a_prev = 0.0 - for i in range(len(traj.waypoints)-2): - j = (i+1) % len(traj.waypoints) - k = (i+2) % len(traj.waypoints) + for i in range(len(traj.waypoints) - 2): + j = (i + 1) % len(traj.waypoints) + k = (i + 2) % len(traj.waypoints) dx1 = traj.waypoints[j].position.x - traj.waypoints[i].position.x dy1 = traj.waypoints[j].position.y - traj.waypoints[i].position.y dist1 = np.sqrt(dx1**2 + dy1**2) - v_currx = traj.waypoints[i].velocity * ( dx1 ) / dist1 - v_curry = traj.waypoints[i].velocity * ( dy1 ) / dist1 + v_currx = traj.waypoints[i].velocity * (dx1) / dist1 + v_curry = traj.waypoints[i].velocity * (dy1) / dist1 dx2 = traj.waypoints[k].position.x - traj.waypoints[j].position.x dy2 = traj.waypoints[k].position.y - traj.waypoints[j].position.y dist2 = np.sqrt(dx2**2 + dy2**2) - v_nextx = traj.waypoints[j].velocity * ( dx2 ) / dist2 - v_nexty = traj.waypoints[j].velocity * ( dy2 ) / dist2 - + v_nextx = traj.waypoints[j].velocity * (dx2) / dist2 + v_nexty = traj.waypoints[j].velocity * (dy2) / dist2 + acc_limit = 50 - if abs(dx1-0)<1e-6: - traj.waypoints[i].acceleration.x = 0. + if abs(dx1 - 0) < 1e-6: + traj.waypoints[i].acceleration.x = 0.0 else: - traj.waypoints[i].acceleration.x = min((v_nextx**2 - v_currx**2)/(2*dx1), acc_limit) + traj.waypoints[i].acceleration.x = min( + (v_nextx**2 - v_currx**2) / (2 * dx1), acc_limit + ) - if abs(dy1-0)<1e-6: - traj.waypoints[i].acceleration.y = 0. - else: - traj.waypoints[i].acceleration.y = min((v_nexty**2 - v_curry**2)/(2*dy1), acc_limit) + if abs(dy1 - 0) < 1e-6: + traj.waypoints[i].acceleration.y = 0.0 + else: + traj.waypoints[i].acceleration.y = min( + (v_nexty**2 - v_curry**2) / (2 * dy1), acc_limit + ) - traj.waypoints[i].acceleration.z = 0. + traj.waypoints[i].acceleration.z = 0.0 - traj.waypoints[len(traj.waypoints)-2].acceleration.x = 0. - traj.waypoints[len(traj.waypoints)-2].acceleration.y = 0. - traj.waypoints[len(traj.waypoints)-2].acceleration.z = 0. - traj.waypoints[len(traj.waypoints)-1].acceleration.x = 0. - traj.waypoints[len(traj.waypoints)-1].acceleration.y = 0. - traj.waypoints[len(traj.waypoints)-1].acceleration.z = 0. + traj.waypoints[len(traj.waypoints) - 2].acceleration.x = 0.0 + traj.waypoints[len(traj.waypoints) - 2].acceleration.y = 0.0 + traj.waypoints[len(traj.waypoints) - 2].acceleration.z = 0.0 + traj.waypoints[len(traj.waypoints) - 1].acceleration.x = 0.0 + traj.waypoints[len(traj.waypoints) - 1].acceleration.y = 0.0 + traj.waypoints[len(traj.waypoints) - 1].acceleration.z = 0.0 -def get_racetrack_waypoints(attributes):#length, width, height): - frame_id = str(attributes['frame_id']) - length = float(attributes['length']) - width = float(attributes['width']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) - max_acceleration = float(attributes['max_acceleration']) +def get_racetrack_waypoints(attributes): # length, width, height): + frame_id = str(attributes["frame_id"]) + length = float(attributes["length"]) + width = float(attributes["width"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) + max_acceleration = float(attributes["max_acceleration"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id @@ -109,29 +116,29 @@ def get_racetrack_waypoints(attributes):#length, width, height): yaws1 = np.zeros(xs1.shape) # first turn - t = np.linspace(-np.pi/2, np.pi/2, 50)[1:-1] - xs2 = width/2.*np.cos(t) + straightaway_length - ys2 = width/2.*np.sin(t) + width/2. - xs2d = -width/2.*np.sin(t) # derivative of xs - ys2d = width/2.*np.cos(t) # derivative of ys + t = np.linspace(-np.pi / 2, np.pi / 2, 50)[1:-1] + xs2 = width / 2.0 * np.cos(t) + straightaway_length + ys2 = width / 2.0 * np.sin(t) + width / 2.0 + xs2d = -width / 2.0 * np.sin(t) # derivative of xs + ys2d = width / 2.0 * np.cos(t) # derivative of ys yaws2 = np.arctan2(ys2d, xs2d) # second straightaway xs3 = np.linspace(straightaway_length, 0, 80) - ys3 = width*np.ones(xs3.shape) - yaws3 = np.pi*np.ones(xs3.shape) + ys3 = width * np.ones(xs3.shape) + yaws3 = np.pi * np.ones(xs3.shape) # second turn - t = np.linspace(np.pi/2, 3*np.pi/2, 50)[1:-1] - xs4 = width/2.*np.cos(t) - ys4 = width/2.*np.sin(t) + width/2. + t = np.linspace(np.pi / 2, 3 * np.pi / 2, 50)[1:-1] + xs4 = width / 2.0 * np.cos(t) + ys4 = width / 2.0 * np.sin(t) + width / 2.0 yaws4 = yaws2 + np.pi xs = np.hstack((xs1, xs2, xs3, xs4)) ys = np.hstack((ys1, ys2, ys3, ys4)) yaws = np.hstack((yaws1, yaws2, yaws3, yaws4)) - #now = rospy.Time.now() + # now = rospy.Time.now() for i in range(xs.shape[0]): wp = WaypointXYZVYaw() wp.position.x = xs[i] @@ -147,26 +154,26 @@ def get_racetrack_waypoints(attributes):#length, width, height): return traj -def get_figure8_waypoints(attributes):#length, width, height): - frame_id = str(attributes['frame_id']) - length = float(attributes['length']) - width = float(attributes['width']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) - max_acceleration = float(attributes['max_acceleration']) +def get_figure8_waypoints(attributes): # length, width, height): + frame_id = str(attributes["frame_id"]) + length = float(attributes["length"]) + width = float(attributes["width"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) + max_acceleration = float(attributes["max_acceleration"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id - #now = rospy.Time.now() + # now = rospy.Time.now() # figure 8 points - t = np.linspace(0, 2*np.pi, 600) + t = np.linspace(0, 2 * np.pi, 600) x = np.cos(t) * length - length - y = np.cos(t)*np.sin(t) * 2*width + y = np.cos(t) * np.sin(t) * 2 * width # derivative of figure 8 curve, used to find yaw xd = -np.sin(t) * length - yd = (np.cos(t)**2 - np.sin(t)**2) * 2*width + yd = (np.cos(t) ** 2 - np.sin(t) ** 2) * 2 * width for i in range(t.shape[0] - 1): x1 = x[i] @@ -189,12 +196,13 @@ def get_figure8_waypoints(attributes):#length, width, height): return traj -def get_line_waypoints(attributes):#length, height): - frame_id = str(attributes['frame_id']) - length = float(attributes['length']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) - max_acceleration = float(attributes['max_acceleration']) + +def get_line_waypoints(attributes): # length, height): + frame_id = str(attributes["frame_id"]) + length = float(attributes["length"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) + max_acceleration = float(attributes["max_acceleration"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id @@ -212,13 +220,14 @@ def get_line_waypoints(attributes):#length, height): return traj -def get_point_waypoints(attributes):#length, height): - frame_id = str(attributes['frame_id']) - x = float(attributes['x']) - y = float(attributes['y']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) - max_acceleration = float(attributes['max_acceleration']) + +def get_point_waypoints(attributes): # length, height): + frame_id = str(attributes["frame_id"]) + x = float(attributes["x"]) + y = float(attributes["y"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) + max_acceleration = float(attributes["max_acceleration"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id @@ -236,86 +245,88 @@ def get_point_waypoints(attributes):#length, height): return traj -def get_box_waypoints(attributes):#length, height): - frame_id = str(attributes['frame_id']) - length = float(attributes['length']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) - max_acceleration = float(attributes['max_acceleration']) + +def get_box_waypoints(attributes): # length, height): + frame_id = str(attributes["frame_id"]) + length = float(attributes["length"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) + max_acceleration = float(attributes["max_acceleration"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id wp1 = WaypointXYZVYaw() - wp1.position.x = 0. - wp1.position.y = 0. + wp1.position.x = 0.0 + wp1.position.y = 0.0 wp1.position.z = height wp1.yaw = 0 traj.waypoints.append(wp1) wp2 = WaypointXYZVYaw() wp2.position.x = length - wp2.position.y = 0. + wp2.position.y = 0.0 wp2.position.z = height - wp2.yaw = 0. + wp2.yaw = 0.0 traj.waypoints.append(wp2) wp3 = WaypointXYZVYaw() wp3.position.x = length - wp3.position.y = 0. + wp3.position.y = 0.0 wp3.position.z = height + height - wp3.yaw = 0. + wp3.yaw = 0.0 traj.waypoints.append(wp3) wp4 = WaypointXYZVYaw() - wp4.position.x = 0. - wp4.position.y = 0. + wp4.position.x = 0.0 + wp4.position.y = 0.0 wp4.position.z = height + height - wp4.yaw = 0. + wp4.yaw = 0.0 traj.waypoints.append(wp4) return traj -def get_vertical_lawnmower_waypoints(attributes):#length, width, height, velocity): - frame_id = str(attributes['frame_id']) - length = float(attributes['length']) - width = float(attributes['width']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) + +def get_vertical_lawnmower_waypoints(attributes): # length, width, height, velocity): + frame_id = str(attributes["frame_id"]) + length = float(attributes["length"]) + width = float(attributes["width"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id - for i in range(abs(int(height/width))): + for i in range(abs(int(height / width))): wp1 = WaypointXYZVYaw() - wp1.position.x = 0. - wp1.position.y = 0. - wp1.position.z = np.sign(height)*(i+1)*width - wp1.yaw = 0. + wp1.position.x = 0.0 + wp1.position.y = 0.0 + wp1.position.z = np.sign(height) * (i + 1) * width + wp1.yaw = 0.0 wp1.velocity = 0.1 wp1_ = WaypointXYZVYaw() - wp1_.position.x = 0. + wp1_.position.x = 0.0 wp1_.position.y = 0.5 - wp1_.position.z = np.sign(height)*(i+1)*width - wp1_.yaw = 0. + wp1_.position.z = np.sign(height) * (i + 1) * width + wp1_.yaw = 0.0 wp1_.velocity = velocity wp2 = WaypointXYZVYaw() - wp2.position.x = 0. + wp2.position.x = 0.0 wp2.position.y = length - wp2.position.z = np.sign(height)*(i+1)*width - wp2.yaw = 0. + wp2.position.z = np.sign(height) * (i + 1) * width + wp2.yaw = 0.0 wp2.velocity = 0.1 wp2_ = WaypointXYZVYaw() - wp2_.position.x = 0. + wp2_.position.x = 0.0 wp2_.position.y = length - 0.5 - wp2_.position.z = np.sign(height)*(i+1)*width - wp2_.yaw = 0. + wp2_.position.z = np.sign(height) * (i + 1) * width + wp2_.yaw = 0.0 wp2_.velocity = velocity - if i%2 == 0: + if i % 2 == 0: traj.waypoints.append(wp1) wp1_slow = copy.deepcopy(wp1_) wp1_slow.velocity = 0.1 @@ -333,75 +344,84 @@ def get_vertical_lawnmower_waypoints(attributes):#length, width, height, velocit traj.waypoints.append(wp1) wp = WaypointXYZVYaw() - wp.position.x = 0. - wp.position.y = 0. - wp.position.z = 0. - wp.yaw = 0. + wp.position.x = 0.0 + wp.position.y = 0.0 + wp.position.z = 0.0 + wp.yaw = 0.0 wp.velocity = 0.5 traj.waypoints.append(wp) return traj -def get_circle_waypoints(attributes):#radius, velocity, frame_id): - frame_id = str(attributes['frame_id']) - radius = float(attributes['radius']) - velocity = float(attributes['velocity']) + +def get_circle_waypoints(attributes): # radius, velocity, frame_id): + frame_id = str(attributes["frame_id"]) + radius = float(attributes["radius"]) + velocity = float(attributes["velocity"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id - #traj.header.stamp = rospy.Time.now() + # traj.header.stamp = rospy.Time.now() wp0 = WaypointXYZVYaw() - wp0.position.x = 0. - wp0.position.y = 0. - wp0.position.z = 0. - wp0.yaw = 0. + wp0.position.x = 0.0 + wp0.position.y = 0.0 + wp0.position.z = 0.0 + wp0.yaw = 0.0 wp0.velocity = velocity traj.waypoints.append(wp0) wp1 = WaypointXYZVYaw() wp1.position.x = radius - wp1.position.y = 0. - wp1.position.z = 0. - wp1.yaw = 0. + wp1.position.y = 0.0 + wp1.position.z = 0.0 + wp1.yaw = 0.0 wp1.velocity = velocity traj.waypoints.append(wp1) - for angle in np.arange(0, 2*np.pi, 10.*np.pi/180.): + for angle in np.arange(0, 2 * np.pi, 10.0 * np.pi / 180.0): wp = WaypointXYZVYaw() - wp.position.x = radius*np.cos(angle) - wp.position.y = radius*np.sin(angle) - wp.position.z = 0. - wp.yaw = 0. + wp.position.x = radius * np.cos(angle) + wp.position.y = radius * np.sin(angle) + wp.position.z = 0.0 + wp.yaw = 0.0 wp.velocity = velocity traj.waypoints.append(wp) wp_end0 = WaypointXYZVYaw() wp_end0.position.x = radius - wp_end0.position.y = 0. - wp_end0.position.z = 0. - wp_end0.yaw = 0. + wp_end0.position.y = 0.0 + wp_end0.position.z = 0.0 + wp_end0.yaw = 0.0 wp_end0.velocity = velocity traj.waypoints.append(wp_end0) wp_end1 = WaypointXYZVYaw() - wp_end1.position.x = 0. - wp_end1.position.y = 0. - wp_end1.position.z = 0. - wp_end1.yaw = 0. + wp_end1.position.x = 0.0 + wp_end1.position.y = 0.0 + wp_end1.position.z = 0.0 + wp_end1.yaw = 0.0 wp_end1.velocity = velocity traj.waypoints.append(wp_end1) return traj + class FixedTrajectoryGenerator(Node): def __init__(self): - super().__init__('fixed_trajectory_generator') - self.fixed_trajectory_sub = self.create_subscription(FixedTrajectory, 'fixed_trajectory_command', self.fixed_trajectory_callback, 1) - self.trajectory_track_pub = self.create_publisher(TrajectoryXYZVYaw, 'trajectory_track', 1) - + super().__init__("fixed_trajectory_generator") + self.fixed_trajectory_sub = self.create_subscription( + FixedTrajectory, + "fixed_trajectory_command", + self.fixed_trajectory_callback, + 1, + ) + self.trajectory_override_pub = self.create_publisher( + TrajectoryXYZVYaw, "trajectory_override", 1 + ) + def fixed_trajectory_callback(self, msg): - print('generating') + print("generating") attributes = {} for key_value in msg.attributes: @@ -409,23 +429,24 @@ def fixed_trajectory_callback(self, msg): trajectory_msg = None - if msg.type == 'Figure8': + if msg.type == "Figure8": trajectory_msg = get_figure8_waypoints(attributes) - elif msg.type == 'Circle': + elif msg.type == "Circle": trajectory_msg = get_circle_waypoints(attributes) - elif msg.type == 'Racetrack': + elif msg.type == "Racetrack": trajectory_msg = get_racetrack_waypoints(attributes) - elif msg.type == 'Line': + elif msg.type == "Line": trajectory_msg = get_line_waypoints(attributes) - elif msg.type == 'Point': + elif msg.type == "Point": trajectory_msg = get_point_waypoints(attributes) if trajectory_msg != None: - self.trajectory_track_pub.publish(trajectory_msg) + self.trajectory_override_pub.publish(trajectory_msg) else: - print('No trajectory sent.') + print("No trajectory sent.") + -if __name__ == '__main__': +if __name__ == "__main__": rclpy.init(args=None) node = FixedTrajectoryGenerator() @@ -433,4 +454,3 @@ def fixed_trajectory_callback(self, msg): rclpy.spin(node) node.destroy_node() rclpy.shutdown() - diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/scripts/rqt_fixed_trajectory_selector b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/scripts/rqt_fixed_trajectory_selector similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/scripts/rqt_fixed_trajectory_selector rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/scripts/rqt_fixed_trajectory_selector diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/setup.py b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/setup.py similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/setup.py rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/setup.py diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/src/fixed_trajectory_generator.py b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/fixed_trajectory_generator.py similarity index 58% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/src/fixed_trajectory_generator.py rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/fixed_trajectory_generator.py index c4be0854..b13f7e7c 100755 --- a/ros_ws/src/robot/autonomy/controls/trajectory_library/src/fixed_trajectory_generator.py +++ b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/fixed_trajectory_generator.py @@ -5,10 +5,11 @@ import rospy import tf.transformations as trans import argparse -#from at_fcs_mavros.msg import Trajectory -#from at_fcs_mavros.msg import Waypoint -#from ca_nav_msgs.msg import XYZVPsi -#from ca_nav_msgs.msg import PathXYZVPsi + +# from at_fcs_mavros.msg import Trajectory +# from at_fcs_mavros.msg import Waypoint +# from ca_nav_msgs.msg import XYZVPsi +# from ca_nav_msgs.msg import PathXYZVPsi from airstack_msgs.msg import WaypointXYZVYaw from airstack_msgs.msg import TrajectoryXYZVYaw from trajectory_controller.msg import Trajectory @@ -16,94 +17,101 @@ import time import copy + def get_velocities(traj, velocity, max_acc): - v_prev = 0. + v_prev = 0.0 for i in range(len(traj.waypoints)): - j = (i+1) % len(traj.waypoints) + j = (i + 1) % len(traj.waypoints) dx = traj.waypoints[j].position.x - traj.waypoints[i].position.x dy = traj.waypoints[j].position.y - traj.waypoints[i].position.y dist = np.sqrt(dx**2 + dy**2) - v_limit = np.sqrt(v_prev**2 + 2*max_acc*dist) + v_limit = np.sqrt(v_prev**2 + 2 * max_acc * dist) traj.waypoints[i].velocity = min(velocity, v_limit) v_prev = traj.waypoints[i].velocity + def get_velocities_dual(traj, velocity, max_acc): - v_prev = 0. + v_prev = 0.0 for i in range(len(traj.waypoints)): - j = (i+1) % len(traj.waypoints) + j = (i + 1) % len(traj.waypoints) dx = traj.waypoints[j].position.x - traj.waypoints[i].position.x dy = traj.waypoints[j].position.y - traj.waypoints[i].position.y dist = np.sqrt(dx**2 + dy**2) - v_limit = np.sqrt(v_prev**2 + 2*max_acc*dist) + v_limit = np.sqrt(v_prev**2 + 2 * max_acc * dist) traj.waypoints[i].velocity = min(velocity, v_limit) v_prev = traj.waypoints[i].velocity - v_prev = 0. - for i in range(len(traj.waypoints)-1, int(len(traj.waypoints)*0.85), -1): - j = (i-1) % len(traj.waypoints) + v_prev = 0.0 + for i in range(len(traj.waypoints) - 1, int(len(traj.waypoints) * 0.85), -1): + j = (i - 1) % len(traj.waypoints) dx = traj.waypoints[j].position.x - traj.waypoints[i].position.x dy = traj.waypoints[j].position.y - traj.waypoints[i].position.y dist = np.sqrt(dx**2 + dy**2) - v_limit = np.sqrt(v_prev**2 + 2*max_acc*dist) + v_limit = np.sqrt(v_prev**2 + 2 * max_acc * dist) traj.waypoints[i].velocity = min(velocity, v_limit) v_prev = traj.waypoints[i].velocity - traj.waypoints[len(traj.waypoints)-1].velocity = 0 + traj.waypoints[len(traj.waypoints) - 1].velocity = 0 + def get_accelerations(traj): - a_prev = 0. + a_prev = 0.0 - for i in range(len(traj.waypoints)-2): - j = (i+1) % len(traj.waypoints) - k = (i+2) % len(traj.waypoints) + for i in range(len(traj.waypoints) - 2): + j = (i + 1) % len(traj.waypoints) + k = (i + 2) % len(traj.waypoints) dx1 = traj.waypoints[j].position.x - traj.waypoints[i].position.x dy1 = traj.waypoints[j].position.y - traj.waypoints[i].position.y dist1 = np.sqrt(dx1**2 + dy1**2) - v_currx = traj.waypoints[i].velocity * ( dx1 ) / dist1 - v_curry = traj.waypoints[i].velocity * ( dy1 ) / dist1 + v_currx = traj.waypoints[i].velocity * (dx1) / dist1 + v_curry = traj.waypoints[i].velocity * (dy1) / dist1 dx2 = traj.waypoints[k].position.x - traj.waypoints[j].position.x dy2 = traj.waypoints[k].position.y - traj.waypoints[j].position.y dist2 = np.sqrt(dx2**2 + dy2**2) - v_nextx = traj.waypoints[j].velocity * ( dx2 ) / dist2 - v_nexty = traj.waypoints[j].velocity * ( dy2 ) / dist2 - + v_nextx = traj.waypoints[j].velocity * (dx2) / dist2 + v_nexty = traj.waypoints[j].velocity * (dy2) / dist2 + acc_limit = 50 - if abs(dx1-0)<1e-6: + if abs(dx1 - 0) < 1e-6: traj.waypoints[i].acceleration.x = 0 else: - traj.waypoints[i].acceleration.x = min((v_nextx**2 - v_currx**2)/(2*dx1), acc_limit) + traj.waypoints[i].acceleration.x = min( + (v_nextx**2 - v_currx**2) / (2 * dx1), acc_limit + ) - if abs(dy1-0)<1e-6: + if abs(dy1 - 0) < 1e-6: traj.waypoints[i].acceleration.y = 0 - else: - traj.waypoints[i].acceleration.y = min((v_nexty**2 - v_curry**2)/(2*dy1), acc_limit) + else: + traj.waypoints[i].acceleration.y = min( + (v_nexty**2 - v_curry**2) / (2 * dy1), acc_limit + ) traj.waypoints[i].acceleration.z = 0 - traj.waypoints[len(traj.waypoints)-2].acceleration.x = 0 - traj.waypoints[len(traj.waypoints)-2].acceleration.y = 0 - traj.waypoints[len(traj.waypoints)-2].acceleration.z = 0 - traj.waypoints[len(traj.waypoints)-1].acceleration.x = 0 - traj.waypoints[len(traj.waypoints)-1].acceleration.y = 0 - traj.waypoints[len(traj.waypoints)-1].acceleration.z = 0 + traj.waypoints[len(traj.waypoints) - 2].acceleration.x = 0 + traj.waypoints[len(traj.waypoints) - 2].acceleration.y = 0 + traj.waypoints[len(traj.waypoints) - 2].acceleration.z = 0 + traj.waypoints[len(traj.waypoints) - 1].acceleration.x = 0 + traj.waypoints[len(traj.waypoints) - 1].acceleration.y = 0 + traj.waypoints[len(traj.waypoints) - 1].acceleration.z = 0 -def get_racetrack_waypoints(attributes):#length, width, height): - frame_id = str(attributes['frame_id']) - length = float(attributes['length']) - width = float(attributes['width']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) - max_acceleration = float(attributes['max_acceleration']) +def get_racetrack_waypoints(attributes): # length, width, height): + frame_id = str(attributes["frame_id"]) + length = float(attributes["length"]) + width = float(attributes["width"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) + max_acceleration = float(attributes["max_acceleration"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id @@ -115,22 +123,22 @@ def get_racetrack_waypoints(attributes):#length, width, height): yaws1 = np.zeros(xs1.shape) # first turn - t = np.linspace(-np.pi/2, np.pi/2, 50)[1:-1] - xs2 = width/2.*np.cos(t) + straightaway_length - ys2 = width/2.*np.sin(t) + width/2. - xs2d = -width/2.*np.sin(t) # derivative of xs - ys2d = width/2.*np.cos(t) # derivative of ys + t = np.linspace(-np.pi / 2, np.pi / 2, 50)[1:-1] + xs2 = width / 2.0 * np.cos(t) + straightaway_length + ys2 = width / 2.0 * np.sin(t) + width / 2.0 + xs2d = -width / 2.0 * np.sin(t) # derivative of xs + ys2d = width / 2.0 * np.cos(t) # derivative of ys yaws2 = np.arctan2(ys2d, xs2d) # second straightaway xs3 = np.linspace(straightaway_length, 0, 80) - ys3 = width*np.ones(xs3.shape) - yaws3 = np.pi*np.ones(xs3.shape) + ys3 = width * np.ones(xs3.shape) + yaws3 = np.pi * np.ones(xs3.shape) # second turn - t = np.linspace(np.pi/2, 3*np.pi/2, 50)[1:-1] - xs4 = width/2.*np.cos(t) - ys4 = width/2.*np.sin(t) + width/2. + t = np.linspace(np.pi / 2, 3 * np.pi / 2, 50)[1:-1] + xs4 = width / 2.0 * np.cos(t) + ys4 = width / 2.0 * np.sin(t) + width / 2.0 yaws4 = yaws2 + np.pi xs = np.hstack((xs1, xs2, xs3, xs4)) @@ -153,26 +161,26 @@ def get_racetrack_waypoints(attributes):#length, width, height): return traj -def get_figure8_waypoints(attributes):#length, width, height): - frame_id = str(attributes['frame_id']) - length = float(attributes['length']) - width = float(attributes['width']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) - max_acceleration = float(attributes['max_acceleration']) +def get_figure8_waypoints(attributes): # length, width, height): + frame_id = str(attributes["frame_id"]) + length = float(attributes["length"]) + width = float(attributes["width"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) + max_acceleration = float(attributes["max_acceleration"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id now = rospy.Time.now() # figure 8 points - t = np.linspace(0, 2*np.pi, 600) + t = np.linspace(0, 2 * np.pi, 600) x = np.cos(t) * length - length - y = np.cos(t)*np.sin(t) * 2*width + y = np.cos(t) * np.sin(t) * 2 * width # derivative of figure 8 curve, used to find yaw xd = -np.sin(t) * length - yd = (np.cos(t)**2 - np.sin(t)**2) * 2*width + yd = (np.cos(t) ** 2 - np.sin(t) ** 2) * 2 * width for i in range(t.shape[0] - 1): x1 = x[i] @@ -195,12 +203,13 @@ def get_figure8_waypoints(attributes):#length, width, height): return traj -def get_line_waypoints(attributes):#length, height): - frame_id = str(attributes['frame_id']) - length = float(attributes['length']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) - max_acceleration = float(attributes['max_acceleration']) + +def get_line_waypoints(attributes): # length, height): + frame_id = str(attributes["frame_id"]) + length = float(attributes["length"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) + max_acceleration = float(attributes["max_acceleration"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id @@ -218,13 +227,14 @@ def get_line_waypoints(attributes):#length, height): return traj -def get_point_waypoints(attributes):#length, height): - frame_id = str(attributes['frame_id']) - x = float(attributes['x']) - y = float(attributes['y']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) - max_acceleration = float(attributes['max_acceleration']) + +def get_point_waypoints(attributes): # length, height): + frame_id = str(attributes["frame_id"]) + x = float(attributes["x"]) + y = float(attributes["y"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) + max_acceleration = float(attributes["max_acceleration"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id @@ -242,86 +252,88 @@ def get_point_waypoints(attributes):#length, height): return traj -def get_box_waypoints(attributes):#length, height): - frame_id = str(attributes['frame_id']) - length = float(attributes['length']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) - max_acceleration = float(attributes['max_acceleration']) + +def get_box_waypoints(attributes): # length, height): + frame_id = str(attributes["frame_id"]) + length = float(attributes["length"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) + max_acceleration = float(attributes["max_acceleration"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id wp1 = WaypointXYZVYaw() - wp1.position.x = 0. - wp1.position.y = 0. + wp1.position.x = 0.0 + wp1.position.y = 0.0 wp1.position.z = height wp1.yaw = 0 traj.waypoints.append(wp1) wp2 = WaypointXYZVYaw() wp2.position.x = length - wp2.position.y = 0. + wp2.position.y = 0.0 wp2.position.z = height wp2.yaw = 0 traj.waypoints.append(wp2) wp3 = WaypointXYZVYaw() wp3.position.x = length - wp3.position.y = 0. + wp3.position.y = 0.0 wp3.position.z = height + height wp3.yaw = 0 traj.waypoints.append(wp3) wp4 = WaypointXYZVYaw() - wp4.position.x = 0. - wp4.position.y = 0. + wp4.position.x = 0.0 + wp4.position.y = 0.0 wp4.position.z = height + height wp4.yaw = 0 traj.waypoints.append(wp4) return traj -def get_vertical_lawnmower_waypoints(attributes):#length, width, height, velocity): - frame_id = str(attributes['frame_id']) - length = float(attributes['length']) - width = float(attributes['width']) - height = float(attributes['height']) - velocity = float(attributes['velocity']) + +def get_vertical_lawnmower_waypoints(attributes): # length, width, height, velocity): + frame_id = str(attributes["frame_id"]) + length = float(attributes["length"]) + width = float(attributes["width"]) + height = float(attributes["height"]) + velocity = float(attributes["velocity"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id - for i in range(abs(int(height/width))): + for i in range(abs(int(height / width))): wp1 = WaypointXYZVYaw() wp1.position.x = 0 wp1.position.y = 0 - wp1.position.z = np.sign(height)*(i+1)*width + wp1.position.z = np.sign(height) * (i + 1) * width wp1.yaw = 0 wp1.velocity = 0.1 wp1_ = WaypointXYZVYaw() wp1_.position.x = 0 wp1_.position.y = 0.5 - wp1_.position.z = np.sign(height)*(i+1)*width + wp1_.position.z = np.sign(height) * (i + 1) * width wp1_.yaw = 0 wp1_.velocity = velocity wp2 = WaypointXYZVYaw() wp2.position.x = 0 wp2.position.y = length - wp2.position.z = np.sign(height)*(i+1)*width + wp2.position.z = np.sign(height) * (i + 1) * width wp2.yaw = 0 wp2.velocity = 0.1 wp2_ = WaypointXYZVYaw() wp2_.position.x = 0 wp2_.position.y = length - 0.5 - wp2_.position.z = np.sign(height)*(i+1)*width + wp2_.position.z = np.sign(height) * (i + 1) * width wp2_.yaw = 0 wp2_.velocity = velocity - if i%2 == 0: + if i % 2 == 0: traj.waypoints.append(wp1) wp1_slow = copy.deepcopy(wp1_) wp1_slow.velocity = 0.1 @@ -348,10 +360,11 @@ def get_vertical_lawnmower_waypoints(attributes):#length, width, height, velocit return traj -def get_circle_waypoints(attributes):#radius, velocity, frame_id): - frame_id = str(attributes['frame_id']) - radius = float(attributes['radius']) - velocity = float(attributes['velocity']) + +def get_circle_waypoints(attributes): # radius, velocity, frame_id): + frame_id = str(attributes["frame_id"]) + radius = float(attributes["radius"]) + velocity = float(attributes["velocity"]) traj = TrajectoryXYZVYaw() traj.header.frame_id = frame_id @@ -373,10 +386,10 @@ def get_circle_waypoints(attributes):#radius, velocity, frame_id): wp1.velocity = velocity traj.waypoints.append(wp1) - for angle in np.arange(0, 2*np.pi, 10.*np.pi/180.): + for angle in np.arange(0, 2 * np.pi, 10.0 * np.pi / 180.0): wp = WaypointXYZVYaw() - wp.position.x = radius*np.cos(angle) - wp.position.y = radius*np.sin(angle) + wp.position.x = radius * np.cos(angle) + wp.position.y = radius * np.sin(angle) wp.position.z = 0 wp.yaw = 0 wp.velocity = velocity @@ -409,27 +422,32 @@ def fixed_trajectory_callback(msg): trajectory_msg = None - if msg.type == 'Figure8': + if msg.type == "Figure8": trajectory_msg = get_figure8_waypoints(attributes) - elif msg.type == 'Circle': + elif msg.type == "Circle": trajectory_msg = get_circle_waypoints(attributes) - elif msg.type == 'Racetrack': + elif msg.type == "Racetrack": trajectory_msg = get_racetrack_waypoints(attributes) - elif msg.type == 'Line': + elif msg.type == "Line": trajectory_msg = get_line_waypoints(attributes) - elif msg.type == 'Point': + elif msg.type == "Point": trajectory_msg = get_point_waypoints(attributes) if trajectory_msg != None: - trajectory_track_pub.publish(trajectory_msg) + trajectory_override_pub.publish(trajectory_msg) else: - print('No trajectory sent.') + print("No trajectory sent.") + -if __name__ == '__main__': - rospy.init_node('fixed_trajectory_generator') +if __name__ == "__main__": + rospy.init_node("fixed_trajectory_generator") - fixed_trajectory_sub = rospy.Subscriber('fixed_trajectory', FixedTrajectory, fixed_trajectory_callback) + fixed_trajectory_sub = rospy.Subscriber( + "fixed_trajectory", FixedTrajectory, fixed_trajectory_callback + ) - trajectory_track_pub = rospy.Publisher('trajectory_track', TrajectoryXYZVYaw, queue_size=1) + trajectory_override_pub = rospy.Publisher( + "trajectory_override", TrajectoryXYZVYaw, queue_size=1 + ) rospy.spin() diff --git a/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/rqt_fixed_trajectory_selector/__init__.py b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/rqt_fixed_trajectory_selector/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/src/rqt_fixed_trajectory_selector/rqt_fixed_trajectory_selector.py b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/rqt_fixed_trajectory_selector/rqt_fixed_trajectory_selector.py similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/src/rqt_fixed_trajectory_selector/rqt_fixed_trajectory_selector.py rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/rqt_fixed_trajectory_selector/rqt_fixed_trajectory_selector.py diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/src/trajectory_library.cpp b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/trajectory_library.cpp similarity index 99% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/src/trajectory_library.cpp rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/trajectory_library.cpp index a7c8b737..9dfc5042 100644 --- a/ros_ws/src/robot/autonomy/controls/trajectory_library/src/trajectory_library.cpp +++ b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/trajectory_library.cpp @@ -890,7 +890,7 @@ visualization_msgs::msg::MarkerArray Trajectory::get_markers(rclcpp::Time stamp, lines.header.stamp = stamp; lines.header.frame_id = frame_id; lines.ns = marker_namespace; - lines.id = waypoints.size(); + lines.id = waypoints.size() + 1; lines.type = visualization_msgs::msg::Marker::LINE_STRIP; lines.action = visualization_msgs::msg::Marker::ADD; lines.scale.x = thickness; diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_library/src/trajectory_library_generator.py b/ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/trajectory_library_generator.py similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_library/src/trajectory_library_generator.py rename to ros_ws/src/robot/autonomy/3_local/b_planners/trajectory_library/src/trajectory_library_generator.py diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/.clang-format b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/.clang-format similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/.clang-format rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/.clang-format diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/.github/workflows/build_test.yml b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/.github/workflows/build_test.yml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/.github/workflows/build_test.yml rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/.github/workflows/build_test.yml diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/README.md b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/README.md similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/README.md rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/README.md diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_comm/CHANGELOG.rst b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_comm/CHANGELOG.rst similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_comm/CHANGELOG.rst rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_comm/CHANGELOG.rst diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_comm/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_comm/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_comm/CMakeLists.txt rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_comm/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_comm/package.xml b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_comm/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_comm/package.xml rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_comm/package.xml diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/CHANGELOG.rst b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/CHANGELOG.rst similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/CHANGELOG.rst rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/CHANGELOG.rst diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/CMakeLists.txt rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/include/mav_msgs/common.hpp b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/include/mav_msgs/common.hpp similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/include/mav_msgs/common.hpp rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/include/mav_msgs/common.hpp diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/include/mav_msgs/conversions.hpp b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/include/mav_msgs/conversions.hpp similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/include/mav_msgs/conversions.hpp rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/include/mav_msgs/conversions.hpp diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/include/mav_msgs/default_topics.hpp b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/include/mav_msgs/default_topics.hpp similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/include/mav_msgs/default_topics.hpp rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/include/mav_msgs/default_topics.hpp diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/include/mav_msgs/default_values.hpp b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/include/mav_msgs/default_values.hpp similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/include/mav_msgs/default_values.hpp rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/include/mav_msgs/default_values.hpp diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/include/mav_msgs/eigen_mav_msgs.hpp b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/include/mav_msgs/eigen_mav_msgs.hpp similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/include/mav_msgs/eigen_mav_msgs.hpp rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/include/mav_msgs/eigen_mav_msgs.hpp diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/Actuators.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/Actuators.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/Actuators.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/Actuators.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/AttitudeThrust.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/AttitudeThrust.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/AttitudeThrust.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/AttitudeThrust.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/FilteredSensorData.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/FilteredSensorData.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/FilteredSensorData.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/FilteredSensorData.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/GpsWaypoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/GpsWaypoint.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/GpsWaypoint.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/GpsWaypoint.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/RateThrust.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/RateThrust.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/RateThrust.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/RateThrust.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/RollPitchYawrateThrust.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/RollPitchYawrateThrust.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/RollPitchYawrateThrust.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/RollPitchYawrateThrust.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/Status.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/Status.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/Status.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/Status.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/TorqueThrust.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/TorqueThrust.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/msg/TorqueThrust.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/msg/TorqueThrust.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/package.xml b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_msgs/package.xml rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_msgs/package.xml diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/CHANGELOG.rst b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/CHANGELOG.rst similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/CHANGELOG.rst rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/CHANGELOG.rst diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/CMakeLists.txt rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/conversions.hpp b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/conversions.hpp similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/conversions.hpp rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/conversions.hpp diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/conversions_deprecated.hpp b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/conversions_deprecated.hpp similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/conversions_deprecated.hpp rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/conversions_deprecated.hpp diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/eigen_planning_msgs.hpp b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/eigen_planning_msgs.hpp similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/eigen_planning_msgs.hpp rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/include/mav_planning_msgs/eigen_planning_msgs.hpp diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/Point2D.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/Point2D.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/Point2D.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/Point2D.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PointCloudWithPose.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PointCloudWithPose.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PointCloudWithPose.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PointCloudWithPose.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/Polygon2D.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/Polygon2D.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/Polygon2D.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/Polygon2D.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolygonWithHoles.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolygonWithHoles.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolygonWithHoles.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolygonWithHoles.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolygonWithHolesStamped.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolygonWithHolesStamped.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolygonWithHolesStamped.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolygonWithHolesStamped.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolynomialSegment.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolynomialSegment.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolynomialSegment.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolynomialSegment.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolynomialSegment4D.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolynomialSegment4D.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolynomialSegment4D.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolynomialSegment4D.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolynomialTrajectory.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolynomialTrajectory.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolynomialTrajectory.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolynomialTrajectory.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolynomialTrajectory4D.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolynomialTrajectory4D.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/msg/PolynomialTrajectory4D.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/msg/PolynomialTrajectory4D.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/package.xml b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/package.xml rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/package.xml diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/srv/ChangeNameService.srv b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/srv/ChangeNameService.srv similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/srv/ChangeNameService.srv rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/srv/ChangeNameService.srv diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/srv/PlannerService.srv b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/srv/PlannerService.srv similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/srv/PlannerService.srv rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/srv/PlannerService.srv diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/srv/PolygonService.srv b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/srv/PolygonService.srv similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_planning_msgs/srv/PolygonService.srv rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_planning_msgs/srv/PolygonService.srv diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_state_machine_msgs/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_state_machine_msgs/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_state_machine_msgs/CMakeLists.txt rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_state_machine_msgs/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_state_machine_msgs/msg/StartStopTask.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_state_machine_msgs/msg/StartStopTask.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_state_machine_msgs/msg/StartStopTask.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_state_machine_msgs/msg/StartStopTask.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_state_machine_msgs/package.xml b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_state_machine_msgs/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_state_machine_msgs/package.xml rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_state_machine_msgs/package.xml diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_state_machine_msgs/srv/RunTaskService.srv b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_state_machine_msgs/srv/RunTaskService.srv similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_state_machine_msgs/srv/RunTaskService.srv rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_state_machine_msgs/srv/RunTaskService.srv diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_system_msgs/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_system_msgs/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_system_msgs/CMakeLists.txt rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_system_msgs/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_system_msgs/msg/CpuInfo.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_system_msgs/msg/CpuInfo.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_system_msgs/msg/CpuInfo.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_system_msgs/msg/CpuInfo.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_system_msgs/msg/ProcessInfo.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_system_msgs/msg/ProcessInfo.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_system_msgs/msg/ProcessInfo.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_system_msgs/msg/ProcessInfo.msg diff --git a/ros_ws/src/robot/autonomy/controls/mav_comm/mav_system_msgs/package.xml b/ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_system_msgs/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/mav_comm/mav_system_msgs/package.xml rename to ros_ws/src/robot/autonomy/3_local/c_controls/mav_comm/mav_system_msgs/package.xml diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/.github/dependabot.yml b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/.github/dependabot.yml new file mode 100644 index 00000000..c7fc735e --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: "/" + schedule: + interval: "daily" diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/.github/workflows/build.yml b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/.github/workflows/build.yml new file mode 100644 index 00000000..0a467bba --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/.github/workflows/build.yml @@ -0,0 +1,40 @@ +name: Build package + +# CI runs over all branches that do not contain 'ros1' in the name +on: + push: + schedule: + - cron: '0 0 * * *' + +defaults: + run: + shell: bash + +jobs: + focal: + name: "Build on Ubuntu Focal" + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v4 + - uses: ros-tooling/setup-ros@v0.6 + with: + required-ros-distributions: foxy + - uses: ros-tooling/action-ros-ci@v0.3 + with: + package-name: px4_msgs + target-ros2-distro: foxy + jammy: + name: "Build on Ubuntu Jammy" + runs-on: ubuntu-22.04 + strategy: + matrix: + ros2_distro: [humble, rolling] + steps: + - uses: actions/checkout@v4 + - uses: ros-tooling/setup-ros@v0.6 + with: + required-ros-distributions: ${{ matrix.ros2_distro }} + - uses: ros-tooling/action-ros-ci@v0.3 + with: + package-name: px4_msgs + target-ros2-distro: ${{ matrix.ros2_distro }} \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/.gitignore b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/.gitignore new file mode 100644 index 00000000..b89e1984 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/.gitignore @@ -0,0 +1,2 @@ +build/ +msg/idl.cc diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/CMakeLists.txt new file mode 100644 index 00000000..0fc6edc2 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required(VERSION 3.5) + +project(px4_msgs) + +list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra) +endif() + +find_package(ament_cmake REQUIRED) +find_package(builtin_interfaces REQUIRED) +find_package(rosidl_default_generators REQUIRED) + +# ############################################################################## +# Generate ROS messages, ROS2 interfaces and IDL files # +# ############################################################################## + +# get all msg files +set(MSGS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/msg") +file(GLOB PX4_MSGS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${MSGS_DIR}/*.msg") + +# get all srv files +set(SRVS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/srv") +file(GLOB PX4_SRVS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${SRVS_DIR}/*.srv") + +# Generate introspection typesupport for C and C++ and IDL files +rosidl_generate_interfaces(${PROJECT_NAME} + ${PX4_MSGS} + ${PX4_SRVS} + DEPENDENCIES builtin_interfaces + ADD_LINTER_TESTS +) + +ament_export_dependencies(rosidl_default_runtime) + +ament_package() diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/CONTRIBUTING.md b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/CONTRIBUTING.md new file mode 100644 index 00000000..5df008e5 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/CONTRIBUTING.md @@ -0,0 +1,7 @@ +# Contributing + +*Do not* commit changes directly to this repository that change the message definitions. All the message definitions are directly generated from the [uORB msg definitions](https://github.com/PX4/Firmware/tree/master/msg) on the [PX4 Firmware repository](https://github.com/PX4/Firmware). Any fixes or improvements one finds suitable to apply to the message definitions should be directly done on the uORB message files. The deployment of these are taken care by a Jenkins CI/CD stage. + +### Contributing to the PX4 Firmware repository (or to this repository, not including message definitions) + +Follow the [`Contributing` guide](https://github.com/PX4/Firmware/blob/master/CONTRIBUTING.md) from the PX4 Firmware repo. diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/LICENSE b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/LICENSE new file mode 100644 index 00000000..31f2eb48 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2019, PX4 Development Team +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/README.md b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/README.md new file mode 100644 index 00000000..5cbfa157 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/README.md @@ -0,0 +1,49 @@ +# px4_msgs + +[![GitHub license](https://img.shields.io/github/license/PX4/px4_msgs.svg)](https://github.com/PX4/px4_msg/blob/master/LICENSE) [![Build package](https://github.com/PX4/px4_msgs/workflows/Build%20package/badge.svg)](https://github.com/PX4/px4_msgs/actions) + +[![Discord Shield](https://discordapp.com/api/guilds/1022170275984457759/widget.png?style=shield)](https://discord.gg/dronecode) + +ROS 2 message definitions for the [PX4 Autopilot](https://px4.io/) project. + +Building this package generates all the required interfaces to interface ROS 2 nodes with the PX4 internals. + +## Supported versions and compatibility + +Depending on the PX4 and ROS versions you want to use, you need to checkout the appropriate branch of this package: + +| PX4 | ROS 2 | Ubuntu | branch | +|----------------|---------|--------------|-------------------------------------------------------------------| +| [v1.13](https://github.com/PX4/px4_msgs/tree/release/1.13) | Foxy | Ubuntu 20.04 | [release/1.13](https://github.com/PX4/px4_msgs/tree/release/1.13) | +| [v1.14](https://github.com/PX4/px4_msgs/tree/release/1.14) | Foxy | Ubuntu 20.04 | [release/1.14](https://github.com/PX4/px4_msgs/tree/release/1.14) | +| [v1.14](https://github.com/PX4/px4_msgs/tree/release/1.14) | Humble | Ubuntu 22.04 | [release/1.14](https://github.com/PX4/px4_msgs/tree/release/1.14) | +| [v1.14](https://github.com/PX4/px4_msgs/tree/release/1.14) | Rolling | Ubuntu 22.04 | [release/1.14](https://github.com/PX4/px4_msgs/tree/release/1.14) | +| [main](https://github.com/PX4/px4_msgs/tree/main) | Foxy | Ubuntu 22.04 | [main](https://github.com/PX4/px4_msgs) | +| [main](https://github.com/PX4/px4_msgs/tree/main) | Humble | Ubuntu 22.04 | [main](https://github.com/PX4/px4_msgs) | +| [main](https://github.com/PX4/px4_msgs/tree/main) | Rolling | Ubuntu 22.04 | [main](https://github.com/PX4/px4_msgs) | + +### Messages Sync from PX4 + +When PX4 message definitions in the `main` branch of [PX4 Autopilot](https://github.com/PX4/PX4-Autopilot) change, a [CI/CD pipeline](https://github.com/PX4/PX4-Autopilot/blob/main/.github/workflows/metadata.yml#L119) automatically copies and pushes updated ROS message definitions to this repository. This ensures that this repository `main` branch and the PX4-Autopilot `main` branch are always up to date. +However, if you are using a custom PX4 version and you modified existing messages or created new one, then you have to manually synchronize them in this repository: +### Manual Message Sync + +- Checkout the correct branch associated to the PX4 version from which you detached you custom version. +- Delete all `*.msg` files in `msg/` and copy all `*.msg` files from `PX4-Autopilot/msg/` in it. Assuming that this repository and the PX4-Autopilot repository are placed in your home folder, you can run: + ```sh + rm -f ~/px4_msgs/msg/*.msg + cp ~/PX4-Autopilot/msg/*.msg ~/px4_msgs/msg/ + ``` + +## Install, build and usage + +Check [Using colcon to build packages](https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Creating-Your-First-ROS2-Package.html#build-a-package) to understand how this can be built inside a workspace. Check the [PX4 ROS 2 User Guide](https://docs.px4.io/main/en/ros/ros2_comm.html) section on the PX4 documentation for further details on how this integrates PX4 and how to exchange messages with the autopilot. + +## Bug tracking and feature requests + +Use the [Issues](https://github.com/PX4/px4_msgs/issues) section to create a new issue. Report your issue or feature request [here](https://github.com/PX4/px4_msgs/issues/new). + +## Questions and troubleshooting + +Reach the PX4 development team on the [PX4 Discord Server](https://discord.gg/dronecode). + diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActionRequest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActionRequest.msg new file mode 100644 index 00000000..888814e0 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActionRequest.msg @@ -0,0 +1,19 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 action # what action is requested +uint8 ACTION_DISARM = 0 +uint8 ACTION_ARM = 1 +uint8 ACTION_TOGGLE_ARMING = 2 +uint8 ACTION_UNKILL = 3 +uint8 ACTION_KILL = 4 +uint8 ACTION_SWITCH_MODE = 5 +uint8 ACTION_VTOL_TRANSITION_TO_MULTICOPTER = 6 +uint8 ACTION_VTOL_TRANSITION_TO_FIXEDWING = 7 + +uint8 source # how the request was triggered +uint8 SOURCE_RC_STICK_GESTURE = 0 +uint8 SOURCE_RC_SWITCH = 1 +uint8 SOURCE_RC_BUTTON = 2 +uint8 SOURCE_RC_MODE_SLOT = 3 + +uint8 mode # for ACTION_SWITCH_MODE what mode is requested according to vehicle_status_s::NAVIGATION_STATE_* diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorArmed.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorArmed.msg new file mode 100644 index 00000000..6867adf2 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorArmed.msg @@ -0,0 +1,9 @@ +uint64 timestamp # time since system start (microseconds) + +bool armed # Set to true if system is armed +bool prearmed # Set to true if the actuator safety is disabled but motors are not armed +bool ready_to_arm # Set to true if system is ready to be armed +bool lockdown # Set to true if actuators are forced to being disabled (due to emergency or HIL) +bool manual_lockdown # Set to true if manual throttle kill switch is engaged +bool force_failsafe # Set to true if the actuators are forced to the failsafe position +bool in_esc_calibration_mode # IO/FMU should ignore messages from the actuator controls topics diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorControlsStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorControlsStatus.msg new file mode 100644 index 00000000..c89f669e --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorControlsStatus.msg @@ -0,0 +1,5 @@ +uint64 timestamp # time since system start (microseconds) + +float32[3] control_power + +# TOPICS actuator_controls_status_0 actuator_controls_status_1 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorMotors.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorMotors.msg new file mode 100644 index 00000000..e74566f1 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorMotors.msg @@ -0,0 +1,12 @@ +# Motor control message +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp the data this control response is based on was sampled + +uint16 reversible_flags # bitset which motors are configured to be reversible + +uint8 ACTUATOR_FUNCTION_MOTOR1 = 101 + +uint8 NUM_CONTROLS = 12 +float32[12] control # range: [-1, 1], where 1 means maximum positive thrust, + # -1 maximum negative (if not supported by the output, <0 maps to NaN), + # and NaN maps to disarmed (stop the motors) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorOutputs.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorOutputs.msg new file mode 100644 index 00000000..3209e54e --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorOutputs.msg @@ -0,0 +1,8 @@ +uint64 timestamp # time since system start (microseconds) +uint8 NUM_ACTUATOR_OUTPUTS = 16 +uint8 NUM_ACTUATOR_OUTPUT_GROUPS = 4 # for sanity checking +uint32 noutputs # valid outputs +float32[16] output # output data, in natural output units + +# actuator_outputs_sim is used for SITL, HITL & SIH (with an output range of [-1, 1]) +# TOPICS actuator_outputs actuator_outputs_sim actuator_outputs_debug diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorServos.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorServos.msg new file mode 100644 index 00000000..2c7900e8 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorServos.msg @@ -0,0 +1,8 @@ +# Servo control message +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp the data this control response is based on was sampled + +uint8 NUM_CONTROLS = 8 +float32[8] control # range: [-1, 1], where 1 means maximum positive position, + # -1 maximum negative, + # and NaN maps to disarmed diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorServosTrim.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorServosTrim.msg new file mode 100644 index 00000000..30953e7a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorServosTrim.msg @@ -0,0 +1,5 @@ +# Servo trims, added as offset to servo outputs +uint64 timestamp # time since system start (microseconds) + +uint8 NUM_CONTROLS = 8 +float32[8] trim # range: [-1, 1] diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorTest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorTest.msg new file mode 100644 index 00000000..221258f9 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ActuatorTest.msg @@ -0,0 +1,21 @@ +uint64 timestamp # time since system start (microseconds) + +# Topic to test individual actuator output functions + +uint8 ACTION_RELEASE_CONTROL = 0 # exit test mode for the given function +uint8 ACTION_DO_CONTROL = 1 # enable actuator test mode + +uint8 FUNCTION_MOTOR1 = 101 +uint8 MAX_NUM_MOTORS = 12 +uint8 FUNCTION_SERVO1 = 201 +uint8 MAX_NUM_SERVOS = 8 + +uint8 action # one of ACTION_* +uint16 function # actuator output function +float32 value # range: [-1, 1], where 1 means maximum positive output, + # 0 to center servos or minimum motor thrust, + # -1 maximum negative (if not supported by the motors, <0 maps to NaN), + # and NaN maps to disarmed (stop the motors) +uint32 timeout_ms # timeout in ms after which to exit test mode (if 0, do not time out) + +uint8 ORB_QUEUE_LENGTH = 16 # >= MAX_NUM_MOTORS to support code in esc_calibration diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AdcReport.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AdcReport.msg new file mode 100644 index 00000000..1ae72b6d --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AdcReport.msg @@ -0,0 +1,6 @@ +uint64 timestamp # time since system start (microseconds) +uint32 device_id # unique device ID for the sensor that does not change between power cycles +int16[12] channel_id # ADC channel IDs, negative for non-existent, TODO: should be kept same as array index +int32[12] raw_data # ADC channel raw value, accept negative value, valid if channel ID is positive +uint32 resolution # ADC channel resolution +float32 v_ref # ADC channel voltage reference, use to calculate LSB voltage(lsb=scale/resolution) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Airspeed.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Airspeed.msg new file mode 100644 index 00000000..aaed7b72 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Airspeed.msg @@ -0,0 +1,10 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +float32 indicated_airspeed_m_s # indicated airspeed in m/s + +float32 true_airspeed_m_s # true filtered airspeed in m/s + +float32 air_temperature_celsius # air temperature in degrees Celsius, -1000 if unknown + +float32 confidence # confidence value from 0 to 1 for this sensor diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AirspeedValidated.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AirspeedValidated.msg new file mode 100644 index 00000000..06731cc4 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AirspeedValidated.msg @@ -0,0 +1,12 @@ +uint64 timestamp # time since system start (microseconds) + +float32 indicated_airspeed_m_s # indicated airspeed in m/s (IAS), set to NAN if invalid +float32 calibrated_airspeed_m_s # calibrated airspeed in m/s (CAS, accounts for instrumentation errors), set to NAN if invalid +float32 true_airspeed_m_s # true filtered airspeed in m/s (TAS), set to NAN if invalid + +float32 calibrated_ground_minus_wind_m_s # CAS calculated from groundspeed - windspeed, where windspeed is estimated based on a zero-sideslip assumption, set to NAN if invalid +float32 true_ground_minus_wind_m_s # TAS calculated from groundspeed - windspeed, where windspeed is estimated based on a zero-sideslip assumption, set to NAN if invalid + +bool airspeed_sensor_measurement_valid # True if data from at least one airspeed sensor is declared valid. + +int8 selected_airspeed_index # 1-3: airspeed sensor index, 0: groundspeed-windspeed, -1: airspeed invalid diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AirspeedWind.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AirspeedWind.msg new file mode 100644 index 00000000..6ca513a3 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AirspeedWind.msg @@ -0,0 +1,26 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +float32 windspeed_north # Wind component in north / X direction (m/sec) +float32 windspeed_east # Wind component in east / Y direction (m/sec) + +float32 variance_north # Wind estimate error variance in north / X direction (m/sec)**2 - set to zero (no uncertainty) if not estimated +float32 variance_east # Wind estimate error variance in east / Y direction (m/sec)**2 - set to zero (no uncertainty) if not estimated + +float32 tas_innov # True airspeed innovation +float32 tas_innov_var # True airspeed innovation variance + +float32 tas_scale_raw # Estimated true airspeed scale factor (not validated) +float32 tas_scale_raw_var # True airspeed scale factor variance + +float32 tas_scale_validated # Estimated true airspeed scale factor after validation + +float32 beta_innov # Sideslip measurement innovation +float32 beta_innov_var # Sideslip measurement innovation variance + +uint8 source # source of wind estimate + +uint8 SOURCE_AS_BETA_ONLY = 0 # wind estimate only based on synthetic sideslip fusion +uint8 SOURCE_AS_SENSOR_1 = 1 # combined synthetic sideslip and airspeed fusion (data from first airspeed sensor) +uint8 SOURCE_AS_SENSOR_2 = 2 # combined synthetic sideslip and airspeed fusion (data from second airspeed sensor) +uint8 SOURCE_AS_SENSOR_3 = 3 # combined synthetic sideslip and airspeed fusion (data from third airspeed sensor) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ArmingCheckReply.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ArmingCheckReply.msg new file mode 100644 index 00000000..589ad1b1 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ArmingCheckReply.msg @@ -0,0 +1,33 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 request_id +uint8 registration_id + +uint8 HEALTH_COMPONENT_INDEX_NONE = 0 +uint8 HEALTH_COMPONENT_INDEX_AVOIDANCE = 19 + +uint8 health_component_index # HEALTH_COMPONENT_INDEX_* +bool health_component_is_present +bool health_component_warning +bool health_component_error + +bool can_arm_and_run # whether arming is possible, and if it's a navigation mode, if it can run + +uint8 num_events + +Event[5] events + +# Mode requirements +bool mode_req_angular_velocity +bool mode_req_attitude +bool mode_req_local_alt +bool mode_req_local_position +bool mode_req_local_position_relaxed +bool mode_req_global_position +bool mode_req_mission +bool mode_req_home_position +bool mode_req_prevent_arming +bool mode_req_manual_control + + +uint8 ORB_QUEUE_LENGTH = 4 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ArmingCheckRequest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ArmingCheckRequest.msg new file mode 100644 index 00000000..69e7e85f --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ArmingCheckRequest.msg @@ -0,0 +1,5 @@ +uint64 timestamp # time since system start (microseconds) + +# broadcast message to request all registered arming checks to be reported + +uint8 request_id diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AutotuneAttitudeControlStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AutotuneAttitudeControlStatus.msg new file mode 100644 index 00000000..021a8c34 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/AutotuneAttitudeControlStatus.msg @@ -0,0 +1,35 @@ +uint64 timestamp # time since system start (microseconds) + +float32[5] coeff # coefficients of the identified discrete-time model +float32[5] coeff_var # coefficients' variance of the identified discrete-time model +float32 fitness # fitness of the parameter estimate +float32 innov +float32 dt_model + +float32 kc +float32 ki +float32 kd +float32 kff +float32 att_p + +float32[3] rate_sp + +float32 u_filt +float32 y_filt + +uint8 STATE_IDLE = 0 +uint8 STATE_INIT = 1 +uint8 STATE_ROLL = 2 +uint8 STATE_ROLL_PAUSE = 3 +uint8 STATE_PITCH = 4 +uint8 STATE_PITCH_PAUSE = 5 +uint8 STATE_YAW = 6 +uint8 STATE_YAW_PAUSE = 7 +uint8 STATE_VERIFICATION = 8 +uint8 STATE_APPLY = 9 +uint8 STATE_TEST = 10 +uint8 STATE_COMPLETE = 11 +uint8 STATE_FAIL = 12 +uint8 STATE_WAIT_FOR_DISARM = 13 + +uint8 state diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/BatteryStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/BatteryStatus.msg new file mode 100644 index 00000000..66fcffa0 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/BatteryStatus.msg @@ -0,0 +1,78 @@ +uint64 timestamp # time since system start (microseconds) +bool connected # Whether or not a battery is connected, based on a voltage threshold +float32 voltage_v # Battery voltage in volts, 0 if unknown +float32 voltage_filtered_v # Battery voltage in volts, filtered, 0 if unknown +float32 current_a # Battery current in amperes, -1 if unknown +float32 current_filtered_a # Battery current in amperes, filtered, 0 if unknown +float32 current_average_a # Battery current average in amperes (for FW average in level flight), -1 if unknown +float32 discharged_mah # Discharged amount in mAh, -1 if unknown +float32 remaining # From 1 to 0, -1 if unknown +float32 scale # Power scaling factor, >= 1, or -1 if unknown +float32 time_remaining_s # predicted time in seconds remaining until battery is empty under previous averaged load, NAN if unknown +float32 temperature # temperature of the battery. NaN if unknown +uint8 cell_count # Number of cells, 0 if unknown + +uint8 BATTERY_SOURCE_POWER_MODULE = 0 +uint8 BATTERY_SOURCE_EXTERNAL = 1 +uint8 BATTERY_SOURCE_ESCS = 2 +uint8 source # Battery source +uint8 priority # Zero based priority is the connection on the Power Controller V1..Vn AKA BrickN-1 +uint16 capacity # actual capacity of the battery +uint16 cycle_count # number of discharge cycles the battery has experienced +uint16 average_time_to_empty # predicted remaining battery capacity based on the average rate of discharge in min +uint16 serial_number # serial number of the battery pack +uint16 manufacture_date # manufacture date, part of serial number of the battery pack. Formatted as: Day + Month×32 + (Year–1980)×512 +uint16 state_of_health # state of health. FullChargeCapacity/DesignCapacity, 0-100%. +uint16 max_error # max error, expected margin of error in % in the state-of-charge calculation with a range of 1 to 100% +uint8 id # ID number of a battery. Should be unique and consistent for the lifetime of a vehicle. 1-indexed. +uint16 interface_error # interface error counter + +float32[14] voltage_cell_v # Battery individual cell voltages, 0 if unknown +float32 max_cell_voltage_delta # Max difference between individual cell voltages + +bool is_powering_off # Power off event imminent indication, false if unknown +bool is_required # Set if the battery is explicitly required before arming + + +uint8 BATTERY_WARNING_NONE = 0 # no battery low voltage warning active +uint8 BATTERY_WARNING_LOW = 1 # warning of low voltage +uint8 BATTERY_WARNING_CRITICAL = 2 # critical voltage, return / abort immediately +uint8 BATTERY_WARNING_EMERGENCY = 3 # immediate landing required +uint8 BATTERY_WARNING_FAILED = 4 # the battery has failed completely +uint8 BATTERY_STATE_UNHEALTHY = 6 # Battery is diagnosed to be defective or an error occurred, usage is discouraged / prohibited. Possible causes (faults) are listed in faults field. +uint8 BATTERY_STATE_CHARGING = 7 # Battery is charging + +uint8 BATTERY_FAULT_DEEP_DISCHARGE = 0 # Battery has deep discharged +uint8 BATTERY_FAULT_SPIKES = 1 # Voltage spikes +uint8 BATTERY_FAULT_CELL_FAIL= 2 # One or more cells have failed +uint8 BATTERY_FAULT_OVER_CURRENT = 3 # Over-current +uint8 BATTERY_FAULT_OVER_TEMPERATURE = 4 # Over-temperature +uint8 BATTERY_FAULT_UNDER_TEMPERATURE = 5 # Under-temperature fault +uint8 BATTERY_FAULT_INCOMPATIBLE_VOLTAGE = 6 # Vehicle voltage is not compatible with battery one +uint8 BATTERY_FAULT_INCOMPATIBLE_FIRMWARE = 7 # Battery firmware is not compatible with current autopilot firmware +uint8 BATTERY_FAULT_INCOMPATIBLE_MODEL = 8 # Battery model is not supported by the system +uint8 BATTERY_FAULT_HARDWARE_FAILURE = 9 # hardware problem +uint8 BATTERY_WARNING_OVER_TEMPERATURE = 10 # Over-temperature +uint8 BATTERY_FAULT_COUNT = 11 # Counter - keep it as last element! + +uint16 faults # Smart battery supply status/fault flags (bitmask) for health indication. +uint32 custom_faults # Bitmask indicating smart battery internal manufacturer faults, those are not user actionable. +uint8 warning # Current battery warning +uint8 mode # Battery mode. Note, the normal operation mode + +uint8 BATTERY_MODE_UNKNOWN = 0 # Battery does not support a mode, or if it does, is operational +uint8 BATTERY_MODE_AUTO_DISCHARGING = 1 # Battery is auto discharging (towards storage level) +uint8 BATTERY_MODE_HOT_SWAP = 2 # Battery in hot-swap mode +uint8 BATTERY_MODE_COUNT = 3 # Counter - keep it as last element (once we're fully migrated to events interface we can just comment this)! + + +uint8 MAX_INSTANCES = 4 + +float32 average_power # The average power of the current discharge +float32 available_energy # The predicted charge or energy remaining in the battery +float32 full_charge_capacity_wh # The compensated battery capacity +float32 remaining_capacity_wh # The compensated battery capacity remaining +float32 design_capacity # The design capacity of the battery +uint16 average_time_to_full # The predicted remaining time until the battery reaches full charge, in minutes +uint16 over_discharge_count # Number of battery overdischarge +float32 nominal_voltage # Nominal voltage of the battery pack diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Buffer128.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Buffer128.msg new file mode 100644 index 00000000..342aa83d --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Buffer128.msg @@ -0,0 +1,9 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 len # length of data +uint32 MAX_BUFLEN = 128 + +uint8[128] data # data + +# TOPICS voxl2_io_data + diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ButtonEvent.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ButtonEvent.msg new file mode 100644 index 00000000..bbca356a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ButtonEvent.msg @@ -0,0 +1,6 @@ +uint64 timestamp # time since system start (microseconds) +bool triggered # Set to true if the event is triggered + +# TOPICS button_event safety_button + +uint8 ORB_QUEUE_LENGTH = 2 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CameraCapture.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CameraCapture.msg new file mode 100644 index 00000000..141bb2eb --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CameraCapture.msg @@ -0,0 +1,9 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_utc # Capture time in UTC / GPS time +uint32 seq # Image sequence number +float64 lat # Latitude in degrees (WGS84) +float64 lon # Longitude in degrees (WGS84) +float32 alt # Altitude (AMSL) +float32 ground_distance # Altitude above ground (meters) +float32[4] q # Attitude of the camera relative to NED earth-fixed frame when using a gimbal, otherwise vehicle attitude +int8 result # 1 for success, 0 for failure, -1 if camera does not provide feedback diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CameraStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CameraStatus.msg new file mode 100644 index 00000000..c83be897 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CameraStatus.msg @@ -0,0 +1,4 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 active_sys_id # mavlink system id of the currently active camera +uint8 active_comp_id # mavlink component id of currently active camera diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CameraTrigger.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CameraTrigger.msg new file mode 100644 index 00000000..abfdac6d --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CameraTrigger.msg @@ -0,0 +1,7 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_utc # UTC timestamp + +uint32 seq # Image sequence number +bool feedback # Trigger feedback from camera + +uint32 ORB_QUEUE_LENGTH = 2 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CanInterfaceStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CanInterfaceStatus.msg new file mode 100644 index 00000000..4129c8d5 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CanInterfaceStatus.msg @@ -0,0 +1,6 @@ +uint64 timestamp # time since system start (microseconds) +uint8 interface + +uint64 io_errors +uint64 frames_tx +uint64 frames_rx diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CellularStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CellularStatus.msg new file mode 100644 index 00000000..5a1c8bac --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CellularStatus.msg @@ -0,0 +1,28 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 CELLULAR_STATUS_FLAG_UNKNOWN=0 # State unknown or not reportable +uint8 CELLULAR_STATUS_FLAG_FAILED=1 # velocity setpoint +uint8 CELLULAR_STATUS_FLAG_INITIALIZING=2 # Modem is being initialized +uint8 CELLULAR_STATUS_FLAG_LOCKED=3 # Modem is locked +uint8 CELLULAR_STATUS_FLAG_DISABLED=4 # Modem is not enabled and is powered down +uint8 CELLULAR_STATUS_FLAG_DISABLING=5 # Modem is currently transitioning to the CELLULAR_STATUS_FLAG_DISABLED state +uint8 CELLULAR_STATUS_FLAG_ENABLING=6 # Modem is currently transitioning to the CELLULAR_STATUS_FLAG_ENABLED state +uint8 CELLULAR_STATUS_FLAG_ENABLED=7 # Modem is enabled and powered on but not registered with a network provider and not available for data connections +uint8 CELLULAR_STATUS_FLAG_SEARCHING=8 # Modem is searching for a network provider to register +uint8 CELLULAR_STATUS_FLAG_REGISTERED=9 # Modem is registered with a network provider, and data connections and messaging may be available for use +uint8 CELLULAR_STATUS_FLAG_DISCONNECTING=10 # Modem is disconnecting and deactivating the last active packet data bearer. This state will not be entered if more than one packet data bearer is active and one of the active bearers is deactivated +uint8 CELLULAR_STATUS_FLAG_CONNECTING=11 # Modem is activating and connecting the first packet data bearer. Subsequent bearer activations when another bearer is already active do not cause this state to be entered +uint8 CELLULAR_STATUS_FLAG_CONNECTED=12 # One or more packet data bearers is active and connected + +uint8 CELLULAR_NETWORK_FAILED_REASON_NONE=0 # No error +uint8 CELLULAR_NETWORK_FAILED_REASON_UNKNOWN=1 # Error state is unknown +uint8 CELLULAR_NETWORK_FAILED_REASON_SIM_MISSING=2 # SIM is required for the modem but missing +uint8 CELLULAR_NETWORK_FAILED_REASON_SIM_ERROR=3 # SIM is available, but not usable for connection + +uint16 status # Status bitmap 1: Roaming is active +uint8 failure_reason #Failure reason when status in in CELLUAR_STATUS_FAILED +uint8 type # Cellular network radio type 0: none 1: gsm 2: cdma 3: wcdma 4: lte +uint8 quality # Cellular network RSSI/RSRP in dBm, absolute value +uint16 mcc # Mobile country code. If unknown, set to: UINT16_MAX +uint16 mnc # Mobile network code. If unknown, set to: UINT16_MAX +uint16 lac # Location area code. If unknown, set to: 0 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CollisionConstraints.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CollisionConstraints.msg new file mode 100644 index 00000000..40f67e29 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CollisionConstraints.msg @@ -0,0 +1,7 @@ +# Local setpoint constraints in NED frame +# setting something to NaN means that no limit is provided + +uint64 timestamp # time since system start (microseconds) + +float32[2] original_setpoint # velocities demanded +float32[2] adapted_setpoint # velocities allowed diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CollisionReport.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CollisionReport.msg new file mode 100644 index 00000000..1ad7ce72 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/CollisionReport.msg @@ -0,0 +1,8 @@ +uint64 timestamp # time since system start (microseconds) +uint8 src +uint32 id +uint8 action +uint8 threat_level +float32 time_to_minimum_delta +float32 altitude_minimum_delta +float32 horizontal_minimum_delta diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ConfigOverrides.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ConfigOverrides.msg new file mode 100644 index 00000000..09b87253 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ConfigOverrides.msg @@ -0,0 +1,18 @@ +# Configurable overrides by (external) modes or mode executors +uint64 timestamp # time since system start (microseconds) + +bool disable_auto_disarm # Prevent the drone from automatically disarming after landing (if configured) + +bool defer_failsafes # Defer all failsafes that can be deferred (until the flag is cleared) +int16 defer_failsafes_timeout_s # Maximum time a failsafe can be deferred. 0 = system default, -1 = no timeout + + +int8 SOURCE_TYPE_MODE = 0 +int8 SOURCE_TYPE_MODE_EXECUTOR = 1 +int8 source_type + +uint8 source_id # ID depending on source_type + +uint8 ORB_QUEUE_LENGTH = 4 + +# TOPICS config_overrides config_overrides_request diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ControlAllocatorStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ControlAllocatorStatus.msg new file mode 100644 index 00000000..2d7b0883 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ControlAllocatorStatus.msg @@ -0,0 +1,21 @@ +uint64 timestamp # time since system start (microseconds) + +bool torque_setpoint_achieved # Boolean indicating whether the 3D torque setpoint was correctly allocated to actuators. 0 if not achieved, 1 if achieved. +float32[3] unallocated_torque # Unallocated torque. Equal to 0 if the setpoint was achieved. + # Computed as: unallocated_torque = torque_setpoint - allocated_torque + +bool thrust_setpoint_achieved # Boolean indicating whether the 3D thrust setpoint was correctly allocated to actuators. 0 if not achieved, 1 if achieved. +float32[3] unallocated_thrust # Unallocated thrust. Equal to 0 if the setpoint was achieved. + # Computed as: unallocated_thrust = thrust_setpoint - allocated_thrust + +int8 ACTUATOR_SATURATION_OK = 0 # The actuator is not saturated +int8 ACTUATOR_SATURATION_UPPER_DYN = 1 # The actuator is saturated (with a value <= the desired value) because it cannot increase its value faster +int8 ACTUATOR_SATURATION_UPPER = 2 # The actuator is saturated (with a value <= the desired value) because it has reached its maximum value +int8 ACTUATOR_SATURATION_LOWER_DYN = -1 # The actuator is saturated (with a value >= the desired value) because it cannot decrease its value faster +int8 ACTUATOR_SATURATION_LOWER = -2 # The actuator is saturated (with a value >= the desired value) because it has reached its minimum value + +int8[16] actuator_saturation # Indicates actuator saturation status. + # Note 1: actuator saturation does not necessarily imply that the thrust setpoint or the torque setpoint were not achieved. + # Note 2: an actuator with limited dynamics can be indicated as upper-saturated even if it as not reached its maximum value. + +uint16 handled_motor_failure_mask # Bitmask of failed motors that were removed from the allocation / effectiveness matrix. Not necessarily identical to the report from FailureDetector diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Cpuload.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Cpuload.msg new file mode 100644 index 00000000..efc2c4df --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Cpuload.msg @@ -0,0 +1,3 @@ +uint64 timestamp # time since system start (microseconds) +float32 load # processor load from 0 to 1 +float32 ram_usage # RAM usage from 0 to 1 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DatamanRequest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DatamanRequest.msg new file mode 100644 index 00000000..f819771a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DatamanRequest.msg @@ -0,0 +1,8 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 client_id +uint8 request_type # id/read/write/clear +uint8 item # dm_item_t +uint32 index +uint8[56] data +uint32 data_length \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DatamanResponse.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DatamanResponse.msg new file mode 100644 index 00000000..ebf752db --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DatamanResponse.msg @@ -0,0 +1,15 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 client_id +uint8 request_type # id/read/write/clear +uint8 item # dm_item_t +uint32 index +uint8[56] data + +uint8 STATUS_SUCCESS = 0 +uint8 STATUS_FAILURE_ID_ERR = 1 +uint8 STATUS_FAILURE_NO_DATA = 2 +uint8 STATUS_FAILURE_READ_FAILED = 3 +uint8 STATUS_FAILURE_WRITE_FAILED = 4 +uint8 STATUS_FAILURE_CLEAR_FAILED = 5 +uint8 status diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugArray.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugArray.msg new file mode 100644 index 00000000..4763a0f5 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugArray.msg @@ -0,0 +1,5 @@ +uint8 ARRAY_SIZE = 58 +uint64 timestamp # time since system start (microseconds) +uint16 id # unique ID of debug array, used to discriminate between arrays +char[10] name # name of the debug array (max. 10 characters) +float32[58] data # data \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugKeyValue.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugKeyValue.msg new file mode 100644 index 00000000..6815811e --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugKeyValue.msg @@ -0,0 +1,3 @@ +uint64 timestamp # time since system start (microseconds) +char[10] key # max. 10 characters as key / name +float32 value # the value to send as debug output diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugValue.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugValue.msg new file mode 100644 index 00000000..8be13124 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugValue.msg @@ -0,0 +1,3 @@ +uint64 timestamp # time since system start (microseconds) +int8 ind # index of debug variable +float32 value # the value to send as debug output diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugVect.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugVect.msg new file mode 100644 index 00000000..9c22e1da --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DebugVect.msg @@ -0,0 +1,5 @@ +uint64 timestamp # time since system start (microseconds) +char[10] name # max. 10 characters as key / name +float32 x # x value +float32 y # y value +float32 z # z value diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DifferentialDriveSetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DifferentialDriveSetpoint.msg new file mode 100644 index 00000000..f7e4c584 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DifferentialDriveSetpoint.msg @@ -0,0 +1,8 @@ +uint64 timestamp # time since system start (microseconds) + +float32 speed # [m/s] collective roll-off speed in body x-axis +bool closed_loop_speed_control # true if speed is controlled using estimator feedback, false if direct feed-forward +float32 yaw_rate # [rad/s] yaw rate +bool closed_loop_yaw_rate_control # true if yaw rate is controlled using gyroscope feedback, false if direct feed-forward + +# TOPICS differential_drive_setpoint differential_drive_control_output diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DifferentialPressure.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DifferentialPressure.msg new file mode 100644 index 00000000..0cdf1e4c --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DifferentialPressure.msg @@ -0,0 +1,10 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32 differential_pressure_pa # differential pressure reading in Pascals (may be negative) + +float32 temperature # Temperature provided by sensor in degrees Celsius, NAN if unknown + +uint32 error_count # Number of errors detected by driver diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DistanceSensor.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DistanceSensor.msg new file mode 100644 index 00000000..dd08e4b5 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/DistanceSensor.msg @@ -0,0 +1,42 @@ +# DISTANCE_SENSOR message data + +uint64 timestamp # time since system start (microseconds) + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32 min_distance # Minimum distance the sensor can measure (in m) +float32 max_distance # Maximum distance the sensor can measure (in m) +float32 current_distance # Current distance reading (in m) +float32 variance # Measurement variance (in m^2), 0 for unknown / invalid readings +int8 signal_quality # Signal quality in percent (0...100%), where 0 = invalid signal, 100 = perfect signal, and -1 = unknown signal quality. + +uint8 type # Type from MAV_DISTANCE_SENSOR enum +uint8 MAV_DISTANCE_SENSOR_LASER = 0 +uint8 MAV_DISTANCE_SENSOR_ULTRASOUND = 1 +uint8 MAV_DISTANCE_SENSOR_INFRARED = 2 +uint8 MAV_DISTANCE_SENSOR_RADAR = 3 + +float32 h_fov # Sensor horizontal field of view (rad) +float32 v_fov # Sensor vertical field of view (rad) +float32[4] q # Quaterion sensor orientation with respect to the vehicle body frame to specify the orientation ROTATION_CUSTOM + +uint8 orientation # Direction the sensor faces from MAV_SENSOR_ORIENTATION enum + +uint8 ROTATION_YAW_0 = 0 # MAV_SENSOR_ROTATION_NONE +uint8 ROTATION_YAW_45 = 1 # MAV_SENSOR_ROTATION_YAW_45 +uint8 ROTATION_YAW_90 = 2 # MAV_SENSOR_ROTATION_YAW_90 +uint8 ROTATION_YAW_135 = 3 # MAV_SENSOR_ROTATION_YAW_135 +uint8 ROTATION_YAW_180 = 4 # MAV_SENSOR_ROTATION_YAW_180 +uint8 ROTATION_YAW_225 = 5 # MAV_SENSOR_ROTATION_YAW_225 +uint8 ROTATION_YAW_270 = 6 # MAV_SENSOR_ROTATION_YAW_270 +uint8 ROTATION_YAW_315 = 7 # MAV_SENSOR_ROTATION_YAW_315 + +uint8 ROTATION_FORWARD_FACING = 0 # MAV_SENSOR_ROTATION_NONE +uint8 ROTATION_RIGHT_FACING = 2 # MAV_SENSOR_ROTATION_YAW_90 +uint8 ROTATION_BACKWARD_FACING = 4 # MAV_SENSOR_ROTATION_YAW_180 +uint8 ROTATION_LEFT_FACING = 6 # MAV_SENSOR_ROTATION_YAW_270 + +uint8 ROTATION_UPWARD_FACING = 24 # MAV_SENSOR_ROTATION_PITCH_90 +uint8 ROTATION_DOWNWARD_FACING = 25 # MAV_SENSOR_ROTATION_PITCH_270 + +uint8 ROTATION_CUSTOM = 100 # MAV_SENSOR_ROTATION_CUSTOM diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Ekf2Timestamps.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Ekf2Timestamps.msg new file mode 100644 index 00000000..ae3ac067 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Ekf2Timestamps.msg @@ -0,0 +1,23 @@ +# this message contains the (relative) timestamps of the sensor inputs used by EKF2. +# It can be used for reproducible replay. + +# the timestamp field is the ekf2 reference time and matches the timestamp of +# the sensor_combined topic. + +uint64 timestamp # time since system start (microseconds) + +int16 RELATIVE_TIMESTAMP_INVALID = 32767 # (0x7fff) If one of the relative timestamps + # is set to this value, it means the associated sensor values did not update + +# timestamps are relative to the main timestamp and are in 0.1 ms (timestamp + +# *_timestamp_rel = absolute timestamp). For int16, this allows a maximum +# difference of +-3.2s to the sensor_combined topic. + +int16 airspeed_timestamp_rel +int16 distance_sensor_timestamp_rel +int16 optical_flow_timestamp_rel +int16 vehicle_air_data_timestamp_rel +int16 vehicle_magnetometer_timestamp_rel +int16 visual_odometry_timestamp_rel + +# Note: this is a high-rate logged topic, so it needs to be as small as possible diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EscReport.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EscReport.msg new file mode 100644 index 00000000..9a75c3d7 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EscReport.msg @@ -0,0 +1,27 @@ +uint64 timestamp # time since system start (microseconds) +uint32 esc_errorcount # Number of reported errors by ESC - if supported +int32 esc_rpm # Motor RPM, negative for reverse rotation [RPM] - if supported +float32 esc_voltage # Voltage measured from current ESC [V] - if supported +float32 esc_current # Current measured from current ESC [A] - if supported +float32 esc_temperature # Temperature measured from current ESC [degC] - if supported +uint8 esc_address # Address of current ESC (in most cases 1-8 / must be set by driver) +uint8 esc_cmdcount # Counter of number of commands + +uint8 esc_state # State of ESC - depend on Vendor + +uint8 actuator_function # actuator output function (one of Motor1...MotorN) + +uint16 failures # Bitmask to indicate the internal ESC faults +int8 esc_power # Applied power 0-100 in % (negative values reserved) + +uint8 FAILURE_OVER_CURRENT = 0 # (1 << 0) +uint8 FAILURE_OVER_VOLTAGE = 1 # (1 << 1) +uint8 FAILURE_MOTOR_OVER_TEMPERATURE = 2 # (1 << 2) +uint8 FAILURE_OVER_RPM = 3 # (1 << 3) +uint8 FAILURE_INCONSISTENT_CMD = 4 # (1 << 4) Set if ESC received an inconsistent command (i.e out of boundaries) +uint8 FAILURE_MOTOR_STUCK = 5 # (1 << 5) +uint8 FAILURE_GENERIC = 6 # (1 << 6) +uint8 FAILURE_MOTOR_WARN_TEMPERATURE = 7 # (1 << 7) +uint8 FAILURE_WARN_ESC_TEMPERATURE = 8 # (1 << 8) +uint8 FAILURE_OVER_ESC_TEMPERATURE = 9 # (1 << 9) +uint8 ESC_FAILURE_COUNT = 10 # Counter - keep it as last element! diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EscStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EscStatus.msg new file mode 100644 index 00000000..e5e220ce --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EscStatus.msg @@ -0,0 +1,28 @@ +uint64 timestamp # time since system start (microseconds) +uint8 CONNECTED_ESC_MAX = 8 # The number of ESCs supported. Current (Q2/2013) we support 8 ESCs + +uint8 ESC_CONNECTION_TYPE_PPM = 0 # Traditional PPM ESC +uint8 ESC_CONNECTION_TYPE_SERIAL = 1 # Serial Bus connected ESC +uint8 ESC_CONNECTION_TYPE_ONESHOT = 2 # One Shot PPM +uint8 ESC_CONNECTION_TYPE_I2C = 3 # I2C +uint8 ESC_CONNECTION_TYPE_CAN = 4 # CAN-Bus +uint8 ESC_CONNECTION_TYPE_DSHOT = 5 # DShot + +uint16 counter # incremented by the writing thread everytime new data is stored + +uint8 esc_count # number of connected ESCs +uint8 esc_connectiontype # how ESCs connected to the system + +uint8 esc_online_flags # Bitmask indicating which ESC is online/offline +# esc_online_flags bit 0 : Set to 1 if ESC0 is online +# esc_online_flags bit 1 : Set to 1 if ESC1 is online +# esc_online_flags bit 2 : Set to 1 if ESC2 is online +# esc_online_flags bit 3 : Set to 1 if ESC3 is online +# esc_online_flags bit 4 : Set to 1 if ESC4 is online +# esc_online_flags bit 5 : Set to 1 if ESC5 is online +# esc_online_flags bit 6 : Set to 1 if ESC6 is online +# esc_online_flags bit 7 : Set to 1 if ESC7 is online + +uint8 esc_armed_flags # Bitmask indicating which ESC is armed. For ESC's where the arming state is not known (returned by the ESC), the arming bits should always be set. + +EscReport[8] esc diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorAidSource1d.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorAidSource1d.msg new file mode 100644 index 00000000..7bd8ea76 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorAidSource1d.msg @@ -0,0 +1,27 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +uint8 estimator_instance + +uint32 device_id + +uint64 time_last_fuse + +float32 observation +float32 observation_variance + +float32 innovation +float32 innovation_filtered + +float32 innovation_variance + +float32 test_ratio # normalized innovation squared +float32 test_ratio_filtered # signed filtered test ratio + +bool innovation_rejected # true if the observation has been rejected +bool fused # true if the sample was successfully fused + +# TOPICS estimator_aid_src_baro_hgt estimator_aid_src_ev_hgt estimator_aid_src_gnss_hgt estimator_aid_src_rng_hgt +# TOPICS estimator_aid_src_airspeed estimator_aid_src_sideslip +# TOPICS estimator_aid_src_fake_hgt +# TOPICS estimator_aid_src_gnss_yaw estimator_aid_src_ev_yaw diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorAidSource2d.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorAidSource2d.msg new file mode 100644 index 00000000..14e3ac3f --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorAidSource2d.msg @@ -0,0 +1,26 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +uint8 estimator_instance + +uint32 device_id + +uint64 time_last_fuse + +float32[2] observation +float32[2] observation_variance + +float32[2] innovation +float32[2] innovation_filtered + +float32[2] innovation_variance + +float32[2] test_ratio # normalized innovation squared +float32[2] test_ratio_filtered # signed filtered test ratio + +bool innovation_rejected # true if the observation has been rejected +bool fused # true if the sample was successfully fused + +# TOPICS estimator_aid_src_ev_pos estimator_aid_src_fake_pos estimator_aid_src_gnss_pos estimator_aid_src_aux_global_position +# TOPICS estimator_aid_src_aux_vel estimator_aid_src_optical_flow +# TOPICS estimator_aid_src_drag diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorAidSource3d.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorAidSource3d.msg new file mode 100644 index 00000000..b89add28 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorAidSource3d.msg @@ -0,0 +1,24 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +uint8 estimator_instance + +uint32 device_id + +uint64 time_last_fuse + +float32[3] observation +float32[3] observation_variance + +float32[3] innovation +float32[3] innovation_filtered + +float32[3] innovation_variance + +float32[3] test_ratio # normalized innovation squared +float32[3] test_ratio_filtered # signed filtered test ratio + +bool innovation_rejected # true if the observation has been rejected +bool fused # true if the sample was successfully fused + +# TOPICS estimator_aid_src_ev_vel estimator_aid_src_gnss_vel estimator_aid_src_gravity estimator_aid_src_mag diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorBias.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorBias.msg new file mode 100644 index 00000000..bb65e47b --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorBias.msg @@ -0,0 +1,12 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +uint32 device_id # unique device ID for the sensor that does not change between power cycles +float32 bias # estimated barometric altitude bias (m) +float32 bias_var # estimated barometric altitude bias variance (m^2) + +float32 innov # innovation of the last measurement fusion (m) +float32 innov_var # innovation variance of the last measurement fusion (m^2) +float32 innov_test_ratio # normalized innovation squared test ratio + +# TOPICS estimator_baro_bias estimator_gnss_hgt_bias diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorBias3d.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorBias3d.msg new file mode 100644 index 00000000..16b29372 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorBias3d.msg @@ -0,0 +1,14 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32[3] bias # estimated barometric altitude bias (m) +float32[3] bias_var # estimated barometric altitude bias variance (m^2) + +float32[3] innov # innovation of the last measurement fusion (m) +float32[3] innov_var # innovation variance of the last measurement fusion (m^2) +float32[3] innov_test_ratio # normalized innovation squared test ratio + +# TOPICS estimator_bias3d +# TOPICS estimator_ev_pos_bias diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorEventFlags.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorEventFlags.msg new file mode 100644 index 00000000..1a47e676 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorEventFlags.msg @@ -0,0 +1,37 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +# information events +uint32 information_event_changes # number of information event changes +bool gps_checks_passed # 0 - true when gps quality checks are passing passed +bool reset_vel_to_gps # 1 - true when the velocity states are reset to the gps measurement +bool reset_vel_to_flow # 2 - true when the velocity states are reset using the optical flow measurement +bool reset_vel_to_vision # 3 - true when the velocity states are reset to the vision system measurement +bool reset_vel_to_zero # 4 - true when the velocity states are reset to zero +bool reset_pos_to_last_known # 5 - true when the position states are reset to the last known position +bool reset_pos_to_gps # 6 - true when the position states are reset to the gps measurement +bool reset_pos_to_vision # 7 - true when the position states are reset to the vision system measurement +bool starting_gps_fusion # 8 - true when the filter starts using gps measurements to correct the state estimates +bool starting_vision_pos_fusion # 9 - true when the filter starts using vision system position measurements to correct the state estimates +bool starting_vision_vel_fusion # 10 - true when the filter starts using vision system velocity measurements to correct the state estimates +bool starting_vision_yaw_fusion # 11 - true when the filter starts using vision system yaw measurements to correct the state estimates +bool yaw_aligned_to_imu_gps # 12 - true when the filter resets the yaw to an estimate derived from IMU and GPS data +bool reset_hgt_to_baro # 13 - true when the vertical position state is reset to the baro measurement +bool reset_hgt_to_gps # 14 - true when the vertical position state is reset to the gps measurement +bool reset_hgt_to_rng # 15 - true when the vertical position state is reset to the rng measurement +bool reset_hgt_to_ev # 16 - true when the vertical position state is reset to the ev measurement + +# warning events +uint32 warning_event_changes # number of warning event changes +bool gps_quality_poor # 0 - true when the gps is failing quality checks +bool gps_fusion_timout # 1 - true when the gps data has not been used to correct the state estimates for a significant time period +bool gps_data_stopped # 2 - true when the gps data has stopped for a significant time period +bool gps_data_stopped_using_alternate # 3 - true when the gps data has stopped for a significant time period but the filter is able to use other sources of data to maintain navigation +bool height_sensor_timeout # 4 - true when the height sensor has not been used to correct the state estimates for a significant time period +bool stopping_navigation # 5 - true when the filter has insufficient data to estimate velocity and position and is falling back to an attitude, height and height rate mode of operation +bool invalid_accel_bias_cov_reset # 6 - true when the filter has detected bad acceerometer bias state esitmstes and has reset the corresponding covariance matrix elements +bool bad_yaw_using_gps_course # 7 - true when the filter has detected an invalid yaw estimate and has reset the yaw angle to the GPS ground course +bool stopping_mag_use # 8 - true when the filter has detected bad magnetometer data and is stopping further use of the magnetometer data +bool vision_data_stopped # 9 - true when the vision system data has stopped for a significant time period +bool emergency_yaw_reset_mag_stopped # 10 - true when the filter has detected bad magnetometer data, has reset the yaw to anothter source of data and has stopped further use of the magnetometer data +bool emergency_yaw_reset_gps_yaw_stopped # 11 - true when the filter has detected bad GNSS yaw data, has reset the yaw to anothter source of data and has stopped further use of the GNSS yaw data diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorGpsStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorGpsStatus.msg new file mode 100644 index 00000000..2d2462ee --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorGpsStatus.msg @@ -0,0 +1,19 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +bool checks_passed + +bool check_fail_gps_fix # 0 : insufficient fix type (no 3D solution) +bool check_fail_min_sat_count # 1 : minimum required sat count fail +bool check_fail_max_pdop # 2 : maximum allowed PDOP fail +bool check_fail_max_horz_err # 3 : maximum allowed horizontal position error fail +bool check_fail_max_vert_err # 4 : maximum allowed vertical position error fail +bool check_fail_max_spd_err # 5 : maximum allowed speed error fail +bool check_fail_max_horz_drift # 6 : maximum allowed horizontal position drift fail - requires stationary vehicle +bool check_fail_max_vert_drift # 7 : maximum allowed vertical position drift fail - requires stationary vehicle +bool check_fail_max_horz_spd_err # 8 : maximum allowed horizontal speed fail - requires stationary vehicle +bool check_fail_max_vert_spd_err # 9 : maximum allowed vertical velocity discrepancy fail + +float32 position_drift_rate_horizontal_m_s # Horizontal position rate magnitude (m/s) +float32 position_drift_rate_vertical_m_s # Vertical position rate magnitude (m/s) +float32 filtered_horizontal_speed_m_s # Filtered horizontal velocity magnitude (m/s) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorInnovations.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorInnovations.msg new file mode 100644 index 00000000..11cc6a58 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorInnovations.msg @@ -0,0 +1,39 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +# GPS +float32[2] gps_hvel # horizontal GPS velocity innovation (m/sec) and innovation variance ((m/sec)**2) +float32 gps_vvel # vertical GPS velocity innovation (m/sec) and innovation variance ((m/sec)**2) +float32[2] gps_hpos # horizontal GPS position innovation (m) and innovation variance (m**2) +float32 gps_vpos # vertical GPS position innovation (m) and innovation variance (m**2) + +# External Vision +float32[2] ev_hvel # horizontal external vision velocity innovation (m/sec) and innovation variance ((m/sec)**2) +float32 ev_vvel # vertical external vision velocity innovation (m/sec) and innovation variance ((m/sec)**2) +float32[2] ev_hpos # horizontal external vision position innovation (m) and innovation variance (m**2) +float32 ev_vpos # vertical external vision position innovation (m) and innovation variance (m**2) + +# Height sensors +float32 rng_vpos # range sensor height innovation (m) and innovation variance (m**2) +float32 baro_vpos # barometer height innovation (m) and innovation variance (m**2) + +# Auxiliary velocity +float32[2] aux_hvel # horizontal auxiliary velocity innovation from landing target measurement (m/sec) and innovation variance ((m/sec)**2) + +# Optical flow +float32[2] flow # flow innvoation (rad/sec) and innovation variance ((rad/sec)**2) + +# Various +float32 heading # heading innovation (rad) and innovation variance (rad**2) +float32[3] mag_field # earth magnetic field innovation (Gauss) and innovation variance (Gauss**2) +float32[3] gravity # gravity innovation from accelerometerr vector (m/s**2) +float32[2] drag # drag specific force innovation (m/sec**2) and innovation variance ((m/sec)**2) +float32 airspeed # airspeed innovation (m/sec) and innovation variance ((m/sec)**2) +float32 beta # synthetic sideslip innovation (rad) and innovation variance (rad**2) +float32 hagl # height of ground innovation (m) and innovation variance (m**2) +float32 hagl_rate # height of ground rate innovation (m/s) and innovation variance ((m/s)**2) + +# The innovation test ratios are scalar values. In case the field is a vector, +# the test ratio will be put in the first component of the vector. + +# TOPICS estimator_innovations estimator_innovation_variances estimator_innovation_test_ratios diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorSelectorStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorSelectorStatus.msg new file mode 100644 index 00000000..52f80859 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorSelectorStatus.msg @@ -0,0 +1,22 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 primary_instance + +uint8 instances_available + +uint32 instance_changed_count +uint64 last_instance_change + +uint32 accel_device_id +uint32 baro_device_id +uint32 gyro_device_id +uint32 mag_device_id + +float32[9] combined_test_ratio +float32[9] relative_test_ratio +bool[9] healthy + +float32[4] accumulated_gyro_error +float32[4] accumulated_accel_error +bool gyro_fault_detected +bool accel_fault_detected diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorSensorBias.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorSensorBias.msg new file mode 100644 index 00000000..f42e1aa8 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorSensorBias.msg @@ -0,0 +1,30 @@ +# +# Sensor readings and in-run biases in SI-unit form. Sensor readings are compensated for static offsets, +# scale errors, in-run bias and thermal drift (if thermal compensation is enabled and available). +# + +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +# In-run bias estimates (subtract from uncorrected data) + +uint32 gyro_device_id # unique device ID for the sensor that does not change between power cycles +float32[3] gyro_bias # gyroscope in-run bias in body frame (rad/s) +float32 gyro_bias_limit # magnitude of maximum gyroscope in-run bias in body frame (rad/s) +float32[3] gyro_bias_variance +bool gyro_bias_valid +bool gyro_bias_stable # true when the gyro bias estimate is stable enough to use for calibration + +uint32 accel_device_id # unique device ID for the sensor that does not change between power cycles +float32[3] accel_bias # accelerometer in-run bias in body frame (m/s^2) +float32 accel_bias_limit # magnitude of maximum accelerometer in-run bias in body frame (m/s^2) +float32[3] accel_bias_variance +bool accel_bias_valid +bool accel_bias_stable # true when the accel bias estimate is stable enough to use for calibration + +uint32 mag_device_id # unique device ID for the sensor that does not change between power cycles +float32[3] mag_bias # magnetometer in-run bias in body frame (Gauss) +float32 mag_bias_limit # magnitude of maximum magnetometer in-run bias in body frame (Gauss) +float32[3] mag_bias_variance +bool mag_bias_valid +bool mag_bias_stable # true when the mag bias estimate is stable enough to use for calibration diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorStates.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorStates.msg new file mode 100644 index 00000000..885246d8 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorStates.msg @@ -0,0 +1,7 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +float32[25] states # Internal filter states +uint8 n_states # Number of states effectively used + +float32[24] covariances # Diagonal Elements of Covariance Matrix diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorStatus.msg new file mode 100644 index 00000000..ac13b59e --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorStatus.msg @@ -0,0 +1,121 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +float32[3] output_tracking_error # return a vector containing the output predictor angular, velocity and position tracking error magnitudes (rad), (m/s), (m) + +uint16 gps_check_fail_flags # Bitmask to indicate status of GPS checks - see definition below +# bits are true when corresponding test has failed +uint8 GPS_CHECK_FAIL_GPS_FIX = 0 # 0 : insufficient fix type (no 3D solution) +uint8 GPS_CHECK_FAIL_MIN_SAT_COUNT = 1 # 1 : minimum required sat count fail +uint8 GPS_CHECK_FAIL_MAX_PDOP = 2 # 2 : maximum allowed PDOP fail +uint8 GPS_CHECK_FAIL_MAX_HORZ_ERR = 3 # 3 : maximum allowed horizontal position error fail +uint8 GPS_CHECK_FAIL_MAX_VERT_ERR = 4 # 4 : maximum allowed vertical position error fail +uint8 GPS_CHECK_FAIL_MAX_SPD_ERR = 5 # 5 : maximum allowed speed error fail +uint8 GPS_CHECK_FAIL_MAX_HORZ_DRIFT = 6 # 6 : maximum allowed horizontal position drift fail - requires stationary vehicle +uint8 GPS_CHECK_FAIL_MAX_VERT_DRIFT = 7 # 7 : maximum allowed vertical position drift fail - requires stationary vehicle +uint8 GPS_CHECK_FAIL_MAX_HORZ_SPD_ERR = 8 # 8 : maximum allowed horizontal speed fail - requires stationary vehicle +uint8 GPS_CHECK_FAIL_MAX_VERT_SPD_ERR = 9 # 9 : maximum allowed vertical velocity discrepancy fail + +uint64 control_mode_flags # Bitmask to indicate EKF logic state +uint8 CS_TILT_ALIGN = 0 # 0 - true if the filter tilt alignment is complete +uint8 CS_YAW_ALIGN = 1 # 1 - true if the filter yaw alignment is complete +uint8 CS_GPS = 2 # 2 - true if GPS measurements are being fused +uint8 CS_OPT_FLOW = 3 # 3 - true if optical flow measurements are being fused +uint8 CS_MAG_HDG = 4 # 4 - true if a simple magnetic yaw heading is being fused +uint8 CS_MAG_3D = 5 # 5 - true if 3-axis magnetometer measurement are being fused +uint8 CS_MAG_DEC = 6 # 6 - true if synthetic magnetic declination measurements are being fused +uint8 CS_IN_AIR = 7 # 7 - true when thought to be airborne +uint8 CS_WIND = 8 # 8 - true when wind velocity is being estimated +uint8 CS_BARO_HGT = 9 # 9 - true when baro height is being fused as a primary height reference +uint8 CS_RNG_HGT = 10 # 10 - true when range finder height is being fused as a primary height reference +uint8 CS_GPS_HGT = 11 # 11 - true when GPS height is being fused as a primary height reference +uint8 CS_EV_POS = 12 # 12 - true when local position data from external vision is being fused +uint8 CS_EV_YAW = 13 # 13 - true when yaw data from external vision measurements is being fused +uint8 CS_EV_HGT = 14 # 14 - true when height data from external vision measurements is being fused +uint8 CS_BETA = 15 # 15 - true when synthetic sideslip measurements are being fused +uint8 CS_MAG_FIELD = 16 # 16 - true when only the magnetic field states are updated by the magnetometer +uint8 CS_FIXED_WING = 17 # 17 - true when thought to be operating as a fixed wing vehicle with constrained sideslip +uint8 CS_MAG_FAULT = 18 # 18 - true when the magnetometer has been declared faulty and is no longer being used +uint8 CS_ASPD = 19 # 19 - true when airspeed measurements are being fused +uint8 CS_GND_EFFECT = 20 # 20 - true when when protection from ground effect induced static pressure rise is active +uint8 CS_RNG_STUCK = 21 # 21 - true when a stuck range finder sensor has been detected +uint8 CS_GPS_YAW = 22 # 22 - true when yaw (not ground course) data from a GPS receiver is being fused +uint8 CS_MAG_ALIGNED = 23 # 23 - true when the in-flight mag field alignment has been completed +uint8 CS_EV_VEL = 24 # 24 - true when local frame velocity data fusion from external vision measurements is intended +uint8 CS_SYNTHETIC_MAG_Z = 25 # 25 - true when we are using a synthesized measurement for the magnetometer Z component +uint8 CS_VEHICLE_AT_REST = 26 # 26 - true when the vehicle is at rest +uint8 CS_GPS_YAW_FAULT = 27 # 27 - true when the GNSS heading has been declared faulty and is no longer being used +uint8 CS_RNG_FAULT = 28 # 28 - true when the range finder has been declared faulty and is no longer being used + +uint32 filter_fault_flags # Bitmask to indicate EKF internal faults +# 0 - true if the fusion of the magnetometer X-axis has encountered a numerical error +# 1 - true if the fusion of the magnetometer Y-axis has encountered a numerical error +# 2 - true if the fusion of the magnetometer Z-axis has encountered a numerical error +# 3 - true if the fusion of the magnetic heading has encountered a numerical error +# 4 - true if the fusion of the magnetic declination has encountered a numerical error +# 5 - true if fusion of the airspeed has encountered a numerical error +# 6 - true if fusion of the synthetic sideslip constraint has encountered a numerical error +# 7 - true if fusion of the optical flow X axis has encountered a numerical error +# 8 - true if fusion of the optical flow Y axis has encountered a numerical error +# 9 - true if fusion of the North velocity has encountered a numerical error +# 10 - true if fusion of the East velocity has encountered a numerical error +# 11 - true if fusion of the Down velocity has encountered a numerical error +# 12 - true if fusion of the North position has encountered a numerical error +# 13 - true if fusion of the East position has encountered a numerical error +# 14 - true if fusion of the Down position has encountered a numerical error +# 15 - true if bad delta velocity bias estimates have been detected +# 16 - true if bad vertical accelerometer data has been detected +# 17 - true if delta velocity data contains clipping (asymmetric railing) + +float32 pos_horiz_accuracy # 1-Sigma estimated horizontal position accuracy relative to the estimators origin (m) +float32 pos_vert_accuracy # 1-Sigma estimated vertical position accuracy relative to the estimators origin (m) + +float32 mag_test_ratio # low-pass filtered ratio of the largest magnetometer innovation component to the innovation test limit +float32 vel_test_ratio # low-pass filtered ratio of the largest velocity innovation component to the innovation test limit +float32 pos_test_ratio # low-pass filtered ratio of the largest horizontal position innovation component to the innovation test limit +float32 hgt_test_ratio # low-pass filtered ratio of the vertical position innovation to the innovation test limit +float32 tas_test_ratio # low-pass filtered ratio of the true airspeed innovation to the innovation test limit +float32 hagl_test_ratio # low-pass filtered ratio of the height above ground innovation to the innovation test limit +float32 beta_test_ratio # low-pass filtered ratio of the synthetic sideslip innovation to the innovation test limit + +uint16 solution_status_flags # Bitmask indicating which filter kinematic state outputs are valid for flight control use. +# 0 - True if the attitude estimate is good +# 1 - True if the horizontal velocity estimate is good +# 2 - True if the vertical velocity estimate is good +# 3 - True if the horizontal position (relative) estimate is good +# 4 - True if the horizontal position (absolute) estimate is good +# 5 - True if the vertical position (absolute) estimate is good +# 6 - True if the vertical position (above ground) estimate is good +# 7 - True if the EKF is in a constant position mode and is not using external measurements (eg GPS or optical flow) +# 8 - True if the EKF has sufficient data to enter a mode that will provide a (relative) position estimate +# 9 - True if the EKF has sufficient data to enter a mode that will provide a (absolute) position estimate +# 10 - True if the EKF has detected a GPS glitch +# 11 - True if the EKF has detected bad accelerometer data + +uint8 reset_count_vel_ne # number of horizontal position reset events (allow to wrap if count exceeds 255) +uint8 reset_count_vel_d # number of vertical velocity reset events (allow to wrap if count exceeds 255) +uint8 reset_count_pos_ne # number of horizontal position reset events (allow to wrap if count exceeds 255) +uint8 reset_count_pod_d # number of vertical position reset events (allow to wrap if count exceeds 255) +uint8 reset_count_quat # number of quaternion reset events (allow to wrap if count exceeds 255) + +float32 time_slip # cumulative amount of time in seconds that the EKF inertial calculation has slipped relative to system time + +bool pre_flt_fail_innov_heading +bool pre_flt_fail_innov_vel_horiz +bool pre_flt_fail_innov_vel_vert +bool pre_flt_fail_innov_height +bool pre_flt_fail_mag_field_disturbed + +uint32 accel_device_id +uint32 gyro_device_id +uint32 baro_device_id +uint32 mag_device_id + +# legacy local position estimator (LPE) flags +uint8 health_flags # Bitmask to indicate sensor health states (vel, pos, hgt) +uint8 timeout_flags # Bitmask to indicate timeout flags (vel, pos, hgt) + +float32 mag_inclination_deg +float32 mag_inclination_ref_deg +float32 mag_strength_gs +float32 mag_strength_ref_gs diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorStatusFlags.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorStatusFlags.msg new file mode 100644 index 00000000..c6e0504f --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/EstimatorStatusFlags.msg @@ -0,0 +1,74 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + + +# filter control status +uint32 control_status_changes # number of filter control status (cs) changes +bool cs_tilt_align # 0 - true if the filter tilt alignment is complete +bool cs_yaw_align # 1 - true if the filter yaw alignment is complete +bool cs_gps # 2 - true if GPS measurement fusion is intended +bool cs_opt_flow # 3 - true if optical flow measurements fusion is intended +bool cs_mag_hdg # 4 - true if a simple magnetic yaw heading fusion is intended +bool cs_mag_3d # 5 - true if 3-axis magnetometer measurement fusion is intended +bool cs_mag_dec # 6 - true if synthetic magnetic declination measurements fusion is intended +bool cs_in_air # 7 - true when the vehicle is airborne +bool cs_wind # 8 - true when wind velocity is being estimated +bool cs_baro_hgt # 9 - true when baro height is being fused as a primary height reference +bool cs_rng_hgt # 10 - true when range finder height is being fused as a primary height reference +bool cs_gps_hgt # 11 - true when GPS height is being fused as a primary height reference +bool cs_ev_pos # 12 - true when local position data fusion from external vision is intended +bool cs_ev_yaw # 13 - true when yaw data from external vision measurements fusion is intended +bool cs_ev_hgt # 14 - true when height data from external vision measurements is being fused +bool cs_fuse_beta # 15 - true when synthetic sideslip measurements are being fused +bool cs_mag_field_disturbed # 16 - true when the mag field does not match the expected strength +bool cs_fixed_wing # 17 - true when the vehicle is operating as a fixed wing vehicle +bool cs_mag_fault # 18 - true when the magnetometer has been declared faulty and is no longer being used +bool cs_fuse_aspd # 19 - true when airspeed measurements are being fused +bool cs_gnd_effect # 20 - true when protection from ground effect induced static pressure rise is active +bool cs_rng_stuck # 21 - true when rng data wasn't ready for more than 10s and new rng values haven't changed enough +bool cs_gps_yaw # 22 - true when yaw (not ground course) data fusion from a GPS receiver is intended +bool cs_mag_aligned_in_flight # 23 - true when the in-flight mag field alignment has been completed +bool cs_ev_vel # 24 - true when local frame velocity data fusion from external vision measurements is intended +bool cs_synthetic_mag_z # 25 - true when we are using a synthesized measurement for the magnetometer Z component +bool cs_vehicle_at_rest # 26 - true when the vehicle is at rest +bool cs_gps_yaw_fault # 27 - true when the GNSS heading has been declared faulty and is no longer being used +bool cs_rng_fault # 28 - true when the range finder has been declared faulty and is no longer being used +bool cs_inertial_dead_reckoning # 29 - true if we are no longer fusing measurements that constrain horizontal velocity drift +bool cs_wind_dead_reckoning # 30 - true if we are navigationg reliant on wind relative measurements +bool cs_rng_kin_consistent # 31 - true when the range finder kinematic consistency check is passing +bool cs_fake_pos # 32 - true when fake position measurements are being fused +bool cs_fake_hgt # 33 - true when fake height measurements are being fused +bool cs_gravity_vector # 34 - true when gravity vector measurements are being fused +bool cs_mag # 35 - true if 3-axis magnetometer measurement fusion (mag states only) is intended +bool cs_ev_yaw_fault # 36 - true when the EV heading has been declared faulty and is no longer being used +bool cs_mag_heading_consistent # 37 - true when the heading obtained from mag data is declared consistent with the filter +bool cs_aux_gpos # 38 - true if auxiliary global position measurement fusion is intended + +# fault status +uint32 fault_status_changes # number of filter fault status (fs) changes +bool fs_bad_mag_x # 0 - true if the fusion of the magnetometer X-axis has encountered a numerical error +bool fs_bad_mag_y # 1 - true if the fusion of the magnetometer Y-axis has encountered a numerical error +bool fs_bad_mag_z # 2 - true if the fusion of the magnetometer Z-axis has encountered a numerical error +bool fs_bad_hdg # 3 - true if the fusion of the heading angle has encountered a numerical error +bool fs_bad_mag_decl # 4 - true if the fusion of the magnetic declination has encountered a numerical error +bool fs_bad_airspeed # 5 - true if fusion of the airspeed has encountered a numerical error +bool fs_bad_sideslip # 6 - true if fusion of the synthetic sideslip constraint has encountered a numerical error +bool fs_bad_optflow_x # 7 - true if fusion of the optical flow X axis has encountered a numerical error +bool fs_bad_optflow_y # 8 - true if fusion of the optical flow Y axis has encountered a numerical error +bool fs_bad_acc_bias # 9 - true if bad delta velocity bias estimates have been detected +bool fs_bad_acc_vertical # 10 - true if bad vertical accelerometer data has been detected +bool fs_bad_acc_clipping # 11 - true if delta velocity data contains clipping (asymmetric railing) + + +# innovation test failures +uint32 innovation_fault_status_changes # number of innovation fault status (reject) changes +bool reject_hor_vel # 0 - true if horizontal velocity observations have been rejected +bool reject_ver_vel # 1 - true if vertical velocity observations have been rejected +bool reject_hor_pos # 2 - true if horizontal position observations have been rejected +bool reject_ver_pos # 3 - true if vertical position observations have been rejected +bool reject_yaw # 7 - true if the yaw observation has been rejected +bool reject_airspeed # 8 - true if the airspeed observation has been rejected +bool reject_sideslip # 9 - true if the synthetic sideslip observation has been rejected +bool reject_hagl # 10 - true if the height above ground observation has been rejected +bool reject_optflow_x # 11 - true if the X optical flow observation has been rejected +bool reject_optflow_y # 12 - true if the Y optical flow observation has been rejected diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Event.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Event.msg new file mode 100644 index 00000000..df1dd4a9 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Event.msg @@ -0,0 +1,10 @@ +# Events interface +uint64 timestamp # time since system start (microseconds) + +uint32 id # Event ID +uint16 event_sequence # Event sequence number +uint8[25] arguments # (optional) arguments, depend on event id + +uint8 log_levels # Log levels: 4 bits MSB: internal, 4 bits LSB: external + +uint8 ORB_QUEUE_LENGTH = 16 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FailsafeFlags.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FailsafeFlags.msg new file mode 100644 index 00000000..44945afa --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FailsafeFlags.msg @@ -0,0 +1,59 @@ +# Input flags for the failsafe state machine set by the arming & health checks. +# +# Flags must be named such that false == no failure (e.g. _invalid, _unhealthy, _lost) +# The flag comments are used as label for the failsafe state machine simulation + +uint64 timestamp # time since system start (microseconds) + +# Per-mode requirements +uint32 mode_req_angular_velocity +uint32 mode_req_attitude +uint32 mode_req_local_alt +uint32 mode_req_local_position +uint32 mode_req_local_position_relaxed +uint32 mode_req_global_position +uint32 mode_req_mission +uint32 mode_req_offboard_signal +uint32 mode_req_home_position +uint32 mode_req_wind_and_flight_time_compliance # if set, mode cannot be entered if wind or flight time limit exceeded +uint32 mode_req_prevent_arming # if set, cannot arm while in this mode +uint32 mode_req_manual_control +uint32 mode_req_other # other requirements, not covered above (for external modes) + + +# Mode requirements +bool angular_velocity_invalid # Angular velocity invalid +bool attitude_invalid # Attitude invalid +bool local_altitude_invalid # Local altitude invalid +bool local_position_invalid # Local position estimate invalid +bool local_position_invalid_relaxed # Local position with reduced accuracy requirements invalid (e.g. flying with optical flow) +bool local_velocity_invalid # Local velocity estimate invalid +bool global_position_invalid # Global position estimate invalid +bool auto_mission_missing # No mission available +bool offboard_control_signal_lost # Offboard signal lost +bool home_position_invalid # No home position available + +# Control links +bool manual_control_signal_lost # Manual control (RC) signal lost +bool gcs_connection_lost # GCS connection lost + +# Battery +uint8 battery_warning # Battery warning level +bool battery_low_remaining_time # Low battery based on remaining flight time +bool battery_unhealthy # Battery unhealthy + +# Other +bool geofence_breached # Geofence breached (one or multiple) +bool mission_failure # Mission failure +bool vtol_fixed_wing_system_failure # vehicle in fixed-wing system failure failsafe mode (after quad-chute) +bool wind_limit_exceeded # Wind limit exceeded +bool flight_time_limit_exceeded # Maximum flight time exceeded +bool local_position_accuracy_low # Local position estimate has dropped below threshold, but is currently still declared valid + +# Failure detector +bool fd_critical_failure # Critical failure (attitude/altitude limit exceeded, or external ATS) +bool fd_esc_arming_failure # ESC failed to arm +bool fd_imbalanced_prop # Imbalanced propeller detected +bool fd_motor_failure # Motor failure + + diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FailureDetectorStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FailureDetectorStatus.msg new file mode 100644 index 00000000..923ceb36 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FailureDetectorStatus.msg @@ -0,0 +1,14 @@ +uint64 timestamp # time since system start (microseconds) + +# FailureDetector status +bool fd_roll +bool fd_pitch +bool fd_alt +bool fd_ext +bool fd_arm_escs +bool fd_battery +bool fd_imbalanced_prop +bool fd_motor + +float32 imbalanced_prop_metric # Metric of the imbalanced propeller check (low-passed) +uint16 motor_failure_mask # Bit-mask with motor indices, indicating critical motor failures diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FigureEightStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FigureEightStatus.msg new file mode 100644 index 00000000..e14d8f0d --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FigureEightStatus.msg @@ -0,0 +1,8 @@ +uint64 timestamp # time since system start (microseconds) +float32 major_radius # Major axis radius of the figure eight [m]. Positive values orbit clockwise, negative values orbit counter-clockwise. +float32 minor_radius # Minor axis radius of the figure eight [m]. +float32 orientation # Orientation of the major axis of the figure eight [rad]. +uint8 frame # The coordinate system of the fields: x, y, z. +int32 x # X coordinate of center point. Coordinate system depends on frame field: local = x position in meters * 1e4, global = latitude in degrees * 1e7. +int32 y # Y coordinate of center point. Coordinate system depends on frame field: local = y position in meters * 1e4, global = latitude in degrees * 1e7. +float32 z # Altitude of center point. Coordinate system depends on frame field. diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FlightPhaseEstimation.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FlightPhaseEstimation.msg new file mode 100644 index 00000000..e05b3291 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FlightPhaseEstimation.msg @@ -0,0 +1,8 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 flight_phase # Estimate of current flight phase + +uint8 FLIGHT_PHASE_UNKNOWN = 0 # vehicle flight phase is unknown +uint8 FLIGHT_PHASE_LEVEL = 1 # Vehicle is in level flight +uint8 FLIGHT_PHASE_DESCEND = 2 # vehicle is in descend +uint8 FLIGHT_PHASE_CLIMB = 3 # vehicle is climbing diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FollowTarget.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FollowTarget.msg new file mode 100644 index 00000000..e88c2460 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FollowTarget.msg @@ -0,0 +1,11 @@ +uint64 timestamp # time since system start (microseconds) + +float64 lat # target position (deg * 1e7) +float64 lon # target position (deg * 1e7) +float32 alt # target position + +float32 vy # target vel in y +float32 vx # target vel in x +float32 vz # target vel in z + +uint8 est_cap # target reporting capabilities diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FollowTargetEstimator.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FollowTargetEstimator.msg new file mode 100644 index 00000000..9d3df9f6 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FollowTargetEstimator.msg @@ -0,0 +1,16 @@ +uint64 timestamp # time since system start (microseconds) +uint64 last_filter_reset_timestamp # time of last filter reset (microseconds) + +bool valid # True if estimator states are okay to be used +bool stale # True if estimator stopped receiving follow_target messages for some time. The estimate can still be valid, though it might be inaccurate. + +float64 lat_est # Estimated target latitude +float64 lon_est # Estimated target longitude +float32 alt_est # Estimated target altitude + +float32[3] pos_est # Estimated target NED position (m) +float32[3] vel_est # Estimated target NED velocity (m/s) +float32[3] acc_est # Estimated target NED acceleration (m^2/s) + +uint64 prediction_count +uint64 fusion_count diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FollowTargetStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FollowTargetStatus.msg new file mode 100644 index 00000000..713a7dcd --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FollowTargetStatus.msg @@ -0,0 +1,12 @@ +uint64 timestamp # [microseconds] time since system start + +float32 tracked_target_course # [rad] Tracked target course in NED local frame (North is course zero) +float32 follow_angle # [rad] Current follow angle setting + +float32 orbit_angle_setpoint # [rad] Current orbit angle setpoint from the smooth trajectory generator +float32 angular_rate_setpoint # [rad/s] Angular rate commanded from Jerk-limited Orbit Angle trajectory for Orbit Angle + +float32[3] desired_position_raw # [m] Raw 'idealistic' desired drone position if a drone could teleport from place to places + +bool in_emergency_ascent # [bool] True when doing emergency ascent (when distance to ground is below safety altitude) +float32 gimbal_pitch # [rad] Gimbal pitch commanded to track target in the center of the frame diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FuelTankStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FuelTankStatus.msg new file mode 100644 index 00000000..22d21e4a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/FuelTankStatus.msg @@ -0,0 +1,17 @@ +uint64 timestamp # time since system start (microseconds) + +float32 maximum_fuel_capacity # maximum fuel capacity. Must always be provided, either from the driver or a parameter +float32 consumed_fuel # consumed fuel, NaN if not measured. Should not be inferred from the max fuel capacity +float32 fuel_consumption_rate # fuel consumption rate, NaN if not measured + +uint8 percent_remaining # percentage of remaining fuel, UINT8_MAX if not provided +float32 remaining_fuel # remaining fuel, NaN if not measured. Should not be inferred from the max fuel capacity + +uint8 fuel_tank_id # identifier for the fuel tank. Must match ID of other messages for same fuel system. 0 by default when only a single tank exists + +uint32 fuel_type # type of fuel based on MAV_FUEL_TYPE enum. Set to MAV_FUEL_TYPE_UNKNOWN if unknown or it does not fit the provided types +uint8 MAV_FUEL_TYPE_UNKNOWN = 0 # fuel type not specified. Fuel levels are normalized (i.e., maximum is 1, and other levels are relative to 1). +uint8 MAV_FUEL_TYPE_LIQUID = 1 # represents generic liquid fuels, such as gasoline or diesel. Fuel levels are measured in millilitres (ml), and flow rates in millilitres per second (ml/s). +uint8 MAV_FUEL_TYPE_GAS = 2 # represents a gas fuel, such as hydrogen, methane, or propane. Fuel levels are in kilo-Pascal (kPa), and flow rates are in milliliters per second (ml/s). + +float32 temperature # fuel temperature in Kelvin, NaN if not measured diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GeneratorStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GeneratorStatus.msg new file mode 100644 index 00000000..7ba9b402 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GeneratorStatus.msg @@ -0,0 +1,44 @@ +uint64 timestamp # time since system start (microseconds) + + +uint64 STATUS_FLAG_OFF = 1 # Generator is off. +uint64 STATUS_FLAG_READY = 2 # Generator is ready to start generating power. +uint64 STATUS_FLAG_GENERATING = 4 # Generator is generating power. +uint64 STATUS_FLAG_CHARGING = 8 # Generator is charging the batteries (generating enough power to charge and provide the load). +uint64 STATUS_FLAG_REDUCED_POWER = 16 # Generator is operating at a reduced maximum power. +uint64 STATUS_FLAG_MAXPOWER = 32 # Generator is providing the maximum output. +uint64 STATUS_FLAG_OVERTEMP_WARNING = 64 # Generator is near the maximum operating temperature, cooling is insufficient. +uint64 STATUS_FLAG_OVERTEMP_FAULT = 128 # Generator hit the maximum operating temperature and shutdown. +uint64 STATUS_FLAG_ELECTRONICS_OVERTEMP_WARNING = 256 # Power electronics are near the maximum operating temperature, cooling is insufficient. +uint64 STATUS_FLAG_ELECTRONICS_OVERTEMP_FAULT = 512 # Power electronics hit the maximum operating temperature and shutdown. +uint64 STATUS_FLAG_ELECTRONICS_FAULT = 1024 # Power electronics experienced a fault and shutdown. +uint64 STATUS_FLAG_POWERSOURCE_FAULT = 2048 # The power source supplying the generator failed e.g. mechanical generator stopped, tether is no longer providing power, solar cell is in shade, hydrogen reaction no longer happening. +uint64 STATUS_FLAG_COMMUNICATION_WARNING = 4096 # Generator controller having communication problems. +uint64 STATUS_FLAG_COOLING_WARNING = 8192 # Power electronic or generator cooling system error. +uint64 STATUS_FLAG_POWER_RAIL_FAULT = 16384 # Generator controller power rail experienced a fault. +uint64 STATUS_FLAG_OVERCURRENT_FAULT = 32768 # Generator controller exceeded the overcurrent threshold and shutdown to prevent damage. +uint64 STATUS_FLAG_BATTERY_OVERCHARGE_CURRENT_FAULT = 65536 # Generator controller detected a high current going into the batteries and shutdown to prevent battery damage. | +uint64 STATUS_FLAG_OVERVOLTAGE_FAULT = 131072 # Generator controller exceeded it's overvoltage threshold and shutdown to prevent it exceeding the voltage rating. +uint64 STATUS_FLAG_BATTERY_UNDERVOLT_FAULT = 262144 # Batteries are under voltage (generator will not start). +uint64 STATUS_FLAG_START_INHIBITED = 524288 # Generator start is inhibited by e.g. a safety switch. +uint64 STATUS_FLAG_MAINTENANCE_REQUIRED = 1048576 # Generator requires maintenance. +uint64 STATUS_FLAG_WARMING_UP = 2097152 # Generator is not ready to generate yet. +uint64 STATUS_FLAG_IDLE = 4194304 # Generator is idle. + +uint64 status # Status flags + + +float32 battery_current # [A] Current into/out of battery. Positive for out. Negative for in. NaN: field not provided. +float32 load_current # [A] Current going to the UAV. If battery current not available this is the DC current from the generator. Positive for out. Negative for in. NaN: field not provided +float32 power_generated # [W] The power being generated. NaN: field not provided +float32 bus_voltage # [V] Voltage of the bus seen at the generator, or battery bus if battery bus is controlled by generator and at a different voltage to main bus. +float32 bat_current_setpoint # [A] The target battery current. Positive for out. Negative for in. NaN: field not provided + +uint32 runtime # [s] Seconds this generator has run since it was rebooted. UINT32_MAX: field not provided. + +int32 time_until_maintenance # [s] Seconds until this generator requires maintenance. A negative value indicates maintenance is past-due. INT32_MAX: field not provided. + +uint16 generator_speed # [rpm] Speed of electrical generator or alternator. UINT16_MAX: field not provided. + +int16 rectifier_temperature # [degC] The temperature of the rectifier or power converter. INT16_MAX: field not provided. +int16 generator_temperature # [degC] The temperature of the mechanical motor, fuel cell core or generator. INT16_MAX: field not provided. diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GeofenceResult.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GeofenceResult.msg new file mode 100644 index 00000000..7782d1d6 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GeofenceResult.msg @@ -0,0 +1,13 @@ +uint64 timestamp # time since system start (microseconds) +uint8 GF_ACTION_NONE = 0 # no action on geofence violation +uint8 GF_ACTION_WARN = 1 # critical mavlink message +uint8 GF_ACTION_LOITER = 2 # switch to AUTO|LOITER +uint8 GF_ACTION_RTL = 3 # switch to AUTO|RTL +uint8 GF_ACTION_TERMINATE = 4 # flight termination +uint8 GF_ACTION_LAND = 5 # switch to AUTO|LAND + +bool geofence_max_dist_triggered # true the check for max distance from Home is triggered +bool geofence_max_alt_triggered # true the check for max altitude above Home is triggered +bool geofence_custom_fence_triggered # true the check for custom inclusion/exclusion geofence(s) is triggered + +uint8 geofence_action # action to take when the geofence is breached diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GeofenceStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GeofenceStatus.msg new file mode 100644 index 00000000..d32b9010 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GeofenceStatus.msg @@ -0,0 +1,7 @@ +uint64 timestamp # time since system start (microseconds) + +uint32 geofence_id # loaded geofence id +uint8 status # Current geofence status + +uint8 GF_STATUS_LOADING = 0 +uint8 GF_STATUS_READY = 1 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalControls.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalControls.msg new file mode 100644 index 00000000..3e1c5a9d --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalControls.msg @@ -0,0 +1,7 @@ +uint64 timestamp # time since system start (microseconds) +uint8 INDEX_ROLL = 0 +uint8 INDEX_PITCH = 1 +uint8 INDEX_YAW = 2 + +uint64 timestamp_sample # the timestamp the data this control response is based on was sampled +float32[3] control diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalDeviceAttitudeStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalDeviceAttitudeStatus.msg new file mode 100644 index 00000000..0be66bab --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalDeviceAttitudeStatus.msg @@ -0,0 +1,20 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 target_system +uint8 target_component +uint16 device_flags + +uint16 DEVICE_FLAGS_RETRACT = 1 +uint16 DEVICE_FLAGS_NEUTRAL = 2 +uint16 DEVICE_FLAGS_ROLL_LOCK = 4 +uint16 DEVICE_FLAGS_PITCH_LOCK = 8 +uint16 DEVICE_FLAGS_YAW_LOCK = 16 + +float32[4] q +float32 angular_velocity_x +float32 angular_velocity_y +float32 angular_velocity_z + +uint32 failure_flags + +bool received_from_mavlink diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalDeviceInformation.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalDeviceInformation.msg new file mode 100644 index 00000000..8f7a4164 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalDeviceInformation.msg @@ -0,0 +1,36 @@ +uint64 timestamp # time since system start (microseconds) + +uint8[32] vendor_name +uint8[32] model_name +uint8[32] custom_name +uint32 firmware_version +uint32 hardware_version +uint64 uid + +uint16 cap_flags + +uint32 GIMBAL_DEVICE_CAP_FLAGS_HAS_RETRACT = 1 +uint32 GIMBAL_DEVICE_CAP_FLAGS_HAS_NEUTRAL = 2 +uint32 GIMBAL_DEVICE_CAP_FLAGS_HAS_ROLL_AXIS = 4 +uint32 GIMBAL_DEVICE_CAP_FLAGS_HAS_ROLL_FOLLOW = 8 +uint32 GIMBAL_DEVICE_CAP_FLAGS_HAS_ROLL_LOCK = 16 +uint32 GIMBAL_DEVICE_CAP_FLAGS_HAS_PITCH_AXIS = 32 +uint32 GIMBAL_DEVICE_CAP_FLAGS_HAS_PITCH_FOLLOW = 64 +uint32 GIMBAL_DEVICE_CAP_FLAGS_HAS_PITCH_LOCK = 128 +uint32 GIMBAL_DEVICE_CAP_FLAGS_HAS_YAW_AXIS = 256 +uint32 GIMBAL_DEVICE_CAP_FLAGS_HAS_YAW_FOLLOW = 512 +uint32 GIMBAL_DEVICE_CAP_FLAGS_HAS_YAW_LOCK = 1024 +uint32 GIMBAL_DEVICE_CAP_FLAGS_SUPPORTS_INFINITE_YAW = 2048 + +uint16 custom_cap_flags + +float32 roll_min # [rad] +float32 roll_max # [rad] + +float32 pitch_min # [rad] +float32 pitch_max # [rad] + +float32 yaw_min # [rad] +float32 yaw_max # [rad] + +uint8 gimbal_device_compid diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalDeviceSetAttitude.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalDeviceSetAttitude.msg new file mode 100644 index 00000000..f224a234 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalDeviceSetAttitude.msg @@ -0,0 +1,17 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 target_system +uint8 target_component + +uint16 flags +uint32 GIMBAL_DEVICE_FLAGS_RETRACT = 1 +uint32 GIMBAL_DEVICE_FLAGS_NEUTRAL = 2 +uint32 GIMBAL_DEVICE_FLAGS_ROLL_LOCK = 4 +uint32 GIMBAL_DEVICE_FLAGS_PITCH_LOCK = 8 +uint32 GIMBAL_DEVICE_FLAGS_YAW_LOCK = 16 + +float32[4] q + +float32 angular_velocity_x +float32 angular_velocity_y +float32 angular_velocity_z diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerInformation.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerInformation.msg new file mode 100644 index 00000000..28db68a4 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerInformation.msg @@ -0,0 +1,29 @@ +uint64 timestamp # time since system start (microseconds) + +uint32 cap_flags + +uint32 GIMBAL_MANAGER_CAP_FLAGS_HAS_RETRACT = 1 +uint32 GIMBAL_MANAGER_CAP_FLAGS_HAS_NEUTRAL = 2 +uint32 GIMBAL_MANAGER_CAP_FLAGS_HAS_ROLL_AXIS = 4 +uint32 GIMBAL_MANAGER_CAP_FLAGS_HAS_ROLL_FOLLOW = 8 +uint32 GIMBAL_MANAGER_CAP_FLAGS_HAS_ROLL_LOCK = 16 +uint32 GIMBAL_MANAGER_CAP_FLAGS_HAS_PITCH_AXIS = 32 +uint32 GIMBAL_MANAGER_CAP_FLAGS_HAS_PITCH_FOLLOW = 64 +uint32 GIMBAL_MANAGER_CAP_FLAGS_HAS_PITCH_LOCK = 128 +uint32 GIMBAL_MANAGER_CAP_FLAGS_HAS_YAW_AXIS = 256 +uint32 GIMBAL_MANAGER_CAP_FLAGS_HAS_YAW_FOLLOW = 512 +uint32 GIMBAL_MANAGER_CAP_FLAGS_HAS_YAW_LOCK = 1024 +uint32 GIMBAL_MANAGER_CAP_FLAGS_SUPPORTS_INFINITE_YAW = 2048 +uint32 GIMBAL_MANAGER_CAP_FLAGS_CAN_POINT_LOCATION_LOCAL = 65536 +uint32 GIMBAL_MANAGER_CAP_FLAGS_CAN_POINT_LOCATION_GLOBAL = 131072 + +uint8 gimbal_device_id + +float32 roll_min # [rad] +float32 roll_max # [rad] + +float32 pitch_min # [rad] +float32 pitch_max # [rad] + +float32 yaw_min # [rad] +float32 yaw_max # [rad] diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerSetAttitude.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerSetAttitude.msg new file mode 100644 index 00000000..d88acca8 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerSetAttitude.msg @@ -0,0 +1,22 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 origin_sysid +uint8 origin_compid + +uint8 target_system +uint8 target_component + +uint32 GIMBAL_MANAGER_FLAGS_RETRACT = 1 +uint32 GIMBAL_MANAGER_FLAGS_NEUTRAL = 2 +uint32 GIMBAL_MANAGER_FLAGS_ROLL_LOCK = 4 +uint32 GIMBAL_MANAGER_FLAGS_PITCH_LOCK = 8 +uint32 GIMBAL_MANAGER_FLAGS_YAW_LOCK = 16 + +uint32 flags +uint8 gimbal_device_id + +float32[4] q + +float32 angular_velocity_x +float32 angular_velocity_y +float32 angular_velocity_z diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerSetManualControl.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerSetManualControl.msg new file mode 100644 index 00000000..4061438f --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerSetManualControl.msg @@ -0,0 +1,21 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 origin_sysid +uint8 origin_compid + +uint8 target_system +uint8 target_component + +uint32 GIMBAL_MANAGER_FLAGS_RETRACT = 1 +uint32 GIMBAL_MANAGER_FLAGS_NEUTRAL = 2 +uint32 GIMBAL_MANAGER_FLAGS_ROLL_LOCK = 4 +uint32 GIMBAL_MANAGER_FLAGS_PITCH_LOCK = 8 +uint32 GIMBAL_MANAGER_FLAGS_YAW_LOCK = 16 + +uint32 flags +uint8 gimbal_device_id + +float32 pitch # unitless -1..1, can be NAN +float32 yaw # unitless -1..1, can be NAN +float32 pitch_rate # unitless -1..1, can be NAN +float32 yaw_rate # unitless -1..1, can be NAN diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerStatus.msg new file mode 100644 index 00000000..002e5c90 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GimbalManagerStatus.msg @@ -0,0 +1,8 @@ +uint64 timestamp # time since system start (microseconds) + +uint32 flags +uint8 gimbal_device_id +uint8 primary_control_sysid +uint8 primary_control_compid +uint8 secondary_control_sysid +uint8 secondary_control_compid diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GotoSetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GotoSetpoint.msg new file mode 100644 index 00000000..5fe3ab8a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GotoSetpoint.msg @@ -0,0 +1,24 @@ +# Position and (optional) heading setpoints with corresponding speed constraints +# Setpoints are intended as inputs to position and heading smoothers, respectively +# Setpoints do not need to be kinematically consistent +# Optional heading setpoints may be specified as controlled by the respective flag +# Unset optional setpoints are not controlled +# Unset optional constraints default to vehicle specifications + +uint64 timestamp # time since system start (microseconds) + +# setpoints +float32[3] position # [m] NED local world frame + +bool flag_control_heading # true if heading is to be controlled +float32 heading # (optional) [rad] [-pi,pi] from North + +# constraints +bool flag_set_max_horizontal_speed # true if setting a non-default horizontal speed limit +float32 max_horizontal_speed # (optional) [m/s] maximum speed (absolute) in the NE-plane + +bool flag_set_max_vertical_speed # true if setting a non-default vertical speed limit +float32 max_vertical_speed # (optional) [m/s] maximum speed (absolute) in the D-axis + +bool flag_set_max_heading_rate # true if setting a non-default heading rate limit +float32 max_heading_rate # (optional) [rad/s] maximum heading rate (absolute) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioConfig.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioConfig.msg new file mode 100644 index 00000000..0ff393ec --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioConfig.msg @@ -0,0 +1,28 @@ +# GPIO configuration + +uint64 timestamp # time since system start (microseconds) +uint32 device_id # Device id + +uint32 mask # Pin mask +uint32 state # Initial pin output state + +# Configuration Mask +# Bit 0-3: Direction: 0=Input, 1=Output +# Bit 4-7: Input Config: 0=Floating, 1=PullUp, 2=PullDown +# Bit 8-12: Output Config: 0=PushPull, 1=OpenDrain +# Bit 13-31: Reserved +uint32 INPUT = 0 # 0x0000 +uint32 OUTPUT = 1 # 0x0001 +uint32 PULLUP = 16 # 0x0010 +uint32 PULLDOWN = 32 # 0x0020 +uint32 OPENDRAIN = 256 # 0x0100 + +uint32 INPUT_FLOATING = 0 # 0x0000 +uint32 INPUT_PULLUP = 16 # 0x0010 +uint32 INPUT_PULLDOWN = 32 # 0x0020 + +uint32 OUTPUT_PUSHPULL = 0 # 0x0000 +uint32 OUTPUT_OPENDRAIN = 256 # 0x0100 +uint32 OUTPUT_OPENDRAIN_PULLUP = 272 # 0x0110 + +uint32 config diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioIn.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioIn.msg new file mode 100644 index 00000000..0482a218 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioIn.msg @@ -0,0 +1,6 @@ +# GPIO mask and state + +uint64 timestamp # time since system start (microseconds) +uint32 device_id # Device id + +uint32 state # pin state mask diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioOut.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioOut.msg new file mode 100644 index 00000000..3865bbf2 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioOut.msg @@ -0,0 +1,7 @@ +# GPIO mask and state + +uint64 timestamp # time since system start (microseconds) +uint32 device_id # Device id + +uint32 mask # pin mask +uint32 state # pin state mask diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioRequest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioRequest.msg new file mode 100644 index 00000000..3328b001 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpioRequest.msg @@ -0,0 +1,4 @@ +# Request GPIO mask to be read + +uint64 timestamp # time since system start (microseconds) +uint32 device_id # Device id diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpsDump.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpsDump.msg new file mode 100644 index 00000000..2477bcfa --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpsDump.msg @@ -0,0 +1,10 @@ +# This message is used to dump the raw gps communication to the log. + +uint64 timestamp # time since system start (microseconds) + +uint8 instance # Instance of GNSS receiver +uint8 len # length of data, MSB bit set = message to the gps device, + # clear = message from the device +uint8[79] data # data to write to the log + +uint8 ORB_QUEUE_LENGTH = 8 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpsInjectData.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpsInjectData.msg new file mode 100644 index 00000000..516d5cb5 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/GpsInjectData.msg @@ -0,0 +1,11 @@ +uint64 timestamp # time since system start (microseconds) + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +uint16 len # length of data +uint8 flags # LSB: 1=fragmented +uint8[300] data # data to write to GPS device (RTCM message) + +uint8 ORB_QUEUE_LENGTH = 8 + +uint8 MAX_INSTANCES = 2 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Gripper.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Gripper.msg new file mode 100644 index 00000000..4f1445cb --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Gripper.msg @@ -0,0 +1,7 @@ +## Used to command an actuation in the gripper, which is mapped to a specific output in the control allocation module + +uint64 timestamp + +int8 command # Commanded state for the gripper +int8 COMMAND_GRAB = 0 +int8 COMMAND_RELEASE = 1 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HealthReport.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HealthReport.msg new file mode 100644 index 00000000..18951805 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HealthReport.msg @@ -0,0 +1,12 @@ +uint64 timestamp # time since system start (microseconds) + +uint64 can_arm_mode_flags # bitfield for each flight mode (NAVIGATION_STATE_*) if arming is possible +uint64 can_run_mode_flags # bitfield for each flight mode if it can run + +uint64 health_is_present_flags # flags for each health_component_t +uint64 health_warning_flags +uint64 health_error_flags +# A component is required but missing, if present==0 and error==1 + +uint64 arming_check_warning_flags +uint64 arming_check_error_flags diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HeaterStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HeaterStatus.msg new file mode 100644 index 00000000..44207a39 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HeaterStatus.msg @@ -0,0 +1,20 @@ +uint64 timestamp # time since system start (microseconds) + +uint32 device_id + +bool heater_on +bool temperature_target_met + +float32 temperature_sensor +float32 temperature_target + +uint32 controller_period_usec +uint32 controller_time_on_usec + +float32 proportional_value +float32 integrator_value +float32 feed_forward_value + +uint8 MODE_GPIO = 1 +uint8 MODE_PX4IO = 2 +uint8 mode diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HomePosition.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HomePosition.msg new file mode 100644 index 00000000..e6a51728 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HomePosition.msg @@ -0,0 +1,21 @@ +# GPS home position in WGS84 coordinates. + +uint64 timestamp # time since system start (microseconds) + +float64 lat # Latitude in degrees +float64 lon # Longitude in degrees +float32 alt # Altitude in meters (AMSL) + +float32 x # X coordinate in meters +float32 y # Y coordinate in meters +float32 z # Z coordinate in meters + +float32 yaw # Yaw angle in radians + +bool valid_alt # true when the altitude has been set +bool valid_hpos # true when the latitude and longitude have been set +bool valid_lpos # true when the local position (xyz) has been set + +bool manual_home # true when home position was set manually + +uint32 update_count # update counter of the home position diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HoverThrustEstimate.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HoverThrustEstimate.msg new file mode 100644 index 00000000..a38d9042 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/HoverThrustEstimate.msg @@ -0,0 +1,13 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # time of corresponding sensor data last used for this estimate + +float32 hover_thrust # estimated hover thrust [0.1, 0.9] +float32 hover_thrust_var # estimated hover thrust variance + +float32 accel_innov # innovation of the last acceleration fusion +float32 accel_innov_var # innovation variance of the last acceleration fusion +float32 accel_innov_test_ratio # normalized innovation squared test ratio + +float32 accel_noise_var # vertical acceleration noise variance estimated form innovation residual + +bool valid diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/InputRc.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/InputRc.msg new file mode 100644 index 00000000..db4b3de2 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/InputRc.msg @@ -0,0 +1,40 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 RC_INPUT_SOURCE_UNKNOWN = 0 +uint8 RC_INPUT_SOURCE_PX4FMU_PPM = 1 +uint8 RC_INPUT_SOURCE_PX4IO_PPM = 2 +uint8 RC_INPUT_SOURCE_PX4IO_SPEKTRUM = 3 +uint8 RC_INPUT_SOURCE_PX4IO_SBUS = 4 +uint8 RC_INPUT_SOURCE_PX4IO_ST24 = 5 +uint8 RC_INPUT_SOURCE_MAVLINK = 6 +uint8 RC_INPUT_SOURCE_QURT = 7 +uint8 RC_INPUT_SOURCE_PX4FMU_SPEKTRUM = 8 +uint8 RC_INPUT_SOURCE_PX4FMU_SBUS = 9 +uint8 RC_INPUT_SOURCE_PX4FMU_ST24 = 10 +uint8 RC_INPUT_SOURCE_PX4FMU_SUMD = 11 +uint8 RC_INPUT_SOURCE_PX4FMU_DSM = 12 +uint8 RC_INPUT_SOURCE_PX4IO_SUMD = 13 +uint8 RC_INPUT_SOURCE_PX4FMU_CRSF = 14 +uint8 RC_INPUT_SOURCE_PX4FMU_GHST = 15 + +uint8 RC_INPUT_MAX_CHANNELS = 18 # Maximum number of R/C input channels in the system. S.Bus has up to 18 channels. + +uint64 timestamp_last_signal # last valid reception time + +uint8 channel_count # number of channels actually being seen + +int8 RSSI_MAX = 100 +int32 rssi # receive signal strength indicator (RSSI): < 0: Undefined, 0: no signal, 100: full reception + +bool rc_failsafe # explicit failsafe flag: true on TX failure or TX out of range , false otherwise. Only the true state is reliable, as there are some (PPM) receivers on the market going into failsafe without telling us explicitly. +bool rc_lost # RC receiver connection status: True,if no frame has arrived in the expected time, false otherwise. True usually means that the receiver has been disconnected, but can also indicate a radio link loss on "stupid" systems. Will remain false, if a RX with failsafe option continues to transmit frames after a link loss. + +uint16 rc_lost_frame_count # Number of lost RC frames. Note: intended purpose: observe the radio link quality if RSSI is not available. This value must not be used to trigger any failsafe-alike functionality. +uint16 rc_total_frame_count # Number of total RC frames. Note: intended purpose: observe the radio link quality if RSSI is not available. This value must not be used to trigger any failsafe-alike functionality. +uint16 rc_ppm_frame_length # Length of a single PPM frame. Zero for non-PPM systems + +uint8 input_source # Input source +uint16[18] values # measured pulse widths for each of the supported channels + +int8 link_quality # link quality. Percentage 0-100%. -1 = invalid +float32 rssi_dbm # Actual rssi in units of dBm. NaN = invalid \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/InternalCombustionEngineStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/InternalCombustionEngineStatus.msg new file mode 100644 index 00000000..301eb92a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/InternalCombustionEngineStatus.msg @@ -0,0 +1,64 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 STATE_STOPPED = 0 # The engine is not running. This is the default state. +uint8 STATE_STARTING = 1 # The engine is starting. This is a transient state. +uint8 STATE_RUNNING = 2 # The engine is running normally. +uint8 STATE_FAULT = 3 # The engine can no longer function. +uint8 state + +uint32 FLAG_GENERAL_ERROR = 1 # General error. + +uint32 FLAG_CRANKSHAFT_SENSOR_ERROR_SUPPORTED = 2 # Error of the crankshaft sensor. This flag is optional. +uint32 FLAG_CRANKSHAFT_SENSOR_ERROR = 4 + +uint32 FLAG_TEMPERATURE_SUPPORTED = 8 # Temperature levels. These flags are optional +uint32 FLAG_TEMPERATURE_BELOW_NOMINAL = 16 # Under-temperature warning +uint32 FLAG_TEMPERATURE_ABOVE_NOMINAL = 32 # Over-temperature warning +uint32 FLAG_TEMPERATURE_OVERHEATING = 64 # Critical overheating +uint32 FLAG_TEMPERATURE_EGT_ABOVE_NOMINAL = 128 # Exhaust gas over-temperature warning + +uint32 FLAG_FUEL_PRESSURE_SUPPORTED = 256 # Fuel pressure. These flags are optional +uint32 FLAG_FUEL_PRESSURE_BELOW_NOMINAL = 512 # Under-pressure warning +uint32 FLAG_FUEL_PRESSURE_ABOVE_NOMINAL = 1024 # Over-pressure warning + +uint32 FLAG_DETONATION_SUPPORTED = 2048 # Detonation warning. This flag is optional. +uint32 FLAG_DETONATION_OBSERVED = 4096 # Detonation condition observed warning + +uint32 FLAG_MISFIRE_SUPPORTED = 8192 # Misfire warning. This flag is optional. +uint32 FLAG_MISFIRE_OBSERVED = 16384 # Misfire condition observed warning + +uint32 FLAG_OIL_PRESSURE_SUPPORTED = 32768 # Oil pressure. These flags are optional +uint32 FLAG_OIL_PRESSURE_BELOW_NOMINAL = 65536 # Under-pressure warning +uint32 FLAG_OIL_PRESSURE_ABOVE_NOMINAL = 131072 # Over-pressure warning + +uint32 FLAG_DEBRIS_SUPPORTED = 262144 # Debris warning. This flag is optional +uint32 FLAG_DEBRIS_DETECTED = 524288 # Detection of debris warning +uint32 flags + +uint8 engine_load_percent # Engine load estimate, percent, [0, 127] +uint32 engine_speed_rpm # Engine speed, revolutions per minute +float32 spark_dwell_time_ms # Spark dwell time, millisecond +float32 atmospheric_pressure_kpa # Atmospheric (barometric) pressure, kilopascal +float32 intake_manifold_pressure_kpa # Engine intake manifold pressure, kilopascal +float32 intake_manifold_temperature # Engine intake manifold temperature, kelvin +float32 coolant_temperature # Engine coolant temperature, kelvin +float32 oil_pressure # Oil pressure, kilopascal +float32 oil_temperature # Oil temperature, kelvin +float32 fuel_pressure # Fuel pressure, kilopascal +float32 fuel_consumption_rate_cm3pm # Instant fuel consumption estimate, (centimeter^3)/minute +float32 estimated_consumed_fuel_volume_cm3 # Estimate of the consumed fuel since the start of the engine, centimeter^3 +uint8 throttle_position_percent # Throttle position, percent +uint8 ecu_index # The index of the publishing ECU + + +uint8 SPARK_PLUG_SINGLE = 0 +uint8 SPARK_PLUG_FIRST_ACTIVE = 1 +uint8 SPARK_PLUG_SECOND_ACTIVE = 2 +uint8 SPARK_PLUG_BOTH_ACTIVE = 3 +uint8 spark_plug_usage # Spark plug activity report. + +float32 ignition_timing_deg # Cylinder ignition timing, angular degrees of the crankshaft +float32 injection_time_ms # Fuel injection time, millisecond +float32 cylinder_head_temperature # Cylinder head temperature (CHT), kelvin +float32 exhaust_gas_temperature # Exhaust gas temperature (EGT), kelvin +float32 lambda_coefficient # Estimated lambda coefficient, dimensionless ratio diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/IridiumsbdStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/IridiumsbdStatus.msg new file mode 100644 index 00000000..436654e4 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/IridiumsbdStatus.msg @@ -0,0 +1,15 @@ +uint64 timestamp # time since system start (microseconds) +uint64 last_at_ok_timestamp # timestamp of the last "OK" received after the "AT" command +uint16 tx_buf_write_index # current size of the tx buffer +uint16 rx_buf_read_index # the rx buffer is parsed up to that index +uint16 rx_buf_end_index # current size of the rx buffer +uint16 failed_sbd_sessions # number of failed sbd sessions +uint16 successful_sbd_sessions # number of successful sbd sessions +uint16 num_tx_buf_reset # number of times the tx buffer was reset +uint8 signal_quality # current signal quality, 0 is no signal, 5 the best +uint8 state # current state of the driver, see the satcom_state of IridiumSBD.h for the definition +bool ring_pending # indicates if a ring call is pending +bool tx_buf_write_pending # indicates if a tx buffer write is pending +bool tx_session_pending # indicates if a tx session is pending +bool rx_read_pending # indicates if a rx read is pending +bool rx_session_pending # indicates if a rx session is pending diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/IrlockReport.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/IrlockReport.msg new file mode 100644 index 00000000..9f23cbf3 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/IrlockReport.msg @@ -0,0 +1,11 @@ +# IRLOCK_REPORT message data + +uint64 timestamp # time since system start (microseconds) + +uint16 signature + +# When looking along the optical axis of the camera, x points right, y points down, and z points along the optical axis. +float32 pos_x # tan(theta), where theta is the angle between the target and the camera center of projection in camera x-axis +float32 pos_y # tan(theta), where theta is the angle between the target and the camera center of projection in camera y-axis +float32 size_x #/** size of target along camera x-axis in units of tan(theta) **/ +float32 size_y #/** size of target along camera y-axis in units of tan(theta) **/ diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingGear.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingGear.msg new file mode 100644 index 00000000..5ef9ee52 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingGear.msg @@ -0,0 +1,7 @@ +uint64 timestamp # time since system start (microseconds) + +int8 GEAR_UP = 1 # landing gear up +int8 GEAR_DOWN = -1 # landing gear down +int8 GEAR_KEEP = 0 # keep the current state + +int8 landing_gear diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingGearWheel.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingGearWheel.msg new file mode 100644 index 00000000..2ff99fcc --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingGearWheel.msg @@ -0,0 +1,3 @@ +uint64 timestamp # time since system start (microseconds) + +float32 normalized_wheel_setpoint # negative is turning left, positive turning right [-1, 1] diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingTargetInnovations.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingTargetInnovations.msg new file mode 100644 index 00000000..5dd892c5 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingTargetInnovations.msg @@ -0,0 +1,8 @@ +uint64 timestamp # time since system start (microseconds) +# Innovation of landing target position estimator +float32 innov_x +float32 innov_y + +# Innovation covariance of landing target position estimator +float32 innov_cov_x +float32 innov_cov_y diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingTargetPose.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingTargetPose.msg new file mode 100644 index 00000000..875920f1 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LandingTargetPose.msg @@ -0,0 +1,26 @@ +# Relative position of precision land target in navigation (body fixed, north aligned, NED) and inertial (world fixed, north aligned, NED) frames + +uint64 timestamp # time since system start (microseconds) + +bool is_static # Flag indicating whether the landing target is static or moving with respect to the ground + +bool rel_pos_valid # Flag showing whether relative position is valid +bool rel_vel_valid # Flag showing whether relative velocity is valid + +float32 x_rel # X/north position of target, relative to vehicle (navigation frame) [meters] +float32 y_rel # Y/east position of target, relative to vehicle (navigation frame) [meters] +float32 z_rel # Z/down position of target, relative to vehicle (navigation frame) [meters] + +float32 vx_rel # X/north velocity of target, relative to vehicle (navigation frame) [meters/second] +float32 vy_rel # Y/east velocity of target, relative to vehicle (navigation frame) [meters/second] + +float32 cov_x_rel # X/north position variance [meters^2] +float32 cov_y_rel # Y/east position variance [meters^2] + +float32 cov_vx_rel # X/north velocity variance [(meters/second)^2] +float32 cov_vy_rel # Y/east velocity variance [(meters/second)^2] + +bool abs_pos_valid # Flag showing whether absolute position is valid +float32 x_abs # X/north position of target, relative to origin (navigation frame) [meters] +float32 y_abs # Y/east position of target, relative to origin (navigation frame) [meters] +float32 z_abs # Z/down position of target, relative to origin (navigation frame) [meters] diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LaunchDetectionStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LaunchDetectionStatus.msg new file mode 100644 index 00000000..6917f4bc --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LaunchDetectionStatus.msg @@ -0,0 +1,9 @@ +# Status of the launch detection state machine (fixed-wing only) + +uint64 timestamp # time since system start (microseconds) + +uint8 STATE_WAITING_FOR_LAUNCH = 0 # waiting for launch +uint8 STATE_LAUNCH_DETECTED_DISABLED_MOTOR = 1 # launch detected, but keep motor(s) disabled (e.g. because it can't spin freely while on catapult) +uint8 STATE_FLYING = 2 # launch detected, use normal takeoff/flying configuration + +uint8 launch_detection_state diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LedControl.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LedControl.msg new file mode 100644 index 00000000..4be5cc1c --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LedControl.msg @@ -0,0 +1,37 @@ +# LED control: control a single or multiple LED's. +# These are the externally visible LED's, not the board LED's + +uint64 timestamp # time since system start (microseconds) + +# colors +uint8 COLOR_OFF = 0 # this is only used in the drivers +uint8 COLOR_RED = 1 +uint8 COLOR_GREEN = 2 +uint8 COLOR_BLUE = 3 +uint8 COLOR_YELLOW = 4 +uint8 COLOR_PURPLE = 5 +uint8 COLOR_AMBER = 6 +uint8 COLOR_CYAN = 7 +uint8 COLOR_WHITE = 8 + +# LED modes definitions +uint8 MODE_OFF = 0 # turn LED off +uint8 MODE_ON = 1 # turn LED on +uint8 MODE_DISABLED = 2 # disable this priority (switch to lower priority setting) +uint8 MODE_BLINK_SLOW = 3 +uint8 MODE_BLINK_NORMAL = 4 +uint8 MODE_BLINK_FAST = 5 +uint8 MODE_BREATHE = 6 # continuously increase & decrease brightness (solid color if driver does not support it) +uint8 MODE_FLASH = 7 # two fast blinks (on/off) with timing as in MODE_BLINK_FAST and then off for a while + +uint8 MAX_PRIORITY = 2 # maximum priority (minimum is 0) + + +uint8 led_mask # bitmask which LED(s) to control, set to 0xff for all +uint8 color # see COLOR_* +uint8 mode # see MODE_* +uint8 num_blinks # how many times to blink (number of on-off cycles if mode is one of MODE_BLINK_*) . Set to 0 for infinite + # in MODE_FLASH it is the number of cycles. Max number of blinks: 122 and max number of flash cycles: 20 +uint8 priority # priority: higher priority events will override current lower priority events (see MAX_PRIORITY) + +uint8 ORB_QUEUE_LENGTH = 8 # needs to match BOARD_MAX_LEDS diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LogMessage.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LogMessage.msg new file mode 100644 index 00000000..afb690b1 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LogMessage.msg @@ -0,0 +1,8 @@ +# A logging message, output with PX4_WARN, PX4_ERR, PX4_INFO + +uint64 timestamp # time since system start (microseconds) + +uint8 severity # log level (same as in the linux kernel, starting with 0) +char[127] text + +uint8 ORB_QUEUE_LENGTH = 4 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LoggerStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LoggerStatus.msg new file mode 100644 index 00000000..c67c8895 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/LoggerStatus.msg @@ -0,0 +1,23 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 LOGGER_TYPE_FULL = 0 # Normal, full size log +uint8 LOGGER_TYPE_MISSION = 1 # reduced mission log (e.g. for geotagging) +uint8 type + +uint8 BACKEND_FILE = 1 +uint8 BACKEND_MAVLINK = 2 +uint8 BACKEND_ALL = 3 +uint8 backend + +bool is_logging + +float32 total_written_kb # total written to log in kiloBytes +float32 write_rate_kb_s # write rate in kiloBytes/s + +uint32 dropouts # number of failed buffer writes due to buffer overflow +uint32 message_gaps # messages misssed + +uint32 buffer_used_bytes # current buffer fill in Bytes +uint32 buffer_size_bytes # total buffer size in Bytes + +uint8 num_messages diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MagWorkerData.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MagWorkerData.msg new file mode 100644 index 00000000..09626e8a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MagWorkerData.msg @@ -0,0 +1,13 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint8 MAX_MAGS = 4 + +uint32 done_count +uint32 calibration_points_perside +uint64 calibration_interval_perside_us +uint32[4] calibration_counter_total +bool[4] side_data_collected +float32[4] x +float32[4] y +float32[4] z diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MagnetometerBiasEstimate.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MagnetometerBiasEstimate.msg new file mode 100644 index 00000000..3c0c1136 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MagnetometerBiasEstimate.msg @@ -0,0 +1,8 @@ +uint64 timestamp # time since system start (microseconds) + +float32[4] bias_x # estimated X-bias of all the sensors +float32[4] bias_y # estimated Y-bias of all the sensors +float32[4] bias_z # estimated Z-bias of all the sensors + +bool[4] valid # true if the estimator has converged +bool[4] stable diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ManualControlSetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ManualControlSetpoint.msg new file mode 100644 index 00000000..95fa6222 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ManualControlSetpoint.msg @@ -0,0 +1,46 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +bool valid + +uint8 SOURCE_UNKNOWN = 0 +uint8 SOURCE_RC = 1 # radio control (input_rc) +uint8 SOURCE_MAVLINK_0 = 2 # mavlink instance 0 +uint8 SOURCE_MAVLINK_1 = 3 # mavlink instance 1 +uint8 SOURCE_MAVLINK_2 = 4 # mavlink instance 2 +uint8 SOURCE_MAVLINK_3 = 5 # mavlink instance 3 +uint8 SOURCE_MAVLINK_4 = 6 # mavlink instance 4 +uint8 SOURCE_MAVLINK_5 = 7 # mavlink instance 5 + +uint8 data_source + +# Any of the channels may not be available and be set to NaN +# to indicate that it does not contain valid data. + +# Stick positions [-1,1] +# on a common RC mode 1/2/3/4 remote/joystick the stick deflection: -1 is down/left, 1 is up/right +# Note: QGC sends throttle/z in range [0,1000] - [0,1]. The MAVLink input conversion [0,1] to [-1,1] is at the moment kept backwards compatible. +# Positive values are generally used for: +float32 roll # move right, positive roll rotation, right side down +float32 pitch # move forward, negative pitch rotation, nose down +float32 yaw # positive yaw rotation, clockwise when seen top down +float32 throttle # move up, positive thrust, -1 is minimum available 0% or -100% +1 is 100% thrust + +float32 flaps # position of flaps switch/knob/lever [-1, 1] + +float32 aux1 +float32 aux2 +float32 aux3 +float32 aux4 +float32 aux5 +float32 aux6 + +bool sticks_moving + +uint16 buttons # From uint16 buttons field of Mavlink manual_control message + +# TOPICS manual_control_setpoint manual_control_input +# DEPRECATED: float32 x +# DEPRECATED: float32 y +# DEPRECATED: float32 z +# DEPRECATED: float32 r diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ManualControlSwitches.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ManualControlSwitches.msg new file mode 100644 index 00000000..4d1cbab2 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ManualControlSwitches.msg @@ -0,0 +1,34 @@ +uint64 timestamp # time since system start (microseconds) + +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +uint8 SWITCH_POS_NONE = 0 # switch is not mapped +uint8 SWITCH_POS_ON = 1 # switch activated (value = 1) +uint8 SWITCH_POS_MIDDLE = 2 # middle position (value = 0) +uint8 SWITCH_POS_OFF = 3 # switch not activated (value = -1) + +uint8 MODE_SLOT_NONE = 0 # no mode slot assigned +uint8 MODE_SLOT_1 = 1 # mode slot 1 selected +uint8 MODE_SLOT_2 = 2 # mode slot 2 selected +uint8 MODE_SLOT_3 = 3 # mode slot 3 selected +uint8 MODE_SLOT_4 = 4 # mode slot 4 selected +uint8 MODE_SLOT_5 = 5 # mode slot 5 selected +uint8 MODE_SLOT_6 = 6 # mode slot 6 selected +uint8 MODE_SLOT_NUM = 6 # number of slots + +uint8 mode_slot # the slot a specific model selector is in + +uint8 arm_switch # arm/disarm switch: _DISARMED_, ARMED +uint8 return_switch # return to launch 2 position switch (mandatory): _NORMAL_, RTL +uint8 loiter_switch # loiter 2 position switch (optional): _MISSION_, LOITER +uint8 offboard_switch # offboard 2 position switch (optional): _NORMAL_, OFFBOARD +uint8 kill_switch # throttle kill: _NORMAL_, KILL +uint8 gear_switch # landing gear switch: _DOWN_, UP +uint8 transition_switch # VTOL transition switch: _HOVER, FORWARD_FLIGHT + +uint8 photo_switch # Photo trigger switch +uint8 video_switch # Photo trigger switch + +uint8 engage_main_motor_switch # Engage the main motor (for helicopters) + +uint32 switch_changes # number of switch changes diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MavlinkLog.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MavlinkLog.msg new file mode 100644 index 00000000..8f52ec7d --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MavlinkLog.msg @@ -0,0 +1,6 @@ +uint64 timestamp # time since system start (microseconds) + +char[127] text +uint8 severity # log level (same as in the linux kernel, starting with 0) + +uint8 ORB_QUEUE_LENGTH = 8 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MavlinkTunnel.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MavlinkTunnel.msg new file mode 100644 index 00000000..16934a95 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MavlinkTunnel.msg @@ -0,0 +1,20 @@ +# MAV_TUNNEL_PAYLOAD_TYPE enum + +uint8 MAV_TUNNEL_PAYLOAD_TYPE_UNKNOWN = 0 # Encoding of payload unknown +uint8 MAV_TUNNEL_PAYLOAD_TYPE_STORM32_RESERVED0 = 200 # Registered for STorM32 gimbal controller +uint8 MAV_TUNNEL_PAYLOAD_TYPE_STORM32_RESERVED1 = 201 # Registered for STorM32 gimbal controller +uint8 MAV_TUNNEL_PAYLOAD_TYPE_STORM32_RESERVED2 = 202 # Registered for STorM32 gimbal controller +uint8 MAV_TUNNEL_PAYLOAD_TYPE_STORM32_RESERVED3 = 203 # Registered for STorM32 gimbal controller +uint8 MAV_TUNNEL_PAYLOAD_TYPE_STORM32_RESERVED4 = 204 # Registered for STorM32 gimbal controller +uint8 MAV_TUNNEL_PAYLOAD_TYPE_STORM32_RESERVED5 = 205 # Registered for STorM32 gimbal controller +uint8 MAV_TUNNEL_PAYLOAD_TYPE_STORM32_RESERVED6 = 206 # Registered for STorM32 gimbal controller +uint8 MAV_TUNNEL_PAYLOAD_TYPE_STORM32_RESERVED7 = 207 # Registered for STorM32 gimbal controller +uint8 MAV_TUNNEL_PAYLOAD_TYPE_STORM32_RESERVED8 = 208 # Registered for STorM32 gimbal controller +uint8 MAV_TUNNEL_PAYLOAD_TYPE_STORM32_RESERVED9 = 209 # Registered for STorM32 gimbal controller + +uint64 timestamp # Time since system start (microseconds) +uint16 payload_type # A code that identifies the content of the payload (0 for unknown, which is the default). If this code is less than 32768, it is a 'registered' payload type and the corresponding code should be added to the MAV_TUNNEL_PAYLOAD_TYPE enum. Software creators can register blocks of types as needed. Codes greater than 32767 are considered local experiments and should not be checked in to any widely distributed codebase. +uint8 target_system # System ID (can be 0 for broadcast, but this is discouraged) +uint8 target_component # Component ID (can be 0 for broadcast, but this is discouraged) +uint8 payload_length # Length of the data transported in payload +uint8[128] payload # Data itself diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MessageFormatRequest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MessageFormatRequest.msg new file mode 100644 index 00000000..6ceb66d0 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MessageFormatRequest.msg @@ -0,0 +1,9 @@ +uint64 timestamp # time since system start (microseconds) + +# Request to PX4 to get the hash of a message, to check for message compatibility + +uint16 LATEST_PROTOCOL_VERSION = 1 # Current version of this protocol. Increase this whenever the MessageFormatRequest or MessageFormatResponse changes. + +uint16 protocol_version # Must be set to LATEST_PROTOCOL_VERSION. Do not change this field, it must be the first field after the timestamp + +char[50] topic_name # E.g. /fmu/in/vehicle_command diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MessageFormatResponse.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MessageFormatResponse.msg new file mode 100644 index 00000000..41ee9627 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MessageFormatResponse.msg @@ -0,0 +1,11 @@ +uint64 timestamp # time since system start (microseconds) + +# Response from PX4 with the format of a message + +uint16 protocol_version # Must be set to LATEST_PROTOCOL_VERSION. Do not change this field, it must be the first field after the timestamp + +char[50] topic_name # E.g. /fmu/in/vehicle_command + +bool success +uint32 message_hash # hash over all message fields + diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Mission.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Mission.msg new file mode 100644 index 00000000..a923193d --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Mission.msg @@ -0,0 +1,14 @@ +uint64 timestamp # time since system start (microseconds) +uint8 mission_dataman_id # default 0, there are two offboard storage places in the dataman: 0 or 1 +uint8 fence_dataman_id # default 0, there are two offboard storage places in the dataman: 0 or 1 +uint8 safepoint_dataman_id # default 0, there are two offboard storage places in the dataman: 0 or 1 + +uint16 count # count of the missions stored in the dataman +int32 current_seq # default -1, start at the one changed latest + +int32 land_start_index # Index of the land start marker, if unavailable index of the land item, -1 otherwise +int32 land_index # Index of the land item, -1 otherwise + +uint32 mission_id # indicates updates to the mission, reload from dataman if changed +uint32 geofence_id # indicates updates to the geofence, reload from dataman if changed +uint32 safe_points_id # indicates updates to the safe points, reload from dataman if changed diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MissionResult.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MissionResult.msg new file mode 100644 index 00000000..f70326be --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MissionResult.msg @@ -0,0 +1,20 @@ +uint64 timestamp # time since system start (microseconds) + +uint32 mission_id # Id for the mission for which the result was generated +uint32 geofence_id # Id for the corresponding geofence for which the result was generated (used for mission feasibility) +uint32 home_position_counter # Counter of the home position for which the result was generated (used for mission feasibility) + +int32 seq_reached # Sequence of the mission item which has been reached, default -1 +uint16 seq_current # Sequence of the current mission item +uint16 seq_total # Total number of mission items + +bool valid # true if mission is valid +bool warning # true if mission is valid, but has potentially problematic items leading to safety warnings +bool finished # true if mission has been completed +bool failure # true if the mission cannot continue or be completed for some reason + +bool item_do_jump_changed # true if the number of do jumps remaining has changed +uint16 item_changed_index # indicate which item has changed +uint16 item_do_jump_remaining # set to the number of do jumps remaining for that item + +uint8 execution_mode # indicates the mode in which the mission is executed diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ModeCompleted.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ModeCompleted.msg new file mode 100644 index 00000000..bacff4a9 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ModeCompleted.msg @@ -0,0 +1,15 @@ +# Mode completion result, published by an active mode. +# The possible values of nav_state are defined in the VehicleStatus msg. +# Note that this is not always published (e.g. when a user switches modes or on +# failsafe activation) +uint64 timestamp # time since system start (microseconds) + + +uint8 RESULT_SUCCESS = 0 +# [1-99]: reserved +uint8 RESULT_FAILURE_OTHER = 100 # Mode failed (generic error) + +uint8 result # One of RESULT_* + +uint8 nav_state # Source mode (values in VehicleStatus) + diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MountOrientation.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MountOrientation.msg new file mode 100644 index 00000000..7ae54a39 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/MountOrientation.msg @@ -0,0 +1,2 @@ +uint64 timestamp # time since system start (microseconds) +float32[3] attitude_euler_angle # Attitude/direction of the mount as euler angles in rad diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/NavigatorMissionItem.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/NavigatorMissionItem.msg new file mode 100644 index 00000000..64af762f --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/NavigatorMissionItem.msg @@ -0,0 +1,25 @@ +uint64 timestamp # time since system start (microseconds) + +uint32 instance_count # Instance count of this mission. Increments monotonically whenever the mission is modified + +uint16 sequence_current # Sequence of the current mission item + +uint16 nav_cmd + +float32 latitude +float32 longitude + +float32 time_inside # time that the MAV should stay inside the radius before advancing in seconds +float32 acceptance_radius # default radius in which the mission is accepted as reached in meters +float32 loiter_radius # loiter radius in meters, 0 for a VTOL to hover, negative for counter-clockwise +float32 yaw # in radians NED -PI..+PI, NAN means don't change yaw +float32 altitude # altitude in meters (AMSL) + +uint8 frame # mission frame +uint8 origin # mission item origin (onboard or mavlink) + +bool loiter_exit_xtrack # exit xtrack location: 0 for center of loiter wp, 1 for exit location +bool force_heading # heading needs to be reached +bool altitude_is_relative # true if altitude is relative from start point +bool autocontinue # true if next waypoint should follow after this one +bool vtol_back_transition # part of the vtol back transition sequence diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/NormalizedUnsignedSetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/NormalizedUnsignedSetpoint.msg new file mode 100644 index 00000000..10193b8c --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/NormalizedUnsignedSetpoint.msg @@ -0,0 +1,5 @@ +uint64 timestamp # time since system start (microseconds) + +float32 normalized_setpoint # [0, 1] + +# TOPICS flaps_setpoint spoilers_setpoint diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/NpfgStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/NpfgStatus.msg new file mode 100644 index 00000000..132c1f7f --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/NpfgStatus.msg @@ -0,0 +1,17 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 wind_est_valid # (boolean) true = wind estimate is valid and/or being used by controller (also indicates if wind est usage is disabled despite being valid) +float32 lat_accel # resultant lateral acceleration reference [m/s^2] +float32 lat_accel_ff # lateral acceleration demand only for maintaining curvature [m/s^2] +float32 bearing_feas # bearing feasibility [0,1] +float32 bearing_feas_on_track # on-track bearing feasibility [0,1] +float32 signed_track_error # signed track error [m] +float32 track_error_bound # track error bound [m] +float32 airspeed_ref # (true) airspeed reference [m/s] +float32 bearing # bearing angle [rad] +float32 heading_ref # heading angle reference [rad] +float32 min_ground_speed_ref # minimum forward ground speed reference [m/s] +float32 adapted_period # adapted period (if auto-tuning enabled) [s] +float32 p_gain # controller proportional gain [rad/s] +float32 time_const # controller time constant [s] +float32 can_run_factor # estimate of certainty of the correct functionality of the npfg roll setpoint in [0, 1] diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ObstacleDistance.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ObstacleDistance.msg new file mode 100644 index 00000000..e3c4963a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ObstacleDistance.msg @@ -0,0 +1,24 @@ +# Obstacle distances in front of the sensor. +uint64 timestamp # time since system start (microseconds) + +uint8 frame #Coordinate frame of reference for the yaw rotation and offset of the sensor data. Defaults to MAV_FRAME_GLOBAL, which is North aligned. For body-mounted sensors use MAV_FRAME_BODY_FRD, which is vehicle front aligned. +uint8 MAV_FRAME_GLOBAL = 0 +uint8 MAV_FRAME_LOCAL_NED = 1 +uint8 MAV_FRAME_BODY_FRD = 12 + +uint8 sensor_type # Type from MAV_DISTANCE_SENSOR enum. +uint8 MAV_DISTANCE_SENSOR_LASER = 0 +uint8 MAV_DISTANCE_SENSOR_ULTRASOUND = 1 +uint8 MAV_DISTANCE_SENSOR_INFRARED = 2 +uint8 MAV_DISTANCE_SENSOR_RADAR = 3 + +uint16[72] distances # Distance of obstacles around the UAV with index 0 corresponding to local North. A value of 0 means that the obstacle is right in front of the sensor. A value of max_distance +1 means no obstacle is present. A value of UINT16_MAX for unknown/not used. In a array element, one unit corresponds to 1cm. + +float32 increment # Angular width in degrees of each array element. + +uint16 min_distance # Minimum distance the sensor can measure in centimeters. +uint16 max_distance # Maximum distance the sensor can measure in centimeters. + +float32 angle_offset # Relative angle offset of the 0-index element in the distances array. Value of 0 corresponds to forward. Positive values are offsets to the right. + +# TOPICS obstacle_distance obstacle_distance_fused diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OffboardControlMode.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OffboardControlMode.msg new file mode 100644 index 00000000..885164a6 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OffboardControlMode.msg @@ -0,0 +1,11 @@ +# Off-board control mode + +uint64 timestamp # time since system start (microseconds) + +bool position +bool velocity +bool acceleration +bool attitude +bool body_rate +bool thrust_and_torque +bool direct_actuator diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OnboardComputerStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OnboardComputerStatus.msg new file mode 100644 index 00000000..736932bc --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OnboardComputerStatus.msg @@ -0,0 +1,23 @@ +# ONBOARD_COMPUTER_STATUS message data +uint64 timestamp # [us] time since system start (microseconds) +uint32 uptime # [ms] time since system boot of the companion (milliseconds) + +uint8 type # type of onboard computer 0: Mission computer primary, 1: Mission computer backup 1, 2: Mission computer backup 2, 3: Compute node, 4-5: Compute spares, 6-9: Payload computers. + +uint8[8] cpu_cores # CPU usage on the component in percent +uint8[10] cpu_combined # Combined CPU usage as the last 10 slices of 100 MS +uint8[4] gpu_cores # GPU usage on the component in percent +uint8[10] gpu_combined # Combined GPU usage as the last 10 slices of 100 MS +int8 temperature_board # [degC] Temperature of the board +int8[8] temperature_core # [degC] Temperature of the CPU core +int16[4] fan_speed # [rpm] Fan speeds +uint32 ram_usage # [MB] Amount of used RAM on the component system +uint32 ram_total # [MB] Total amount of RAM on the component system +uint32[4] storage_type # Storage type: 0: HDD, 1: SSD, 2: EMMC, 3: SD card (non-removable), 4: SD card (removable) +uint32[4] storage_usage # [MB] Amount of used storage space on the component system +uint32[4] storage_total # [MB] Total amount of storage space on the component system +uint32[6] link_type # [Kb/s] Link type: 0-9: UART, 10-19: Wired network, 20-29: Wifi, 30-39: Point-to-point proprietary, 40-49: Mesh proprietary +uint32[6] link_tx_rate # [Kb/s] Network traffic from the component system +uint32[6] link_rx_rate # [Kb/s] Network traffic to the component system +uint32[6] link_tx_max # [Kb/s] Network capacity from the component system +uint32[6] link_rx_max # [Kb/s] Network capacity to the component system diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbTest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbTest.msg new file mode 100644 index 00000000..bbbca412 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbTest.msg @@ -0,0 +1,5 @@ +uint64 timestamp # time since system start (microseconds) + +int32 val + +# TOPICS orb_test orb_multitest diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbTestLarge.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbTestLarge.msg new file mode 100644 index 00000000..48d6a427 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbTestLarge.msg @@ -0,0 +1,5 @@ +uint64 timestamp # time since system start (microseconds) + +int32 val + +uint8[512] junk diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbTestMedium.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbTestMedium.msg new file mode 100644 index 00000000..43109d49 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbTestMedium.msg @@ -0,0 +1,9 @@ +uint64 timestamp # time since system start (microseconds) + +int32 val + +uint8[64] junk + +uint8 ORB_QUEUE_LENGTH = 16 + +# TOPICS orb_test_medium orb_test_medium_multi orb_test_medium_wrap_around orb_test_medium_queue orb_test_medium_queue_poll diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbitStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbitStatus.msg new file mode 100644 index 00000000..a04265db --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/OrbitStatus.msg @@ -0,0 +1,14 @@ +# ORBIT_YAW_BEHAVIOUR +uint8 ORBIT_YAW_BEHAVIOUR_HOLD_FRONT_TO_CIRCLE_CENTER = 0 +uint8 ORBIT_YAW_BEHAVIOUR_HOLD_INITIAL_HEADING = 1 +uint8 ORBIT_YAW_BEHAVIOUR_UNCONTROLLED = 2 +uint8 ORBIT_YAW_BEHAVIOUR_HOLD_FRONT_TANGENT_TO_CIRCLE = 3 +uint8 ORBIT_YAW_BEHAVIOUR_RC_CONTROLLED = 4 + +uint64 timestamp # time since system start (microseconds) +float32 radius # Radius of the orbit circle. Positive values orbit clockwise, negative values orbit counter-clockwise. [m] +uint8 frame # The coordinate system of the fields: x, y, z. +float64 x # X coordinate of center point. Coordinate system depends on frame field: local = x position in meters * 1e4, global = latitude in degrees * 1e7. +float64 y # Y coordinate of center point. Coordinate system depends on frame field: local = y position in meters * 1e4, global = latitude in degrees * 1e7. +float32 z # Altitude of center point. Coordinate system depends on frame field. +uint8 yaw_behaviour diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterResetRequest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterResetRequest.msg new file mode 100644 index 00000000..db08edb3 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterResetRequest.msg @@ -0,0 +1,8 @@ +# ParameterResetRequest : Used by the primary to reset one or all parameter value(s) on the remote + +uint64 timestamp +uint16 parameter_index + +bool reset_all # If this is true then ignore parameter_index + +uint8 ORB_QUEUE_LENGTH = 4 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterSetUsedRequest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterSetUsedRequest.msg new file mode 100644 index 00000000..ca97f9e9 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterSetUsedRequest.msg @@ -0,0 +1,6 @@ +# ParameterSetUsedRequest : Used by a remote to update the used flag for a parameter on the primary + +uint64 timestamp +uint16 parameter_index + +uint8 ORB_QUEUE_LENGTH = 64 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterSetValueRequest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterSetValueRequest.msg new file mode 100644 index 00000000..eaf650f2 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterSetValueRequest.msg @@ -0,0 +1,11 @@ +# ParameterSetValueRequest : Used by a remote or primary to update the value for a parameter at the other end + +uint64 timestamp +uint16 parameter_index + +int32 int_value # Optional value for an integer parameter +float32 float_value # Optional value for a float parameter + +uint8 ORB_QUEUE_LENGTH = 32 + +# TOPICS parameter_set_value_request parameter_remote_set_value_request parameter_primary_set_value_request diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterSetValueResponse.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterSetValueResponse.msg new file mode 100644 index 00000000..09f8e308 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterSetValueResponse.msg @@ -0,0 +1,9 @@ +# ParameterSetValueResponse : Response to a set value request by either primary or secondary + +uint64 timestamp +uint64 request_timestamp +uint16 parameter_index + +uint8 ORB_QUEUE_LENGTH = 4 + +# TOPICS parameter_set_value_response parameter_remote_set_value_response parameter_primary_set_value_response \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterUpdate.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterUpdate.msg new file mode 100644 index 00000000..bfb49937 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/ParameterUpdate.msg @@ -0,0 +1,14 @@ +# This message is used to notify the system about one or more parameter changes + +uint64 timestamp # time since system start (microseconds) + +uint32 instance # Instance count - constantly incrementing + +uint32 get_count +uint32 set_count +uint32 find_count +uint32 export_count + +uint16 active +uint16 changed +uint16 custom_default diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Ping.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Ping.msg new file mode 100644 index 00000000..498a3c73 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Ping.msg @@ -0,0 +1,7 @@ +uint64 timestamp # time since system start (microseconds) +uint64 ping_time # Timestamp of the ping packet +uint32 ping_sequence # Sequence number of the ping packet +uint32 dropped_packets # Number of dropped ping packets +float32 rtt_ms # Round trip time (in ms) +uint8 system_id # System ID of the remote system +uint8 component_id # Component ID of the remote system diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionControllerLandingStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionControllerLandingStatus.msg new file mode 100644 index 00000000..249529b4 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionControllerLandingStatus.msg @@ -0,0 +1,16 @@ +uint64 timestamp # [us] time since system start +float32 lateral_touchdown_offset # [m] lateral touchdown position offset manually commanded during landing +bool flaring # true if the aircraft is flaring + +# abort status is: +# 0 if not aborted +# >0 if aborted, with the singular abort criterion which triggered the landing abort enumerated by the following abort reasons +uint8 abort_status + +# abort reasons +# after the manual operator abort, corresponds to individual bits of param FW_LND_ABORT +uint8 NOT_ABORTED = 0 +uint8 ABORTED_BY_OPERATOR = 1 +uint8 TERRAIN_NOT_FOUND = 2 # FW_LND_ABORT (1 << 0) +uint8 TERRAIN_TIMEOUT = 3 # FW_LND_ABORT (1 << 1) +uint8 UNKNOWN_ABORT_CRITERION = 4 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionControllerStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionControllerStatus.msg new file mode 100644 index 00000000..7237351f --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionControllerStatus.msg @@ -0,0 +1,12 @@ +uint64 timestamp # time since system start (microseconds) + +float32 nav_roll # Roll setpoint [rad] +float32 nav_pitch # Pitch setpoint [rad] +float32 nav_bearing # Bearing angle[rad] +float32 target_bearing # Bearing angle from aircraft to current target [rad] +float32 xtrack_error # Signed track error [m] +float32 wp_dist # Distance to active (next) waypoint [m] +float32 acceptance_radius # Current horizontal acceptance radius [m] +float32 yaw_acceptance # Yaw acceptance error[rad] +float32 altitude_acceptance # Current vertical acceptance error [m] +uint8 type # Current (applied) position setpoint type (see PositionSetpoint.msg) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionSetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionSetpoint.msg new file mode 100644 index 00000000..035d3520 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionSetpoint.msg @@ -0,0 +1,37 @@ +# this file is only used in the position_setpoint triple as a dependency + +uint64 timestamp # time since system start (microseconds) + +uint8 SETPOINT_TYPE_POSITION=0 # position setpoint +uint8 SETPOINT_TYPE_VELOCITY=1 # velocity setpoint +uint8 SETPOINT_TYPE_LOITER=2 # loiter setpoint +uint8 SETPOINT_TYPE_TAKEOFF=3 # takeoff setpoint +uint8 SETPOINT_TYPE_LAND=4 # land setpoint, altitude must be ignored, descend until landing +uint8 SETPOINT_TYPE_IDLE=5 # do nothing, switch off motors or keep at idle speed (MC) + +uint8 LOITER_TYPE_ORBIT=0 # Circular pattern +uint8 LOITER_TYPE_FIGUREEIGHT=1 # Pattern resembling an 8 + +bool valid # true if setpoint is valid +uint8 type # setpoint type to adjust behavior of position controller + +float32 vx # local velocity setpoint in m/s in NED +float32 vy # local velocity setpoint in m/s in NED +float32 vz # local velocity setpoint in m/s in NED + +float64 lat # latitude, in deg +float64 lon # longitude, in deg +float32 alt # altitude AMSL, in m +float32 yaw # yaw (only in hover), in rad [-PI..PI), NaN = leave to flight task + +float32 loiter_radius # loiter major axis radius in m +float32 loiter_minor_radius # loiter minor axis radius (used for non-circular loiter shapes) in m +bool loiter_direction_counter_clockwise # loiter direction is clockwise by default and can be changed using this field +float32 loiter_orientation # Orientation of the major axis with respect to true north in rad [-pi,pi) +uint8 loiter_pattern # loitern pattern to follow + +float32 acceptance_radius # navigation acceptance_radius if we're doing waypoint navigation + +float32 cruising_speed # the generally desired cruising speed (not a hard constraint) +bool gliding_enabled # commands the vehicle to glide if the capability is available (fixed wing only) +float32 cruising_throttle # the generally desired cruising throttle (not a hard constraint), only has an effect for rover diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionSetpointTriplet.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionSetpointTriplet.msg new file mode 100644 index 00000000..6f9ac4d2 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PositionSetpointTriplet.msg @@ -0,0 +1,8 @@ +# Global position setpoint triplet in WGS84 coordinates. +# This are the three next waypoints (or just the next two or one). + +uint64 timestamp # time since system start (microseconds) + +PositionSetpoint previous +PositionSetpoint current +PositionSetpoint next diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PowerButtonState.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PowerButtonState.msg new file mode 100644 index 00000000..15180666 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PowerButtonState.msg @@ -0,0 +1,10 @@ +# power button state notification message + +uint64 timestamp # time since system start (microseconds) + +uint8 PWR_BUTTON_STATE_IDEL = 0 # Button went up without meeting shutdown button down time (delete event) +uint8 PWR_BUTTON_STATE_DOWN = 1 # Button went Down +uint8 PWR_BUTTON_STATE_UP = 2 # Button went Up +uint8 PWR_BUTTON_STATE_REQUEST_SHUTDOWN = 3 # Button went Up after meeting shutdown button down time + +uint8 event # one of PWR_BUTTON_STATE_* diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PowerMonitor.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PowerMonitor.msg new file mode 100644 index 00000000..a64585fa --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PowerMonitor.msg @@ -0,0 +1,15 @@ +# power monitor message + +uint64 timestamp # Time since system start (microseconds) + +float32 voltage_v # Voltage in volts, 0 if unknown +float32 current_a # Current in amperes, -1 if unknown +float32 power_w # power in watts, -1 if unknown +int16 rconf +int16 rsv +int16 rbv +int16 rp +int16 rc +int16 rcal +int16 me +int16 al diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PpsCapture.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PpsCapture.msg new file mode 100644 index 00000000..c6fa2cb9 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PpsCapture.msg @@ -0,0 +1,3 @@ +uint64 timestamp # time since system start (microseconds) at PPS capture event +uint64 rtc_timestamp # Corrected GPS UTC timestamp at PPS capture event +uint8 pps_rate_exceeded_counter # Increments when PPS dt < 50ms diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PwmInput.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PwmInput.msg new file mode 100644 index 00000000..fcc7dbe4 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/PwmInput.msg @@ -0,0 +1,4 @@ +uint64 timestamp # Time since system start (microseconds) +uint64 error_count # Timer overcapture error flag (AUX5 or MAIN5) +uint32 pulse_width # Pulse width, timer counts +uint32 period # Period, timer counts diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Px4ioStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Px4ioStatus.msg new file mode 100644 index 00000000..295c8fba --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Px4ioStatus.msg @@ -0,0 +1,43 @@ +uint64 timestamp # time since system start (microseconds) + +uint16 free_memory_bytes + +float32 voltage_v # Servo rail voltage in volts +float32 rssi_v # RSSI pin voltage in volts + +# PX4IO status flags (PX4IO_P_STATUS_FLAGS) +bool status_arm_sync +bool status_failsafe +bool status_fmu_initialized +bool status_fmu_ok +bool status_init_ok +bool status_outputs_armed +bool status_raw_pwm +bool status_rc_ok +bool status_rc_dsm +bool status_rc_ppm +bool status_rc_sbus +bool status_rc_st24 +bool status_rc_sumd +bool status_safety_button_event # px4io safety button was pressed for longer than 1 second + +# PX4IO alarms (PX4IO_P_STATUS_ALARMS) +bool alarm_pwm_error +bool alarm_rc_lost + +# PX4IO arming (PX4IO_P_SETUP_ARMING) +bool arming_failsafe_custom +bool arming_fmu_armed +bool arming_fmu_prearmed +bool arming_force_failsafe +bool arming_io_arm_ok +bool arming_lockdown +bool arming_termination_failsafe + +uint16[8] pwm +uint16[8] pwm_disarmed +uint16[8] pwm_failsafe + +uint16[8] pwm_rate_hz + +uint16[18] raw_inputs diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/QshellReq.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/QshellReq.msg new file mode 100644 index 00000000..d472e8dd --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/QshellReq.msg @@ -0,0 +1,5 @@ +uint64 timestamp # time since system start (microseconds) +char[100] cmd +uint32 MAX_STRLEN = 100 +uint32 strlen +uint32 request_sequence diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/QshellRetval.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/QshellRetval.msg new file mode 100644 index 00000000..d42a7715 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/QshellRetval.msg @@ -0,0 +1,3 @@ +uint64 timestamp # time since system start (microseconds) +int32 return_value +uint32 return_sequence diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RadioStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RadioStatus.msg new file mode 100644 index 00000000..c57c82b5 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RadioStatus.msg @@ -0,0 +1,13 @@ + +uint64 timestamp # time since system start (microseconds) + +uint8 rssi # local signal strength +uint8 remote_rssi # remote signal strength + +uint8 txbuf # how full the tx buffer is as a percentage +uint8 noise # background noise level + +uint8 remote_noise # remote background noise level +uint16 rxerrors # receive errors + +uint16 fix # count of error corrected packets diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RateCtrlStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RateCtrlStatus.msg new file mode 100644 index 00000000..3f564469 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RateCtrlStatus.msg @@ -0,0 +1,7 @@ +uint64 timestamp # time since system start (microseconds) + +# rate controller integrator status +float32 rollspeed_integ +float32 pitchspeed_integ +float32 yawspeed_integ +float32 wheel_rate_integ # FW only and optional diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RcChannels.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RcChannels.msg new file mode 100644 index 00000000..546755f6 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RcChannels.msg @@ -0,0 +1,40 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 FUNCTION_THROTTLE = 0 +uint8 FUNCTION_ROLL = 1 +uint8 FUNCTION_PITCH = 2 +uint8 FUNCTION_YAW = 3 +uint8 FUNCTION_RETURN = 4 +uint8 FUNCTION_LOITER = 5 +uint8 FUNCTION_OFFBOARD = 6 +uint8 FUNCTION_FLAPS = 7 +uint8 FUNCTION_AUX_1 = 8 +uint8 FUNCTION_AUX_2 = 9 +uint8 FUNCTION_AUX_3 = 10 +uint8 FUNCTION_AUX_4 = 11 +uint8 FUNCTION_AUX_5 = 12 +uint8 FUNCTION_AUX_6 = 13 +uint8 FUNCTION_PARAM_1 = 14 +uint8 FUNCTION_PARAM_2 = 15 +uint8 FUNCTION_PARAM_3_5 = 16 +uint8 FUNCTION_KILLSWITCH = 17 +uint8 FUNCTION_TRANSITION = 18 +uint8 FUNCTION_GEAR = 19 +uint8 FUNCTION_ARMSWITCH = 20 +uint8 FUNCTION_FLTBTN_SLOT_1 = 21 +uint8 FUNCTION_FLTBTN_SLOT_2 = 22 +uint8 FUNCTION_FLTBTN_SLOT_3 = 23 +uint8 FUNCTION_FLTBTN_SLOT_4 = 24 +uint8 FUNCTION_FLTBTN_SLOT_5 = 25 +uint8 FUNCTION_FLTBTN_SLOT_6 = 26 +uint8 FUNCTION_ENGAGE_MAIN_MOTOR = 27 + +uint8 FUNCTION_FLTBTN_SLOT_COUNT = 6 + +uint64 timestamp_last_valid # Timestamp of last valid RC signal +float32[18] channels # Scaled to -1..1 (throttle: 0..1) +uint8 channel_count # Number of valid channels +int8[28] function # Functions mapping +uint8 rssi # Receive signal strength index +bool signal_lost # Control signal lost, should be checked together with topic timeout +uint32 frame_drop_count # Number of dropped frames diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RcParameterMap.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RcParameterMap.msg new file mode 100644 index 00000000..2a5df3e7 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RcParameterMap.msg @@ -0,0 +1,11 @@ +uint64 timestamp # time since system start (microseconds) +uint8 RC_PARAM_MAP_NCHAN = 3 # This limit is also hardcoded in the enum RC_CHANNELS_FUNCTION in rc_channels.h +uint8 PARAM_ID_LEN = 16 # corresponds to MAVLINK_MSG_PARAM_VALUE_FIELD_PARAM_ID_LEN + +bool[3] valid #true for RC-Param channels which are mapped to a param +int32[3] param_index # corresponding param index, this field is ignored if set to -1, in this case param_id will be used +char[51] param_id # MAP_NCHAN * (ID_LEN + 1) chars, corresponding param id, null terminated +float32[3] scale # scale to map the RC input [-1, 1] to a parameter value +float32[3] value0 # initial value around which the parameter value is changed +float32[3] value_min # minimal parameter value +float32[3] value_max # minimal parameter value diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RegisterExtComponentReply.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RegisterExtComponentReply.msg new file mode 100644 index 00000000..7cd7eef0 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RegisterExtComponentReply.msg @@ -0,0 +1,13 @@ +uint64 timestamp # time since system start (microseconds) + +uint64 request_id # ID from the request +char[25] name # name from the request + +uint16 px4_ros2_api_version + +bool success +int8 arming_check_id # arming check registration ID (-1 if invalid) +int8 mode_id # assigned mode ID (-1 if invalid) +int8 mode_executor_id # assigned mode executor ID (-1 if invalid) + +uint8 ORB_QUEUE_LENGTH = 2 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RegisterExtComponentRequest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RegisterExtComponentRequest.msg new file mode 100644 index 00000000..46ab0cb0 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RegisterExtComponentRequest.msg @@ -0,0 +1,21 @@ +# Request to register an external component +uint64 timestamp # time since system start (microseconds) + +uint64 request_id # ID, set this to a random value +char[25] name # either the requested mode name, or component name + +uint16 LATEST_PX4_ROS2_API_VERSION = 1 # API version compatibility. Increase this on a breaking semantic change. Changes to any message field are detected separately and do not require an API version change. + +uint16 px4_ros2_api_version # Set to LATEST_PX4_ROS2_API_VERSION + +# Components to be registered +bool register_arming_check +bool register_mode # registering a mode also requires arming_check to be set +bool register_mode_executor # registering an executor also requires a mode to be registered (which is the owned mode by the executor) + +bool enable_replace_internal_mode # set to true if an internal mode should be replaced +uint8 replace_internal_mode # vehicle_status::NAVIGATION_STATE_* +bool activate_mode_immediately # switch to the registered mode (can only be set in combination with an executor) + + +uint8 ORB_QUEUE_LENGTH = 2 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RoverAckermannGuidanceStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RoverAckermannGuidanceStatus.msg new file mode 100644 index 00000000..3c34b63c --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RoverAckermannGuidanceStatus.msg @@ -0,0 +1,10 @@ +uint64 timestamp # time since system start (microseconds) + +float32 actual_speed # [m/s] Rover ground speed +float32 desired_speed # [m/s] Rover desired ground speed +float32 lookahead_distance # [m] Lookahead distance of pure the pursuit controller +float32 heading_error # [deg] Heading error of the pure pursuit controller +float32 pid_throttle_integral # [-1, 1] Integral of the PID for the normalized throttle to control the rover speed during missions +float32 crosstrack_error # [m] Shortest distance from the vehicle to the path + +# TOPICS rover_ackermann_guidance_status diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Rpm.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Rpm.msg new file mode 100644 index 00000000..baab7c6a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Rpm.msg @@ -0,0 +1,4 @@ +uint64 timestamp # time since system start (microseconds) + +float32 indicated_frequency_rpm # indicated rotor Frequency in Revolution per minute +float32 estimated_accurancy_rpm # estimated accuracy in Revolution per minute diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RtlStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RtlStatus.msg new file mode 100644 index 00000000..f25b2224 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RtlStatus.msg @@ -0,0 +1,15 @@ +uint64 timestamp # time since system start (microseconds) + +uint32 safe_points_id # unique ID of active set of safe_point_items +bool is_evaluation_pending # flag if the RTL point needs reevaluation (e.g. new safe points available, but need loading). + +bool has_vtol_approach # flag if approaches are defined for current RTL_TYPE parameter setting + +uint8 rtl_type # Type of RTL chosen +uint8 safe_point_index # index of the chosen safe point, if in RTL_STATUS_TYPE_DIRECT_SAFE_POINT mode + +uint8 RTL_STATUS_TYPE_NONE=0 # pending if evaluation can't pe performed currently e.g. when it is still loading the safe points +uint8 RTL_STATUS_TYPE_DIRECT_SAFE_POINT=1 # chosen to directly go to a safe point or home position +uint8 RTL_STATUS_TYPE_DIRECT_MISSION_LAND=2 # going straight to the beginning of the mission landing +uint8 RTL_STATUS_TYPE_FOLLOW_MISSION=3 # Following the mission from start index to mission landing. Start index is current WP if in Mission mode, and closest WP otherwise. +uint8 RTL_STATUS_TYPE_FOLLOW_MISSION_REVERSE=4 # Following the mission in reverse from start index to the beginning of the mission. Start index is previous WP if in Mission mode, and closest WP otherwise. diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RtlTimeEstimate.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RtlTimeEstimate.msg new file mode 100644 index 00000000..ee46888d --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/RtlTimeEstimate.msg @@ -0,0 +1,5 @@ +uint64 timestamp # time since system start (microseconds) + +bool valid # Flag indicating whether the time estiamtes are valid +float32 time_estimate # [s] Estimated time for RTL +float32 safe_time_estimate # [s] Same as time_estimate, but with safety factor and safety margin included (factor*t + margin) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SatelliteInfo.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SatelliteInfo.msg new file mode 100644 index 00000000..2980ffcb --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SatelliteInfo.msg @@ -0,0 +1,10 @@ +uint64 timestamp # time since system start (microseconds) +uint8 SAT_INFO_MAX_SATELLITES = 20 + +uint8 count # Number of satellites visible to the receiver +uint8[20] svid # Space vehicle ID [1..255], see scheme below +uint8[20] used # 0: Satellite not used, 1: used for navigation +uint8[20] elevation # Elevation (0: right on top of receiver, 90: on the horizon) of satellite +uint8[20] azimuth # Direction of satellite, 0: 0 deg, 255: 360 deg. +uint8[20] snr # dBHz, Signal to noise ratio of satellite C/N0, range 0..99, zero when not tracking this satellite. +uint8[20] prn # Satellite PRN code assignment, (psuedorandom number SBAS, valid codes are 120-144) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorAccel.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorAccel.msg new file mode 100644 index 00000000..e47d813a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorAccel.msg @@ -0,0 +1,18 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32 x # acceleration in the FRD board frame X-axis in m/s^2 +float32 y # acceleration in the FRD board frame Y-axis in m/s^2 +float32 z # acceleration in the FRD board frame Z-axis in m/s^2 + +float32 temperature # temperature in degrees Celsius + +uint32 error_count + +uint8[3] clip_counter # clip count per axis in the sample period + +uint8 samples # number of raw samples that went into this message + +uint8 ORB_QUEUE_LENGTH = 8 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorAccelFifo.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorAccelFifo.msg new file mode 100644 index 00000000..1eae5dd1 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorAccelFifo.msg @@ -0,0 +1,13 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32 dt # delta time between samples (microseconds) +float32 scale + +uint8 samples # number of valid samples + +int16[32] x # acceleration in the FRD board frame X-axis in m/s^2 +int16[32] y # acceleration in the FRD board frame Y-axis in m/s^2 +int16[32] z # acceleration in the FRD board frame Z-axis in m/s^2 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorAirflow.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorAirflow.msg new file mode 100644 index 00000000..dd55ad0b --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorAirflow.msg @@ -0,0 +1,5 @@ +uint64 timestamp # time since system start (microseconds) +uint32 device_id # unique device ID for the sensor that does not change between power cycles +float32 speed # the speed being reported by the wind / airflow sensor +float32 direction # the direction bein report by the wind / airflow sensor +uint8 status # Status code from the sensor diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorBaro.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorBaro.msg new file mode 100644 index 00000000..7c4154e1 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorBaro.msg @@ -0,0 +1,12 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32 pressure # static pressure measurement in Pascals + +float32 temperature # temperature in degrees Celsius + +uint32 error_count + +uint8 ORB_QUEUE_LENGTH = 4 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorCombined.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorCombined.msg new file mode 100644 index 00000000..837c7a1f --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorCombined.msg @@ -0,0 +1,25 @@ +# Sensor readings in SI-unit form. +# These fields are scaled and offset-compensated where possible and do not +# change with board revisions and sensor updates. + +uint64 timestamp # time since system start (microseconds) + +int32 RELATIVE_TIMESTAMP_INVALID = 2147483647 # (0x7fffffff) If one of the relative timestamps is set to this value, it means the associated sensor values are invalid + +# gyro timstamp is equal to the timestamp of the message +float32[3] gyro_rad # average angular rate measured in the FRD body frame XYZ-axis in rad/s over the last gyro sampling period +uint32 gyro_integral_dt # gyro measurement sampling period in microseconds + +int32 accelerometer_timestamp_relative # timestamp + accelerometer_timestamp_relative = Accelerometer timestamp +float32[3] accelerometer_m_s2 # average value acceleration measured in the FRD body frame XYZ-axis in m/s^2 over the last accelerometer sampling period +uint32 accelerometer_integral_dt # accelerometer measurement sampling period in microseconds + +uint8 CLIPPING_X = 1 +uint8 CLIPPING_Y = 2 +uint8 CLIPPING_Z = 4 + +uint8 accelerometer_clipping # bitfield indicating if there was any accelerometer clipping (per axis) during the integration time frame +uint8 gyro_clipping # bitfield indicating if there was any gyro clipping (per axis) during the integration time frame + +uint8 accel_calibration_count # Calibration changed counter. Monotonically increases whenever accelermeter calibration changes. +uint8 gyro_calibration_count # Calibration changed counter. Monotonically increases whenever rate gyro calibration changes. diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorCorrection.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorCorrection.msg new file mode 100644 index 00000000..bfbc8e2e --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorCorrection.msg @@ -0,0 +1,41 @@ +# +# Sensor corrections in SI-unit form for the voted sensor +# + +uint64 timestamp # time since system start (microseconds) + +# Corrections for acceleromter acceleration outputs where corrected_accel = raw_accel * accel_scale + accel_offset +# Note the corrections are in the sensor frame and must be applied before the sensor data is rotated into body frame +uint32[4] accel_device_ids +float32[4] accel_temperature +float32[3] accel_offset_0 # accelerometer 0 offsets in the FRD board frame XYZ-axis in m/s^s +float32[3] accel_offset_1 # accelerometer 1 offsets in the FRD board frame XYZ-axis in m/s^s +float32[3] accel_offset_2 # accelerometer 2 offsets in the FRD board frame XYZ-axis in m/s^s +float32[3] accel_offset_3 # accelerometer 3 offsets in the FRD board frame XYZ-axis in m/s^s + +# Corrections for gyro angular rate outputs where corrected_rate = raw_rate * gyro_scale + gyro_offset +# Note the corrections are in the sensor frame and must be applied before the sensor data is rotated into body frame +uint32[4] gyro_device_ids +float32[4] gyro_temperature +float32[3] gyro_offset_0 # gyro 0 XYZ offsets in the sensor frame in rad/s +float32[3] gyro_offset_1 # gyro 1 XYZ offsets in the sensor frame in rad/s +float32[3] gyro_offset_2 # gyro 2 XYZ offsets in the sensor frame in rad/s +float32[3] gyro_offset_3 # gyro 3 XYZ offsets in the sensor frame in rad/s + +# Corrections for magnetometer measurement outputs where corrected_mag = raw_mag * mag_scale + mag_offset +# Note the corrections are in the sensor frame and must be applied before the sensor data is rotated into body frame +uint32[4] mag_device_ids +float32[4] mag_temperature +float32[3] mag_offset_0 # magnetometer 0 offsets in the FRD board frame XYZ-axis in m/s^s +float32[3] mag_offset_1 # magnetometer 1 offsets in the FRD board frame XYZ-axis in m/s^s +float32[3] mag_offset_2 # magnetometer 2 offsets in the FRD board frame XYZ-axis in m/s^s +float32[3] mag_offset_3 # magnetometer 3 offsets in the FRD board frame XYZ-axis in m/s^s + +# Corrections for barometric pressure outputs where corrected_pressure = raw_pressure * pressure_scale + pressure_offset +# Note the corrections are in the sensor frame and must be applied before the sensor data is rotated into body frame +uint32[4] baro_device_ids +float32[4] baro_temperature +float32 baro_offset_0 # barometric pressure 0 offsets in the sensor frame in Pascals +float32 baro_offset_1 # barometric pressure 1 offsets in the sensor frame in Pascals +float32 baro_offset_2 # barometric pressure 2 offsets in the sensor frame in Pascals +float32 baro_offset_3 # barometric pressure 3 offsets in the sensor frame in Pascals diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGnssRelative.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGnssRelative.msg new file mode 100644 index 00000000..6d87a344 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGnssRelative.msg @@ -0,0 +1,30 @@ +# GNSS relative positioning information in NED frame. The NED frame is defined as the local topological system at the reference station. + +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # time since system start (microseconds) + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +uint64 time_utc_usec # Timestamp (microseconds, UTC), this is the timestamp which comes from the gps module. It might be unavailable right after cold start, indicated by a value of 0 + +uint16 reference_station_id # Reference Station ID + +float32[3] position # GPS NED relative position vector (m) +float32[3] position_accuracy # Accuracy of relative position (m) + +float32 heading # Heading of the relative position vector (radians) +float32 heading_accuracy # Accuracy of heading of the relative position vector (radians) + +float32 position_length # Length of the position vector (m) +float32 accuracy_length # Accuracy of the position length (m) + +bool gnss_fix_ok # GNSS valid fix (i.e within DOP & accuracy masks) +bool differential_solution # differential corrections were applied +bool relative_position_valid +bool carrier_solution_floating # carrier phase range solution with floating ambiguities +bool carrier_solution_fixed # carrier phase range solution with fixed ambiguities +bool moving_base_mode # if the receiver is operating in moving base mode +bool reference_position_miss # extrapolated reference position was used to compute moving base solution this epoch +bool reference_observations_miss # extrapolated reference observations were used to compute moving base solution this epoch +bool heading_valid +bool relative_position_normalized # the components of the relative position vector (including the high-precision parts) are normalized diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGps.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGps.msg new file mode 100644 index 00000000..ce2bfad4 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGps.msg @@ -0,0 +1,72 @@ +# GPS position in WGS84 coordinates. +# the field 'timestamp' is for the position & velocity (microseconds) +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float64 latitude_deg # Latitude in degrees, allows centimeter level RTK precision +float64 longitude_deg # Longitude in degrees, allows centimeter level RTK precision +float64 altitude_msl_m # Altitude above MSL, meters +float64 altitude_ellipsoid_m # Altitude above Ellipsoid, meters + +float32 s_variance_m_s # GPS speed accuracy estimate, (metres/sec) +float32 c_variance_rad # GPS course accuracy estimate, (radians) +uint8 FIX_TYPE_NONE = 1 # Value 0 is also valid to represent no fix. +uint8 FIX_TYPE_2D = 2 +uint8 FIX_TYPE_3D = 3 +uint8 FIX_TYPE_RTCM_CODE_DIFFERENTIAL = 4 +uint8 FIX_TYPE_RTK_FLOAT = 5 +uint8 FIX_TYPE_RTK_FIXED = 6 +uint8 FIX_TYPE_EXTRAPOLATED = 8 +uint8 fix_type # Some applications will not use the value of this field unless it is at least two, so always correctly fill in the fix. + +float32 eph # GPS horizontal position accuracy (metres) +float32 epv # GPS vertical position accuracy (metres) + +float32 hdop # Horizontal dilution of precision +float32 vdop # Vertical dilution of precision + +int32 noise_per_ms # GPS noise per millisecond +uint16 automatic_gain_control # Automatic gain control monitor + +uint8 JAMMING_STATE_UNKNOWN = 0 +uint8 JAMMING_STATE_OK = 1 +uint8 JAMMING_STATE_WARNING = 2 +uint8 JAMMING_STATE_CRITICAL = 3 +uint8 jamming_state # indicates whether jamming has been detected or suspected by the receivers. O: Unknown, 1: OK, 2: Warning, 3: Critical +int32 jamming_indicator # indicates jamming is occurring + +uint8 SPOOFING_STATE_UNKNOWN = 0 +uint8 SPOOFING_STATE_NONE = 1 +uint8 SPOOFING_STATE_INDICATED = 2 +uint8 SPOOFING_STATE_MULTIPLE = 3 +uint8 spoofing_state # indicates whether spoofing has been detected or suspected by the receivers. O: Unknown, 1: OK, 2: Warning, 3: Critical + +float32 vel_m_s # GPS ground speed, (metres/sec) +float32 vel_n_m_s # GPS North velocity, (metres/sec) +float32 vel_e_m_s # GPS East velocity, (metres/sec) +float32 vel_d_m_s # GPS Down velocity, (metres/sec) +float32 cog_rad # Course over ground (NOT heading, but direction of movement), -PI..PI, (radians) +bool vel_ned_valid # True if NED velocity is valid + +int32 timestamp_time_relative # timestamp + timestamp_time_relative = Time of the UTC timestamp since system start, (microseconds) +uint64 time_utc_usec # Timestamp (microseconds, UTC), this is the timestamp which comes from the gps module. It might be unavailable right after cold start, indicated by a value of 0 + +uint8 satellites_used # Number of satellites used + +float32 heading # heading angle of XYZ body frame rel to NED. Set to NaN if not available and updated (used for dual antenna GPS), (rad, [-PI, PI]) +float32 heading_offset # heading offset of dual antenna array in body frame. Set to NaN if not applicable. (rad, [-PI, PI]) +float32 heading_accuracy # heading accuracy (rad, [0, 2PI]) + +float32 rtcm_injection_rate # RTCM message injection rate Hz +uint8 selected_rtcm_instance # uorb instance that is being used for RTCM corrections + +bool rtcm_crc_failed # RTCM message CRC failure detected + +uint8 RTCM_MSG_USED_UNKNOWN = 0 +uint8 RTCM_MSG_USED_NOT_USED = 1 +uint8 RTCM_MSG_USED_USED = 2 +uint8 rtcm_msg_used # Indicates if the RTCM message was used successfully by the receiver + +# TOPICS sensor_gps vehicle_gps_position diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGyro.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGyro.msg new file mode 100644 index 00000000..b906127b --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGyro.msg @@ -0,0 +1,18 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32 x # angular velocity in the FRD board frame X-axis in rad/s +float32 y # angular velocity in the FRD board frame Y-axis in rad/s +float32 z # angular velocity in the FRD board frame Z-axis in rad/s + +float32 temperature # temperature in degrees Celsius + +uint32 error_count + +uint8[3] clip_counter # clip count per axis in the sample period + +uint8 samples # number of raw samples that went into this message + +uint8 ORB_QUEUE_LENGTH = 8 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGyroFft.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGyroFft.msg new file mode 100644 index 00000000..ed84d0a0 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGyroFft.msg @@ -0,0 +1,15 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32 sensor_sample_rate_hz +float32 resolution_hz + +float32[3] peak_frequencies_x # x axis peak frequencies +float32[3] peak_frequencies_y # y axis peak frequencies +float32[3] peak_frequencies_z # z axis peak frequencies + +float32[3] peak_snr_x # x axis peak SNR +float32[3] peak_snr_y # y axis peak SNR +float32[3] peak_snr_z # z axis peak SNR diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGyroFifo.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGyroFifo.msg new file mode 100644 index 00000000..2e77ef07 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorGyroFifo.msg @@ -0,0 +1,15 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32 dt # delta time between samples (microseconds) +float32 scale + +uint8 samples # number of valid samples + +int16[32] x # angular velocity in the FRD board frame X-axis in rad/s +int16[32] y # angular velocity in the FRD board frame Y-axis in rad/s +int16[32] z # angular velocity in the FRD board frame Z-axis in rad/s + +uint8 ORB_QUEUE_LENGTH = 4 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorHygrometer.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorHygrometer.msg new file mode 100644 index 00000000..490a7402 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorHygrometer.msg @@ -0,0 +1,8 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32 temperature # Temperature provided by sensor (Celsius) + +float32 humidity # Humidity provided by sensor diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorMag.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorMag.msg new file mode 100644 index 00000000..1b5ba487 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorMag.msg @@ -0,0 +1,14 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32 x # magnetic field in the FRD board frame X-axis in Gauss +float32 y # magnetic field in the FRD board frame Y-axis in Gauss +float32 z # magnetic field in the FRD board frame Z-axis in Gauss + +float32 temperature # temperature in degrees Celsius + +uint32 error_count + +uint8 ORB_QUEUE_LENGTH = 4 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorOpticalFlow.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorOpticalFlow.msg new file mode 100644 index 00000000..ce7e8bf0 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorOpticalFlow.msg @@ -0,0 +1,30 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32[2] pixel_flow # (radians) optical flow in radians where a positive value is produced by a RH rotation about the body axis + +float32[3] delta_angle # (radians) accumulated gyro radians where a positive value is produced by a RH rotation about the body axis. Set to NaN if flow sensor does not have 3-axis gyro data. +bool delta_angle_available + +float32 distance_m # (meters) Distance to the center of the flow field +bool distance_available + +uint32 integration_timespan_us # (microseconds) accumulation timespan in microseconds + +uint8 quality # quality, 0: bad quality, 255: maximum quality + +uint32 error_count + +float32 max_flow_rate # (radians/s) Magnitude of maximum angular which the optical flow sensor can measure reliably + +float32 min_ground_distance # (meters) Minimum distance from ground at which the optical flow sensor operates reliably +float32 max_ground_distance # (meters) Maximum distance from ground at which the optical flow sensor operates reliably + +uint8 MODE_UNKNOWN = 0 +uint8 MODE_BRIGHT = 1 +uint8 MODE_LOWLIGHT = 2 +uint8 MODE_SUPER_LOWLIGHT = 3 + +uint8 mode diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorPreflightMag.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorPreflightMag.msg new file mode 100644 index 00000000..2b5333c4 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorPreflightMag.msg @@ -0,0 +1,7 @@ +# +# Pre-flight sensor check metrics. +# The topic will not be updated when the vehicle is armed +# +uint64 timestamp # time since system start (microseconds) + +float32 mag_inconsistency_angle # maximum angle between magnetometer instance field vectors in radians. diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorSelection.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorSelection.msg new file mode 100644 index 00000000..799ccf18 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorSelection.msg @@ -0,0 +1,7 @@ +# +# Sensor ID's for the voted sensors output on the sensor_combined topic. +# Will be updated on startup of the sensor module and when sensor selection changes +# +uint64 timestamp # time since system start (microseconds) +uint32 accel_device_id # unique device ID for the selected accelerometers +uint32 gyro_device_id # unique device ID for the selected rate gyros diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorUwb.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorUwb.msg new file mode 100644 index 00000000..ae889a8b --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorUwb.msg @@ -0,0 +1,34 @@ +# UWB distance contains the distance information measured by an ultra-wideband positioning system, +# such as Pozyx or NXP Rddrone. + +uint64 timestamp # time since system start (microseconds) + +uint32 sessionid # UWB SessionID +uint32 time_offset # Time between Ranging Rounds in ms +uint32 counter # Number of Ranges since last Start of Ranging +uint16 mac # MAC adress of Initiator (controller) + +uint16 mac_dest # MAC adress of Responder (Controlee) +uint16 status # status feedback # +uint8 nlos # None line of site condition y/n +float32 distance # distance in m to the UWB receiver + + +#Angle of arrival, Angle in Degree -60..+60; FOV in both axis is 120 degrees +float32 aoa_azimuth_dev # Angle of arrival of first incomming RX msg +float32 aoa_elevation_dev # Angle of arrival of first incomming RX msg +float32 aoa_azimuth_resp # Angle of arrival of first incomming RX msg at the responder +float32 aoa_elevation_resp # Angle of arrival of first incomming RX msg at the responder + +# Figure of merit for the angle measurements +uint8 aoa_azimuth_fom # AOA Azimuth FOM +uint8 aoa_elevation_fom # AOA Elevation FOM +uint8 aoa_dest_azimuth_fom # AOA Azimuth FOM +uint8 aoa_dest_elevation_fom # AOA Elevation FOM + +# Initiator physical configuration +uint8 orientation # Direction the sensor faces from MAV_SENSOR_ORIENTATION enum + # Standard configuration is Antennas facing down and azimuth aligened in forward direction +float32 offset_x # UWB initiator offset in X axis (NED drone frame) +float32 offset_y # UWB initiator offset in Y axis (NED drone frame) +float32 offset_z # UWB initiator offset in Z axis (NED drone frame) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorsStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorsStatus.msg new file mode 100644 index 00000000..c16bf1c6 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorsStatus.msg @@ -0,0 +1,15 @@ +# +# Sensor check metrics. This will be zero for a sensor that's primary or unpopulated. +# +uint64 timestamp # time since system start (microseconds) + +uint32 device_id_primary # current primary device id for reference + +uint32[4] device_ids +float32[4] inconsistency # magnitude of difference between sensor instance and mean +bool[4] healthy # sensor healthy +uint8[4] priority +bool[4] enabled +bool[4] external + +# TOPICS sensors_status_baro sensors_status_mag diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorsStatusImu.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorsStatusImu.msg new file mode 100644 index 00000000..cfad3419 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SensorsStatusImu.msg @@ -0,0 +1,18 @@ +# +# Sensor check metrics. This will be zero for a sensor that's primary or unpopulated. +# +uint64 timestamp # time since system start (microseconds) + +uint32 accel_device_id_primary # current primary accel device id for reference + +uint32[4] accel_device_ids +float32[4] accel_inconsistency_m_s_s # magnitude of acceleration difference between IMU instance and mean in m/s^2. +bool[4] accel_healthy +uint8[4] accel_priority + +uint32 gyro_device_id_primary # current primary gyro device id for reference + +uint32[4] gyro_device_ids +float32[4] gyro_inconsistency_rad_s # magnitude of angular rate difference between IMU instance and mean in (rad/s). +bool[4] gyro_healthy +uint8[4] gyro_priority diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SystemPower.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SystemPower.msg new file mode 100644 index 00000000..21b35ba1 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/SystemPower.msg @@ -0,0 +1,21 @@ +uint64 timestamp # time since system start (microseconds) +float32 voltage5v_v # peripheral 5V rail voltage +float32[4] sensors3v3 # Sensors 3V3 rail voltage +uint8 sensors3v3_valid # Sensors 3V3 rail voltage was read (bitfield). +uint8 usb_connected # USB is connected when 1 +uint8 brick_valid # brick bits power is good when bit 1 +uint8 usb_valid # USB is valid when 1 +uint8 servo_valid # servo power is good when 1 +uint8 periph_5v_oc # peripheral overcurrent when 1 +uint8 hipower_5v_oc # high power peripheral overcurrent when 1 +uint8 comp_5v_valid # 5V to companion valid +uint8 can1_gps1_5v_valid # 5V for CAN1/GPS1 valid + +uint8 BRICK1_VALID_SHIFTS=0 +uint8 BRICK1_VALID_MASK=1 +uint8 BRICK2_VALID_SHIFTS=1 +uint8 BRICK2_VALID_MASK=2 +uint8 BRICK3_VALID_SHIFTS=2 +uint8 BRICK3_VALID_MASK=4 +uint8 BRICK4_VALID_SHIFTS=3 +uint8 BRICK4_VALID_MASK=8 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TakeoffStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TakeoffStatus.msg new file mode 100644 index 00000000..4cc49d50 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TakeoffStatus.msg @@ -0,0 +1,14 @@ +# Status of the takeoff state machine currently just available for multicopters + +uint64 timestamp # time since system start (microseconds) + +uint8 TAKEOFF_STATE_UNINITIALIZED = 0 +uint8 TAKEOFF_STATE_DISARMED = 1 +uint8 TAKEOFF_STATE_SPOOLUP = 2 +uint8 TAKEOFF_STATE_READY_FOR_TAKEOFF = 3 +uint8 TAKEOFF_STATE_RAMPUP = 4 +uint8 TAKEOFF_STATE_FLIGHT = 5 + +uint8 takeoff_state + +float32 tilt_limit # limited tilt feasibility during takeoff, contains maximum tilt otherwise diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TaskStackInfo.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TaskStackInfo.msg new file mode 100644 index 00000000..bb69bf1a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TaskStackInfo.msg @@ -0,0 +1,8 @@ +# stack information for a single running process + +uint64 timestamp # time since system start (microseconds) + +uint16 stack_free +char[24] task_name + +uint8 ORB_QUEUE_LENGTH = 2 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TecsStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TecsStatus.msg new file mode 100644 index 00000000..ae6835dc --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TecsStatus.msg @@ -0,0 +1,29 @@ +uint64 timestamp # time since system start (microseconds) + +float32 altitude_sp # Altitude setpoint AMSL [m] +float32 altitude_reference # Altitude setpoint reference AMSL [m] +float32 height_rate_reference # Height rate setpoint reference [m/s] +float32 height_rate_direct # Direct height rate setpoint from velocity reference generator [m/s] +float32 height_rate_setpoint # Height rate setpoint [m/s] +float32 height_rate # Height rate [m/s] +float32 equivalent_airspeed_sp # Equivalent airspeed setpoint [m/s] +float32 true_airspeed_sp # True airspeed setpoint [m/s] +float32 true_airspeed_filtered # True airspeed filtered [m/s] +float32 true_airspeed_derivative_sp # True airspeed derivative setpoint [m/s^2] +float32 true_airspeed_derivative # True airspeed derivative [m/s^2] +float32 true_airspeed_derivative_raw # True airspeed derivative raw [m/s^2] + +float32 total_energy_rate_sp # Total energy rate setpoint [m^2/s^3] +float32 total_energy_rate # Total energy rate estimate [m^2/s^3] + +float32 total_energy_balance_rate_sp # Energy balance rate setpoint [m^2/s^3] +float32 total_energy_balance_rate # Energy balance rate estimate [m^2/s^3] + +float32 throttle_integ # Throttle integrator value [-] +float32 pitch_integ # Pitch integrator value [rad] + +float32 throttle_sp # Current throttle setpoint [-] +float32 pitch_sp_rad # Current pitch setpoint [rad] +float32 throttle_trim # estimated throttle value [0,1] required to fly level at equivalent_airspeed_sp in the current atmospheric conditions + +float32 underspeed_ratio # 0: no underspeed, 1: maximal underspeed. Controller takes measures to avoid stall proportional to ratio if >0. diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TelemetryStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TelemetryStatus.msg new file mode 100644 index 00000000..48d85f93 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TelemetryStatus.msg @@ -0,0 +1,63 @@ +uint8 LINK_TYPE_GENERIC = 0 +uint8 LINK_TYPE_UBIQUITY_BULLET = 1 +uint8 LINK_TYPE_WIRE = 2 +uint8 LINK_TYPE_USB = 3 +uint8 LINK_TYPE_IRIDIUM = 4 + +uint64 timestamp # time since system start (microseconds) + +uint8 type # type of the radio hardware (LINK_TYPE_*) + +uint8 mode + +bool flow_control +bool forwarding +bool mavlink_v2 +bool ftp + +uint8 streams + +float32 data_rate # configured maximum data rate (Bytes/s) + +float32 rate_multiplier + +float32 tx_rate_avg # transmit rate average (Bytes/s) +float32 tx_error_rate_avg # transmit error rate average (Bytes/s) +uint32 tx_message_count # total message sent count +uint32 tx_buffer_overruns # number of TX buffer overruns + +float32 rx_rate_avg # transmit rate average (Bytes/s) +uint32 rx_message_count # count of total messages received +uint32 rx_message_lost_count +uint32 rx_buffer_overruns # number of RX buffer overruns +uint32 rx_parse_errors # number of parse errors +uint32 rx_packet_drop_count # number of packet drops +float32 rx_message_lost_rate + + +uint64 HEARTBEAT_TIMEOUT_US = 2500000 # Heartbeat timeout (tolerate missing 1 + jitter) + +# Heartbeats per type +bool heartbeat_type_antenna_tracker # MAV_TYPE_ANTENNA_TRACKER +bool heartbeat_type_gcs # MAV_TYPE_GCS +bool heartbeat_type_onboard_controller # MAV_TYPE_ONBOARD_CONTROLLER +bool heartbeat_type_gimbal # MAV_TYPE_GIMBAL +bool heartbeat_type_adsb # MAV_TYPE_ADSB +bool heartbeat_type_camera # MAV_TYPE_CAMERA +bool heartbeat_type_parachute # MAV_TYPE_PARACHUTE +bool heartbeat_type_open_drone_id # MAV_TYPE_ODID + +# Heartbeats per component +bool heartbeat_component_telemetry_radio # MAV_COMP_ID_TELEMETRY_RADIO +bool heartbeat_component_log # MAV_COMP_ID_LOG +bool heartbeat_component_osd # MAV_COMP_ID_OSD +bool heartbeat_component_obstacle_avoidance # MAV_COMP_ID_OBSTACLE_AVOIDANCE +bool heartbeat_component_vio # MAV_COMP_ID_VISUAL_INERTIAL_ODOMETRY +bool heartbeat_component_pairing_manager # MAV_COMP_ID_PAIRING_MANAGER +bool heartbeat_component_udp_bridge # MAV_COMP_ID_UDP_BRIDGE +bool heartbeat_component_uart_bridge # MAV_COMP_ID_UART_BRIDGE + +# Misc component health +bool avoidance_system_healthy +bool open_drone_id_system_healthy +bool parachute_system_healthy diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TiltrotorExtraControls.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TiltrotorExtraControls.msg new file mode 100644 index 00000000..20af316c --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TiltrotorExtraControls.msg @@ -0,0 +1,4 @@ +uint64 timestamp # time since system start (microseconds) + +float32 collective_tilt_normalized_setpoint # Collective tilt angle of motors of tiltrotor, 0: vertical, 1: horizontal [0, 1] +float32 collective_thrust_normalized_setpoint # Collective thrust setpoint [0, 1] diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TimesyncStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TimesyncStatus.msg new file mode 100644 index 00000000..71e84e85 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TimesyncStatus.msg @@ -0,0 +1,11 @@ +uint64 timestamp # time since system start (microseconds) + +uint8 SOURCE_PROTOCOL_UNKNOWN = 0 +uint8 SOURCE_PROTOCOL_MAVLINK = 1 +uint8 SOURCE_PROTOCOL_DDS = 2 +uint8 source_protocol # timesync source + +uint64 remote_timestamp # remote system timestamp (microseconds) +int64 observed_offset # raw time offset directly observed from this timesync packet (microseconds) +int64 estimated_offset # smoothed time offset between companion system and PX4 (microseconds) +uint32 round_trip_time # round trip time of this timesync packet (microseconds) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TrajectoryBezier.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TrajectoryBezier.msg new file mode 100644 index 00000000..e3d9d4e0 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TrajectoryBezier.msg @@ -0,0 +1,8 @@ +# Bezier Trajectory description. See also Mavlink TRAJECTORY msg +# The topic trajectory_bezier describe each waypoint defined in vehicle_trajectory_bezier + +uint64 timestamp # time since system start (microseconds) + +float32[3] position # local position x,y,z (metres) +float32 yaw # yaw angle (rad) +float32 delta # time it should take to get to this waypoint, if this is the final waypoint (seconds) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TrajectorySetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TrajectorySetpoint.msg new file mode 100644 index 00000000..4a88c867 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TrajectorySetpoint.msg @@ -0,0 +1,15 @@ +# Trajectory setpoint in NED frame +# Input to PID position controller. +# Needs to be kinematically consistent and feasible for smooth flight. +# setting a value to NaN means the state should not be controlled + +uint64 timestamp # time since system start (microseconds) + +# NED local world frame +float32[3] position # in meters +float32[3] velocity # in meters/second +float32[3] acceleration # in meters/second^2 +float32[3] jerk # in meters/second^3 (for logging only) + +float32 yaw # euler angle of desired attitude in radians -PI..+PI +float32 yawspeed # angular velocity around NED frame z-axis in radians/second diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TrajectoryWaypoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TrajectoryWaypoint.msg new file mode 100644 index 00000000..6ea9bae4 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TrajectoryWaypoint.msg @@ -0,0 +1,13 @@ +# Waypoint Trajectory description. See also Mavlink TRAJECTORY msg +# The topic trajectory_waypoint describe each waypoint defined in vehicle_trajectory_waypoint + +uint64 timestamp # time since system start (microseconds) + +float32[3] position +float32[3] velocity +float32[3] acceleration +float32 yaw +float32 yaw_speed + +bool point_valid +uint8 type diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TransponderReport.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TransponderReport.msg new file mode 100644 index 00000000..d5171cf3 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TransponderReport.msg @@ -0,0 +1,50 @@ +uint64 timestamp # time since system start (microseconds) +uint32 icao_address # ICAO address +float64 lat # Latitude, expressed as degrees +float64 lon # Longitude, expressed as degrees +uint8 altitude_type # Type from ADSB_ALTITUDE_TYPE enum +float32 altitude # Altitude(ASL) in meters +float32 heading # Course over ground in radians, -pi to +pi, 0 is north +float32 hor_velocity # The horizontal velocity in m/s +float32 ver_velocity # The vertical velocity in m/s, positive is up +char[9] callsign # The callsign, 8+null +uint8 emitter_type # Type from ADSB_EMITTER_TYPE enum +uint8 tslc # Time since last communication in seconds +uint16 flags # Flags to indicate various statuses including valid data fields +uint16 squawk # Squawk code +uint8[18] uas_id # Unique UAS ID + +# ADSB flags +uint16 PX4_ADSB_FLAGS_VALID_COORDS = 1 +uint16 PX4_ADSB_FLAGS_VALID_ALTITUDE = 2 +uint16 PX4_ADSB_FLAGS_VALID_HEADING = 4 +uint16 PX4_ADSB_FLAGS_VALID_VELOCITY = 8 +uint16 PX4_ADSB_FLAGS_VALID_CALLSIGN = 16 +uint16 PX4_ADSB_FLAGS_VALID_SQUAWK = 32 +uint16 PX4_ADSB_FLAGS_RETRANSLATE = 256 + +#ADSB Emitter Data: +#from mavlink/v2.0/common/common.h +uint16 ADSB_EMITTER_TYPE_NO_INFO=0 +uint16 ADSB_EMITTER_TYPE_LIGHT=1 +uint16 ADSB_EMITTER_TYPE_SMALL=2 +uint16 ADSB_EMITTER_TYPE_LARGE=3 +uint16 ADSB_EMITTER_TYPE_HIGH_VORTEX_LARGE=4 +uint16 ADSB_EMITTER_TYPE_HEAVY=5 +uint16 ADSB_EMITTER_TYPE_HIGHLY_MANUV=6 +uint16 ADSB_EMITTER_TYPE_ROTOCRAFT=7 +uint16 ADSB_EMITTER_TYPE_UNASSIGNED=8 +uint16 ADSB_EMITTER_TYPE_GLIDER=9 +uint16 ADSB_EMITTER_TYPE_LIGHTER_AIR=10 +uint16 ADSB_EMITTER_TYPE_PARACHUTE=11 +uint16 ADSB_EMITTER_TYPE_ULTRA_LIGHT=12 +uint16 ADSB_EMITTER_TYPE_UNASSIGNED2=13 +uint16 ADSB_EMITTER_TYPE_UAV=14 +uint16 ADSB_EMITTER_TYPE_SPACE=15 +uint16 ADSB_EMITTER_TYPE_UNASSGINED3=16 +uint16 ADSB_EMITTER_TYPE_EMERGENCY_SURFACE=17 +uint16 ADSB_EMITTER_TYPE_SERVICE_SURFACE=18 +uint16 ADSB_EMITTER_TYPE_POINT_OBSTACLE=19 +uint16 ADSB_EMITTER_TYPE_ENUM_END=20 + +uint8 ORB_QUEUE_LENGTH = 16 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TuneControl.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TuneControl.msg new file mode 100644 index 00000000..96d70af1 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/TuneControl.msg @@ -0,0 +1,39 @@ +# This message is used to control the tunes, when the tune_id is set to CUSTOM +# then the frequency, duration are used otherwise those values are ignored. + +uint64 timestamp # time since system start (microseconds) + +uint8 TUNE_ID_STOP = 0 +uint8 TUNE_ID_STARTUP = 1 +uint8 TUNE_ID_ERROR = 2 +uint8 TUNE_ID_NOTIFY_POSITIVE = 3 +uint8 TUNE_ID_NOTIFY_NEUTRAL = 4 +uint8 TUNE_ID_NOTIFY_NEGATIVE = 5 +uint8 TUNE_ID_ARMING_WARNING = 6 +uint8 TUNE_ID_BATTERY_WARNING_SLOW = 7 +uint8 TUNE_ID_BATTERY_WARNING_FAST = 8 +uint8 TUNE_ID_GPS_WARNING = 9 +uint8 TUNE_ID_ARMING_FAILURE = 10 +uint8 TUNE_ID_PARACHUTE_RELEASE = 11 +uint8 TUNE_ID_SINGLE_BEEP = 12 +uint8 TUNE_ID_HOME_SET = 13 +uint8 TUNE_ID_SD_INIT = 14 +uint8 TUNE_ID_SD_ERROR = 15 +uint8 TUNE_ID_PROG_PX4IO = 16 +uint8 TUNE_ID_PROG_PX4IO_OK = 17 +uint8 TUNE_ID_PROG_PX4IO_ERR = 18 +uint8 TUNE_ID_POWER_OFF = 19 +uint8 NUMBER_OF_TUNES = 20 + +uint8 tune_id # tune_id corresponding to TuneID::* from the tune_defaults.h in the tunes library +bool tune_override # if true the tune which is playing will be stopped and the new started +uint16 frequency # in Hz +uint32 duration # in us +uint32 silence # in us +uint8 volume # value between 0-100 if supported by backend + +uint8 VOLUME_LEVEL_MIN = 0 +uint8 VOLUME_LEVEL_DEFAULT = 20 +uint8 VOLUME_LEVEL_MAX = 100 + +uint8 ORB_QUEUE_LENGTH = 4 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UavcanParameterRequest.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UavcanParameterRequest.msg new file mode 100644 index 00000000..3cfec15f --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UavcanParameterRequest.msg @@ -0,0 +1,23 @@ +# UAVCAN-MAVLink parameter bridge request type +uint64 timestamp # time since system start (microseconds) + +uint8 MESSAGE_TYPE_PARAM_REQUEST_READ = 20 # MAVLINK_MSG_ID_PARAM_REQUEST_READ +uint8 MESSAGE_TYPE_PARAM_REQUEST_LIST = 21 # MAVLINK_MSG_ID_PARAM_REQUEST_LIST +uint8 MESSAGE_TYPE_PARAM_SET = 23 # MAVLINK_MSG_ID_PARAM_SET +uint8 message_type # MAVLink message type: PARAM_REQUEST_READ, PARAM_REQUEST_LIST, PARAM_SET + +uint8 NODE_ID_ALL = 0 # MAV_COMP_ID_ALL +uint8 node_id # UAVCAN node ID mapped from MAVLink component ID + +char[17] param_id # MAVLink/UAVCAN parameter name +int16 param_index # -1 if the param_id field should be used as identifier + +uint8 PARAM_TYPE_UINT8 = 1 # MAV_PARAM_TYPE_UINT8 +uint8 PARAM_TYPE_INT64 = 8 # MAV_PARAM_TYPE_INT64 +uint8 PARAM_TYPE_REAL32 = 9 # MAV_PARAM_TYPE_REAL32 +uint8 param_type # MAVLink parameter type + +int64 int_value # current value if param_type is int-like +float32 real_value # current value if param_type is float-like + +uint8 ORB_QUEUE_LENGTH = 4 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UavcanParameterValue.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UavcanParameterValue.msg new file mode 100644 index 00000000..8eff663a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UavcanParameterValue.msg @@ -0,0 +1,9 @@ +# UAVCAN-MAVLink parameter bridge response type +uint64 timestamp # time since system start (microseconds) +uint8 node_id # UAVCAN node ID mapped from MAVLink component ID +char[17] param_id # MAVLink/UAVCAN parameter name +int16 param_index # parameter index, if known +uint16 param_count # number of parameters exposed by the node +uint8 param_type # MAVLink parameter type +int64 int_value # current value if param_type is int-like +float32 real_value # current value if param_type is float-like diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UlogStream.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UlogStream.msg new file mode 100644 index 00000000..d206b4a4 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UlogStream.msg @@ -0,0 +1,19 @@ +# Message to stream ULog data from the logger. Corresponds to the LOGGING_DATA +# mavlink message + +uint64 timestamp # time since system start (microseconds) + +# flags bitmasks +uint8 FLAGS_NEED_ACK = 1 # if set, this message requires to be acked. + # Acked messages are published synchronous: a + # publisher waits for an ack before sending the + # next message + +uint8 length # length of data +uint8 first_message_offset # offset into data where first message starts. This + # can be used for recovery, when a previous message got lost +uint16 msg_sequence # allows determine drops +uint8 flags # see FLAGS_* +uint8[249] data # ulog data + +uint8 ORB_QUEUE_LENGTH = 16 # TODO: we might be able to reduce this if mavlink polled on the topic diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UlogStreamAck.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UlogStreamAck.msg new file mode 100644 index 00000000..e3747fff --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UlogStreamAck.msg @@ -0,0 +1,8 @@ +# Ack a previously sent ulog_stream message that had +# the NEED_ACK flag set + +uint64 timestamp # time since system start (microseconds) +int32 ACK_TIMEOUT = 50 # timeout waiting for an ack until we retry to send the message [ms] +int32 ACK_MAX_TRIES = 50 # maximum amount of tries to (re-)send a message, each time waiting ACK_TIMEOUT ms + +uint16 msg_sequence diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UnregisterExtComponent.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UnregisterExtComponent.msg new file mode 100644 index 00000000..2ad78d4b --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/UnregisterExtComponent.msg @@ -0,0 +1,7 @@ +uint64 timestamp # time since system start (microseconds) + +char[25] name # either the mode name, or component name + +int8 arming_check_id # arming check registration ID (-1 if not registered) +int8 mode_id # assigned mode ID (-1 if not registered) +int8 mode_executor_id # assigned mode executor ID (-1 if not registered) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAcceleration.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAcceleration.msg new file mode 100644 index 00000000..7d555d7f --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAcceleration.msg @@ -0,0 +1,6 @@ + +uint64 timestamp # time since system start (microseconds) + +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +float32[3] xyz # Bias corrected acceleration (including gravity) in the FRD body frame XYZ-axis in m/s^2 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAirData.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAirData.msg new file mode 100644 index 00000000..59ca5e5c --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAirData.msg @@ -0,0 +1,15 @@ + +uint64 timestamp # time since system start (microseconds) + +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +uint32 baro_device_id # unique device ID for the selected barometer + +float32 baro_alt_meter # Altitude above MSL calculated from temperature compensated baro sensor data using an ISA corrected for sea level pressure SENS_BARO_QNH. +float32 baro_temp_celcius # Temperature in degrees Celsius +float32 baro_pressure_pa # Absolute pressure in Pascals + +float32 rho # air density +float32 eas2tas # equivalent airspeed to true airspeed conversion factor + +uint8 calibration_count # Calibration changed counter. Monotonically increases whenever calibration changes. diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAngularAccelerationSetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAngularAccelerationSetpoint.msg new file mode 100644 index 00000000..94da11b8 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAngularAccelerationSetpoint.msg @@ -0,0 +1,5 @@ + +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # timestamp of the data sample on which this message is based (microseconds) + +float32[3] xyz # angular acceleration about X, Y, Z body axis in rad/s^2 diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAngularVelocity.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAngularVelocity.msg new file mode 100644 index 00000000..db3767c0 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAngularVelocity.msg @@ -0,0 +1,9 @@ + +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # timestamp of the data sample on which this message is based (microseconds) + +float32[3] xyz # Bias corrected angular velocity about the FRD body frame XYZ-axis in rad/s + +float32[3] xyz_derivative # angular acceleration about the FRD body frame XYZ-axis in rad/s^2 + +# TOPICS vehicle_angular_velocity vehicle_angular_velocity_groundtruth diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAttitude.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAttitude.msg new file mode 100644 index 00000000..99e6f25c --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAttitude.msg @@ -0,0 +1,13 @@ +# This is similar to the mavlink message ATTITUDE_QUATERNION, but for onboard use +# The quaternion uses the Hamilton convention, and the order is q(w, x, y, z) + +uint64 timestamp # time since system start (microseconds) + +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +float32[4] q # Quaternion rotation from the FRD body frame to the NED earth frame +float32[4] delta_q_reset # Amount by which quaternion has changed during last reset +uint8 quat_reset_counter # Quaternion reset counter + +# TOPICS vehicle_attitude vehicle_attitude_groundtruth external_ins_attitude +# TOPICS estimator_attitude diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAttitudeSetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAttitudeSetpoint.msg new file mode 100644 index 00000000..f52025d2 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleAttitudeSetpoint.msg @@ -0,0 +1,20 @@ +uint64 timestamp # time since system start (microseconds) + +float32 roll_body # body angle in NED frame (can be NaN for FW) +float32 pitch_body # body angle in NED frame (can be NaN for FW) +float32 yaw_body # body angle in NED frame (can be NaN for FW) + +float32 yaw_sp_move_rate # rad/s (commanded by user) + +# For quaternion-based attitude control +float32[4] q_d # Desired quaternion for quaternion control + +# For clarification: For multicopters thrust_body[0] and thrust[1] are usually 0 and thrust[2] is the negative throttle demand. +# For fixed wings thrust_x is the throttle demand and thrust_y, thrust_z will usually be zero. +float32[3] thrust_body # Normalized thrust command in body FRD frame [-1,1] + +bool reset_integral # Reset roll/pitch/yaw integrals (navigation logic change) + +bool fw_control_yaw_wheel # control heading with steering wheel (used for auto takeoff on runway) + +# TOPICS vehicle_attitude_setpoint mc_virtual_attitude_setpoint fw_virtual_attitude_setpoint diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleCommand.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleCommand.msg new file mode 100644 index 00000000..b147bef0 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleCommand.msg @@ -0,0 +1,187 @@ +# Vehicle Command uORB message. Used for commanding a mission / action / etc. +# Follows the MAVLink COMMAND_INT / COMMAND_LONG definition + +uint64 timestamp # time since system start (microseconds) + +uint16 VEHICLE_CMD_CUSTOM_0 = 0 # test command +uint16 VEHICLE_CMD_CUSTOM_1 = 1 # test command +uint16 VEHICLE_CMD_CUSTOM_2 = 2 # test command +uint16 VEHICLE_CMD_NAV_WAYPOINT = 16 # Navigate to MISSION. |Hold time in decimal seconds. (ignored by fixed wing, time to stay at MISSION for rotary wing)| Acceptance radius in meters (if the sphere with this radius is hit, the MISSION counts as reached)| 0 to pass through the WP, if > 0 radius in meters to pass by WP. Positive value for clockwise orbit, negative value for counter-clockwise orbit. Allows trajectory control.| Desired yaw angle at MISSION (rotary wing)| Latitude| Longitude| Altitude| +uint16 VEHICLE_CMD_NAV_LOITER_UNLIM = 17 # Loiter around this MISSION an unlimited amount of time |Empty| Empty| Radius around MISSION, in meters. If positive loiter clockwise, else counter-clockwise| Desired yaw angle.| Latitude| Longitude| Altitude| +uint16 VEHICLE_CMD_NAV_LOITER_TURNS = 18 # Loiter around this MISSION for X turns |Turns| Empty| Radius around MISSION, in meters. If positive loiter clockwise, else counter-clockwise| Desired yaw angle.| Latitude| Longitude| Altitude| +uint16 VEHICLE_CMD_NAV_LOITER_TIME = 19 # Loiter around this MISSION for X seconds |Seconds (decimal)| Empty| Radius around MISSION, in meters. If positive loiter clockwise, else counter-clockwise| Desired yaw angle.| Latitude| Longitude| Altitude| +uint16 VEHICLE_CMD_NAV_RETURN_TO_LAUNCH = 20 # Return to launch location |Empty| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_NAV_LAND = 21 # Land at location |Empty| Empty| Empty| Desired yaw angle.| Latitude| Longitude| Altitude| +uint16 VEHICLE_CMD_NAV_TAKEOFF = 22 # Takeoff from ground / hand |Minimum pitch (if airspeed sensor present), desired pitch without sensor| Empty| Empty| Yaw angle (if magnetometer present), ignored without magnetometer| Latitude| Longitude| Altitude| +uint16 VEHICLE_CMD_NAV_PRECLAND = 23 # Attempt a precision landing +uint16 VEHICLE_CMD_DO_ORBIT = 34 # Start orbiting on the circumference of a circle defined by the parameters. |Radius [m] |Velocity [m/s] |Yaw behaviour |Empty |Latitude/X |Longitude/Y |Altitude/Z | +uint16 VEHICLE_CMD_DO_FIGUREEIGHT = 35 # Start flying on the outline of a figure eight defined by the parameters. |Major Radius [m] |Minor Radius [m] |Velocity [m/s] |Orientation |Latitude/X |Longitude/Y |Altitude/Z | +uint16 VEHICLE_CMD_NAV_ROI = 80 # Sets the region of interest (ROI) for a sensor set or the vehicle itself. This can then be used by the vehicles control system to control the vehicle attitude and the attitude of various sensors such as cameras. |Region of interest mode. (see MAV_ROI enum)| MISSION index/ target ID. (see MAV_ROI enum)| ROI index (allows a vehicle to manage multiple ROI's)| Empty| x the location of the fixed ROI (see MAV_FRAME)| y| z| +uint16 VEHICLE_CMD_NAV_PATHPLANNING = 81 # Control autonomous path planning on the MAV. |0: Disable local obstacle avoidance / local path planning (without resetting map), 1: Enable local path planning, 2: Enable and reset local path planning| 0: Disable full path planning (without resetting map), 1: Enable, 2: Enable and reset map/occupancy grid, 3: Enable and reset planned route, but not occupancy grid| Empty| Yaw angle at goal, in compass degrees, [0..360]| Latitude/X of goal| Longitude/Y of goal| Altitude/Z of goal| +uint16 VEHICLE_CMD_NAV_VTOL_TAKEOFF = 84 # Takeoff from ground / hand and transition to fixed wing |Minimum pitch (if airspeed sensor present), desired pitch without sensor| Empty| Empty| Yaw angle (if magnetometer present), ignored without magnetometer| Latitude| Longitude| Altitude| +uint16 VEHICLE_CMD_NAV_VTOL_LAND = 85 # Transition to MC and land at location |Empty| Empty| Empty| Desired yaw angle.| Latitude| Longitude| Altitude| +uint16 VEHICLE_CMD_NAV_GUIDED_LIMITS = 90 # set limits for external control |timeout - maximum time (in seconds) that external controller will be allowed to control vehicle. 0 means no timeout| absolute altitude min (in meters, AMSL) - if vehicle moves below this alt, the command will be aborted and the mission will continue. 0 means no lower altitude limit| absolute altitude max (in meters)- if vehicle moves above this alt, the command will be aborted and the mission will continue. 0 means no upper altitude limit| horizontal move limit (in meters, AMSL) - if vehicle moves more than this distance from it's location at the moment the command was executed, the command will be aborted and the mission will continue. 0 means no horizontal altitude limit| Empty| Empty| Empty| +uint16 VEHICLE_CMD_NAV_GUIDED_MASTER = 91 # set id of master controller |System ID| Component ID| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_NAV_DELAY = 93 # Delay the next navigation command a number of seconds or until a specified time |Delay in seconds (decimal, -1 to enable time-of-day fields)| hour (24h format, UTC, -1 to ignore)| minute (24h format, UTC, -1 to ignore)| second (24h format, UTC)| Empty| Empty| Empty| +uint16 VEHICLE_CMD_NAV_LAST = 95 # NOP - This command is only used to mark the upper limit of the NAV/ACTION commands in the enumeration |Empty| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_CONDITION_DELAY = 112 # Delay mission state machine. |Delay in seconds (decimal)| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_CONDITION_CHANGE_ALT = 113 # Ascend/descend at rate. Delay mission state machine until desired altitude reached. |Descent / Ascend rate (m/s)| Empty| Empty| Empty| Empty| Empty| Finish Altitude| +uint16 VEHICLE_CMD_CONDITION_DISTANCE = 114 # Delay mission state machine until within desired distance of next NAV point. |Distance (meters)| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_CONDITION_YAW = 115 # Reach a certain target angle. |target angle: [0-360], 0 is north| speed during yaw change:[deg per second]| direction: negative: counter clockwise, positive: clockwise [-1,1]| relative offset or absolute angle: [ 1,0]| Empty| Empty| Empty| +uint16 VEHICLE_CMD_CONDITION_LAST = 159 # NOP - This command is only used to mark the upper limit of the CONDITION commands in the enumeration |Empty| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_CONDITION_GATE = 4501 # Wait until passing a threshold |2D coord mode: 0: Orthogonal to planned route | Altitude mode: 0: Ignore altitude| Empty| Empty| Lat| Lon| Alt| +uint16 VEHICLE_CMD_DO_SET_MODE = 176 # Set system mode. |Mode, as defined by ENUM MAV_MODE| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_JUMP = 177 # Jump to the desired command in the mission list. Repeat this action only the specified number of times |Sequence number| Repeat count| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_CHANGE_SPEED = 178 # Change speed and/or throttle set points. |Speed type (0=Airspeed, 1=Ground Speed)| Speed (m/s, -1 indicates no change)| Throttle ( Percent, -1 indicates no change)| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_SET_HOME = 179 # Changes the home location either to the current location or a specified location. |Use current (1=use current location, 0=use specified location)| Empty| Empty| Empty| Latitude| Longitude| Altitude| +uint16 VEHICLE_CMD_DO_SET_PARAMETER = 180 # Set a system parameter. Caution! Use of this command requires knowledge of the numeric enumeration value of the parameter. |Parameter number| Parameter value| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_SET_RELAY = 181 # Set a relay to a condition. |Relay number| Setting (1=on, 0=off, others possible depending on system hardware)| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_REPEAT_RELAY = 182 # Cycle a relay on and off for a desired number of cycles with a desired period. |Relay number| Cycle count| Cycle time (seconds, decimal)| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_REPEAT_SERVO = 184 # Cycle a between its nominal setting and a desired PWM for a desired number of cycles with a desired period. |Servo number| PWM (microseconds, 1000 to 2000 typical)| Cycle count| Cycle time (seconds)| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_FLIGHTTERMINATION = 185 # Terminate flight immediately |Flight termination activated if > 0.5| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_CHANGE_ALTITUDE = 186 # Set the vehicle to Loiter mode and change the altitude to specified value |Altitude| Frame of new altitude | Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_SET_ACTUATOR = 187 # Sets actuators (e.g. servos) to a desired value. |Actuator 1| Actuator 2| Actuator 3| Actuator 4| Actuator 5| Actuator 6| Index| +uint16 VEHICLE_CMD_DO_LAND_START = 189 # Mission command to perform a landing. This is used as a marker in a mission to tell the autopilot where a sequence of mission items that represents a landing starts. It may also be sent via a COMMAND_LONG to trigger a landing, in which case the nearest (geographically) landing sequence in the mission will be used. The Latitude/Longitude is optional, and may be set to 0/0 if not needed. If specified then it will be used to help find the closest landing sequence. |Empty| Empty| Empty| Empty| Latitude| Longitude| Empty| +uint16 VEHICLE_CMD_DO_GO_AROUND = 191 # Mission command to safely abort an autonomous landing. |Altitude (meters)| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_REPOSITION = 192 # Reposition to specific WGS84 GPS position. |Ground speed [m/s] |Bitmask |Loiter radius [m] for planes |Yaw [deg] |Latitude |Longitude |Altitude | +uint16 VEHICLE_CMD_DO_PAUSE_CONTINUE = 193 +uint16 VEHICLE_CMD_DO_SET_ROI_LOCATION = 195 # Sets the region of interest (ROI) to a location. This can then be used by the vehicles control system to control the vehicle attitude and the attitude of various sensors such as cameras. |Empty| Empty| Empty| Empty| Latitude| Longitude| Altitude| +uint16 VEHICLE_CMD_DO_SET_ROI_WPNEXT_OFFSET = 196 # Sets the region of interest (ROI) to be toward next waypoint, with optional pitch/roll/yaw offset. This can then be used by the vehicles control system to control the vehicle attitude and the attitude of various sensors such as cameras. |Empty| Empty| Empty| Empty| pitch offset from next waypoint| roll offset from next waypoint| yaw offset from next waypoint| +uint16 VEHICLE_CMD_DO_SET_ROI_NONE = 197 # Cancels any previous ROI command returning the vehicle/sensors to default flight characteristics. This can then be used by the vehicles control system to control the vehicle attitude and the attitude of various sensors such as cameras. |Empty| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_CONTROL_VIDEO = 200 # Control onboard camera system. |Camera ID (-1 for all)| Transmission: 0: disabled, 1: enabled compressed, 2: enabled raw| Transmission mode: 0: video stream, >0: single images every n seconds (decimal)| Recording: 0: disabled, 1: enabled compressed, 2: enabled raw| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_SET_ROI = 201 # Sets the region of interest (ROI) for a sensor set or the vehicle itself. This can then be used by the vehicles control system to control the vehicle attitude and the attitude of various sensors such as cameras. |Region of interest mode. (see MAV_ROI enum)| MISSION index/ target ID. (see MAV_ROI enum)| ROI index (allows a vehicle to manage multiple ROI's)| Empty| x the location of the fixed ROI (see MAV_FRAME)| y| z| +uint16 VEHICLE_CMD_DO_DIGICAM_CONTROL=203 +uint16 VEHICLE_CMD_DO_MOUNT_CONFIGURE=204 # Mission command to configure a camera or antenna mount |Mount operation mode (see MAV_MOUNT_MODE enum)| stabilize roll? (1 = yes, 0 = no)| stabilize pitch? (1 = yes, 0 = no)| stabilize yaw? (1 = yes, 0 = no)| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_MOUNT_CONTROL=205 # Mission command to control a camera or antenna mount |pitch or lat in degrees, depending on mount mode.| roll or lon in degrees depending on mount mode| yaw or alt (in meters) depending on mount mode| reserved| reserved| reserved| MAV_MOUNT_MODE enum value| +uint16 VEHICLE_CMD_DO_SET_CAM_TRIGG_DIST=206 # Mission command to set TRIG_DIST for this flight |Camera trigger distance (meters)| Shutter integration time (ms)| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_FENCE_ENABLE=207 # Mission command to enable the geofence |enable? (0=disable, 1=enable)| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_PARACHUTE=208 # Mission command to trigger a parachute |action (0=disable, 1=enable, 2=release, for some systems see PARACHUTE_ACTION enum, not in general message set.)| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_MOTOR_TEST=209 # motor test command |Instance (1, ...)| throttle type| throttle| timeout [s]| Motor count | Test order| Empty| +uint16 VEHICLE_CMD_DO_INVERTED_FLIGHT=210 # Change to/from inverted flight |inverted (0=normal, 1=inverted)| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_GRIPPER = 211 # Command to operate a gripper +uint16 VEHICLE_CMD_DO_SET_CAM_TRIGG_INTERVAL=214 # Mission command to set TRIG_INTERVAL for this flight |Camera trigger distance (meters)| Shutter integration time (ms)| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_MOUNT_CONTROL_QUAT=220 # Mission command to control a camera or antenna mount, using a quaternion as reference. |q1 - quaternion param #1, w (1 in null-rotation)| q2 - quaternion param #2, x (0 in null-rotation)| q3 - quaternion param #3, y (0 in null-rotation)| q4 - quaternion param #4, z (0 in null-rotation)| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_GUIDED_MASTER=221 # set id of master controller |System ID| Component ID| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_GUIDED_LIMITS=222 # set limits for external control |timeout - maximum time (in seconds) that external controller will be allowed to control vehicle. 0 means no timeout| absolute altitude min (in meters, AMSL) - if vehicle moves below this alt, the command will be aborted and the mission will continue. 0 means no lower altitude limit| absolute altitude max (in meters)- if vehicle moves above this alt, the command will be aborted and the mission will continue. 0 means no upper altitude limit| horizontal move limit (in meters, AMSL) - if vehicle moves more than this distance from it's location at the moment the command was executed, the command will be aborted and the mission will continue. 0 means no horizontal altitude limit| Empty| Empty| Empty| +uint16 VEHICLE_CMD_DO_LAST = 240 # NOP - This command is only used to mark the upper limit of the DO commands in the enumeration |Empty| Empty| Empty| Empty| Empty| Empty| Empty| +uint16 VEHICLE_CMD_PREFLIGHT_CALIBRATION = 241 # Trigger calibration. This command will be only accepted if in pre-flight mode. See mavlink spec MAV_CMD_PREFLIGHT_CALIBRATION +uint16 PREFLIGHT_CALIBRATION_TEMPERATURE_CALIBRATION = 3# param value for VEHICLE_CMD_PREFLIGHT_CALIBRATION to start temperature calibration +uint16 VEHICLE_CMD_PREFLIGHT_SET_SENSOR_OFFSETS = 242 # Set sensor offsets. This command will be only accepted if in pre-flight mode. |Sensor to adjust the offsets for: 0: gyros, 1: accelerometer, 2: magnetometer, 3: barometer, 4: optical flow| X axis offset (or generic dimension 1), in the sensor's raw units| Y axis offset (or generic dimension 2), in the sensor's raw units| Z axis offset (or generic dimension 3), in the sensor's raw units| Generic dimension 4, in the sensor's raw units| Generic dimension 5, in the sensor's raw units| Generic dimension 6, in the sensor's raw units| +uint16 VEHICLE_CMD_PREFLIGHT_UAVCAN = 243 # UAVCAN configuration. If param 1 == 1 actuator mapping and direction assignment should be started +uint16 VEHICLE_CMD_PREFLIGHT_STORAGE = 245 # Request storage of different parameter values and logs. This command will be only accepted if in pre-flight mode. |Parameter storage: 0: READ FROM FLASH/EEPROM, 1: WRITE CURRENT TO FLASH/EEPROM| Mission storage: 0: READ FROM FLASH/EEPROM, 1: WRITE CURRENT TO FLASH/EEPROM| Reserved| Reserved| Empty| Empty| Empty| +uint16 VEHICLE_CMD_PREFLIGHT_REBOOT_SHUTDOWN = 246 # Request the reboot or shutdown of system components. |0: Do nothing for autopilot, 1: Reboot autopilot, 2: Shutdown autopilot.| 0: Do nothing for onboard computer, 1: Reboot onboard computer, 2: Shutdown onboard computer.| Reserved| Reserved| Empty| Empty| Empty| +uint16 VEHICLE_CMD_OBLIQUE_SURVEY=260 # Mission command to set a Camera Auto Mount Pivoting Oblique Survey for this flight|Camera trigger distance (meters)| Shutter integration time (ms)| Camera minimum trigger interval| Number of positions| Roll| Pitch| Empty| +uint16 VEHICLE_CMD_DO_SET_STANDARD_MODE=262 # Enable the specified standard MAVLink mode |MAV_STANDARD_MODE| +uint16 VEHICLE_CMD_GIMBAL_DEVICE_INFORMATION = 283 # Command to ask information about a low level gimbal + +uint16 VEHICLE_CMD_MISSION_START = 300 # start running a mission |first_item: the first mission item to run| last_item: the last mission item to run (after this item is run, the mission ends)| +uint16 VEHICLE_CMD_ACTUATOR_TEST = 310 # Actuator testing command|value [-1,1]|timeout [s]|Empty|Empty|output function| +uint16 VEHICLE_CMD_CONFIGURE_ACTUATOR = 311 # Actuator configuration command|configuration|Empty|Empty|Empty|output function| +uint16 VEHICLE_CMD_COMPONENT_ARM_DISARM = 400 # Arms / Disarms a component |1 to arm, 0 to disarm +uint16 VEHICLE_CMD_RUN_PREARM_CHECKS = 401 # Instructs a target system to run pre-arm checks. +uint16 VEHICLE_CMD_INJECT_FAILURE = 420 # Inject artificial failure for testing purposes +uint16 VEHICLE_CMD_START_RX_PAIR = 500 # Starts receiver pairing |0:Spektrum| 0:Spektrum DSM2, 1:Spektrum DSMX| +uint16 VEHICLE_CMD_REQUEST_MESSAGE = 512 # Request to send a single instance of the specified message +uint16 VEHICLE_CMD_SET_CAMERA_MODE = 530 # Set camera capture mode (photo, video, etc.) +uint16 VEHICLE_CMD_SET_CAMERA_ZOOM = 531 # Set camera zoom +uint16 VEHICLE_CMD_SET_CAMERA_FOCUS = 532 +uint16 VEHICLE_CMD_DO_GIMBAL_MANAGER_PITCHYAW = 1000 # Setpoint to be sent to a gimbal manager to set a gimbal pitch and yaw +uint16 VEHICLE_CMD_DO_GIMBAL_MANAGER_CONFIGURE = 1001 # Gimbal configuration to set which sysid/compid is in primary and secondary control +uint16 VEHICLE_CMD_IMAGE_START_CAPTURE = 2000 # Start image capture sequence. +uint16 VEHICLE_CMD_DO_TRIGGER_CONTROL = 2003 # Enable or disable on-board camera triggering system +uint16 VEHICLE_CMD_VIDEO_START_CAPTURE = 2500 # Start a video capture. +uint16 VEHICLE_CMD_VIDEO_STOP_CAPTURE = 2501 # Stop the current video capture. +uint16 VEHICLE_CMD_LOGGING_START = 2510 # start streaming ULog data +uint16 VEHICLE_CMD_LOGGING_STOP = 2511 # stop streaming ULog data +uint16 VEHICLE_CMD_CONTROL_HIGH_LATENCY = 2600 # control starting/stopping transmitting data over the high latency link +uint16 VEHICLE_CMD_DO_VTOL_TRANSITION = 3000 # Command VTOL transition +uint16 VEHICLE_CMD_ARM_AUTHORIZATION_REQUEST = 3001 # Request arm authorization +uint16 VEHICLE_CMD_PAYLOAD_PREPARE_DEPLOY = 30001 # Prepare a payload deployment in the flight plan +uint16 VEHICLE_CMD_PAYLOAD_CONTROL_DEPLOY = 30002 # Control a pre-programmed payload deployment +uint16 VEHICLE_CMD_FIXED_MAG_CAL_YAW = 42006 # Magnetometer calibration based on provided known yaw. This allows for fast calibration using WMM field tables in the vehicle, given only the known yaw of the vehicle. If Latitude and longitude are both zero then use the current vehicle location. +uint16 VEHICLE_CMD_DO_WINCH = 42600 # Command to operate winch. + +uint16 VEHICLE_CMD_EXTERNAL_POSITION_ESTIMATE = 43003 # external reset of estimator global position when deadreckoning + +# PX4 vehicle commands (beyond 16 bit mavlink commands) +uint32 VEHICLE_CMD_PX4_INTERNAL_START = 65537 # start of PX4 internal only vehicle commands (> UINT16_MAX) +uint32 VEHICLE_CMD_SET_GPS_GLOBAL_ORIGIN = 100000 # Sets the GPS coordinates of the vehicle local origin (0,0,0) position. |Empty|Empty|Empty|Empty|Latitude|Longitude|Altitude| +uint32 VEHICLE_CMD_SET_NAV_STATE = 100001 # Change mode by specifying nav_state directly. |nav_state|Empty|Empty|Empty|Empty|Empty|Empty| + +uint8 VEHICLE_MOUNT_MODE_RETRACT = 0 # Load and keep safe position (Roll,Pitch,Yaw) from permanent memory and stop stabilization | +uint8 VEHICLE_MOUNT_MODE_NEUTRAL = 1 # Load and keep neutral position (Roll,Pitch,Yaw) from permanent memory. | +uint8 VEHICLE_MOUNT_MODE_MAVLINK_TARGETING = 2 # Load neutral position and start MAVLink Roll,Pitch,Yaw control with stabilization | +uint8 VEHICLE_MOUNT_MODE_RC_TARGETING = 3 # Load neutral position and start RC Roll,Pitch,Yaw control with stabilization | +uint8 VEHICLE_MOUNT_MODE_GPS_POINT = 4 # Load neutral position and start to point to Lat,Lon,Alt | +uint8 VEHICLE_MOUNT_MODE_ENUM_END = 5 # + +uint8 VEHICLE_ROI_NONE = 0 # No region of interest | +uint8 VEHICLE_ROI_WPNEXT = 1 # Point toward next MISSION | +uint8 VEHICLE_ROI_WPINDEX = 2 # Point toward given MISSION | +uint8 VEHICLE_ROI_LOCATION = 3 # Point toward fixed location | +uint8 VEHICLE_ROI_TARGET = 4 # Point toward target +uint8 VEHICLE_ROI_ENUM_END = 5 + +uint8 PARACHUTE_ACTION_DISABLE = 0 +uint8 PARACHUTE_ACTION_ENABLE = 1 +uint8 PARACHUTE_ACTION_RELEASE = 2 + +uint8 FAILURE_UNIT_SENSOR_GYRO = 0 +uint8 FAILURE_UNIT_SENSOR_ACCEL = 1 +uint8 FAILURE_UNIT_SENSOR_MAG = 2 +uint8 FAILURE_UNIT_SENSOR_BARO = 3 +uint8 FAILURE_UNIT_SENSOR_GPS = 4 +uint8 FAILURE_UNIT_SENSOR_OPTICAL_FLOW = 5 +uint8 FAILURE_UNIT_SENSOR_VIO = 6 +uint8 FAILURE_UNIT_SENSOR_DISTANCE_SENSOR = 7 +uint8 FAILURE_UNIT_SENSOR_AIRSPEED = 8 +uint8 FAILURE_UNIT_SYSTEM_BATTERY = 100 +uint8 FAILURE_UNIT_SYSTEM_MOTOR = 101 +uint8 FAILURE_UNIT_SYSTEM_SERVO = 102 +uint8 FAILURE_UNIT_SYSTEM_AVOIDANCE = 103 +uint8 FAILURE_UNIT_SYSTEM_RC_SIGNAL = 104 +uint8 FAILURE_UNIT_SYSTEM_MAVLINK_SIGNAL = 105 + +uint8 FAILURE_TYPE_OK = 0 +uint8 FAILURE_TYPE_OFF = 1 +uint8 FAILURE_TYPE_STUCK = 2 +uint8 FAILURE_TYPE_GARBAGE = 3 +uint8 FAILURE_TYPE_WRONG = 4 +uint8 FAILURE_TYPE_SLOW = 5 +uint8 FAILURE_TYPE_DELAYED = 6 +uint8 FAILURE_TYPE_INTERMITTENT = 7 + +# used as param1 in DO_CHANGE_SPEED command +uint8 SPEED_TYPE_AIRSPEED = 0 +uint8 SPEED_TYPE_GROUNDSPEED = 1 +uint8 SPEED_TYPE_CLIMB_SPEED = 2 +uint8 SPEED_TYPE_DESCEND_SPEED = 3 + +# used as param1 in ARM_DISARM command +int8 ARMING_ACTION_DISARM = 0 +int8 ARMING_ACTION_ARM = 1 + +# param2 in VEHICLE_CMD_DO_GRIPPER +uint8 GRIPPER_ACTION_RELEASE = 0 +uint8 GRIPPER_ACTION_GRAB = 1 + +uint8 ORB_QUEUE_LENGTH = 8 + +float32 param1 # Parameter 1, as defined by MAVLink uint16 VEHICLE_CMD enum. +float32 param2 # Parameter 2, as defined by MAVLink uint16 VEHICLE_CMD enum. +float32 param3 # Parameter 3, as defined by MAVLink uint16 VEHICLE_CMD enum. +float32 param4 # Parameter 4, as defined by MAVLink uint16 VEHICLE_CMD enum. +float64 param5 # Parameter 5, as defined by MAVLink uint16 VEHICLE_CMD enum. +float64 param6 # Parameter 6, as defined by MAVLink uint16 VEHICLE_CMD enum. +float32 param7 # Parameter 7, as defined by MAVLink uint16 VEHICLE_CMD enum. +uint32 command # Command ID +uint8 target_system # System which should execute the command +uint8 target_component # Component which should execute the command, 0 for all components +uint8 source_system # System sending the command +uint16 source_component # Component / mode executor sending the command +uint8 confirmation # 0: First transmission of this command. 1-255: Confirmation transmissions (e.g. for kill command) +bool from_external + +uint16 COMPONENT_MODE_EXECUTOR_START = 1000 + +# TOPICS vehicle_command gimbal_v1_command vehicle_command_mode_executor diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleCommandAck.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleCommandAck.msg new file mode 100644 index 00000000..6f54fa46 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleCommandAck.msg @@ -0,0 +1,33 @@ +# Vehicle Command Ackonwledgement uORB message. +# Used for acknowledging the vehicle command being received. +# Follows the MAVLink COMMAND_ACK message definition + +uint64 timestamp # time since system start (microseconds) + +# Result cases. This follows the MAVLink MAV_RESULT enum definition +uint8 VEHICLE_CMD_RESULT_ACCEPTED = 0 # Command ACCEPTED and EXECUTED | +uint8 VEHICLE_CMD_RESULT_TEMPORARILY_REJECTED = 1 # Command TEMPORARY REJECTED/DENIED | +uint8 VEHICLE_CMD_RESULT_DENIED = 2 # Command PERMANENTLY DENIED | +uint8 VEHICLE_CMD_RESULT_UNSUPPORTED = 3 # Command UNKNOWN/UNSUPPORTED | +uint8 VEHICLE_CMD_RESULT_FAILED = 4 # Command executed, but failed | +uint8 VEHICLE_CMD_RESULT_IN_PROGRESS = 5 # Command being executed | +uint8 VEHICLE_CMD_RESULT_CANCELLED = 6 # Command Canceled + +# Arming denied specific cases +uint16 ARM_AUTH_DENIED_REASON_GENERIC = 0 +uint16 ARM_AUTH_DENIED_REASON_NONE = 1 +uint16 ARM_AUTH_DENIED_REASON_INVALID_WAYPOINT = 2 +uint16 ARM_AUTH_DENIED_REASON_TIMEOUT = 3 +uint16 ARM_AUTH_DENIED_REASON_AIRSPACE_IN_USE = 4 +uint16 ARM_AUTH_DENIED_REASON_BAD_WEATHER = 5 + +uint8 ORB_QUEUE_LENGTH = 4 + +uint32 command # Command that is being acknowledged +uint8 result # Command result +uint8 result_param1 # Also used as progress[%], it can be set with the reason why the command was denied, or the progress percentage when result is MAV_RESULT_IN_PROGRESS +int32 result_param2 # Additional parameter of the result, example: which parameter of MAV_CMD_NAV_WAYPOINT caused it to be denied. +uint8 target_system +uint16 target_component # Target component / mode executor + +bool from_external # Indicates if the command came from an external source diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleConstraints.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleConstraints.msg new file mode 100644 index 00000000..aa3a491b --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleConstraints.msg @@ -0,0 +1,9 @@ +# Local setpoint constraints in NED frame +# setting something to NaN means that no limit is provided + +uint64 timestamp # time since system start (microseconds) + +float32 speed_up # in meters/sec +float32 speed_down # in meters/sec + +bool want_takeoff # tell the controller to initiate takeoff when idling (ignored during flight) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleControlMode.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleControlMode.msg new file mode 100644 index 00000000..9b33f9b8 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleControlMode.msg @@ -0,0 +1,22 @@ +uint64 timestamp # time since system start (microseconds) +bool flag_armed # synonym for actuator_armed.armed + +bool flag_multicopter_position_control_enabled + +bool flag_control_manual_enabled # true if manual input is mixed in +bool flag_control_auto_enabled # true if onboard autopilot should act +bool flag_control_offboard_enabled # true if offboard control should be used +bool flag_control_position_enabled # true if position is controlled +bool flag_control_velocity_enabled # true if horizontal velocity (implies direction) is controlled +bool flag_control_altitude_enabled # true if altitude is controlled +bool flag_control_climb_rate_enabled # true if climb rate is controlled +bool flag_control_acceleration_enabled # true if acceleration is controlled +bool flag_control_attitude_enabled # true if attitude stabilization is mixed in +bool flag_control_rates_enabled # true if rates are stabilized +bool flag_control_allocation_enabled # true if control allocation is enabled +bool flag_control_termination_enabled # true if flighttermination is enabled + +# TODO: use dedicated topic for external requests +uint8 source_id # Mode ID (nav_state) + +# TOPICS vehicle_control_mode config_control_setpoints diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleGlobalPosition.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleGlobalPosition.msg new file mode 100644 index 00000000..c7d9ee78 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleGlobalPosition.msg @@ -0,0 +1,30 @@ +# Fused global position in WGS84. +# This struct contains global position estimation. It is not the raw GPS +# measurement (@see vehicle_gps_position). This topic is usually published by the position +# estimator, which will take more sources of information into account than just GPS, +# e.g. control inputs of the vehicle in a Kalman-filter implementation. +# + +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +float64 lat # Latitude, (degrees) +float64 lon # Longitude, (degrees) +float32 alt # Altitude AMSL, (meters) +float32 alt_ellipsoid # Altitude above ellipsoid, (meters) + +float32 delta_alt # Reset delta for altitude +uint8 lat_lon_reset_counter # Counter for reset events on horizontal position coordinates +uint8 alt_reset_counter # Counter for reset events on altitude + +float32 eph # Standard deviation of horizontal position error, (metres) +float32 epv # Standard deviation of vertical position error, (metres) + +float32 terrain_alt # Terrain altitude WGS84, (metres) +bool terrain_alt_valid # Terrain altitude estimate is valid + +bool dead_reckoning # True if this position is estimated through dead-reckoning + +# TOPICS vehicle_global_position vehicle_global_position_groundtruth external_ins_global_position +# TOPICS estimator_global_position +# TOPICS aux_global_position diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleImu.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleImu.msg new file mode 100644 index 00000000..a71bb7a0 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleImu.msg @@ -0,0 +1,23 @@ +# IMU readings in SI-unit form. + +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 accel_device_id # Accelerometer unique device ID for the sensor that does not change between power cycles +uint32 gyro_device_id # Gyroscope unique device ID for the sensor that does not change between power cycles + +float32[3] delta_angle # delta angle about the FRD body frame XYZ-axis in rad over the integration time frame (delta_angle_dt) +float32[3] delta_velocity # delta velocity in the FRD body frame XYZ-axis in m/s over the integration time frame (delta_velocity_dt) + +uint16 delta_angle_dt # integration period in microseconds +uint16 delta_velocity_dt # integration period in microseconds + +uint8 CLIPPING_X = 1 +uint8 CLIPPING_Y = 2 +uint8 CLIPPING_Z = 4 + +uint8 delta_angle_clipping # bitfield indicating if there was any gyro clipping (per axis) during the integration time frame +uint8 delta_velocity_clipping # bitfield indicating if there was any accelerometer clipping (per axis) during the integration time frame + +uint8 accel_calibration_count # Calibration changed counter. Monotonically increases whenever accelermeter calibration changes. +uint8 gyro_calibration_count # Calibration changed counter. Monotonically increases whenever rate gyro calibration changes. diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleImuStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleImuStatus.msg new file mode 100644 index 00000000..78fb4470 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleImuStatus.msg @@ -0,0 +1,28 @@ +uint64 timestamp # time since system start (microseconds) + +uint32 accel_device_id # unique device ID for the sensor that does not change between power cycles +uint32 gyro_device_id # unique device ID for the sensor that does not change between power cycles + +uint32[3] accel_clipping # total clipping per axis +uint32[3] gyro_clipping # total clipping per axis + +uint32 accel_error_count +uint32 gyro_error_count + +float32 accel_rate_hz +float32 gyro_rate_hz + +float32 accel_raw_rate_hz # full raw sensor sample rate (Hz) +float32 gyro_raw_rate_hz # full raw sensor sample rate (Hz) + +float32 accel_vibration_metric # high frequency vibration level in the accelerometer data (m/s/s) +float32 gyro_vibration_metric # high frequency vibration level in the gyro data (rad/s) +float32 delta_angle_coning_metric # average IMU delta angle coning correction (rad^2) + +float32[3] mean_accel # average accelerometer readings since last publication +float32[3] mean_gyro # average gyroscope readings since last publication +float32[3] var_accel # accelerometer variance since last publication +float32[3] var_gyro # gyroscope variance since last publication + +float32 temperature_accel +float32 temperature_gyro diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleLandDetected.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleLandDetected.msg new file mode 100644 index 00000000..fc0ca4a6 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleLandDetected.msg @@ -0,0 +1,19 @@ +uint64 timestamp # time since system start (microseconds) + +bool freefall # true if vehicle is currently in free-fall +bool ground_contact # true if vehicle has ground contact but is not landed (1. stage) +bool maybe_landed # true if the vehicle might have landed (2. stage) +bool landed # true if vehicle is currently landed on the ground (3. stage) + +bool in_ground_effect # indicates if from the perspective of the landing detector the vehicle might be in ground effect (baro). This flag will become true if the vehicle is not moving horizontally and is descending (crude assumption that user is landing). +bool in_descend + +bool has_low_throttle + +bool vertical_movement +bool horizontal_movement +bool rotational_movement + +bool close_to_ground_or_skipped_check + +bool at_rest diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleLocalPosition.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleLocalPosition.msg new file mode 100644 index 00000000..c1a0dffe --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleLocalPosition.msg @@ -0,0 +1,79 @@ +# Fused local position in NED. +# The coordinate system origin is the vehicle position at the time when the EKF2-module was started. + +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +bool xy_valid # true if x and y are valid +bool z_valid # true if z is valid +bool v_xy_valid # true if vx and vy are valid +bool v_z_valid # true if vz is valid + +# Position in local NED frame +float32 x # North position in NED earth-fixed frame, (metres) +float32 y # East position in NED earth-fixed frame, (metres) +float32 z # Down position (negative altitude) in NED earth-fixed frame, (metres) + +# Position reset delta +float32[2] delta_xy # Amount of lateral shift of position estimate in latest reset (in x and y) [m] +uint8 xy_reset_counter # Index of latest lateral position estimate reset +float32 delta_z # Amount of vertical shift of position estimate in latest reset [m] +uint8 z_reset_counter # Index of latest vertical position estimate reset + +# Velocity in NED frame +float32 vx # North velocity in NED earth-fixed frame, (metres/sec) +float32 vy # East velocity in NED earth-fixed frame, (metres/sec) +float32 vz # Down velocity in NED earth-fixed frame, (metres/sec) +float32 z_deriv # Down position time derivative in NED earth-fixed frame, (metres/sec) + +# Velocity reset delta +float32[2] delta_vxy # Amount of lateral shift of velocity estimate in latest reset (in x and y) [m/s] +uint8 vxy_reset_counter # Index of latest vertical velocity estimate reset +float32 delta_vz # Amount of vertical shift of velocity estimate in latest reset [m/s] +uint8 vz_reset_counter # Index of latest vertical velocity estimate reset + +# Acceleration in NED frame +float32 ax # North velocity derivative in NED earth-fixed frame, (metres/sec^2) +float32 ay # East velocity derivative in NED earth-fixed frame, (metres/sec^2) +float32 az # Down velocity derivative in NED earth-fixed frame, (metres/sec^2) + +float32 heading # Euler yaw angle transforming the tangent plane relative to NED earth-fixed frame, -PI..+PI, (radians) +float32 heading_var +float32 unaided_heading # Same as heading but generated by integrating corrected gyro data only +float32 delta_heading # Heading delta caused by latest heading reset [rad] +uint8 heading_reset_counter # Index of latest heading reset +bool heading_good_for_control + +float32 tilt_var + +# Position of reference point (local NED frame origin) in global (GPS / WGS84) frame +bool xy_global # true if position (x, y) has a valid global reference (ref_lat, ref_lon) +bool z_global # true if z has a valid global reference (ref_alt) +uint64 ref_timestamp # Time when reference position was set since system start, (microseconds) +float64 ref_lat # Reference point latitude, (degrees) +float64 ref_lon # Reference point longitude, (degrees) +float32 ref_alt # Reference altitude AMSL, (metres) + +# Distance to surface +float32 dist_bottom # Distance from from bottom surface to ground, (metres) +bool dist_bottom_valid # true if distance to bottom surface is valid +uint8 dist_bottom_sensor_bitfield # bitfield indicating what type of sensor is used to estimate dist_bottom +uint8 DIST_BOTTOM_SENSOR_NONE = 0 +uint8 DIST_BOTTOM_SENSOR_RANGE = 1 # (1 << 0) a range sensor is used to estimate dist_bottom field +uint8 DIST_BOTTOM_SENSOR_FLOW = 2 # (1 << 1) a flow sensor is used to estimate dist_bottom field (mostly fixed-wing use case) + +float32 eph # Standard deviation of horizontal position error, (metres) +float32 epv # Standard deviation of vertical position error, (metres) +float32 evh # Standard deviation of horizontal velocity error, (metres/sec) +float32 evv # Standard deviation of vertical velocity error, (metres/sec) + +bool dead_reckoning # True if this position is estimated through dead-reckoning + +# estimator specified vehicle limits +float32 vxy_max # maximum horizontal speed - set to 0 when limiting not required (meters/sec) +float32 vz_max # maximum vertical speed - set to 0 when limiting not required (meters/sec) +float32 hagl_min # minimum height above ground level - set to 0 when limiting not required (meters) +float32 hagl_max # maximum height above ground level - set to 0 when limiting not required (meters) + +# TOPICS vehicle_local_position vehicle_local_position_groundtruth external_ins_local_position +# TOPICS estimator_local_position diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleLocalPositionSetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleLocalPositionSetpoint.msg new file mode 100644 index 00000000..0093d52d --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleLocalPositionSetpoint.msg @@ -0,0 +1,19 @@ +# Local position setpoint in NED frame +# Telemetry of PID position controller to monitor tracking. +# NaN means the state was not controlled + +uint64 timestamp # time since system start (microseconds) + +float32 x # in meters NED +float32 y # in meters NED +float32 z # in meters NED + +float32 vx # in meters/sec +float32 vy # in meters/sec +float32 vz # in meters/sec + +float32[3] acceleration # in meters/sec^2 +float32[3] thrust # normalized thrust vector in NED + +float32 yaw # in radians NED -PI..+PI +float32 yawspeed # in radians/sec diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleMagnetometer.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleMagnetometer.msg new file mode 100644 index 00000000..f2249c78 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleMagnetometer.msg @@ -0,0 +1,10 @@ + +uint64 timestamp # time since system start (microseconds) + +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +uint32 device_id # unique device ID for the selected magnetometer + +float32[3] magnetometer_ga # Magnetic field in the FRD body frame XYZ-axis in Gauss + +uint8 calibration_count # Calibration changed counter. Monotonically increases whenever calibration changes. diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleOdometry.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleOdometry.msg new file mode 100644 index 00000000..fbdd1920 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleOdometry.msg @@ -0,0 +1,31 @@ +# Vehicle odometry data. Fits ROS REP 147 for aerial vehicles +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint8 POSE_FRAME_UNKNOWN = 0 +uint8 POSE_FRAME_NED = 1 # NED earth-fixed frame +uint8 POSE_FRAME_FRD = 2 # FRD world-fixed frame, arbitrary heading reference +uint8 pose_frame # Position and orientation frame of reference + +float32[3] position # Position in meters. Frame of reference defined by local_frame. NaN if invalid/unknown +float32[4] q # Quaternion rotation from FRD body frame to reference frame. First value NaN if invalid/unknown + +uint8 VELOCITY_FRAME_UNKNOWN = 0 +uint8 VELOCITY_FRAME_NED = 1 # NED earth-fixed frame +uint8 VELOCITY_FRAME_FRD = 2 # FRD world-fixed frame, arbitrary heading reference +uint8 VELOCITY_FRAME_BODY_FRD = 3 # FRD body-fixed frame +uint8 velocity_frame # Reference frame of the velocity data + +float32[3] velocity # Velocity in meters/sec. Frame of reference defined by velocity_frame variable. NaN if invalid/unknown + +float32[3] angular_velocity # Angular velocity in body-fixed frame (rad/s). NaN if invalid/unknown + +float32[3] position_variance +float32[3] orientation_variance +float32[3] velocity_variance + +uint8 reset_counter +int8 quality + +# TOPICS vehicle_odometry vehicle_mocap_odometry vehicle_visual_odometry +# TOPICS estimator_odometry diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleOpticalFlow.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleOpticalFlow.msg new file mode 100644 index 00000000..13bdb57b --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleOpticalFlow.msg @@ -0,0 +1,21 @@ +# Optical flow in XYZ body frame in SI units. + +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample + +uint32 device_id # unique device ID for the sensor that does not change between power cycles + +float32[2] pixel_flow # (radians) accumulated optical flow in radians where a positive value is produced by a RH rotation about the body axis + +float32[3] delta_angle # (radians) accumulated gyro radians where a positive value is produced by a RH rotation about the body axis. (NAN if unavailable) + +float32 distance_m # (meters) Distance to the center of the flow field (NAN if unavailable) + +uint32 integration_timespan_us # (microseconds) accumulation timespan in microseconds + +uint8 quality # Average of quality of accumulated frames, 0: bad quality, 255: maximum quality + +float32 max_flow_rate # (radians/s) Magnitude of maximum angular which the optical flow sensor can measure reliably + +float32 min_ground_distance # (meters) Minimum distance from ground at which the optical flow sensor operates reliably +float32 max_ground_distance # (meters) Maximum distance from ground at which the optical flow sensor operates reliably diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleOpticalFlowVel.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleOpticalFlowVel.msg new file mode 100644 index 00000000..947131da --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleOpticalFlowVel.msg @@ -0,0 +1,15 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +float32[2] vel_body # velocity obtained from gyro-compensated and distance-scaled optical flow raw measurements in body frame(m/s) +float32[2] vel_ne # same as vel_body but in local frame (m/s) + +float32[2] flow_rate_uncompensated # integrated optical flow measurement (rad/s) +float32[2] flow_rate_compensated # integrated optical flow measurement compensated for angular motion (rad/s) + +float32[3] gyro_rate # gyro measurement synchronized with flow measurements (rad/s) + +float32[3] gyro_bias +float32[3] ref_gyro + +# TOPICS estimator_optical_flow_vel vehicle_optical_flow_vel diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleRatesSetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleRatesSetpoint.msg new file mode 100644 index 00000000..35a06c35 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleRatesSetpoint.msg @@ -0,0 +1,12 @@ +uint64 timestamp # time since system start (microseconds) + +# body angular rates in FRD frame +float32 roll # [rad/s] roll rate setpoint +float32 pitch # [rad/s] pitch rate setpoint +float32 yaw # [rad/s] yaw rate setpoint + +# For clarification: For multicopters thrust_body[0] and thrust[1] are usually 0 and thrust[2] is the negative throttle demand. +# For fixed wings thrust_x is the throttle demand and thrust_y, thrust_z will usually be zero. +float32[3] thrust_body # Normalized thrust command in body NED frame [-1,1] + +bool reset_integral # Reset roll/pitch/yaw integrals (navigation logic change) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleRoi.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleRoi.msg new file mode 100644 index 00000000..2948f157 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleRoi.msg @@ -0,0 +1,21 @@ +# Vehicle Region Of Interest (ROI) + +uint64 timestamp # time since system start (microseconds) + +uint8 ROI_NONE = 0 # No region of interest +uint8 ROI_WPNEXT = 1 # Point toward next MISSION with optional offset +uint8 ROI_WPINDEX = 2 # Point toward given MISSION +uint8 ROI_LOCATION = 3 # Point toward fixed location +uint8 ROI_TARGET = 4 # Point toward target +uint8 ROI_ENUM_END = 5 + +uint8 mode # ROI mode (see above) + +float64 lat # Latitude to point to +float64 lon # Longitude to point to +float32 alt # Altitude to point to + +# additional angle offsets to next waypoint (only used with ROI_WPNEXT) +float32 roll_offset # angle offset in rad +float32 pitch_offset # angle offset in rad +float32 yaw_offset # angle offset in rad diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleStatus.msg new file mode 100644 index 00000000..4c711b97 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleStatus.msg @@ -0,0 +1,138 @@ +# Encodes the system state of the vehicle published by commander + +uint64 timestamp # time since system start (microseconds) + +uint64 armed_time # Arming timestamp (microseconds) +uint64 takeoff_time # Takeoff timestamp (microseconds) + +uint8 arming_state +uint8 ARMING_STATE_DISARMED = 1 +uint8 ARMING_STATE_ARMED = 2 + +uint8 latest_arming_reason +uint8 latest_disarming_reason +uint8 ARM_DISARM_REASON_TRANSITION_TO_STANDBY = 0 +uint8 ARM_DISARM_REASON_RC_STICK = 1 +uint8 ARM_DISARM_REASON_RC_SWITCH = 2 +uint8 ARM_DISARM_REASON_COMMAND_INTERNAL = 3 +uint8 ARM_DISARM_REASON_COMMAND_EXTERNAL = 4 +uint8 ARM_DISARM_REASON_MISSION_START = 5 +uint8 ARM_DISARM_REASON_SAFETY_BUTTON = 6 +uint8 ARM_DISARM_REASON_AUTO_DISARM_LAND = 7 +uint8 ARM_DISARM_REASON_AUTO_DISARM_PREFLIGHT = 8 +uint8 ARM_DISARM_REASON_KILL_SWITCH = 9 +uint8 ARM_DISARM_REASON_LOCKDOWN = 10 +uint8 ARM_DISARM_REASON_FAILURE_DETECTOR = 11 +uint8 ARM_DISARM_REASON_SHUTDOWN = 12 +uint8 ARM_DISARM_REASON_UNIT_TEST = 13 + +uint64 nav_state_timestamp # time when current nav_state activated + +uint8 nav_state_user_intention # Mode that the user selected (might be different from nav_state in a failsafe situation) + +uint8 nav_state # Currently active mode +uint8 NAVIGATION_STATE_MANUAL = 0 # Manual mode +uint8 NAVIGATION_STATE_ALTCTL = 1 # Altitude control mode +uint8 NAVIGATION_STATE_POSCTL = 2 # Position control mode +uint8 NAVIGATION_STATE_AUTO_MISSION = 3 # Auto mission mode +uint8 NAVIGATION_STATE_AUTO_LOITER = 4 # Auto loiter mode +uint8 NAVIGATION_STATE_AUTO_RTL = 5 # Auto return to launch mode +uint8 NAVIGATION_STATE_POSITION_SLOW = 6 +uint8 NAVIGATION_STATE_FREE5 = 7 +uint8 NAVIGATION_STATE_FREE4 = 8 +uint8 NAVIGATION_STATE_FREE3 = 9 +uint8 NAVIGATION_STATE_ACRO = 10 # Acro mode +uint8 NAVIGATION_STATE_FREE2 = 11 +uint8 NAVIGATION_STATE_DESCEND = 12 # Descend mode (no position control) +uint8 NAVIGATION_STATE_TERMINATION = 13 # Termination mode +uint8 NAVIGATION_STATE_OFFBOARD = 14 +uint8 NAVIGATION_STATE_STAB = 15 # Stabilized mode +uint8 NAVIGATION_STATE_FREE1 = 16 +uint8 NAVIGATION_STATE_AUTO_TAKEOFF = 17 # Takeoff +uint8 NAVIGATION_STATE_AUTO_LAND = 18 # Land +uint8 NAVIGATION_STATE_AUTO_FOLLOW_TARGET = 19 # Auto Follow +uint8 NAVIGATION_STATE_AUTO_PRECLAND = 20 # Precision land with landing target +uint8 NAVIGATION_STATE_ORBIT = 21 # Orbit in a circle +uint8 NAVIGATION_STATE_AUTO_VTOL_TAKEOFF = 22 # Takeoff, transition, establish loiter +uint8 NAVIGATION_STATE_EXTERNAL1 = 23 +uint8 NAVIGATION_STATE_EXTERNAL2 = 24 +uint8 NAVIGATION_STATE_EXTERNAL3 = 25 +uint8 NAVIGATION_STATE_EXTERNAL4 = 26 +uint8 NAVIGATION_STATE_EXTERNAL5 = 27 +uint8 NAVIGATION_STATE_EXTERNAL6 = 28 +uint8 NAVIGATION_STATE_EXTERNAL7 = 29 +uint8 NAVIGATION_STATE_EXTERNAL8 = 30 +uint8 NAVIGATION_STATE_MAX = 31 + +uint8 executor_in_charge # Current mode executor in charge (0=Autopilot) + +uint32 valid_nav_states_mask # Bitmask for all valid nav_state values +uint32 can_set_nav_states_mask # Bitmask for all modes that a user can select + +# Bitmask of detected failures +uint16 failure_detector_status +uint16 FAILURE_NONE = 0 +uint16 FAILURE_ROLL = 1 # (1 << 0) +uint16 FAILURE_PITCH = 2 # (1 << 1) +uint16 FAILURE_ALT = 4 # (1 << 2) +uint16 FAILURE_EXT = 8 # (1 << 3) +uint16 FAILURE_ARM_ESC = 16 # (1 << 4) +uint16 FAILURE_BATTERY = 32 # (1 << 5) +uint16 FAILURE_IMBALANCED_PROP = 64 # (1 << 6) +uint16 FAILURE_MOTOR = 128 # (1 << 7) + +uint8 hil_state +uint8 HIL_STATE_OFF = 0 +uint8 HIL_STATE_ON = 1 + +# If it's a VTOL, then the value will be VEHICLE_TYPE_ROTARY_WING while flying as a multicopter, and VEHICLE_TYPE_FIXED_WING when flying as a fixed-wing +uint8 vehicle_type +uint8 VEHICLE_TYPE_UNKNOWN = 0 +uint8 VEHICLE_TYPE_ROTARY_WING = 1 +uint8 VEHICLE_TYPE_FIXED_WING = 2 +uint8 VEHICLE_TYPE_ROVER = 3 +uint8 VEHICLE_TYPE_AIRSHIP = 4 + +uint8 FAILSAFE_DEFER_STATE_DISABLED = 0 +uint8 FAILSAFE_DEFER_STATE_ENABLED = 1 +uint8 FAILSAFE_DEFER_STATE_WOULD_FAILSAFE = 2 # Failsafes deferred, but would trigger a failsafe + +bool failsafe # true if system is in failsafe state (e.g.:RTL, Hover, Terminate, ...) +bool failsafe_and_user_took_over # true if system is in failsafe state but the user took over control +uint8 failsafe_defer_state # one of FAILSAFE_DEFER_STATE_* + +# Link loss +bool gcs_connection_lost # datalink to GCS lost +uint8 gcs_connection_lost_counter # counts unique GCS connection lost events +bool high_latency_data_link_lost # Set to true if the high latency data link (eg. RockBlock Iridium 9603 telemetry module) is lost + +# VTOL flags +bool is_vtol # True if the system is VTOL capable +bool is_vtol_tailsitter # True if the system performs a 90° pitch down rotation during transition from MC to FW +bool in_transition_mode # True if VTOL is doing a transition +bool in_transition_to_fw # True if VTOL is doing a transition from MC to FW + +# MAVLink identification +uint8 system_type # system type, contains mavlink MAV_TYPE +uint8 system_id # system id, contains MAVLink's system ID field +uint8 component_id # subsystem / component id, contains MAVLink's component ID field + +bool safety_button_available # Set to true if a safety button is connected +bool safety_off # Set to true if safety is off + +bool power_input_valid # set if input power is valid +bool usb_connected # set to true (never cleared) once telemetry received from usb link + +bool open_drone_id_system_present +bool open_drone_id_system_healthy + +bool parachute_system_present +bool parachute_system_healthy + +bool avoidance_system_required # Set to true if avoidance system is enabled via COM_OBS_AVOID parameter +bool avoidance_system_valid # Status of the obstacle avoidance system + +bool rc_calibration_in_progress +bool calibration_enabled + +bool pre_flight_checks_pass # true if all checks necessary to arm pass diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleThrustSetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleThrustSetpoint.msg new file mode 100644 index 00000000..444ee500 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleThrustSetpoint.msg @@ -0,0 +1,8 @@ + +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # timestamp of the data sample on which this message is based (microseconds) + +float32[3] xyz # thrust setpoint along X, Y, Z body axis [-1, 1] + +# TOPICS vehicle_thrust_setpoint +# TOPICS vehicle_thrust_setpoint_virtual_fw vehicle_thrust_setpoint_virtual_mc diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleTorqueSetpoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleTorqueSetpoint.msg new file mode 100644 index 00000000..c20519b1 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleTorqueSetpoint.msg @@ -0,0 +1,8 @@ + +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # timestamp of the data sample on which this message is based (microseconds) + +float32[3] xyz # torque setpoint about X, Y, Z body axis (normalized) + +# TOPICS vehicle_torque_setpoint +# TOPICS vehicle_torque_setpoint_virtual_fw vehicle_torque_setpoint_virtual_mc diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleTrajectoryBezier.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleTrajectoryBezier.msg new file mode 100644 index 00000000..d4bf99b4 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleTrajectoryBezier.msg @@ -0,0 +1,18 @@ +# Vehicle Waypoints Trajectory description. See also MAVLink MAV_TRAJECTORY_REPRESENTATION msg +# The topic vehicle_trajectory_bezier is used to send a smooth flight path from the +# companion computer / avoidance module to the position controller. + +uint64 timestamp # time since system start (microseconds) + +uint8 POINT_0 = 0 +uint8 POINT_1 = 1 +uint8 POINT_2 = 2 +uint8 POINT_3 = 3 +uint8 POINT_4 = 4 + +uint8 NUMBER_POINTS = 5 + +TrajectoryBezier[5] control_points +uint8 bezier_order + +# TOPICS vehicle_trajectory_bezier diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleTrajectoryWaypoint.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleTrajectoryWaypoint.msg new file mode 100644 index 00000000..6bff1cec --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VehicleTrajectoryWaypoint.msg @@ -0,0 +1,21 @@ +# Vehicle Waypoints Trajectory description. See also MAVLink MAV_TRAJECTORY_REPRESENTATION msg +# The topic vehicle_trajectory_waypoint_desired is used to send the user desired waypoints from the position controller to the companion computer / avoidance module. +# The topic vehicle_trajectory_waypoint is used to send the adjusted waypoints from the companion computer / avoidance module to the position controller. + +uint64 timestamp # time since system start (microseconds) + +uint8 MAV_TRAJECTORY_REPRESENTATION_WAYPOINTS = 0 + +uint8 type # Type from MAV_TRAJECTORY_REPRESENTATION enum. + +uint8 POINT_0 = 0 +uint8 POINT_1 = 1 +uint8 POINT_2 = 2 +uint8 POINT_3 = 3 +uint8 POINT_4 = 4 + +uint8 NUMBER_POINTS = 5 + +TrajectoryWaypoint[5] waypoints + +# TOPICS vehicle_trajectory_waypoint vehicle_trajectory_waypoint_desired diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VelocityLimits.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VelocityLimits.msg new file mode 100644 index 00000000..9ab5115a --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VelocityLimits.msg @@ -0,0 +1,8 @@ +# Velocity and yaw rate limits for a multicopter position slow mode only + +uint64 timestamp # time since system start (microseconds) + +# absolute speeds, NAN means use default limit +float32 horizontal_velocity # [m/s] +float32 vertical_velocity # [m/s] +float32 yaw_rate # [rad/s] diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VtolVehicleStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VtolVehicleStatus.msg new file mode 100644 index 00000000..61a82467 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/VtolVehicleStatus.msg @@ -0,0 +1,12 @@ +# VEHICLE_VTOL_STATE, should match 1:1 MAVLinks's MAV_VTOL_STATE +uint8 VEHICLE_VTOL_STATE_UNDEFINED = 0 +uint8 VEHICLE_VTOL_STATE_TRANSITION_TO_FW = 1 +uint8 VEHICLE_VTOL_STATE_TRANSITION_TO_MC = 2 +uint8 VEHICLE_VTOL_STATE_MC = 3 +uint8 VEHICLE_VTOL_STATE_FW = 4 + +uint64 timestamp # time since system start (microseconds) + +uint8 vehicle_vtol_state # current state of the vtol, see VEHICLE_VTOL_STATE + +bool fixed_wing_system_failure # vehicle in fixed-wing system failure failsafe mode (after quad-chute) diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/WheelEncoders.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/WheelEncoders.msg new file mode 100644 index 00000000..a4f3955d --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/WheelEncoders.msg @@ -0,0 +1,5 @@ +uint64 timestamp # time since system start (microseconds) + +# Two wheels: 0 right, 1 left +float32[2] wheel_speed # [rad/s] +float32[2] wheel_angle # [rad] diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Wind.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Wind.msg new file mode 100644 index 00000000..ff8b6f45 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/Wind.msg @@ -0,0 +1,16 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +float32 windspeed_north # Wind component in north / X direction (m/sec) +float32 windspeed_east # Wind component in east / Y direction (m/sec) + +float32 variance_north # Wind estimate error variance in north / X direction (m/sec)**2 - set to zero (no uncertainty) if not estimated +float32 variance_east # Wind estimate error variance in east / Y direction (m/sec)**2 - set to zero (no uncertainty) if not estimated + +float32 tas_innov # True airspeed innovation +float32 tas_innov_var # True airspeed innovation variance + +float32 beta_innov # Sideslip measurement innovation +float32 beta_innov_var # Sideslip measurement innovation variance + +# TOPICS wind estimator_wind diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/YawEstimatorStatus.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/YawEstimatorStatus.msg new file mode 100644 index 00000000..36091e26 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/msg/YawEstimatorStatus.msg @@ -0,0 +1,11 @@ +uint64 timestamp # time since system start (microseconds) +uint64 timestamp_sample # the timestamp of the raw data (microseconds) + +float32 yaw_composite # composite yaw from GSF (rad) +float32 yaw_variance # composite yaw variance from GSF (rad^2) +bool yaw_composite_valid + +float32[5] yaw # yaw estimate for each model in the filter bank (rad) +float32[5] innov_vn # North velocity innovation for each model in the filter bank (m/s) +float32[5] innov_ve # East velocity innovation for each model in the filter bank (m/s) +float32[5] weight # weighting for each model in the filter bank diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/package.xml b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/package.xml new file mode 100644 index 00000000..65291fb6 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/package.xml @@ -0,0 +1,26 @@ + + + + px4_msgs + 2.0.1 + Package with the ROS-equivalent of PX4 uORB msgs + Nuno Marques + Nuno Marques + BSD 3-Clause + + ament_cmake + rosidl_default_generators + + builtin_interfaces + ros_environment + + rosidl_default_runtime + + ament_lint_common + + rosidl_interface_packages + + + ament_cmake + + diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/srv/VehicleCommand.srv b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/srv/VehicleCommand.srv new file mode 100644 index 00000000..134e2a81 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/px4_msgs/srv/VehicleCommand.srv @@ -0,0 +1,3 @@ +VehicleCommand request +--- +VehicleCommandAck reply diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_controller/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_controller/CMakeLists.txt rename to ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_controller/launch/trajectory_controller.xml b/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/launch/trajectory_controller.launch.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_controller/launch/trajectory_controller.xml rename to ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/launch/trajectory_controller.launch.xml diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_controller/launch/trajectory_controller_bag.launch b/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/launch/trajectory_controller_bag.launch similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_controller/launch/trajectory_controller_bag.launch rename to ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/launch/trajectory_controller_bag.launch diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_controller/msg/Trajectory.msg b/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/msg/Trajectory.msg similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_controller/msg/Trajectory.msg rename to ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/msg/Trajectory.msg diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_controller/package.xml b/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_controller/package.xml rename to ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/package.xml diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_controller/src/tracking_point.py b/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/src/tracking_point.py similarity index 100% rename from ros_ws/src/robot/autonomy/controls/trajectory_controller/src/tracking_point.py rename to ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/src/tracking_point.py diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/src/trajectory_controller.cpp b/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/src/trajectory_controller.cpp new file mode 100644 index 00000000..01747788 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/src/trajectory_controller.cpp @@ -0,0 +1,538 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//=================================================================================== +//----------------------------- Trajectory Control Node ----------------------------- +//=================================================================================== + +class TrajectoryControlNode : public rclcpp::Node { + private: + const std::string ROBOT_NAME = + std::getenv("ROBOT_NAME") == NULL ? "" : std::getenv("ROBOT_NAME"); + rclcpp::Subscription::SharedPtr traj_seg_to_add_sub; + rclcpp::Subscription::SharedPtr traj_override_sub; + rclcpp::Subscription::SharedPtr odom_sub; + + rclcpp::Publisher::SharedPtr trajectory_vis_pub; + rclcpp::Publisher::SharedPtr tracking_point_pub; + rclcpp::Publisher::SharedPtr look_ahead_pub; + rclcpp::Publisher::SharedPtr drone_point_pub; + rclcpp::Publisher::SharedPtr virtual_tracking_point_pub; + rclcpp::Publisher::SharedPtr closest_point_pub; + rclcpp::Publisher::SharedPtr trajectory_completion_percentage_pub; + rclcpp::Publisher::SharedPtr trajectory_time_pub; + rclcpp::Publisher::SharedPtr tracking_error_pub; + rclcpp::Publisher::SharedPtr velocity_pub; + rclcpp::Publisher::SharedPtr debug_markers_pub; + + tf2_ros::TransformBroadcaster* tf_broadcaster; + tf2_ros::TransformListener* tf_listener; + tf2_ros::Buffer* tf_buffer; + + rclcpp::Service::SharedPtr traj_mode_srv; + + rclcpp::TimerBase::SharedPtr timer; + + nav_msgs::msg::Odometry odom; + bool got_odom; + + double target_dt; + std::string tf_prefix; + std::string target_frame; + int trajectory_mode; + Trajectory* trajectory; + double prev_time; + double virtual_time; + double actual_time; + airstack_msgs::msg::Odometry look_ahead_point, drone_point; + airstack_msgs::msg::Odometry virtual_tracking_point_odom; + airstack_msgs::msg::Odometry closest_point_odom; + double tracking_point_distance_limit; + double velocity_look_ahead_time; + double look_ahead_time; + double virtual_tracking_ahead_time; + double min_virtual_tracking_velocity; + double sphere_radius; + double ff_min_velocity; + double search_ahead_factor; + double prev_vtp_time; + float traj_vis_thickness; + float current_velocity; + float time_multiplier; + float transition_velocity_scale; + float transition_dt; + bool new_rewind; + float rewind_skip_max_velocity; + float rewind_skip_max_distance; + + vis::MarkerArray markers; + + public: + TrajectoryControlNode(); + void timer_callback(); + + void traj_seg_to_add_callback(const airstack_msgs::msg::TrajectoryXYZVYaw::SharedPtr traj); + void traj_override_callback(const airstack_msgs::msg::TrajectoryXYZVYaw::SharedPtr traj); + void odom_callback(const nav_msgs::msg::Odometry::SharedPtr odom); + + void set_trajectory_mode(const std::shared_ptr req, + std::shared_ptr res); + + std::string mode; + float velocity_target; +}; + +TrajectoryControlNode::TrajectoryControlNode() : rclcpp::Node("trajectory_control_node") { + // init params + target_dt = 1. / airstack::get_param(this, "execute_target", 50.); + tf_prefix = airstack::get_param(this, "tf_prefix", std::string("")); + target_frame = airstack::get_param(this, "target_frame", std::string("world")); + tracking_point_distance_limit = airstack::get_param(this, "tracking_point_distance_limit", 0.5); + velocity_look_ahead_time = airstack::get_param(this, "velocity_look_ahead_time", 0.0); + look_ahead_time = airstack::get_param(this, "look_ahead_time", 1.0); + virtual_tracking_ahead_time = airstack::get_param(this, "virtual_tracking_ahead_time", 0.5); + min_virtual_tracking_velocity = airstack::get_param(this, "min_virtual_tracking_velocity", 0.3); + sphere_radius = airstack::get_param(this, "sphere_radius", 0.3); + ff_min_velocity = airstack::get_param(this, "ff_min_velocity", 0.4); + search_ahead_factor = airstack::get_param(this, "search_ahead_factor", 1.5); + transition_velocity_scale = airstack::get_param(this, "transition_velocity_scale", 1.0); + traj_vis_thickness = airstack::get_param(this, "traj_vis_thickness", 0.03); + rewind_skip_max_velocity = airstack::get_param(this, "rewind_skip_max_velocity", 0.1); + rewind_skip_max_distance = airstack::get_param(this, "rewind_skip_max_distance", 0.1); + got_odom = false; + + trajectory_mode = airstack_msgs::srv::TrajectoryMode::Request::ROBOT_POSE; + trajectory = new Trajectory(this, target_frame); + + // init subscribers + traj_seg_to_add_sub = this->create_subscription( + "trajectory_segment_to_add", 1, + std::bind(&TrajectoryControlNode::traj_seg_to_add_callback, this, std::placeholders::_1)); + traj_override_sub = this->create_subscription( + "trajectory_override", 1, + std::bind(&TrajectoryControlNode::traj_override_callback, this, std::placeholders::_1)); + odom_sub = this->create_subscription( + "odometry", 1, + std::bind(&TrajectoryControlNode::odom_callback, this, std::placeholders::_1)); + + tf_broadcaster = new tf2_ros::TransformBroadcaster(*this); + tf_buffer = new tf2_ros::Buffer(this->get_clock()); + tf_listener = new tf2_ros::TransformListener(*tf_buffer); + + // init publishers + trajectory_vis_pub = + this->create_publisher("trajectory_vis", 1); + tracking_point_pub = this->create_publisher("tracking_point", 1); + look_ahead_pub = this->create_publisher("look_ahead", 1); + drone_point_pub = this->create_publisher("traj_drone_point", 1); + virtual_tracking_point_pub = + this->create_publisher("virtual_tracking_point", 1); + closest_point_pub = this->create_publisher("closest_point", 1); + trajectory_completion_percentage_pub = + this->create_publisher("trajectory_completion_percentage", 1); + trajectory_time_pub = this->create_publisher("trajectory_time", 1); + tracking_error_pub = this->create_publisher("tracking_error", 1); + velocity_pub = + this->create_publisher("tracking_point_velocity_magnitude", 1); + debug_markers_pub = this->create_publisher( + "trajectory_controller_debug_markers", 1); + // broadcaster = new tf::TransformBroadcaster(); + // listener = new tf::TransformListener(); + + // init services + traj_mode_srv = this->create_service( + "set_trajectory_mode", std::bind(&TrajectoryControlNode::set_trajectory_mode, this, + std::placeholders::_1, std::placeholders::_2)); + + // timers + timer = rclcpp::create_timer(this, this->get_clock(), rclcpp::Duration::from_seconds(1. / 20.), + std::bind(&TrajectoryControlNode::timer_callback, this)); + + virtual_time = 0; + actual_time = 0; + prev_time = 0; + virtual_tracking_point_odom.header.frame_id = target_frame; + virtual_tracking_point_odom.child_frame_id = target_frame; + look_ahead_point.header.frame_id = target_frame; + look_ahead_point.child_frame_id = target_frame; + drone_point.header.frame_id = target_frame; + drone_point.child_frame_id = target_frame; + current_velocity = 0.f; + time_multiplier = 1.f; + transition_dt = target_dt; + new_rewind = false; + + // init variables + prev_vtp_time = 0; +} + +void TrajectoryControlNode::timer_callback() { + static rclcpp::Time prev_execute_time = this->get_clock()->now(); + static rclcpp::Time curr_execute_time = this->get_clock()->now(); + curr_execute_time = this->get_clock()->now(); + double execute_elapsed = (curr_execute_time - prev_execute_time).seconds(); + prev_execute_time = curr_execute_time; + + if (got_odom) { + if (time_multiplier > 1.f) time_multiplier = 1.f; + if (std::isnan(time_multiplier) || !std::isfinite(time_multiplier)) { + RCLCPP_INFO_STREAM(this->get_logger(), + "time_multiplier was an invalid value: " << time_multiplier); + time_multiplier = 1.f; + } + + // figure out what duration into the trajectory we are + rclcpp::Time now = this->get_clock()->now(); + tf2::Vector3 robot_point = tflib::to_tf(odom.pose.pose.position); + double tracking_error = + tflib::to_tf(virtual_tracking_point_odom.pose.position).distance(robot_point); + std_msgs::msg::Float32 tracking_error_msg; + tracking_error_msg.data = tracking_error; + tracking_error_pub->publish(tracking_error_msg); + + // visualization + markers.overwrite(); + markers + .add_sphere(target_frame, now- rclcpp::Duration::from_seconds(0.3), robot_point.x(), robot_point.y(), robot_point.z(), + sphere_radius) + .set_color(0.f, 0.f, 1.f, 0.7f); + trajectory_vis_pub->publish( + trajectory->get_markers(now - rclcpp::Duration::from_seconds(0.3), 1, 1, 0, 1, false, false, traj_vis_thickness)); + + // find closest point on entire trajectory + Waypoint closest_wp(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + nav_msgs::msg::Odometry closest_odom; + bool closest_valid = false; // trajectory->get_closest_waypoint(robot_point, 0, + // trajectory->get_duration(), &closest_wp); + if (closest_valid) + closest_valid = trajectory->get_odom(closest_wp.time(), &closest_point_odom, now); + // else + // ROS_INFO("CLOSEST NOT VALID"); + if (closest_valid) closest_point_pub->publish(closest_point_odom); + + double current_virtual_ahead_time = 0.; + + if (trajectory_mode != airstack_msgs::srv::TrajectoryMode::Request::PAUSE) { + if (time_multiplier >= 1.f && + tflib::to_tf(virtual_tracking_point_odom.twist.linear).length() > + min_virtual_tracking_velocity) { + if (new_rewind) RCLCPP_INFO(this->get_logger(), "YO"); + // find closest point within time interval + Waypoint closest_ahead_wp(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + bool closest_ahead_valid = trajectory->get_closest_waypoint( + robot_point, virtual_time, prev_vtp_time + look_ahead_time, &closest_ahead_wp); + if (closest_ahead_valid) { + virtual_time = closest_ahead_wp.time(); + + // visualization + markers + .add_sphere(target_frame, now- rclcpp::Duration::from_seconds(0.3), closest_ahead_wp.x(), closest_ahead_wp.y(), + closest_ahead_wp.z(), 0.025f) + .set_color(0.f, 1.f, 0.f); + + Waypoint vtp_wp(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + Waypoint end_wp(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + bool vtp_valid = trajectory->get_waypoint_sphere_intersection( + virtual_time, search_ahead_factor * sphere_radius, + prev_vtp_time + look_ahead_time, robot_point, sphere_radius, + min_virtual_tracking_velocity, &vtp_wp, &end_wp); + if (vtp_valid) current_virtual_ahead_time = vtp_wp.time() - virtual_time; + + // visualization + if (vtp_valid) + markers + .add_sphere(target_frame, now- rclcpp::Duration::from_seconds(0.3), vtp_wp.x(), vtp_wp.y(), vtp_wp.z(), + 0.025f) + .set_color(0.f, 1.f, 0.f); + else + markers + .add_sphere(target_frame, now- rclcpp::Duration::from_seconds(0.3), closest_ahead_wp.x(), + closest_ahead_wp.y(), closest_ahead_wp.z() + sphere_radius, + 0.025f) + .set_color(1.f, 0.f, 0.f); + markers + .add_sphere(target_frame, now- rclcpp::Duration::from_seconds(0.3), end_wp.x(), end_wp.y(), end_wp.z(), 0.025f) + .set_color(0.f, 0.f, 1.f); + } else + RCLCPP_INFO(this->get_logger(), "AHEAD NOT VALID"); + } else { + if (new_rewind) { + float before = virtual_time; + virtual_time = trajectory->get_skip_ahead_time( + virtual_time, rewind_skip_max_velocity, rewind_skip_max_distance); + RCLCPP_INFO_STREAM(this->get_logger(), + "SKIPPED from " << before << " to " << virtual_time << " (" + << (virtual_time - before) << ")"); + new_rewind = false; + } + virtual_time = std::min(trajectory->get_duration(), + virtual_time + time_multiplier * execute_elapsed); + if (time_multiplier < 1.f) { + time_multiplier += transition_dt; + } + } + } else if (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::PAUSE) { + // don't update virtual_time + } + //*/ + + // get virtual tracking point + Waypoint virtual_wp(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + bool virtual_valid = + trajectory->get_waypoint(virtual_time + current_virtual_ahead_time, &virtual_wp); + if (virtual_valid) { + virtual_valid = + trajectory->get_odom(virtual_wp.time(), &virtual_tracking_point_odom, now); + + // prevent oscillating between slow and normal mode + if (tflib::to_tf(virtual_tracking_point_odom.twist.linear).length() <= + min_virtual_tracking_velocity) + virtual_time += current_virtual_ahead_time; + + float look_ahead_multiplier = 1.f; + if (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::REWIND) + look_ahead_multiplier = -1.f; + trajectory->get_odom(virtual_wp.time() + look_ahead_multiplier * look_ahead_time, + &look_ahead_point, now); + trajectory->get_odom(virtual_wp.time(), &drone_point, now); + actual_time = virtual_wp.time(); + prev_vtp_time = virtual_wp.time(); + } else { + RCLCPP_INFO_STREAM_ONCE(this->get_logger(), + "Virtual waypoint does not correspond to a waypoint along the " + "reference trajectory. If no trajectory is available yet, this is okay."); + } + + if (trajectory->waypoint_count() <= 3) { + virtual_tracking_point_odom.twist.linear.x = 0; + virtual_tracking_point_odom.twist.linear.y = 0; + virtual_tracking_point_odom.twist.linear.z = 0; + } + // if(tflib::to_tf(virtual_tracking_point_odom.twist.linear).length() <= ff_min_velocity){ + if (tflib::to_tf(virtual_tracking_point_odom.twist.linear).length() <= + min_virtual_tracking_velocity) { + virtual_tracking_point_odom.twist.linear.x = 0; + virtual_tracking_point_odom.twist.linear.y = 0; + virtual_tracking_point_odom.twist.linear.z = 0; + virtual_tracking_point_odom.acceleration.x = 0; + virtual_tracking_point_odom.acceleration.y = 0; + virtual_tracking_point_odom.acceleration.z = 0; + virtual_tracking_point_odom.jerk.x = 0; + virtual_tracking_point_odom.jerk.y = 0; + virtual_tracking_point_odom.jerk.z = 0; + } + + if (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::ROBOT_POSE) { + virtual_tracking_point_odom.pose = odom.pose.pose; + virtual_tracking_point_odom.twist.linear.x = 0; + virtual_tracking_point_odom.twist.linear.y = 0; + virtual_tracking_point_odom.twist.linear.z = 0; + virtual_tracking_point_odom.twist.angular.x = 0; + virtual_tracking_point_odom.twist.angular.y = 0; + virtual_tracking_point_odom.twist.angular.z = 0; + virtual_tracking_point_odom.acceleration.x = 0; + virtual_tracking_point_odom.acceleration.y = 0; + virtual_tracking_point_odom.acceleration.z = 0; + virtual_tracking_point_odom.jerk.x = 0; + virtual_tracking_point_odom.jerk.y = 0; + virtual_tracking_point_odom.jerk.z = 0; + look_ahead_point = virtual_tracking_point_odom; + drone_point = look_ahead_point; + } + + virtual_tracking_point_odom.header.stamp = now; + look_ahead_point.header.stamp = now; + drone_point.header.stamp = now; + + if (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::REWIND) { + look_ahead_point.twist.linear.x *= -1.f; + look_ahead_point.twist.linear.y *= -1.f; + look_ahead_point.twist.linear.z *= -1.f; + } + + if (time_multiplier >= -1.f && time_multiplier <= 1.f) { + virtual_tracking_point_odom.twist.linear.x *= time_multiplier; + virtual_tracking_point_odom.twist.linear.y *= time_multiplier; + virtual_tracking_point_odom.twist.linear.z *= time_multiplier; + } + + // When the tracking point reaches the end of the trajectory, the velocity gets set to zero + if (virtual_wp.time() >= trajectory->get_duration() || + trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::PAUSE) { + virtual_tracking_point_odom.twist.linear.x = 0; + virtual_tracking_point_odom.twist.linear.y = 0; + virtual_tracking_point_odom.twist.linear.z = 0; + virtual_tracking_point_odom.twist.angular.x = 0; + virtual_tracking_point_odom.twist.angular.y = 0; + virtual_tracking_point_odom.twist.angular.z = 0; + virtual_tracking_point_odom.acceleration.x = 0; + virtual_tracking_point_odom.acceleration.y = 0; + virtual_tracking_point_odom.acceleration.z = 0; + virtual_tracking_point_odom.jerk.x = 0; + virtual_tracking_point_odom.jerk.y = 0; + virtual_tracking_point_odom.jerk.z = 0; + + look_ahead_point.twist.linear.x = 0; + look_ahead_point.twist.linear.y = 0; + look_ahead_point.twist.linear.z = 0; + look_ahead_point.twist.angular.x = 0; + look_ahead_point.twist.angular.y = 0; + look_ahead_point.twist.angular.z = 0; + look_ahead_point.acceleration.x = 0; + look_ahead_point.acceleration.y = 0; + look_ahead_point.acceleration.z = 0; + look_ahead_point.jerk.x = 0; + look_ahead_point.jerk.y = 0; + look_ahead_point.jerk.z = 0; + drone_point = look_ahead_point; + } + + std_msgs::msg::Float32 velocity_msg; + velocity_msg.data = sqrt(virtual_tracking_point_odom.twist.linear.x * + virtual_tracking_point_odom.twist.linear.x + + virtual_tracking_point_odom.twist.linear.y * + virtual_tracking_point_odom.twist.linear.y + + virtual_tracking_point_odom.twist.linear.z * + virtual_tracking_point_odom.twist.linear.z); + if (time_multiplier >= 1.f) current_velocity = velocity_msg.data; + velocity_pub->publish(velocity_msg); + tracking_point_pub->publish(virtual_tracking_point_odom); + look_ahead_pub->publish(look_ahead_point); + drone_point_pub->publish(drone_point); + + // create a tf for the tracking point odom + tf2::Stamped vtp_tf = tflib::to_tf(virtual_tracking_point_odom); + geometry_msgs::msg::TransformStamped transform = tf2::toMsg(vtp_tf); + transform.child_frame_id = tf_prefix + "tracking_point"; + geometry_msgs::msg::TransformStamped transform_stabilized = + tf2::toMsg(tflib::get_stabilized(vtp_tf)); + transform_stabilized.child_frame_id = tf_prefix + "tracking_point_stabilized"; + tf_broadcaster->sendTransform(transform); + tf_broadcaster->sendTransform(transform_stabilized); + + // create a tf for the look ahead odom + tf2::Stamped la_tf = tflib::to_tf(look_ahead_point); + geometry_msgs::msg::TransformStamped look_ahead_transform = tf2::toMsg(la_tf); + look_ahead_transform.child_frame_id = tf_prefix + "look_ahead_point"; + geometry_msgs::msg::TransformStamped look_ahead_transform_stabilized = + tf2::toMsg(tflib::get_stabilized(la_tf)); + look_ahead_transform_stabilized.child_frame_id = tf_prefix + "look_ahead_point_stabilized"; + + tf_broadcaster->sendTransform(look_ahead_transform); + tf_broadcaster->sendTransform(look_ahead_transform_stabilized); + + // publish completion percentage + std_msgs::msg::Float32 trajectory_completion_percentage; + trajectory_completion_percentage.data = virtual_time / trajectory->get_duration() * 100.f; + trajectory_completion_percentage_pub->publish(trajectory_completion_percentage); + + // publish current trajectory time + std_msgs::msg::Float32 trajectory_time; + trajectory_time.data = + (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::REWIND) + ? trajectory->get_duration() - virtual_time + : virtual_time; + trajectory_time_pub->publish(trajectory_time); + + // publish visualization + debug_markers_pub->publish(markers.get_marker_array()); + } + + new_rewind = false; +} + +void TrajectoryControlNode::set_trajectory_mode( + const std::shared_ptr req, + std::shared_ptr res) { + int prev_trajectory_mode = trajectory_mode; + trajectory_mode = req->mode; + + if (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::PAUSE) { + time_multiplier = 0.f; + } + if (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::ROBOT_POSE) { + trajectory->clear(); + } else if (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::TRACK) { + trajectory->clear(); + } else if (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::SEGMENT) { + if (prev_trajectory_mode != airstack_msgs::srv::TrajectoryMode::Request::PAUSE && + prev_trajectory_mode != airstack_msgs::srv::TrajectoryMode::Request::REWIND && + prev_trajectory_mode != airstack_msgs::srv::TrajectoryMode::Request::SEGMENT) { + trajectory->clear(); + virtual_time = 0; + actual_time = 0; + } + if (prev_trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::REWIND) { + virtual_time = trajectory->get_duration() - actual_time; + actual_time = virtual_time; + prev_vtp_time = virtual_time; + *trajectory = trajectory->get_reversed_trajectory(); + + time_multiplier *= -1.f; + if (current_velocity != 0.f) + transition_dt = transition_velocity_scale / current_velocity * target_dt; + else + transition_dt = transition_velocity_scale / 0.1f * target_dt; + } + } else if (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::REWIND) { + if (prev_trajectory_mode != airstack_msgs::srv::TrajectoryMode::Request::REWIND) { + virtual_time = trajectory->get_duration() - actual_time; + actual_time = virtual_time; + prev_vtp_time = virtual_time; + *trajectory = trajectory->get_reversed_trajectory(); + new_rewind = true; + + time_multiplier *= -1.f; + if (current_velocity != 0.f) + transition_dt = transition_velocity_scale / current_velocity * target_dt; + else + transition_dt = transition_velocity_scale / 0.1f * target_dt; + } + } + + res->success = true; +} + +void TrajectoryControlNode::traj_seg_to_add_callback( + const airstack_msgs::msg::TrajectoryXYZVYaw::SharedPtr traj) { + if (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::SEGMENT) + trajectory->merge(Trajectory(this, *traj), virtual_time); +} + +void TrajectoryControlNode::traj_override_callback( + const airstack_msgs::msg::TrajectoryXYZVYaw::SharedPtr traj) { + virtual_time = 0; + trajectory->clear(); + trajectory->merge(Trajectory(this, *traj)); +} + +void TrajectoryControlNode::odom_callback(const nav_msgs::msg::Odometry::SharedPtr odom) { + // this->odom = odom; + // An odometry's child frame is the frame of the robot, and the Twist (velocities) are put in that frame. + // This line converts the odometry's position AND velocities to the target frame, typically "world" or "map". + if (tflib::transform_odometry(tf_buffer, *odom, target_frame, target_frame, &(this->odom))){ + got_odom = true; + } + else { + RCLCPP_INFO_STREAM(this->get_logger(), "Failed to transform odometry to target frame " << target_frame); + } +} + +int main(int argc, char** argv) { + rclcpp::init(argc, argv); + rclcpp::spin(std::make_shared()); + rclcpp::shutdown(); + return 0; +} diff --git a/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/srv/TrajectoryMode.srv b/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/srv/TrajectoryMode.srv new file mode 100644 index 00000000..c67d38fb --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/c_controls/trajectory_controller/srv/TrajectoryMode.srv @@ -0,0 +1,9 @@ +int32 PAUSE=0 +int32 ROBOT_POSE=1 +int32 TRACK=2 +int32 SEGMENT=3 +int32 REWIND=4 + +int32 mode +--- +bool success \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/3_local/local_bringup/CMakeLists.txt b/ros_ws/src/robot/autonomy/3_local/local_bringup/CMakeLists.txt new file mode 100644 index 00000000..8e1d0c32 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/local_bringup/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.8) +project(local_bringup) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +# uncomment the following section in order to fill in +# further dependencies manually. +# find_package( REQUIRED) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +# Install files. +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY rviz DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY params DESTINATION share/${PROJECT_NAME}) + +ament_package() diff --git a/ros_ws/src/robot/autonomy/3_local/local_bringup/LICENSE b/ros_ws/src/robot/autonomy/3_local/local_bringup/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/local_bringup/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ros_ws/src/robot/autonomy/3_local/local_bringup/launch/local.launch.xml b/ros_ws/src/robot/autonomy/3_local/local_bringup/launch/local.launch.xml new file mode 100644 index 00000000..59b12da9 --- /dev/null +++ b/ros_ws/src/robot/autonomy/3_local/local_bringup/launch/local.launch.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/planning/global/central/package.xml b/ros_ws/src/robot/autonomy/3_local/local_bringup/package.xml similarity index 78% rename from ros_ws/src/robot/autonomy/planning/global/central/package.xml rename to ros_ws/src/robot/autonomy/3_local/local_bringup/package.xml index bc7c64bc..4075599f 100644 --- a/ros_ws/src/robot/autonomy/planning/global/central/package.xml +++ b/ros_ws/src/robot/autonomy/3_local/local_bringup/package.xml @@ -1,11 +1,11 @@ - central + local_bringup 0.0.0 TODO: Package description - uav - TODO: License declaration + andrew + Apache-2.0 ament_cmake diff --git a/ros_ws/src/robot/autonomy/world_model/mapping/vdb_mapping b/ros_ws/src/robot/autonomy/4_global/a_world_models/vdb_mapping similarity index 100% rename from ros_ws/src/robot/autonomy/world_model/mapping/vdb_mapping rename to ros_ws/src/robot/autonomy/4_global/a_world_models/vdb_mapping diff --git a/ros_ws/src/robot/autonomy/world_model/mapping/vdb_mapping_ros2 b/ros_ws/src/robot/autonomy/4_global/a_world_models/vdb_mapping_ros2 similarity index 100% rename from ros_ws/src/robot/autonomy/world_model/mapping/vdb_mapping_ros2 rename to ros_ws/src/robot/autonomy/4_global/a_world_models/vdb_mapping_ros2 diff --git a/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/CMakeLists.txt b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/CMakeLists.txt new file mode 100644 index 00000000..6cb27eed --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/CMakeLists.txt @@ -0,0 +1,74 @@ +cmake_minimum_required(VERSION 3.5) +project(random_walk_planner) + +# Default to C++14 +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17) +endif() + +# Find dependencies +find_package(ament_cmake REQUIRED) +find_package(rclcpp REQUIRED) +find_package(std_msgs REQUIRED) +find_package(geometry_msgs REQUIRED) +find_package(nav_msgs REQUIRED) +find_package(visualization_msgs REQUIRED) +find_package(tf2 REQUIRED) +find_package(tf2_ros REQUIRED) +find_package(airstack_msgs REQUIRED) + +################################### +## ament specific configuration ## +################################### + +ament_package() + +########### +## Build ## +########### + +# Specify additional locations of header files + +# Declare a C++ executable +add_executable(random_walk_planner src/random_walk_node.cpp src/random_walk_logic.cpp) + +# Link libraries +ament_target_dependencies(random_walk_planner + rclcpp + std_msgs + geometry_msgs + nav_msgs + visualization_msgs + tf2 + tf2_ros + airstack_msgs +) + +# Install executable +install(TARGETS + random_walk_planner + DESTINATION lib/${PROJECT_NAME} +) + +install(DIRECTORY + launch + DESTINATION share/${PROJECT_NAME}) + +install(DIRECTORY + config + DESTINATION share/${PROJECT_NAME}) + +install(DIRECTORY + src + DESTINATION share/${PROJECT_NAME}) + + +############# +## Testing ## +############# + +# Add gtest based cpp test target and link libraries +# ament_add_gtest(${PROJECT_NAME}-test test/test_random_walk_planner.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}_node) +# endif() \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/config/random_walk_config.yaml b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/config/random_walk_config.yaml new file mode 100644 index 00000000..8155ca0b --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/config/random_walk_config.yaml @@ -0,0 +1,20 @@ +/**: + ros__parameters: + world_frame_id: "/sim_lidar" + pub_global_path_topic: "/robot1/global/planning/trajectory" + pub_goal_point_topic: "/robot1/global/planning/goal_point" + pub_trajectory_lines_topic: "/robot1/global/planning/traj_viz" + sub_vdb_map_topic: "/vdb_mapping/vdb_map_visualization" + sub_odometry_topic: "/odom" + + publish_visualizations: true + + # Constants + max_start_to_goal_dist_m: 3.5 # how far away the goal waypoint could be + max_angle_change_deg: 30.0 # degrees, + and - from horizontal + checking_point_cnt: 1000 #cnt, how many points to check between each waypoint + waypoint_dist_m: 1.0 # waypoint is this far away + max_z_m: 0.1 # max z distance that the goal position can be + collision_padding_m: 0.1 # how far away from the obstacle to plan + path_end_threshold_m: 0.1 # how close to the goal to stop + diff --git a/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/include/random_walk_logic.hpp b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/include/random_walk_logic.hpp new file mode 100644 index 00000000..b188aabe --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/include/random_walk_logic.hpp @@ -0,0 +1,68 @@ + +#ifndef RANDOM_WALK_LOGIC_H +#define RANDOM_WALK_LOGIC_H + +#include +#include +#include +#include +#include +#include +#include +#include + +typedef std::vector> Path; // x, y, z, yaw + +struct init_params { + float max_start_to_goal_dist_m; + float max_angle_change_deg; + int checking_point_cnt; + float waypoint_dist_m; + float max_z_m; + float collision_padding_m; + float path_end_threshold_m; + std::tuple voxel_size_m; +}; + +class RandomWalkPlanner { + public: + RandomWalkPlanner() = default; + RandomWalkPlanner(init_params params); + ~RandomWalkPlanner() = default; + + std::optional generate_straight_rand_path( + std::tuple start_point, + float timeout_duration = 1.0); // x, y, z, yaw + + std::vector> voxel_points; + + float path_end_threshold_m; + + private: + // Numerical constants + float max_start_to_goal_dist_m_; + float max_angle_change_deg_; + int checking_point_cnt; + float waypoint_dist_m_; + float max_z_m_; + float collision_padding_m; + + // Variables + std::tuple voxel_size_m; + + // Functions + bool check_if_collided_single_voxel(std::tuple point, + std::tuple voxel_center); + + bool check_if_collided(std::tuple point); + + std::tuple generate_goal_point( + std::tuple start_point); +}; + +double get_point_distance(std::tuple point1, + std::tuple point2); + +double deg2rad(double deg); + +#endif // RANDOM_WALK_LOGIC_H diff --git a/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/include/random_walk_node.hpp b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/include/random_walk_node.hpp new file mode 100644 index 00000000..880b0e8f --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/include/random_walk_node.hpp @@ -0,0 +1,72 @@ + +#ifndef RANDOM_WALK_NODE_H +#define RANDOM_WALK_NODE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "geometry_msgs/msg/point.hpp" + +#include "random_walk_logic.hpp" +#include "rclcpp/rclcpp.hpp" + +class RandomWalkNode : public rclcpp::Node { + private: + + // Planner + RandomWalkPlanner random_walk_planner; + + // String constants + std::string world_frame_id_; + std::string pub_global_path_topic_; + std::string pub_goal_point_topic_; + std::string pub_trajectory_lines_topic_; + std::string sub_vdb_map_topic_; + std::string sub_odometry_topic_; + + // Variables + init_params params; + airstack_msgs::msg::TrajectoryXYZVYaw generated_path; + std::vector> voxel_points; + bool publish_visualizations = false; + bool is_path_executing = false; + bool received_first_map = false; + bool received_first_odometry = false; + std::tuple current_location; // x, y, z, yaw + std::tuple current_goal_location; // x, y, z, yaw + + // Callbacks + void vdbmapCallback(const visualization_msgs::msg::Marker::SharedPtr msg); + + void odometryCallback(const nav_msgs::msg::Odometry::SharedPtr msg); + void timerCallback(); + + // Other functions + std::optional readParameters(); + + visualization_msgs::msg::Marker createGoalPointMarker(); + visualization_msgs::msg::Marker createTrajectoryLineMarker(); + + public: + RandomWalkNode(); + ~RandomWalkNode() = default; + + // ROS subscribers + rclcpp::Subscription::SharedPtr sub_vdb_map; + rclcpp::Subscription::SharedPtr sub_odometry; + + // ROS publishers + rclcpp::Publisher::SharedPtr pub_global_path; + rclcpp::Publisher::SharedPtr pub_goal_point; + rclcpp::Publisher::SharedPtr pub_trajectory_lines; + + // ROS timers + rclcpp::TimerBase::SharedPtr timer; +}; + +#endif // RANDOM_WALK_NODE_H diff --git a/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/launch/random_walk_launcher.py b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/launch/random_walk_launcher.py new file mode 100644 index 00000000..6fe4e55c --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/launch/random_walk_launcher.py @@ -0,0 +1,23 @@ +import os +from ament_index_python.packages import get_package_share_directory +from launch import LaunchDescription +from launch_ros.actions import Node + +def generate_launch_description(): + ld = LaunchDescription() + + config = os.path.join( + get_package_share_directory('random_walk_planner'), + 'config', + 'random_walk_config.yaml' + ) + random_walk_planner = Node( + package='random_walk_planner', + executable='random_walk_planner', + name='random_walk_planner', + parameters = [config] + ) + + ld.add_action(random_walk_planner) + + return ld \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/package.xml b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/package.xml new file mode 100644 index 00000000..a30c3b4a --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/package.xml @@ -0,0 +1,65 @@ + + + random_walk_planner + 0.0.0 + The random walk planner package + + + + + todo + + + + + + TODO + + + + + + + + + + + + + + ament_cmake + rclcpp + std_msgs + base + geometry_msgs + nav_msgs + visualization_msgs + message_generation + tf2 + tf2_ros + airstack_msgs + + + rclcpp + std_msgs + base + geometry_msgs + nav_msgs + visualization_msgs + message_runtime + + rclcpp + std_msgs + base + geometry_msgs + nav_msgs + visualization_msgs + message_runtime + tf2 + tf2_ros + airstack_msgs + + + ament_cmake + + diff --git a/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/src/random_walk_logic.cpp b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/src/random_walk_logic.cpp new file mode 100644 index 00000000..17fe54e5 --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/src/random_walk_logic.cpp @@ -0,0 +1,142 @@ + +#include "../include/random_walk_logic.hpp" + +#include "rclcpp/rclcpp.hpp" + +RandomWalkPlanner::RandomWalkPlanner(init_params params) { + this->max_start_to_goal_dist_m_ = params.max_start_to_goal_dist_m; + this->max_angle_change_deg_ = params.max_angle_change_deg; + this->checking_point_cnt = params.checking_point_cnt; + this->waypoint_dist_m_ = params.waypoint_dist_m; + this->max_z_m_ = params.max_z_m; + this->voxel_size_m = params.voxel_size_m; + this->collision_padding_m = params.collision_padding_m; + this->path_end_threshold_m = params.path_end_threshold_m; +} + +std::optional RandomWalkPlanner::generate_straight_rand_path( + std::tuple start_point, float timeout_duration) { + std::tuple start_point_wo_yaw( + std::get<0>(start_point), std::get<1>(start_point), std::get<2>(start_point)); + std::optional path; + bool is_goal_point_valid = false; + // get start time + const std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); + RCLCPP_INFO(rclcpp::get_logger("random_walk_planner"), "Starting Path Search..."); + while (!is_goal_point_valid && std::chrono::duration_cast( + std::chrono::steady_clock::now() - start_time) + .count() < timeout_duration) { + std::tuple goal_point = generate_goal_point(start_point_wo_yaw); + RCLCPP_INFO(rclcpp::get_logger("random_walk_planner"), "Point Generated..."); + if (std::get<2>(goal_point) == -1) { + RCLCPP_INFO(rclcpp::get_logger("random_walk_planner"), "No valid goal point found"); + break; + } + float x_diff = std::get<0>(goal_point) - std::get<0>(start_point_wo_yaw); + float y_diff = std::get<1>(goal_point) - std::get<1>(start_point_wo_yaw); + float z_diff = std::get<2>(goal_point) - std::get<2>(start_point_wo_yaw); + float yaw = std::atan2(y_diff, x_diff); + + path = Path(); + std::tuple first_point( + std::get<0>(start_point), std::get<1>(start_point), std::get<2>(start_point), yaw); + path.value().push_back(first_point); + + // start moving in the direction of the goal point + std::tuple current_point = start_point_wo_yaw; + RCLCPP_INFO(rclcpp::get_logger("random_walk_planner"), + "Checking intermediate points at tolerance %f, with point count %d", + this->path_end_threshold_m, this->checking_point_cnt); + while (get_point_distance(current_point, goal_point) > 0.001) { + if (!check_if_collided(current_point)) { + float new_x = std::get<0>(current_point) + x_diff / this->checking_point_cnt; + float new_y = std::get<1>(current_point) + y_diff / this->checking_point_cnt; + float new_z = std::get<2>(current_point) + z_diff / this->checking_point_cnt; + std::tuple new_point(new_x, new_y, new_z); + current_point = new_point; + std::tuple new_point_with_yaw( + std::get<0>(new_point), std::get<1>(new_point), std::get<2>(new_point), yaw); + path.value().push_back(new_point_with_yaw); + } else { + RCLCPP_INFO(rclcpp::get_logger("random_walk_planner"), "Collision detected"); + is_goal_point_valid = false; + break; + } + is_goal_point_valid = true; + } + } + if (!is_goal_point_valid) { + return std::nullopt; + } else { + return path; + } +} + +bool RandomWalkPlanner::check_if_collided_single_voxel( + std::tuple point, std::tuple voxel_center) { + // Check if the point is within the voxel + float x = std::get<0>(point); + float y = std::get<1>(point); + float z = std::get<2>(point); + float x_voxel = std::get<0>(voxel_center); + float y_voxel = std::get<1>(voxel_center); + float z_voxel = std::get<2>(voxel_center); + float dist = std::sqrt((x - x_voxel) * (x - x_voxel) + (y - y_voxel) * (y - y_voxel) + + (z - z_voxel) * (z - z_voxel)); + if (dist < std::get<0>(this->voxel_size_m) + this->collision_padding_m) { + return true; + } + return false; +} + +bool RandomWalkPlanner::check_if_collided(std::tuple point) { + // Check if the point is within the voxel + for (auto voxel : this->voxel_points) { + if (check_if_collided_single_voxel(point, voxel)) { + return true; + } + } + return false; +} + +std::tuple RandomWalkPlanner::generate_goal_point( + std::tuple start_point) { + float time_out_duration = 1.0; + const clock_t start_time = clock(); + + while ((clock() - start_time) / CLOCKS_PER_SEC < time_out_duration) { + // TODO: make this random generation limited by some input to generate less points + float rand_x = (static_cast(rand()) / static_cast(RAND_MAX) * 2.0f * + this->max_start_to_goal_dist_m_) - + this->max_start_to_goal_dist_m_; + float rand_y = (static_cast(rand()) / static_cast(RAND_MAX) * 2.0f * + this->max_start_to_goal_dist_m_) - + this->max_start_to_goal_dist_m_; + float rand_z = static_cast(rand()) / static_cast(RAND_MAX) * this->max_z_m_; + float x_diff = rand_x - std::get<0>(start_point); + float y_diff = rand_y - std::get<1>(start_point); + float z_diff = rand_z - std::get<2>(start_point); + // if the z value of the point is low enough + if (rand_z < max_z_m_) { + // if the point is close enough to the start point + if (std::sqrt(x_diff * x_diff + y_diff * y_diff + z_diff * z_diff) < + this->max_start_to_goal_dist_m_) { + // if the point doesnt collide with any of the voxels + if (!(check_if_collided(std::tuple(rand_x, rand_y, rand_z)))) { + return std::tuple(rand_x, rand_y, rand_z); + } + } + } + } + return std::tuple(0, 0, -1); +} + +double get_point_distance(std::tuple point1, + std::tuple point2) { + float x_diff = std::get<0>(point1) - std::get<0>(point2); + float y_diff = std::get<1>(point1) - std::get<1>(point2); + float z_diff = std::get<2>(point1) - std::get<2>(point2); + return std::sqrt(x_diff * x_diff + y_diff * y_diff + z_diff * z_diff); +} + +double deg2rad(double deg) { return deg * M_PI / 180.0; } diff --git a/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/src/random_walk_node.cpp b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/src/random_walk_node.cpp new file mode 100644 index 00000000..cd2b281a --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/b_planners/random_walk/src/random_walk_node.cpp @@ -0,0 +1,256 @@ + +#include "../include/random_walk_node.hpp" + +#include "../include/random_walk_logic.hpp" + +RandomWalkNode::RandomWalkNode() : Node("random_walk_node") { + std::optional params_opt = RandomWalkNode::readParameters(); + // Initialize the random walk planner + if (params_opt.has_value()) { + this->params = params_opt.value(); + } else + RCLCPP_ERROR(this->get_logger(), "Failed to initialize random walk planner"); + + this->sub_vdb_map = this->create_subscription( + sub_vdb_map_topic_, 10, + std::bind(&RandomWalkNode::vdbmapCallback, this, std::placeholders::_1)); + this->sub_odometry = this->create_subscription( + sub_odometry_topic_, 10, + std::bind(&RandomWalkNode::odometryCallback, this, std::placeholders::_1)); + + this->pub_global_path = + this->create_publisher(pub_global_path_topic_, 10); + this->pub_goal_point = + this->create_publisher(pub_goal_point_topic_, 10); + this->pub_trajectory_lines = + this->create_publisher(pub_trajectory_lines_topic_, 10); + this->timer = this->create_wall_timer(std::chrono::seconds(1), + std::bind(&RandomWalkNode::timerCallback, this)); +} + +void RandomWalkNode::vdbmapCallback(const visualization_msgs::msg::Marker::SharedPtr msg) { + // updating the local voxel points and generating a path only if the path is not executing + if (!this->received_first_map) { + this->received_first_map = true; + RCLCPP_INFO(this->get_logger(), "Received first map"); + this->params.voxel_size_m = + std::tuple(msg->scale.x, msg->scale.y, msg->scale.z); + this->random_walk_planner = RandomWalkPlanner(this->params); + RCLCPP_INFO(this->get_logger(), "Initialized random walk planner"); + } + // if path is not executing and the odometry has been received + if (!this->is_path_executing && this->received_first_odometry) { + RCLCPP_INFO(this->get_logger(), "Setting Voxel Points from message"); + this->voxel_points.clear(); + for (int i = 0; i < msg->points.size(); i++) { + this->random_walk_planner.voxel_points.push_back(std::tuple( + msg->points[i].x, msg->points[i].y, msg->points[i].z)); + } + RCLCPP_INFO(this->get_logger(), "Generating Path..."); + std::optional gen_path_opt = + this->random_walk_planner.generate_straight_rand_path(this->current_location); + if (gen_path_opt.has_value() && gen_path_opt.value().size() > 0) { + RCLCPP_INFO(this->get_logger(), "Generated path with size %d", + gen_path_opt.value().size()); + + this->current_goal_location = std::tuple( + std::get<0>(gen_path_opt.value().back()), std::get<1>(gen_path_opt.value().back()), + std::get<2>(gen_path_opt.value().back()), std::get<3>(gen_path_opt.value().back())); + // publish the path + this->generated_path = airstack_msgs::msg::TrajectoryXYZVYaw(); + this->generated_path.header.stamp = this->now(); + this->generated_path.header.frame_id = world_frame_id_; + for (auto point : gen_path_opt.value()) { + airstack_msgs::msg::WaypointXYZVYaw point_msg; + point_msg.position.x = std::get<0>(point); + point_msg.position.y = std::get<1>(point); + point_msg.position.z = std::get<2>(point); + point_msg.yaw = std::get<3>(point); + this->generated_path.waypoints.push_back(point_msg); + } + if (this->publish_visualizations) { + this->pub_global_path->publish(this->generated_path); + this->pub_goal_point->publish(createGoalPointMarker()); + this->pub_trajectory_lines->publish(createTrajectoryLineMarker()); + } + RCLCPP_INFO(this->get_logger(), "Published path and goal point at %f, %f, %f", + this->generated_path.waypoints.back().position.x, + this->generated_path.waypoints.back().position.y, + this->generated_path.waypoints.back().position.z); + this->is_path_executing = true; + } else { + RCLCPP_ERROR(this->get_logger(), "Failed to generate path, size was 0"); + } + } + // check if the path is executing + else if (this->is_path_executing) { + std::tuple curr_loc_wo_yaw(std::get<0>(this->current_location), + std::get<1>(this->current_location), + std::get<2>(this->current_location)); + std::tuple goal_loc_wo_yaw(std::get<0>(this->current_goal_location), + std::get<1>(this->current_goal_location), + std::get<2>(this->current_goal_location)); + if (get_point_distance(curr_loc_wo_yaw, goal_loc_wo_yaw) < + this->random_walk_planner.path_end_threshold_m) { + this->is_path_executing = false; + } + } +} + +void RandomWalkNode::odometryCallback(const nav_msgs::msg::Odometry::SharedPtr msg) { + // get the current location + this->current_location = std::tuple( + msg->pose.pose.position.x, msg->pose.pose.position.y, msg->pose.pose.position.z, + msg->pose.pose.orientation.z); + if (!this->received_first_odometry) { + this->received_first_odometry = true; + RCLCPP_INFO(this->get_logger(), "Received first odometry"); + } +} + +void RandomWalkNode::timerCallback() { + if (this->is_path_executing && this->publish_visualizations) { + RCLCPP_INFO(this->get_logger(), "Publishing visualizations..."); + visualization_msgs::msg::Marker goal_point_msg = createGoalPointMarker(); + this->pub_goal_point->publish(goal_point_msg); + + visualization_msgs::msg::Marker trajectory_line_msg = createTrajectoryLineMarker(); + this->pub_trajectory_lines->publish(trajectory_line_msg); + } +} + +std::optional RandomWalkNode::readParameters() { + // Read in parameters based off the default yaml file + init_params params; + this->declare_parameter("world_frame_id"); + if (!this->get_parameter("world_frame_id", this->world_frame_id_)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: world_frame_id"); + return std::optional{}; + } + this->declare_parameter("pub_global_path_topic"); + if (!this->get_parameter("pub_global_path_topic", this->pub_global_path_topic_)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: pub_global_path_topic"); + return std::optional{}; + } + this->declare_parameter("pub_goal_point_topic"); + if (!this->get_parameter("pub_goal_point_topic", this->pub_goal_point_topic_)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: pub_goal_point_topic"); + return std::optional{}; + } + this->declare_parameter("pub_trajectory_lines_topic"); + if (!this->get_parameter("pub_trajectory_lines_topic", this->pub_trajectory_lines_topic_)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: pub_trajectory_lines_topic"); + return std::optional{}; + } + this->declare_parameter("sub_vdb_map_topic"); + if (!this->get_parameter("sub_vdb_map_topic", this->sub_vdb_map_topic_)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: sub_vdb_map_topic"); + return std::optional{}; + } + this->declare_parameter("sub_odometry_topic"); + if (!this->get_parameter("sub_odometry_topic", this->sub_odometry_topic_)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: sub_odometry_topic"); + return std::optional{}; + } + this->declare_parameter("publish_visualizations"); + if (!this->get_parameter("publish_visualizations", this->publish_visualizations)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: publish_visualizations"); + return std::optional{}; + } + this->declare_parameter("max_start_to_goal_dist_m"); + if (!this->get_parameter("max_start_to_goal_dist_m", params.max_start_to_goal_dist_m)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: max_start_to_goal_dist_m"); + return std::optional{}; + } + this->declare_parameter("max_angle_change_deg"); + if (!this->get_parameter("max_angle_change_deg", params.max_angle_change_deg)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: max_angle_change_deg"); + return std::optional{}; + } + this->declare_parameter("checking_point_cnt"); + if (!this->get_parameter("checking_point_cnt", params.checking_point_cnt)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: checking_point_cnt"); + return std::optional{}; + } + this->declare_parameter("waypoint_dist_m"); + if (!this->get_parameter("waypoint_dist_m", params.waypoint_dist_m)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: waypoint_dist_m"); + return std::optional{}; + } + this->declare_parameter("max_z_m"); + if (!this->get_parameter("max_z_m", params.max_z_m)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: max_z_m"); + return std::optional{}; + } + this->declare_parameter("collision_padding_m"); + if (!this->get_parameter("collision_padding_m", params.collision_padding_m)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: collision_padding_m"); + return std::optional{}; + } + this->declare_parameter("path_end_threshold_m"); + if (!this->get_parameter("path_end_threshold_m", params.path_end_threshold_m)) { + RCLCPP_ERROR(this->get_logger(), "Cannot read parameter: path_end_threshold_m"); + return std::optional{}; + } + return params; +} + +visualization_msgs::msg::Marker RandomWalkNode::createTrajectoryLineMarker() { + visualization_msgs::msg::Marker trajectory_line_msg; + trajectory_line_msg.header.frame_id = this->world_frame_id_; + trajectory_line_msg.header.stamp = this->now(); + trajectory_line_msg.ns = "trajectory_line"; + trajectory_line_msg.id = 0; + trajectory_line_msg.type = visualization_msgs::msg::Marker::LINE_STRIP; + trajectory_line_msg.action = visualization_msgs::msg::Marker::ADD; + trajectory_line_msg.pose.orientation.w = 1.0; + trajectory_line_msg.scale.x = 0.1; + trajectory_line_msg.color.a = 1.0; + trajectory_line_msg.color.r = 1.0; + trajectory_line_msg.color.g = 0.0; + trajectory_line_msg.color.b = 0.0; + if (this->generated_path.waypoints.size() > 0) { + // RCLCPP_INFO(this->get_logger(), "Creating trajectory line with %d points...", + // this->generated_path.waypoints.size()); + for (auto point : this->generated_path.waypoints) { + geometry_msgs::msg::Point p; + p.x = point.position.x; + p.y = point.position.y; + p.z = point.position.z; + trajectory_line_msg.points.push_back(p); + } + } else { + RCLCPP_ERROR(this->get_logger(), "No points in the path"); + } + return trajectory_line_msg; +} + +visualization_msgs::msg::Marker RandomWalkNode::createGoalPointMarker() { + visualization_msgs::msg::Marker goal_point_msg; + goal_point_msg.header.frame_id = this->world_frame_id_; + goal_point_msg.header.stamp = this->now(); + goal_point_msg.ns = "goal_point"; + goal_point_msg.id = 0; + goal_point_msg.type = visualization_msgs::msg::Marker::SPHERE; + goal_point_msg.action = visualization_msgs::msg::Marker::ADD; + geometry_msgs::msg::Point goal_point = geometry_msgs::msg::Point(); + goal_point.x = std::get<0>(this->current_goal_location); + goal_point.y = std::get<1>(this->current_goal_location); + goal_point.z = std::get<2>(this->current_goal_location); + goal_point_msg.pose.position = goal_point; + goal_point_msg.scale.x = 0.1; + goal_point_msg.scale.y = 0.1; + goal_point_msg.scale.z = 0.1; + goal_point_msg.color.a = 1.0; + goal_point_msg.color.r = 0.0; + goal_point_msg.color.g = 1.0; + goal_point_msg.color.b = 0.0; + return goal_point_msg; +} + +int main(int argc, char *argv[]) { + rclcpp::init(argc, argv); + rclcpp::spin(std::make_shared()); + rclcpp::shutdown(); + return 0; +} \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/4_global/b_planners/trivial_planners/CMakeLists.txt b/ros_ws/src/robot/autonomy/4_global/b_planners/trivial_planners/CMakeLists.txt new file mode 100644 index 00000000..a6f2b551 --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/b_planners/trivial_planners/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 3.8) +project(trivial_planners) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +# uncomment the following section in order to fill in +# further dependencies manually. +# find_package( REQUIRED) + +add_executable(random_walk_planner_node src/random_walk_planner_node.cpp) +target_include_directories(random_walk_planner_node PUBLIC + $ + $) +target_compile_features(random_walk_planner_node PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 + +install(TARGETS random_walk_planner_node + DESTINATION lib/${PROJECT_NAME}) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +ament_package() diff --git a/ros_ws/src/robot/autonomy/controls/controls_bringup/package.xml b/ros_ws/src/robot/autonomy/4_global/b_planners/trivial_planners/package.xml similarity index 94% rename from ros_ws/src/robot/autonomy/controls/controls_bringup/package.xml rename to ros_ws/src/robot/autonomy/4_global/b_planners/trivial_planners/package.xml index 2646bd43..41317518 100644 --- a/ros_ws/src/robot/autonomy/controls/controls_bringup/package.xml +++ b/ros_ws/src/robot/autonomy/4_global/b_planners/trivial_planners/package.xml @@ -1,7 +1,7 @@ - controls_bringup + trivial_planners 0.0.0 TODO: Package description andrew diff --git a/ros_ws/src/robot/autonomy/4_global/b_planners/trivial_planners/src/random_walk_planner_node.cpp b/ros_ws/src/robot/autonomy/4_global/b_planners/trivial_planners/src/random_walk_planner_node.cpp new file mode 100644 index 00000000..620e7e64 --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/b_planners/trivial_planners/src/random_walk_planner_node.cpp @@ -0,0 +1,10 @@ +#include + +int main(int argc, char ** argv) +{ + (void) argc; + (void) argv; + + printf("hello world trivial_planners package\n"); + return 0; +} diff --git a/ros_ws/src/robot/autonomy/planning/global/central/CMakeLists.txt b/ros_ws/src/robot/autonomy/4_global/global_bringup/CMakeLists.txt similarity index 75% rename from ros_ws/src/robot/autonomy/planning/global/central/CMakeLists.txt rename to ros_ws/src/robot/autonomy/4_global/global_bringup/CMakeLists.txt index 9436f43c..77d07941 100644 --- a/ros_ws/src/robot/autonomy/planning/global/central/CMakeLists.txt +++ b/ros_ws/src/robot/autonomy/4_global/global_bringup/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.8) -project(central) +project(global_bringup) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) @@ -23,14 +23,10 @@ if(BUILD_TESTING) ament_lint_auto_find_test_dependencies() endif() -install(DIRECTORY - launch - DESTINATION share/${PROJECT_NAME}/ - ) - -install(DIRECTORY - config - DESTINATION share/${PROJECT_NAME}/ - ) +# Install files. +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY rviz DESTINATION share/${PROJECT_NAME}) +install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY params DESTINATION share/${PROJECT_NAME}) ament_package() diff --git a/ros_ws/src/robot/autonomy/4_global/global_bringup/LICENSE b/ros_ws/src/robot/autonomy/4_global/global_bringup/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/global_bringup/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ros_ws/src/robot/autonomy/4_global/global_bringup/config/vdb_params.yaml b/ros_ws/src/robot/autonomy/4_global/global_bringup/config/vdb_params.yaml new file mode 100644 index 00000000..d8ef88ca --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/global_bringup/config/vdb_params.yaml @@ -0,0 +1,41 @@ +/**: + ros__parameters: + # Basic setup + map_frame: map + robot_frame: base_link + max_range: 10.0 + resolution: 0.07 + prob_hit: 0.8 + prob_miss: 0.1 + thres_min: 0.12 + thres_max: 0.8 + map_save_dir: "" + + # Visualizations + publish_pointcloud: true + publish_vis_marker: true + visualization_rate: 2.0 + + # Sensor input + apply_raw_sensor_data: true + sources: [ouster] + ouster: + topic: sensors/ouster/point_cloud + sensor_origin_frame: ouster + + # Remote mapping + publish_updates: true + publish_overwrites: true + publish_sections: true + section_update: + rate: 1.0 + min_coord: + x: -10.0 + y: -10.0 + z: -10.0 + max_coord: + x: 10.0 + y: 10.0 + z: 10.0 + + diff --git a/ros_ws/src/robot/autonomy/4_global/global_bringup/launch/global.launch.xml b/ros_ws/src/robot/autonomy/4_global/global_bringup/launch/global.launch.xml new file mode 100644 index 00000000..6ab58c42 --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/global_bringup/launch/global.launch.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/4_global/global_bringup/package.xml b/ros_ws/src/robot/autonomy/4_global/global_bringup/package.xml new file mode 100644 index 00000000..a7588894 --- /dev/null +++ b/ros_ws/src/robot/autonomy/4_global/global_bringup/package.xml @@ -0,0 +1,18 @@ + + + + global_bringup + 0.0.0 + TODO: Package description + andrew + Apache-2.0 + + ament_cmake + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/CMakeLists.txt b/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/CMakeLists.txt new file mode 100644 index 00000000..b62906b6 --- /dev/null +++ b/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.8) +project(behavior_bringup) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +# uncomment the following section in order to fill in +# further dependencies manually. +# find_package( REQUIRED) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +# Install files. +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY rviz DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY params DESTINATION share/${PROJECT_NAME}) + +ament_package() diff --git a/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/LICENSE b/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/launch/behavior.launch.xml b/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/launch/behavior.launch.xml new file mode 100644 index 00000000..f9d192fa --- /dev/null +++ b/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/launch/behavior.launch.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/package.xml b/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/package.xml new file mode 100644 index 00000000..fbdc2cd6 --- /dev/null +++ b/ros_ws/src/robot/autonomy/5_behavior/behavior_bringup/package.xml @@ -0,0 +1,18 @@ + + + + behavior_bringup + 0.0.0 + TODO: Package description + andrew + Apache-2.0 + + ament_cmake + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_executive/CMakeLists.txt b/ros_ws/src/robot/autonomy/5_behavior/behavior_executive/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_executive/CMakeLists.txt rename to ros_ws/src/robot/autonomy/5_behavior/behavior_executive/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_executive/include/behavior_executive/behavior_executive.hpp b/ros_ws/src/robot/autonomy/5_behavior/behavior_executive/include/behavior_executive/behavior_executive.hpp similarity index 99% rename from ros_ws/src/robot/autonomy/planning/global/behavior_executive/include/behavior_executive/behavior_executive.hpp rename to ros_ws/src/robot/autonomy/5_behavior/behavior_executive/include/behavior_executive/behavior_executive.hpp index e364f6b2..6da18b57 100644 --- a/ros_ws/src/robot/autonomy/planning/global/behavior_executive/include/behavior_executive/behavior_executive.hpp +++ b/ros_ws/src/robot/autonomy/5_behavior/behavior_executive/include/behavior_executive/behavior_executive.hpp @@ -8,7 +8,6 @@ class BehaviorExecutive : public rclcpp::Node { private: - // parameters bool ascent_takeoff; diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_executive/package.xml b/ros_ws/src/robot/autonomy/5_behavior/behavior_executive/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_executive/package.xml rename to ros_ws/src/robot/autonomy/5_behavior/behavior_executive/package.xml diff --git a/ros_ws/src/robot/autonomy/5_behavior/behavior_executive/src/behavior_executive.cpp b/ros_ws/src/robot/autonomy/5_behavior/behavior_executive/src/behavior_executive.cpp new file mode 100644 index 00000000..1f3b7b87 --- /dev/null +++ b/ros_ws/src/robot/autonomy/5_behavior/behavior_executive/src/behavior_executive.cpp @@ -0,0 +1,291 @@ +#include + +BehaviorExecutive::BehaviorExecutive() : Node("behavior_executive") { + // conditions + auto_takeoff_commanded_condition = new bt::Condition("Auto Takeoff Commanded", this); + takeoff_commanded_condition = new bt::Condition("Takeoff Commanded", this); + armed_condition = new bt::Condition("Armed", this); + offboard_mode_condition = new bt::Condition("Offboard Mode", this); + stationary_condition = new bt::Condition("Stationary", this); + land_commanded_condition = new bt::Condition("Land Commanded", this); + pause_commanded_condition = new bt::Condition("Pause Commanded", this); + rewind_commanded_condition = new bt::Condition("Rewind Commanded", this); + fixed_trajectory_condition = new bt::Condition("Fixed Trajectory Commanded", this); + explore_condition = new bt::Condition("Explore Commanded", this); + offboard_commanded_condition = new bt::Condition("Offboard Commanded", this); + arm_commanded_condition = new bt::Condition("Arm Commanded", this); + disarm_commanded_condition = new bt::Condition("Disarm Commanded", this); + conditions.push_back(auto_takeoff_commanded_condition); + conditions.push_back(takeoff_commanded_condition); + conditions.push_back(armed_condition); + conditions.push_back(offboard_mode_condition); + conditions.push_back(stationary_condition); + conditions.push_back(land_commanded_condition); + conditions.push_back(pause_commanded_condition); + conditions.push_back(rewind_commanded_condition); + conditions.push_back(fixed_trajectory_condition); + conditions.push_back(explore_condition); + conditions.push_back(offboard_commanded_condition); + conditions.push_back(arm_commanded_condition); + conditions.push_back(disarm_commanded_condition); + + // actions + arm_action = new bt::Action("Arm", this); + takeoff_action = new bt::Action("Takeoff", this); + land_action = new bt::Action("Land", this); + pause_action = new bt::Action("Pause", this); + rewind_action = new bt::Action("Rewind", this); + follow_fixed_trajectory_action = new bt::Action("Follow Fixed Trajectory", this); + explore_action = new bt::Action("Explore", this); + request_control_action = new bt::Action("Request Control", this); + disarm_action = new bt::Action("Disarm", this); + actions.push_back(arm_action); + actions.push_back(takeoff_action); + actions.push_back(land_action); + actions.push_back(pause_action); + actions.push_back(rewind_action); + actions.push_back(follow_fixed_trajectory_action); + actions.push_back(explore_action); + actions.push_back(request_control_action); + actions.push_back(disarm_action); + + // subscribers + behavior_tree_commands_sub = + this->create_subscription( + "behavior_tree_commands", 1, + std::bind(&BehaviorExecutive::bt_commands_callback, this, std::placeholders::_1)); + is_armed_sub = this->create_subscription( + "is_armed", 1, + std::bind(&BehaviorExecutive::is_armed_callback, this, std::placeholders::_1)); + has_control_sub = this->create_subscription( + "has_control", 1, + std::bind(&BehaviorExecutive::has_control_callback, this, std::placeholders::_1)); + + // publishers + + // services + service_callback_group = + this->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive); + robot_command_client = this->create_client( + "robot_command", rmw_qos_profile_services_default, service_callback_group); + trajectory_mode_client = this->create_client( + "set_trajectory_mode", rmw_qos_profile_services_default, service_callback_group); + takeoff_landing_command_client = this->create_client( + "set_takeoff_landing_command", rmw_qos_profile_services_default, service_callback_group); + + // timers + timer = rclcpp::create_timer(this, this->get_clock(), rclcpp::Duration::from_seconds(1. / 20.), + std::bind(&BehaviorExecutive::timer_callback, this)); +} + +void BehaviorExecutive::timer_callback() { + // std::cout << "running" << std::endl; + + if (request_control_action->is_active()) { + if (request_control_action->active_has_changed()) { + airstack_msgs::srv::RobotCommand::Request::SharedPtr request = + std::make_shared(); + request->command = airstack_msgs::srv::RobotCommand::Request::REQUEST_CONTROL; + + auto result = robot_command_client->async_send_request(request); + std::cout << "waiting be rc" << std::endl; + result.wait(); + std::cout << "done be rc" << std::endl; + if (result.get()->success) + request_control_action->set_success(); + else + request_control_action->set_failure(); + } + } + + if (arm_action->is_active()) { + if (arm_action->active_has_changed()) { + airstack_msgs::srv::RobotCommand::Request::SharedPtr request = + std::make_shared(); + request->command = airstack_msgs::srv::RobotCommand::Request::ARM; + + auto result = robot_command_client->async_send_request(request); + std::cout << "waiting be arm" << std::endl; + result.wait(); + std::cout << "done be arm" << std::endl; + if (result.get()->success) + arm_action->set_success(); + else + arm_action->set_failure(); + } + } + + if (disarm_action->is_active()) { + if (disarm_action->active_has_changed()) { + airstack_msgs::srv::RobotCommand::Request::SharedPtr request = + std::make_shared(); + request->command = airstack_msgs::srv::RobotCommand::Request::DISARM; + + auto result = robot_command_client->async_send_request(request); + std::cout << "waiting be arm" << std::endl; + result.wait(); + std::cout << "done be arm" << std::endl; + if (result.get()->success) + disarm_action->set_success(); + else + disarm_action->set_failure(); + } + } + + if (takeoff_action->is_active()) { + // std::cout << "takeoff" << std::endl; + takeoff_action->set_running(); + if (takeoff_action->active_has_changed()) { + // put trajectory controller in track mode + airstack_msgs::srv::TrajectoryMode::Request::SharedPtr mode_request = + std::make_shared(); + mode_request->mode = airstack_msgs::srv::TrajectoryMode::Request::TRACK; + auto mode_result = trajectory_mode_client->async_send_request(mode_request); + std::cout << "mode 1" << std::endl; + mode_result.wait(); + std::cout << "mode 2" << std::endl; + + if (mode_result.get()->success) { + // send a takeoff command to ardupilot + // TODO clean up variable names + airstack_msgs::srv::RobotCommand::Request::SharedPtr request = + std::make_shared(); + request->command = airstack_msgs::srv::RobotCommand::Request::TAKEOFF; + + auto result = robot_command_client->async_send_request(request); + std::cout << "waiting robot command takeoff" << std::endl; + result.wait(); + std::cout << "done robot command takeoff" << std::endl; + + // send the takeoff trajectory + if (result.get()->success) { + airstack_msgs::srv::TakeoffLandingCommand::Request::SharedPtr takeoff_request = + std::make_shared(); + takeoff_request->command = + airstack_msgs::srv::TakeoffLandingCommand::Request::TAKEOFF; + auto takeoff_result = + takeoff_landing_command_client->async_send_request(takeoff_request); + std::cout << "takeoff 1" << std::endl; + takeoff_result.wait(); + std::cout << "takeoff 2" << std::endl; + if (takeoff_result.get()->accepted) + takeoff_action->set_success(); + else + takeoff_action->set_failure(); + } else + takeoff_action->set_failure(); + } else + takeoff_action->set_failure(); + } + } + + if (land_action->is_active()) { + // std::cout << "land" << std::endl; + land_action->set_running(); + if (land_action->active_has_changed()) { + // put trajectory controller in track mode + airstack_msgs::srv::TrajectoryMode::Request::SharedPtr mode_request = + std::make_shared(); + mode_request->mode = airstack_msgs::srv::TrajectoryMode::Request::TRACK; + auto mode_result = trajectory_mode_client->async_send_request(mode_request); + std::cout << "mode 1" << std::endl; + mode_result.wait(); + std::cout << "mode 2" << std::endl; + + if (mode_result.get()->success) { + airstack_msgs::srv::TakeoffLandingCommand::Request::SharedPtr land_request = + std::make_shared(); + land_request->command = airstack_msgs::srv::TakeoffLandingCommand::Request::LAND; + auto land_result = takeoff_landing_command_client->async_send_request(land_request); + std::cout << "land 1" << std::endl; + land_result.wait(); + std::cout << "land 2" << std::endl; + if (land_result.get()->accepted) + land_action->set_success(); + else + land_action->set_failure(); + } else + land_action->set_failure(); + } + } + + if (pause_action->is_active()) { + pause_action->set_running(); + if (pause_action->active_has_changed()) { + airstack_msgs::srv::TrajectoryMode::Request::SharedPtr mode_request = + std::make_shared(); + mode_request->mode = airstack_msgs::srv::TrajectoryMode::Request::PAUSE; + auto mode_result = trajectory_mode_client->async_send_request(mode_request); + mode_result.wait(); + } + } + + if (rewind_action->is_active()) { + rewind_action->set_running(); + if (rewind_action->active_has_changed()) { + airstack_msgs::srv::TrajectoryMode::Request::SharedPtr mode_request = + std::make_shared(); + mode_request->mode = airstack_msgs::srv::TrajectoryMode::Request::REWIND; + auto mode_result = trajectory_mode_client->async_send_request(mode_request); + mode_result.wait(); + } + } + + // follow fixed trajectory action + if (follow_fixed_trajectory_action->is_active()) { + follow_fixed_trajectory_action->set_running(); + + if (follow_fixed_trajectory_action->active_has_changed()) { + // put trajectory controller in track mode + airstack_msgs::srv::TrajectoryMode::Request::SharedPtr mode_request = + std::make_shared(); + mode_request->mode = airstack_msgs::srv::TrajectoryMode::Request::TRACK; + auto mode_result = trajectory_mode_client->async_send_request(mode_request); + std::cout << "mode 1" << std::endl; + mode_result.wait(); + std::cout << "mode 2" << std::endl; + } + } + + for (bt::Condition* condition : conditions) condition->publish(); + for (bt::Action* action : actions) action->publish(); +} + +// callbacks + +void BehaviorExecutive::bt_commands_callback(behavior_tree_msgs::msg::BehaviorTreeCommands msg) { + for (int i = 0; i < msg.commands.size(); i++) { + std::string condition_name = msg.commands[i].condition_name; + int status = msg.commands[i].status; + + for (int j = 0; j < conditions.size(); j++) { + bt::Condition* condition = conditions[j]; + if (condition_name == condition->get_label()) { + if (status == behavior_tree_msgs::msg::Status::SUCCESS) + condition->set(true); + else if (status == behavior_tree_msgs::msg::Status::FAILURE) + condition->set(false); + } + } + } +} + +void BehaviorExecutive::is_armed_callback(const std_msgs::msg::Bool::SharedPtr msg) { + armed_condition->set(msg->data); +} + +void BehaviorExecutive::has_control_callback(const std_msgs::msg::Bool::SharedPtr msg) { + offboard_mode_condition->set(msg->data); +} + +int main(int argc, char** argv) { + rclcpp::init(argc, argv); + std::shared_ptr node = std::make_shared(); + + rclcpp::executors::MultiThreadedExecutor executor; + executor.add_node(node); + executor.spin(); + rclcpp::shutdown(); + + return 0; +} diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree/.gitignore b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree/.gitignore similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree/.gitignore rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree/.gitignore diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree/CMakeLists.txt b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree/CMakeLists.txt similarity index 88% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree/CMakeLists.txt rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree/CMakeLists.txt index 66718a27..00372fad 100644 --- a/ros_ws/src/robot/autonomy/planning/global/behavior_tree/CMakeLists.txt +++ b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree/CMakeLists.txt @@ -51,7 +51,6 @@ install( INCLUDES DESTINATION include ) - install(TARGETS behavior_tree_implementation DESTINATION lib/${PROJECT_NAME}) @@ -67,4 +66,10 @@ if(BUILD_TESTING) ament_lint_auto_find_test_dependencies() endif() +# Install files. +# install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY rviz DESTINATION share/${PROJECT_NAME}) +install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY params DESTINATION share/${PROJECT_NAME}) + ament_package() diff --git a/ros_ws/src/robot/autonomy/planning/global/central/config/drone.tree b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree/config/drone.tree similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/central/config/drone.tree rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree/config/drone.tree diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree/include/behavior_tree/behavior_tree.h b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree/include/behavior_tree/behavior_tree.h similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree/include/behavior_tree/behavior_tree.h rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree/include/behavior_tree/behavior_tree.h diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree/include/behavior_tree/behavior_tree_implementation.h b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree/include/behavior_tree/behavior_tree_implementation.h similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree/include/behavior_tree/behavior_tree_implementation.h rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree/include/behavior_tree/behavior_tree_implementation.h diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree/package.xml b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree/package.xml rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree/package.xml diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree/src/behavior_tree.cpp b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree/src/behavior_tree.cpp similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree/src/behavior_tree.cpp rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree/src/behavior_tree.cpp diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree/src/behavior_tree_implementation.cpp b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree/src/behavior_tree_implementation.cpp similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree/src/behavior_tree_implementation.cpp rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree/src/behavior_tree_implementation.cpp diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/.gitignore b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/.gitignore similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/.gitignore rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/.gitignore diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/CMakeLists.txt b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/CMakeLists.txt rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/example.tree b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/example.tree similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/example.tree rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/example.tree diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/example2.tree b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/example2.tree similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/example2.tree rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/example2.tree diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/example3.tree b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/example3.tree similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/example3.tree rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/example3.tree diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/example3_nested_subtree.tree b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/example3_nested_subtree.tree similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/example3_nested_subtree.tree rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/example3_nested_subtree.tree diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/example3_subtree.tree b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/example3_subtree.tree similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/example3_subtree.tree rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/example3_subtree.tree diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/ugv_tree.tree b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/ugv_tree.tree similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/ugv_tree.tree rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/ugv_tree.tree diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/ugv_tree_basic.tree b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/ugv_tree_basic.tree similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/config/ugv_tree_basic.tree rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/config/ugv_tree_basic.tree diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/launch/behavior_tree_example.xml b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/launch/behavior_tree_example.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/launch/behavior_tree_example.xml rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/launch/behavior_tree_example.xml diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/package.xml b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/package.xml rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/package.xml diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/rviz/behavior_tree.perspective b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/rviz/behavior_tree.perspective similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/rviz/behavior_tree.perspective rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/rviz/behavior_tree.perspective diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/rviz/behavior_tree_example.rviz b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/rviz/behavior_tree_example.rviz similarity index 99% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/rviz/behavior_tree_example.rviz rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/rviz/behavior_tree_example.rviz index 38263c07..1159cebd 100644 --- a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/rviz/behavior_tree_example.rviz +++ b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/rviz/behavior_tree_example.rviz @@ -109,7 +109,7 @@ Visualization Manager: Filter size: 10 History Policy: Keep Last Reliability Policy: Reliable - Value: /odometry + Value: perception/state_estimation/odometry Value: true - Class: rviz_default_plugins/MarkerArray Enabled: true diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/src/behavior_tree_example.cpp b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/src/behavior_tree_example.cpp similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/src/behavior_tree_example.cpp rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/src/behavior_tree_example.cpp diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/src/robot_node.cpp b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/src/robot_node.cpp similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_example/src/robot_node.cpp rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_example/src/robot_node.cpp diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/.gitignore b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/.gitignore similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/.gitignore rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/.gitignore diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/CMakeLists.txt b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/CMakeLists.txt similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/CMakeLists.txt rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/CMakeLists.txt diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/msg/Active.msg b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/msg/Active.msg similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/msg/Active.msg rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/msg/Active.msg diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/msg/BehaviorTreeCommand.msg b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/msg/BehaviorTreeCommand.msg similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/msg/BehaviorTreeCommand.msg rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/msg/BehaviorTreeCommand.msg diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/msg/BehaviorTreeCommands.msg b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/msg/BehaviorTreeCommands.msg similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/msg/BehaviorTreeCommands.msg rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/msg/BehaviorTreeCommands.msg diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/msg/Status.msg b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/msg/Status.msg similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/msg/Status.msg rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/msg/Status.msg diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/package.xml b/ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/behavior_tree_msgs/package.xml rename to ros_ws/src/robot/autonomy/5_behavior/behavior_tree_msgs/package.xml diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/.gitignore b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/.gitignore similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/.gitignore rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/.gitignore diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/CHANGELOG.rst b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/CHANGELOG.rst similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/CHANGELOG.rst rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/CHANGELOG.rst diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/package.xml b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/package.xml rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/package.xml diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/plugin.xml b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/plugin.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/plugin.xml rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/plugin.xml diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/resource/py_console_widget.ui b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/resource/py_console_widget.ui similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/resource/py_console_widget.ui rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/resource/py_console_widget.ui diff --git a/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/resource/rqt_behavior_tree b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/resource/rqt_behavior_tree new file mode 100644 index 00000000..e69de29b diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/setup.cfg b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/setup.cfg similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/setup.cfg rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/setup.cfg diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/setup.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/setup.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/setup.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/setup.py diff --git a/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/__init__.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/main.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/main.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/main.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/main.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/py_console.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/py_console.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/py_console.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/py_console.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/py_console_text_edit.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/py_console_text_edit.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/py_console_text_edit.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/py_console_text_edit.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/py_console_widget.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/py_console_widget.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/py_console_widget.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/py_console_widget.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/spyder_console_widget.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/spyder_console_widget.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/spyder_console_widget.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/spyder_console_widget.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/test.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/test.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/test.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/test.py diff --git a/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/xdot/__init__.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/xdot/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/xdot/wxxdot.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/xdot/wxxdot.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/xdot/wxxdot.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/xdot/wxxdot.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/xdot/xdot.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/xdot/xdot.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/xdot/xdot.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/xdot/xdot.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/xdot/xdot_qt.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/xdot/xdot_qt.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree/src/rqt_behavior_tree/xdot/xdot_qt.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree/src/rqt_behavior_tree/xdot/xdot_qt.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/CHANGELOG.rst b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/CHANGELOG.rst similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/CHANGELOG.rst rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/CHANGELOG.rst diff --git a/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/config/gui_config.yaml b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/config/gui_config.yaml new file mode 100644 index 00000000..3c8ab707 --- /dev/null +++ b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/config/gui_config.yaml @@ -0,0 +1,14 @@ +groups: + - Commands: + - Takeoff: + condition_name: Auto Takeoff Commanded + - Land: + condition_name: Land Commanded + - Pause: + condition_name: Pause Commanded + - Rewind: + condition_name: Rewind Commanded + - Fixed Trajectory: + condition_name: Fixed Trajectory Commanded + - Disarm: + condition_name: Disarm Commanded \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/package.xml b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/package.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/package.xml rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/package.xml diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/plugin.xml b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/plugin.xml similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/plugin.xml rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/plugin.xml diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/resource/py_console_widget.ui b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/resource/py_console_widget.ui similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/resource/py_console_widget.ui rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/resource/py_console_widget.ui diff --git a/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/resource/rqt_behavior_tree_command b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/resource/rqt_behavior_tree_command new file mode 100644 index 00000000..e69de29b diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/setup.cfg b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/setup.cfg similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/setup.cfg rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/setup.cfg diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/setup.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/setup.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/setup.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/setup.py diff --git a/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/__init__.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/main.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/main.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/main.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/main.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/py_console_text_edit.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/py_console_text_edit.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/py_console_text_edit.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/py_console_text_edit.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/py_console_widget.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/py_console_widget.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/py_console_widget.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/py_console_widget.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/spyder_console_widget.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/spyder_console_widget.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/spyder_console_widget.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/spyder_console_widget.py diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/template.py b/ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/template.py similarity index 100% rename from ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/src/rqt_behavior_tree_command/template.py rename to ros_ws/src/robot/autonomy/5_behavior/rqt_behavior_tree_command/src/rqt_behavior_tree_command/template.py diff --git a/ros_ws/src/robot/autonomy/autonomy_bringup/CMakeLists.txt b/ros_ws/src/robot/autonomy/autonomy_bringup/CMakeLists.txt new file mode 100644 index 00000000..b2476c52 --- /dev/null +++ b/ros_ws/src/robot/autonomy/autonomy_bringup/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.8) +project(autonomy_bringup) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +# uncomment the following section in order to fill in +# further dependencies manually. +# find_package( REQUIRED) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +# Install files. +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY rviz DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY params DESTINATION share/${PROJECT_NAME}) + +ament_package() diff --git a/ros_ws/src/robot/autonomy/autonomy_bringup/LICENSE b/ros_ws/src/robot/autonomy/autonomy_bringup/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/ros_ws/src/robot/autonomy/autonomy_bringup/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ros_ws/src/robot/autonomy/autonomy_bringup/launch/autonomy.launch.xml b/ros_ws/src/robot/autonomy/autonomy_bringup/launch/autonomy.launch.xml new file mode 100644 index 00000000..0380d6c7 --- /dev/null +++ b/ros_ws/src/robot/autonomy/autonomy_bringup/launch/autonomy.launch.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/autonomy_bringup/package.xml b/ros_ws/src/robot/autonomy/autonomy_bringup/package.xml new file mode 100644 index 00000000..eb765722 --- /dev/null +++ b/ros_ws/src/robot/autonomy/autonomy_bringup/package.xml @@ -0,0 +1,18 @@ + + + + autonomy_bringup + 0.0.0 + TODO: Package description + andrew + Apache-2.0 + + ament_cmake + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/ros_ws/src/robot/autonomy/controls/controls_bringup/launch/launch_controls.yaml b/ros_ws/src/robot/autonomy/controls/controls_bringup/launch/launch_controls.yaml deleted file mode 100644 index ae11734c..00000000 --- a/ros_ws/src/robot/autonomy/controls/controls_bringup/launch/launch_controls.yaml +++ /dev/null @@ -1,21 +0,0 @@ -launch: - - group: - - push-ros-namespace: - namespace: "controls" - - # include MAVROS ardupilot - # assume the interface is MAVROS and that MAVROS is already running - # - include: - # file: "$(find-pkg-share mavros)/launch/apm.launch" - # arg: - # - name: "fcu_url" - # value: "udp://:14554@" - # - name: "respawn_mavros" - # value: "true" - - - node: - pkg: "robot_interface" - exec: "robot_interface_node" - name: "robot_interface_node" - namespace: "robot_interface" - # ros_args: "--log-level DEBUG" diff --git a/ros_ws/src/robot/autonomy/controls/mavros_interface/src/mavros_interface.cpp b/ros_ws/src/robot/autonomy/controls/mavros_interface/src/mavros_interface.cpp deleted file mode 100644 index b63680ad..00000000 --- a/ros_ws/src/robot/autonomy/controls/mavros_interface/src/mavros_interface.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/** - * @file mavros_interface.cpp - * @author John Keller (jkeller2@andrew.cmu.edu), Andrew Jong - * (ajong@andrew.cmu.edu) - * @brief overrides the RobotInterface class to implement the PX4 flight control - * interface. - * @version 0.1 - * @date 2024-07-01 - * - * @copyright Copyright (c) 2024. This file is developed as part of software - * from the AirLab at the Robotics Institute at Carnegie Mellon University - * (https://theairlab.org). - * - */ -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace mavros_interface { - - class MAVROSInterface : public robot_interface::RobotInterface { - private: - // parameters - bool is_ardupilot; // TODO make this a launch file parameter - - bool is_state_received_ = false; - mavros_msgs::msg::State current_state_; - bool in_air = false; - rclcpp::Time in_air_start_time; - - // data from the flight control unit (FCU) - bool is_yaw_received_ = false; - float yaw_ = 0.0; - - rclcpp::CallbackGroup::SharedPtr service_callback_group; - rclcpp::Client::SharedPtr set_mode_client_; - rclcpp::Client::SharedPtr arming_client_; - rclcpp::Client::SharedPtr takeoff_client_; - - rclcpp::Publisher::SharedPtr attitude_target_pub_; - rclcpp::Publisher::SharedPtr local_position_target_pub_; - - rclcpp::Subscription::SharedPtr state_sub_; - rclcpp::Subscription::SharedPtr mavros_odometry_sub_; - - public: - MAVROSInterface() - : RobotInterface("mavros_interface"){ - // params - is_ardupilot = airstack::get_param(this, "is_ardupilot", false); - - // services - service_callback_group = this->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive); - set_mode_client_ = this->create_client("mavros/set_mode", - rmw_qos_profile_services_default, - service_callback_group); - arming_client_ = this->create_client("mavros/cmd/arming", - rmw_qos_profile_services_default, - service_callback_group); - takeoff_client_ = this->create_client("mavros/cmd/takeoff", - rmw_qos_profile_services_default, - service_callback_group); - - // publishers - attitude_target_pub_ = this->create_publisher("mavros/setpoint_raw/attitude", 1); - local_position_target_pub_ = this->create_publisher("mavros/setpoint_position/local", 1); - - // subscribers - state_sub_ = this->create_subscription("mavros/state", 1, - std::bind(&MAVROSInterface::state_callback, - this, std::placeholders::_1)); - } - - virtual ~MAVROSInterface() {} - - // Control Callbacks. Translates commands to fit the MAVROS API. - // The MAVROS API only has two types of control: Attitude Control and - // Position Control. - - void attitude_thrust_callback(const mav_msgs::msg::AttitudeThrust::SharedPtr cmd) override { - mavros_msgs::msg::AttitudeTarget mavros_cmd; - mavros_cmd.header.stamp = this->get_clock()->now(); //.to_msg(); - mavros_cmd.type_mask = mavros_msgs::msg::AttitudeTarget::IGNORE_ROLL_RATE | - mavros_msgs::msg::AttitudeTarget::IGNORE_PITCH_RATE | - mavros_msgs::msg::AttitudeTarget::IGNORE_YAW_RATE; - - mavros_cmd.thrust = cmd->thrust.z; - mavros_cmd.orientation = cmd->attitude; - - attitude_target_pub_->publish(mavros_cmd); - } - - void roll_pitch_yawrate_thrust_callback(const mav_msgs::msg::RollPitchYawrateThrust::SharedPtr cmd) override { - if (!is_yaw_received_) { - RCLCPP_ERROR(this->get_logger(), - "roll_pitch_yawrate_thrust command called but haven't yet " - "received drone current yaw"); - return; - } - - mavros_msgs::msg::AttitudeTarget mavros_cmd; - mavros_cmd.header.stamp = this->get_clock()->now(); //.to_msg(); - mavros_cmd.type_mask = mavros_msgs::msg::AttitudeTarget::IGNORE_ROLL_RATE | - mavros_msgs::msg::AttitudeTarget::IGNORE_PITCH_RATE; - tf2::Matrix3x3 m; - m.setRPY(cmd->roll, cmd->pitch, yaw_); - tf2::Quaternion q; - m.getRotation(q); - mavros_cmd.body_rate.z = cmd->yaw_rate; - mavros_cmd.thrust = cmd->thrust.z; - - mavros_cmd.orientation.x = q.x(); - mavros_cmd.orientation.y = q.y(); - mavros_cmd.orientation.z = q.z(); - mavros_cmd.orientation.w = q.w(); - - attitude_target_pub_->publish(mavros_cmd); - } - - void pose_callback(const geometry_msgs::msg::PoseStamped::SharedPtr cmd) override { - if(!is_ardupilot || (in_air && ((this->get_clock()->now() - in_air_start_time).seconds() > 5.))){ - geometry_msgs::msg::PoseStamped cmd_copy = *cmd; - local_position_target_pub_->publish(cmd_copy); - } - } - - // Command Functions - - bool request_control() override { - auto request = std::make_shared(); - if(is_ardupilot) - request->custom_mode = "GUIDED";//"OFFBOARD"; - else - request->custom_mode = "OFFBOARD"; - - auto result = set_mode_client_->async_send_request(request); - std::cout << "waiting rc" << std::endl; - result.wait(); - std::cout << "done rc" << std::endl; - - return result.get()->mode_sent; - } - - bool arm() override { - auto request = std::make_shared(); - request->value = true; - - auto result = arming_client_->async_send_request(request); - std::cout << "waiting arm" << std::endl; - result.wait(); - std::cout << "done arm" << std::endl; - - return result.get()->success; - } - - bool disarm() override { - bool success = false; - - auto request = std::make_shared(); - request->value = false; - - auto result = arming_client_->async_send_request(request); - std::cout << "waiting disarm" << std::endl; - result.wait(); - std::cout << "done disarm" << std::endl; - - return result.get()->success; - } - - bool is_armed() override { - return is_state_received_ && current_state_.armed; - } - - bool has_control() override { - return is_state_received_ && (is_ardupilot ? current_state_.mode == "GUIDED" : current_state_.mode == "OFFBOARD"); - } - - bool takeoff() override { - if(is_ardupilot){ - mavros_msgs::srv::CommandTOL::Request::SharedPtr takeoff_request = - std::make_shared(); - takeoff_request->altitude = 0.1; - - std::cout << "ardupilot takeoff 1" << std::endl; - auto takeoff_result = takeoff_client_->async_send_request(takeoff_request); - takeoff_result.wait(); - std::cout << "ardupilot takeoff 2" << std::endl; - if(takeoff_result.get()->success){ - in_air = true; - in_air_start_time = this->get_clock()->now(); - return true; - } - else - return false; - } - - return true; - } - - bool land() override { - - } - - void state_callback(const mavros_msgs::msg::State::SharedPtr msg) { - is_state_received_ = true; - current_state_ = *msg; - } - - }; -} -#include - -PLUGINLIB_EXPORT_CLASS(mavros_interface::MAVROSInterface, robot_interface::RobotInterface) - diff --git a/ros_ws/src/robot/autonomy/controls/px4_msgs b/ros_ws/src/robot/autonomy/controls/px4_msgs deleted file mode 160000 index 9e356516..00000000 --- a/ros_ws/src/robot/autonomy/controls/px4_msgs +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9e356516e3667ac32376f8781ed1e5fc43fe0b71 diff --git a/ros_ws/src/robot/autonomy/controls/px4_ros_com b/ros_ws/src/robot/autonomy/controls/px4_ros_com deleted file mode 160000 index 86e9aeb2..00000000 --- a/ros_ws/src/robot/autonomy/controls/px4_ros_com +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 86e9aeb20e55a4673fa8a9f1c29ea06a6c5ad1af diff --git a/ros_ws/src/robot/autonomy/controls/robot_interface/src/robot_interface_node.cpp b/ros_ws/src/robot/autonomy/controls/robot_interface/src/robot_interface_node.cpp deleted file mode 100644 index d0983c62..00000000 --- a/ros_ws/src/robot/autonomy/controls/robot_interface/src/robot_interface_node.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/** - * @file robot_interface_node.cpp - * @author John Keller (jkeller2@andrew.cmu.edu), Andrew Jong - * (ajong@andrew.cmu.edu) - * @brief main function for the robot interface node - * @version 0.1 - * @date 2024-07-01 - * - * @copyright Copyright (c) 2024. This file is developed as part of software - * from the AirLab at the Robotics Institute at Carnegie Mellon University - * (https://theairlab.org). - * - */ -#include -#include - -#include -#include -#include - -std::shared_ptr ri; - -rclcpp::Publisher::SharedPtr is_armed_pub; -rclcpp::Publisher::SharedPtr has_control_pub; - -void robot_command_callback(const std::shared_ptr request, - std::shared_ptr response){ - //response->sum = request->a + request->b; - switch(request->command){ - case airstack_msgs::srv::RobotCommand::Request::REQUEST_CONTROL: - response->success = ri->request_control(); - break; - case airstack_msgs::srv::RobotCommand::Request::ARM: - response->success = ri->arm(); - break; - case airstack_msgs::srv::RobotCommand::Request::DISARM: - response->success = ri->disarm(); - break; - case airstack_msgs::srv::RobotCommand::Request::TAKEOFF: - response->success = ri->takeoff(); - break; - case airstack_msgs::srv::RobotCommand::Request::LAND: - response->success = ri->land(); - break; - /* - case airstack_msgs::srv::RobotCommand::Request::SET_LOW_THRUST_MODE: - drone_interface->set_low_thrust_mode(true); - response->success = true; - break; - case airstack_msgs::srv::RobotCommand::Request::UNSET_LOW_THRUST_MODE: - drone_interface->set_low_thrust_mode(false); - response->success = true; - break; - */ - } -} - - -void attitude_thrust_callback(mav_msgs::msg::AttitudeThrust::SharedPtr msg){ - ri->attitude_thrust_callback(msg); -} - -void rate_thrust_callback(mav_msgs::msg::RateThrust::SharedPtr msg){ - ri->rate_thrust_callback(msg); -} - -void roll_pitch_yawrate_thrust_callback(mav_msgs::msg::RollPitchYawrateThrust::SharedPtr msg){ - ri->roll_pitch_yawrate_thrust_callback(msg); -} - -void torque_thrust_callback(mav_msgs::msg::TorqueThrust::SharedPtr msg){ - ri->torque_thrust_callback(msg); -} - -void velocity_callback(geometry_msgs::msg::TwistStamped::SharedPtr msg){ - ri->velocity_callback(msg); -} - -void pose_callback(geometry_msgs::msg::PoseStamped::SharedPtr msg){ - ri->pose_callback(msg); -} - -void timer_callback(){ - std_msgs::msg::Bool is_armed; - is_armed.data = ri->is_armed(); - is_armed_pub->publish(is_armed); - - std_msgs::msg::Bool has_control; - has_control.data = ri->has_control(); - has_control_pub->publish(has_control); -} - -rclcpp::Subscription::SharedPtr attitude_thrust_sub; -rclcpp::Subscription::SharedPtr rate_thrust_sub; -rclcpp::Subscription::SharedPtr roll_pitch_yawrate_thrust_sub; -rclcpp::Subscription::SharedPtr torque_thrust_sub; -rclcpp::Subscription::SharedPtr velocity_sub; -rclcpp::Subscription::SharedPtr pose_sub; - -int main(int argc, char** argv) -{ - rclcpp::init(argc, argv); - - // load the interface parameter - std::shared_ptr node = rclcpp::Node::make_shared("robot_interface_node"); - std::string interface = airstack::get_param(node, "interface", std::string("mavros_interface::MAVROSInterface")); - node.reset(); - - pluginlib::ClassLoader loader("robot_interface", "robot_interface::RobotInterface"); - - try{ - ri = loader.createSharedInstance("mavros_interface::MAVROSInterface"); - - // subscribers - attitude_thrust_sub = ri->create_subscription("attitude_thrust_command", 1, - attitude_thrust_callback); - rate_thrust_sub = ri->create_subscription("rate_thrust_command", 1, - rate_thrust_callback); - roll_pitch_yawrate_thrust_sub = ri->create_subscription("roll_pitch_yawrate_thrust_command", - 1, - roll_pitch_yawrate_thrust_callback); - torque_thrust_sub = ri->create_subscription("torque_thrust_command", 1, - torque_thrust_callback); - velocity_sub = ri->create_subscription("velocity_command", 1, - velocity_callback); - pose_sub = ri->create_subscription("pose_command", 1, - pose_callback); - - // publishers - is_armed_pub = ri->create_publisher("is_armed", 1); - has_control_pub = ri->create_publisher("has_control", 1); - - // services - rclcpp::Service::SharedPtr service = - ri->create_service("robot_command", &robot_command_callback); - - // timers - rclcpp::TimerBase::SharedPtr timer = rclcpp::create_timer(ri, ri->get_clock(), - rclcpp::Duration::from_seconds(1./20.), &timer_callback); - - rclcpp::executors::MultiThreadedExecutor executor; - executor.add_node(ri); - executor.spin(); - //rclcpp::spin(ri); - rclcpp::shutdown(); - } - catch(pluginlib::PluginlibException& ex){ - std::cout << "The plugin failed to load. Error: " << ex.what() << std::endl; - } - - return 0; -} diff --git a/ros_ws/src/robot/autonomy/controls/trajectory_controller/src/trajectory_controller.cpp b/ros_ws/src/robot/autonomy/controls/trajectory_controller/src/trajectory_controller.cpp deleted file mode 100644 index 607c326a..00000000 --- a/ros_ws/src/robot/autonomy/controls/trajectory_controller/src/trajectory_controller.cpp +++ /dev/null @@ -1,510 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -//#include -//#include -//#include -#include -#include -#include -#include -#include -#include - -//=================================================================================== -//----------------------------- Trajectory Control Node ----------------------------- -//=================================================================================== - -class TrajectoryControlNode : public rclcpp::Node { -private: - rclcpp::Subscription::SharedPtr traj_sub; - rclcpp::Subscription::SharedPtr traj_track_sub; - rclcpp::Subscription::SharedPtr odom_sub; - - rclcpp::Publisher::SharedPtr segment_pub; - rclcpp::Publisher::SharedPtr marker_vis_pub; - rclcpp::Publisher::SharedPtr segment_marker_vis_pub; - rclcpp::Publisher::SharedPtr tracking_point_pub; - rclcpp::Publisher::SharedPtr look_ahead_pub; - rclcpp::Publisher::SharedPtr drone_point_pub; - rclcpp::Publisher::SharedPtr virtual_tracking_point_pub; - rclcpp::Publisher::SharedPtr closest_point_pub; - rclcpp::Publisher::SharedPtr trajectory_completion_percentage_pub; - rclcpp::Publisher::SharedPtr trajectory_time_pub; - rclcpp::Publisher::SharedPtr tracking_error_pub; - rclcpp::Publisher::SharedPtr velocity_pub; - rclcpp::Publisher::SharedPtr debug_markers_pub; - - tf2_ros::TransformBroadcaster* tf_broadcaster; - tf2_ros::TransformListener* tf_listener; - tf2_ros::Buffer* tf_buffer; - - rclcpp::Service::SharedPtr traj_mode_srv; - - rclcpp::TimerBase::SharedPtr timer; - - nav_msgs::msg::Odometry odom; - bool got_odom; - - double target_dt; - std::string tf_prefix; - std::string target_frame; - int trajectory_mode; - Trajectory* trajectory; - double prev_time; - double virtual_time; - double actual_time; - airstack_msgs::msg::Odometry look_ahead_point, drone_point; - airstack_msgs::msg::Odometry virtual_tracking_point_odom; - airstack_msgs::msg::Odometry closest_point_odom; - double tracking_point_distance_limit; - double velocity_look_ahead_time; - double look_ahead_time; - double virtual_tracking_ahead_time; - double min_virtual_tracking_velocity; - double sphere_radius; - double ff_min_velocity; - double search_ahead_factor; - double prev_vtp_time; - float traj_vis_thickness; - float current_velocity; - float time_multiplier; - float transition_velocity_scale; - float transition_dt; - bool new_rewind; - float rewind_skip_max_velocity; - float rewind_skip_max_distance; - - vis::MarkerArray markers; - -public: - TrajectoryControlNode(); - void timer_callback(); - - void traj_callback(const airstack_msgs::msg::TrajectoryXYZVYaw::SharedPtr traj); - void traj_track_callback(const airstack_msgs::msg::TrajectoryXYZVYaw::SharedPtr traj); - void odom_callback(const nav_msgs::msg::Odometry::SharedPtr odom); - - void set_trajectory_mode(const std::shared_ptr req, - std::shared_ptr res); - - std::string mode; - float velocity_target; -}; - -TrajectoryControlNode::TrajectoryControlNode() - : rclcpp::Node("trajectory_control_node"){ - - // init params - target_dt = 1./airstack::get_param(this, "execute_target", 50.); - tf_prefix = airstack::get_param(this, "tf_prefix", std::string("")); - target_frame = airstack::get_param(this, "target_frame", std::string("world")); - tracking_point_distance_limit = airstack::get_param(this, "tracking_point_distance_limit", 0.5); - velocity_look_ahead_time = airstack::get_param(this, "velocity_look_ahead_time", 0.0); - look_ahead_time = airstack::get_param(this, "look_ahead_time", 1.0); - virtual_tracking_ahead_time = airstack::get_param(this, "virtual_tracking_ahead_time", 0.5); - min_virtual_tracking_velocity = airstack::get_param(this, "min_virtual_tracking_velocity", 0.3); - sphere_radius = airstack::get_param(this, "sphere_radius", 0.3); - ff_min_velocity = airstack::get_param(this, "ff_min_velocity", 0.4); - search_ahead_factor = airstack::get_param(this, "search_ahead_factor", 1.5); - transition_velocity_scale = airstack::get_param(this, "transition_velocity_scale", 1.0); - traj_vis_thickness = airstack::get_param(this, "traj_vis_thickness", 0.03); - rewind_skip_max_velocity = airstack::get_param(this, "rewind_skip_max_velocity", 0.1); - rewind_skip_max_distance = airstack::get_param(this, "rewind_skip_max_distance", 0.1); - got_odom = false; - - trajectory_mode = airstack_msgs::srv::TrajectoryMode::Request::ROBOT_POSE; - trajectory = new Trajectory(this, target_frame); - - // init subscribers - traj_sub = this->create_subscription("trajectory", 1, - std::bind(&TrajectoryControlNode::traj_callback, this, std::placeholders::_1)); - traj_track_sub = this->create_subscription("trajectory_track", 1, - std::bind(&TrajectoryControlNode::traj_track_callback, this, std::placeholders::_1)); - odom_sub = this->create_subscription("odometry", 1, - std::bind(&TrajectoryControlNode::odom_callback, this, std::placeholders::_1)); - - tf_broadcaster = new tf2_ros::TransformBroadcaster(*this); - tf_buffer = new tf2_ros::Buffer(this->get_clock()); - tf_listener = new tf2_ros::TransformListener(*tf_buffer); - - // init publishers - segment_pub = this->create_publisher("trajectory_segment", 1); - marker_vis_pub = this->create_publisher("trajectory_vis", 1); - segment_marker_vis_pub = this->create_publisher("trajectory_segment_vis", 1); - tracking_point_pub = this->create_publisher("tracking_point", 1); - look_ahead_pub = this->create_publisher("look_ahead", 1); - drone_point_pub = this->create_publisher("traj_drone_point", 1); - virtual_tracking_point_pub = this->create_publisher("virtual_tracking_point", 1); - closest_point_pub = this->create_publisher("closest_point", 1); - trajectory_completion_percentage_pub = this->create_publisher("trajectory_completion_percentage", 1); - trajectory_time_pub = this->create_publisher("trajectory_time", 1); - tracking_error_pub = this->create_publisher("tracking_error", 1); - velocity_pub = this->create_publisher("tracking_point_velocity_magnitude", 1); - debug_markers_pub = this->create_publisher("trajectory_controller_debug_markers", 1); - //broadcaster = new tf::TransformBroadcaster(); - //listener = new tf::TransformListener(); - - // init services - traj_mode_srv = this->create_service("set_trajectory_mode", - std::bind(&TrajectoryControlNode::set_trajectory_mode, this, - std::placeholders::_1, std::placeholders::_2)); - - // timers - timer = rclcpp::create_timer(this, this->get_clock(), rclcpp::Duration::from_seconds(1./20.), - std::bind(&TrajectoryControlNode::timer_callback, this)); - - virtual_time = 0; - actual_time = 0; - prev_time = 0; - virtual_tracking_point_odom.header.frame_id = target_frame; - virtual_tracking_point_odom.child_frame_id = target_frame; - look_ahead_point.header.frame_id = target_frame; - look_ahead_point.child_frame_id = target_frame; - drone_point.header.frame_id = target_frame; - drone_point.child_frame_id = target_frame; - current_velocity = 0.f; - time_multiplier = 1.f; - transition_dt = target_dt; - new_rewind = false; - - // init variables - prev_vtp_time=0; -} - -void TrajectoryControlNode::timer_callback(){ - static rclcpp::Time prev_execute_time = this->get_clock()->now(); - static rclcpp::Time curr_execute_time = this->get_clock()->now(); - curr_execute_time = this->get_clock()->now(); - double execute_elapsed = (curr_execute_time - prev_execute_time).seconds(); - prev_execute_time = curr_execute_time; - - if(got_odom){ - if(time_multiplier > 1.f) - time_multiplier = 1.f; - if(std::isnan(time_multiplier) || !std::isfinite(time_multiplier)){ - RCLCPP_INFO_STREAM(this->get_logger(), "time_multiplier was an invalid value: " << time_multiplier); - time_multiplier = 1.f; - } - - - // figure out what duration into the trajectory we are - rclcpp::Time now = this->get_clock()->now(); - tf2::Vector3 robot_point = tflib::to_tf(odom.pose.pose.position); - double tracking_error = tflib::to_tf(virtual_tracking_point_odom.pose.position).distance(robot_point); - std_msgs::msg::Float32 tracking_error_msg; - tracking_error_msg.data = tracking_error; - tracking_error_pub->publish(tracking_error_msg); - - // visualization - markers.overwrite(); - markers.add_sphere(target_frame, now, robot_point.x(), robot_point.y(), robot_point.z(), sphere_radius) - .set_color(0.f, 0.f, 1.f, 0.7f); - marker_vis_pub->publish(trajectory->get_markers(now, 1, 1, 0, 1, false, false, traj_vis_thickness)); - - // find closest point on entire trajectory - Waypoint closest_wp(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - nav_msgs::msg::Odometry closest_odom; - bool closest_valid = false;//trajectory->get_closest_waypoint(robot_point, 0, trajectory->get_duration(), &closest_wp); - if(closest_valid) - closest_valid = trajectory->get_odom(closest_wp.time(), &closest_point_odom, now); - //else - // ROS_INFO("CLOSEST NOT VALID"); - if(closest_valid) - closest_point_pub->publish(closest_point_odom); - - double current_virtual_ahead_time = 0.; - - if(trajectory_mode != airstack_msgs::srv::TrajectoryMode::Request::PAUSE){ - if(time_multiplier >= 1.f && - tflib::to_tf(virtual_tracking_point_odom.twist.linear).length() > min_virtual_tracking_velocity){ - if(new_rewind) - RCLCPP_INFO(this->get_logger(), "YO"); - // find closest point within time interval - Waypoint closest_ahead_wp(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - bool closest_ahead_valid = trajectory->get_closest_waypoint(robot_point, - virtual_time, prev_vtp_time + look_ahead_time, - &closest_ahead_wp); - if(closest_ahead_valid){ - virtual_time = closest_ahead_wp.time(); - - // visualization - markers.add_sphere(target_frame, now, closest_ahead_wp.x(), closest_ahead_wp.y(), closest_ahead_wp.z(), 0.025f) - .set_color(0.f, 1.f, 0.f); - - Waypoint vtp_wp(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - Waypoint end_wp(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - bool vtp_valid = trajectory->get_waypoint_sphere_intersection(virtual_time, search_ahead_factor*sphere_radius, - prev_vtp_time + look_ahead_time, robot_point, sphere_radius, - min_virtual_tracking_velocity, - &vtp_wp, &end_wp); - if(vtp_valid) - current_virtual_ahead_time = vtp_wp.time() - virtual_time; - - // visualization - if(vtp_valid) - markers.add_sphere(target_frame, now, vtp_wp.x(), vtp_wp.y(), vtp_wp.z(), 0.025f).set_color(0.f, 1.f, 0.f); - else - markers.add_sphere(target_frame, now, closest_ahead_wp.x(), closest_ahead_wp.y(), closest_ahead_wp.z()+sphere_radius, 0.025f).set_color(1.f, 0.f, 0.f); - markers.add_sphere(target_frame, now, end_wp.x(), end_wp.y(), end_wp.z(), 0.025f).set_color(0.f, 0.f, 1.f); - } - else - RCLCPP_INFO(this->get_logger(), "AHEAD NOT VALID"); - } - else{ - if(new_rewind){ - float before = virtual_time; - virtual_time = trajectory->get_skip_ahead_time(virtual_time, rewind_skip_max_velocity, rewind_skip_max_distance); - RCLCPP_INFO_STREAM(this->get_logger(), - "SKIPPED from " << before << " to " << virtual_time << " (" << (virtual_time - before) << ")"); - new_rewind = false; - } - virtual_time = std::min(trajectory->get_duration(), virtual_time + time_multiplier*execute_elapsed); - if(time_multiplier < 1.f){ - time_multiplier += transition_dt; - } - } - } - else if(trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::PAUSE){ - // don't update virtual_time - } - //*/ - - // get virtual tracking point - Waypoint virtual_wp(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - bool virtual_valid = trajectory->get_waypoint(virtual_time + current_virtual_ahead_time, - &virtual_wp); - if(virtual_valid){ - virtual_valid = trajectory->get_odom(virtual_wp.time(), &virtual_tracking_point_odom, now); - - // prevent oscillating between slow and normal mode - if(tflib::to_tf(virtual_tracking_point_odom.twist.linear).length() <= min_virtual_tracking_velocity) - virtual_time += current_virtual_ahead_time; - - float look_ahead_multiplier = 1.f; - if(trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::REWIND) - look_ahead_multiplier = -1.f; - trajectory->get_odom(virtual_wp.time() + look_ahead_multiplier*look_ahead_time, &look_ahead_point, now); - trajectory->get_odom(virtual_wp.time() , &drone_point, now); - actual_time = virtual_wp.time(); - prev_vtp_time = virtual_wp.time(); - } - else{ - RCLCPP_INFO_STREAM(this->get_logger(), "VIRTUAL IS NOT VALID"); - } - - if(trajectory->waypoint_count() <= 3){ - virtual_tracking_point_odom.twist.linear.x = 0; - virtual_tracking_point_odom.twist.linear.y = 0; - virtual_tracking_point_odom.twist.linear.z = 0; - } - //if(tflib::to_tf(virtual_tracking_point_odom.twist.linear).length() <= ff_min_velocity){ - if(tflib::to_tf(virtual_tracking_point_odom.twist.linear).length() <= min_virtual_tracking_velocity){ - virtual_tracking_point_odom.twist.linear.x = 0; - virtual_tracking_point_odom.twist.linear.y = 0; - virtual_tracking_point_odom.twist.linear.z = 0; - virtual_tracking_point_odom.acceleration.x = 0; - virtual_tracking_point_odom.acceleration.y = 0; - virtual_tracking_point_odom.acceleration.z = 0; - virtual_tracking_point_odom.jerk.x = 0; - virtual_tracking_point_odom.jerk.y = 0; - virtual_tracking_point_odom.jerk.z = 0; - } - - if(trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::ROBOT_POSE){ - virtual_tracking_point_odom.pose = odom.pose.pose; - virtual_tracking_point_odom.twist.linear.x = 0; - virtual_tracking_point_odom.twist.linear.y = 0; - virtual_tracking_point_odom.twist.linear.z = 0; - virtual_tracking_point_odom.twist.angular.x = 0; - virtual_tracking_point_odom.twist.angular.y = 0; - virtual_tracking_point_odom.twist.angular.z = 0; - virtual_tracking_point_odom.acceleration.x = 0; - virtual_tracking_point_odom.acceleration.y = 0; - virtual_tracking_point_odom.acceleration.z = 0; - virtual_tracking_point_odom.jerk.x = 0; - virtual_tracking_point_odom.jerk.y = 0; - virtual_tracking_point_odom.jerk.z = 0; - look_ahead_point = virtual_tracking_point_odom; - drone_point = look_ahead_point; - } - - virtual_tracking_point_odom.header.stamp = now; - look_ahead_point.header.stamp = now; - drone_point.header.stamp = now; - - if(trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::REWIND){ - look_ahead_point.twist.linear.x *= -1.f; - look_ahead_point.twist.linear.y *= -1.f; - look_ahead_point.twist.linear.z *= -1.f; - } - - if(time_multiplier >= -1.f && time_multiplier <= 1.f){ - virtual_tracking_point_odom.twist.linear.x *= time_multiplier; - virtual_tracking_point_odom.twist.linear.y *= time_multiplier; - virtual_tracking_point_odom.twist.linear.z *= time_multiplier; - } - - // When the tracking point reaches the end of the trajectory, the velocity gets set to zero - if(virtual_wp.time() >= trajectory->get_duration() || - trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::PAUSE){ - virtual_tracking_point_odom.twist.linear.x = 0; - virtual_tracking_point_odom.twist.linear.y = 0; - virtual_tracking_point_odom.twist.linear.z = 0; - virtual_tracking_point_odom.twist.angular.x = 0; - virtual_tracking_point_odom.twist.angular.y = 0; - virtual_tracking_point_odom.twist.angular.z = 0; - virtual_tracking_point_odom.acceleration.x = 0; - virtual_tracking_point_odom.acceleration.y = 0; - virtual_tracking_point_odom.acceleration.z = 0; - virtual_tracking_point_odom.jerk.x = 0; - virtual_tracking_point_odom.jerk.y = 0; - virtual_tracking_point_odom.jerk.z = 0; - - look_ahead_point.twist.linear.x = 0; - look_ahead_point.twist.linear.y = 0; - look_ahead_point.twist.linear.z = 0; - look_ahead_point.twist.angular.x = 0; - look_ahead_point.twist.angular.y = 0; - look_ahead_point.twist.angular.z = 0; - look_ahead_point.acceleration.x = 0; - look_ahead_point.acceleration.y = 0; - look_ahead_point.acceleration.z = 0; - look_ahead_point.jerk.x = 0; - look_ahead_point.jerk.y = 0; - look_ahead_point.jerk.z = 0; - drone_point = look_ahead_point; - } - - std_msgs::msg::Float32 velocity_msg; - velocity_msg.data = sqrt(virtual_tracking_point_odom.twist.linear.x*virtual_tracking_point_odom.twist.linear.x + - virtual_tracking_point_odom.twist.linear.y*virtual_tracking_point_odom.twist.linear.y + - virtual_tracking_point_odom.twist.linear.z*virtual_tracking_point_odom.twist.linear.z); - if(time_multiplier >= 1.f) - current_velocity = velocity_msg.data; - velocity_pub->publish(velocity_msg); - tracking_point_pub->publish(virtual_tracking_point_odom); - look_ahead_pub->publish(look_ahead_point); - drone_point_pub->publish(drone_point); - - // create a tf for the tracking point odom - tf2::Stamped vtp_tf = tflib::to_tf(virtual_tracking_point_odom); - geometry_msgs::msg::TransformStamped transform = tf2::toMsg(vtp_tf); - transform.child_frame_id = tf_prefix + "tracking_point"; - geometry_msgs::msg::TransformStamped transform_stabilized = tf2::toMsg(tflib::get_stabilized(vtp_tf)); - transform_stabilized.child_frame_id = tf_prefix + "/tracking_point_stabilized"; - tf_broadcaster->sendTransform(transform); - tf_broadcaster->sendTransform(transform_stabilized); - - // create a tf for the look ahead odom - tf2::Stamped la_tf = tflib::to_tf(look_ahead_point); - geometry_msgs::msg::TransformStamped look_ahead_transform = tf2::toMsg(la_tf); - look_ahead_transform.child_frame_id = tf_prefix + "look_ahead_point"; - geometry_msgs::msg::TransformStamped look_ahead_transform_stabilized = tf2::toMsg(tflib::get_stabilized(la_tf)); - look_ahead_transform_stabilized.child_frame_id = tf_prefix + "look_ahead_point_stabilized"; - - tf_broadcaster->sendTransform(look_ahead_transform); - tf_broadcaster->sendTransform(look_ahead_transform_stabilized); - - // publish completion percentage - std_msgs::msg::Float32 trajectory_completion_percentage; - trajectory_completion_percentage.data = virtual_time/trajectory->get_duration() * 100.f; - trajectory_completion_percentage_pub->publish(trajectory_completion_percentage); - - // publish current trajectory time - std_msgs::msg::Float32 trajectory_time; - trajectory_time.data = (trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::REWIND) - ? trajectory->get_duration() - virtual_time - : virtual_time; - trajectory_time_pub->publish(trajectory_time); - - // publish visualization - debug_markers_pub->publish(markers.get_marker_array()); - } - - new_rewind = false; -} - -void TrajectoryControlNode::set_trajectory_mode(const std::shared_ptr req, - std::shared_ptr res){ - int prev_trajectory_mode = trajectory_mode; - trajectory_mode = req->mode; - - if(trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::PAUSE){ - time_multiplier = 0.f; - } - if(trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::ROBOT_POSE){ - trajectory->clear(); - } - else if(trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::TRACK){ - trajectory->clear(); - } - else if(trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::SEGMENT){ - if(prev_trajectory_mode != airstack_msgs::srv::TrajectoryMode::Request::PAUSE && - prev_trajectory_mode != airstack_msgs::srv::TrajectoryMode::Request::REWIND && - prev_trajectory_mode != airstack_msgs::srv::TrajectoryMode::Request::SEGMENT){ - trajectory->clear(); - virtual_time = 0; - actual_time = 0; - } - if(prev_trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::REWIND){ - virtual_time = trajectory->get_duration() - actual_time; - actual_time = virtual_time; - prev_vtp_time = virtual_time; - *trajectory = trajectory->get_reversed_trajectory(); - - time_multiplier *= -1.f; - if(current_velocity != 0.f) - transition_dt = transition_velocity_scale/current_velocity*target_dt; - else - transition_dt = transition_velocity_scale/0.1f*target_dt; - } - } - else if(trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::REWIND){ - if(prev_trajectory_mode != airstack_msgs::srv::TrajectoryMode::Request::REWIND){ - virtual_time = trajectory->get_duration() - actual_time; - actual_time = virtual_time; - prev_vtp_time = virtual_time; - *trajectory = trajectory->get_reversed_trajectory(); - new_rewind = true; - - time_multiplier *= -1.f; - if(current_velocity != 0.f) - transition_dt = transition_velocity_scale/current_velocity*target_dt; - else - transition_dt = transition_velocity_scale/0.1f*target_dt; - } - } - - res->success = true; -} - -void TrajectoryControlNode::traj_callback(const airstack_msgs::msg::TrajectoryXYZVYaw::SharedPtr traj){ - if(trajectory_mode == airstack_msgs::srv::TrajectoryMode::Request::SEGMENT) - trajectory->merge(Trajectory(this, *traj), virtual_time); -} - -void TrajectoryControlNode::traj_track_callback(const airstack_msgs::msg::TrajectoryXYZVYaw::SharedPtr traj){ - virtual_time = 0; - trajectory->clear(); - trajectory->merge(Trajectory(this, *traj)); -} - -void TrajectoryControlNode::odom_callback(const nav_msgs::msg::Odometry::SharedPtr odom){ - //this->odom = odom; - if(tflib::transform_odometry(tf_buffer, *odom, target_frame, target_frame, &(this->odom))) - got_odom = true; -} - -int main(int argc, char** argv) -{ - rclcpp::init(argc, argv); - rclcpp::spin(std::make_shared()); - rclcpp::shutdown(); - return 0; -} diff --git a/ros_ws/src/robot/autonomy/install_geographiclib_datasets.sh b/ros_ws/src/robot/autonomy/install_geographiclib_datasets.sh deleted file mode 100644 index 65a9238e..00000000 --- a/ros_ws/src/robot/autonomy/install_geographiclib_datasets.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -# Script to install the model datasets required -# to GeographicLib apply certain conversions - -if [[ $UID != 0 ]]; then - echo "This script require root privileges!" 1>&2 - exit 1 -fi - -# Install datasets -run_get() { - local dir="$1" - local tool="$2" - local model="$3" - - files=$(shopt -s nullglob dotglob; echo /usr/share/GeographicLib/$dir/$model* /usr/local/share/GeographicLib/$dir/$model*) - if (( ${#files} )); then - echo "GeographicLib $tool dataset $model already exists, skipping" - return - fi - - echo "Installing GeographicLib $tool $model" - geographiclib-get-$tool $model >/dev/null 2>&1 - - files=$(shopt -s nullglob dotglob; echo /usr/share/GeographicLib/$dir/$model* /usr/local/share/GeographicLib/$dir/$model*) - if (( ! ${#files} )); then - echo "Error while installing GeographicLib $tool $model" - return - fi -} - -# check which command script is available -if hash geographiclib-get-geoids; then - run_get geoids geoids egm96-5 - run_get gravity gravity egm96 - run_get magnetic magnetic emm2015 -elif hash geographiclib-datasets-download; then # only allows install the goid model dataset - geographiclib-datasets-download egm96_5; -else - echo "OS not supported! Check GeographicLib page for supported OS and lib versions." 1>&2 -fi diff --git a/ros_ws/src/robot/autonomy/planning/global/behavior_executive/src/behavior_executive.cpp b/ros_ws/src/robot/autonomy/planning/global/behavior_executive/src/behavior_executive.cpp deleted file mode 100644 index 10d797cf..00000000 --- a/ros_ws/src/robot/autonomy/planning/global/behavior_executive/src/behavior_executive.cpp +++ /dev/null @@ -1,295 +0,0 @@ -#include - -BehaviorExecutive::BehaviorExecutive() - : Node("behavior_executive"){ - - // conditions - auto_takeoff_commanded_condition = new bt::Condition("Auto Takeoff Commanded", this); - takeoff_commanded_condition = new bt::Condition("Takeoff Commanded", this); - armed_condition = new bt::Condition("Armed", this); - offboard_mode_condition = new bt::Condition("Offboard Mode", this); - stationary_condition = new bt::Condition("Stationary", this); - land_commanded_condition = new bt::Condition("Land Commanded", this); - pause_commanded_condition = new bt::Condition("Pause Commanded", this); - rewind_commanded_condition = new bt::Condition("Rewind Commanded", this); - fixed_trajectory_condition = new bt::Condition("Fixed Trajectory Commanded", this); - explore_condition = new bt::Condition("Explore Commanded", this); - offboard_commanded_condition = new bt::Condition("Offboard Commanded", this); - arm_commanded_condition = new bt::Condition("Arm Commanded", this); - disarm_commanded_condition = new bt::Condition("Disarm Commanded", this); - conditions.push_back(auto_takeoff_commanded_condition); - conditions.push_back(takeoff_commanded_condition); - conditions.push_back(armed_condition); - conditions.push_back(offboard_mode_condition); - conditions.push_back(stationary_condition); - conditions.push_back(land_commanded_condition); - conditions.push_back(pause_commanded_condition); - conditions.push_back(rewind_commanded_condition); - conditions.push_back(fixed_trajectory_condition); - conditions.push_back(explore_condition); - conditions.push_back(offboard_commanded_condition); - conditions.push_back(arm_commanded_condition); - conditions.push_back(disarm_commanded_condition); - - // actions - arm_action = new bt::Action("Arm", this); - takeoff_action = new bt::Action("Takeoff", this); - land_action = new bt::Action("Land", this); - pause_action = new bt::Action("Pause", this); - rewind_action = new bt::Action("Rewind", this); - follow_fixed_trajectory_action = new bt::Action("Follow Fixed Trajectory", this); - explore_action = new bt::Action("Explore", this); - request_control_action = new bt::Action("Request Control", this); - disarm_action = new bt::Action("Disarm", this); - actions.push_back(arm_action); - actions.push_back(takeoff_action); - actions.push_back(land_action); - actions.push_back(pause_action); - actions.push_back(rewind_action); - actions.push_back(follow_fixed_trajectory_action); - actions.push_back(explore_action); - actions.push_back(request_control_action); - actions.push_back(disarm_action); - - - // subscribers - behavior_tree_commands_sub = - this->create_subscription("behavior_tree_commands", 1, - std::bind(&BehaviorExecutive::bt_commands_callback, - this, std::placeholders::_1)); - is_armed_sub = this->create_subscription("is_armed", 1, std::bind(&BehaviorExecutive::is_armed_callback, - this, std::placeholders::_1)); - has_control_sub = this->create_subscription("has_control", 1, std::bind(&BehaviorExecutive::has_control_callback, - this, std::placeholders::_1)); - - // publishers - - // services - service_callback_group = this->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive); - robot_command_client = this->create_client("robot_command", - rmw_qos_profile_services_default, - service_callback_group); - trajectory_mode_client = this->create_client("set_trajectory_mode", - rmw_qos_profile_services_default, - service_callback_group); - takeoff_landing_command_client = this->create_client("set_takeoff_landing_command", - rmw_qos_profile_services_default, - service_callback_group); - - - // timers - timer = rclcpp::create_timer(this, this->get_clock(), rclcpp::Duration::from_seconds(1./20.), - std::bind(&BehaviorExecutive::timer_callback, this)); -} - -void BehaviorExecutive::timer_callback(){ - //std::cout << "running" << std::endl; - - if(request_control_action->is_active()){ - if(request_control_action->active_has_changed()){ - airstack_msgs::srv::RobotCommand::Request::SharedPtr request = std::make_shared(); - request->command = airstack_msgs::srv::RobotCommand::Request::REQUEST_CONTROL; - - auto result = robot_command_client->async_send_request(request); - std::cout << "waiting be rc" << std::endl; - result.wait(); - std::cout << "done be rc" << std::endl; - if(result.get()->success) - request_control_action->set_success(); - else - request_control_action->set_failure(); - } - } - - if(arm_action->is_active()){ - if(arm_action->active_has_changed()){ - airstack_msgs::srv::RobotCommand::Request::SharedPtr request = std::make_shared(); - request->command = airstack_msgs::srv::RobotCommand::Request::ARM; - - auto result = robot_command_client->async_send_request(request); - std::cout << "waiting be arm" << std::endl; - result.wait(); - std::cout << "done be arm" << std::endl; - if(result.get()->success) - arm_action->set_success(); - else - arm_action->set_failure(); - } - } - - - if(disarm_action->is_active()){ - if(disarm_action->active_has_changed()){ - airstack_msgs::srv::RobotCommand::Request::SharedPtr request = std::make_shared(); - request->command = airstack_msgs::srv::RobotCommand::Request::DISARM; - - auto result = robot_command_client->async_send_request(request); - std::cout << "waiting be arm" << std::endl; - result.wait(); - std::cout << "done be arm" << std::endl; - if(result.get()->success) - disarm_action->set_success(); - else - disarm_action->set_failure(); - } - } - - if(takeoff_action->is_active()){ - //std::cout << "takeoff" << std::endl; - takeoff_action->set_running(); - if(takeoff_action->active_has_changed()){ - // put trajectory controller in track mode - airstack_msgs::srv::TrajectoryMode::Request::SharedPtr mode_request = - std::make_shared(); - mode_request->mode = airstack_msgs::srv::TrajectoryMode::Request::TRACK; - auto mode_result = trajectory_mode_client->async_send_request(mode_request); - std::cout << "mode 1" << std::endl; - mode_result.wait(); - std::cout << "mode 2" << std::endl; - - if(mode_result.get()->success){ - // send a takeoff command to ardupilot - // TODO clean up variable names - airstack_msgs::srv::RobotCommand::Request::SharedPtr request = std::make_shared(); - request->command = airstack_msgs::srv::RobotCommand::Request::TAKEOFF; - - auto result = robot_command_client->async_send_request(request); - std::cout << "waiting robot command takeoff" << std::endl; - result.wait(); - std::cout << "done robot command takeoff" << std::endl; - - // send the takeoff trajectory - if(result.get()->success){ - airstack_msgs::srv::TakeoffLandingCommand::Request::SharedPtr takeoff_request = - std::make_shared(); - takeoff_request->command = airstack_msgs::srv::TakeoffLandingCommand::Request::TAKEOFF; - auto takeoff_result = takeoff_landing_command_client->async_send_request(takeoff_request); - std::cout << "takeoff 1" << std::endl; - takeoff_result.wait(); - std::cout << "takeoff 2" << std::endl; - if(takeoff_result.get()->accepted) - takeoff_action->set_success(); - else - takeoff_action->set_failure(); - } - else - takeoff_action->set_failure(); - } - else - takeoff_action->set_failure(); - } - } - - if(land_action->is_active()){ - //std::cout << "land" << std::endl; - land_action->set_running(); - if(land_action->active_has_changed()){ - // put trajectory controller in track mode - airstack_msgs::srv::TrajectoryMode::Request::SharedPtr mode_request = - std::make_shared(); - mode_request->mode = airstack_msgs::srv::TrajectoryMode::Request::TRACK; - auto mode_result = trajectory_mode_client->async_send_request(mode_request); - std::cout << "mode 1" << std::endl; - mode_result.wait(); - std::cout << "mode 2" << std::endl; - - if(mode_result.get()->success){ - airstack_msgs::srv::TakeoffLandingCommand::Request::SharedPtr land_request = - std::make_shared(); - land_request->command = airstack_msgs::srv::TakeoffLandingCommand::Request::LAND; - auto land_result = takeoff_landing_command_client->async_send_request(land_request); - std::cout << "land 1" << std::endl; - land_result.wait(); - std::cout << "land 2" << std::endl; - if(land_result.get()->accepted) - land_action->set_success(); - else - land_action->set_failure(); - } - else - land_action->set_failure(); - } - } - - if(pause_action->is_active()){ - pause_action->set_running(); - if(pause_action->active_has_changed()){ - airstack_msgs::srv::TrajectoryMode::Request::SharedPtr mode_request = - std::make_shared(); - mode_request->mode = airstack_msgs::srv::TrajectoryMode::Request::PAUSE; - auto mode_result = trajectory_mode_client->async_send_request(mode_request); - mode_result.wait(); - } - } - - if(rewind_action->is_active()){ - rewind_action->set_running(); - if(rewind_action->active_has_changed()){ - airstack_msgs::srv::TrajectoryMode::Request::SharedPtr mode_request = - std::make_shared(); - mode_request->mode = airstack_msgs::srv::TrajectoryMode::Request::REWIND; - auto mode_result = trajectory_mode_client->async_send_request(mode_request); - mode_result.wait(); - } - } - - // follow fixed trajectory action - if(follow_fixed_trajectory_action->is_active()){ - follow_fixed_trajectory_action->set_running(); - - if(follow_fixed_trajectory_action->active_has_changed()){ - // put trajectory controller in track mode - airstack_msgs::srv::TrajectoryMode::Request::SharedPtr mode_request = - std::make_shared(); - mode_request->mode = airstack_msgs::srv::TrajectoryMode::Request::TRACK; - auto mode_result = trajectory_mode_client->async_send_request(mode_request); - std::cout << "mode 1" << std::endl; - mode_result.wait(); - std::cout << "mode 2" << std::endl; - } - } - - for(bt::Condition* condition : conditions) - condition->publish(); - for(bt::Action* action : actions) - action->publish(); -} - -// callbacks - -void BehaviorExecutive::bt_commands_callback(behavior_tree_msgs::msg::BehaviorTreeCommands msg){ - for(int i = 0; i < msg.commands.size(); i++){ - std::string condition_name = msg.commands[i].condition_name; - int status = msg.commands[i].status; - - for(int j = 0; j < conditions.size(); j++){ - bt::Condition* condition = conditions[j]; - if(condition_name == condition->get_label()){ - if(status == behavior_tree_msgs::msg::Status::SUCCESS) - condition->set(true); - else if(status == behavior_tree_msgs::msg::Status::FAILURE) - condition->set(false); - } - } - } -} - -void BehaviorExecutive::is_armed_callback(const std_msgs::msg::Bool::SharedPtr msg){ - armed_condition->set(msg->data); -} - -void BehaviorExecutive::has_control_callback(const std_msgs::msg::Bool::SharedPtr msg){ - offboard_mode_condition->set(msg->data); -} - -int main(int argc, char** argv){ - rclcpp::init(argc, argv); - std::shared_ptr node = std::make_shared(); - - rclcpp::executors::MultiThreadedExecutor executor; - executor.add_node(node); - executor.spin(); - rclcpp::shutdown(); - - return 0; -} diff --git a/ros_ws/src/robot/autonomy/planning/global/central/launch/ascent_drone.xml b/ros_ws/src/robot/autonomy/planning/global/central/launch/ascent_drone.xml deleted file mode 100644 index 629d2eb7..00000000 --- a/ros_ws/src/robot/autonomy/planning/global/central/launch/ascent_drone.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ros_ws/src/robot/autonomy/planning/global/central/launch/ascent_isaac_one_drone.xml b/ros_ws/src/robot/autonomy/planning/global/central/launch/ascent_isaac_one_drone.xml deleted file mode 100644 index 7f5742aa..00000000 --- a/ros_ws/src/robot/autonomy/planning/global/central/launch/ascent_isaac_one_drone.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/ros_ws/src/robot/autonomy/planning/global/central/launch/ascent_isaac_two_drones.xml b/ros_ws/src/robot/autonomy/planning/global/central/launch/ascent_isaac_two_drones.xml deleted file mode 100644 index 5a5b1a11..00000000 --- a/ros_ws/src/robot/autonomy/planning/global/central/launch/ascent_isaac_two_drones.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ros_ws/src/robot/autonomy/planning/global/central/launch/px4_gazebo.xml b/ros_ws/src/robot/autonomy/planning/global/central/launch/px4_gazebo.xml deleted file mode 100644 index 6f0f3a5a..00000000 --- a/ros_ws/src/robot/autonomy/planning/global/central/launch/px4_gazebo.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ros_ws/src/robot/autonomy/planning/global/central/launch/test.xml b/ros_ws/src/robot/autonomy/planning/global/central/launch/test.xml deleted file mode 100644 index 7ad29444..00000000 --- a/ros_ws/src/robot/autonomy/planning/global/central/launch/test.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/config/gui_config.yaml b/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/config/gui_config.yaml deleted file mode 100644 index 9922938d..00000000 --- a/ros_ws/src/robot/autonomy/planning/global/rqt_behavior_tree_command/config/gui_config.yaml +++ /dev/null @@ -1,28 +0,0 @@ -groups: - - Commands: - - Auto Takeoff: - condition_name: Auto Takeoff Commanded - - Takeoff: - condition_name: Takeoff Commanded - - Land: - condition_name: Land Commanded - - Pause: - condition_name: Pause Commanded - - Rewind: - condition_name: Rewind Commanded - - Return Home: - condition_name: Return Home Commanded - - Fixed Trajectory: - condition_name: Fixed Trajectory Commanded - - Topo Explore: - condition_name: Topo Explore Commanded - - Explore: - condition_name: Explore Commanded - - Autonomously Explore: - condition_name: Autonomously Explore Commanded - - Offboard: - condition_name: Offboard Commanded - - Arm: - condition_name: Arm Commanded - - Disarm: - condition_name: Disarm Commanded \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/launch/canary_takeoff_landing_planner.launch b/ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/launch/canary_takeoff_landing_planner.launch deleted file mode 100644 index 91272286..00000000 --- a/ros_ws/src/robot/autonomy/planning/global/takeoff_landing_planner/launch/canary_takeoff_landing_planner.launch +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/CMakeLists.txt b/ros_ws/src/robot/autonomy/planning/local/base_main_class/CMakeLists.txt deleted file mode 100644 index a71ca1e5..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/CMakeLists.txt +++ /dev/null @@ -1,80 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) -project(base) - -add_compile_options(-Wno-reorder -Wno-unused-parameter) - -find_package(catkin REQUIRED COMPONENTS - roscpp - std_msgs - nodelet -) - - -catkin_package( - INCLUDE_DIRS include - LIBRARIES base_node base_nodelet - CATKIN_DEPENDS roscpp std_msgs nodelet -) - -include_directories( - ${catkin_INCLUDE_DIRS} - include -) - -#============================================================================================ -# ---------------------------- Base Nodelet Library ----------------------------------------- -#============================================================================================ - -add_library(base_nodelet - src/Base.cpp - src/BaseNodelet.cpp - src/HealthMonitor.cpp -) - -add_dependencies(base_nodelet ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -target_link_libraries(base_nodelet - ${catkin_LIBRARIES} -) - -install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} -) - - -#target_link_libraries(base_nodelet ${catkin_LIBRARIES}) -#if(catkin_EXPORTED_LIBRARIES) -# add_dependencies(base_nodelet ${catkin_EXPORTED_LIBRARIES}) -#endif() - -#install(FILES base_nodelet.xml -#DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) - -#============================================================================================ -# ---------------------------- Base Node Library -------------------------------------------- -#============================================================================================ - -add_library(base_node - src/Base.cpp - src/BaseNode.cpp - src/HealthMonitor.cpp - src/main.cpp -) - -add_dependencies(base_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -target_link_libraries(base_node - ${catkin_LIBRARIES} -) - -install(TARGETS base_nodelet base_node - ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) - -install(DIRECTORY include/base/ - DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} - FILES_MATCHING PATTERN "*.h" - PATTERN ".svn" EXCLUDE -) - diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/LICENSE b/ros_ws/src/robot/autonomy/planning/local/base_main_class/LICENSE deleted file mode 100644 index b039fc08..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/LICENSE +++ /dev/null @@ -1,11 +0,0 @@ -Copyright 2020 Carnegie Mellon University - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/README.md b/ros_ws/src/robot/autonomy/planning/local/base_main_class/README.md deleted file mode 100644 index 5fb8cd90..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/README.md +++ /dev/null @@ -1,18 +0,0 @@ -This package contains the BaseNode and BaseNodelet classes which monitor the status of the process. All nodes and nodelets you create should inherit from these classes. - -For both nodes and nodelets three functions need to be implemented by derived classes: - -initialize(): This is where you should set up ROS related objects like publishers and subscribers and check for ROS parameters. - -execute(): This is where your main program logic should go. It gets called in a loop at a rate set by the execute_target parameter in your node’s namespace. - -~Destructor(): Do cleanup, like memory deallocation etc., in the destructor. - -For nodes, you also need to implement the BaseNode::get() function to return a pointer to an instance of your class derived from BaseNode. This is used by the main function to run your node. For nodelets, this is not necessary. They are started automatically. - -This package also contains a HealthMonitor class. This lets you time code's running time by calling tic("name") then toc("name"). When tic("name") is called for the first time, a ROS parameter with the name "name_target" is looked up which indicates what the target update rate for the code between tic and toc is. For now, a message is printed if the target rate is not achieved. - -An example implementation of a BaseNode can be found in the example_node package. -An example implementation of a BaseNodelet can be found in the example_nodelet package. - -Author: John Keller jkeller2@andrew.cmu.edu slack: kellerj diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/Base.h b/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/Base.h deleted file mode 100644 index 6a984ed3..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/Base.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef _BASE_H_ -#define _BASE_H_ - -#include -#include -#include "HealthMonitor.h" - -class Base{ - private: - bool failed_; - ros::Timer execute_timer; - - public: - HealthMonitor monitor; - - // These functions will be called by main, do health monitoring - // and call the dervied funtions below - bool _initialize(); - bool _execute(); - virtual ~Base(); - - void execute_timer_callback(const ros::TimerEvent& te); - - // These functions are implemented by the user - virtual bool initialize() = 0; - virtual bool execute() = 0; - - // Failing will stop execution and deinitialize - void fail(std::string reason); - - // Returns the name the user gave to the node/nodelet - std::string get_node_name(); - - // Get node handles. - ros::NodeHandle* get_node_handle(); - ros::NodeHandle* get_private_node_handle(); - - protected: - Base(std::string node_name); - - ros::NodeHandle* node_handle_; - ros::NodeHandle* private_node_handle_; - - std::string node_name_; - - // If this is true, the pure virtual deinitialize() function will not be - // called in _deinitialize(), since you can only catch the end of - // a nodelet by implementing its destructor. - bool is_nodelet_; -}; - - -#endif diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/BaseNode.h b/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/BaseNode.h deleted file mode 100644 index 0880aeec..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/BaseNode.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _BASE_NODE_H_ -#define _BASE_NODE_H_ - -#include -#include "Base.h" - -class BaseNode : public Base { - public: - // This will be implemented by a specific task and will return an instance of itself, it will be called by the main function - static BaseNode* get(); - - virtual ~BaseNode(); - - // Needed to call ros init - static int argc; - static char** argv; - - protected: - BaseNode(std::string node_name, bool anonymous=false); - - private: - bool anonymous_; -}; - - - -#endif diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/BaseNodelet.h b/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/BaseNodelet.h deleted file mode 100644 index 4d799c14..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/BaseNodelet.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _BASE_NODELET_H_ -#define _BASE_NODELET_H_ - -#include -#include -#include -#include "Base.h" - -class BaseNodelet : public Base, public nodelet::Nodelet { - public: - // This is inherited from nodelet::Nodelet - virtual void onInit(); - - protected: - BaseNodelet(std::string node_name); - ~BaseNodelet(); -}; - - -#endif diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/HealthMonitor.h b/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/HealthMonitor.h deleted file mode 100644 index 0ec4a2ab..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/include/base/HealthMonitor.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef _HEALTH_MONITOR_H_ -#define _HEALTH_MONITOR_H_ - -#include -#include -#include -#include - -class Base; //forward declaration - -// Struct for time logging. -struct time_info { - boost::chrono::time_point start; - int64_t elapsed, min_us, max_us; - uint64_t calls; - double target_hz; -}; - -class HealthMonitor { - private: - std::map times; - Base* base_; - - public: - HealthMonitor(Base* base); - - - //========================================================================================= - // ---------------------------- Time Measurement Functions -------------------------------- - //========================================================================================= - - void tic(std::string id); - int64_t toc(std::string id); - double get_target_hz(std::string id); - void print_time_statistics(); -}; - - -#endif diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/package.xml b/ros_ws/src/robot/autonomy/planning/local/base_main_class/package.xml deleted file mode 100644 index ca89dd11..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/package.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - base - 0.0.0 - The base package - - john - TODO - - catkin - roscpp - std_msgs - nodelet - - roscpp - std_msgs - nodelet - - - - diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/Base.cpp b/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/Base.cpp deleted file mode 100644 index 102372a4..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/Base.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include -#include "base/Base.h" -#include "base/HealthMonitor.h" -#include -#include - -Base::Base(std::string node_name) - : node_name_(node_name) - , monitor(this) - , is_nodelet_(false) - , failed_(false){ - -} - -Base::~Base(){ - monitor.print_time_statistics(); -} - -bool Base::_initialize(){ - // get the rate that execute should be called at - double execute_timer_rate; - bool found_param = get_private_node_handle()->getParam("execute_target", execute_timer_rate); - if(!found_param){ - ROS_FATAL_STREAM("The execute_target parameter was not set. Exiting."); - return false; - } - - if (execute_timer_rate <= 0.0){ - ROS_FATAL_STREAM("The execute_target parameter must be larger than 0.0, Exiting."); - return false; - } - - // call the derived class's initialize - bool status = initialize(); - if(!status){ - ROS_FATAL_STREAM("The initialize() function failed. Exiting."); - return false; - } - - // setup the execute timer - execute_timer = get_node_handle()->createTimer(ros::Duration(1./execute_timer_rate), - &Base::execute_timer_callback, this); - - return true; -} - -void Base::execute_timer_callback(const ros::TimerEvent& te){ - bool status = _execute(); - - if(!status){ - execute_timer.stop(); - - if(!is_nodelet_) - ros::shutdown(); - } -} - -bool Base::_execute(){ - monitor.tic("execute"); - bool status = execute(); - monitor.toc("execute"); - - return status && !failed_; -} - - -void Base::fail(std::string reason){ - ROS_FATAL_STREAM("Node " << get_node_name() << " has failed." << std::endl - << "Reason: " << reason); - - failed_ = true; -} - -std::string Base::get_node_name(){ - return ros::this_node::getName(); -} - - -ros::NodeHandle* Base::get_node_handle(){ - return node_handle_; -} - -ros::NodeHandle* Base::get_private_node_handle(){ - return private_node_handle_; -} diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/BaseNode.cpp b/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/BaseNode.cpp deleted file mode 100644 index d6a213ef..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/BaseNode.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include - -#include "base/BaseNode.h" - - -BaseNode::BaseNode(std::string node_name, bool anonymous) - : Base(node_name) - , anonymous_(anonymous){ - - // call ros init - if(anonymous_) - ros::init(argc, argv, node_name_, ros::init_options::AnonymousName | ros::init_options::NoSigintHandler); - else - ros::init(argc, argv, node_name_, ros::init_options::NoSigintHandler); - - // set up the node handles - node_handle_ = new ros::NodeHandle(); - private_node_handle_ = new ros::NodeHandle("~"); -} - -BaseNode::~BaseNode(){ - -} - -int BaseNode::argc = 0; -char** BaseNode::argv = NULL; diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/BaseNodelet.cpp b/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/BaseNodelet.cpp deleted file mode 100644 index f70f5263..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/BaseNodelet.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include -#include - -#include "base/BaseNodelet.h" - - -BaseNodelet::BaseNodelet(std::string node_name) - : Base(node_name){ - is_nodelet_ = true; -} - -BaseNodelet::~BaseNodelet(){ - -} - -void BaseNodelet::onInit(){ - node_handle_ = &getNodeHandle(); - private_node_handle_ = &getPrivateNodeHandle(); - _initialize(); -} diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/HealthMonitor.cpp b/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/HealthMonitor.cpp deleted file mode 100644 index 8c7aedf2..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/HealthMonitor.cpp +++ /dev/null @@ -1,82 +0,0 @@ -#include "base/HealthMonitor.h" - -#include - -#include - -#include "base/Base.h" - -HealthMonitor::HealthMonitor(Base* base) : base_(base) {} - -//========================================================================================= -// ---------------------------- Time Measurement Functions -------------------------------- -//========================================================================================= - -void HealthMonitor::tic(std::string id) { - // initialize time struct if tic is called for the first time on id - if (times.count(id) == 0) { - times[id].elapsed = 0; - times[id].calls = 0; - times[id].min_us = std::numeric_limits::max(); - times[id].max_us = std::numeric_limits::min(); - - base_->get_private_node_handle()->param(id + "_target", times[id].target_hz, -1); - } - - // log the current time - times[id].start = boost::chrono::system_clock::now(); -} - -int64_t HealthMonitor::toc(std::string id) { - // get elapsed time if tic has been called. - if (times.count(id) > 0) { - typedef boost::chrono::duration microseconds; - microseconds delta_us = boost::chrono::duration_cast( - boost::chrono::system_clock::now() - times[id].start); - int64_t count = delta_us.count(); - times[id].elapsed += count; - times[id].calls++; - times[id].min_us = std::min(count, times[id].min_us); - times[id].max_us = std::max(count, times[id].max_us); - - double hz = 1000000. / count; - bool is_hitting_target_hz = hz >= times[id].target_hz; - if (!is_hitting_target_hz) - ROS_ERROR_STREAM(std::setprecision(2) - << "execute function is not running fast enought." - << " Actual Hz: " << hz << " Target Hz: " << times[id].target_hz); - - return count; - } - - // otherwise return -1 - return -1; -} - -double HealthMonitor::get_target_hz(std::string id) { return times[id].target_hz; } - -void HealthMonitor::print_time_statistics() { - ROS_INFO_STREAM("Time Statistics for " << base_->get_node_name()); // node_name_); - int col_width = 15; - ROS_INFO_STREAM(std::setw(col_width) - << "Name" << std::setw(col_width) << "Avg Hz" << std::setw(col_width) - << "Target Hz" << std::setw(col_width) << "Avg ms" << std::setw(col_width) - << "Min ms" << std::setw(col_width) << "Max ms" << std::setw(col_width) - << "Calls"); - - for (std::map::iterator it = times.begin(); it != times.end(); it++) { - if (it->second.calls == 0) { - ROS_INFO_STREAM(it->first << ": toc(\"" << it->first << "\"); was never called"); - } else { - double average_elapsed = (double)it->second.elapsed / (double)it->second.calls; - double average_hz = 1000000. / average_elapsed; - ROS_INFO_STREAM(std::setprecision(2) - << std::setw(col_width) << it->first << std::setw(col_width) - << average_hz << std::setw(col_width) << it->second.target_hz - << std::setw(col_width) << average_elapsed / 1000. - << std::setw(col_width) << (double)it->second.min_us / 1000. - << std::setw(col_width) << (double)it->second.max_us / 1000. - << std::setw(col_width) << it->second.calls); - } - } -} diff --git a/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/main.cpp b/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/main.cpp deleted file mode 100644 index 9e2696ee..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/base_main_class/src/main.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "base/BaseNode.h" -#include -#include - -BaseNode* base_node; - -void interrupt_handler(int sig){ - delete base_node; - ros::shutdown(); -} - -int main(int argc, char** argv){ - BaseNode::argc = argc; - BaseNode::argv = argv; - base_node = BaseNode::get(); - - signal(SIGINT, interrupt_handler); - - if(base_node->_initialize()) - ros::spin(); - else - ROS_FATAL_STREAM("Node initialization failed. Exiting."); - - return 0; -} diff --git a/ros_ws/src/robot/autonomy/planning/local/core_map_representation_interface/CMakeLists.txt b/ros_ws/src/robot/autonomy/planning/local/core_map_representation_interface/CMakeLists.txt deleted file mode 100644 index f1d6d174..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/core_map_representation_interface/CMakeLists.txt +++ /dev/null @@ -1,66 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(core_map_representation_interface) - -# Find dependencies -find_package(ament_cmake REQUIRED) -find_package(airstack_msgs REQUIRED) -find_package(geometry_msgs REQUIRED) -find_package(nav_msgs REQUIRED) -find_package(pluginlib REQUIRED) -find_package(rclcpp REQUIRED) -find_package(rclpy REQUIRED) -find_package(sensor_msgs REQUIRED) -find_package(std_msgs REQUIRED) -find_package(tf2 REQUIRED) -find_package(tf2_ros REQUIRED) -find_package(visualization_msgs REQUIRED) - -# Include directories -include_directories( - include - ${ament_INCLUDE_DIRS} -) - -add_library(core_map_representation_interface INTERFACE) - -ament_export_targets(core_map_representation_interfaceTargets HAS_LIBRARY_TARGET) -#ament_export_include_directories(include) -ament_export_dependencies( - airstack_msgs - geometry_msgs - nav_msgs - pluginlib - rclcpp - rclpy - sensor_msgs - std_msgs - tf2 - tf2_ros - visualization_msgs -) -install( - TARGETS core_map_representation_interface - EXPORT core_map_representation_interfaceTargets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin - INCLUDES DESTINATION include -) -# Install include files -install( - DIRECTORY include/${PROJECT_NAME}/ - DESTINATION include/${PROJECT_NAME} - FILES_MATCHING PATTERN "*.h" -) - -# Install Python scripts (if you have any)### -# install(PROGRAMS -# scripts/your_python_script.py -# DESTINATION lib/${PROJECT_NAME} -# ) - - -# Export dependencies - - -ament_package() diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/CMakeLists.txt b/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/CMakeLists.txt deleted file mode 100644 index d3b17812..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/CMakeLists.txt +++ /dev/null @@ -1,100 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(disparity_map_representation) - -find_package(ament_cmake REQUIRED) - -find_package(airstack_common REQUIRED) -find_package(airstack_msgs REQUIRED) -find_package(core_map_representation_interface REQUIRED) -find_package(cv_bridge REQUIRED) -find_package(disparity_graph REQUIRED) -find_package(geometry_msgs REQUIRED) -find_package(image_geometry REQUIRED) -find_package(image_transport REQUIRED) -find_package(nav_msgs REQUIRED) -find_package(pcl_msgs REQUIRED) -find_package(pluginlib REQUIRED) -find_package(rclcpp REQUIRED) -find_package(rclpy REQUIRED) -find_package(sensor_msgs REQUIRED) -find_package(std_msgs REQUIRED) -find_package(stereo_msgs REQUIRED) -find_package(tf2 REQUIRED) -find_package(tf2_eigen REQUIRED) -find_package(tf2_geometry_msgs REQUIRED) -find_package(tf2_ros REQUIRED) -find_package(visualization_msgs REQUIRED) - -ament_export_include_directories(include) -ament_export_libraries(disparity_graph) - -include_directories( - ${ament_INCLUDE_DIRS} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${core_map_representation_interface_INCLUDE_DIRS} - ${disparity_graph_INCLUDE_DIRS} - ${pluginlib_INCLUDE_DIRS} - - # ${CMAKE_CURRENT_SOURCE_DIR}/include -) - -add_library(disparity_map_representation - src/disparity_map_representation.cpp -) - -target_link_libraries(disparity_map_representation - disparity_graph - ${pluginlib_LIBRARIES} # Ensure this variable is set correctly -) - -ament_target_dependencies(disparity_map_representation - airstack_common - airstack_msgs - core_map_representation_interface - cv_bridge - disparity_graph - pluginlib - rclcpp - tf2 - tf2_ros -) - -ament_export_targets(disparity_map_representationTargets HAS_LIBRARY_TARGET) -ament_export_dependencies(rclcpp - airstack_common - airstack_msgs - core_map_representation_interface - cv_bridge - disparity_graph - pluginlib - tf2 - tf2_ros -) - -install( - TARGETS disparity_map_representation - EXPORT disparity_map_representationTargets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin - INCLUDES DESTINATION include -) - -# install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) -install(FILES package.xml - DESTINATION share/${PROJECT_NAME} -) -target_link_libraries(disparity_map_representation - ${disparity_graph_LIBRARIES} -) - -# ament_export_include_directories(include) -# ament_export_libraries(disparity_map_representation) -# ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET) -install( - DIRECTORY include/${PROJECT_NAME}/ - DESTINATION include/${PROJECT_NAME} - FILES_MATCHING PATTERN "*.h" -) - -ament_package() diff --git a/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/disparity_map_representation_plugin.xml b/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/disparity_map_representation_plugin.xml deleted file mode 100644 index a261b304..00000000 --- a/ros_ws/src/robot/autonomy/planning/local/disparity_map_representation/disparity_map_representation_plugin.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - Disparity map representation plugin. - - diff --git a/ros_ws/src/robot/logging/logging_bringup/CMakeLists.txt b/ros_ws/src/robot/logging/logging_bringup/CMakeLists.txt new file mode 100644 index 00000000..2312ed6e --- /dev/null +++ b/ros_ws/src/robot/logging/logging_bringup/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.8) +project(logging_bringup) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +# uncomment the following section in order to fill in +# further dependencies manually. +# find_package( REQUIRED) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +# Install files. +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY rviz DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +# install(DIRECTORY params DESTINATION share/${PROJECT_NAME}) + +ament_package() diff --git a/ros_ws/src/robot/logging/logging_bringup/LICENSE b/ros_ws/src/robot/logging/logging_bringup/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/ros_ws/src/robot/logging/logging_bringup/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ros_ws/src/robot/logging/logging_bringup/launch/logging.launch.xml b/ros_ws/src/robot/logging/logging_bringup/launch/logging.launch.xml new file mode 100644 index 00000000..a62ec22a --- /dev/null +++ b/ros_ws/src/robot/logging/logging_bringup/launch/logging.launch.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ros_ws/src/robot/logging/logging_bringup/package.xml b/ros_ws/src/robot/logging/logging_bringup/package.xml new file mode 100644 index 00000000..0dc09699 --- /dev/null +++ b/ros_ws/src/robot/logging/logging_bringup/package.xml @@ -0,0 +1,18 @@ + + + + logging_bringup + 0.0.0 + TODO: Package description + andrew + Apache-2.0 + + ament_cmake + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/ros_ws/src/robot/robot_bringup/CMakeLists.txt b/ros_ws/src/robot/robot_bringup/CMakeLists.txt index 7f506e7f..d62c02dd 100644 --- a/ros_ws/src/robot/robot_bringup/CMakeLists.txt +++ b/ros_ws/src/robot/robot_bringup/CMakeLists.txt @@ -26,6 +26,7 @@ endif() # Install files. install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) install(DIRECTORY rviz DESTINATION share/${PROJECT_NAME}) +install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) install(DIRECTORY params DESTINATION share/${PROJECT_NAME}) ament_package() diff --git a/ros_ws/src/robot/autonomy/planning/global/central/config/core.perspective b/ros_ws/src/robot/robot_bringup/config/core.perspective similarity index 71% rename from ros_ws/src/robot/autonomy/planning/global/central/config/core.perspective rename to ros_ws/src/robot/robot_bringup/config/core.perspective index 9d5307ce..7f8dac35 100644 --- a/ros_ws/src/robot/autonomy/planning/global/central/config/core.perspective +++ b/ros_ws/src/robot/robot_bringup/config/core.perspective @@ -4,14 +4,14 @@ "mainwindow": { "keys": { "geometry": { - "repr(QByteArray.hex)": "QtCore.QByteArray(b'01d9d0cb000300000000005500000268000009ff0000059e000000550000028d000009ff0000059e00000000000000000a00000000550000028d000009ff0000059e')", + "repr(QByteArray.hex)": "QtCore.QByteArray(b'01d9d0cb00030000000008490000015c00000fc800000492000008490000018100000fc80000049200000000000000000a00000008490000018100000fc800000492')", "type": "repr(QByteArray.hex)", - "pretty-print": " U h U U " + "pretty-print": " I \\ I I " }, "state": { - "repr(QByteArray.hex)": "QtCore.QByteArray(b'000000ff00000000fd0000000100000003000009ab000002e8fc0100000002fc00000000000009ab0000062100fffffffc0200000002fb00000042007200710074005f006200650068006100760069006f0072005f0074007200650065005f005f005000790043006f006e0073006f006c0065005f005f0031005f005f0100000014000000fe0000004a00fffffffc00000118000001e4000001e400fffffffc0100000002fb00000072007200710074005f006200650068006100760069006f0072005f0074007200650065005f0063006f006d006d0061006e0064005f005f004200650068006100760069006f007200540072006500650043006f006d006d0061006e00640050006c007500670069006e005f005f0031005f005f010000000000000763000004ac00fffffffb0000007a007200710074005f00660069007800650064005f007400720061006a006500630074006f00720079005f00670065006e0065007200610074006f0072005f005f00460069007800650064005400720061006a006500630074006f0072007900470065006e0065007200610074006f0072005f005f0031005f005f0100000769000002420000016f00fffffffb0000007a007200710074005f00660069007800650064005f007400720061006a006500630074006f00720079005f00670065006e0065007200610074006f0072005f005f00460069007800650064005400720061006a006500630074006f0072007900470065006e0065007200610074006f0072005f005f0031005f005f01000004b20000007e0000000000000000000009ab0000000000000004000000040000000800000008fc00000001000000030000000100000036004d0069006e0069006d0069007a006500640044006f0063006b00570069006400670065007400730054006f006f006c0062006100720000000000ffffffff0000000000000000')", + "repr(QByteArray.hex)": "QtCore.QByteArray(b'000000ff00000000fd000000010000000300000780000002e8fc0100000002fc0000000000000780000003d200fffffffc0200000002fb00000042007200710074005f006200650068006100760069006f0072005f0074007200650065005f005f005000790043006f006e0073006f006c0065005f005f0031005f005f0100000014000000fe0000004a00fffffffc00000118000001e4000001e400fffffffc0100000002fb00000072007200710074005f006200650068006100760069006f0072005f0074007200650065005f0063006f006d006d0061006e0064005f005f004200650068006100760069006f007200540072006500650043006f006d006d0061006e00640050006c007500670069006e005f005f0031005f005f0100000000000005ba0000025d00fffffffb0000007a007200710074005f00660069007800650064005f007400720061006a006500630074006f00720079005f00670065006e0065007200610074006f0072005f005f00460069007800650064005400720061006a006500630074006f0072007900470065006e0065007200610074006f0072005f005f0031005f005f01000005c0000001c00000016f00fffffffb0000007a007200710074005f00660069007800650064005f007400720061006a006500630074006f00720079005f00670065006e0065007200610074006f0072005f005f00460069007800650064005400720061006a006500630074006f0072007900470065006e0065007200610074006f0072005f005f0031005f005f01000004b20000007e0000000000000000000007800000000000000004000000040000000800000008fc00000001000000030000000100000036004d0069006e0069006d0069007a006500640044006f0063006b00570069006400670065007400730054006f006f006c0062006100720000000000ffffffff0000000000000000')", "type": "repr(QByteArray.hex)", - "pretty-print": " ! J rrqt_behavior_tree_command__BehaviorTreeCommandPlugin__1__ zrqt_fixed_trajectory_generator__FixedTrajectoryGenerator__1__ zrqt_fixed_trajectory_generator__FixedTrajectoryGenerator__1__ 6MinimizedDockWidgetsToolbar " + "pretty-print": " J rrqt_behavior_tree_command__BehaviorTreeCommandPlugin__1__ zrqt_fixed_trajectory_generator__FixedTrajectoryGenerator__1__ zrqt_fixed_trajectory_generator__FixedTrajectoryGenerator__1__ 6MinimizedDockWidgetsToolbar " } }, "groups": { @@ -79,7 +79,7 @@ "plugin": { "keys": { "config_filename": { - "repr": "'/extras/ros_ws/install/rqt_behavior_tree_command/share/rqt_behavior_tree_command/config/gui_config.yaml'", + "repr": "'/root/AirStack/ros_ws/install/rqt_behavior_tree_command/share/rqt_behavior_tree_command/config/gui_config.yaml'", "type": "repr" } }, @@ -110,7 +110,7 @@ "plugin": { "keys": { "attribute_settings": { - "repr": "b'\\x80\\x04\\x95.\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x0bcollections\\x94\\x8c\\x0bOrderedDict\\x94\\x93\\x94)R\\x94(\\x8c\\x07Figure8\\x94}\\x94(\\x8c\\x08frame_id\\x94\\x8c\\tbase_link\\x94\\x8c\\x08velocity\\x94\\x8c\\x030.2\\x94\\x8c\\x10max_acceleration\\x94\\x8c\\x030.1\\x94\\x8c\\x06length\\x94\\x8c\\x015\\x94\\x8c\\x05width\\x94\\x8c\\x013\\x94\\x8c\\x06height\\x94\\x8c\\x010\\x94u\\x8c\\tRacetrack\\x94}\\x94(\\x8c\\x08frame_id\\x94\\x8c\\tbase_link\\x94\\x8c\\x08velocity\\x94\\x8c\\x030.2\\x94\\x8c\\x10max_acceleration\\x94\\x8c\\x030.1\\x94\\x8c\\x06length\\x94\\x8c\\x015\\x94\\x8c\\x05width\\x94\\x8c\\x013\\x94\\x8c\\x06height\\x94\\x8c\\x010\\x94u\\x8c\\x06Circle\\x94}\\x94(\\x8c\\x08frame_id\\x94\\x8c\\tbase_link\\x94\\x8c\\x08velocity\\x94\\x8c\\x030.2\\x94\\x8c\\x06radius\\x94\\x8c\\x012\\x94u\\x8c\\x04Line\\x94}\\x94(\\x8c\\x08frame_id\\x94\\x8c\\tbase_link\\x94\\x8c\\x08velocity\\x94\\x8c\\x030.2\\x94\\x8c\\x10max_acceleration\\x94\\x8c\\x030.1\\x94\\x8c\\x06length\\x94\\x8c\\x012\\x94\\x8c\\x05width\\x94\\x8c\\x010\\x94\\x8c\\x06height\\x94\\x8c\\x010\\x94u\\x8c\\x05Point\\x94}\\x94(\\x8c\\x08frame_id\\x94\\x8c\\tbase_link\\x94\\x8c\\x08velocity\\x94\\x8c\\x030.2\\x94\\x8c\\x10max_acceleration\\x94\\x8c\\x030.1\\x94\\x8c\\x01x\\x94\\x8c\\x010\\x94\\x8c\\x01y\\x94\\x8c\\x010\\x94\\x8c\\x06height\\x94\\x8c\\x010\\x94uu.'", + "repr": "b'\\x80\\x04\\x95*\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x8c\\x0bcollections\\x94\\x8c\\x0bOrderedDict\\x94\\x93\\x94)R\\x94(\\x8c\\x07Figure8\\x94}\\x94(\\x8c\\x08frame_id\\x94\\x8c\\tbase_link\\x94\\x8c\\x08velocity\\x94\\x8c\\x012\\x94\\x8c\\x10max_acceleration\\x94\\x8c\\x012\\x94\\x8c\\x06length\\x94\\x8c\\x015\\x94\\x8c\\x05width\\x94\\x8c\\x013\\x94\\x8c\\x06height\\x94\\x8c\\x010\\x94u\\x8c\\tRacetrack\\x94}\\x94(\\x8c\\x08frame_id\\x94\\x8c\\tbase_link\\x94\\x8c\\x08velocity\\x94\\x8c\\x030.2\\x94\\x8c\\x10max_acceleration\\x94\\x8c\\x030.1\\x94\\x8c\\x06length\\x94\\x8c\\x015\\x94\\x8c\\x05width\\x94\\x8c\\x013\\x94\\x8c\\x06height\\x94\\x8c\\x010\\x94u\\x8c\\x06Circle\\x94}\\x94(\\x8c\\x08frame_id\\x94\\x8c\\tbase_link\\x94\\x8c\\x08velocity\\x94\\x8c\\x030.2\\x94\\x8c\\x06radius\\x94\\x8c\\x012\\x94u\\x8c\\x04Line\\x94}\\x94(\\x8c\\x08frame_id\\x94\\x8c\\tbase_link\\x94\\x8c\\x08velocity\\x94\\x8c\\x030.2\\x94\\x8c\\x10max_acceleration\\x94\\x8c\\x030.1\\x94\\x8c\\x06length\\x94\\x8c\\x012\\x94\\x8c\\x05width\\x94\\x8c\\x010\\x94\\x8c\\x06height\\x94\\x8c\\x010\\x94u\\x8c\\x05Point\\x94}\\x94(\\x8c\\x08frame_id\\x94\\x8c\\tbase_link\\x94\\x8c\\x08velocity\\x94\\x8c\\x030.2\\x94\\x8c\\x10max_acceleration\\x94\\x8c\\x030.1\\x94\\x8c\\x01x\\x94\\x8c\\x010\\x94\\x8c\\x01y\\x94\\x8c\\x010\\x94\\x8c\\x06height\\x94\\x8c\\x010\\x94uu.'", "type": "repr" }, "config_filename": { diff --git a/ros_ws/src/robot/robot_bringup/config/core.rviz b/ros_ws/src/robot/robot_bringup/config/core.rviz new file mode 100644 index 00000000..645d54e6 --- /dev/null +++ b/ros_ws/src/robot/robot_bringup/config/core.rviz @@ -0,0 +1,348 @@ +Panels: + - Class: rviz_common/Displays + Help Height: 78 + Name: Displays + Property Tree Widget: + Expanded: + - /Global Options1 + - /TF1/Frames1 + - /Odometry1/Topic1 + Splitter Ratio: 0.48235294222831726 + Tree Height: 752 + - Class: rviz_common/Selection + Name: Selection + - Class: rviz_common/Tool Properties + Expanded: + - /2D Goal Pose1 + - /Publish Point1 + Name: Tool Properties + Splitter Ratio: 0.5886790156364441 + - Class: rviz_common/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 + - Class: rviz_common/Time + Experimental: false + Name: Time + SyncMode: 0 + SyncSource: Lidar +Visualization Manager: + Class: "" + Displays: + - Alpha: 0.5 + Cell Size: 1 + Class: rviz_default_plugins/Grid + Color: 160; 160; 164 + Enabled: true + Line Style: + Line Width: 0.029999999329447746 + Value: Lines + Name: Grid + Normal Cell Count: 0 + Offset: + X: 0 + Y: 0 + Z: 0 + Plane: XY + Plane Cell Count: 10 + Reference Frame: + Value: true + - Class: rviz_default_plugins/TF + Enabled: true + Frame Timeout: 15 + Frames: + All Enabled: true + base_link: + Value: true + base_link_frd: + Value: true + base_link_stabilized: + Value: true + front_stereo: + Value: true + left_camera: + Value: true + look_ahead_point: + Value: true + look_ahead_point_stabilized: + Value: true + map: + Value: true + map_FLU: + Value: true + map_ned: + Value: true + odom: + Value: true + odom_ned: + Value: true + ouster: + Value: true + right_camera: + Value: true + tracking_point: + Value: true + tracking_point_stabilized: + Value: true + world: + Value: true + Marker Scale: 1 + Name: TF + Show Arrows: true + Show Axes: true + Show Names: true + Tree: + world: + map_FLU: + map: + base_link: + base_link_frd: + {} + front_stereo: + left_camera: + {} + right_camera: + {} + ouster: + {} + base_link_stabilized: + {} + look_ahead_point: + {} + look_ahead_point_stabilized: + {} + map_ned: + {} + tracking_point: + {} + tracking_point_stabilized: + {} + Update Interval: 0 + Value: true + - Class: rviz_default_plugins/MarkerArray + Enabled: true + Name: Traj Vis + Namespaces: + trajectory_0: true + Topic: + Depth: 5 + Durability Policy: Volatile + History Policy: Keep Last + Reliability Policy: Reliable + Value: trajectory_controller/trajectory_vis + Value: true + - Class: rviz_default_plugins/MarkerArray + Enabled: true + Name: Traj Debug + Namespaces: + default: true + Topic: + Depth: 5 + Durability Policy: Volatile + History Policy: Keep Last + Reliability Policy: Reliable + Value: trajectory_controller/trajectory_controller_debug_markers + Value: true + - Angle Tolerance: 0 + Class: rviz_default_plugins/Odometry + Covariance: + Orientation: + Alpha: 0.5 + Color: 255; 255; 127 + Color Style: Unique + Frame: Local + Offset: 1 + Scale: 1 + Value: true + Position: + Alpha: 0.30000001192092896 + Color: 204; 51; 204 + Scale: 1 + Value: true + Value: true + Enabled: true + Keep: 1 + Name: Odometry + Position Tolerance: 0 + Shape: + Alpha: 1 + Axes Length: 1 + Axes Radius: 0.10000000149011612 + Color: 255; 25; 0 + Head Length: 0.30000001192092896 + Head Radius: 0.10000000149011612 + Shaft Length: 1 + Shaft Radius: 0.05000000074505806 + Value: Axes + Topic: + Depth: 5 + Durability Policy: Volatile + Filter size: 10 + History Policy: Keep Last + Reliability Policy: Reliable + Value: odometry_conversion/odometry + Value: true + - Class: rviz_default_plugins/Marker + Enabled: true + Name: VDB Mapping Marker + Namespaces: + "": true + Topic: + Depth: 5 + Durability Policy: Volatile + Filter size: 10 + History Policy: Keep Last + Reliability Policy: Reliable + Value: /robot_1/vdb_mapping/vdb_map_visualization + Value: true + - Alpha: 1 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 6.571824073791504 + Min Value: -0.5682187080383301 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz_default_plugins/PointCloud2 + Color: 170; 170; 255 + Color Transformer: FlatColor + Decay Time: 0 + Enabled: true + Invert Rainbow: false + Max Color: 255; 255; 255 + Max Intensity: 4096 + Min Color: 0; 0; 0 + Min Intensity: 0 + Name: Lidar + Position Transformer: XYZ + Selectable: true + Size (Pixels): 1 + Size (m): 0.009999999776482582 + Style: Points + Topic: + Depth: 5 + Durability Policy: Volatile + Filter size: 10 + History Policy: Keep Last + Reliability Policy: Reliable + Value: /robot_1/sensors/ouster/point_cloud + Use Fixed Frame: true + Use rainbow: true + Value: true + - Class: rviz_default_plugins/Image + Enabled: true + Max Value: 100 + Median window: 5 + Min Value: 0 + Name: Front Left Depth + Normalize Range: false + Topic: + Depth: 5 + Durability Policy: Volatile + History Policy: Keep Last + Reliability Policy: Reliable + Value: /robot_1/sensors/front_stereo/left/depth + Value: true + - Class: rviz_default_plugins/Image + Enabled: true + Max Value: 1 + Median window: 5 + Min Value: 0 + Name: Front Left RGB + Normalize Range: true + Topic: + Depth: 5 + Durability Policy: Volatile + History Policy: Keep Last + Reliability Policy: Reliable + Value: sensors/front_stereo/left/image_rect + Value: true + Enabled: true + Global Options: + Background Color: 48; 48; 48 + Fixed Frame: world + Frame Rate: 30 + Name: root + Tools: + - Class: rviz_default_plugins/Interact + Hide Inactive Objects: true + - Class: rviz_default_plugins/MoveCamera + - Class: rviz_default_plugins/Select + - Class: rviz_default_plugins/FocusCamera + - Class: rviz_default_plugins/Measure + Line color: 128; 128; 0 + - Class: rviz_default_plugins/SetInitialPose + Covariance x: 0.25 + Covariance y: 0.25 + Covariance yaw: 0.06853891909122467 + Topic: + Depth: 5 + Durability Policy: Volatile + History Policy: Keep Last + Reliability Policy: Reliable + Value: /initialpose + - Class: rviz_default_plugins/SetGoal + Topic: + Depth: 5 + Durability Policy: Volatile + History Policy: Keep Last + Reliability Policy: Reliable + Value: /goal_pose + - Class: rviz_default_plugins/PublishPoint + Single click: true + Topic: + Depth: 5 + Durability Policy: Volatile + History Policy: Keep Last + Reliability Policy: Reliable + Value: /clicked_point + Transformation: + Current: + Class: rviz_default_plugins/TF + Value: true + Views: + Current: + Class: rviz_default_plugins/Orbit + Distance: 23.79106903076172 + Enable Stereo Rendering: + Stereo Eye Separation: 0.05999999865889549 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Focal Point: + X: -2.7142093181610107 + Y: 2.349794387817383 + Z: -0.7724144458770752 + Focal Shape Fixed Size: false + Focal Shape Size: 0.05000000074505806 + Invert Z Axis: false + Name: Current View + Near Clip Distance: 0.009999999776482582 + Pitch: 0.49539828300476074 + Target Frame: + Value: Orbit (rviz) + Yaw: 5.3035807609558105 + Saved: ~ +Window Geometry: + Displays: + collapsed: false + Front Left Depth: + collapsed: false + Front Left RGB: + collapsed: false + Height: 1043 + Hide Left Dock: false + Hide Right Dock: false + QMainWindow State: 000000ff00000000fd00000004000000000000015600000379fc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003b00000379000000c700fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a0049006d00610067006500000002eb000000c90000000000000000000000010000020100000379fc0200000005fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000001c00460072006f006e00740020004c0065006600740020005200470042010000003b000001be0000002800fffffffb0000002000460072006f006e00740020004c00650066007400200044006500700074006801000001ff000001b50000002800fffffffb0000000a0056006900650077007300000000fd000001a8000000a000fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000007800000003efc0100000002fb0000000800540069006d00650100000000000007800000025300fffffffb0000000800540069006d006501000000000000045000000000000000000000041d0000037900000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Selection: + collapsed: false + Time: + collapsed: false + Tool Properties: + collapsed: false + Views: + collapsed: false + Width: 1920 + X: 0 + Y: 360 diff --git a/ros_ws/src/robot/robot_bringup/launch/launch_robot.yaml b/ros_ws/src/robot/robot_bringup/launch/launch_robot.yaml deleted file mode 100644 index 433f0aa8..00000000 --- a/ros_ws/src/robot/robot_bringup/launch/launch_robot.yaml +++ /dev/null @@ -1,29 +0,0 @@ -launch: - # args that can be set from the command line or a default will be used - - arg: - name: "robot_name" - default: "robot1" - # include another launch file in the chatter_ns namespace - - group: - - push_ros_namespace: - namespace: "$(var robot_name)" - # AUTONOMY - - node: - pkg: "depth_to_disparity_package" - exec: "depth_to_disparity" - name: "depth_to_disparity" - # local planner - - include: - file: "$(find-pkg-share disparity_expansion)/launch/disparity_expansion.xml" - # controls - # - include: - # file: "$(find-pkg-share controls_bringup)/launch/launch_controls.yaml" - # world model - - include: - file: "$(find-pkg-share vdb_mapping_ros2)/launch/vdb_mapping_ros2.py" - - node: - pkg: "rviz2" - exec: "rviz2" - name: "rviz2_robot" - namespace: "$(var robot_name)" - args: "-d $(find-pkg-share robot_bringup)/rviz/robot.rviz --ros-args --log-level INFO" diff --git a/ros_ws/src/robot/robot_bringup/launch/robot.launch.xml b/ros_ws/src/robot/robot_bringup/launch/robot.launch.xml new file mode 100644 index 00000000..650b01b5 --- /dev/null +++ b/ros_ws/src/robot/robot_bringup/launch/robot.launch.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ros_ws/src/robot/robot_bringup/launch/static_transforms.launch.xml b/ros_ws/src/robot/robot_bringup/launch/static_transforms.launch.xml new file mode 100644 index 00000000..0ebb2bfb --- /dev/null +++ b/ros_ws/src/robot/robot_bringup/launch/static_transforms.launch.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/ros_ws/src/robot/autonomy/controls/controls_bringup/CMakeLists.txt b/ros_ws/src/simulation/simulation_bringup/CMakeLists.txt similarity index 88% rename from ros_ws/src/robot/autonomy/controls/controls_bringup/CMakeLists.txt rename to ros_ws/src/simulation/simulation_bringup/CMakeLists.txt index dfa7c8ec..0aa4bef9 100644 --- a/ros_ws/src/robot/autonomy/controls/controls_bringup/CMakeLists.txt +++ b/ros_ws/src/simulation/simulation_bringup/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.8) -project(controls_bringup) +project(simulation_bringup) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) @@ -23,10 +23,4 @@ if(BUILD_TESTING) ament_lint_auto_find_test_dependencies() endif() -# Install launch files. -install(DIRECTORY - launch - DESTINATION share/${PROJECT_NAME}/ -) - ament_package() diff --git a/ros_ws/src/simulation/simulation_bringup/LICENSE b/ros_ws/src/simulation/simulation_bringup/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/ros_ws/src/simulation/simulation_bringup/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ros_ws/src/simulation/simulation_bringup/launch/simulation.launch.xml b/ros_ws/src/simulation/simulation_bringup/launch/simulation.launch.xml new file mode 100644 index 00000000..8f35d374 --- /dev/null +++ b/ros_ws/src/simulation/simulation_bringup/launch/simulation.launch.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/ros_ws/src/simulation/simulation_bringup/package.xml b/ros_ws/src/simulation/simulation_bringup/package.xml new file mode 100644 index 00000000..dd3ad203 --- /dev/null +++ b/ros_ws/src/simulation/simulation_bringup/package.xml @@ -0,0 +1,18 @@ + + + + simulation_bringup + 0.0.0 + TODO: Package description + andrew + Apache-2.0 + + ament_cmake + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/simulation/AscentAeroSystems/README.md b/simulation/AscentAeroSystems/README.md deleted file mode 100644 index 979d99b4..00000000 --- a/simulation/AscentAeroSystems/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Download the AscentAeroSystemsSITLPackage.zip from [Google Drive](https://drive.google.com/drive/folders/1vuyRA7h6u7eS_HI16r5HVDxIklFObluO) and unzip into this directory. - diff --git a/simulation/AscentAeroSystems/ascent_sitl_launch_tool.py b/simulation/AscentAeroSystems/ascent_sitl_launch_tool.py deleted file mode 100644 index bf3976e9..00000000 --- a/simulation/AscentAeroSystems/ascent_sitl_launch_tool.py +++ /dev/null @@ -1,92 +0,0 @@ -""" - -""" -# System tools used to launch the sitl process in the brackground -import os -import tempfile -import subprocess - - -class AscentSitlLaunchTool: - """ - A class that manages the start/stop of a sitl process. It requires only the path to the sitl installation (assuming that - sitl was already built with 'make sitl_sitl_default none'), the vehicle id and the vehicle model. - """ - - def __init__(self, sitl_dir, vehicle_id: int = 0): - """Construct the sitlLaunchTool object - - Args: - sitl_dir (str): A string with the path to the sitl-Autopilot directory - vehicle_id (int): The ID of the vehicle. Defaults to 0. - sitl_model (str): The vehicle model. Defaults to "iris". - """ - - # Attribute that will hold the sitl process once it is running - self.sitl_process = None - - # The vehicle id (used for the mavlink port open in the system) - self.vehicle_id = vehicle_id - - # Configurations to whether autostart sitl (SITL) automatically or have the user launch it manually on another - # terminal - self.sitl_dir = sitl_dir - self.sitl_script = self.sitl_dir + "/launch_ascent_sitl.bash" - - # Create a temporary filesystem for sitl to write data to/from (and modify the origin rcS files) - self.root_fs = tempfile.TemporaryDirectory() - - # Set the environement variables - self.environment = os.environ - # self.environment["sitl_SIM_MODEL"] = sitl_model - - def launch(self): - """ - Method that will launch a sitl instance with the specified configuration - """ - self.sitl_process = subprocess.Popen( - [ - "bash", - self.sitl_script - ], - cwd=self.root_fs.name, - shell=False, - env=self.environment, - ) - - def kill_sitl(self): - """ - Method that will kill a sitl instance with the specified configuration - """ - if self.sitl_process is not None: - self.sitl_process.kill() - self.sitl_process = None - - def __del__(self): - """ - If the sitl process is still running when the sitl launch tool object is whiped from memory, then make sure - we kill the sitl instance so we don't end up with hanged sitl instances - """ - - # Make sure the sitl process gets killed - if self.sitl_process: - self.kill_sitl() - - # Make sure we clean the temporary filesystem used for the simulation - self.root_fs.cleanup() - - -# ---- Code used for debugging the sitl launch tool ---- -def main(): - - script_dir = os.path.dirname(os.path.realpath(__file__)) - sitl_tool = AscentSitlLaunchTool(script_dir) - sitl_tool.launch() - - import time - - time.sleep(60) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/simulation/AscentAeroSystems/launch_ascent_sitl.bash b/simulation/AscentAeroSystems/launch_ascent_sitl.bash deleted file mode 100755 index 70203369..00000000 --- a/simulation/AscentAeroSystems/launch_ascent_sitl.bash +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# Description: this script launches the AscentAeroSystems SITL package -# Author: Andrew Jong (ajong@andrew.cmu.edu) -# Copyright (c) 2024. This file is developed as part of software from the AirLab at the -# Robotics Institute at Carnegie Mellon University (https://theairlab.org). - -set -ex - -# kill all child processes on interrupt -trap 'pkill -P $$; exit' SIGINT SIGTERM - - -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -ASCENT_DIR="$SCRIPT_DIR/AscentAeroSystemsSITLPackage" - -ASCENT_SITL_PORT=14552 # port to talk to QGC -ISAAC_SIM_PORT=14553 # port for Isaac Sim -AUTONOMY_STACK_PORT=14554 # port for our autonomy stack - - -# launch QGC, SITL, and mavproxy as child processes - -cd $ASCENT_DIR -# ./AscentQLinux/AscentQ & \ -./spirit_sitl -S --model coaxial -I0 & \ -\ -mavproxy.py --streamrate=100 --master tcp:127.0.0.1:5760 \ - --out udp:127.0.0.1:$ASCENT_SITL_PORT \ - --out udp:127.0.0.1:$ISAAC_SIM_PORT \ - --out udp:127.0.0.1:$AUTONOMY_STACK_PORT - -wait diff --git a/simulation/README.md b/simulation/README.md deleted file mode 100644 index a8e4aa01..00000000 --- a/simulation/README.md +++ /dev/null @@ -1,80 +0,0 @@ -Currently this is the install. We will dockerize this later. - -# Setup - -Install ROS2-humble. - -Install Isaac-Sim 4.0.0 via Omniverse Launcher. To install the Omniverse launcher download from this link: - -``` -wget https://install.launcher.omniverse.nvidia.com/installers/omniverse-launcher-linux.AppImage -``` - -Follow these instructions to setup Nucleus : https://airlab.slite.com/app/docs/X8dZ8w5S3GP9tw - -If you are using the Ascent Spirit drone download the SITL software packages from this link: -https://drive.google.com/file/d/1UxgezaTrHe4WJ28zsVeRhv1VYfOU5VK8/view?usp=drive_link - -Then unzip the file AscentAeroSystemsSITLPackage.zip in this folder: - -``` -cd AirStack/simulation/AscentAeroSystems -unzip AscentAeroSystemsSITLPackage.zip -``` - -Setup the SITL with a comm link in "Application Settings" with the following settings: - -- TCP -- Server: localhost:5760 - -# Install - -Append to your `.bashrc` or `.zshrc`: - -```bash -# Isaac Sim root directory -export ISAACSIM_PATH="${HOME}/.local/share/ov/pkg/isaac-sim-4.0.0" -# Isaac Sim python executable -alias ISAACSIM_PYTHON="${ISAACSIM_PATH}/python.sh" -# Isaac Sim app -alias ISAACSIM="${ISAACSIM_PATH}/isaac-sim.sh" - -``` - -Install python dependencies for mavlink: - -```bash -# in this simulation folder -ISAACSIM_PYTHON -m pip install scipy -ISAACSIM_PYTHON -m pip install --editable ./dronekit-python -sudo apt-get install python3-dev python3-opencv python3-wxgtk4.0 python3-pip python3-matplotlib python3-lxml python3-pygame -pip3 install PyYAML mavproxy --user - -``` - -# Run - -```bash -# terminal 1 -cd AirStack/simulation -./AscentAeroSystems/launch_ascent_sitl.bash -``` - -Make sure the SITL simulation is running successfully before trying to start IssacSim. Otherwise IssacSim will hang and crash with an error similar to this: - -``` -024-07-04 20:11:43 [43,593ms] [Warning] [dronekit] Link timeout, no heartbeat in last 5 seconds -2024-07-04 20:12:08 [68,589ms] [Error] [dronekit.mavlink] Exception in MAVLink input loop -``` - -```bash -# terminal 2 -cd AirStack/simulation -ISAACSIM_PYTHON launch_sim.py -``` - -```bash -# terminal 3 -cd AirStack/simulation -rviz2 -d simulation.rviz -``` diff --git a/simulation/dronekit-python b/simulation/dronekit-python deleted file mode 160000 index 243ce0ac..00000000 --- a/simulation/dronekit-python +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 243ce0ac9c51504fc846e4ea1e35dbff03985871 diff --git a/simulation/extension_docker/.gitignore b/simulation/extension_docker/.gitignore deleted file mode 100644 index 3fc352e2..00000000 --- a/simulation/extension_docker/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.~ \ No newline at end of file diff --git a/simulation/extension_docker/README.md b/simulation/extension_docker/README.md deleted file mode 100644 index 2e1fa440..00000000 --- a/simulation/extension_docker/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Extension Docker - -## Building the Docker Image - -This will build the docker image. - -``` -./build.sh -``` - -## Running - -This will run the docker container - -``` -run.sh -``` - -In docker, you can launch IsaacSim by doing - -``` -/isaac-sim/runapp.sh -``` - -## Extension Method - -In IsaacSim's top menu bar go to Window -> Extensions. In the Extensions window, click "THIRD PARTY". There should be extensions called "SPAWN PRIMITIVES" and "TMUX MANAGER" in the list. Click on them and make sure they are "enabled" and "autoload" is checked. You can close the Extensions window. You should see "Spawn Primitives" and "TMUX Manager" tabs on the bottom right pane of IsaacSim where the "Property" tab is. - -In the "Spawn Primitives" tab you can click the "Spawn Ascent" button. This will spawn the drone model and run a tmux session in the background which is running the SITL, mavproxy, and mavros. To attach to this you can click the "TMUX Manager" tab and click the "Refresh" button. This should list the "ascent0" tmux session with a "Attach" and "Kill" buttons. Clicking "Attach" will bring up an xterm window with the tmux session and "Kill" will kill the session. If you kill, you will need to click "Refresh" again and it will no longer be listed. - - -## Drag and Drop Method - -Use the "Content" tab and navigate to the "/extras" directory. Drag and drop the "spirit_drone.usd" into the viewport. When play is pressed the SITL, mavros, and time sync server will be started in a tmux session. You can use the "TMUX Manager" extension mentioned above to attach to it. \ No newline at end of file diff --git a/simulation/extension_docker/build.sh b/simulation/extension_docker/build.sh deleted file mode 100755 index b5d3196b..00000000 --- a/simulation/extension_docker/build.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -#docker build --no-cache --network=host -t core_isaac_sim_4 -f dockerfiles/core_isaac_sim_4.dockerfile . -docker build --network=host -t core_isaac_sim_4 -f dockerfiles/core_isaac_sim_4.dockerfile . diff --git a/simulation/extension_docker/dockerfiles/core_isaac_sim.dockerfile b/simulation/extension_docker/dockerfiles/core_isaac_sim.dockerfile deleted file mode 100644 index a9eaebbd..00000000 --- a/simulation/extension_docker/dockerfiles/core_isaac_sim.dockerfile +++ /dev/null @@ -1,67 +0,0 @@ -FROM nvcr.io/nvidia/isaac-sim:2023.1.1 - -# setup timezone -RUN echo 'Etc/UTC' > /etc/timezone && \ - ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime && \ - apt-get update && \ - apt-get install -q -y --no-install-recommends tzdata && \ - rm -rf /var/lib/apt/lists/* - -# install packages -RUN apt-get update && apt-get install -q -y --no-install-recommends \ - dirmngr \ - gnupg2 \ - && rm -rf /var/lib/apt/lists/* - -# setup keys -RUN set -eux; \ - key='C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654'; \ - export GNUPGHOME="$(mktemp -d)"; \ - gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \ - mkdir -p /usr/share/keyrings; \ - gpg --batch --export "$key" > /usr/share/keyrings/ros2-latest-archive-keyring.gpg; \ - gpgconf --kill all; \ - rm -rf "$GNUPGHOME" - -# setup sources.list -RUN echo "deb [ signed-by=/usr/share/keyrings/ros2-latest-archive-keyring.gpg ] http://packages.ros.org/ros2/ubuntu jammy main" > /etc/apt/sources.list.d/ros2-latest.list - -# setup environment -ENV LANG C.UTF-8 -ENV LC_ALL C.UTF-8 -ENV ROS_DISTRO humble - -# install ros2 packages -RUN apt-get update && apt-get install -y --no-install-recommends \ - ros-humble-desktop ros-dev-tools emacs curl net-tools wget vim tmux less htop \ - ca-certificates gnupg lsb-core sudo wget \ - astyle build-essential cmake cppcheck file g++ gcc gdb git lcov libfuse2 libxml2-dev libxml2-utils \ - make ninja-build python3 python3-dev python3-pip python3-setuptools python3-wheel rsync shellcheck unzip zip \ - automake binutils-dev bison build-essential flex g++-multilib gcc-multilib gdb-multiarch genromfs gettext gperf \ - libelf-dev libexpat-dev libgmp-dev libisl-dev libmpc-dev libmpfr-dev libncurses5 libncurses5-dev libncursesw5-dev \ - libtool pkg-config screen texinfo u-boot-tools util-linux vim-common bc openjdk-11-jre openjdk-11-jdk libvecmath-java \ - dmidecode gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-plugins-good \ - gstreamer1.0-plugins-ugly gstreamer1.0-libav libeigen3-dev libgstreamer-plugins-base1.0-dev libimage-exiftool-perl \ - libopencv-dev libxml2-utils pkg-config protobuf-compiler lsb-release libasio-dev ros-humble-mavros \ - && rm -rf /var/lib/apt/lists/* - -RUN /opt/ros/humble/lib/mavros/install_geographiclib_datasets.sh - -RUN wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg -RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null -RUN apt update -RUN apt-get update && apt-get install -y --no-install-recommends gz-garden \ - && rm -rf /var/lib/apt/lists/* - -RUN pip3 install argcomplete argparse>=1.2 cerberus coverage empy==3.3.4 future jinja2>=2.8 jsonschema kconfiglib lxml matplotlib>=3.0.* numpy>=1.13 nunavut>=1.1.0 packaging pandas>=0.21 pkgconfig psutil pygments wheel>=0.31.1 pymavlink pyros-genmsg pyserial pyulog>=0.5.0 pyyaml requests setuptools>=39.2.0 six>=1.12.0 toml>=0.9 sympy>=1.10.1 - - - -RUN echo 'root:passme24' | chpasswd - -RUN useradd -G video -ms /bin/bash uav -RUN usermod -a -G dialout uav -RUN usermod -a -G sudo uav -RUN echo 'uav:passme24' | chpasswd -USER uav -WORKDIR /home/uav \ No newline at end of file diff --git a/simulation/extension_docker/dockerfiles/core_isaac_sim_4.dockerfile b/simulation/extension_docker/dockerfiles/core_isaac_sim_4.dockerfile deleted file mode 100644 index 3934fe55..00000000 --- a/simulation/extension_docker/dockerfiles/core_isaac_sim_4.dockerfile +++ /dev/null @@ -1,73 +0,0 @@ -FROM nvcr.io/nvidia/isaac-sim:4.0.0 - -# setup timezone -RUN echo 'Etc/UTC' > /etc/timezone && \ - ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime && \ - apt-get update && \ - apt-get install -q -y --no-install-recommends tzdata && \ - rm -rf /var/lib/apt/lists/* - -# install packages -RUN apt-get update && apt-get install -q -y --no-install-recommends \ - dirmngr \ - gnupg2 \ - && rm -rf /var/lib/apt/lists/* - -# setup keys -RUN set -eux; \ - key='C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654'; \ - export GNUPGHOME="$(mktemp -d)"; \ - gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \ - mkdir -p /usr/share/keyrings; \ - gpg --batch --export "$key" > /usr/share/keyrings/ros2-latest-archive-keyring.gpg; \ - gpgconf --kill all; \ - rm -rf "$GNUPGHOME" - -# setup sources.list -RUN echo "deb [ signed-by=/usr/share/keyrings/ros2-latest-archive-keyring.gpg ] http://packages.ros.org/ros2/ubuntu jammy main" > /etc/apt/sources.list.d/ros2-latest.list - -# setup environment -ENV LANG C.UTF-8 -ENV LC_ALL C.UTF-8 -ENV ROS_DISTRO humble - -# install ros2 packages -RUN apt-get update && apt-get install -y --no-install-recommends \ - ros-humble-desktop ros-dev-tools emacs curl net-tools wget vim tmux less htop \ - ca-certificates gnupg lsb-core sudo wget \ - astyle build-essential cmake cppcheck file g++ gcc gdb git lcov libfuse2 libxml2-dev libxml2-utils \ - make ninja-build python3 python3-dev python3-pip python3-setuptools python3-wheel rsync shellcheck unzip zip \ - automake binutils-dev bison build-essential flex g++-multilib gcc-multilib gdb-multiarch genromfs gettext gperf \ - libelf-dev libexpat-dev libgmp-dev libisl-dev libmpc-dev libmpfr-dev libncurses5 libncurses5-dev libncursesw5-dev \ - libtool pkg-config screen texinfo u-boot-tools util-linux vim-common bc openjdk-11-jre openjdk-11-jdk libvecmath-java \ - dmidecode gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-plugins-good \ - gstreamer1.0-plugins-ugly gstreamer1.0-libav libeigen3-dev libgstreamer-plugins-base1.0-dev libgstreamer-gl1.0-0 \ - libimage-exiftool-perl libopencv-dev libxml2-utils pkg-config protobuf-compiler lsb-release libasio-dev ros-humble-mavros \ - kmod lsof libfuse-dev iproute2 tcpdump xterm \ - python3-dev python3-opencv python3-wxgtk4.0 python3-pip python3-matplotlib python3-lxml python3-pygame \ - && rm -rf /var/lib/apt/lists/* - -RUN /opt/ros/humble/lib/mavros/install_geographiclib_datasets.sh - -RUN wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg -RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null -RUN apt update -RUN apt-get update && apt-get install -y --no-install-recommends gz-garden \ - && rm -rf /var/lib/apt/lists/* - -RUN pip3 install argcomplete argparse>=1.2 cerberus coverage empy==3.3.4 future jinja2>=2.8 jsonschema kconfiglib lxml matplotlib>=3.0.* numpy>=1.13 nunavut>=1.1.0 packaging pandas>=0.21 pkgconfig psutil pygments wheel>=0.31.1 pymavlink pyros-genmsg pyserial pyulog>=0.5.0 pyyaml requests setuptools>=39.2.0 six>=1.12.0 toml>=0.9 sympy>=1.10.1 scipy - -ADD dronekit-python /docker_build/dronekit-python - -RUN /isaac-sim/kit/python.sh -m pip install /docker_build/dronekit-python - -RUN pip3 install PyYAML mavproxy tmuxp - -#RUN echo 'root:passme24' | chpasswd - -#RUN useradd -G video -ms /bin/bash uav -#RUN usermod -a -G dialout uav -#RUN usermod -a -G sudo uav -#RUN echo 'uav:passme24' | chpasswd -#USER uav -#WORKDIR /home/uav \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/.circleci/config.yml b/simulation/extension_docker/dronekit-python/.circleci/config.yml deleted file mode 100644 index 825f2662..00000000 --- a/simulation/extension_docker/dronekit-python/.circleci/config.yml +++ /dev/null @@ -1,83 +0,0 @@ -# CircleCI 2.0 configuration file for dronekit-python - -# Steps common to both Python 2 and Python 3 -common: &commonsteps - steps: - - checkout - - - run: - name: Install dronekit with dependencies - command: | - virtualenv venv - source venv/bin/activate - pip install -UI future - pip install -r requirements.txt -UI - pip install . -UI - - - run: - name: Run dronekit tests - environment: - SITL_SPEEDUP: 10 - SITL_RATE: 200 - command: | - source venv/bin/activate - nosetests -svx dronekit.test.unit - nosetests -svx dronekit.test.sitl - - - run: - name: Build documentation - command: | - source venv/bin/activate - cd docs; make clean; make html - - - store_artifacts: - path: test-reports - destination: test-reports - -# Jobs definition -version: 2 -jobs: - python2: - docker: - - image: circleci/python:2.7-stretch - working_directory: ~/dronekit-python2 - <<: *commonsteps - - python3: - docker: - - image: circleci/python:3.6-stretch - working_directory: ~/dronekit-python3 - <<: *commonsteps - - deploy: - name: Deploy to dronekit.io - working_directory: ~/deploy - machine: true - steps: - - checkout - - run: - name: update docs - command: ./scripts/update-docs.sh - -# Send a notification on Gitter -notify: - webhooks: - - url: https://webhooks.gitter.im/e/27b0e1a9fede99dbbe6c - -# Workflow definition -# Run Python 2 and Python 3 testing in parallel -# and deploy if the Python 2 build succeeds -workflows: - version: 2 - build_test_deploy: - jobs: - - python2 - - python3 -# disabling until we find a new docs server -# - deploy: -# requires: -# - python2 -# filters: -# branches: -# only: -# - master diff --git a/simulation/extension_docker/dronekit-python/.editorconfig b/simulation/extension_docker/dronekit-python/.editorconfig deleted file mode 100644 index 2470cbc7..00000000 --- a/simulation/extension_docker/dronekit-python/.editorconfig +++ /dev/null @@ -1,32 +0,0 @@ -# This file provide reference settings for the APM code conventions -# There are plug-ins available for nearly every text editor to automatically -# respect the conventions contained within this file. -# -# Please see editorconfig.org for complete information. -# -# If you find errors in this file, please send a pull-request with a fix. -# -root = true - -[*] -indent_style = space -indent_size = 4 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -# insert_final_newline = true - -# 4 space indentation -[*.py] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = true -end_of_line = LF - -[*.mk] -indent_style = tab -indent_size = 8 - -[{makefile,Makefile}] -indent_style = tab -indent_size = 8 diff --git a/simulation/extension_docker/dronekit-python/.gitignore b/simulation/extension_docker/dronekit-python/.gitignore deleted file mode 100644 index dec06d5d..00000000 --- a/simulation/extension_docker/dronekit-python/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -.project -.pydevproject -.python-version -dronekit.egg-info -dist -build -.vagrant -*~ -.idea -*.pyc -env -vs/.vs/dronekit-python/v14/*.suo diff --git a/simulation/extension_docker/dronekit-python/.style.yapf b/simulation/extension_docker/dronekit-python/.style.yapf deleted file mode 100644 index 728e3f0e..00000000 --- a/simulation/extension_docker/dronekit-python/.style.yapf +++ /dev/null @@ -1,3 +0,0 @@ -[style] -based_on_style = pep8 -column_limit = 100 diff --git a/simulation/extension_docker/dronekit-python/.travis.yml b/simulation/extension_docker/dronekit-python/.travis.yml deleted file mode 100644 index 16dfd6d8..00000000 --- a/simulation/extension_docker/dronekit-python/.travis.yml +++ /dev/null @@ -1,47 +0,0 @@ -language: python - -env: - global: - - SITL_SPEEDUP=10 - - SITL_RATE=200 - -python: - - 2.7 - - 3.6 - -before_install: - - pip install --upgrade pip - -install: - - pip install -r requirements.txt - - pip install flake8 - -before_script: - # stop the build if there are Python syntax errors or undefined names - - flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics - # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - -script: - - nosetests --debug=nose,nose.importer --debug-log=nose_debug -svx dronekit.test.unit - - nosetests --debug=nose,nose.importer --debug-log=nose_debug -svx dronekit.test.sitl - -git: - depth: 10 - -notifications: - email: false - webhooks: - urls: - - https://webhooks.gitter.im/e/f3f81b74f930dac9583a - on_success: change - on_failure: always - on_start: never - -#matrix: - #allow_failures: - #- python: 3.6 - -branches: - only: - - master diff --git a/simulation/extension_docker/dronekit-python/CHANGELOG.md b/simulation/extension_docker/dronekit-python/CHANGELOG.md deleted file mode 100644 index ca542f26..00000000 --- a/simulation/extension_docker/dronekit-python/CHANGELOG.md +++ /dev/null @@ -1,201 +0,0 @@ -# Changelog - - -## Version 2.9.2 (2019-03-18) - -### Improvements -* CI integration improvements -* Python3 compatability -* use logging module -* log statustexts -* documentation improvements -* convenience functions added: wait_for, wait_for_armable, arm, disarm, wait_for_mode, wait_for_alt, wait_simple_takeoff -* play_tune method added -* reboot method added -* send_calibrate_gyro, send_calibrate_magnetometer, send_calibrate_magnetometer, send_calibrate_vehicle_level, send_calibrate_barometer all added -* update gimbal orientation from MOUNT_ORIENTATION -* add a still-waiting callback for connect() to provide debug on where the connection is up to -* several new tests added (including, play_tune, reboot and set_attitude_target) - -### Cleanup -* flake8 compliance improvements -* test includes pruned -* examples cleaned up - -### Bug Fixes -* ignore GCS heartbeats for the purposes of link up -* many! - -## Version 2.9.1 (2017-04-21) - -### Improvements -* home locatin notifications -* notify ci status to gitter -* basic python 3 support -* isolated logger function so implementers can override -* rename windows installer - -### Cleanup -* removed legacy cloud integrations - -### Bug Fixes -* fix missing ** operator for pymavlink compatibility - -## Version 2.9.0 (2016-08-29) - -### Bug Fixes -* MAVConnection stops threads on exit and close -* PX4 Pro flight modes are now properly supported -* go to test now uses correct `global_relative_frame` alt - -### Improvements -* Updated pymavlink dependency to v2 from v1 hoping we don't fall behind - again. - -## Version 2.8.0 (2016-07-15) - -### Bug Fixes -* Makes sure we are listening to `HOME_LOCATION` message, befor we - would only set home location if received by waypoints. - -## Version 2.7.0 (2016-06-21) - -### Improvements -* Adds udpin-multi support - -## Version 2.6.0 (2016-06-17) - -### Bug Fixes -* Fixes patched mavutil sendfn - -## Version 2.5.0 (2016-05-04) - -### Improvements -* Catch and display message and attribute errors, then continue -* Improved takeoff example docs -* Deploy docs on successful merge into master (from CircleCI) -* Drone delivery example, explain port to connect -* MicroCGS example now uses SITL -* Make running examples possible on Vagrant - -### Bug Fixes -* Mav type for rover was incorrect -* `_is_mode_available` can now handle unrecognized mode codes -* Fix broken links on companion computer page -* Fix infinite loop on channel test - - - -## Version 2.4.0 (2016-02-29) - -### Bug Fixes - -* Use monotonic clock for all of the internal timeouts and time - measurements -* Docs fixes - - -## Version 2.3.0 (2016-02-26) - -### New Features - -* PX4 compatibility improvements - -### Updated Features - -* Documentation fixes -* PIP repository improvements -* Mode-setting API improvements -* ardupilot-solo compatibility fixes - - - -## Version 2.2.0 (2016-02-19) - -### Bug Fixes - -* Splits outbound messages into its own thread. -* Remove of capabilities request on HEARTBEAT listener -* Check if mode_mapping has items before iteration - - - -## Version 2.1.0 (2016-02-16) - - -### New Features - - -* Gimbal control attribute -* Autopilot version attribute -* Autopilot capabilities attribute -* Best Practice guide documentation. -* Performance test example (restructured and docs added) - -### Updated Features: - -Many documentation fixes: - -* Restructured documentation with Develop (Concepts) and Guide (HowTo) sections -* Docs separated out "Connection Strings" section. -* Improved test and contribution sections. -* Updated examples and documentation to use DroneKit-Sitl for simulation ("zero setup examples") -* Debugging docs updated with additional libraries. -* Flight Replay example fetches data from TLOG rather than droneshare -* Drone Delivery example now uses strart location for home address. -* Disabled web tests (not currently supported/used) -* Updated copyright range to include changes in 2016 - -### Bug Fixes - -* Numerous minor docs fixes. -* Harmonise nosetest options across each of the integration platforms -* Fix incorrect property marker for airspeed attribute - - - -## Version 2.0.2 (2015-11-30) - -### Bug Fixes: - -* Updates `requests` dependency to work >=2.5.0 - - -## Version 2.0.0 (2015-11-23) - -### New Features: - -* Renamed library and package from DroneAPI to DroneKit on pip -* DroneKit Python is now a standalone library and no longer requires use of MAVProxy -* Connect multiple vehicles in one script by creating separate vehicle instances -* Removed NumPy, ProtoBuf as dependencies -* Add MAVLink message listeners using `add_message_listener` methods -* Added `on_attribute` and `on_message` function decorator shorthands -* Added `mount_status`, `system_status`, `ekf_ok`, `is_armable`, `heading` -* Made settable `groundspeed`, `airspeed` -* Moved `dronekit.lib` entries to root package `dronekit` -* Added `parameters.set` and `parameters.get` for fine-tuned parameter access -* `parameters` now observable and iterable (#442) -* Added `last_heartbeat` attribute, updated every event loop with time since last heartbeat (#451) -* Await attributes through `wait_ready` method and `connect` method parameter -* Adds subclassable Vehicle class, used by `vehicle_class` parameter in `connect` - -### Updated Features: - -* local_connect renamed to connect(), accepting a connection path, link configuration, and timeout settings -* Removed `.set_mavrx_callback`. Use `vehicle.on_message('*', obj)` methods -* Renamed `add_attribute_observer` methods to `add_attribute_listener`, etc. (#420) -* Renamed `wait_init` and `wait_valid` to `wait_ready` -* Split `home_location` is a separate attribute from `commands` waypoint array -* Moved RC channels into `.channels` object (#427) -* Split location information into `local_frame`, `global_frame`, and `global_relative_frame` (and removed `is_relative`) (#445) -* Renamed `flush` to `commands.upload`, as it only impacts waypoints (#276) -* `commands.goto` and `commands.takeoff` renamed to `simple_goto` and `simple_takeoff` - -### Bug Fixes: - -* `armed` and `mode` attributes updated constantly (#60, #446) -* Parameter setting times out (#12) -* `battery` access can throw exception (#298) -* Vehicle.location reports incorrect is_relative value for Copter (#130) -* Excess arming message when already armed diff --git a/simulation/extension_docker/dronekit-python/CONTRIBUTING.md b/simulation/extension_docker/dronekit-python/CONTRIBUTING.md deleted file mode 100644 index 09b21edb..00000000 --- a/simulation/extension_docker/dronekit-python/CONTRIBUTING.md +++ /dev/null @@ -1,3 +0,0 @@ -# Contributing to DroneKit Python - -Please see [the Contribution Guide](http://python.dronekit.io/contributing/) on dronekit.io for details. diff --git a/simulation/extension_docker/dronekit-python/README.md b/simulation/extension_docker/dronekit-python/README.md deleted file mode 100644 index f024a0b6..00000000 --- a/simulation/extension_docker/dronekit-python/README.md +++ /dev/null @@ -1,74 +0,0 @@ -# DroneKit Python - -![dronekit_python_logo](https://cloud.githubusercontent.com/assets/5368500/10805537/90dd4b14-7e22-11e5-9592-5925348a7df9.png) - -[![PyPi published version](https://img.shields.io/pypi/v/dronekit.svg)](https://pypi.org/project/dronekit/) -[![Windows Build status](https://img.shields.io/appveyor/ci/3drobotics/dronekit-python/master.svg?label=windows)](https://ci.appveyor.com/project/3drobotics/dronekit-python/branch/master) -[![OS X Build Status](https://img.shields.io/travis/dronekit/dronekit-python/master.svg?label=os%20x)](https://travis-ci.org/dronekit/dronekit-python) -[![Linux Build Status](https://img.shields.io/circleci/project/dronekit/dronekit-python/master.svg?label=linux)](https://circleci.com/gh/dronekit/dronekit-python) - -DroneKit-Python helps you create powerful apps for UAVs. - -# ⚠️ ATTENTION: MAINTAINERS NEEDED ⚠️ - -Hey it's true this project is not very active, but it could be with your help. We are looking for maintainers interested in keeping the project alive by keep up with CI and PRs. If you are interested in helping please apply by [creating an issue]([url](https://github.com/dronekit/dronekit-python/issues/new)) and listing the reasons why you would like to help, in return we will be granting committer access to folks who are truly interested in helping. - - -## Overview - -DroneKit-Python (formerly DroneAPI-Python) contains the python language implementation of DroneKit. - -The API allows developers to create Python apps that communicate with vehicles over MAVLink. It provides programmatic access to a connected vehicle's telemetry, state and parameter information, and enables both mission management and direct control over vehicle movement and operations. - -The API is primarily intended for use in onboard companion computers (to support advanced use cases including computer vision, path planning, 3D modelling etc). It can also be used for ground station apps, communicating with vehicles over a higher latency RF-link. - -## Getting Started - -The [Quick Start](https://dronekit-python.readthedocs.io/en/latest/guide/quick_start.html) guide explains how to set up DroneKit on each of the supported platforms (Linux, Mac OSX, Windows) and how to write a script to connect to a vehicle (real or simulated). - -A basic script looks like this: - -```python -from dronekit import connect - -# Connect to UDP endpoint. -vehicle = connect('127.0.0.1:14550', wait_ready=True) -# Use returned Vehicle object to query device state - e.g. to get the mode: -print("Mode: %s" % vehicle.mode.name) -``` - -Once you've got DroneKit set up, the [guide](https://dronekit-python.readthedocs.io/en/latest/guide/index.html) explains how to perform operations like taking off and flying the vehicle. You can also try out most of the tasks by running the [examples](https://dronekit-python.readthedocs.io/en/latest/examples/index.html). - -## Resources - -The project documentation is available at [https://readthedocs.org/projects/dronekit-python/](https://readthedocs.org/projects/dronekit-python/). This includes [guide](https://dronekit-python.readthedocs.io/en/latest/guide/index.html), [example](https://dronekit-python.readthedocs.io/en/latest/examples/index.html) and [API Reference](https://dronekit-python.readthedocs.io/en/latest/automodule.html) material. - -The example source code is hosted here on Github as sub-folders of [/dronekit-python/examples](https://github.com/dronekit/dronekit-python/tree/master/examples). - -The [DroneKit Forums](http://discuss.dronekit.io) are the best place to ask for technical support on how to use the library. You can also check out our [Gitter channel](https://gitter.im/dronekit/dronekit-python?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) though we prefer posts on the forums where possible. - -* **Documentation:** [https://dronekit-python.readthedocs.io/en/latest/about/index.html](https://dronekit-python.readthedocs.io/en/latest/about/index.html) -* **Guides:** [https://dronekit-python.readthedocs.io/en/latest/guide/index.html) -* **API Reference:** [https://dronekit-python.readthedocs.io/en/latest/automodule.html) -* **Examples:** [/dronekit-python/examples](https://github.com/dronekit/dronekit-python/tree/master/examples) -* **Forums:** [http://discuss.dronekit.io/](http://discuss.dronekit.io) -* **Gitter:** [https://gitter.im/dronekit/dronekit-python](https://gitter.im/dronekit/dronekit-python?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) though we prefer posts on the forums where possible. - - -## Users and contributors wanted! - -We'd love your [feedback and suggestions](https://github.com/dronekit/dronekit-python/issues) about this API and are eager to evolve it to meet your needs, please feel free to create an issue to report bugs or feature requests. - -If you've created some awesome software that uses this project, [let us know on the forums here](https://discuss.dronekit.io/t/notable-projects-using-dronekit/230)! - -If you want to contribute, see our [Contributing](https://dronekit-python.readthedocs.io/en/latest/contributing/index.html) guidelines, we welcome all types of contributions but mostly contributions that would help us shrink our [issues list](https://github.com/dronekit/dronekit-python/issues). - - -## Licence - -DroneKit-Python is made available under the permissive open source [Apache 2.0 License](http://python.dronekit.io/about/license.html). - - -*** - -Copyright 2015 3D Robotics, Inc. diff --git a/simulation/extension_docker/dronekit-python/Vagrantfile b/simulation/extension_docker/dronekit-python/Vagrantfile deleted file mode 100644 index d916140a..00000000 --- a/simulation/extension_docker/dronekit-python/Vagrantfile +++ /dev/null @@ -1,32 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -Vagrant.configure(2) do |config| - config.vm.box = "ubuntu/trusty64" - config.vm.network "private_network", type: "dhcp" - - config.vm.provision "shell", inline: <<-SHELL - apt-get -y update - echo "[DroneKit]: Installing build essentials" - apt-get -y install build-essential - echo "[DroneKit]: Installing Python Devel" - apt-get -y install python-dev - echo "[DroneKit]: Installing pip ..." - apt-get -y install python-pip - easy_install -U pip - echo "[DroneKit]: Installing python-cherrypy3 ..." - apt-get -y install python-cherrypy3 - echo "[DroneKit]: Installing python-matplotlib ..." - apt-get -y install python-matplotlib - echo "[DroneKit]: Installing python-gps ..." - apt-get -y install python-gps - echo "[DroneKit]: Installing Sphinx ... " - pip install sphinx - cd /vagrant - echo "[DroneKit]: Installing DroneKit-Python requirements.txt ... " - pip install -r requirements.txt - echo "[DroneKit]: Building docs " - cd docs/ - make html - SHELL -end diff --git a/simulation/extension_docker/dronekit-python/appveyor.yml b/simulation/extension_docker/dronekit-python/appveyor.yml deleted file mode 100644 index b1996b57..00000000 --- a/simulation/extension_docker/dronekit-python/appveyor.yml +++ /dev/null @@ -1,38 +0,0 @@ -environment: - SITL_SPEEDUP: 10 - SITL_RATE: 200 - PYTHONUNBUFFERED: 1 - - matrix: - - PYTHON: "C:\\Python27" - PYTHON_VERSION: "2.7" - - PYTHON: "C:\\Python37" - PYTHON_VERSION: "3.7" - -cache: - - "c:\\Users\\appveyor\\.pip-wheelhouse" - -init: - - cmd: "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" - -install: - - ps: | - New-Item -ItemType Directory -Force -Path c:\Users\appveyor\pip\ - @' - [global] - find-links = file://c:/Users/appveyor/.pip-wheelhouse - - [wheel] - wheel-dir = c:/Users/appveyor/.pip-wheelhouse - '@ | out-file -Encoding ascii -FilePath c:\Users\appveyor\pip\pip.ini - - cmd: 'python -m pip install pip wheel -U' - - cmd: 'pip install . -UI' - - cmd: 'pip install -r requirements.txt -UI' - -build: off - -test_script: - - cmd: 'nosetests -svx dronekit.test.unit' - - cmd: 'nosetests -svx dronekit.test.sitl' - -clone_depth: 10 diff --git a/simulation/extension_docker/dronekit-python/docs/.gitignore b/simulation/extension_docker/dronekit-python/docs/.gitignore deleted file mode 100644 index d4e11e5e..00000000 --- a/simulation/extension_docker/dronekit-python/docs/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -_build - diff --git a/simulation/extension_docker/dronekit-python/docs/Makefile b/simulation/extension_docker/dronekit-python/docs/Makefile deleted file mode 100644 index 9e9f3f24..00000000 --- a/simulation/extension_docker/dronekit-python/docs/Makefile +++ /dev/null @@ -1,153 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/DroneApi.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/DroneApi.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/DroneApi" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/DroneApi" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." diff --git a/simulation/extension_docker/dronekit-python/docs/about/github_latest_release.txt b/simulation/extension_docker/dronekit-python/docs/about/github_latest_release.txt deleted file mode 100644 index 9a67880e..00000000 --- a/simulation/extension_docker/dronekit-python/docs/about/github_latest_release.txt +++ /dev/null @@ -1,227 +0,0 @@ -.. This document was auto-generated by the get_release_notes.py script using latest-release information from github - -Changelog -========= - -Version 2.9.1 (2017-04-21) --------------------------- - -Improvements -~~~~~~~~~~~~ - -- home locatin notifications -- notify ci status to gitter -- basic python 3 support -- isolated logger function so implementers can override -- rename windows installer - -Cleanup -~~~~~~~ - -- removed legacy cloud integrations - -Bug Fixes -~~~~~~~~~ - -- fix missing \*\* operator for pymavlink compatibility - -Version 2.9.0 (2016-08-29) --------------------------- - -Bug Fixes -~~~~~~~~~ - -- MAVConnection stops threads on exit and close -- PX4 Pro flight modes are now properly supported -- go to test now uses correct ``global_relative_frame`` alt - -Improvements -~~~~~~~~~~~~ - -- Updated pymavlink dependency to v2 from v1 hoping we don't fall - behind again. - -Version 2.8.0 (2016-07-15) --------------------------- - -Bug Fixes -~~~~~~~~~ - -- Makes sure we are listening to ``HOME_LOCATION`` message, befor we - would only set home location if received by waypoints. - -Version 2.7.0 (2016-06-21) --------------------------- - -Improvements -~~~~~~~~~~~~ - -- Adds udpin-multi support - -Version 2.6.0 (2016-06-17) --------------------------- - -Bug Fixes -~~~~~~~~~ - -- Fixes patched mavutil sendfn - -Version 2.5.0 (2016-05-04) --------------------------- - -Improvements -~~~~~~~~~~~~ - -- Catch and display message and attribute errors, then continue -- Improved takeoff example docs -- Deploy docs on successful merge into master (from CircleCI) -- Drone delivery example, explain port to connect -- MicroCGS example now uses SITL -- Make running examples possible on Vagrant - -Bug Fixes -~~~~~~~~~ - -- Mav type for rover was incorrect -- ``_is_mode_available`` can now handle unrecognized mode codes -- Fix broken links on companion computer page -- Fix infinite loop on channel test - -Version 2.4.0 (2016-02-29) --------------------------- - -Bug Fixes -~~~~~~~~~ - -- Use monotonic clock for all of the internal timeouts and time - measurements -- Docs fixes - -Version 2.3.0 (2016-02-26) --------------------------- - -New Features -~~~~~~~~~~~~ - -- PX4 compatibility improvements - -Updated Features -~~~~~~~~~~~~~~~~ - -- Documentation fixes -- PIP repository improvements -- Mode-setting API improvements -- ardupilot-solo compatibility fixes - -Version 2.2.0 (2016-02-19) --------------------------- - -Bug Fixes -~~~~~~~~~ - -- Splits outbound messages into its own thread. -- Remove of capabilities request on HEARTBEAT listener -- Check if mode\_mapping has items before iteration - -Version 2.1.0 (2016-02-16) --------------------------- - -New Features -~~~~~~~~~~~~ - -- Gimbal control attribute -- Autopilot version attribute -- Autopilot capabilities attribute -- Best Practice guide documentation. -- Performance test example (restructured and docs added) - -Updated Features: -~~~~~~~~~~~~~~~~~ - -Many documentation fixes: - -- Restructured documentation with Develop (Concepts) and Guide (HowTo) - sections -- Docs separated out "Connection Strings" section. -- Improved test and contribution sections. -- Updated examples and documentation to use DroneKit-Sitl for - simulation ("zero setup examples") -- Debugging docs updated with additional libraries. -- Flight Replay example fetches data from TLOG rather than droneshare -- Drone Delivery example now uses strart location for home address. -- Disabled web tests (not currently supported/used) -- Updated copyright range to include changes in 2016 - -Bug Fixes -~~~~~~~~~ - -- Numerous minor docs fixes. -- Harmonise nosetest options across each of the integration platforms -- Fix incorrect property marker for airspeed attribute - -Version 2.0.2 (2015-11-30) --------------------------- - -Bug Fixes: -~~~~~~~~~~ - -- Updates ``requests`` dependency to work >=2.5.0 - -Version 2.0.0 (2015-11-23) --------------------------- - -New Features: -~~~~~~~~~~~~~ - -- Renamed library and package from DroneAPI to DroneKit on pip -- DroneKit Python is now a standalone library and no longer requires - use of MAVProxy -- Connect multiple vehicles in one script by creating separate vehicle - instances -- Removed NumPy, ProtoBuf as dependencies -- Add MAVLink message listeners using ``add_message_listener`` methods -- Added ``on_attribute`` and ``on_message`` function decorator - shorthands -- Added ``mount_status``, ``system_status``, ``ekf_ok``, - ``is_armable``, ``heading`` -- Made settable ``groundspeed``, ``airspeed`` -- Moved ``dronekit.lib`` entries to root package ``dronekit`` -- Added ``parameters.set`` and ``parameters.get`` for fine-tuned - parameter access -- ``parameters`` now observable and iterable (`#442 `_) -- Added ``last_heartbeat`` attribute, updated every event loop with - time since last heartbeat (`#451 `_) -- Await attributes through ``wait_ready`` method and ``connect`` method - parameter -- Adds subclassable Vehicle class, used by ``vehicle_class`` parameter - in ``connect`` - -Updated Features: -~~~~~~~~~~~~~~~~~ - -- local\_connect renamed to connect(), accepting a connection path, - link configuration, and timeout settings -- Removed ``.set_mavrx_callback``. Use ``vehicle.on_message('*', obj)`` - methods -- Renamed ``add_attribute_observer`` methods to - ``add_attribute_listener``, etc. (`#420 `_) -- Renamed ``wait_init`` and ``wait_valid`` to ``wait_ready`` -- Split ``home_location`` is a separate attribute from ``commands`` - waypoint array -- Moved RC channels into ``.channels`` object (`#427 `_) -- Split location information into ``local_frame``, ``global_frame``, - and ``global_relative_frame`` (and removed ``is_relative``) (`#445 `_) -- Renamed ``flush`` to ``commands.upload``, as it only impacts - waypoints (`#276 `_) -- ``commands.goto`` and ``commands.takeoff`` renamed to ``simple_goto`` - and ``simple_takeoff`` - -Bug Fixes: -~~~~~~~~~~ - -- ``armed`` and ``mode`` attributes updated constantly (`#60 `_, `#446 `_) -- Parameter setting times out (`#12 `_) -- ``battery`` access can throw exception (`#298 `_) -- Vehicle.location reports incorrect is\_relative value for Copter - (`#130 `_) -- Excess arming message when already armed diff --git a/simulation/extension_docker/dronekit-python/docs/about/index.rst b/simulation/extension_docker/dronekit-python/docs/about/index.rst deleted file mode 100644 index 1d5866a3..00000000 --- a/simulation/extension_docker/dronekit-python/docs/about/index.rst +++ /dev/null @@ -1,18 +0,0 @@ -=========================== -Introducing DroneKit-Python -=========================== - -This section provides an overview of DroneKit-Python's functionality, licensing, and supported companion computers. - -After reading, you will understand what the kit offers and the opportunities it provides. You will also know where to go if you have further questions for suggestions for improvement. - - -.. toctree:: - :maxdepth: 4 - - overview - release_notes - migrating - license - - diff --git a/simulation/extension_docker/dronekit-python/docs/about/license.rst b/simulation/extension_docker/dronekit-python/docs/about/license.rst deleted file mode 100644 index 1fe406e2..00000000 --- a/simulation/extension_docker/dronekit-python/docs/about/license.rst +++ /dev/null @@ -1,8 +0,0 @@ -======================= -Open Source Licence -======================= - -DroneKit-Python is licensed under the *Apache License Version 2.0, January 2004* (http://www.apache.org/licenses/). This is present in the `LICENSE `_ file in the source tree, and reproduced below: - -.. include:: ../../LICENSE - :literal: \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/docs/about/migrating.rst b/simulation/extension_docker/dronekit-python/docs/about/migrating.rst deleted file mode 100644 index 9654f9ce..00000000 --- a/simulation/extension_docker/dronekit-python/docs/about/migrating.rst +++ /dev/null @@ -1,359 +0,0 @@ -.. _migrating_dkpy2_0: - -===================== -Migrating to DKPY 2.0 -===================== - -DroneKit-Python 2.0 has undergone a significant *architectural* evolution when compared to version 1.x (the library changed from a MAVProxy extension -to a standalone Python module). The API itself remains similar, with the most important difference being that you -now need to specify the vehicle target address inside the script. - -The sections below outline the main migration areas. - -.. note:: - - *DroneKit-Python version 1.5* has now been superseded (see these links for legacy `documentation `_ - and `examples `_). - - -Installation -============ - -DKPY 2.0 is now installed from `pip` on all platforms - see :ref:`installing_dronekit` for more information. - -Installation is generally simpler than on DK 1.x because there are far fewer dependencies (both MAVProxy and numpy -are no longer needed). - -.. note:: - - * The DroneKit-Python Windows installer cannot be used for DKPY2.x (and is no longer needed). - * One implication of the reduced dependencies is that it should now be easier to use other Python distributions - (like ActivePython - although this has not been verified!) - - -Launching scripts -================= - -DroneKit-Python 2.0 apps are run from an ordinary Python command prompt. For example: - -.. code:: bash - - some_python_script.py # or `python some_python_script.py` - -.. note:: - - This contrasts with DKPY 1.x scripts, which were run from within MAVProxy using the command: - - .. code:: bash - - api start some_python_script.py - - -Code changes -============ - -This section outlines the changes you will need to make to your DroneKit-Python scripts. - -Connecting to a vehicle ------------------------ - -You must specify the target vehicle address in your script (in DKPY 1.x this was done when you launched MAVProxy). - -The code fragment below shows how you import the :py:func:`connect() ` method and use it to return a -connected :py:class:`Vehicle ` object. The address string passed to ``connect()`` takes the same -values as were passed to *MAVProxy* when setting up a connection in DKPY 1.x (in this case, a SITL instance running on the same computer). - -.. code:: python - - from dronekit import connect - - # Connect to the Vehicle (in this case a UDP endpoint) - vehicle = connect('127.0.0.1:14550', wait_ready=True) - -.. note:: - - The ``wait_ready=True`` parameter ensures that ``connect()`` won't return until - :py:attr:`Vehicle.parameters ` and most other default attributes have been - populated with values from the vehicle. Check out :py:func:`Vehicle.wait_ready() ` for more - information (this method is used by the ``connect()`` implementation). - - :py:func:`connect() ` also has arguments for setting the baud rate, - returning your own :ref:`custom vehicle classes ` and setting the length of the connection timeout. - - -After connecting, the returned ``vehicle`` can be used in exactly the same way as in DKPY 1.x. - -.. note:: - - The above code replaces DKPY 1.x code to get the Vehicle (similar to the example below): - - .. code:: python - - # Get an instance of the API endpoint - api = local_connect() - # Get the connected vehicle (currently only one vehicle can be returned). - vehicle = api.get_vehicles()[0] - - - -.. todo:: Above link to the connect method in API ref - make sure connect() is documented. - - -Connection status checks ------------------------- - -DroneKit no longer runs in *MAVProxy* so scripts don't need to monitor and act on external thread shutdown commands. - -Remove code that checks the ``api.exit`` status (note that the ``api.exit`` call below is commented out). - -.. code:: python - - while not vehicle.armed # and not api.exit: - print " Waiting for arming..." - time.sleep(1) - -.. note:: - - In fact you should delete all references to ``APIConnection`` class and its methods (``get_vehicles()``, ``exit()`` and ``stop()``). - - - - -Script completion checks ------------------------- - -Examples that might possibly have outstanding messages should call :py:func:`Vehicle.close() ` -before exiting to ensure that all messages have flushed before the script completes: - -.. code:: python - - # About to exit script - vehicle.close() - - -Command line arguments ----------------------- - -Remove any code that uses the ``local_arguments`` array to get script-local command line arguments (via MAVProxy). - -From DKPY 2.0 command line arguments are passed to ``sys.argv`` as with any other script. The examples use the -`argparse `_ module for argument parsing, but you can -use whatever method you like. - -.. note:: - - In DKPY 1.x the script's ``sys.argv`` values were the values passed to MAVProxy when it was - started. To access arguments passed to the script from *MAVProxy* you used the ``local_arguments`` array. - For example if you started a script as shown below: - - .. code:: bash - - api start my_script.py 101 - - Then you would read the integer in your code using - - .. code:: python - - my_argument = int(local_arguments[0]) - - -.. todo:: This addition closes https://github.com/dronekit/dronekit-python/issues/13 - - -Current script directory ------------------------- - -DroneKit-Python v1.x passed a global property ``load_path`` to any executed file containing the -directory in which the script was running. This is no longer needed in version 2 and has been removed. - -Instead, use normal Python methods for getting file system information: - -.. code:: python - - import os.path - full_directory_path_of_current_script = os.path.dirname(os.path.abspath(__file__)) - - -Vehicle.location ----------------- - -DroneKit-Python v1.x had a ``Vehicle.location`` attribute which provided latitude and longitude information in the -global frame, and altitude either relative to sea-level or the home location (depending on the value of its ``is_relative`` member). - -DKPY2.0 uses and attribute with the same name to provide location in -global, global-relative and local (NED) frames: - -.. code-block:: python - - print "Global Location: %s" % vehicle.location.global_frame - print "Global Location (relative altitude): %s" % vehicle.location.global_relative_frame - print "Local Location: %s" % vehicle.location.local_frame - -For more information see: :py:attr:`Vehicle.location `, -:py:attr:`Vehicle.location.global_frame `, -:py:attr:`Vehicle.location.global_relative_frame `, -:py:attr:`Vehicle.location.local_frame `, and :ref:`vehicle-information`. - - -Takeoff and movement commands ------------------------------ - -DroneKit-Python v1.x provided guided mode takeoff and movement methods ``Vehicle.commands.takeoff()`` -and ``Vehicle.commands.goto()``. - -DKPY2.0 instead provides :py:func:`Vehicle.simple_takeoff ` and -:py:func:`Vehicle.simple_goto `. These are the same as the old methods -except that ``simple_goto`` allows you to optionally set the default target groundspeed and airspeed. - - -:py:attr:`Vehicle.airspeed ` and -:py:attr:`Vehicle.groundspeed ` are now settable values. Call these to -set the default target speed used when moving with :py:func:`Vehicle.simple_goto ` -(or other position-based movement commands). - - -.. _migrating_dkpy2_0_home_location: - -Home location -------------- - -DroneKit-Python 1.x code retrieved the home location from the first element in :py:attr:`Vehicle.commands `. -This code must be replaced with the DroneKit-Python 2.x :py:attr:`Vehicle.home_location ` attribute. - -.. tip:: - - Even though the home location is no longer returned as the first waypoint in :py:attr:`Vehicle.commands `, - you will still need to download the commands in order to populate the value of - :py:attr:`Vehicle.home_location `. - - -Missions and Waypoints ----------------------- - -The API for working with missions has been improved and made significantly more robust. - -One of the major changes is that the :py:attr:`Vehicle.commands ` list no -longer includes the :ref:`home location ` waypoint in the 0th -index. Another change is that we now wait for command download to complete using -:py:attr:`Vehicle.commands.wait_ready() `. - -All the known bugs have been fixed. It is now much easier to download, clear, and add items to the mission -because there is no need to work around race conditions and other issues with the API. - -For more information see :ref:`auto_mode_vehicle_control`. - - -Observing attribute changes ---------------------------- - -The DroneKit-Python 1.x observer function ``vehicle.add_attribute_observer`` has been replaced by -:py:func:`Vehicle.add_attribute_listener() ` or -:py:func:`Vehicle.on_attribute() ` in DKYP2.x, and ``Vehicle.remove_attribute_observer`` -has been repaced by :py:func:`remove_attribute_listener() `. - -The main difference is that the callback function now takes three arguments (the vehicle object, attribute name, attribute value) -rather than just the attribute name. This allows you to more easily write callbacks that support attribute-specific and -vehicle-specific handling and means that you can get the new value from the callback attribute rather than by re-querying -the vehicle. - -.. note:: - - The difference between :py:func:`Vehicle.add_attribute_listener() ` and - :py:func:`Vehicle.on_attribute() ` is that attribute listeners added using - :py:func:`Vehicle.on_attribute() ` cannot be removed (while ``on_attribute()`` - has a more elegant syntax). - -A few attributes have been modified so that they only notify when the value changes: -:py:func:`Vehicle.system_status `, -:py:attr:`Vehicle.armed `, and -:py:attr:`Vehicle.mode `. Users no longer need to add caching code -for these attributes in their listeners. -Attributes that provide "streams" of information (i.e. sensor output) remain unchanged. - -.. note:: - - If you're :ref:`creating your own attributes ` this caching is trivially - provided using the ``cache=True`` argument to - :py:func:`Vehicle.notify_attribute_listeners() `. - -See :ref:`vehicle_state_observe_attributes` for more information. - - -Parameter changes ------------------ - -In DKPY2 you can now :ref:`observe ` parameters in order to -be notified of changes, and also :ref:`iterate ` -:py:attr:`Vehicle.parameters ` to get a list of off the supported -values in the connected vehicle. - -In addition, the code to download parameters and keep information in sync with the vehicle -is now a lot more robust. - - - - - -Intercepting MAVLink Messages ------------------------------ - -DroneKit-Python 1.x used ``Vehicle.set_mavlink_callback()`` and ``Vehicle.unset_mavlink_callback`` -to set/unset a callback function that was invoked for every single mavlink message. - -In DKPY2 this has been replaced by the :py:func:`Vehicle.on_message() ` -decorator, which allows you to specify a callback function that will be invoked for a single message -(or all messages, by specifying the message name as the wildcard string '``*``'). - -.. tip:: - - :py:func:`Vehicle.on_message() ` is used in core DroneKit code for - message capture and to create ``Vehicle`` attributes. - - The API also adds :py:func:`Vehicle.add_message_listener() ` - and :py:func:`Vehicle.remove_message_listener() `. - These can be used instead of :py:func:`Vehicle.on_message() ` when you need to be - able to *remove* an added listener. Typically you won't need to! - -See :ref:`mavlink_messages` for more information. - - -New attributes --------------- - -In addition to the :ref:`home_location `, -a few more attributes have been added, including: -:py:func:`Vehicle.system_status `, -:py:func:`Vehicle.heading `, -:py:func:`Vehicle.mount_status `, -:py:func:`Vehicle.ekf_ok `, -:py:func:`Vehicle.is_armable `, -:py:func:`Vehicle.last_heartbeat `. - - -Channel Overrides ------------------ - -.. warning:: - - Channel overrides (a.k.a “RC overrides”) are highly discommended (they are primarily implemented for - simulating user input and when implementing certain types of joystick control). - -DKPY v2 replaces the ``vehicle.channel_readback`` attribute with -:py:attr:`Vehicle.channels ` (and the :py:class:`Channels ` -class) and the ``vehicle.channel_override`` attribute with -:py:attr:`Vehicle.channels.overrides ` -(and the :py:class:`ChannelsOverrides ` class). - -Documentation and example code for how to use the new API are provided in :ref:`example_channel_overrides`. - - - - -Debugging -========= - -DroneKit-Python 1.x scripts were run in the context of a MAVProxy. This made them difficult to debug because you had to -instrument your code in order to launch the debugger, and debug messages were interleaved with MAVProxy output. - -Debugging on DroneKit-Python 2.x is much easier. Apps are now just standalone scripts, and can be debugged -using standard Python methods (including the debugger/IDE of your choice). diff --git a/simulation/extension_docker/dronekit-python/docs/about/overview.rst b/simulation/extension_docker/dronekit-python/docs/about/overview.rst deleted file mode 100644 index 05b814ff..00000000 --- a/simulation/extension_docker/dronekit-python/docs/about/overview.rst +++ /dev/null @@ -1,58 +0,0 @@ -============== -About DroneKit -============== - -DroneKit-Python allows developers to create apps that run on an onboard :ref:`companion computer ` and communicate with the `ArduPilot `_ flight controller using a low-latency link. Onboard apps can significantly enhance the autopilot, adding greater intelligence to vehicle behaviour, and performing tasks that are computationally intensive or time-sensitive (for example, computer vision, path planning, or 3D modelling). DroneKit-Python can also be used for ground station apps, communicating with vehicles over a higher latency RF-link. - -The API communicates with vehicles over MAVLink. It provides programmatic access to a connected vehicle's telemetry, state and parameter information, and enables both mission management and direct control over vehicle movement and operations. - - - -Open source community -===================== - -DroneKit-Python is an open source and community-driven project. - -You can find all the source code on `Github here `_ and check out our permissive :doc:`Apache v2 Licence `. -If you want to join the community, then see our :doc:`contributing section <../contributing/index>` for lots of ideas on how you can help. - - -Compatibility -============= -DroneKit-Python is compatible with vehicles that communicate using the `MAVLink protocol `_ (including most vehicles made by `3DR `_ and other members of the `DroneCode foundation `_). It runs on Linux, Mac OS X, or Windows. - -.. note:: - - DroneKit-Python is validated against, and hence *most compatible* with, the `ArduPilot UAV Platform `_. - Vehicles running other autopilots may be be less compatible due to differences in adhererence/interpretation of the MAVLink specification. - Please report any autopilot-specific issues `on Github here `_. - - - -API features -============ - - -The API provides classes and methods to: - -- Connect to a vehicle (or multiple vehicles) from a script -- Get and set vehicle state/telemetry and parameter information. -- Receive asynchronous notification of state changes. -- Guide a UAV to specified position (GUIDED mode). -- Send arbitrary custom messages to control UAV movement and other hardware (GUIDED mode). -- Create and manage waypoint missions (AUTO mode). -- Override RC channel settings. - -A complete API reference is available :ref:`here `. - - -Technical support -================= - -This documentation is a great place to get started with developing DroneKit Python APIs. - -If you run into problems, the best place to ask questions is the `DroneKit-Python Forum `_. -If your problem turns out to be a bug, then it should be `posted on Github `_. - - - diff --git a/simulation/extension_docker/dronekit-python/docs/about/release_notes.rst b/simulation/extension_docker/dronekit-python/docs/about/release_notes.rst deleted file mode 100644 index c85bc804..00000000 --- a/simulation/extension_docker/dronekit-python/docs/about/release_notes.rst +++ /dev/null @@ -1,36 +0,0 @@ -============= -Release Notes -============= - -This page contains the release notes for DroneKit-Python ``minor`` and ``major`` releases. - -.. note:: - - DroneKit-Python marks releases using the ``major.minor.patch`` release numbering convention, where ``patch`` is used to denote only bug fixes, ``minor`` is used for releases with new features, and ``major`` indicates the release contains significant API changes. - - - -Latest release -============== - -.. include:: github_latest_release.txt - -All releases -============ - -For information about all past releases, please see `this link on Github `_. - -Working with releases -======================= - -The following PyPI commands are useful for working with different version of DroneKit Python: - -.. code-block:: bash - - pip install dronekit # Install the latest version - pip install dronekit --upgrade # Update to the latest version - pip show dronekit # Find out what release you have installed - pip install dronekit==2.0.0rc1 # Get a sepcific old release (in this case 2.0.0rc1) - -See `Release History on the package ranking page `_ for a list of all releases available on PyPI. - diff --git a/simulation/extension_docker/dronekit-python/docs/automodule.rst b/simulation/extension_docker/dronekit-python/docs/automodule.rst deleted file mode 100644 index ef3dd541..00000000 --- a/simulation/extension_docker/dronekit-python/docs/automodule.rst +++ /dev/null @@ -1,21 +0,0 @@ -.. _api_reference: - -============================= -DroneKit-Python API Reference -============================= - - -.. automodule:: dronekit - :members: - :inherited-members: - - - -.. toctree:: - :hidden: - - Index - - - -.. todolist:: \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/docs/conf.py b/simulation/extension_docker/dronekit-python/docs/conf.py deleted file mode 100644 index 2509fc2d..00000000 --- a/simulation/extension_docker/dronekit-python/docs/conf.py +++ /dev/null @@ -1,244 +0,0 @@ -# -*- coding: utf-8 -*- -# -# DroneKit documentation build configuration file, created by -# sphinx-quickstart on Wed Mar 19 15:28:50 2014. -# -# This file is execfile()d with the current directory set to its containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys, os -import sphinx_3dr_theme - -# 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. -sys.path.append(os.path.abspath('..')) - -# -- General configuration ----------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.todo', 'sphinx.ext.coverage'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'DroneKit Python' -copyright = u'2015-2016, 3D Robotics' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '2.4' -# The full version, including alpha/beta/rc tags. -release = '2.4.0' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['_build'] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - - -# -- 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 = 'sphinx_3dr_theme' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -html_theme_path = [sphinx_3dr_theme.get_html_theme_path()] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# 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'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'DroneKitdoc' - - -# -- Options for LaTeX output -------------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'DroneKit.tex', u'DroneKit Documentation', - u'Kevin Hester', 'manual'), -] - - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output -------------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'dronekit', u'DroneKit Documentation', - [u'Kevin Hester'], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------------ - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'DroneKit', u'DroneKit Documentation', - u'Kevin Hester', 'DroneKit', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' diff --git a/simulation/extension_docker/dronekit-python/docs/contributing/contributions_api.rst b/simulation/extension_docker/dronekit-python/docs/contributing/contributions_api.rst deleted file mode 100644 index 9a3c97b7..00000000 --- a/simulation/extension_docker/dronekit-python/docs/contributing/contributions_api.rst +++ /dev/null @@ -1,203 +0,0 @@ -.. _contributing_api: - -======================= -Contributing to the API -======================= - -This article provides a high level overview of how to contribute changes to the DroneKit-Python source code. - -.. tip:: - - We highly recommend that changes and ideas are `discussed with the project team - `_ before starting work! - - -Submitting changes -================== - -Contributors should fork the main `dronekit/dronekit-python/ `_ -repository and contribute changes back to the project master branch using pull requests - -* Changes should be :ref:`tested locally ` before submission. -* Changes to the public API should be :ref:`documented ` (we will provide subediting support!) -* Pull requests should be as small and focussed as possible to make them easier to review. -* Pull requests should be rebased against the main project before submission to make integration easier. - - - -.. _contributing-test-code: - -Test code -========= - -There are three test suites in DroneKit-Python: - -* **Unit tests** (:file:`tests/unit`) — verify all code paths of the API. -* **Integration tests** (:file:`tests/sitl`) — verify real-world code, examples, and documentation as they would perform in a real environment. - -Test code should be used to verify new and changed functionality. New tests should: - -#. Verify all code paths that code can take. -#. Be concise and straightforward. -#. Be documented. - - -Setting up local testing ------------------------- - -Follow the links below to set up a development environment on your Linux or Windows computer. - -* :ref:`dronekit_development_linux` -* :ref:`dronekit_development_windows` - -The tests require additional pip modules, including `nose `_, a -Python library and tool for writing and running test scripts. These can be installed separately using either of the commands below: - -.. code:: bash - - # Install just the additional requirements for tests - pip install requests nose mock - - # (or) Install all requirements for dronekit, tests, and building documentation - pip install -r requirements.txt - -For several tests, you may be required to set an **environment variable**. In your command line, you can set the name of a variable to equal a value using the following invocation, depending on your OS: - -.. code:: bash - - export NAME=VALUE # works on OS X and Linux - set NAME=VALUE # works on Windows cmd.exe - $env:NAME = "VALUE" # works on Windows Powershell - -Unit tests ----------- - -All new features should be created with accompanying unit tests. - -DroneKit-Python unit tests are based on the `nose `_ test framework, -and use `mock `_ to simulate objects and APIs and -ensure correct results. - -To run the tests and display a summary of the results (on any OS), -navigate to the **dronekit-python** folder and enter the following -command on a terminal/prompt: - -.. code:: bash - - nosetests dronekit.test.unit - - - - -Writing a new unit test -^^^^^^^^^^^^^^^^^^^^^^^ - -Create any file named :file:`test_XXX.py` in the :file:`tests/unit` folder to add it as a test. -Feel free to copy from existing tests to get started. When *nosetests* is run, it will add your new test to its summary. - -Tests names should be named based on their associated Github issue (for example, -``test_12.py`` for `issue #12 `_) -or describe the functionality covered (for example, ``test_waypoints.py`` -for a unit test for the waypoints API). - -Use assertions to test your code is consistent. You can use the built-in Python ``assert`` macro as well as ``assert_equals`` and ``assert_not_equals`` -from the ``notestools`` module: - -.. note:: - - Avoiding printing any data from your test! - -.. code:: python - - from nose.tools import assert_equals, assert_not_equals - - def test_this(the_number_two): - assert the_number_two > 0, '2 should be greater than zero!' - assert_equals(the_number_two, 2, '2 should equal two!') - assert_not_equals(the_number_two, 1, '2 should equal one!') - -Please add documentation to each test function describing what behavior it verifies. - - -Integration tests ------------------ - -Integrated tests use a custom test runner that is similar to *nosetests*. On any OS, enter the following command on a terminal/prompt to run all the integrated tests (and display summary results): - -.. code:: bash - - cd dronekit-python - nosetests dronekit.test.sitl - -You can choose to run a specific tests. The example below shows how to run -**\dronekit-python\dronekit\test\sitl\test_12.py**. - -.. code:: bash - - nosetests dronekit.test.sitl.test_12 - - -Configuring the test environment -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Integrated tests use the SITL environment to run DroneKit tests against a simulated Copter. Because these tests emulate Copter in real-time, you can set several environment variables to tweak the environment that code is run in: - -#. ``TEST_SPEEDUP`` - Speedup factor to SITL. Default is ``TEST_SPEEDUP=1``. You can increase this factor to speed up how long your tests take to run. -#. ``TEST_RATE`` - Sets framerate. Default is ``TEST_RATE=200`` for copter, 50 for rover, 50 for plane. -#. ``TEST_RETRY`` - Retry failed tests. Default is ``TEST_RETRY=1``. This is useful if your testing environment generates inconsistent success rates because of timing. - - - -Writing a new integration test -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Integration tests should be written or improved whenever: - -#. New functionality has been added to encapsulate or abstract older methods of interacting with the API. -#. Example code or documentation has been added. -#. A feature could not be tested by unit tests alone (e.g. timing issues, mode changing, etc.) - -You can write a new integrated test by adding (or copying) a file with the naming scheme :file:`test_XXX.py` to the :file:`tests/sitl` directory. - -Tests names should be named based on their associated Github issue (for example, -``test_12.py`` for `issue #12 `_) -or describe the functionality covered (for example, ``test_waypoints.py`` -for an integration test for the waypoints API). - -Tests should minimally use the imports shown below and decorate test functions with ``@with_sitl`` -(this sets up the test and passes in a connection string for SITL). - -.. code:: python - - from dronekit import connect - from dronekit.test import with_sitl - from nose.tools import assert_equals, assert_not_equals - - @with_sitl - def test_something(connpath): - vehicle = connect(connpath) - - # Test using assert, assert_equals and assert_not_equals - ... - - vehicle.close() - - -Use assertions to test your code is consistent. You can use the built-in Python ``assert`` macro as well as ``assert_equals`` and ``assert_not_equals`` -from the ``testlib`` module: - -.. note:: - - Avoiding printing any data from your test! - - - -.. code:: python - - from testlib import assert_equals - - def test_this(the_number_two): - assert the_number_two > 0, '2 should be greater than zero!' - assert_equals(the_number_two, 2, '2 should equal two!' - -Please add documentation to each test function describing what behavior it verifies. diff --git a/simulation/extension_docker/dronekit-python/docs/contributing/contributions_documentation.rst b/simulation/extension_docker/dronekit-python/docs/contributing/contributions_documentation.rst deleted file mode 100644 index abe7159b..00000000 --- a/simulation/extension_docker/dronekit-python/docs/contributing/contributions_documentation.rst +++ /dev/null @@ -1,103 +0,0 @@ -.. _contributing-to-documentation: - -================================= -Contributing to the Documentation -================================= - -One of the best ways that you can help is by improving this documentation. Here we explain -the documentation system, how to build the documents locally, and how to submit your changes. - - -Documentation system overview -============================= - -The documentation source files are `stored in Github `_. -The content is written in plain-text files (file-extension :file:`.rst`) using -`reStructuredText `_ markup, and is compiled into HTML using the -`Sphinx Documentation Generator `_. - -Submitting changes -================== - -The process and requirements for submitting changes to the documentation are **the same** as when -:ref:`contributing to the source code `. - -As when submitting source code you should fork the main project Github repository and -contribute changes back to the project using pull requests. The changes should be tested -locally (by :ref:`building the docs `) before being submitted. - -See :ref:`contributing_api` for more information. - -.. _contributing_building_docs: - -Building the docs -================= - -We've made it very easy to get started by providing a `Vagrant `_ based setup for :program:`Sphinx`. Using :program:`Vagrant` you can work with source files on your host machine using a familiar :program:`git` client and text editor, and then invoke :program:`Sphinx` in the :program:`Vagrant` VM to compile the source to HTML. - -The instructions below explain how to get the documentation source, and build it using our Vagrant VM: - -* Install the Vagrant pre-conditions: - - * `Download and install VirtualBox `_. - * `Download and install Vagrant for your platform `_ (Windows, OS-X and Linux are supported). - -* `Fork the official dronekit-python repo `_ -* Clone your fork of the Github repository anywhere on the host PC: :: - - git clone https://github.com/YOUR-REPOSITORY/dronekit-python.git - -* Navigate to the root of *dronekit-python* and start the Vagrant VM: - :: - - cd /your-path-to-clone/dronekit-python/ - vagrant up - - .. note:: This may take a long time to complete the first time it is run — Vagrant needs to download the virtual machine and then set up Sphinx. - -* When the VM is running, you can build the source by entering the following command in the prompt: - :: - - vagrant ssh -c "cd /vagrant/docs && make html" - - The files will be built by :program:`Sphinx`, and will appear on the host system in :file:`/dronekit-python/docs/\_build/html/`. To preview, simply open them in a Web browser. - - .. note:: - - The ``vagrant ssh -c "cd /vagrant/docs && make html"`` command starts (and closes) an SSH session with the VM. If you plan on building the source a number of times it is much faster to keep the session open: - - :: - - vagrant ssh # Open an SSH session with the Vagrant VM - cd /vagrant/docs # Navigate to the docs root (contains Sphinx configuration files) - make html # Build the HTML - ... # Repeat "make html" as many time as needed - make html - exit # Close the SSH session. - - - -* When you are finished you can suspend the VM. Next time you need to build more HTML simply restart it (this is a fast operation): - :: - - vagrant suspend #Suspend the VM - vagrant resume #Restart the VM - vagrant ssh -c "cd /vagrant/docs && make html" #Build files when needed. - - -Style guide -=========== - -.. tip:: - - This guide is evolving. The most important guidance we can give is - to *copy the existing style of reference, guide and example material*! - - -#. Use US English for spelling. - -#. Use emphasis sparingly (italic, bold, underline). - -#. Use `Sphinx semantic markup `_ to mark up *types* of text (key-presses, file names etc.) - -#. Use double backticks (``) around ``inline code`` items. \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/docs/contributing/developer_setup_linux.rst b/simulation/extension_docker/dronekit-python/docs/contributing/developer_setup_linux.rst deleted file mode 100644 index 6bf8a965..00000000 --- a/simulation/extension_docker/dronekit-python/docs/contributing/developer_setup_linux.rst +++ /dev/null @@ -1,42 +0,0 @@ -.. _dronekit_development_linux: - -=================================== -Building DroneKit-Python on Linux -=================================== - -The setup for *developing* DroneKit-Python on Linux is almost the same as for *using* -DroneKit-Python. We therefore recommend that you start by following the instructions in -:ref:`installing_dronekit`. - -When you've got DroneKit and a vehicle (simulated or real) communicating, you can -then build and install your own fork of DroneKit, as discussed below. - - -Fetch and build DroneKit source -=============================== - -#. Fork the `dronekit-python `_ project on Github. - -#. Run the following commands to clone and build DroneKit (in the directory of your choice): - - .. code:: bash - - git clone https://github.com//dronekit-python.git - cd ./dronekit-python - sudo python setup.py build - sudo python setup.py install - - -Updating DroneKit -================= - -Navigate to your local git fork, pull the latest version, and rebuild/install: - -.. code:: bash - - cd .//dronekit-python - git pull - sudo python setup.py build - sudo python setup.py install - - diff --git a/simulation/extension_docker/dronekit-python/docs/contributing/developer_setup_windows.rst b/simulation/extension_docker/dronekit-python/docs/contributing/developer_setup_windows.rst deleted file mode 100644 index b9d65ef2..00000000 --- a/simulation/extension_docker/dronekit-python/docs/contributing/developer_setup_windows.rst +++ /dev/null @@ -1,46 +0,0 @@ -.. _dronekit_development_windows: - -=================================== -Building DroneKit-Python on Windows -=================================== - -This article shows how to set up an environment for *developing* DroneKit-Python on Windows. - - -Install DroneKit using WinPython command line -============================================= - - -First set up a command line DroneKit-Python installation. We recommend *WinPython* or *ActivePython*, as discussed in :ref:`installing_dronekit`. - - - -Fetch and build DroneKit source -=============================== - -#. Fork the `dronekit-python `_ project on Github. - -#. Open the *WinPython Command Prompt*. Run the following commands to clone and build DroneKit (in the directory of your choice): - - .. code:: bash - - git clone https://github.com//dronekit-python.git - cd dronekit-python - python setup.py build - python setup.py install - - - -Updating DroneKit -================= - -Navigate to your local git fork, pull the latest version, and rebuild/install: - -.. code:: bash - - cd /dronekit-python - git pull - python setup.py build - python setup.py install - - diff --git a/simulation/extension_docker/dronekit-python/docs/contributing/getting_started.rst b/simulation/extension_docker/dronekit-python/docs/contributing/getting_started.rst deleted file mode 100644 index 563c640e..00000000 --- a/simulation/extension_docker/dronekit-python/docs/contributing/getting_started.rst +++ /dev/null @@ -1,18 +0,0 @@ -.. _contributing_getting_started: - -======================= -How you can Contribute -======================= - -One of the best ways you can contribute is to simply *use the API* and share your -`bug reports and enhancement suggestions on Github `_. -These can cover anything: from APIs that don't work properly through to needed features or documentation. - -If you want to take a more active role, then a good place to start is with the project's -`open issues `_ on Github. In particular, -:ref:`documentation issues ` can be resolved without a deep knowledge of the code, -and will help you learn more about the project. - -If there is a feature that you want to add, then please do so! Before you start we highly recommend that -you first create an issue in Github so it can be tracked and discussed! - diff --git a/simulation/extension_docker/dronekit-python/docs/contributing/index.rst b/simulation/extension_docker/dronekit-python/docs/contributing/index.rst deleted file mode 100644 index 3bee5cc6..00000000 --- a/simulation/extension_docker/dronekit-python/docs/contributing/index.rst +++ /dev/null @@ -1,24 +0,0 @@ -.. _contributing: - -============ -Contributing -============ - -DroneKit is an open-source project. We welcome any contribution that will improve the API and make it easier to use. - -The articles below explain some of the :ref:`opportunities ` for working on the project, how to :ref:`contribute to the API ` or the :ref:`documentation `, and how to set up a :ref:`development environment on Linux ` or :ref:`Windows `. - - -.. toctree:: - :maxdepth: 1 - - getting_started - contributions_api - contributions_documentation - developer_setup_windows - developer_setup_linux - - - - - diff --git a/simulation/extension_docker/dronekit-python/docs/develop/MissionPlanner_ConnectPort.png b/simulation/extension_docker/dronekit-python/docs/develop/MissionPlanner_ConnectPort.png deleted file mode 100644 index 4f4fa900..00000000 Binary files a/simulation/extension_docker/dronekit-python/docs/develop/MissionPlanner_ConnectPort.png and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/docs/develop/best_practice.rst b/simulation/extension_docker/dronekit-python/docs/develop/best_practice.rst deleted file mode 100644 index dec8c064..00000000 --- a/simulation/extension_docker/dronekit-python/docs/develop/best_practice.rst +++ /dev/null @@ -1,246 +0,0 @@ -.. _best_practices: - -============== -Best Practices -============== - -This guide provides a broad overview of how to use the API, its main programming idioms -and best practices. More detail information is linked from each section. - - -General considerations -====================== - -DroneKit-Python communicates with vehicle autopilots using the MAVLink protocol, -which defines how commands, telemetry and vehicle settings/parameters -are sent between vehicles, companion computers, ground stations and other systems on -a MAVLink network. - -Some general considerations from using this protocol are: - -* Messages and message acknowledgments are not guaranteed to arrive (the protocol is not "lossless"). -* Commands may be silently ignored by the Autopilot if it is not in a state where it can - safely act on them. -* Command acknowledgment and completion messages are not sent in most cases - (and if sent, may not arrive). -* Commands may be interrupted before completion. -* Autopilots may choose to interpret the protocol in slightly different ways. -* Commands can arrive at the autopilot from multiple sources. - -Developers should code defensively. Where possible: - -* Check that a vehicle is in a state to obey a command (for example, - poll on :py:func:`Vehicle.is_armable ` - before trying to arm the vehicle). -* Don't assume that a command has succeeded until the changed behaviour is observed. - In particular we recommend a launch sequence where you check that the mode and arming - have succeeded before attempting to take off. -* Monitor for state changes and react accordingly. - For example, if the user changes the mode from ``GUIDED`` your script should - stop sending commands. -* Verify that your script can run inside the normal latency limits for message passing - from the vehicle and tune any monitoring appropriately. - - -Connecting -========== - -In most cases you'll use the normal way to :ref:`connect to a vehicle `, -setting ``wait_ready=True`` to ensure that the vehicle is already populated with attributes -when the :py:func:`connect() ` returns: - -.. code:: python - - from dronekit import connect - - # Connect to the Vehicle (in this case a UDP endpoint) - vehicle = connect('REPLACE_connection_string_for_your_vehicle', wait_ready=True) - -The ``connect()`` call will sometimes fail with an exception. -Additional information about an exception can be obtained by -running the connect within a ``try-catch`` block as shown: - -.. code-block:: python - - import dronekit - import socket - import exceptions - - - try: - dronekit.connect('REPLACE_connection_string_for_your_vehicle', heartbeat_timeout=15) - - # Bad TCP connection - except socket.error: - print 'No server exists!' - - # Bad TTY connection - except exceptions.OSError as e: - print 'No serial exists!' - - # API Error - except dronekit.APIException: - print 'Timeout!' - - # Other error - except: - print 'Some other error!' - -.. tip:: - - The default ``heartbeat_timeout`` on connection is 30 sections. Usually a connection will - succeed quite quickly, so you may wish to reduce this in the ``connect()`` method as shown in the - code snippet above. - -If a connection succeeds from a ground station, but not from DroneKit-Python it may be that your baud -rate is incorrect for your hardware. This rate can also be set in the ``connect()`` method. - - -Launch sequence -=============== - -Generally you should use the standard launch sequence described in :doc:`../guide/taking_off`: - -* Poll on :py:func:`Vehicle.is_armable ` - until the vehicle is ready to arm. -* Set the :py:attr:`Vehicle.mode ` to ``GUIDED`` -* Set :py:attr:`Vehicle.armed ` to ``True`` and - poll on the same attribute until the vehicle is armed. -* Call :py:func:`Vehicle.simple_takeoff ` - with a target altitude. -* Poll on the altitude and allow the code to continue only when it is reached. - -The approach ensures that commands are only sent to the vehicle when it is able -to act on them (e.g. we know :py:func:`Vehicle.is_armable ` -is ``True`` before trying to arm, we know -:py:attr:`Vehicle.armed ` is ``True`` before we take off). -It also makes debugging takeoff problems a lot easier. - - -Movement commands -================= - -DroneKit-Python provides :py:func:`Vehicle.simple_goto ` for moving to a specific position (at a defined speed). It is also possible to control movement by sending commands to specify the vehicle's :ref:`velocity components `. - -.. note:: - - As with :py:func:`Vehicle.simple_takeoff `, movement - commands are asynchronous, and will be interrupted if another command arrives - before the vehicle reaches its target. Calling code should block and wait (or - check that the operation is complete) before preceding to the next command. - -For more information see: :ref:`guided_mode_copter`. - - -Vehicle information -=================== - -Vehicle state information is exposed through vehicle *attributes* which can be read and observed (and in some cases written) -and vehicle settings which can be read, written, iterated and observed using *parameters* (a special attribute). All the attributes are documented in :doc:`../guide/vehicle_state_and_parameters`. - -Attributes are populated by MAVLink messages from the vehicle. -Information read from an attribute may not precisely reflect the actual value on the vehicle. Commands sent -to the vehicle may not arrive, or may be ignored by the autopilot. - -If low-latency is critical, we recommend you verify that the update rate is achievable and -perhaps modify script behaviour if :py:attr:`Vehicle.last_heartbeat ` falls outside -a useful range. - -When setting attributes, poll their values to confirm that they have changed. This applies, in particular, -to :py:attr:`Vehicle.armed ` and :py:attr:`Vehicle.mode `. - - - -Missions and waypoints -====================== - -DroneKit-Python can also :ref:`create and modify autonomous missions `. - -While it is possible to construct DroneKit-Python apps by dynamically constructing missions "on the fly", we recommend you use guided mode for Copter apps. This generally results in a better experience. - -.. tip:: - - If a mission command is not available in guided mode, - it can be useful to switch to a mission and call it, then change - back to normal guided mode operation. - - -Monitor and react to state changes -================================== - -Almost all attributes can be observed - see :ref:`vehicle_state_observe_attributes` for more information. - -Exactly what state information you observe, and how you react to it, depends on your particular script: - -* Most standalone apps should monitor the :py:func:`Vehicle.mode ` and - stop sending commands if the mode changes unexpectedly (this usually indicates - that the user has taken control of the vehicle). -* Apps might monitor :py:func:`Vehicle.last_heartbeat ` - and could attempt to reconnect if the value gets too high. -* Apps could monitor :py:func:`Vehicle.system_status ` - for ``CRITICAL`` or ``EMERGENCY`` in order to implement specific emergency handling. - - -Sleep the script when not needed -================================ - -Sleeping your script can reduce the CPU overhead. - -For example, at low speeds you might only need to check whether you've reached a target every few seconds. -Using ``time.sleep(2)`` between checks will be more efficient than checking more often. - - -Exiting a script -================ - -Scripts should call :py:func:`Vehicle.close() ` -before exiting to ensure that all messages have flushed before the script completes: - -.. code:: python - - # About to exit script - vehicle.close() - - -Subclass Vehicle -===================================== - -If you need to use functionality that is specific to particular hardware, we -recommend you subclass :py:class:`Vehicle ` and pass this new class into -:py:func:`connect() `. - -:doc:`../examples/create_attribute` shows how you can do this. - - - - -Debugging -========= - -DroneKit-Python apps are ordinary standalone Python scripts, and can be :doc:`debugged using standard Python methods <../guide/debugging>` (including the debugger/IDE of your choice). - - -Launching scripts -================= - -Scripts are run from an ordinary Python command prompt. For example: - -.. code:: bash - - python some_python_script.py [arguments] - -Command line arguments are passed into the script as ``sys.argv`` variables (the normal) -and you can use these directly or via an argument parser (e.g. -`argparse `_). - - -Current script directory -======================== - -You can use normal Python methods for getting file system information: - -.. code-block:: python - - import os.path - full_directory_path_of_current_script = os.path.dirname(os.path.abspath(__file__)) - diff --git a/simulation/extension_docker/dronekit-python/docs/develop/coding_standards.rst b/simulation/extension_docker/dronekit-python/docs/develop/coding_standards.rst deleted file mode 100644 index 36828a5c..00000000 --- a/simulation/extension_docker/dronekit-python/docs/develop/coding_standards.rst +++ /dev/null @@ -1,14 +0,0 @@ -.. _coding_standards: - -========================== -Coding Standards -========================== - -DroneKit-Python does not impose (or recommend) a particular set of coding standards -for third party code. - -Internally we run the `YAPF formatter `_ -on major releases and we expect contributors to copy the patterns used in similar -code within the existing code base. - - \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/docs/develop/companion-computers.rst b/simulation/extension_docker/dronekit-python/docs/develop/companion-computers.rst deleted file mode 100644 index f18dcb2b..00000000 --- a/simulation/extension_docker/dronekit-python/docs/develop/companion-computers.rst +++ /dev/null @@ -1,35 +0,0 @@ -.. _supported-companion-computers: - -=================== -Companion Computers -=================== - -A companion computer is a device that travels on-board the vehicle and controls/communicates with the autopilot over a low-latency link. -Apps running on a companion computer can perform computationally intensive or time-sensitive tasks, and add much greater intelligence -than is provided by the autopilot alone. - -DroneKit can be used with onboard computers running variants of Linux that support both Python and the installation of Python packages from the Internet. -The following computing platforms are known to work with DroneKit, and are supported by the ArduPilot developer community. - - -RaspberryPi ------------ - -* `Communicating with Raspberry Pi via MAVLink `_ -* `Making a Mavlink WiFi bridge using the Raspberry Pi `_ - -Intel Edison ------------- - -* `Edison for drones `_ - -BeagleBoneBlack ---------------- - -* `BeaglePilot `_ - -Odroid ------- -* `Communicating with ODroid via MAVLink `_ -* `ODroid Wifi Access Point for sharing files via Samba `_ - diff --git a/simulation/extension_docker/dronekit-python/docs/develop/index.rst b/simulation/extension_docker/dronekit-python/docs/develop/index.rst deleted file mode 100644 index 25099294..00000000 --- a/simulation/extension_docker/dronekit-python/docs/develop/index.rst +++ /dev/null @@ -1,24 +0,0 @@ -======================== -Developing with DroneKit -======================== - -DroneKit-Python is primarily intended for use on Linux-based :doc:`companion-computers` that travel -on a vehicle and communicate with the autopilot via a serial port. It can also be used -on ground-based computers running Linux, Windows or Mac OSX (communicating using WiFi or a telemetry radio). - -During development you'll generally run it on a development computer, communicating with a -:doc:`simulated vehicle` running on the same machine (via a UDP connection). - -This section contains topics explaining how to develop with DroneKit-Python, -covering subjects like installation, setting up the target vehicle or simulator, best practices -and coding standards. - - -.. toctree:: - :maxdepth: 1 - - installation - companion-computers - Simulated Vehicle - best_practice - coding_standards \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/docs/develop/installation.rst b/simulation/extension_docker/dronekit-python/docs/develop/installation.rst deleted file mode 100644 index bcfe09f6..00000000 --- a/simulation/extension_docker/dronekit-python/docs/develop/installation.rst +++ /dev/null @@ -1,49 +0,0 @@ -.. _installing_dronekit: - -=================== -Installing DroneKit -=================== - -DroneKit-Python can be installed on a Linux, Mac OSX, or Windows computer that -has Python 2.7 or Python 3 installed and can install Python packages from the Internet. - -It is installed from **pip** on all platforms: - -.. code-block:: bash - - pip install dronekit - - -**Installation notes:** - -* Install `dronekit` with `pip` inside a virtualenv: - - .. code-block:: bash - - python3 -m venv .venv - . .venv/bin/activate - pip install dronekit - -* On Linux you may need to first install **pip** and **python-dev**: - - .. code-block:: bash - - sudo apt-get install python-pip python-dev - - Alternatively, you can use the `ensurepip` module to install or upgrade Pip on your system: - - - .. code-block:: bash - - python -m ensurepip --upgrade - -* :doc:`companion-computers` are likely to run on stripped down versions of Linux. Ensure - you use a variant that supports Python 2.7 and can install Python packages from the Internet. -* Windows does not come with Python by default, but there are - `many distributions available `_. - We have tested against: - - * `WinPython 2.7 64bit `_ (see - `these instructions for installation and registration `_). This is the most tested version. - * `ActiveState ActivePython 2.7 `_. -* Python 3 is fully supported. diff --git a/simulation/extension_docker/dronekit-python/docs/develop/sitl_setup.rst b/simulation/extension_docker/dronekit-python/docs/develop/sitl_setup.rst deleted file mode 100644 index 8da0c387..00000000 --- a/simulation/extension_docker/dronekit-python/docs/develop/sitl_setup.rst +++ /dev/null @@ -1,200 +0,0 @@ -.. _sitl_setup: - -===================================== -Setting up a Simulated Vehicle (SITL) -===================================== - -The `SITL (Software In The Loop) `_ -simulator allows you to create and test DroneKit-Python apps without a real vehicle (and from the comfort of -your own developer desktop!). - -SITL can run natively on Linux (x86 architecture only), Mac and Windows, or within a virtual machine. It can be -installed on the same computer as DroneKit, or on another computer on the same network. - -The sections below explain how to install and run SITL, and how to connect to DroneKit-Python and Ground -Stations at the same time. - - -.. _dronekit_sitl: - -DroneKit-SITL -============= - -DroneKit-SITL is the simplest, fastest and easiest way to run SITL on Windows, Linux (x86 architecture only), or Mac OS X. -It is installed from Python's *pip* tool on all platforms, and works by downloading and running pre-built -vehicle binaries that are appropriate for the host operating system. - -This section provides an overview of how to install and use DroneKit-SITL. For more information, see -the `project on Github `_. - -.. note:: - - DroneKit-SITL is still relatively experimental and there are only a few pre-built vehicles - (some of which are quite old and/or unstable). - - The binaries are built and tested on Windows 10, Ubuntu Linux, and Mac OS X - "El Capitan". Binaries are only available for x86 architectures. ARM builds - (e.g. for RPi) are not supported. - - Please report any issues on `Github here `_. - -Installation ------------- - -The tool is installed (or updated) on all platforms using the command: - -.. code-block:: bash - - pip install dronekit-sitl -UI - -Running SITL ------------- - -To run the latest version of Copter for which we have binaries (downloading the binaries if needed), you can simply call: - -.. code-block:: bash - - dronekit-sitl copter - -SITL will then start and wait for TCP connections on ``127.0.0.1:5760``. - -You can specify a particular vehicle and version, and also parameters like the home location, -the vehicle model type (e.g. "quad"), etc. For example: - -.. code-block:: bash - - dronekit-sitl plane-3.3.0 --home=-35.363261,149.165230,584,353 - -There are a number of other useful arguments: - -.. code-block:: bash - - dronekit-sitl -h #List all parameters to dronekit-sitl. - dronekit-sitl copter -h #List additional parameters for the specified vehicle (in this case "copter"). - dronekit-sitl --list #List all available vehicles. - dronekit-sitl --reset #Delete all downloaded vehicle binaries. - dronekit-sitl ./path [args...] #Start SITL instance at target file location. - - -.. note:: - - You can also use *dronekit-sitl* to start a SITL executable that you have built locally from source. - To do this, put the file path of the target executable in the `SITL_BINARY` environment variable, - or as the first argument when calling the tool. - - -.. _connecting_dronekit_sitl: - -Connecting to DroneKit-SITL ---------------------------- - -DroneKit-SITL waits for TCP connections on ``127.0.0.1:5760``. DroneKit-Python scripts running on the same -computer can connect to the simulation using the connection string as shown: - -.. code-block:: python - - vehicle = connect('tcp:127.0.0.1:5760', wait_ready=True) - -After something connects to port ``5760``, SITL will then wait for additional connections on port ``5763`` -(and subsequently ``5766``, ``5769`` etc.) - -.. note:: - - While you can connect to these additional ports, some users have reported problems when - viewing the running examples with *Mission Planner*. If you need to connect a ground station - and DroneKit at the same time we recommend you use *MAVProxy* (see :ref:`viewing_uav_on_map`). - - - -.. _dronekit_sitl_api: - -DroneKit-SITL Python API ------------------------- - -DroneKit-SITL `exposes a Python API `_, which you can use to start and control simulation from within your scripts. This is particularly useful for test code and :ref:`examples `. - - - - -Building SITL from source -========================= - -You can natively build SITL from source on Linux, Windows and Mac OS X, -or from within a Vagrant Linux virtual environment. - -Building from source is useful if you want to need to test the latest changes (or any use -a version for which DroneKit-SITL does not have pre-built binaries). -It can also be useful if you have problems getting DroneKit-SITL to work. - -SITL built from source has a few differences from DroneKit-SITL: - -* MAVProxy is included and started by default. You can use MAVProxy terminal to control the autopilot. -* You connect to SITL via UDP on ``127.0.0.1:14550``. You can use MAVProxy's ``output add`` command to add additional ports if needed. -* You may need to disable arming checks and load autotest parameters to run examples. -* It is easier to `add a virtual rangefinder `_ and `add a virtual gimbal `_ for testing. - -The following topics from the ArduPilot wiki explain how to set up Native SITL builds: - -* `Setting up SITL on Linux `_ -* `Setting up SITL on Windows `_ -* `Setting up SITL using Vagrant `_ - - -.. _viewing_uav_on_map: - -Connecting an additional Ground Station -======================================= - -You can connect a ground station to an unused port to which messages are being forwarded. - -The most reliable way to add new ports is to use *MAVProxy*: - -* If you're using SITL built from source you will already have *MAVProxy* running. - You can add new ports in the MAVProxy console using ``output add``: - - .. code:: bash - - output add 127.0.0.1:14552 - -* If you're using Dronekit-SITL you can: - - * `Install MAVProxy `_ - for your system. - * In a second terminal spawn an instance of *MAVProxy* to forward messages from - TCP ``127.0.0.1:5760`` to other UDP ports like ``127.0.0.1:14550`` and ``127.0.0.1:14551``: - - .. code-block:: bash - - mavproxy.py --master tcp:127.0.0.1:5760 --sitl 127.0.0.1:5501 --out 127.0.0.1:14550 --out 127.0.0.1:14551 - -Once you have available ports you can connect to a ground station using one UDP address, and DroneKit-Python using the other. - -For example, first connect the script: - -.. code-block:: python - - vehicle = connect('127.0.0.1:14550', wait_ready=True) - - -Then connect Mission Planner to the second UDP port: - -* `Download and install Mission Planner `_ -* Ensure the selection list at the top right of the Mission Planner screen says *UDP* and then select the **Connect** button next to it. - When prompted, enter the port number (in this case 14552). - - .. figure:: MissionPlanner_ConnectPort.png - :width: 50 % - - Mission Planner: Listen Port Dialog - -After connecting, vehicle parameters will be loaded into *Mission Planner* and the vehicle is displayed on the map. - -.. tip:: - - If you're using the :ref:`dronekit_sitl_api` then you will instead have to - connect to SITLs TCP port (as there is no way to set up MAVProxy in this case). - So if DroneKit is connecting to TCP port 5760, you would connect your GCS to 5763. - - Note that a few examples may not behave perfectly using this approach. If you need to - observe them in a GCS you should run SITL externally and use MAVProxy to connect to it. - diff --git a/simulation/extension_docker/dronekit-python/docs/examples/GuidedModeExample_FlyByPosition.png b/simulation/extension_docker/dronekit-python/docs/examples/GuidedModeExample_FlyByPosition.png deleted file mode 100644 index cd8af39f..00000000 Binary files a/simulation/extension_docker/dronekit-python/docs/examples/GuidedModeExample_FlyByPosition.png and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/docs/examples/GuidedModeExample_FlyByVelocity.png b/simulation/extension_docker/dronekit-python/docs/examples/GuidedModeExample_FlyByVelocity.png deleted file mode 100644 index 47509919..00000000 Binary files a/simulation/extension_docker/dronekit-python/docs/examples/GuidedModeExample_FlyByVelocity.png and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/docs/examples/channel_overrides.rst b/simulation/extension_docker/dronekit-python/docs/examples/channel_overrides.rst deleted file mode 100644 index 8c95143f..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/channel_overrides.rst +++ /dev/null @@ -1,176 +0,0 @@ -.. _example_channel_overrides: -.. _vehicle_state_channel_override: - -======================================= -Example: Channels and Channel Overrides -======================================= - -This example shows how to get channel information and to get/set channel-override information. - -.. warning:: - - Channel overrides (a.k.a. "RC overrides") are highly dis-commended (they are primarily intended - for simulating user input and when implementing certain types of joystick control). - - Instead use the appropriate MAVLink commands like DO_SET_SERVO/DO_SET_RELAY, or more generally set - the desired position or direction/speed. - - If you have no choice but to use a channel-override please explain why in a - `Github issue `_ and we will attempt to find a - better alternative. - - -Running the example -=================== - -The example can be run as described in :doc:`running_examples` (which in turn assumes that the vehicle -and DroneKit have been set up as described in :ref:`installing_dronekit`). - -In summary, after cloning the repository: - -#. Navigate to the example folder as shown: - - .. code-block:: bash - - cd dronekit-python/examples/channel_overrides/ - - -#. You can run the example against a simulator (DroneKit-SITL) by specifying the Python script without any arguments. - The example will download SITL binaries (if needed), start the simulator, and then connect to it: - - .. code-block:: bash - - python channel_overrides.py - - On the command prompt you should see (something like): - - .. code:: bash - - Starting copter simulator (SITL) - SITL already Downloaded. - Connecting to vehicle on: tcp:127.0.0.1:5760 - >>> APM:Copter V3.3 (d6053245) - >>> Frame: QUAD - >>> Calibrating barometer - >>> Initialising APM... - >>> barometer calibration complete - >>> GROUND START - Channel values from RC Tx: {'1': 1500, '3': 1000, '2': 1500, '5': 1800, '4': 1500, '7': 1000, '6': 1000, '8': 1800} - Read channels individually: - Ch1: 1500 - Ch2: 1500 - Ch3: 1000 - Ch4: 1500 - Ch5: 1800 - Ch6: 1000 - Ch7: 1000 - Ch8: 1800 - Number of channels: 8 - Channel overrides: {} - Set Ch2 override to 200 (indexing syntax) - Channel overrides: {'2': 200} - Ch2 override: 200 - Set Ch3 override to 300 (dictionary syntax) - Channel overrides: {'3': 300} - Set Ch1-Ch8 overrides to 110-810 respectively - Channel overrides: {'1': 110, '3': 310, '2': 210, '5': 510, '4': 4100, '7': 710, '6': 610, '8': 810} - Cancel Ch2 override (indexing syntax) - Channel overrides: {'1': 110, '3': 310, '5': 510, '4': 4100, '7': 710, '6': 610, '8': 810} - Clear Ch3 override (del syntax) - Channel overrides: {'1': 110, '5': 510, '4': 4100, '7': 710, '6': 610, '8': 810} - Clear Ch5, Ch6 override and set channel 3 to 500 (dictionary syntax) - Channel overrides: {'3': 500} - Clear all overrides - Channel overrides: {} - Close vehicle object - Completed - -#. You can run the example against a specific connection (simulated or otherwise) by passing the :ref:`connection string ` for your vehicle in the ``--connect`` parameter. - - For example, to connect to SITL running on UDP port 14550 on your local computer: - - .. code-block:: bash - - python channel_overrides.py --connect 127.0.0.1:14550 - - -How does it work? -================= - -The RC transmitter channels are connected to the autopilot and control the vehicle. - -The values of the first four channels map to the main flight controls: 1=Roll, 2=Pitch, 3=Throttle, 4=Yaw (the mapping is defined in ``RCMAP_`` parameters in -`Plane `_, -`Copter `_ , -`Rover `_). - -The remaining channel values are configurable, and their purpose can be determined using the -`RCn_FUNCTION parameters `_. -In general a value of 0 set for a specific ``RCn_FUNCTION`` indicates that the channel can be -`mission controlled `_ (i.e. it will not directly be -controlled by normal autopilot code). - -You can read the values of the channels using the :py:attr:`Vehicle.channels ` attribute. The values are regularly updated, -from the UAV, based on the RC inputs from the transmitter. These can be read either as a set or individually: - -.. code:: python - - # Get all channel values from RC transmitter - print "Channel values from RC Tx:", vehicle.channels - - # Access channels individually - print "Read channels individually:" - print " Ch1: %s" % vehicle.channels['1'] - print " Ch2: %s" % vehicle.channels['2'] - -You can override the values sent to the vehicle by the autopilot using :py:attr:`Vehicle.channels.overrides `. -The overrides can be written individually using an indexing syntax or as a set using a dictionary syntax. - -.. code:: python - - # Set Ch2 override to 200 using indexing syntax - vehicle.channels.overrides['2'] = 200 - # Set Ch3, Ch4 override to 300,400 using dictionary syntax" - vehicle.channels.overrides = {'3':300, '4':400} - -To clear all overrides, set the attribute to an empty dictionary. -To clear an individual override you can set its value to ``None`` (or call ``del`` on it): - -.. code:: python - - # Clear override by setting channels to None - # Clear using index syntax - vehicle.channels.overrides['2'] = None - - # Clear using 'del' syntax - del vehicle.channels.overrides['3'] - - # Clear using dictionary syntax (and set override at same time!) - vehicle.channels.overrides = {'5':None, '6':None,'3':500} - - # Clear all overrides by setting an empty dictionary - vehicle.channels.overrides = {} - -Read the channel overrides either as a dictionary or by index. - -.. code:: python - - # Get all channel overrides - print " Channel overrides: %s" % vehicle.channels.overrides - # Print just one channel override - print " Ch2 override: %s" % vehicle.channels.overrides['2'] - -.. note:: - - You'll get a ``KeyError`` exception if you read a channel override that has - not been set. - - -Source code -=========== - -The full source code at documentation build-time is listed below (`current version on github `_): - -.. literalinclude:: ../../examples/channel_overrides/channel_overrides.py - :language: python - diff --git a/simulation/extension_docker/dronekit-python/docs/examples/create_attribute.rst b/simulation/extension_docker/dronekit-python/docs/examples/create_attribute.rst deleted file mode 100644 index 0f83b22f..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/create_attribute.rst +++ /dev/null @@ -1,283 +0,0 @@ -.. _example_create_attribute: - -================================ -Example: Create Attribute in App -================================ - -This example shows how you can subclass :py:class:`Vehicle ` in order to support -new attributes for MAVLink messages within your DroneKit-Python script. The new class is defined in a -separate file (making re-use easy) and is very similar to the code used to implement the in-built attributes. -The new attributes are used *in the same way* as the built-in -:py:class:`Vehicle ` attributes. - -The new class uses the :py:func:`Vehicle.on_message() ` decorator -to set a function that is called to process a specific message, copy its values into an attribute, and notify -observers. An observer is then set on the new attribute using -:py:func:`Vehicle.add_attribute_listener() `. - -Additional information is provided in the guide topic :ref:`mavlink_messages`. - -.. tip:: - - This approach is useful when you urgently need to access messages that are not yet supported as - :py:class:`Vehicle ` attributes. - - Please :ref:`contribute your code to the API ` so that it is available to - (and can be tested by) the whole DroneKit-Python community. - - - -Running the example -=================== - -The example can be run as described in :doc:`running_examples` (which in turn assumes that the vehicle -and DroneKit have been set up as described in :ref:`installing_dronekit`). - -In summary, after cloning the repository: - -#. Navigate to the example folder as shown: - - .. code-block:: bash - - cd dronekit-python\examples\create_attribute\ - -#. You can run the example against a simulator (DroneKit-SITL) by specifying the Python script without any arguments. - The example will download SITL binaries (if needed), start the simulator, and then connect to it: - - .. code-block:: bash - - python create_attribute.py - - On the command prompt you should see (something like): - - .. code:: bash - - Starting copter simulator (SITL) - SITL already Downloaded. - Connecting to vehicle on: tcp:127.0.0.1:5760 - >>> APM:Copter V3.3 (d6053245) - >>> Frame: QUAD - >>> Calibrating barometer - >>> Initialising APM... - >>> barometer calibration complete - >>> GROUND START - Display RAW_IMU messages for 5 seconds and then exit. - RAW_IMU: time_boot_us=15340000,xacc=0,yacc=0,zacc=-1000,xgyro=0,ygyro=1,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=15580000,xacc=0,yacc=0,zacc=-1000,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=15820000,xacc=0,yacc=0,zacc=-999,xgyro=0,ygyro=1,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=16060000,xacc=0,yacc=1,zacc=-999,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=16300000,xacc=0,yacc=0,zacc=-999,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=16540000,xacc=0,yacc=0,zacc=-1000,xgyro=0,ygyro=1,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=16780000,xacc=0,yacc=0,zacc=-999,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=17020000,xacc=1,yacc=0,zacc=-999,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=17260000,xacc=0,yacc=0,zacc=-999,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=17500000,xacc=0,yacc=0,zacc=-1000,xgyro=1,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=17740000,xacc=0,yacc=0,zacc=-999,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=17980000,xacc=0,yacc=0,zacc=-999,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=18220000,xacc=0,yacc=0,zacc=-1000,xgyro=0,ygyro=0,zgyro=1,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=18460000,xacc=0,yacc=0,zacc=-1000,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=18700000,xacc=0,yacc=0,zacc=-999,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=18940000,xacc=1,yacc=0,zacc=-1000,xgyro=0,ygyro=1,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=19180000,xacc=1,yacc=0,zacc=-1000,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=19420000,xacc=0,yacc=0,zacc=-999,xgyro=0,ygyro=0,zgyro=0,xmag=161,ymag=19,zmag=-365 - RAW_IMU: time_boot_us=19660000,xacc=0,yacc=0,zacc=-1000,xgyro=0,ygyro=0,zgyro=0,xmag=154,ymag=52,zmag=-365 - RAW_IMU: time_boot_us=19900000,xacc=0,yacc=0,zacc=-999,xgyro=0,ygyro=0,zgyro=0,xmag=154,ymag=52,zmag=-365 - RAW_IMU: time_boot_us=20140000,xacc=0,yacc=0,zacc=-1000,xgyro=0,ygyro=0,zgyro=0,xmag=154,ymag=52,zmag=-365 - Close vehicle object - - -#. You can run the example against a specific connection (simulated or otherwise) by passing the :ref:`connection string ` for your vehicle in the ``--connect`` parameter. - - For example, to connect to SITL running on UDP port 14550 on your local computer: - - .. code-block:: bash - - python create_attribute.py --connect 127.0.0.1:14550 - - - - -How does it work? -================= - -Subclassing Vehicle -------------------- - -The example file **my_vehicle.py** defines a class for the new attribute (``RawIMU``) and a new vehicle subclass (``MyVehicle``). - -.. note:: - - The example uses the same documentation markup used by the native code, which can be generated into a document set using - Sphinx/autodoc. - - -``RawIMU`` has members for each of the values in the message -(in this case `RAW_IMU `_). It provides an initialiser that sets all the values to -``None`` and a string representation for printing the object. - -.. code:: python - - class RawIMU(object): - """ - The RAW IMU readings for the usual 9DOF sensor setup. - This contains the true raw values without any scaling to allow data capture and system debugging. - - The message definition is here: http://mavlink.org/messages/common#RAW_IMU - - :param time_boot_us: Timestamp (microseconds since system boot). #Note, not milliseconds as per spec - :param xacc: X acceleration (mg) - :param yacc: Y acceleration (mg) - :param zacc: Z acceleration (mg) - :param xgyro: Angular speed around X axis (millirad /sec) - :param ygyro: Angular speed around Y axis (millirad /sec) - :param zgyro: Angular speed around Z axis (millirad /sec) - :param xmag: X Magnetic field (milli tesla) - :param ymag: Y Magnetic field (milli tesla) - :param zmag: Z Magnetic field (milli tesla) - """ - - def __init__(self, time_boot_us=None, xacc=None, yacc=None, zacc=None, xygro=None, ygyro=None, zgyro=None, xmag=None, ymag=None, zmag=None): - """ - RawIMU object constructor. - """ - self.time_boot_us = time_boot_us - self.xacc = xacc - self.yacc = yacc - self.zacc = zacc - self.xgyro = zgyro - self.ygyro = ygyro - self.zgyro = zgyro - self.xmag = xmag - self.ymag = ymag - self.zmag = zmag - - def __str__(self): - """ - String representation of the RawIMU object - """ - return "RAW_IMU: time_boot_us={},xacc={},yacc={},zacc={},xgyro={},ygyro={},zgyro={},xmag={},ymag={},zmag={}".format(self.time_boot_us, self.xacc, self.yacc,self.zacc,self.xgyro,self.ygyro,self.zgyro,self.xmag,self.ymag,self.zmag) - - -``MyVehicle`` is a superclass of ``Vehicle`` (and hence inherits all its attributes). -This first creates a private instance of ``RawIMU``. - -We create a listener using the :py:func:`Vehicle.on_message() ` -decorator. The listener is called for messages that contain the string "RAW_IMU", -with arguments for the vehicle, message name, and the message. It copies the message information into -the attribute and then notifies all observers. - -.. code-block:: python - :emphasize-lines: 6, 9-10, 32 - - class MyVehicle(Vehicle): - def __init__(self, *args): - super(MyVehicle, self).__init__(*args) - - # Create an Vehicle.raw_imu object with initial values set to None. - self._raw_imu = RawIMU() - - # Create a message listener using the decorator. - @self.on_message('RAW_IMU') - def listener(self, name, message): - """ - The listener is called for messages that contain the string specified in the decorator, - passing the vehicle, message name, and the message. - - The listener writes the message to the (newly attached) ``vehicle.raw_imu`` object - and notifies observers. - """ - self._raw_imu.time_boot_us=message.time_usec - self._raw_imu.xacc=message.xacc - self._raw_imu.yacc=message.yacc - self._raw_imu.zacc=message.zacc - self._raw_imu.xgyro=message.xgyro - self._raw_imu.ygyro=message.ygyro - self._raw_imu.zgyro=message.zgyro - self._raw_imu.xmag=message.xmag - self._raw_imu.ymag=message.ymag - self._raw_imu.zmag=message.zmag - - # Notify all observers of new message (with new value) - # Note that argument `cache=False` by default so listeners - # are updaed with every new message - self.notify_attribute_listeners('raw_imu', self._raw_imu) - - @property - def raw_imu(self): - return self._raw_imu - - -.. note:: - - The notifier function (:py:func:`Vehicle.notify_attribute_listeners() `) - should be called every time there is an update from the vehicle. - - You can set a third parameter (``cache=True``) so that it only invokes the listeners when the value *changes*. - This is normally used for attributes like the vehicle mode, where the information is updated - regularly from the vehicle, but client code is only interested when the attribute changes. - - You should not set ``cache=True`` for attributes that represent sensor information or other "live" information, including - the RAW_IMU attribute demonstrated here. Clients can then implement their own caching strategy if needed. - - -At the end of the class we create the public properly ``raw_imu`` which client code may read and observe. - -.. note:: - - The decorator pattern means that you can have multiple listeners for a particular message or for different - messages and they can all have the same function name/prototype (in this case ``listener(self, name, message``). - - -Using the Vehicle subclass --------------------------- - -The **create_attribute.py** file first imports the ``MyVehicle`` class. - - -.. code-block:: python - :emphasize-lines: 2 - - from dronekit import connect, Vehicle - from my_vehicle import MyVehicle #Our custom vehicle class - import time - - -We then call ``connect()``, specifying this new class in the ``vehicle_class`` argument. - -.. code-block:: python - - # Connect to our custom vehicle_class `MyVehicle` at address `args.connect` - vehicle = connect(args.connect, wait_ready=True, vehicle_class=MyVehicle) - -``connect()`` returns a ``MyVehicle`` class which can be used in *exactly the same way* as ``Vehicle`` but with an -additional attribute ``raw_imu``. You can query the attribute to get any of its members, and even add an observer as shown: - -.. code:: python - - # Add observer for the custom attribute - - def raw_imu_callback(self, attr_name, value): - # attr_name == 'raw_imu' - # value == vehicle.raw_imu - print value - - vehicle.add_attribute_listener('raw_imu', raw_imu_callback) - - - -Known issues -============ - -This code has no known issues. - - -Source code -=========== - -The full source code at documentation build-time is listed below (`current version on github `_): - -.. literalinclude:: ../../examples/create_attribute/create_attribute.py - :language: python - -.. literalinclude:: ../../examples/create_attribute/my_vehicle.py - :language: python \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/docs/examples/drone-delivery-command.png b/simulation/extension_docker/dronekit-python/docs/examples/drone-delivery-command.png deleted file mode 100644 index 16f5dbb9..00000000 Binary files a/simulation/extension_docker/dronekit-python/docs/examples/drone-delivery-command.png and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/docs/examples/drone-delivery-splash.png b/simulation/extension_docker/dronekit-python/docs/examples/drone-delivery-splash.png deleted file mode 100644 index eb9996bb..00000000 Binary files a/simulation/extension_docker/dronekit-python/docs/examples/drone-delivery-splash.png and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/docs/examples/drone-delivery-track.png b/simulation/extension_docker/dronekit-python/docs/examples/drone-delivery-track.png deleted file mode 100644 index 11021f68..00000000 Binary files a/simulation/extension_docker/dronekit-python/docs/examples/drone-delivery-track.png and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/docs/examples/drone_delivery.rst b/simulation/extension_docker/dronekit-python/docs/examples/drone_delivery.rst deleted file mode 100644 index 371708e9..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/drone_delivery.rst +++ /dev/null @@ -1,163 +0,0 @@ -=========================== -Example: Drone Delivery -=========================== - -This example shows how to create a `CherryPy `_ based web application that -displays a mapbox map to let you view the current vehicle position and send the vehicle commands -to fly to a particular latitude and longitude. - -New functionality demonstrated by this example includes: - -* Using attribute observers to be notified of vehicle state changes. -* Starting *CherryPy* from a DroneKit application. - - -Running the example -=================== - -The example can be run much as described in :doc:`running_examples` (which in turn assumes that the vehicle -and DroneKit have been set up as described in :ref:`installing_dronekit`). The main exception is that you need to -install the CherryPy dependencies and view the behaviour in a web browser. - -In summary, after cloning the repository: - -#. Navigate to the example folder as shown: - - .. code-block:: bash - - cd dronekit-python\examples\drone_delivery\ - - -#. Install *CherryPy* and any other dependencies from **requirements.pip** in that directory: - - .. code-block:: bash - - pip install -r requirements.pip - -#. You can run the example against the simulator by specifying the Python script without any arguments. - The example will download and start DroneKit-SITL, and then connect to it: - - .. code-block:: bash - - python drone_delivery.py - - On the command prompt you should see (something like): - - .. code:: bash - - >python drone_delivery.py - - D:\Github\dronekit-python\examples\drone_delivery>drone_delivery.py - Starting copter simulator (SITL) - SITL already Downloaded. - local path: D:\Github\dronekit-python\examples\drone_delivery - Connecting to vehicle on: tcp:127.0.0.1:5760 - >>> APM:Copter V3.3 (d6053245) - >>> Frame: QUAD - >>> Calibrating barometer - >>> Initialising APM... - >>> barometer calibration complete - >>> GROUND START - Launching Drone... - [DEBUG]: Connected to vehicle. - [DEBUG]: DroneDelivery Start - [DEBUG]: Waiting for location... - [DEBUG]: Waiting for ability to arm... - [DEBUG]: Running initial boot sequence - [DEBUG]: Changing to mode: GUIDED - [DEBUG]: ... polled mode: GUIDED - [DEBUG]: Waiting for arming... - >>> ARMING MOTORS - >>> GROUND START - >>> Initialising APM... - [DEBUG]: Taking off - http://localhost:8080/ - Waiting for cherrypy engine... - -#. You can run the example against a specific connection (simulated or otherwise) by passing the :ref:`connection string ` for your vehicle in the ``--connect`` parameter. - For example, to connect to Solo: - - .. code-block:: bash - - python drone_delivery.py --connect udpin:0.0.0.0:14550 - - -#. After a short while you should be able to reach your new webserver at http://localhost:8080. - Navigate to the **Command** screen, select a target on the map, then select **Go**. - The command prompt will show something like the message below. - - .. code-block:: bash - - [DEBUG]: Goto: [u'-35.4', u'149.2'], 29.98 - - The web server will switch you to the **Track** screen. You can view the vehicle progress by pressing the - **Update** button. - - -Screenshots -=========== - -The webserver (http://localhost:8080) will look like the following: - -.. image:: drone-delivery-splash.png - -.. image:: drone-delivery-track.png - -.. image:: drone-delivery-command.png - - -How it works -============ - -Using attribute observers -------------------------- - -All attributes in DroneKit can have observers - this is the primary mechanism you should use to be notified of changes in vehicle state. -For instance, `drone_delivery.py `_ calls: - -.. code-block:: python - - self.vehicle.add_attribute_listener('location', self.location_callback) - - ... - - def location_callback(self, vehicle, name, location): - if location.global_relative_frame.alt is not None: - self.altitude = location.global_relative_frame.alt - - self.current_location = location.global_relative_frame - - -This results in DroneKit calling our ``location_callback`` method any time the location attribute gets changed. - -.. tip:: - - It is also possible (and often more elegant) to add listeners using a decorator - - see :py:func:`Vehicle.on_attribute `. - - - -Starting CherryPy from a DroneKit application ---------------------------------------------- - -We start running a web server by calling ``cherrypy.engine.start()``. - -*CherryPy* is a very small and simple webserver. It is probably best to refer to their eight line `tutorial `_ for more information. - - - -Known issues -============ - -This example has the following issues: - -* `#537: Dronekit delivery tracking needs to zoom and also ideally auto update `_ -* `#538: Dronekit delivery example does not exit `_ - -Source code -=========== - -The full source code at documentation build-time is listed below (`current version on github `_): - -.. include:: ../../examples/drone_delivery/drone_delivery.py - :literal: diff --git a/simulation/extension_docker/dronekit-python/docs/examples/flight_replay.rst b/simulation/extension_docker/dronekit-python/docs/examples/flight_replay.rst deleted file mode 100644 index 63b3d175..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/flight_replay.rst +++ /dev/null @@ -1,223 +0,0 @@ -====================== -Example: Flight Replay -====================== - -This example creates and runs a waypoint mission using position information from a TLOG file. - -The log used in this example contains around 2700 points. This is too many points to upload -to the autopilot (and to usefully display). Instead we only add points that are more than -3 metres away from the previously kept point, and only store 99 points in total. -After 60 seconds the mission is ended by setting the mode to RTL (return to launch). - -.. figure:: flight_replay_example.png - :width: 50% - - 99 point mission generated from log - - -.. note:: - - The method used to reduce the number of points is fairly effective, but we - could do better by grouping some of the waypoints, and mapping others using - spline waypoints. This might be a - `fun research project `_! - - - -Running the example -=================== - -The example can be run as described in :doc:`running_examples` (which in turn assumes that the vehicle -and DroneKit have been set up as described in :ref:`installing_dronekit`). - -In summary, after cloning the repository: - -#. Navigate to the example folder as shown: - - .. code-block:: bash - - cd dronekit-python/examples/flight_replay/ - -#. You can run the example against a simulator (DroneKit-SITL) by specifying the Python script without any arguments. - The example will download SITL binaries if needed, start the simulator, and then connect to it: - - .. code-block:: bash - - python flight_replay.py - - On the command prompt you should see (something like): - - .. code:: bash - - Generating waypoints from tlog... - Generated 100 waypoints from tlog - Starting copter simulator (SITL) - SITL already Downloaded. - Connecting to vehicle on: tcp:127.0.0.1:5760 - >>> APM:Copter V3.3 (d6053245) - >>> Frame: QUAD - >>> Calibrating barometer - >>> Initialising APM... - >>> barometer calibration complete - >>> GROUND START - Uploading 100 waypoints to vehicle... - Arm and Takeoff - Waiting for vehicle to initialise... - >>> flight plan received - Waiting for arming... - Waiting for arming... - Waiting for arming... - Waiting for arming... - >>> ARMING MOTORS - >>> GROUND START - Waiting for arming... - >>> Initialising APM... - Waiting for arming... - >>> ARMING MOTORS - Taking off! - Altitude: 0.000000 < 28.500000 - Altitude: 0.010000 < 28.500000 - ... - Altitude: 26.350000 < 28.500000 - Altitude: 28.320000 < 28.500000 - Reached target altitude of ~30.000000 - Starting mission - Distance to waypoint (1): 3.02389745499 - >>> Reached Command #1 - Distance to waypoint (2): 5.57718471895 - Distance to waypoint (2): 4.1504263025 - >>> Reached Command #2 - Distance to waypoint (3): 0.872847106279 - Distance to waypoint (3): 1.88967925144 - Distance to waypoint (3): 2.16157704522 - >>> Reached Command #3 - Distance to waypoint (4): 4.91867197924 - ... - ... - Distance to waypoint (35): 4.37309981133 - >>> Reached Command #35 - Distance to waypoint (36): 5.61829417257 - >>> Reached Command #36 - Return to launch - Close vehicle object - Completed... - - - .. tip:: - It is more interesting to watch the example run on a map than the console. The topic :ref:`viewing_uav_on_map` - explains how to set up *Mission Planner* to view a vehicle running on the simulator (SITL). - -#. You can run the example against a specific connection (simulated or otherwise) by passing the :ref:`connection string ` for your vehicle in the ``--connect`` parameter. - - For example, to connect to SITL running on UDP port 14550 on your local computer: - - .. code-block:: bash - - python simple_goto.py --connect 127.0.0.1:14550 - - - -How it works -============ - -Getting the points ------------------- - -The example parses the **flight.tlog** file for position information. First we read all the points. -We then keep the first 99 points that are at least 3 metres separated from the preceding kept point. - -For safety reasons, the altitude for the waypoints is set to 30 meters (irrespective of the recorded height). - -.. code:: python - - def position_messages_from_tlog(filename): - """ - Given telemetry log, get a series of wpts approximating the previous flight - """ - # Pull out just the global position msgs - messages = [] - mlog = mavutil.mavlink_connection(filename) - while True: - try: - m = mlog.recv_match(type=['GLOBAL_POSITION_INT']) - if m is None: - break - except Exception: - break - # ignore we get where there is no fix: - if m.lat == 0: - continue - messages.append(m) - - # Shrink the number of points for readability and to stay within autopilot memory limits. - # For coding simplicity we: - # - only keep points that are with 3 metres of the previous kept point. - # - only keep the first 100 points that meet the above criteria. - num_points = len(messages) - keep_point_distance=3 #metres - kept_messages = [] - kept_messages.append(messages[0]) #Keep the first message - pt1num=0 - pt2num=1 - while True: - #Keep the last point. Only record 99 points. - if pt2num==num_points-1 or len(kept_messages)==99: - kept_messages.append(messages[pt2num]) - break - pt1 = LocationGlobalRelative(messages[pt1num].lat/1.0e7,messages[pt1num].lon/1.0e7,0) - pt2 = LocationGlobalRelative(messages[pt2num].lat/1.0e7,messages[pt2num].lon/1.0e7,0) - distance_between_points = get_distance_metres(pt1,pt2) - if distance_between_points > keep_point_distance: - kept_messages.append(messages[pt2num]) - pt1num=pt2num - pt2num=pt2num+1 - - return kept_messages - - - -Setting the new waypoints -------------------------- - -The following code shows how the vehicle writes the received messages as commands (this part of the code is very similar to that -shown in :ref:`example_mission_basic`): - -.. code:: python - - print "Generating %s waypoints from replay..." % len(messages) - cmds = vehicle.commands - cmds.clear() - for i in xrange(0, len(messages)): - pt = messages[i] - lat = pt['lat'] - lon = pt['lon'] - # To prevent accidents we don't trust the altitude in the original flight, instead - # we just put in a conservative cruising altitude. - altitude = 30.0 # pt['alt'] - cmd = Command( 0, - 0, - 0, - mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, - mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, - 0, 0, 0, 0, 0, 0, - lat, lon, altitude) - cmds.add(cmd) - #Upload clear message and command messages to vehicle. - cmds.upload() - - -Known issues -============ - -There are no known issues with this example. - - - -Source code -=========== - -The full source code at documentation build-time is listed below (`current version on github `_): - - -.. literalinclude:: ../../examples/flight_replay/flight_replay.py - :language: python diff --git a/simulation/extension_docker/dronekit-python/docs/examples/flight_replay_example.png b/simulation/extension_docker/dronekit-python/docs/examples/flight_replay_example.png deleted file mode 100644 index 67f29570..00000000 Binary files a/simulation/extension_docker/dronekit-python/docs/examples/flight_replay_example.png and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/docs/examples/follow_me.rst b/simulation/extension_docker/dronekit-python/docs/examples/follow_me.rst deleted file mode 100644 index 532c362b..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/follow_me.rst +++ /dev/null @@ -1,166 +0,0 @@ -.. _example_follow_me: - -================== -Example: Follow Me -================== - -The *Follow Me* example moves a vehicle to track your position, using location information from a USB GPS attached to your (Linux) laptop. - -The source code is a good *starting point* for your own applications. It can be extended to use other -python language features and libraries (OpenCV, classes, lots of packages etc...) - - -.. note:: This example can only run on a Linux computer, because it depends on the Linux-only *gpsd* service. - -.. warning:: Run this example with caution - be ready to exit follow-me mode by switching the flight mode switch on your RC radio. - - -Running the example -=================== - -DroneKit (for Linux) and the vehicle should be set up as described in :ref:`installing_dronekit`. - -Once you've done that: - -#. Install the *gpsd* service (as shown for Ubuntu Linux below): - - .. code-block:: bash - - sudo apt-get install gpsd gpsd-clients - - You can then plug in a USB GPS and run the "xgps" client to confirm that it is working. - - .. note:: - - If you do not have a USB GPS you can use simulated data by running *dronekit-python/examples/follow_me/run-fake-gps.sh* - (in a separate terminal from where you're running DroneKit-Python). This approach simulates a single location, and so - is really only useful for verifying that the script is working correctly. - - -#. Get the DroneKit-Python example source code onto your local machine. The easiest way to do this - is to clone the **dronekit-python** repository from Github. On the command prompt enter: - - .. code-block:: bash - - git clone http://github.com/dronekit/dronekit-python.git - -#. Navigate to the example folder as shown: - - .. code-block:: bash - - cd dronekit-python/examples/follow_me/ - - -#. You can run the example against a simulator (DroneKit-SITL) by specifying the Python script without any arguments. - The example will download SITL binaries (if needed), start the simulator, and then connect to it: - - .. code-block:: bash - - python follow_me.py - - On the command prompt you should see (something like): - - .. code:: bash - - Starting copter simulator (SITL) - SITL already Downloaded. - Connecting to vehicle on: tcp:127.0.0.1:5760 - >>> APM:Copter V3.4-dev (e0810c2e) - >>> Frame: QUAD - Link timeout, no heartbeat in last 5 seconds - Basic pre-arm checks - Waiting for GPS...: None - ... - Waiting for GPS...: None - Taking off! - Altitude: 0.019999999553 - ... - Altitude: 4.76000022888 - Reached target altitude - Going to: Location:lat=50.616468333,lon=7.131903333,alt=30,is_relative=True - ... - Going to: Location:lat=50.616468333,lon=7.131903333,alt=30,is_relative=True - Going to: Location:lat=50.616468333,lon=7.131903333,alt=30,is_relative=True - User has changed flight modes - aborting follow-me - Close vehicle object - Completed - - .. note:: - - The terminal output above was created using simulated GPS data - (which is why the same target location is returned every time). - - To stop follow-me you can change the vehicle mode or do Ctrl+C - (on a real flight you can just change the mode switch on your - RC transmitter). - - -#. You can run the example against a specific connection (simulated or otherwise) by passing the :ref:`connection string ` for your vehicle in the ``--connect`` parameter. - - For example, to connect to SITL running on UDP port 14550 on your local computer: - - .. code-block:: bash - - python follow_me.py --connect 127.0.0.1:14550 - - - -How does it work? -================= - -Most of the example should be fairly familiar as it uses the same code as other examples for connecting to the vehicle, -:ref:`taking off `, and closing the vehicle object. - -The example-specific code is shown below. All this does is attempt to get a gps socket and read the location in a two second loop. If it is successful it -reports the value and uses :py:func:`Vehicle.simple_goto ` to move to the new position. The loop exits when -the mode is changed. - -.. code-block:: python - - import gps - import socket - - ... - - try: - # Use the python gps package to access the laptop GPS - gpsd = gps.gps(mode=gps.WATCH_ENABLE) - - #Arm and take off to an altitude of 5 meters - arm_and_takeoff(5) - - while True: - - if vehicle.mode.name != "GUIDED": - print "User has changed flight modes - aborting follow-me" - break - - # Read the GPS state from the laptop - gpsd.next() - - # Once we have a valid location (see gpsd documentation) we can start moving our vehicle around - if (gpsd.valid & gps.LATLON_SET) != 0: - altitude = 30 # in meters - dest = LocationGlobalRelative(gpsd.fix.latitude, gpsd.fix.longitude, altitude) - print "Going to: %s" % dest - - # A better implementation would only send new waypoints if the position had changed significantly - vehicle.simple_goto(dest) - - # Send a new target every two seconds - # For a complete implementation of follow me you'd want adjust this delay - time.sleep(2) - - except socket.error: - print "Error: gpsd service does not seem to be running, plug in USB GPS or run run-fake-gps.sh" - sys.exit(1) - - - -Source code -=========== - -The full source code at documentation build-time is listed below (`current version on github `_): - -.. include:: ../../examples/follow_me/follow_me.py - :literal: diff --git a/simulation/extension_docker/dronekit-python/docs/examples/guided-set-speed-yaw-demo.rst b/simulation/extension_docker/dronekit-python/docs/examples/guided-set-speed-yaw-demo.rst deleted file mode 100644 index 22554157..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/guided-set-speed-yaw-demo.rst +++ /dev/null @@ -1,411 +0,0 @@ -.. _example-guided-mode-setting-speed-yaw: - -=================================================== -Example: Guided Mode Movement and Commands (Copter) -=================================================== - -This example shows how to control Copter movement and send immediate commands in :ref:`GUIDED mode `. -It demonstrates three methods for explicitly specifying a target position and two commands for controlling movement by -setting the vehicle's velocity vectors. It also shows how to send commands to control the yaw (direction that the front -of the vehicle is pointing), region of interest, speed and home location, along with some useful functions for -converting between frames of reference. - -The example is :ref:`documented in the source code `. -More detailed information about using GUIDED mode can be found in the guide: :ref:`guided_mode_copter`. - - -.. figure:: GuidedModeExample_FlyByPosition.png - :width: 50 % - :alt: Setting destination using position and changing speed and ROI - - Setting destination using position and changing speed and ROI - - -.. figure:: GuidedModeExample_FlyByVelocity.png - :width: 50 % - :alt: Setting destination using velocity and changing yaw and home location - - Setting destination using velocity and changing yaw and home location - - - -Running the example -=================== - -The example can be run as described in :doc:`running_examples` (which in turn assumes that the vehicle -and DroneKit have been set up as described in :ref:`installing_dronekit`). - -In summary, after cloning the repository: - -#. Navigate to the example folder as shown: - - .. code-block:: bash - - cd dronekit-python/examples/guided_set_speed_yaw/ - - -#. You can run the example against a simulator (DroneKit-SITL) by specifying the Python script without any arguments. - The example will download SITL binaries if needed, start the simulator, and then connect to it: - - .. code-block:: bash - - python guided_set_speed_yaw.py - - On the command prompt you should see (something like): - - .. code:: bash - - Starting copter simulator (SITL) - SITL already Downloaded. - Connecting to vehicle on: tcp:127.0.0.1:5760 - >>> APM:Copter V3.3 (d6053245) - >>> Frame: QUAD - >>> Calibrating barometer - >>> Initialising APM... - >>> barometer calibration complete - >>> GROUND START - Basic pre-arm checks - Waiting for vehicle to initialise... - ... - Waiting for vehicle to initialise... - Arming motors - Waiting for arming... - ... - Waiting for arming... - >>> ARMING MOTORS - >>> GROUND START - Waiting for arming... - >>> Link timeout, no heartbeat in last 5 seconds - >>> ...link restored. - >>> Initialising APM... - Taking off! - Altitude: 0.0 - Altitude: 0.28 - ... - Altitude: 4.76 - Reached target altitude - TRIANGLE path using standard Vehicle.simple_goto() - Set groundspeed to 5m/s. - Position North 80 West 50 - Distance to target: 100.792763565 - Distance to target: 99.912599325 - ... - Distance to target: 1.21731863826 - Distance to target: 0.846001925791 - Reached target - Position North 0 East 100 - Distance to target: 122.623210813 - ... - Distance to target: 4.75876224557 - Distance to target: 0.244650555031 - Reached target - Position North -80 West 50 - Distance to target: 100.792430814 - Distance to target: 100.592652053 - ... - Distance to target: 2.48849019535 - Distance to target: 0.73822537077 - Reached target - TRIANGLE path using standard SET_POSITION_TARGET_GLOBAL_INT message and with varying speed. - Position South 100 West 130 - Set groundspeed to 5m/s. - Distance to target: 188.180927131 - Distance to target: 186.578341133 - ... - Distance to target: 9.87090024758 - Distance to target: 1.4668164732 - Reached target - Set groundspeed to 15m/s (max). - Position South 0 East 200 - Distance to target: 318.826732298 - Distance to target: 320.787965033 - ... - Distance to target: 11.5626483964 - Distance to target: 0.335164775811 - Reached target - Set airspeed to 10m/s (max). - Position North 100 West 130 - Distance to target: 188.182420209 - Distance to target: 189.860730713 - ... - Distance to target: 10.4263414971 - Distance to target: 1.29857175712 - Reached target - SQUARE path using SET_POSITION_TARGET_LOCAL_NED and position parameters - North 50m, East 0m, 10m altitude for 20 seconds - Point ROI at current location (home position) - North 50m, East 50m, 10m altitude - Point ROI at current location - North 0m, East 50m, 10m altitude - North 0m, East 0m, 10m altitude - SQUARE path using SET_POSITION_TARGET_LOCAL_NED and velocity parameters - Yaw 180 absolute (South) - Velocity South & up - Yaw 270 absolute (West) - Velocity West & down - Yaw 0 absolute (North) - Velocity North - Yaw 90 absolute (East) - Velocity East - DIAMOND path using SET_POSITION_TARGET_GLOBAL_INT and velocity parameters - Yaw 225 absolute - Velocity South, West and Up - Yaw 90 relative (to previous yaw heading) - Velocity North, West and Down - Set new home location to current location - Get new home location - Home Location: LocationGlobal:lat=-35.363243103,lon=149.164337158,alt=593.890014648 - Yaw 90 relative (to previous yaw heading) - Velocity North and East - Yaw 90 relative (to previous yaw heading) - Velocity South and East - Setting LAND mode... - Close vehicle object - Completed - - .. tip:: - - It is more interesting to watch the example run on a map than the console. The topic :ref:`viewing_uav_on_map` - explains how to set up *Mission Planner* to view a vehicle running on the simulator (SITL). - -#. You can run the example against a specific connection (simulated or otherwise) by passing the :ref:`connection string ` for your vehicle in the ``--connect`` parameter. - - For example, to connect to SITL running on UDP port 14550 on your local computer: - - .. code-block:: bash - - python guided_set_speed_yaw.py --connect 127.0.0.1:14550 - - - -How does it work? -================= - -The example is :ref:`documented in source code `. Additional information on the methods is provided either below or :ref:`in the guide `. - -The functions for controlling vehicle movement are: - -* :ref:`Vehicle.simple_goto() ` is the standard - DroneKit position controller method. It is called from :ref:`goto ` to fly a triangular path. -* :ref:`goto_position_target_global_int() ` - is a position controller that uses the - `SET_POSITION_TARGET_GLOBAL_INT `_ command. -* :ref:`goto_position_target_local_ned() ` - is a position controller that uses `SET_POSITION_TARGET_LOCAL_NED `_ - command (taking values in NED frame, relative to the home position). This is used to fly a square path. - The script is put to sleep for a certain time in order to allow the vehicle to reach the specified position. -* :ref:`send_ned_velocity() ` is a velocity controller. - It uses `SET_POSITION_TARGET_LOCAL_NED `_ - to fly a square path using velocity vectors to define the speed in each direction. -* :ref:`send_global_velocity() ` is a velocity controller. - It uses `SET_POSITION_TARGET_GLOBAL_INT `_ - to fly a diamond-shaped path. The behaviour is essentially the same as for ``send_ned_velocity()`` - because the velocity components in both commands are in the NED frame. -* :ref:`goto ` is a convenience function for specifying a target location - in metres from the current location and reporting the result. - - -The functions sending immediate commands are: - -* :ref:`condition_yaw() ` -* :ref:`set_roi(location) ` - -The example uses a number functions to convert global locations co-ordinates (decimal degrees) into local -coordinates relative to the vehicle (in metres). These are :ref:`described in the guide `. - - -.. _example_guided_mode_goto_convenience: - -goto() - convenience function ------------------------------ - -This is a convenience function for setting position targets in metres North and East of the current location. -It reports the distance to the target every two seconds and completes when the target is reached. - -This takes a function argument of either :ref:`Vehicle.simple_goto() ` or -:ref:`goto_position_target_global_int() ` - -.. code-block:: python - - def goto(dNorth, dEast, gotoFunction=vehicle.simple_goto): - currentLocation=vehicle.location.global_relative_frame - targetLocation=get_location_metres(currentLocation, dNorth, dEast) - targetDistance=get_distance_metres(currentLocation, targetLocation) - gotoFunction(targetLocation) - - while vehicle.mode.name=="GUIDED": #Stop action if we are no longer in guided mode. - remainingDistance=get_distance_metres(vehicle.location.global_frame, targetLocation) - print "Distance to target: ", remainingDistance - if remainingDistance<=targetDistance*0.01: #Just below target, in case of undershoot. - print "Reached target" - break; - time.sleep(2) - - - -.. _example_guided_mode_send_ned_velocity: - -send_ned_velocity() -------------------- - -The function ``send_ned_velocity()`` generates a ``SET_POSITION_TARGET_LOCAL_NED`` MAVLink message -which is used to directly specify the speed components of the vehicle. - -The message is resent at 1Hz for a set duration. - -This is documented in :ref:`the guide here `. - - -.. _example_guided_mode_send_global_velocity: - -send_global_velocity() ----------------------- - -The function ``send_global_velocity()`` generates a -`SET_POSITION_TARGET_GLOBAL_INT `_ -MAVLink message which is used to directly specify the speed components of the vehicle in the NED -frame. - -The function behaviour is otherwise exactly the same as when using -:ref:`SET_POSITION_TARGET_LOCAL_NED `. - -.. code-block:: python - - def send_global_velocity(velocity_x, velocity_y, velocity_z, duration): - """ - Move vehicle in direction based on specified velocity vectors. - """ - msg = vehicle.message_factory.set_position_target_global_int_encode( - 0, # time_boot_ms (not used) - 0, 0, # target system, target component - mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT_INT, # frame - 0b0000111111000111, # type_mask (only speeds enabled) - 0, # lat_int - X Position in WGS84 frame in 1e7 * meters - 0, # lon_int - Y Position in WGS84 frame in 1e7 * meters - 0, # alt - Altitude in meters in AMSL altitude(not WGS84 if absolute or relative) - # altitude above terrain if GLOBAL_TERRAIN_ALT_INT - velocity_x, # X velocity in NED frame in m/s - velocity_y, # Y velocity in NED frame in m/s - velocity_z, # Z velocity in NED frame in m/s - 0, 0, 0, # afx, afy, afz acceleration (not supported yet, ignored in GCS_Mavlink) - 0, 0) # yaw, yaw_rate (not supported yet, ignored in GCS_Mavlink) - - # send command to vehicle on 1 Hz cycle - for x in range(0,duration): - vehicle.send_mavlink(msg) - time.sleep(1) - -.. note:: - - The message is re-sent every second for the specified duration. From Copter 3.3 the vehicle will stop - moving if a new message is not received in approximately 3 seconds. Prior to Copter 3.3 the message only - needs to be sent once, and the velocity remains active until the next movement message is received. - The above code works for both cases! - - - -.. _example_guided_mode_goto_position_target_global_int: - -goto_position_target_global_int() ---------------------------------- - -The function ``goto_position_target_global_int()`` generates a -`SET_POSITION_TARGET_GLOBAL_INT `_ -MAVLink message which is used to directly specify the target location of the vehicle. -When used with ``MAV_FRAME_GLOBAL_RELATIVE_ALT_INT`` as shown below, -this method is effectively the same as :ref:`Vehicle.simple_goto `. - -.. code-block:: python - - def goto_position_target_global_int(aLocation): - """ - Send SET_POSITION_TARGET_GLOBAL_INT command to request the vehicle fly to a specified location. - """ - msg = vehicle.message_factory.set_position_target_global_int_encode( - 0, # time_boot_ms (not used) - 0, 0, # target system, target component - mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT_INT, # frame - 0b0000111111111000, # type_mask (only speeds enabled) - aLocation.lat*1e7, # lat_int - X Position in WGS84 frame in 1e7 * meters - aLocation.lon*1e7, # lon_int - Y Position in WGS84 frame in 1e7 * meters - aLocation.alt, # alt - Altitude in meters in AMSL altitude, not WGS84 if absolute or relative, above terrain if GLOBAL_TERRAIN_ALT_INT - 0, # X velocity in NED frame in m/s - 0, # Y velocity in NED frame in m/s - 0, # Z velocity in NED frame in m/s - 0, 0, 0, # afx, afy, afz acceleration (not supported yet, ignored in GCS_Mavlink) - 0, 0) # yaw, yaw_rate (not supported yet, ignored in GCS_Mavlink) - - # send command to vehicle - vehicle.send_mavlink(msg) - -In the example code this function is called from the :ref:`goto() ` convenience function. - - - -.. _example_guided_mode_goto_position_target_local_ned: - -goto_position_target_local_ned() --------------------------------- - -The function ``goto_position_target_local_ned()`` generates a -`SET_POSITION_TARGET_LOCAL_NED `_ -MAVLink message which is used to directly specify the target location in the North, East, Down frame. -The ``type_mask`` enables the position parameters (the last three bits of of the mask are zero). - -.. warning:: - - In the NED frame positive altitudes are entered as negative "Down" values. - So if down is "10", this will be 10 metres below the home altitude. - -.. note:: - - The `MAVLink protocol documentation `_ - lists a number of possible frames of reference. Up until Copter 3.2.1 the actual frame used is always - relative to the home location (as indicated by MAV_FRAME_LOCAL_NED). Starting from Copter 3.3 - you can specify `other frames `_, - for example to move the vehicle relative to its current position. - -.. code-block:: python - - def goto_position_target_local_ned(north, east, down): - """ - Send SET_POSITION_TARGET_LOCAL_NED command to request the vehicle fly to a specified - location in the North, East, Down frame. - """ - msg = vehicle.message_factory.set_position_target_local_ned_encode( - 0, # time_boot_ms (not used) - 0, 0, # target system, target component - mavutil.mavlink.MAV_FRAME_LOCAL_NED, # frame - 0b0000111111111000, # type_mask (only positions enabled) - north, east, down, - 0, 0, 0, # x, y, z velocity in m/s (not used) - 0, 0, 0, # x, y, z acceleration (not supported yet, ignored in GCS_Mavlink) - 0, 0) # yaw, yaw_rate (not supported yet, ignored in GCS_Mavlink) - # send command to vehicle - vehicle.send_mavlink(msg) - - -At time of writing, acceleration and yaw bits are ignored. - - -Testbed settings -================ - -This example has been tested on Windows against SITL running both natively and in a virtual machine (as described in :ref:`installing_dronekit`). - -* DroneKit version: 2.0.2 -* ArduPilot version: 3.3 - - - -.. _guided_example_source_code: - -Source code -=========== - -The full source code at documentation build-time is listed below -(`current version on Github `_): - -.. literalinclude:: ../../examples/guided_set_speed_yaw/guided_set_speed_yaw.py - :language: python - diff --git a/simulation/extension_docker/dronekit-python/docs/examples/index.rst b/simulation/extension_docker/dronekit-python/docs/examples/index.rst deleted file mode 100644 index d2d81515..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/index.rst +++ /dev/null @@ -1,30 +0,0 @@ -.. _example-toc: - -======== -Examples -======== - -This section contains the documentation for a number of useful DroneKit-Python examples. These demonstrate common use-cases, -and show (among other things) how to use the API to query vehicle state and parameters, and how to control a vehicle -during missions and outside missions using custom commands. - - -.. toctree:: - :maxdepth: 1 - - running_examples - Vehicle State - Simple Goto - Guided Movement and Commands - Basic Mission - Mission Import/Export - Create Attribute in App - Follow Me (Linux only) - Drone Delivery - Flight Replay - Channel Overrides - Performance Test - - - - diff --git a/simulation/extension_docker/dronekit-python/docs/examples/mission_basic.rst b/simulation/extension_docker/dronekit-python/docs/examples/mission_basic.rst deleted file mode 100644 index a37afc57..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/mission_basic.rst +++ /dev/null @@ -1,184 +0,0 @@ -.. _example_mission_basic: - -====================== -Example: Basic Mission -====================== - -This example demonstrates the basic mission operations provided by DroneKit-Python, including: -downloading missions from the vehicle, clearing missions, creating mission commands -and uploading them to the vehicle, monitoring the current active command, and changing the active -command. - -The guide topic :ref:`auto_mode_vehicle_control` provides more detailed explanation of how the API -should be used. - -.. figure:: mission_basic_example_copter_path.png - :width: 50 % - :alt: Basic Mission Path - - Basic Mission Example: Flight path - - -Running the example -=================== - -The example can be run as described in :doc:`running_examples` (which in turn assumes that the vehicle -and DroneKit have been set up as described in :ref:`installing_dronekit`). - -In summary, after cloning the repository: - -#. Navigate to the example folder as shown: - - .. code-block:: bash - - cd dronekit-python/examples/mission_basic/ - -#. You can run the example against a simulator (DroneKit-SITL) by specifying the Python script without any arguments. - The example will download SITL binaries (if needed), start the simulator, and then connect to it: - - .. code-block:: bash - - python mission_basic.py - - On the command prompt you should see (something like): - - .. code:: bash - - Starting copter simulator (SITL) - SITL already Downloaded. - Connecting to vehicle on: tcp:127.0.0.1:5760 - >>> APM:Copter V3.3 (d6053245) - >>> Frame: QUAD - >>> Calibrating barometer - >>> Initialising APM... - >>> barometer calibration complete - >>> GROUND START - >>> Mission Planner 1.3.35 - Create a new mission (for current location) - Clear any existing commands - Define/add new commands. - Upload new commands to vehicle - Basic pre-arm checks - Waiting for vehicle to initialise... - >>> flight plan received - Waiting for vehicle to initialise... - ... - Waiting for vehicle to initialise... - Arming motors - Waiting for arming... - ... - Waiting for arming... - >>> ARMING MOTORS - >>> GROUND START - Waiting for arming... - >>> Initialising APM... - Taking off! - Altitude: 0.0 - Altitude: 0.11 - ... - Altitude: 8.9 - Altitude: 9.52 - Reached target altitude - Starting mission - Distance to waypoint (0): None - Distance to waypoint (1): 78.8000191616 - Distance to waypoint (1): 78.3723704927 - ... - Distance to waypoint (1): 20.7131390269 - Distance to waypoint (1): 15.4196151863 - >>> Reached Command #1 - Distance to waypoint (2): 115.043560356 - Distance to waypoint (2): 117.463458185 - ... - Distance to waypoint (2): 25.7122243168 - Distance to waypoint (2): 16.8624794106 - >>> Reached Command #2 - Distance to waypoint (3): 100.45231832 - Skipping to Waypoint 5 when reach waypoint 3 - Distance to waypoint (5): 154.645144788 - Exit 'standard' mission when start heading to final waypoint (5) - Return to launch - Close vehicle object - - - .. tip:: - - It is more interesting to watch the example run on a map than the console. The topic :ref:`viewing_uav_on_map` - explains how to set up *Mission Planner* to view a vehicle running on the simulator (SITL). - -#. You can run the example against a specific connection (simulated or otherwise) by passing the :ref:`connection string ` for your vehicle in the ``--connect`` parameter. - - For example, to connect to SITL running on UDP port 14550 on your local computer: - - .. code-block:: bash - - python mission_basic.py --connect 127.0.0.1:14550 - - - -How does it work? -================= - -The :ref:`source code ` is relatively self-documenting, and most of its main -operations are explained in the guide topic :ref:`auto_mode_vehicle_control` . - -In overview, the example calls ``adds_square_mission(vehicle.location.global_frame,50)`` to first -clear the current mission and then define a new mission with a takeoff command and four waypoints arranged -in a square around the central position (two waypoints are added in the last position - -we use :py:func:`next ` to determine when we've reached the final point). -The clear command and new mission items are then uploaded to the vehicle. - -After taking off (in guided mode using the ``takeoff()`` function) the example starts the mission by setting the mode to AUTO: - -.. code:: python - - print "Starting mission" - # Set mode to AUTO to start mission - vehicle.mode = VehicleMode("AUTO") - -The progress of the mission is monitored in a loop. The convenience function -:ref:`distance_to_current_waypoint() ` -gets the distance to the next waypoint and -:py:func:`Vehicle.commands.next ` gets the value of -the next command. - -We also show how to jump to a specified command using -:py:func:`Vehicle.commands.next ` (note how we skip the third command below): - -.. code:: python - - while True: - nextwaypoint=vehicle.commands.next - print 'Distance to waypoint (%s): %s' % (nextwaypoint, distance_to_current_waypoint()) - - if nextwaypoint==3: #Skip to next waypoint - print 'Skipping to Waypoint 5 when reach waypoint 3' - vehicle.commands.next=5 - vehicle.commands.upload() - if nextwaypoint==5: #Dummy waypoint - as soon as we reach waypoint 4 this is true and we exit. - print "Exit 'standard' mission when start heading to final waypoint (5)" - break; - time.sleep(1) - -When the vehicle starts the 5th command (a dummy waypoint) the loop breaks and the mode is set to RTL (return to launch). - - -.. _example_mission_basic_known_issues: - -Known issues -============ - -This example has no known issues. - - -.. _example_mission_basic_source_code: - -Source code -=========== - -The full source code at documentation build-time is listed below -(`current version on Github `_): - -.. literalinclude:: ../../examples/mission_basic/mission_basic.py - :language: python - diff --git a/simulation/extension_docker/dronekit-python/docs/examples/mission_basic_example_copter_path.png b/simulation/extension_docker/dronekit-python/docs/examples/mission_basic_example_copter_path.png deleted file mode 100644 index d858dd02..00000000 Binary files a/simulation/extension_docker/dronekit-python/docs/examples/mission_basic_example_copter_path.png and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/docs/examples/mission_import_export.rst b/simulation/extension_docker/dronekit-python/docs/examples/mission_import_export.rst deleted file mode 100644 index c8b0954d..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/mission_import_export.rst +++ /dev/null @@ -1,135 +0,0 @@ -.. _example_mission_import_export: - -============================== -Example: Mission Import/Export -============================== - -This example shows how to import and export files in the -`Waypoint file format `_. - -The commands are first imported from a file into a list and then uploaded to the vehicle. -Then the current mission is downloaded from the vehicle and put into a list, which is then -saved into (another file). Finally, we print out both the original and new files -for comparison - -The example does not show how missions can be modified, but once the mission is in a list, -changing the order and content of commands is straightforward. - -The guide topic :ref:`auto_mode_vehicle_control` provides information about -missions and AUTO mode. - - -Running the example -=================== - -The example can be run as described in :doc:`running_examples` (which in turn assumes that the vehicle -and DroneKit have been set up as described in :ref:`installing_dronekit`). - -In summary, after cloning the repository: - -#. Navigate to the example folder as shown: - - .. code-block:: bash - - cd dronekit-python/examples/mission_import_export/ - -#. You can run the example against a simulator (DroneKit-SITL) by specifying the Python script without any arguments. - The example will download SITL binaries (if needed), start the simulator, and then connect to it: - - .. code-block:: bash - - python mission_import_export.py - - On the command prompt you should see (something like): - - .. code:: bash - - Starting copter simulator (SITL) - SITL already Downloaded. - Connecting to vehicle on: tcp:127.0.0.1:5760 - >>> APM:Copter V3.3 (d6053245) - >>> Frame: QUAD - >>> Calibrating barometer - >>> Initialising APM... - >>> barometer calibration complete - >>> GROUND START - Waiting for vehicle to initialise... - Waiting for vehicle to initialise... - Waiting for vehicle to initialise... - Waiting for vehicle to initialise... - Waiting for vehicle to initialise... - Reading mission from file: mpmission.txt - Upload mission from a file: mpmission.txt - Clear mission - Upload mission - Save mission from Vehicle to file: exportedmission.txt - Download mission from vehicle - >>> flight plan received - Write mission to file - Close vehicle object - Show original and uploaded/downloaded files: - - Mission file: mpmission.txt - QGC WPL 110 - 0 1 0 16 0 0 0 0 -35.363262 149.165237 584.000000 1 - 1 0 0 22 0.000000 0.000000 0.000000 0.000000 -35.361988 149.163753 00.000000 1 - 2 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.361992 149.163593 00.000000 1 - 3 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.363812 149.163609 00.000000 1 - 4 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.363768 149.166055 00.000000 1 - 5 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.361835 149.166012 00.000000 1 - 6 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.362150 149.165046 00.000000 1 - - Mission file: exportedmission.txt - QGC WPL 110 - 0 1 0 16 0 0 0 0 -35.3632621765 149.165237427 583.989990234 1 - 1 0 0 22 0.0 0.0 0.0 0.0 -35.3619880676 149.163757324 100.0 1 - 2 0 0 16 0.0 0.0 0.0 0.0 -35.3619918823 149.163589478 100.0 1 - 3 0 0 16 0.0 0.0 0.0 0.0 -35.3638114929 149.163604736 100.0 1 - 4 0 0 16 0.0 0.0 0.0 0.0 -35.3637695312 149.166061401 100.0 1 - 5 0 0 16 0.0 0.0 0.0 0.0 -35.3618354797 149.166015625 100.0 1 - 6 0 0 16 0.0 0.0 0.0 0.0 -35.3621482849 149.165039062 100.0 1 - - - .. note:: - - The position values uploaded and then downloaded above do not match exactly. This rounding error can be ignored - because the difference is much smaller than the precision provided by GPS. - - The error occurs because all the params are encoded as 32-bit floats rather than 64-bit doubles (Python's native datatype). - -#. You can run the example against a specific connection (simulated or otherwise) by passing the :ref:`connection string ` for your vehicle in the ``--connect`` parameter. - - For example, to connect to SITL running on UDP port 14550 on your local computer: - - .. code-block:: bash - - python mission_import_export.py --connect 127.0.0.1:14550 - - -How does it work? -================= - -The :ref:`source code ` is largely self-documenting. - -More information about the functions can be found in the guide at -:ref:`auto_mode_load_mission_file` and :ref:`auto_mode_save_mission_file`. - - - -Known issues -============ - -There are no known issues with this example. - - - -.. _example_mission_import_export_source_code: - -Source code -=========== - -The full source code at documentation build-time is listed below (`current version on github `_): - -.. literalinclude:: ../../examples/mission_import_export/mission_import_export.py - :language: python - diff --git a/simulation/extension_docker/dronekit-python/docs/examples/running_examples.rst b/simulation/extension_docker/dronekit-python/docs/examples/running_examples.rst deleted file mode 100644 index 3c20422c..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/running_examples.rst +++ /dev/null @@ -1,56 +0,0 @@ -.. _running_examples_top: - -==================== -Running the Examples -==================== - -General instructions for running the `example source code `_ are given below. More explicit instructions are provided within the documentation for each example (and within the examples themselves by passing the ``-h`` (help) command line argument). - -.. tip:: - - The examples all launch the :ref:`dronekit-sitl ` simulator and connect to it by default. The ``--connect`` argument is used to instead specify the :ref:`connection string ` for a target vehicle or an externally managed SITL instance. - -To run the examples: - -#. :ref:`Install DroneKit-Python ` if you have not already done so! Install :ref:`dronekit-sitl ` if you want to test against simulated vehicles. - -#. Get the DroneKit-Python example source code onto your local machine. The easiest way to do this - is to clone the **dronekit-python** repository from Github. - - On the command prompt enter: - - .. code-block:: bash - - git clone http://github.com/dronekit/dronekit-python.git - - - -#. Navigate to the example you wish to run (or specify the full path in the next step). The examples are all stored in - subdirectories of **dronekit-python/examples/**. - - For example, to run the :ref:`vehicle_state ` example, you would navigate as shown: - - .. code-block:: bash - - cd dronekit-python/examples/vehicle_state/ - - -#. Start the example as shown: - - * To connect to a simulator started/managed by the script: - - .. code-block:: bash - - python vehicle_state.py - - * To connect to a specific vehicle, pass its :ref:`connection string ` via the ``connect`` argument. - For example, to run the example on Solo you would use the following command: - - .. code-block:: bash - - python vehicle_state.py --connect udpin:0.0.0.0:14550 - - -.. warning:: - - Propellers should be removed before testing examples indoors (on real vehicles). diff --git a/simulation/extension_docker/dronekit-python/docs/examples/simple_goto.rst b/simulation/extension_docker/dronekit-python/docs/examples/simple_goto.rst deleted file mode 100644 index 3a3fc45d..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/simple_goto.rst +++ /dev/null @@ -1,175 +0,0 @@ -.. _example_simple_goto: - -============================== -Example: Simple Go To (Copter) -============================== - -This example demonstrates how to arm and launch a Copter in GUIDED mode, travel towards a number of target points, and then return -to the home location. It uses :py:func:`Vehicle.simple_takeoff() `, -:py:func:`Vehicle.simple_goto() ` and :py:attr:`Vehicle.mode `. - -The target locations are centered around the home location when the :ref:`Simulated Vehicle ` is booted; -you can edit the latitude and longitude to use more appropriate positions for your own vehicle. - -.. note:: - - This example will only run on *Copter*: - - * *Plane* does not support ``takeoff`` in GUIDED mode. - * *Rover* will ignore the ``takeoff`` command and will then stick at the altitude check. - - -.. figure:: simple_goto_example_copter_path.png - :width: 75 % - :alt: Setting destination using position and changing speed and ROI - - Simple Goto Example: Flight path - - - -Running the example -=================== - -The example can be run as described in :doc:`running_examples` (which in turn assumes that the vehicle -and DroneKit have been set up as described in :ref:`installing_dronekit`). - -In summary, after cloning the repository: - -#. Navigate to the example folder as shown: - - .. code-block:: bash - - cd dronekit-python/examples/simple_goto/ - -#. You can run the example against a simulator (DroneKit-SITL) by specifying the Python script without any arguments. - The example will download SITL binaries if needed, start the simulator, and then connect to it: - - .. code-block:: bash - - python simple_goto.py - - On the command prompt you should see (something like): - - .. code:: bash - - Starting copter simulator (SITL) - SITL already Downloaded. - Connecting to vehicle on: tcp:127.0.0.1:5760 - >>> APM:Copter V3.3 (d6053245) - >>> Frame: QUAD - >>> Calibrating barometer - >>> Initialising APM... - >>> barometer calibration complete - >>> GROUND START - Basic pre-arm checks - Waiting for vehicle to initialise... - ... - Waiting for vehicle to initialise... - Arming motors - Waiting for arming... - ... - Waiting for arming... - >>> ARMING MOTORS - >>> GROUND START - Waiting for arming... - >>> Initialising APM... - Taking off! - Altitude: 0.0 - ... - Altitude: 7.4 - Altitude: 9.0 - Altitude: 9.65 - Reached target altitude - Set default/target airspeed to 3 - Going towards first point for 30 seconds ... - Going towards second point for 30 seconds (groundspeed set to 10 m/s) ... - Returning to Launch - Close vehicle object - - .. tip:: - - It is more interesting to watch the example run on a map than the console. The topic :ref:`viewing_uav_on_map` - explains how to set up *Mission Planner* to view a vehicle running on the simulator (SITL). - -#. You can run the example against a specific connection (simulated or otherwise) by passing the :ref:`connection string ` for your vehicle in the ``--connect`` parameter. - - For example, to connect to SITL running on UDP port 14550 on your local computer: - - .. code-block:: bash - - python simple_goto.py --connect 127.0.0.1:14550 - - - -How does it work? -================= - -The code has three distinct sections: arming and takeoff, flight to two locations, and return-to-home. - -Takeoff -------- - -To launch *Copter* you need to first check that the vehicle :py:func:`Vehicle.is_armable `. -Then set the mode to ``GUIDED``, arm the vehicle, and call -:py:func:`Vehicle.simple_takeoff() `. The takeoff code in this example -is explained in the guide topic :ref:`taking-off`. - - -Flying to a point - simple_goto -------------------------------- - -The vehicle is already in ``GUIDED`` mode, so to send it to a certain point we just need to -call :py:func:`Vehicle.simple_goto() ` with the target -:py:class:`dronekit.LocationGlobalRelative`: - -.. code-block:: python - - # set the default travel speed - vehicle.airspeed=3 - - point1 = LocationGlobalRelative(-35.361354, 149.165218, 20) - vehicle.simple_goto(point1) - - # sleep so we can see the change in map - time.sleep(30) - -.. tip:: - - Without some sort of "wait" the next command would be executed immediately. In this example we just - sleep for 30 seconds before executing the next command. - -When moving towards the first point we set the airspeed using the :py:attr:`Vehicle.airspeed ` -attribute. For the second point the example specifies the target groundspeed when calling -:py:func:`Vehicle.simple_goto() ` - -.. code-block:: python - - vehicle.simple_goto(point2, groundspeed=10) - -.. tip:: - - The script doesn't report anything during the sleep periods, - but you can observe the vehicle's movement on a ground station map. - - - - -RTL - Return to launch ----------------------- - -To return to the home position and land, we set the mode to ``RTL``. -The vehicle travels at the previously set default speed: - -.. code-block:: python - - vehicle.mode = VehicleMode("RTL") - - -Source code -=========== - -The full source code at documentation build-time is listed below -(`current version on Github `_): - -.. literalinclude:: ../../examples/simple_goto/simple_goto.py - :language: python \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/docs/examples/simple_goto_example_copter_path.png b/simulation/extension_docker/dronekit-python/docs/examples/simple_goto_example_copter_path.png deleted file mode 100644 index 6c6f1f93..00000000 Binary files a/simulation/extension_docker/dronekit-python/docs/examples/simple_goto_example_copter_path.png and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/docs/examples/vehicle_state.rst b/simulation/extension_docker/dronekit-python/docs/examples/vehicle_state.rst deleted file mode 100644 index 64a367f3..00000000 --- a/simulation/extension_docker/dronekit-python/docs/examples/vehicle_state.rst +++ /dev/null @@ -1,226 +0,0 @@ -.. _example-vehicle-state: - -====================== -Example: Vehicle State -====================== - -This example shows how to get/set vehicle attribute and parameter information, -how to observe vehicle attribute changes, and how to get the home position. - -The guide topic :ref:`vehicle-information` provides a more detailed explanation -of how the API should be used. - - -Running the example -=================== - -The example can be run as described in :doc:`running_examples` (which in turn assumes that -the vehicle and DroneKit have been set up as described in :ref:`installing_dronekit`). - -In summary, after cloning the repository: - -#. Navigate to the example folder as shown: - - .. code-block:: bash - - cd dronekit-python/examples/vehicle_state/ - - -#. You can run the example against a simulator (DroneKit-SITL) by specifying the Python script without any arguments. - The example will download SITL binaries (if needed), start the simulator, and then connect to it: - - .. code-block:: bash - - python vehicle_state.py - - On the command prompt you should see (something like): - - .. code:: bash - - Connecting to vehicle on: tcp:127.0.0.1:5760 - >>> APM:Copter V3.3 (d6053245) - >>> Frame: QUAD - >>> Calibrating barometer - >>> Initialising APM... - >>> barometer calibration complete - >>> GROUND START - - Get all vehicle attribute values: - Autopilot Firmware version: APM:Copter-3.3.0-alpha64 - Major version number: 3 - Minor version number: 3 - Patch version number: 0 - Release type: rc - Release version: 0 - Stable release?: True - Autopilot capabilities - Supports MISSION_FLOAT message type: True - Supports PARAM_FLOAT message type: True - Supports MISSION_INT message type: False - Supports COMMAND_INT message type: False - Supports PARAM_UNION message type: False - Supports ftp for file transfers: False - Supports commanding attitude offboard: False - Supports commanding position and velocity targets in local NED frame: True - Supports set position + velocity targets in global scaled integers: True - Supports terrain protocol / data handling: True - Supports direct actuator control: False - Supports the flight termination command: True - Supports mission_float message type: True - Supports onboard compass calibration: False - Global Location: LocationGlobal:lat=-35.363261,lon=149.1652299,alt=None - Global Location (relative altitude): LocationGlobalRelative:lat=-35.363261,lon=149.1652299,alt=0.0 - Local Location: LocationLocal:north=None,east=None,down=None - Attitude: Attitude:pitch=0.00294387154281,yaw=-0.11805768311,roll=0.00139428151306 - Velocity: [-0.03, 0.02, 0.0] - GPS: GPSInfo:fix=3,num_sat=10 - Gimbal status: Gimbal: pitch=None, roll=None, yaw=None - Battery: Battery:voltage=12.587,current=0.0,level=100 - EKF OK?: False - Last Heartbeat: 0.769999980927 - Rangefinder: Rangefinder: distance=None, voltage=None - Rangefinder distance: None - Rangefinder voltage: None - Heading: 353 - Is Armable?: False - System status: STANDBY - Groundspeed: 0.0 - Airspeed: 0.0 - Mode: STABILIZE - Armed: False - Waiting for home location ... - ... - Waiting for home location ... - Waiting for home location ... - - Home location: LocationGlobal:lat=-35.3632621765,lon=149.165237427,alt=583.989990234 - - Set new home location - New Home Location (from attribute - altitude should be 222): LocationGlobal:lat=-35.363261,lon=149.1652299,alt=222 - New Home Location (from vehicle - altitude should be 222): LocationGlobal:lat=-35.3632621765,lon=149.165237427,alt=222.0 - - Set Vehicle.mode=GUIDED (currently: STABILIZE) - Waiting for mode change ... - - Set Vehicle.armed=True (currently: False) - Waiting for arming... - Waiting for arming... - Waiting for arming... - >>> ARMING MOTORS - >>> GROUND START - Waiting for arming... - Waiting for arming... - >>> Initialising APM... - Vehicle is armed: True - - Add `attitude` attribute callback/observer on `vehicle` - Wait 2s so callback invoked before observer removed - CALLBACK: Attitude changed to Attitude:pitch=-0.000483880605316,yaw=-0.0960851684213,roll=-0.00799709651619 - CALLBACK: Attitude changed to Attitude:pitch=0.000153727291035,yaw=-0.0962921902537,roll=-0.00707155792043 - ... - CALLBACK: Attitude changed to Attitude:pitch=0.00485319690779,yaw=-0.100129388273,roll=0.00181497994345 - Remove Vehicle.attitude observer - - Add `mode` attribute callback/observer using decorator - Set mode=STABILIZE (currently: GUIDED) and wait for callback - Wait 2s so callback invoked before moving to next example - CALLBACK: Mode changed to VehicleMode:STABILIZE - - Attempt to remove observer added with `on_attribute` decorator (should fail) - Exception: Cannot remove observer added using decorator - - Add attribute callback detecting ANY attribute change - Wait 1s so callback invoked before observer removed - CALLBACK: (attitude): Attitude:pitch=0.00716688157991,yaw=-0.0950401723385,roll=0.00759896961972 - CALLBACK: (heading): 354 - CALLBACK: (location): - CALLBACK: (airspeed): 0.0 - CALLBACK: (groundspeed): 0.0 - CALLBACK: (ekf_ok): True - CALLBACK: (battery): Battery:voltage=12.538,current=3.48,level=99 - CALLBACK: (gps_0): GPSInfo:fix=3,num_sat=10 - CALLBACK: (location): - CALLBACK: (velocity): [-0.14, 0.1, 0.0] - CALLBACK: (local_position): LocationLocal:north=-0.136136248708,east=-0.0430941730738,down=-0.00938374921679 - CALLBACK: (channels): {'1': 1500, '3': 1000, '2': 1500, '5': 1800, '4': 1500, '7': 1000, '6': 1000, '8': 1800} - ... - CALLBACK: (ekf_ok): True - Remove Vehicle attribute observer - - Read and write parameters - Read vehicle param 'THR_MIN': 130.0 - Write vehicle param 'THR_MIN' : 10 - Read new value of param 'THR_MIN': 10.0 - - Print all parameters (iterate `vehicle.parameters`): - Key:RC7_REV Value:1.0 - Key:GPS_INJECT_TO Value:127.0 - Key:FLTMODE1 Value:7.0 - ... - Key:SR2_POSITION Value:0.0 - Key:SIM_FLOW_DELAY Value:0.0 - Key:BATT_CURR_PIN Value:12.0 - - Create parameter observer using decorator - Write vehicle param 'THR_MIN' : 20 (and wait for callback) - PARAMETER CALLBACK: THR_MIN changed to: 20.0 - - Create (removable) observer for any parameter using wildcard string - Change THR_MID and THR_MIN parameters (and wait for callback) - ANY PARAMETER CALLBACK: THR_MID changed to: 400.0 - PARAMETER CALLBACK: THR_MIN changed to: 30.0 - ANY PARAMETER CALLBACK: THR_MIN changed to: 30.0 - - Reset vehicle attributes/parameters and exit - >>> DISARMING MOTORS - PARAMETER CALLBACK: THR_MIN changed to: 130.0 - ANY PARAMETER CALLBACK: THR_MIN changed to: 130.0 - ANY PARAMETER CALLBACK: THR_MID changed to: 500.0 - - Close vehicle object - Completed - -#. You can run the example against a specific connection (simulated or otherwise) by passing the :ref:`connection string ` for your vehicle in the ``--connect`` parameter. - - For example, to connect to SITL running on UDP port 14550 on your local computer: - - .. code-block:: bash - - python vehicle_state.py --connect 127.0.0.1:14550 - - -.. note:: - - DroneKit-SITL does not automatically add a virtual gimbal and rangefinder, - so these attributes will always report ``None``. - - - - -How does it work? -================= - -The guide topic :ref:`vehicle-information` provides an explanation of how this code works. - -.. INTERNAL COMMENT: - - Normally we'd highlight code here but all of it is worth of highlight, and we do that in the - linked guide - - -Known issues -============ - -This example has no known issues. - - - -Source code -=========== - -The full source code at documentation build-time is listed below -(`current version on github `_): - -.. literalinclude:: ../../examples/vehicle_state/vehicle_state.py - :language: python - diff --git a/simulation/extension_docker/dronekit-python/docs/guide/auto_mode.rst b/simulation/extension_docker/dronekit-python/docs/guide/auto_mode.rst deleted file mode 100644 index 4fe9e168..00000000 --- a/simulation/extension_docker/dronekit-python/docs/guide/auto_mode.rst +++ /dev/null @@ -1,425 +0,0 @@ -.. _auto_mode_vehicle_control: - -============================== -Missions (AUTO Mode) -============================== - -AUTO mode is used run pre-defined waypoint missions on Copter, Plane and Rover. - -DroneKit-Python provides basic methods to download and clear the current mission commands -from the vehicle, to add and upload new mission commands, to count the number of waypoints, -and to read and set the currently executed mission command. -You can build upon these basic primitives to create high-level mission planning functionality. - -This section shows how to use the basic methods and provides a few useful helper functions. -Most of the code can be observed running in :ref:`example_mission_basic` and :ref:`example_mission_import_export`. - -.. note:: - - We recommend that you :ref:`use GUIDED mode ` instead of AUTO mode where possible, because it offers finer - and more responsive control over movement, and can emulate most mission planning activities. - - AUTO mode can be helpful if a command you need is not supported in GUIDED mode on a particular vehicle type. - - -.. _auto_mode_supported_commands: - -Mission Command Overview -========================== - -The mission commands (e.g. ``MAV_CMD_NAV_TAKEOFF``, ``MAV_CMD_NAV_WAYPOINT`` ) supported for each vehicle type are listed here: -`Copter `_, -`Plane `_, -`Rover `_. - -There are three types of commands: - -* *NAVigation commands* (``MAV_CMD_NAV_*``) are used to control vehicle movement, - including takeoff, moving to and around waypoints, changing altitude, and landing. -* *DO commands* (``MAV_CMD_DO_*``) are for auxiliary functions that do not affect the vehicle’s position - (for example, setting the camera trigger distance, or setting a servo value). -* *CONDITION commands* (``MAV_CMD_NAV_*``) are used to delay *DO commands* until some condition is met. - For example ``MAV_CMD_CONDITION_DISTANCE`` will prevent DO commands executing until the vehicle - reaches the specified distance from the waypoint. - -During a mission at most one *NAV* command and one *DO* or *CONDITION* command can be running **at the same time**. -*CONDITION* and *DO* commands are associated with the last *NAV* command that was sent: if the UAV reaches the waypoint before these -commands are executed, the next *NAV* command is loaded and they will be skipped. - -The `MAVLink Mission Command Messages (MAV_CMD) `_ -wiki topic provides a more detailed overview of commands. - -.. note:: - - * If the autopilot receives a command that it cannot handle, then the command will be (silently) dropped. - * You cannot yet determine dynamically what commands are supported. We hope to deliver this functionality in - the forthcoming `capability API `_. - - -.. _auto_mode_download_mission: - -Download current mission -======================== - -The mission commands for a vehicle are accessed using the :py:attr:`Vehicle.commands ` -attribute. The attribute is of type :py:class:`CommandSequence `, a class that provides ‘array style’ indexed access to the -waypoints which make up the mission. - -Waypoints are not downloaded from vehicle until :py:func:`download() ` is called. The download is asynchronous; -use :py:func:`wait_ready() ` to block your thread until the download is complete: - -.. code:: python - - # Connect to the Vehicle (in this case a simulated vehicle at 127.0.0.1:14550) - vehicle = connect('127.0.0.1:14550', wait_ready=True) - - # Download the vehicle waypoints (commands). Wait until download is complete. - cmds = vehicle.commands - cmds.download() - cmds.wait_ready() - -.. note:: - - In DroneKit-Python 2 :py:attr:`Vehicle.commands ` contains just the editable waypoints (in version 1.x, the - commands included the non-editable home location as the first item). - - - -.. _auto_mode_clear_mission: - -Clearing current mission -======================== - -To clear a mission you call :py:func:`clear() ` and then -:py:func:`Vehicle.commands.upload() ` (to upload the changes to the vehicle): - -.. code:: python - - # Connect to the Vehicle (in this case a simulated vehicle at 127.0.0.1:14550) - vehicle = connect('127.0.0.1:14550', wait_ready=True) - - # Get commands object from Vehicle. - cmds = vehicle.commands - - # Call clear() on Vehicle.commands and upload the command to the vehicle. - cmds.clear() - cmds.upload() - -.. note:: - - If a mission that is underway is cleared, the mission will continue to the next waypoint. If you don't add a new command - before the waypoint is reached then the vehicle mode will change to RTL (return to launch) mode. - - - -.. _auto_mode_adding_command: - -Creating/adding mission commands -================================ - -After :ref:`downloading ` or :ref:`clearing ` a mission new commands -can be added and uploaded to the vehicle. Commands are added to the mission using :py:func:`add() ` -and are sent to the vehicle (either individually or in batches) using :py:func:`upload() `. - -Each command is packaged in a :py:class:`Command ` object (see that class for the order/meaning of the parameters). -The supported commands for each vehicle are :ref:`linked above `. - - -.. code:: python - - # Connect to the Vehicle (in this case a simulated vehicle at 127.0.0.1:14550) - vehicle = connect('127.0.0.1:14550', wait_ready=True) - - # Get the set of commands from the vehicle - cmds = vehicle.commands - cmds.download() - cmds.wait_ready() - - # Create and add commands - cmd1=Command( 0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 0, 0, 0, 0, 0, 0, 10) - cmd2=Command( 0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 0, 0, 0, 0, 10, 10, 10) - cmds.add(cmd1) - cmds.add(cmd2) - cmds.upload() # Send commands - - - -.. _auto_mode_modify_mission: - -Modifying missions -================== - -While you can :ref:`add new commands ` after :ref:`downloading a mission ` -it is not possible to directly modify and upload existing commands in ``Vehicle.commands`` (you can modify the commands but -changes do not propagate to the vehicle). - -.. todo:: test above statement. Might not be true in DKPY2. Also check if we can flush items in a cycle. - -Instead you copy all the commands into another container (e.g. a list), -modify them as needed, then clear ``Vehicle.commands`` and upload the list as a new mission: - -.. code:: python - - # Connect to the Vehicle (in this case a simulated vehicle at 127.0.0.1:14550) - vehicle = connect('127.0.0.1:14550', wait_ready=True) - - # Get the set of commands from the vehicle - cmds = vehicle.commands - cmds.download() - cmds.wait_ready() - - # Save the vehicle commands to a list - missionlist=[] - for cmd in cmds: - missionlist.append(cmd) - - # Modify the mission as needed. For example, here we change the - # first waypoint into a MAV_CMD_NAV_TAKEOFF command. - missionlist[0].command=mavutil.mavlink.MAV_CMD_NAV_TAKEOFF - - # Clear the current mission (command is sent when we call upload()) - cmds.clear() - - #Write the modified mission and flush to the vehicle - for cmd in missionlist: - cmds.add(cmd) - cmds.upload() - - -The changes are not guaranteed to be complete until -:py:func:`upload() ` is called on the parent ``Vehicle.commands`` object. - - -.. _auto_mode_monitoring_controlling: - -Running and monitoring missions -=============================== - -To start a mission, change the mode to AUTO: - -.. code:: python - - # Connect to the Vehicle (in this case a simulated vehicle at 127.0.0.1:14550) - vehicle = connect('127.0.0.1:14550', wait_ready=True) - - # Set the vehicle into auto mode - vehicle.mode = VehicleMode("AUTO") - -.. note:: - - If the vehicle is in the air, then changing the mode to AUTO is all that is required to start the - mission. - - **Copter 3.3 release and later:** If the vehicle is on the ground (only), you will additionally need to send the - `MAV_CMD_MISSION_START `_ - command. - -You can stop/pause the current mission by switching out of AUTO mode (e.g. into GUIDED mode). If you switch back to -AUTO mode the mission will either restart at the beginning or resume at the current waypoint - the behaviour depends on the value of the -`MIS_RESTART `_ -parameter (available on all vehicle types). - -You can monitor the progress of the mission by polling the :py:func:`Vehicle.commands.next ` attribute -to get the current command number. You can also change the current command by setting the attribute to the desired command number. - -.. code:: python - - vehicle.commands.next=2 - print "Current Waypoint: %s" % vehicle.commands.next - vehicle.commands.next=4 - print "Current Waypoint: %s" % vehicle.commands.next - -There is no need to ``upload()`` changes to send an update to the ``next`` attribute to the vehicle -(and as with other attributes, if you fetch a value, it is updated from the vehicle). - - -.. _auto_mode_handle_mission_end: - -Handling the end of a mission -=============================== - -At the end of the mission the vehicle will enter LOITER mode (hover in place for Copter, -circle for Plane, stop for Rover). You can add new commands to the mission, but you will need to toggle from/back to -AUTO mode to start it running again. - -Currently there is no notification in DroneKit when a mission completes. If you need to detect mission end (in order -to perform some other operation) then you can either: - -* Add a dummy mission command and poll :py:func:`Vehicle.commands.next ` for the - transition to the final command, or -* Compare the current position to the target position in the final waypoint. - - - - -.. _auto_mode_useful_functions: - -Useful Mission functions -======================== - -This example code contains a number of functions that might be useful for managing and monitoring missions: - -.. _auto_mode_load_mission_file: - -Load a mission from a file ------------------------------ - -``upload_mission()`` uploads a mission from a file. - -The implementation calls ``readmission()`` (below) to import the mission from a file into a list. The method then -clears the existing mission and uploads the new version. - -Adding mission commands is discussed :ref:`here in the guide `. - -.. code:: python - - def upload_mission(aFileName): - """ - Upload a mission from a file. - """ - #Read mission from file - missionlist = readmission(aFileName) - - print "\nUpload mission from a file: %s" % import_mission_filename - #Clear existing mission from vehicle - print ' Clear mission' - cmds = vehicle.commands - cmds.clear() - #Add new mission to vehicle - for command in missionlist: - cmds.add(command) - print ' Upload mission' - vehicle.commands.upload() - - -``readmission()`` reads a mission from the specified file and returns a list of :py:class:`Command ` objects. - -Each line is split up. The first line is used to test whether the file has the correct (stated) format. -For subsequent lines the values are stored in a :py:class:`Command ` object -(the values are first cast to the correct ``float`` and ``int`` types for their associated parameters). -The commands are added to a list which is returned by the function. - -.. code:: python - - def readmission(aFileName): - """ - Load a mission from a file into a list. - - This function is used by upload_mission(). - """ - print "Reading mission from file: %s\n" % aFileName - cmds = vehicle.commands - missionlist=[] - with open(aFileName) as f: - for i, line in enumerate(f): - if i==0: - if not line.startswith('QGC WPL 110'): - raise Exception('File is not supported WP version') - else: - linearray=line.split('\t') - ln_index=int(linearray[0]) - ln_currentwp=int(linearray[1]) - ln_frame=int(linearray[2]) - ln_command=int(linearray[3]) - ln_param1=float(linearray[4]) - ln_param2=float(linearray[5]) - ln_param3=float(linearray[6]) - ln_param4=float(linearray[7]) - ln_param5=float(linearray[8]) - ln_param6=float(linearray[9]) - ln_param7=float(linearray[10]) - ln_autocontinue=int(linearray[11].strip()) - cmd = Command( 0, 0, 0, ln_frame, ln_command, ln_currentwp, ln_autocontinue, ln_param1, ln_param2, ln_param3, ln_param4, ln_param5, ln_param6, ln_param7) - missionlist.append(cmd) - return missionlist - - - -.. _auto_mode_save_mission_file: - -Save a mission to a file ------------------------- - -``save_mission()`` saves the current mission to a file (in the `Waypoint file format `_). -It uses ``download_mission()`` (below) to get them mission, and then writes the list line-by-line to the file. - -.. code:: python - - def save_mission(aFileName): - """ - Save a mission in the Waypoint file format (http://qgroundcontrol.org/mavlink/waypoint_protocol#waypoint_file_format). - """ - missionlist = download_mission() - output='QGC WPL 110\n' - for cmd in missionlist: - commandline="%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (cmd.seq,cmd.current,cmd.frame,cmd.command,cmd.param1,cmd.param2,cmd.param3,cmd.param4,cmd.x,cmd.y,cmd.z,cmd.autocontinue) - output+=commandline - with open(aFileName, 'w') as file_: - file_.write(output) - -``download_mission()`` downloads the :py:attr:`Vehicle.commands ` from the vehicle and -adds them to a list. Downloading mission is discussed :ref:`in the guide `. - -.. code:: python - - def download_mission(): - """ - Downloads the current mission and returns it in a list. - It is used in save_mission() to get the file information to save. - """ - missionlist=[] - cmds = vehicle.commands - cmds.download() - cmds.wait_ready() - for cmd in cmds: - missionlist.append(cmd) - return missionlist - - - - - -.. _auto_mode_mission_distance_to_waypoint: - -Get distance to waypoint ------------------------- - -``distance_to_current_waypoint()`` returns the distance (in metres) to the next waypoint: - -.. code:: python - - def distance_to_current_waypoint(): - """ - Gets distance in metres to the current waypoint. - It returns None for the first waypoint (Home location). - """ - nextwaypoint=vehicle.commands.next - if nextwaypoint ==0: - return None - missionitem=vehicle.commands[nextwaypoint-1] #commands are zero indexed - lat=missionitem.x - lon=missionitem.y - alt=missionitem.z - targetWaypointLocation=LocationGlobalRelative(lat,lon,alt) - distancetopoint = get_distance_metres(vehicle.location.global_frame, targetWaypointLocation) - return distancetopoint - -The function determines the current target waypoint number with :py:func:`Vehicle.commands.next ` -and uses it to index the commands to get the latitude, longitude and altitude of the target waypoint. The ``get_distance_metres()`` function -(see :ref:`guided_mode_copter_useful_conversion_functions`) is then used to calculate and return the (horizontal) distance -from the current vehicle location. - -.. tip:: - - This implementation is very basic. It assumes that the next command number is for a valid NAV command (it might not be) - and that the lat/lon/alt values are non-zero. It is however a useful indicator for test code. - - - -.. _auto_mode_mission_useful_links: - -Useful Links -================= - -* `MAVLink mission command messages `_ (all vehicle types - wiki). - diff --git a/simulation/extension_docker/dronekit-python/docs/guide/connecting_vehicle.rst b/simulation/extension_docker/dronekit-python/docs/guide/connecting_vehicle.rst deleted file mode 100644 index af2d68fc..00000000 --- a/simulation/extension_docker/dronekit-python/docs/guide/connecting_vehicle.rst +++ /dev/null @@ -1,101 +0,0 @@ -.. _connecting_vehicle: -.. _get_started_connecting: - -======================= -Connecting to a Vehicle -======================= - -The connection to the vehicle (or multiple vehicles) is set up within the -DroneKit script. Scripts import and call the :py:func:`connect() ` -method. After connecting this returns a :py:class:`Vehicle ` -object from which you can get/set parameters and attributes, and control vehicle movement. - -The most common way to call :py:func:`connect() ` is shown below: - -.. code-block:: python - - from dronekit import connect - - # Connect to the Vehicle (in this case a UDP endpoint) - vehicle = connect('127.0.0.1:14550', wait_ready=True) - -The first parameter specifies the target address (in this case the loopback -address for UDP port 14550). See :ref:`get_started_connect_string` for the strings to use for -other common vehicles. - -The second parameter (``wait_ready``) is used to determine whether ``connect()`` returns immediately -on connection or if it waits until *some* vehicle parameters and attributes are populated. In most cases you -should use ``wait_ready=True`` to wait on the default set of parameters. - -Connecting over a serial device will look something like this: - -.. code-block:: python - - from dronekit import connect - - # Connect to the Vehicle (in this case a serial endpoint) - vehicle = connect('/dev/ttyAMA0', wait_ready=True, baud=57600) - -.. tip:: - - If the baud rate is not set correctly, ``connect`` may fail with a - timeout error. It is best to set the baud rate explicitly. - -:py:func:`connect() ` also has arguments for setting the baud rate, -the length of the connection timeout, and/or to use -a :ref:`custom vehicle class `. - -There is more documentation on all of the parameters in the :py:func:`API Reference `. - - -.. _connection_string_options: -.. _get_started_connect_string: - -Connection string options -========================= - -The table below shows *connection strings* you can use for some of the more common connection types: - -.. list-table:: - :widths: 10 10 - :header-rows: 1 - - * - Connection type - - Connection string - * - Linux computer connected to the vehicle via USB - - ``/dev/ttyUSB0`` - * - Linux computer connected to the vehicle via Serial port (RaspberryPi example) - - ``/dev/ttyAMA0`` (also set ``baud=57600``) - * - SITL connected to the vehicle via UDP - - ``127.0.0.1:14550`` - * - SITL connected to the vehicle via TCP - - ``tcp:127.0.0.1:5760`` - * - OSX computer connected to the vehicle via USB - - ``dev/cu.usbmodem1`` - * - Windows computer connected to the vehicle via USB (in this case on COM14) - - ``com14`` - * - Windows computer connected to the vehicle using a 3DR Telemetry Radio on COM14 - - ``com14`` (also set ``baud=57600``) - -.. tip:: - - The strings above are the same as are used when connecting the MAVProxy GCS. For other options see the - `MAVProxy documentation `_. - -.. note:: - - The default baud rate may not be appropriate for all connection types (this may be the cause - if you can connect via a GCS but not DroneKit). - - -Connecting to multiple vehicles -=============================== - -You can control multiple vehicles from within a single script by calling -:py:func:`connect() ` for each vehicle -with the appropriate :ref:`connection strings `. - -The returned :py:class:`Vehicle ` objects are independent of -each other and can be separately used to control their respective -vehicle. - diff --git a/simulation/extension_docker/dronekit-python/docs/guide/copter/guided_mode.rst b/simulation/extension_docker/dronekit-python/docs/guide/copter/guided_mode.rst deleted file mode 100644 index e7ec0def..00000000 --- a/simulation/extension_docker/dronekit-python/docs/guide/copter/guided_mode.rst +++ /dev/null @@ -1,485 +0,0 @@ -.. _guided_mode_copter: - -============================== -Guiding and Controlling Copter -============================== - -GUIDED mode is the recommended mode for flying Copter autonomously without a predefined a mission. It allows a Ground Control Station (GCS) or :ref:`Companion Computer ` to control the vehicle “on the fly” and react to new events or situations as they occur. - -This topic explains how you can :ref:`control vehicle movement `, and also how to send :ref:`MAVLink commands ` to control vehicle orientation, region of interest, servos and other hardware. We also :ref:`list a few functions ` that are useful for converting location and bearings from a global into a local frame of reference. - -Most of the code can be observed running in :ref:`example-guided-mode-setting-speed-yaw`. - -.. note:: - - This topic is Copter specific. Plane apps typically use AUTO mode and dynamically modify missions as needed (Plane supports GUIDED mode but it is less full featured than on Copter). - -.. todo:: - - Revisit above tip when we have a Plane AUTO mode example. Also perhaps a Plane GUIDED mode topic, though that would be low priority. Also add something about Rover when we know more about how it works. - -.. _guided_mode_copter_control_movement: - -Controlling vehicle movement -============================ - -Copter movement can be controlled either by explicitly setting a :ref:`target position `, or by specifying the vehicle's :ref:`velocity components ` to guide it in a preferred direction. - -.. note:: - - Changing to a new movement method is treated as a "mode change". If you've set a yaw or region-of-interest value then this will be set to the default (vehicle faces the direction of travel). - - -.. _guided_mode_copter_position_control: - -Position control ----------------- - -Controlling the vehicle by explicitly setting the target position is useful when the final position is known/fixed. - -The recommended method for position control is :py:func:`Vehicle.simple_goto() `. -This takes a :py:class:`LocationGlobal ` or -:py:class:`LocationGlobalRelative ` argument. - -The method is used as shown below: - -.. code-block:: python - - # Set mode to guided - this is optional as the goto method will change the mode if needed. - vehicle.mode = VehicleMode("GUIDED") - - # Set the target location in global-relative frame - a_location = LocationGlobalRelative(-34.364114, 149.166022, 30) - vehicle.simple_goto(a_location) - - -``Vehicle.simple_goto()`` can be interrupted by a later command, and does not provide any functionality -to indicate when the vehicle has reached its destination. Developers can use either a time delay or -:ref:`measure proximity to the target ` to give the vehicle an -opportunity to reach its destination. The :ref:`example-guided-mode-setting-speed-yaw` shows both approaches. - -You can optionally set the target movement speed using the function's ``airspeed`` or ``groundspeed`` parameters -(this is equivalent to setting :py:attr:`Vehicle.airspeed ` -or :py:attr:`Vehicle.groundspeed `). The speed setting will then be used -for all positional movement commands until it is set to another value. - -.. code-block:: python - - # Set airspeed using attribute - vehicle.airspeed = 5 #m/s - - # Set groundspeed using attribute - vehicle.groundspeed = 7.5 #m/s - - # Set groundspeed using `simple_goto()` parameter - vehicle.simple_goto(a_location, groundspeed=10) - -.. note:: - - ``Vehicle.simple_goto()`` will use the last speed value set. If both speed values are set at the - same time the resulting behaviour will be vehicle dependent. - - -.. tip:: - - You can also set the position by sending the MAVLink commands - `SET_POSITION_TARGET_GLOBAL_INT `_ or - `SET_POSITION_TARGET_LOCAL_NED `_, specifying - a ``type_mask`` bitmask that enables the position parameters. The main difference between these commands is - that the former allows you to specify the location relative to the "global" frames (like - ``Vehicle.simple_goto()``), while the later lets you specify the location in NED co-ordinates relative - to the home location or the vehicle itself. For more information on these options see the example code: - :ref:`example_guided_mode_goto_position_target_global_int` and :ref:`example_guided_mode_goto_position_target_local_ned`. - - - -.. _guided_mode_copter_velocity_control: - -Velocity control ----------------- - -Controlling vehicle movement using velocity is much smoother than using position when there are likely -to be many updates (for example when tracking moving objects). - -The function ``send_ned_velocity()`` below generates a ``SET_POSITION_TARGET_LOCAL_NED`` MAVLink message -which is used to directly specify the speed components of the vehicle in the ``MAV_FRAME_LOCAL_NED`` -frame (relative to home location). The message is re-sent every second for the specified duration. - -.. note:: - - From Copter 3.3 the vehicle will stop moving if a new message is not received in approximately 3 seconds. - Prior to Copter 3.3 the message only needs to be sent once, and the velocity remains active until the next - movement command is received. The example code works for both cases! - - -.. code-block:: python - - def send_ned_velocity(velocity_x, velocity_y, velocity_z, duration): - """ - Move vehicle in direction based on specified velocity vectors. - """ - msg = vehicle.message_factory.set_position_target_local_ned_encode( - 0, # time_boot_ms (not used) - 0, 0, # target system, target component - mavutil.mavlink.MAV_FRAME_LOCAL_NED, # frame - 0b0000111111000111, # type_mask (only speeds enabled) - 0, 0, 0, # x, y, z positions (not used) - velocity_x, velocity_y, velocity_z, # x, y, z velocity in m/s - 0, 0, 0, # x, y, z acceleration (not supported yet, ignored in GCS_Mavlink) - 0, 0) # yaw, yaw_rate (not supported yet, ignored in GCS_Mavlink) - - - # send command to vehicle on 1 Hz cycle - for x in range(0,duration): - vehicle.send_mavlink(msg) - time.sleep(1) - - -The ``type_mask`` parameter is a bitmask that indicates which of the other parameters in the message are used/ignored by the vehicle -(0 means that the dimension is enabled, 1 means ignored). In the example the value 0b0000111111000111 -is used to enable the velocity components. - -In the ``MAV_FRAME_LOCAL_NED`` the speed components ``velocity_x`` and ``velocity_y`` are parallel to the North and East -directions (not to the front and side of the vehicle). -The ``velocity_z`` component is perpendicular to the plane of ``velocity_x`` and ``velocity_y``, with a positive value **towards the ground**, following -the right-hand convention. For more information about the ``MAV_FRAME_LOCAL_NED`` frame of reference, see this wikipedia article -on `NED `_. - -.. tip:: - - From Copter 3.3 you can `specify other frames `_, - for example ``MAV_FRAME_BODY_OFFSET_NED`` makes the velocity components relative to the current vehicle heading. - In Copter 3.2.1 (and earlier) the frame setting is ignored (``MAV_FRAME_LOCAL_NED`` is always used). - - - -The code fragment below shows how to call this method: - -.. code-block:: python - - # Set up velocity mappings - # velocity_x > 0 => fly North - # velocity_x < 0 => fly South - # velocity_y > 0 => fly East - # velocity_y < 0 => fly West - # velocity_z < 0 => ascend - # velocity_z > 0 => descend - SOUTH=-2 - UP=-0.5 #NOTE: up is negative! - - #Fly south and up. - send_ned_velocity(SOUTH,0,UP,DURATION) - -When moving the vehicle you can send separate commands to control the yaw (and other behaviour). - -.. tip:: - - You can also control the velocity using the - `SET_POSITION_TARGET_GLOBAL_INT `_ - MAVLink command, as described in :ref:`example_guided_mode_send_global_velocity`. - - - -.. _guided_mode_copter_accel_force_control: - -Acceleration and force control ------------------------------- - -ArduPilot does not currently support controlling the vehicle by specifying acceleration/force components. - -.. note:: - - The `SET_POSITION_TARGET_GLOBAL_INT `_ and - `SET_POSITION_TARGET_LOCAL_NED `_ - MAVLink commands allow you to specify the acceleration, force and yaw. However, commands setting - these parameters are ignored by the vehicle. - - - -.. _guided_mode_copter_commands: - -Guided mode commands -===================== - -This section explains how to send MAVLink commands, what commands can be sent, and lists a number of real examples you can use in your own code. - - -.. _guided_mode_how_to_send_commands: - -Sending messages/commands -------------------------- - -MAVLink commands are sent by first using :py:func:`message_factory() ` -to encode the message and then calling :py:func:`send_mavlink() ` to send them. - -.. note:: - - Vehicles support a subset of the messages defined in the MAVLink standard. For more information - about the supported sets see wiki topics: - `Copter Commands in Guided Mode `_ - and `Plane Commands in Guided Mode `_. - -``message_factory()`` uses a factory method for the encoding. The name of this method will always be the -lower case version of the message/command name with ``_encode`` appended. For example, to encode a -`SET_POSITION_TARGET_LOCAL_NED `_ -message we call ``message_factory.set_position_target_local_ned_encode()`` with values for all the -message fields as arguments: - -.. code-block:: python - - msg = vehicle.message_factory.set_position_target_local_ned_encode( - 0, # time_boot_ms (not used) - 0, 0, # target_system, target_component - mavutil.mavlink.MAV_FRAME_BODY_NED, # frame - 0b0000111111000111, # type_mask (only speeds enabled) - 0, 0, 0, # x, y, z positions - velocity_x, velocity_y, velocity_z, # x, y, z velocity in m/s - 0, 0, 0, # x, y, z acceleration (not supported yet, ignored in GCS_Mavlink) - 0, 0) # yaw, yaw_rate (not supported yet, ignored in GCS_Mavlink) - # send command to vehicle - vehicle.send_mavlink(msg) - -If a message includes ``target_system`` id you can set it to zero (DroneKit will automatically -update the value with the correct ID for the connected vehicle). Similarly CRC fields and sequence numbers -(if defined in the message type) can be set to zero as they are automatically updated by DroneKit. -The ``target_component`` is not updated by DroneKit, but should be set to 0 (broadcast) unless the message is -really intended for a specific component. - - -.. _guided_mode_how_to_send_commands_command_long: - -In Copter, the `COMMAND_LONG message `_ can be used send/package -*a number* of different `supported MAV_CMD commands `_. -The factory function is again the lower case message name with suffix ``_encode`` (``message_factory.command_long_encode``). -The message parameters include the actual command to be sent (in the code fragment below ``MAV_CMD_CONDITION_YAW``) and its fields. - -.. code-block:: python - - msg = vehicle.message_factory.command_long_encode( - 0, 0, # target_system, target_component - mavutil.mavlink.MAV_CMD_CONDITION_YAW, #command - 0, #confirmation - heading, # param 1, yaw in degrees - 0, # param 2, yaw speed deg/s - 1, # param 3, direction -1 ccw, 1 cw - is_relative, # param 4, relative offset 1, absolute angle 0 - 0, 0, 0) # param 5 ~ 7 not used - # send command to vehicle - vehicle.send_mavlink(msg) - - -.. _guided_mode_supported_commands: - -Supported commands ------------------- - -`Copter Commands in Guided Mode `_ lists all the commands that *can* be sent to Copter in GUIDED mode (in fact most of the commands can be sent in any mode!) - -DroneKit-Python provides a friendly Python API that abstracts many of the commands. -Where possible you should use the API rather than send messages directly> For example, use: - -* :py:func:`Vehicle.simple_takeoff() ` instead of the ``MAV_CMD_NAV_TAKEOFF`` command. -* :py:func:`Vehicle.simple_goto() `, :py:attr:`Vehicle.airspeed `, - or :py:attr:`Vehicle.groundspeed ` rather than ``MAV_CMD_DO_CHANGE_SPEED``. - -Some of the MAV_CMD commands that you might want to send include: -:ref:`MAV_CMD_CONDITION_YAW `, -:ref:`MAV_CMD_DO_SET_ROI `, -``MAV_CMD_DO_SET_SERVO``, -``MAV_CMD_DO_REPEAT_SERVO``, -``MAV_CMD_DO_SET_RELAY``, -``MAV_CMD_DO_REPEAT_RELAY``, -``MAV_CMD_DO_FENCE_ENABLE``, -``MAV_CMD_DO_PARACHUTE``, -``MAV_CMD_DO_GRIPPER``, -``MAV_CMD_MISSION_START``. -These would be sent in a ``COMMAND_LONG`` message :ref:`as discussed above `. - - - -.. _guided_mode_copter_set_yaw: - -Setting the Yaw ----------------- - -The vehicle "yaw" is the direction that the vehicle is facing in the horizontal plane. On Copter this yaw need not be the direction of travel (though it is by default). - -You can set the yaw direction using the `MAV_CMD_CONDITION_YAW `_ command, encoded in a ``COMMAND_LONG`` message as shown below. - -.. code-block:: python - - def condition_yaw(heading, relative=False): - if relative: - is_relative=1 #yaw relative to direction of travel - else: - is_relative=0 #yaw is an absolute angle - # create the CONDITION_YAW command using command_long_encode() - msg = vehicle.message_factory.command_long_encode( - 0, 0, # target system, target component - mavutil.mavlink.MAV_CMD_CONDITION_YAW, #command - 0, #confirmation - heading, # param 1, yaw in degrees - 0, # param 2, yaw speed deg/s - 1, # param 3, direction -1 ccw, 1 cw - is_relative, # param 4, relative offset 1, absolute angle 0 - 0, 0, 0) # param 5 ~ 7 not used - # send command to vehicle - vehicle.send_mavlink(msg) - -The command allows you to specify that whether the heading is an absolute angle in degrees (0 degrees is North) or a value that is relative to the previously set heading. - -.. note:: - - * The yaw will return to the default (facing direction of travel) after you set the mode or change the command used for controlling movement. - * `At time of writing `_ there is no *safe way* to return to the default yaw "face direction of travel" behaviour. - * After taking off, yaw commands are ignored until the first "movement" command has been received. - If you need to yaw immediately following takeoff then send a command to "move" to your current position. - * :ref:`guided_mode_copter_set_roi` may work to get yaw to track a particular point (depending on the gimbal setup). - - - - -.. _guided_mode_copter_set_roi: - -Setting the ROI ---------------- - -Send the `MAV_CMD_DO_SET_ROI `_ command to point camera gimbal at a specified region of interest (:py:class:`LocationGlobal `). The vehicle may also turn to face the ROI. - -.. code-block:: python - - def set_roi(location): - # create the MAV_CMD_DO_SET_ROI command - msg = vehicle.message_factory.command_long_encode( - 0, 0, # target system, target component - mavutil.mavlink.MAV_CMD_DO_SET_ROI, #command - 0, #confirmation - 0, 0, 0, 0, #params 1-4 - location.lat, - location.lon, - location.alt - ) - # send command to vehicle - vehicle.send_mavlink(msg) - - -.. versionadded:: Copter 3.2.1. You can explicitly reset the ROI by sending the - `MAV_CMD_DO_SET_ROI `_ - command with zero in all parameters. The front of the vehicle will then follow the direction of travel. - -The ROI (and yaw) is also reset when the mode, or the command used to control movement, is changed. - - - -.. _guided_mode_copter_responses: - -Command acknowledgements and response values --------------------------------------------- - -ArduPilot typically sends a command acknowledgement indicating whether a command was received, and whether -it was accepted or rejected. At time of writing there is no way to intercept this acknowledgement -in the API (`#168 `_). - -Some MAVLink messages request information from the autopilot, and expect the result to be returned -in another message. Provided the message is handled by the AutoPilot in GUIDED mode you can send the request -and process the response by creating a :ref:`message listener `. - - -.. _guided_mode_copter_useful_conversion_functions: - -Frame conversion functions -========================== - -The functions in this section help convert between different frames-of-reference. In particular they -make it easier to navigate in terms of "metres from the current position" when using commands that take -absolute positions in decimal degrees. - -The methods are approximations only, and may be less accurate over longer distances, and when close -to the Earth's poles. - -.. code-block:: python - - def get_location_metres(original_location, dNorth, dEast): - """ - Returns a LocationGlobal object containing the latitude/longitude `dNorth` and `dEast` metres from the - specified `original_location`. The returned LocationGlobal has the same `alt` value - as `original_location`. - - The function is useful when you want to move the vehicle around specifying locations relative to - the current vehicle position. - - The algorithm is relatively accurate over small distances (10m within 1km) except close to the poles. - - For more information see: - http://gis.stackexchange.com/questions/2951/algorithm-for-offsetting-a-latitude-longitude-by-some-amount-of-meters - """ - earth_radius=6378137.0 #Radius of "spherical" earth - #Coordinate offsets in radians - dLat = dNorth/earth_radius - dLon = dEast/(earth_radius*math.cos(math.pi*original_location.lat/180)) - - #New position in decimal degrees - newlat = original_location.lat + (dLat * 180/math.pi) - newlon = original_location.lon + (dLon * 180/math.pi) - if type(original_location) is LocationGlobal: - targetlocation=LocationGlobal(newlat, newlon,original_location.alt) - elif type(original_location) is LocationGlobalRelative: - targetlocation=LocationGlobalRelative(newlat, newlon,original_location.alt) - else: - raise Exception("Invalid Location object passed") - - return targetlocation; - - -.. code-block:: python - - def get_distance_metres(aLocation1, aLocation2): - """ - Returns the ground distance in metres between two `LocationGlobal` or `LocationGlobalRelative` objects. - - This method is an approximation, and will not be accurate over large distances and close to the - earth's poles. It comes from the ArduPilot test code: - https://github.com/diydrones/ardupilot/blob/master/Tools/autotest/common.py - """ - dlat = aLocation2.lat - aLocation1.lat - dlong = aLocation2.lon - aLocation1.lon - return math.sqrt((dlat*dlat) + (dlong*dlong)) * 1.113195e5 - - -.. code-block:: python - - def get_bearing(aLocation1, aLocation2): - """ - Returns the bearing between the two LocationGlobal objects passed as parameters. - - This method is an approximation, and may not be accurate over large distances and close to the - earth's poles. It comes from the ArduPilot test code: - https://github.com/diydrones/ardupilot/blob/master/Tools/autotest/common.py - """ - off_x = aLocation2.lon - aLocation1.lon - off_y = aLocation2.lat - aLocation1.lat - bearing = 90.00 + math.atan2(-off_y, off_x) * 57.2957795 - if bearing < 0: - bearing += 360.00 - return bearing; - -.. tip:: - - The `common.py `_ file - in the ArduPilot test code may have other functions that you will find useful. - - - -Other information -================= - -* `NED Frame `_ -* `MISSION_ITEM `_ -* `GUIDED Mode for Copter `_ (wiki). -* `GUIDED mode for Plane `_ (wiki). -* `Copter Commands in Guided Mode `_ (wiki). -* `MAVLink mission command messages `_ (wiki). -* `GCS_Mavlink.cpp `_ (Copter) - - - diff --git a/simulation/extension_docker/dronekit-python/docs/guide/debugging.rst b/simulation/extension_docker/dronekit-python/docs/guide/debugging.rst deleted file mode 100644 index 2ce7ef0e..00000000 --- a/simulation/extension_docker/dronekit-python/docs/guide/debugging.rst +++ /dev/null @@ -1,89 +0,0 @@ -.. _debugging: - -========= -Debugging -========= - -DroneKit-Python apps can be debugged in the same way as any other standalone Python scripts. -The sections below outline a few methods. - - - -pdb - The Python Debugger -========================= - -The `Python Debugger - pdb `_ can be used to debug *DroneKit-Python* apps. - -The command below can be used to run a script in debug mode: - -.. code-block:: bash - - python -m pdb my_dronekit_script.py - -You can also instrument your code to invoke the debugger at a certain point. To do this -add ``set-trace()`` at the point where you want to break execution: - -.. code-block:: python - :emphasize-lines: 4 - - # Connect to the Vehicle on udp at 127.0.0.1:14550 - vehicle = connect('127.0.0.1:14550', wait_ready=True) - - import pdb; pdb.set_trace() - print "Global Location: %s" % vehicle.location.global_frame - - -The available `debugger commands are listed here `_. - -pudb - A full-screen, console-based Python debugger -=================================================== - -If you prefer a IDE like debug you can use `pudb - A full-screen, console-based Python debugger `_. - -.. code-block:: python - :emphasize-lines: 4 - - pip install pudb - - -To start debugging, simply insert: - -.. code-block:: python - :emphasize-lines: 4 - - from pudb import set_trace; set_trace() - -Insert either of these snippets into the piece of code you want to debug, or run the entire script with: - -.. code-block:: python - :emphasize-lines: 4 - - pudb my-script.py - - -Print/log statements -==================== - -The simplest and most common method of debugging is to manually add debug/print statements to the source. - -.. code-block:: python - :emphasize-lines: 4 - - # Connect to the Vehicle on udp at 127.0.0.1:14550 - vehicle = connect('127.0.0.1:14550', wait_ready=True) - - # print out debug information - print "Global Location: %s" % vehicle.location.global_frame - -In addition to printing DroneKit variables, Python provides numerous inbuilt and add-on modules/methods -for inspecting code (e.g. `dir() `_, `traceback `_, etc.) - - -Other IDEs/debuggers -==================== - -There is no reason you should not be able to straightforwardly use other popular Python IDEs including IDLE and Eclipse. - - - - diff --git a/simulation/extension_docker/dronekit-python/docs/guide/index.rst b/simulation/extension_docker/dronekit-python/docs/guide/index.rst deleted file mode 100644 index c6d10c7b..00000000 --- a/simulation/extension_docker/dronekit-python/docs/guide/index.rst +++ /dev/null @@ -1,17 +0,0 @@ -===== -Guide -===== - -The guide contains how-to documentation for using the DroneKit-Python API. -Additional guide material can be found in the :ref:`example-toc`. - -.. toctree:: - :maxdepth: 1 - - connecting_vehicle - vehicle_state_and_parameters - taking_off - copter/guided_mode - Missions - debugging - mavlink_messages \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/docs/guide/mavlink_messages.rst b/simulation/extension_docker/dronekit-python/docs/guide/mavlink_messages.rst deleted file mode 100644 index 16cac574..00000000 --- a/simulation/extension_docker/dronekit-python/docs/guide/mavlink_messages.rst +++ /dev/null @@ -1,87 +0,0 @@ -.. _mavlink_messages: - -================ -MAVLink Messages -================ - -Some useful MAVLink messages sent by the autopilot are not (yet) directly available to DroneKit-Python scripts -through the :ref:`observable attributes ` in :py:class:`Vehicle `. - -This topic shows how you can intercept specific MAVLink messages by defining a listener callback function -using the :py:func:`Vehicle.on_message() ` decorator. - -.. tip:: - - :ref:`example_create_attribute` shows how you can extend this approach to create a new :py:class:`Vehicle ` - attribute in your client code. - - -.. _mavlink_messages_message_listener: -.. _mavlink_messages_set_mavlink_callback: - -Creating a message listener -=========================== - -The :py:func:`Vehicle.on_message() ` decorator can be used to -set a particular function as the callback handler for a particular message type. You can create listeners -for as many messages as you like, or even multiple listeners for the same message. - -For example, the code snippet below shows how to set a listener for the ``RANGEFINDER`` message: - -.. code:: python - - #Create a message listener using the decorator. - @vehicle.on_message('RANGEFINDER') - def listener(self, name, message): - print message - -.. tip:: - - Every single listener can have the same name/prototpye as above ("``listener``") because - Python does not notice the decorated functions are in the same scope. - - Unfortunately this also means that you can't unregister a callback created using this method. - -The messages are `classes `_ from the -`pymavlink `_ library. -The output of the code above looks something like: - -.. code:: bash - - RANGEFINDER {distance : 0.0899999961257, voltage : 0.00900000054389} - ... - -You can access the message fields directly. For example, to access the ``RANGEFINDER`` message your listener -function might look like this: - -.. code:: python - - #Create a message listener using the decorator. - @vehicle.on_message('RANGEFINDER') - def listener(self, name, message): - print 'distance: %s' % message.distance - print 'voltage: %s' % message.voltage - - -Watching all messages -===================== - -You can register a callback for *all messages* by setting the message name as the wildcard string ('``*``'): - -.. code:: python - - #Create a message listener for all messages. - @vehicle.on_message('*') - def listener(self, name, message): - print 'message: %s' % message - - -Removing an observer -==================== - -Callbacks registered using the :py:func:`Vehicle.on_message() ` decorator *cannot be removed*. -This is generally not a problem, because in most cases you're interested in messages for the lifetime of a session. - -If you do need to be able to remove messages you can instead add the callback using -:py:func:`Vehicle.add_message_listener `, and then remove it by calling -:py:func:`Vehicle.remove_message_listener `. diff --git a/simulation/extension_docker/dronekit-python/docs/guide/quick_start.rst b/simulation/extension_docker/dronekit-python/docs/guide/quick_start.rst deleted file mode 100644 index 7dc795e0..00000000 --- a/simulation/extension_docker/dronekit-python/docs/guide/quick_start.rst +++ /dev/null @@ -1,118 +0,0 @@ -.. _quick_start_top: - -=========== -Quick Start -=========== - -This topic shows how to quickly install a DroneKit-Python -*development environment* and run a simple example to get -vehicle attributes from a *simulated* Copter. - - -Installation -============ - -DroneKit-Python and the *dronekit-sitl simulator* are installed -from **pip** on all platforms. - -On Linux you will first need to install **pip** and **python-dev**: - -.. code-block:: bash - - sudo apt-get install python-pip python-dev - - -**pip** is then used to install *dronekit* and *dronekit-sitl*. -Mac and Linux may require you to prefix these commands with ``sudo``: - -.. code-block:: bash - - pip install dronekit - pip install dronekit-sitl - -See :doc:`../develop/installation` and `dronekit-sitl `_ -for more detailed installation instructions. - - -Basic "Hello Drone" -=================== - -The script below first launches the simulator. It then -imports and calls the :py:func:`connect() ` method, -specifying the simulator's connection string (``tcp:127.0.0.1:5760``). -The method returns a :py:class:`Vehicle ` object that -we then use to query the attributes. - -.. code:: python - - print "Start simulator (SITL)" - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - # Import DroneKit-Python - from dronekit import connect, VehicleMode - - # Connect to the Vehicle. - print("Connecting to vehicle on: %s" % (connection_string,)) - vehicle = connect(connection_string, wait_ready=True) - - # Get some vehicle attributes (state) - print "Get some vehicle attribute values:" - print " GPS: %s" % vehicle.gps_0 - print " Battery: %s" % vehicle.battery - print " Last Heartbeat: %s" % vehicle.last_heartbeat - print " Is Armable?: %s" % vehicle.is_armable - print " System status: %s" % vehicle.system_status.state - print " Mode: %s" % vehicle.mode.name # settable - - # Close vehicle object before exiting script - vehicle.close() - - # Shut down simulator - sitl.stop() - print("Completed") - - -Copy the text above into a new text file (**hello.py**) and run it in the same way -as you would any other standalone Python script. - -.. code-block:: bash - - python hello.py - -You should see the following output from the simulated vehicle: - -.. code-block:: bash - - Start simulator (SITL) - Downloading SITL from http://dronekit-assets.s3.amazonaws.com/sitl/copter/sitl-win-copter-3.3.tar.gz - Extracted. - Connecting to vehicle on: 'tcp:127.0.0.1:5760' - >>> APM:Copter V3.3 (d6053245) - >>> Frame: QUAD - >>> Calibrating barometer - >>> Initialising APM... - >>> barometer calibration complete - >>> GROUND START - Get some vehicle attribute values: - GPS: GPSInfo:fix=3,num_sat=10 - Battery: Battery:voltage=12.587,current=0.0,level=100 - Last Heartbeat: 0.713999986649 - Is Armable?: False - System status: STANDBY - Mode: STABILIZE - Completed - -That's it- you've run your first DroneKit-Python script. - -Next Steps -========== - -* Learn more about :doc:`../develop/index`. - This covers development best practices and coding standards, - and has more information about installation, working with a simulator - and setting up a companion computer. -* Read through our step by step :doc:`index` to learn how to connect to your - vehicle, takeoff, fly, and much more. -* Check out our :doc:`../examples/index`. diff --git a/simulation/extension_docker/dronekit-python/docs/guide/taking_off.rst b/simulation/extension_docker/dronekit-python/docs/guide/taking_off.rst deleted file mode 100644 index 725ce11e..00000000 --- a/simulation/extension_docker/dronekit-python/docs/guide/taking_off.rst +++ /dev/null @@ -1,146 +0,0 @@ -.. _taking-off: - -========== -Taking Off -========== - -This article explains how to get your *Copter* to take off. - -At high level, the steps are: check that the vehicle is *able* to arm, set the mode to ``GUIDED``, -command the vehicle to arm, takeoff and block until we reach the desired altitude. - -.. todo:: - - Plane apps take off using the ``MAV_CMD_NAV_TAKEOFF`` command in a mission. The plane should first arm and then change to - ``AUTO`` mode to start the mission. The action here is to add a link when we have an example we can point to. - - -.. tip:: - - Copter is usually started in ``GUIDED`` mode. - - * For Copter 3.2.1 and earlier you cannot take off in ``AUTO`` mode (if you need to run a mission you take off - in ``GUIDED`` mode and then switch to ``AUTO`` mode once you're in the air). - * Starting from Copter 3.3 you can takeoff in ``AUTO`` mode (provided the mission has a - `MAV_CMD_NAV_TAKEOFF `_ command) - but the mission will not start until you explicitly send the - `MAV_CMD_MISSION_START `_ - message. - - By contrast, Plane apps take off using the ``MAV_CMD_NAV_TAKEOFF`` command in a mission. - Plane should first arm and then change to ``AUTO`` mode to start the mission. - -The code below shows a function to arm a Copter, take off, and fly to a specified altitude. This is taken from :ref:`example_simple_goto`. - -.. code-block:: python - - # Connect to the Vehicle (in this case a simulator running the same computer) - vehicle = connect('tcp:127.0.0.1:5760', wait_ready=True) - - def arm_and_takeoff(aTargetAltitude): - """ - Arms vehicle and fly to aTargetAltitude. - """ - - print "Basic pre-arm checks" - # Don't try to arm until autopilot is ready - while not vehicle.is_armable: - print " Waiting for vehicle to initialise..." - time.sleep(1) - - print "Arming motors" - # Copter should arm in GUIDED mode - vehicle.mode = VehicleMode("GUIDED") - vehicle.armed = True - - # Confirm vehicle armed before attempting to take off - while not vehicle.armed: - print " Waiting for arming..." - time.sleep(1) - - print "Taking off!" - vehicle.simple_takeoff(aTargetAltitude) # Take off to target altitude - - # Wait until the vehicle reaches a safe height before processing the goto (otherwise the command - # after Vehicle.simple_takeoff will execute immediately). - while True: - print " Altitude: ", vehicle.location.global_relative_frame.alt - #Break and return from function just below target altitude. - if vehicle.location.global_relative_frame.alt>=aTargetAltitude*0.95: - print "Reached target altitude" - break - time.sleep(1) - - arm_and_takeoff(20) - - -The function first performs some pre-arm checks. - -.. note:: - - Arming turns on the vehicle's motors in preparation for flight. The flight controller will not arm - until the vehicle has passed a series of pre-arm checks to ensure that it is safe to fly. - -These checks are encapsulated by the :py:func:`Vehicle.is_armable ` -attribute, which is ``true`` when the vehicle has booted, EKF is ready, and the vehicle has GPS lock. - -.. code-block:: python - - print "Basic pre-arm checks" - # Don't let the user try to arm until autopilot is ready - while not vehicle.is_armable: - print " Waiting for vehicle to initialise..." - time.sleep(1) - -.. note:: - - If you need more status information you can perform the following sorts of checks: - - .. code-block:: python - - if v.mode.name == "INITIALISING": - print "Waiting for vehicle to initialise" - time.sleep(1) - while vehicle.gps_0.fix_type < 2: - print "Waiting for GPS...:", vehicle.gps_0.fix_type - time.sleep(1) - - You should always do a final check on :py:func:`Vehicle.is_armable `! - - -Once the vehicle is ready we set the mode to ``GUIDED`` and arm it. We then wait until arming is confirmed -before sending the :py:func:`takeoff ` command. - -.. code-block:: python - - print "Arming motors" - # Copter should arm in GUIDED mode - vehicle.mode = VehicleMode("GUIDED") - vehicle.armed = True - - while not vehicle.armed: - print " Waiting for arming..." - time.sleep(1) - - print "Taking off!" - vehicle.simple_takeoff(aTargetAltitude) # Take off to target altitude - -The ``takeoff`` command is asynchronous and can be interrupted if another command arrives before it reaches -the target altitude. This could have potentially serious consequences if the vehicle is commanded to move -horizontally before it reaches a safe height. In addition, there is no message sent back from the vehicle -to inform the client code that the target altitude has been reached. - -To address these issues, the function waits until the vehicle reaches a specified height before returning. If you're not -concerned about reaching a particular height, a simpler implementation might just "wait" for a few seconds. - -.. code-block:: python - - while True: - print " Altitude: ", vehicle.location.global_relative_frame.alt - #Break and return from function just below target altitude. - if vehicle.location.global_relative_frame.alt>=aTargetAltitude*0.95: - print "Reached target altitude" - break - time.sleep(1) - -When the function returns the app can continue in ``GUIDED`` mode or switch to ``AUTO`` mode to start a mission. diff --git a/simulation/extension_docker/dronekit-python/docs/guide/vehicle_state_and_parameters.rst b/simulation/extension_docker/dronekit-python/docs/guide/vehicle_state_and_parameters.rst deleted file mode 100644 index 1bb23ddd..00000000 --- a/simulation/extension_docker/dronekit-python/docs/guide/vehicle_state_and_parameters.rst +++ /dev/null @@ -1,462 +0,0 @@ -.. _vehicle-information: - -=========================== -Vehicle State and Settings -=========================== - -The :py:class:`Vehicle ` class exposes *most* state information (position, speed, etc.) through python -:ref:`attributes `, while vehicle :ref:`parameters ` (settings) -are accessed though named elements of :py:attr:`Vehicle.parameters `. - -This topic explains how to get, set and observe vehicle state and parameter information (including getting the -:ref:`Home location `). - -.. tip:: You can test most of the code in this topic by running the :ref:`Vehicle State ` example. - - -.. _vehicle_state_attributes: - -Attributes -========== - -Vehicle state information is exposed through vehicle *attributes*. DroneKit-Python currently supports the following -"standard" attributes: -:py:attr:`Vehicle.version `, -:py:attr:`Vehicle.location.capabilities `, -:py:attr:`Vehicle.location.global_frame `, -:py:attr:`Vehicle.location.global_relative_frame `, -:py:attr:`Vehicle.location.local_frame `, -:py:attr:`Vehicle.attitude `, -:py:attr:`Vehicle.velocity `, -:py:attr:`Vehicle.gps_0 `, -:py:attr:`Vehicle.gimbal `, -:py:attr:`Vehicle.battery `, -:py:attr:`Vehicle.rangefinder `, -:py:attr:`Vehicle.ekf_ok `, -:py:attr:`Vehicle.last_heartbeat `, -:py:attr:`Vehicle.home_location `, -:py:func:`Vehicle.system_status `, -:py:func:`Vehicle.heading `, -:py:func:`Vehicle.is_armable `, -:py:attr:`Vehicle.airspeed `, -:py:attr:`Vehicle.groundspeed `, -:py:attr:`Vehicle.armed `, -:py:attr:`Vehicle.mode `. - -Attributes are initially created with ``None`` values for their members. In most cases the members are populated -(and repopulated) as new MAVLink messages of the associated types are received from the vehicle. - -All of the attributes can be :ref:`read `, -but only the :py:attr:`Vehicle.home_location `, -:py:attr:`Vehicle.gimbal ` -:py:attr:`Vehicle.airspeed `, -:py:attr:`Vehicle.groundspeed `, -:py:attr:`Vehicle.mode ` and -:py:attr:`Vehicle.armed ` -status can be :ref:`set `. - -Almost all of the attributes can be :ref:`observed `. - -The behaviour of :py:attr:`Vehicle.home_location ` is different -from the other attributes, and is :ref:`discussed in its own section below `. - -.. _vehicle_state_read_attributes: - -Getting attributes ------------------- - -The code fragment below shows how to read and print almost all the attributes (values are -regularly updated from MAVLink messages sent by the vehicle). - -.. code:: python - - # vehicle is an instance of the Vehicle class - print "Autopilot Firmware version: %s" % vehicle.version - print "Autopilot capabilities (supports ftp): %s" % vehicle.capabilities.ftp - print "Global Location: %s" % vehicle.location.global_frame - print "Global Location (relative altitude): %s" % vehicle.location.global_relative_frame - print "Local Location: %s" % vehicle.location.local_frame #NED - print "Attitude: %s" % vehicle.attitude - print "Velocity: %s" % vehicle.velocity - print "GPS: %s" % vehicle.gps_0 - print "Groundspeed: %s" % vehicle.groundspeed - print "Airspeed: %s" % vehicle.airspeed - print "Gimbal status: %s" % vehicle.gimbal - print "Battery: %s" % vehicle.battery - print "EKF OK?: %s" % vehicle.ekf_ok - print "Last Heartbeat: %s" % vehicle.last_heartbeat - print "Rangefinder: %s" % vehicle.rangefinder - print "Rangefinder distance: %s" % vehicle.rangefinder.distance - print "Rangefinder voltage: %s" % vehicle.rangefinder.voltage - print "Heading: %s" % vehicle.heading - print "Is Armable?: %s" % vehicle.is_armable - print "System status: %s" % vehicle.system_status.state - print "Mode: %s" % vehicle.mode.name # settable - print "Armed: %s" % vehicle.armed # settable - - -.. note:: - - A value of ``None`` for an attribute member indicates that the value has not yet been populated from the vehicle. - For example, before GPS lock :py:attr:`Vehicle.gps_0 ` will return a - :py:class:`GPSInfo ` with ``None`` values for ``eph``, ``satellites_visible`` etc. - Attributes will also return ``None`` if the associated hardware is not present on the connected device. - - -.. tip:: - - If you're using a :ref:`simulated vehicle ` you can add support for optional hardware including - `rangefinders `_ - and `optical flow sensors `_. - - -.. todo:: we need to be able to verify mount_status works/setup. - - - -.. _vehicle_state_set_attributes: - -Setting attributes ------------------- - -The :py:attr:`Vehicle.mode `, :py:attr:`Vehicle.armed ` -, :py:attr:`Vehicle.airspeed ` and :py:attr:`Vehicle.groundspeed `, -attributes can all be "directly" written (:py:attr:`Vehicle.home_location ` can also be directly written, -but has special considerations that are :ref:`discussed below `). - -These attributes are set by assigning a value: - -.. code:: python - - #disarm the vehicle - vehicle.armed = False - - #set the default groundspeed to be used in movement commands - vehicle.groundspeed = 3.2 - - -Commands to change a value are **not guaranteed to succeed** (or even to be received) and code should be written with this in mind. -For example, the code snippet below polls the attribute values to confirm they have changed before proceeding. - -.. code:: python - - vehicle.mode = VehicleMode("GUIDED") - vehicle.armed = True - while not vehicle.mode.name=='GUIDED' and not vehicle.armed and not api.exit: - print " Getting ready to take off ..." - time.sleep(1) - -.. note:: - - While the autopilot does send information about the success (or failure) of the request, - this is `not currently handled by DroneKit `_. - -:py:attr:`Vehicle.gimbal ` can't be written directly, but the gimbal can be controlled using the -:py:func:`Vehicle.gimbal.rotate() ` and :py:func:`Vehicle.gimbal.target_location() ` -methods. The first method lets you set the precise orientation of the gimbal while the second makes the gimbal track a specific "region of interest". - -.. code:: python - - #Point the gimbal straight down - vehicle.gimbal.rotate(-90, 0, 0) - time.sleep(10) - - #Set the camera to track the current home position. - vehicle.gimbal.target_location(vehicle.home_location) - time.sleep(10) - - -.. _vehicle_state_observe_attributes: - -Observing attribute changes ---------------------------- - -You can observe any of the vehicle attributes and monitor for changes without the need for polling. - -Listeners ("observer callback functions") are invoked differently based on the *type of observed attribute*. Attributes that represent sensor values or other -"streams of information" are updated whenever a message is received from the vehicle. Attributes which reflect vehicle -"state" are only updated when their values change (for example -:py:func:`Vehicle.system_status `, -:py:attr:`Vehicle.armed `, and -:py:attr:`Vehicle.mode `). - -Callbacks are added using :py:func:`Vehicle.add_attribute_listener() ` or the -:py:func:`Vehicle.on_attribute() ` decorator method. The main difference between these methods -is that only attribute callbacks added with :py:func:`Vehicle.add_attribute_listener() ` -can be removed (see :py:func:`remove_attribute_listener() `). - -The ``observer`` callback function is invoked with the following arguments: - -* ``self`` - the associated :py:class:`Vehicle`. This may be compared to a global vehicle handle - to implement vehicle-specific callback handling (if needed). -* ``attr_name`` - the attribute name. This can be used to infer which attribute has triggered - if the same callback is used for watching several attributes. -* ``value`` - the attribute value (so you don't need to re-query the vehicle object). - -The code snippet below shows how to add (and remove) a callback function to observe changes -in :py:attr:`Vehicle.location.global_frame ` using -:py:func:`Vehicle.add_attribute_listener() `. -The two second ``sleep()`` is required because otherwise the observer might be removed before the the -callback is first run. - - -.. code-block:: python - :emphasize-lines: 7 - - #Callback to print the location in global frames. 'value' is the updated value - def location_callback(self, attr_name, value): - print "Location (Global): ", value - - - # Add a callback `location_callback` for the `global_frame` attribute. - vehicle.add_attribute_listener('location.global_frame', location_callback) - - # Wait 2s so callback can be notified before the observer is removed - time.sleep(2) - - # Remove observer - specifying the attribute and previously registered callback function - vehicle.remove_message_listener('location.global_frame', location_callback) - -.. note:: - - The example above adds a listener on ``Vehicle`` to for attribute name ``'location.global_frame'`` - You can alternatively add (and remove) a listener ``Vehicle.location`` for the attribute name ``'global_frame'``. - Both alternatives are shown below: - - .. code-block:: python - - vehicle.add_attribute_listener('location.global_frame', location_callback) - vehicle.location.add_attribute_listener('global_frame', location_callback) - - -The example below shows how you can declare an attribute callback using the -:py:func:`Vehicle.on_attribute() ` decorator function. - - -.. code-block:: python - :emphasize-lines: 3,4 - - last_rangefinder_distance=0 - - @vehicle.on_attribute('rangefinder') - def rangefinder_callback(self,attr_name): - #attr_name not used here. - global last_rangefinder_distance - if last_rangefinder_distance == round(self.rangefinder.distance, 1): - return - last_rangefinder_distance = round(self.rangefinder.distance, 1) - print " Rangefinder (metres): %s" % last_rangefinder_distance - -.. note:: - - The fragment above stores the result of the previous callback and only prints the output when there is a - signficant change in :py:attr:`Vehicle.rangefinder `. You might want to - perform caching like this to ignore updates that are not significant to your code. - -The examples above show how you can monitor a single attribute. You can pass the special name ('``*``') to specify a -callback that will be called for any/all attribute changes: - -.. code-block:: python - - # Demonstrate getting callback on any attribute change - def wildcard_callback(self, attr_name, value): - print " CALLBACK: (%s): %s" % (attr_name,value) - - print "\nAdd attribute callback detecting any attribute change" - vehicle.add_attribute_listener('*', wildcard_callback) - - - print " Wait 1s so callback invoked before observer removed" - time.sleep(1) - - print " Remove Vehicle attribute observer" - # Remove observer added with `add_attribute_listener()` - vehicle.remove_attribute_listener('*', wildcard_callback) - - - -.. _vehicle_state_home_location: - -Home location -------------- - -The *Home location* is set when a vehicle first gets a good location fix from the GPS. The location is used -as the target when the vehicle does a "return to launch". In Copter missions (and often Plane) missions, the altitude of -waypoints is set relative to this position. - -:py:attr:`Vehicle.home_location ` has the following behaviour: - -* In order to *get* the current value (in a :py:class:`LocationGlobal ` object) you must first download - :py:attr:`Vehicle.commands `, as shown: - - .. code:: python - - cmds = vehicle.commands - cmds.download() - cmds.wait_ready() - print " Home Location: %s" % vehicle.home_location - - The returned value is ``None`` before you download the commands or if the ``home_location`` has not yet been set by the autopilot. - For this reason our example code checks that the value exists (in a loop) before writing it. - - .. code:: python - - # Get Vehicle Home location - will be `None` until first set by autopilot - while not vehicle.home_location: - cmds = vehicle.commands - cmds.download() - cmds.wait_ready() - if not vehicle.home_location: - print " Waiting for home location ..." - - # We have a home location. - print "\n Home location: %s" % vehicle.home_location - -* The attribute can be *set* to a :py:class:`LocationGlobal ` object - (the code fragment below sets it to the current location): - - .. code:: python - - vehicle.home_location=vehicle.location.global_frame - - There are some caveats: - - * You must be able to read a non-``None`` value before you can write it - (the autopilot has to set the value initially before it can be written or read). - * The new location must be within 50 km of the EKF origin or setting the value will silently fail. - * The value is cached in the ``home_location``. If the variable can potentially change on the vehicle - you will need to re-download the ``Vehicle.commands`` in order to confirm the value. - -* The attribute is not observable. - - -.. note:: - - :py:attr:`Vehicle.home_location ` behaves this way because - ArduPilot implements/stores the home location as a waypoint rather than sending them as messages. - While DroneKit-Python hides this fact from you when working with commands, to access the value - you still need to download the commands. - - We hope to improve this attribute in later versions of ArduPilot, where there may be specific - commands to get the home location from the vehicle. - - -.. _vehicle_state_parameters: - -Parameters -========== - -Vehicle parameters provide the information used to configure the autopilot for the vehicle-specific hardware/capabilities. -The available parameters for each platform are documented in the ArduPilot wiki here: -`Copter Parameters `_, -`Plane Parameters `_, -`Rover Parameters `_ -(the lists are automatically generated from the latest ArduPilot source code, and may contain or omit parameters -in your vehicle). - -DroneKit downloads all parameters when you first connect to the UAV (forcing parameter reads to wait -until the download completes), and subsequently keeps the values updated by monitoring vehicle messages -for changes to individual parameters. This process ensures that it is always safe to read supported parameters, -and that their values will match the information on the vehicle. - -Parameters can be read, set, observed and iterated using the :py:attr:`Vehicle.parameters ` -attribute (a :py:class:`Parameters ` object). - - -Getting parameters ------------------- - -The parameters are read using the parameter name as a key (case-insensitive). Reads will always succeed unless you -attempt to access an unsupported parameter (which will result in a ``KeyError`` exception). - -The code snippet below shows how to get the Minimum Throttle (THR_MIN) setting. On Copter and Rover (not Plane), this is the minimum PWM setting for the -throttle at which the motors will keep spinning. - -.. code:: python - - # Print the value of the THR_MIN parameter. - print "Param: %s" % vehicle.parameters['THR_MIN'] - - - -Setting parameters ------------------- - -Vehicle parameters are set as shown in the code fragment below, using the parameter name as a "key": - -.. code:: python - - # Change the parameter value (Copter, Rover) - vehicle.parameters['THR_MIN']=100 - - -.. _vehicle_state_iterating_parameters: - -Listing all parameters ----------------------- - -:py:attr:`Vehicle.parameters ` can be iterated to list all parameters and their values: - -.. code:: python - - - print "\nPrint all parameters (iterate `vehicle.parameters`):" - for key, value in vehicle.parameters.iteritems(): - print " Key:%s Value:%s" % (key,value) - - - -.. _vehicle_state_observing_parameters: - -Observing parameter changes ---------------------------- - -You can observe any of the vehicle parameters and monitor for changes without the need for polling. -The parameters are cached, so that callback functions are only invoked when parameter values change. - -.. tip:: - - Observing parameters is virtually identical to :ref:`observing attributes `. - - -The code snippet below shows how to add a callback function to observe changes in the "THR_MIN" -parameter using a decorator. Note that the parameter name is case-insensitive, and that callbacks -added using a decorator cannot be removed. - -.. code-block:: python - - @vehicle.parameters.on_attribute('THR_MIN') - def decorated_thr_min_callback(self, attr_name, value): - print " PARAMETER CALLBACK: %s changed to: %s" % (attr_name, value) - -The ``observer`` callback function is invoked with the following arguments: - -* ``self`` - the associated :py:class:`Parameters`. -* ``attr_name`` - the parameter name - (useful if the same callback is used for watching several parameters). -* ``msg`` - the parameter value (so you don't need to re-query the ``Vehicle.parameters`` object). - -The code snippet below demonstrates how you can add and remove a listener (in this case -for "any parameter") using the -:py:func:`Parameters.add_attribute_listener() ` and -:py:func:`Parameters.remove_attribute_listener() `. - -.. code-block:: python - - #Callback function for "any" parameter - def any_parameter_callback(self, attr_name, value): - print " ANY PARAMETER CALLBACK: %s changed to: %s" % (attr_name, value) - - #Add observer for the vehicle's any/all parameters parameter (note wildcard string ``'*'``) - vehicle.parameters.add_attribute_listener('*', any_parameter_callback) - - - - - -.. _api-information-known-issues: - -Known issues -============ - -Known issues and improvement suggestions can viewed on `Github here `_. \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/docs/guide/win-screenshot.png b/simulation/extension_docker/dronekit-python/docs/guide/win-screenshot.png deleted file mode 100644 index f8723e7f..00000000 Binary files a/simulation/extension_docker/dronekit-python/docs/guide/win-screenshot.png and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/docs/index.rst b/simulation/extension_docker/dronekit-python/docs/index.rst deleted file mode 100644 index fe60ddf2..00000000 --- a/simulation/extension_docker/dronekit-python/docs/index.rst +++ /dev/null @@ -1,30 +0,0 @@ -=========================================== -Welcome to DroneKit-Python's documentation! -=========================================== - -DroneKit-Python 2.x helps you create powerful apps for UAVs. These apps run on a UAV's :ref:`Companion Computer `, and augment the autopilot by performing tasks that are both computationally intensive and require a low-latency link (e.g. computer vision). - -This documentation provides everything you need to get started with DroneKit-Python, including an :doc:`overview ` of the API, quick start, guide material, a number of demos and examples, -and :doc:`API Reference `. - -.. tip:: - - *DroneKit-Python version 1.5* has now been superseded (see these links for legacy `documentation `_ - and `examples `_). - - If you're migrating from *DroneKit-Python version 1.x*, check out our comprehensive :ref:`Migration Guide `. - - -Contents: - -.. toctree:: - :maxdepth: 2 - - Introduction - guide/quick_start - Developing - guide/index - examples/index - contributing/index - API Reference - diff --git a/simulation/extension_docker/dronekit-python/dronekit/.gitignore b/simulation/extension_docker/dronekit-python/dronekit/.gitignore deleted file mode 100644 index 2f78cf5b..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.pyc - diff --git a/simulation/extension_docker/dronekit-python/dronekit/__init__.py b/simulation/extension_docker/dronekit-python/dronekit/__init__.py deleted file mode 100644 index bc05a709..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/__init__.py +++ /dev/null @@ -1,3221 +0,0 @@ -# DroneAPI module -""" -This is the API Reference for the DroneKit-Python API. - -The main API is the :py:class:`Vehicle` class. -The code snippet below shows how to use :py:func:`connect` to obtain an instance of a connected vehicle: - -.. code:: python - - from dronekit import connect - - # Connect to the Vehicle using "connection string" (in this case an address on network) - vehicle = connect('127.0.0.1:14550', wait_ready=True) - -:py:class:`Vehicle` provides access to vehicle *state* through python attributes -(e.g. :py:attr:`Vehicle.mode`) -and to settings/parameters though the :py:attr:`Vehicle.parameters` attribute. -Asynchronous notification on vehicle attribute changes is available by registering listeners/observers. - -Vehicle movement is primarily controlled using the :py:attr:`Vehicle.armed` attribute and -:py:func:`Vehicle.simple_takeoff` and :py:attr:`Vehicle.simple_goto` in GUIDED mode. - -Velocity-based movement and control over other vehicle features can be achieved using custom MAVLink messages -(:py:func:`Vehicle.send_mavlink`, :py:func:`Vehicle.message_factory`). - -It is also possible to work with vehicle "missions" using the :py:attr:`Vehicle.commands` attribute, and run them in AUTO mode. - -All the logging is handled through the builtin Python `logging` module. - -A number of other useful classes and methods are listed below. - ----- -""" - -import sys -import collections - -# Python3.10 removed MutableMapping from collections: -if sys.version_info.major == 3 and sys.version_info.minor >= 10: - from collections.abc import MutableMapping -else: - from collections import MutableMapping - -import copy -import logging -import math -import struct -import time - -import monotonic -from past.builtins import basestring - -from pymavlink import mavutil, mavwp -from pymavlink.dialects.v10 import ardupilotmega - -from dronekit.util import ErrprinterHandler - - -class APIException(Exception): - """ - Base class for DroneKit related exceptions. - - :param String message: Message string describing the exception - """ - - -class TimeoutError(APIException): - '''Raised by operations that have timeouts.''' - - -class Attitude(object): - """ - Attitude information. - - An object of this type is returned by :py:attr:`Vehicle.attitude`. - - .. _figure_attitude: - - .. figure:: http://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Yaw_Axis_Corrected.svg/500px-Yaw_Axis_Corrected.svg.png - :width: 400px - :alt: Diagram showing Pitch, Roll, Yaw - :target: http://commons.wikimedia.org/wiki/File:Yaw_Axis_Corrected.svg - - Diagram showing Pitch, Roll, Yaw (`Creative Commons `_) - - :param pitch: Pitch in radians - :param yaw: Yaw in radians - :param roll: Roll in radians - """ - - def __init__(self, pitch, yaw, roll): - self.pitch = pitch - self.yaw = yaw - self.roll = roll - - def __str__(self): - fmt = '{}:pitch={pitch},yaw={yaw},roll={roll}' - return fmt.format(self.__class__.__name__, **vars(self)) - - -class LocationGlobal(object): - """ - A global location object. - - The latitude and longitude are relative to the `WGS84 coordinate system `_. - The altitude is relative to mean sea-level (MSL). - - For example, a global location object with altitude 30 metres above sea level might be defined as: - - .. code:: python - - LocationGlobal(-34.364114, 149.166022, 30) - - .. todo:: FIXME: Location class - possibly add a vector3 representation. - - An object of this type is owned by :py:attr:`Vehicle.location`. See that class for information on - reading and observing location in the global frame. - - :param lat: Latitude. - :param lon: Longitude. - :param alt: Altitude in meters relative to mean sea-level (MSL). - """ - - def __init__(self, lat, lon, alt=None): - self.lat = lat - self.lon = lon - self.alt = alt - - # This is for backward compatibility. - self.local_frame = None - self.global_frame = None - - def __str__(self): - return "LocationGlobal:lat=%s,lon=%s,alt=%s" % (self.lat, self.lon, self.alt) - - -class LocationGlobalRelative(object): - """ - A global location object, with attitude relative to home location altitude. - - The latitude and longitude are relative to the `WGS84 coordinate system `_. - The altitude is relative to the *home position*. - - For example, a ``LocationGlobalRelative`` object with an altitude of 30 metres above the home location might be defined as: - - .. code:: python - - LocationGlobalRelative(-34.364114, 149.166022, 30) - - .. todo:: FIXME: Location class - possibly add a vector3 representation. - - An object of this type is owned by :py:attr:`Vehicle.location`. See that class for information on - reading and observing location in the global-relative frame. - - :param lat: Latitude. - :param lon: Longitude. - :param alt: Altitude in meters (relative to the home location). - """ - - def __init__(self, lat, lon, alt=None): - self.lat = lat - self.lon = lon - self.alt = alt - - # This is for backward compatibility. - self.local_frame = None - self.global_frame = None - - def __str__(self): - return "LocationGlobalRelative:lat=%s,lon=%s,alt=%s" % (self.lat, self.lon, self.alt) - - -class LocationLocal(object): - """ - A local location object. - - The north, east and down are relative to the EKF origin. This is most likely the location where the vehicle was turned on. - - An object of this type is owned by :py:attr:`Vehicle.location`. See that class for information on - reading and observing location in the local frame. - - :param north: Position north of the EKF origin in meters. - :param east: Position east of the EKF origin in meters. - :param down: Position down from the EKF origin in meters. (i.e. negative altitude in meters) - """ - - def __init__(self, north, east, down): - self.north = north - self.east = east - self.down = down - - def __str__(self): - return "LocationLocal:north=%s,east=%s,down=%s" % (self.north, self.east, self.down) - - def distance_home(self): - """ - Distance away from home, in meters. Returns 3D distance if `down` is known, otherwise 2D distance. - """ - - if self.north is not None and self.east is not None: - if self.down is not None: - return math.sqrt(self.north**2 + self.east**2 + self.down**2) - else: - return math.sqrt(self.north**2 + self.east**2) - - -class GPSInfo(object): - """ - Standard information about GPS. - - If there is no GPS lock the parameters are set to ``None``. - - :param Int eph: GPS horizontal dilution of position (HDOP). - :param Int epv: GPS vertical dilution of position (VDOP). - :param Int fix_type: 0-1: no fix, 2: 2D fix, 3: 3D fix - :param Int satellites_visible: Number of satellites visible. - - .. todo:: FIXME: GPSInfo class - possibly normalize eph/epv? report fix type as string? - """ - - def __init__(self, eph, epv, fix_type, satellites_visible): - self.eph = eph - self.epv = epv - self.fix_type = fix_type - self.satellites_visible = satellites_visible - - def __str__(self): - return "GPSInfo:fix=%s,num_sat=%s" % (self.fix_type, self.satellites_visible) - - -class Wind(object): - """ - Wind information - - An object of this type is returned by :py:attr: `Vehicle.wind`. - - :param wind_direction: Wind direction in degrees - :param wind_speed: Wind speed in m/s - :param wind_speed_z: vertical wind speed in m/s - """ - def __init__(self, wind_direction, wind_speed, wind_speed_z): - self.wind_direction = wind_direction - self.wind_speed = wind_speed - self.wind_speed_z = wind_speed_z - - def __str__(self): - return "Wind: wind direction: {}, wind speed: {}, wind speed z: {}".format(self.wind_direction, self.wind_speed, self.wind_speed_z) - - -class Battery(object): - """ - System battery information. - - An object of this type is returned by :py:attr:`Vehicle.battery`. - - :param voltage: Battery voltage in millivolts. - :param current: Battery current, in 10 * milliamperes. ``None`` if the autopilot does not support current measurement. - :param level: Remaining battery energy. ``None`` if the autopilot cannot estimate the remaining battery. - """ - - def __init__(self, voltage, current, level): - self.voltage = voltage / 1000.0 - if current == -1: - self.current = None - else: - self.current = current / 100.0 - if level == -1: - self.level = None - else: - self.level = level - - def __str__(self): - return "Battery:voltage={},current={},level={}".format(self.voltage, self.current, - self.level) - - -class Rangefinder(object): - """ - Rangefinder readings. - - An object of this type is returned by :py:attr:`Vehicle.rangefinder`. - - :param distance: Distance (metres). ``None`` if the vehicle doesn't have a rangefinder. - :param voltage: Voltage (volts). ``None`` if the vehicle doesn't have a rangefinder. - """ - - def __init__(self, distance, voltage): - self.distance = distance - self.voltage = voltage - - def __str__(self): - return "Rangefinder: distance={}, voltage={}".format(self.distance, self.voltage) - - -class Version(object): - """ - Autopilot version and type. - - An object of this type is returned by :py:attr:`Vehicle.version`. - - The version number can be read in a few different formats. To get it in a human-readable - format, just print `vehicle.version`. This might print something like "APM:Copter-3.3.2-rc4". - - .. versionadded:: 2.0.3 - - .. py:attribute:: major - - Major version number (integer). - - .. py:attribute::minor - - Minor version number (integer). - - .. py:attribute:: patch - - Patch version number (integer). - - .. py:attribute:: release - - Release type (integer). See the enum `FIRMWARE_VERSION_TYPE `_. - - This is a composite of the product release cycle stage (rc, beta etc) and the version in that cycle - e.g. 23. - - """ - def __init__(self, raw_version, autopilot_type, vehicle_type): - self.autopilot_type = autopilot_type - self.vehicle_type = vehicle_type - self.raw_version = raw_version - if raw_version is None: - self.major = None - self.minor = None - self.patch = None - self.release = None - else: - self.major = raw_version >> 24 & 0xFF - self.minor = raw_version >> 16 & 0xFF - self.patch = raw_version >> 8 & 0xFF - self.release = raw_version & 0xFF - - def is_stable(self): - """ - Returns True if the autopilot reports that the current firmware is a stable - release (not a pre-release or development version). - """ - return self.release == 255 - - def release_version(self): - """ - Returns the version within the release type (an integer). - This method returns "23" for Copter-3.3rc23. - """ - if self.release is None: - return None - if self.release == 255: - return 0 - return self.release % 64 - - def release_type(self): - """ - Returns text describing the release type e.g. "alpha", "stable" etc. - """ - if self.release is None: - return None - types = ["dev", "alpha", "beta", "rc"] - return types[self.release >> 6] - - def __str__(self): - prefix = "" - - if self.autopilot_type == mavutil.mavlink.MAV_AUTOPILOT_ARDUPILOTMEGA: - prefix += "APM:" - elif self.autopilot_type == mavutil.mavlink.MAV_AUTOPILOT_PX4: - prefix += "PX4" - else: - prefix += "UnknownAutoPilot" - - if self.vehicle_type == mavutil.mavlink.MAV_TYPE_QUADROTOR: - prefix += "Copter-" - elif self.vehicle_type == mavutil.mavlink.MAV_TYPE_FIXED_WING: - prefix += "Plane-" - elif self.vehicle_type == mavutil.mavlink.MAV_TYPE_GROUND_ROVER: - prefix += "Rover-" - else: - prefix += "UnknownVehicleType%d-" % self.vehicle_type - - if self.release_type() is None: - release_type = "UnknownReleaseType" - elif self.is_stable(): - release_type = "" - else: - # e.g. "-rc23" - release_type = "-" + str(self.release_type()) + str(self.release_version()) - - return prefix + "%s.%s.%s" % (self.major, self.minor, self.patch) + release_type - - -class Capabilities: - """ - Autopilot capabilities (supported message types and functionality). - - An object of this type is returned by :py:attr:`Vehicle.capabilities`. - - See the enum - `MAV_PROTOCOL_CAPABILITY `_. - - .. versionadded:: 2.0.3 - - - .. py:attribute:: mission_float - - Autopilot supports MISSION float message type (Boolean). - - .. py:attribute:: param_float - - Autopilot supports the PARAM float message type (Boolean). - - .. py:attribute:: mission_int - - Autopilot supports MISSION_INT scaled integer message type (Boolean). - - .. py:attribute:: command_int - - Autopilot supports COMMAND_INT scaled integer message type (Boolean). - - .. py:attribute:: param_union - - Autopilot supports the PARAM_UNION message type (Boolean). - - .. py:attribute:: ftp - - Autopilot supports ftp for file transfers (Boolean). - - .. py:attribute:: set_attitude_target - - Autopilot supports commanding attitude offboard (Boolean). - - .. py:attribute:: set_attitude_target_local_ned - - Autopilot supports commanding position and velocity targets in local NED frame (Boolean). - - .. py:attribute:: set_altitude_target_global_int - - Autopilot supports commanding position and velocity targets in global scaled integers (Boolean). - - .. py:attribute:: terrain - - Autopilot supports terrain protocol / data handling (Boolean). - - .. py:attribute:: set_actuator_target - - Autopilot supports direct actuator control (Boolean). - - .. py:attribute:: flight_termination - - Autopilot supports the flight termination command (Boolean). - - .. py:attribute:: compass_calibration - - Autopilot supports onboard compass calibration (Boolean). - """ - def __init__(self, capabilities): - self.mission_float = (((capabilities >> 0) & 1) == 1) - self.param_float = (((capabilities >> 1) & 1) == 1) - self.mission_int = (((capabilities >> 2) & 1) == 1) - self.command_int = (((capabilities >> 3) & 1) == 1) - self.param_union = (((capabilities >> 4) & 1) == 1) - self.ftp = (((capabilities >> 5) & 1) == 1) - self.set_attitude_target = (((capabilities >> 6) & 1) == 1) - self.set_attitude_target_local_ned = (((capabilities >> 7) & 1) == 1) - self.set_altitude_target_global_int = (((capabilities >> 8) & 1) == 1) - self.terrain = (((capabilities >> 9) & 1) == 1) - self.set_actuator_target = (((capabilities >> 10) & 1) == 1) - self.flight_termination = (((capabilities >> 11) & 1) == 1) - self.compass_calibration = (((capabilities >> 12) & 1) == 1) - - -class VehicleMode(object): - """ - This object is used to get and set the current "flight mode". - - The flight mode determines the behaviour of the vehicle and what commands it can obey. - The recommended flight modes for *DroneKit-Python* apps depend on the vehicle type: - - * Copter apps should use ``AUTO`` mode for "normal" waypoint missions and ``GUIDED`` mode otherwise. - * Plane and Rover apps should use the ``AUTO`` mode in all cases, re-writing the mission commands if "dynamic" - behaviour is required (they support only a limited subset of commands in ``GUIDED`` mode). - * Some modes like ``RETURN_TO_LAUNCH`` can be used on all platforms. Care should be taken - when using manual modes as these may require remote control input from the user. - - The available set of supported flight modes is vehicle-specific (see - `Copter Modes `_, - `Plane Modes `_, - `Rover Modes `_). If an unsupported mode is set the script - will raise a ``KeyError`` exception. - - The :py:attr:`Vehicle.mode` attribute can be queried for the current mode. - The code snippet below shows how to observe changes to the mode and then read the value: - - .. code:: python - - #Callback definition for mode observer - def mode_callback(self, attr_name): - print "Vehicle Mode", self.mode - - #Add observer callback for attribute `mode` - vehicle.add_attribute_listener('mode', mode_callback) - - The code snippet below shows how to change the vehicle mode to AUTO: - - .. code:: python - - # Set the vehicle into auto mode - vehicle.mode = VehicleMode("AUTO") - - For more information on getting/setting/observing the :py:attr:`Vehicle.mode` - (and other attributes) see the :ref:`attributes guide `. - - .. py:attribute:: name - - The mode name, as a ``string``. - """ - - def __init__(self, name): - self.name = name - - def __str__(self): - return "VehicleMode:%s" % self.name - - def __eq__(self, other): - return self.name == other - - def __ne__(self, other): - return self.name != other - - -class SystemStatus(object): - """ - This object is used to get and set the current "system status". - - An object of this type is returned by :py:attr:`Vehicle.system_status`. - - .. py:attribute:: state - - The system state, as a ``string``. - """ - - def __init__(self, state): - self.state = state - - def __str__(self): - return "SystemStatus:%s" % self.state - - def __eq__(self, other): - return self.state == other - - def __ne__(self, other): - return self.state != other - - -class HasObservers(object): - def __init__(self): - logging.basicConfig() - self._logger = logging.getLogger(__name__) - - # A mapping from attr_name to a list of observers - self._attribute_listeners = {} - self._attribute_cache = {} - - def add_attribute_listener(self, attr_name, observer): - """ - Add an attribute listener callback. - - The callback function (``observer``) is invoked differently depending on the *type of attribute*. - Attributes that represent sensor values or which are used to monitor connection status are updated - whenever a message is received from the vehicle. Attributes which reflect vehicle "state" are - only updated when their values change (for example :py:attr:`Vehicle.system_status`, - :py:attr:`Vehicle.armed`, and :py:attr:`Vehicle.mode`). - - The callback can be removed using :py:func:`remove_attribute_listener`. - - .. note:: - - The :py:func:`on_attribute` decorator performs the same operation as this method, but with - a more elegant syntax. Use ``add_attribute_listener`` by preference if you will need to remove - the observer. - - The argument list for the callback is ``observer(object, attr_name, attribute_value)``: - - * ``self`` - the associated :py:class:`Vehicle`. This may be compared to a global vehicle handle - to implement vehicle-specific callback handling (if needed). - * ``attr_name`` - the attribute name. This can be used to infer which attribute has triggered - if the same callback is used for watching several attributes. - * ``value`` - the attribute value (so you don't need to re-query the vehicle object). - - The example below shows how to get callbacks for (global) location changes: - - .. code:: python - - #Callback to print the location in global frame - def location_callback(self, attr_name, msg): - print "Location (Global): ", msg - - #Add observer for the vehicle's current location - vehicle.add_attribute_listener('global_frame', location_callback) - - See :ref:`vehicle_state_observe_attributes` for more information. - - :param String attr_name: The name of the attribute to watch (or '*' to watch all attributes). - :param observer: The callback to invoke when a change in the attribute is detected. - - """ - listeners_for_attr = self._attribute_listeners.get(attr_name) - if listeners_for_attr is None: - listeners_for_attr = [] - self._attribute_listeners[attr_name] = listeners_for_attr - if observer not in listeners_for_attr: - listeners_for_attr.append(observer) - - def remove_attribute_listener(self, attr_name, observer): - """ - Remove an attribute listener (observer) that was previously added using :py:func:`add_attribute_listener`. - - For example, the following line would remove a previously added vehicle 'global_frame' - observer called ``location_callback``: - - .. code:: python - - vehicle.remove_attribute_listener('global_frame', location_callback) - - See :ref:`vehicle_state_observe_attributes` for more information. - - :param String attr_name: The attribute name that is to have an observer removed (or '*' to remove an 'all attribute' observer). - :param observer: The callback function to remove. - - """ - listeners_for_attr = self._attribute_listeners.get(attr_name) - if listeners_for_attr is not None: - listeners_for_attr.remove(observer) - if len(listeners_for_attr) == 0: - del self._attribute_listeners[attr_name] - - def notify_attribute_listeners(self, attr_name, value, cache=False): - """ - This method is used to update attribute observers when the named attribute is updated. - - You should call it in your message listeners after updating an attribute with - information from a vehicle message. - - By default the value of ``cache`` is ``False`` and every update from the vehicle is sent to listeners - (whether or not the attribute has changed). This is appropriate for attributes which represent sensor - or heartbeat-type monitoring. - - Set ``cache=True`` to update listeners only when the value actually changes (cache the previous - attribute value). This should be used where clients will only ever need to know the value when it has - changed. For example, this setting has been used for notifying :py:attr:`mode` changes. - - See :ref:`example_create_attribute` for more information. - - :param String attr_name: The name of the attribute that has been updated. - :param value: The current value of the attribute that has been updated. - :param Boolean cache: Set ``True`` to only notify observers when the attribute value changes. - """ - # Cached values are not re-sent if they are unchanged. - if cache: - if self._attribute_cache.get(attr_name) == value: - return - self._attribute_cache[attr_name] = value - - # Notify observers. - for fn in self._attribute_listeners.get(attr_name, []): - try: - fn(self, attr_name, value) - except Exception: - self._logger.exception('Exception in attribute handler for %s' % attr_name, exc_info=True) - - for fn in self._attribute_listeners.get('*', []): - try: - fn(self, attr_name, value) - except Exception: - self._logger.exception('Exception in attribute handler for %s' % attr_name, exc_info=True) - - def on_attribute(self, name): - """ - Decorator for attribute listeners. - - The decorated function (``observer``) is invoked differently depending on the *type of attribute*. - Attributes that represent sensor values or which are used to monitor connection status are updated - whenever a message is received from the vehicle. Attributes which reflect vehicle "state" are - only updated when their values change (for example :py:func:`Vehicle.system_status`, - :py:attr:`Vehicle.armed`, and :py:attr:`Vehicle.mode`). - - The argument list for the callback is ``observer(object, attr_name, attribute_value)`` - - * ``self`` - the associated :py:class:`Vehicle`. This may be compared to a global vehicle handle - to implement vehicle-specific callback handling (if needed). - * ``attr_name`` - the attribute name. This can be used to infer which attribute has triggered - if the same callback is used for watching several attributes. - * ``msg`` - the attribute value (so you don't need to re-query the vehicle object). - - .. note:: - - There is no way to remove an attribute listener added with this decorator. Use - :py:func:`add_attribute_listener` if you need to be able to remove - the :py:func:`attribute listener `. - - The code fragment below shows how you can create a listener for the attitude attribute. - - .. code:: python - - @vehicle.on_attribute('attitude') - def attitude_listener(self, name, msg): - print '%s attribute is: %s' % (name, msg) - - See :ref:`vehicle_state_observe_attributes` for more information. - - :param String name: The name of the attribute to watch (or '*' to watch all attributes). - :param observer: The callback to invoke when a change in the attribute is detected. - """ - - def decorator(fn): - if isinstance(name, list): - for n in name: - self.add_attribute_listener(n, fn) - else: - self.add_attribute_listener(name, fn) - - return decorator - - -class ChannelsOverride(dict): - """ - A dictionary class for managing Vehicle channel overrides. - - Channels can be read, written, or cleared by index or using a dictionary syntax. - To clear a value, set it to ``None`` or use ``del`` on the item. - - An object of this type is returned by :py:attr:`Vehicle.channels.overrides `. - - For more information and examples see :ref:`example_channel_overrides`. - """ - - def __init__(self, vehicle): - self._vehicle = vehicle - self._count = 8 # Fixed by MAVLink - self._active = True - - def __getitem__(self, key): - return dict.__getitem__(self, str(key)) - - def __setitem__(self, key, value): - if not (0 < int(key) <= self._count): - raise KeyError('Invalid channel index %s' % key) - if not value: - try: - dict.__delitem__(self, str(key)) - except: - pass - else: - dict.__setitem__(self, str(key), value) - self._send() - - def __delitem__(self, key): - dict.__delitem__(self, str(key)) - self._send() - - def __len__(self): - return self._count - - def _send(self): - if self._active: - overrides = [0] * 8 - for k, v in self.items(): - overrides[int(k) - 1] = v - self._vehicle._master.mav.rc_channels_override_send(0, 0, *overrides) - - -class Channels(dict): - """ - A dictionary class for managing RC channel information associated with a :py:class:`Vehicle`. - - An object of this type is accessed through :py:attr:`Vehicle.channels`. This object also stores - the current vehicle channel overrides through its :py:attr:`overrides` attribute. - - For more information and examples see :ref:`example_channel_overrides`. - """ - - def __init__(self, vehicle, count): - self._vehicle = vehicle - self._count = count - self._overrides = ChannelsOverride(vehicle) - - # populate readback - self._readonly = False - for k in range(0, count): - self[k + 1] = None - self._readonly = True - - @property - def count(self): - """ - The number of channels defined in the dictionary (currently 8). - """ - return self._count - - def __getitem__(self, key): - return dict.__getitem__(self, str(key)) - - def __setitem__(self, key, value): - if self._readonly: - raise TypeError('__setitem__ is not supported on Channels object') - return dict.__setitem__(self, str(key), value) - - def __len__(self): - return self._count - - def _update_channel(self, channel, value): - # If we have channels on different ports, we expand the Channels - # object to support them. - channel = int(channel) - self._readonly = False - self[channel] = value - self._readonly = True - self._count = max(self._count, channel) - - @property - def overrides(self): - """ - Attribute to read, set and clear channel overrides (also known as "rc overrides") - associated with a :py:class:`Vehicle` (via :py:class:`Vehicle.channels`). This is an - object of type :py:class:`ChannelsOverride`. - - For more information and examples see :ref:`example_channel_overrides`. - - To set channel overrides: - - .. code:: python - - # Set and clear overrids using dictionary syntax (clear by setting override to none) - vehicle.channels.overrides = {'5':None, '6':None,'3':500} - - # You can also set and clear overrides using indexing syntax - vehicle.channels.overrides['2'] = 200 - vehicle.channels.overrides['2'] = None - - # Clear using 'del' - del vehicle.channels.overrides['3'] - - # Clear all overrides by setting an empty dictionary - vehicle.channels.overrides = {} - - Read the channel overrides either as a dictionary or by index. Note that you'll get - a ``KeyError`` exception if you read a channel override that has not been set. - - .. code:: python - - # Get all channel overrides - print " Channel overrides: %s" % vehicle.channels.overrides - # Print just one channel override - print " Ch2 override: %s" % vehicle.channels.overrides['2'] - """ - return self._overrides - - @overrides.setter - def overrides(self, newch): - self._overrides._active = False - self._overrides.clear() - for k, v in newch.items(): - if v: - self._overrides[str(k)] = v - else: - try: - del self._overrides[str(k)] - except: - pass - self._overrides._active = True - self._overrides._send() - - -class Locations(HasObservers): - """ - An object for holding location information in global, global relative and local frames. - - :py:class:`Vehicle` owns an object of this type. See :py:attr:`Vehicle.location` for information on - reading and observing location in the different frames. - - The different frames are accessed through the members, which are created with this object. - They can be read, and are observable. - """ - - def __init__(self, vehicle): - super(Locations, self).__init__() - - self._lat = None - self._lon = None - self._alt = None - self._relative_alt = None - - @vehicle.on_message('GLOBAL_POSITION_INT') - def listener(vehicle, name, m): - (self._lat, self._lon) = (m.lat / 1.0e7, m.lon / 1.0e7) - self._relative_alt = m.relative_alt / 1000.0 - self.notify_attribute_listeners('global_relative_frame', self.global_relative_frame) - vehicle.notify_attribute_listeners('location.global_relative_frame', - vehicle.location.global_relative_frame) - - if self._alt is not None or m.alt != 0: - # Require first alt value to be non-0 - # TODO is this the proper check to do? - self._alt = m.alt / 1000.0 - self.notify_attribute_listeners('global_frame', self.global_frame) - vehicle.notify_attribute_listeners('location.global_frame', - vehicle.location.global_frame) - - vehicle.notify_attribute_listeners('location', vehicle.location) - - self._north = None - self._east = None - self._down = None - - @vehicle.on_message('LOCAL_POSITION_NED') - def listener(vehicle, name, m): - self._north = m.x - self._east = m.y - self._down = m.z - self.notify_attribute_listeners('local_frame', self.local_frame) - vehicle.notify_attribute_listeners('location.local_frame', vehicle.location.local_frame) - vehicle.notify_attribute_listeners('location', vehicle.location) - - @property - def local_frame(self): - """ - Location in local NED frame (a :py:class:`LocationGlobalRelative`). - - This is accessed through the :py:attr:`Vehicle.location` attribute: - - .. code-block:: python - - print "Local Location: %s" % vehicle.location.local_frame - - This location will not start to update until the vehicle is armed. - """ - return LocationLocal(self._north, self._east, self._down) - - @property - def global_frame(self): - """ - Location in global frame (a :py:class:`LocationGlobal`). - - The latitude and longitude are relative to the - `WGS84 coordinate system `_. - The altitude is relative to mean sea-level (MSL). - - This is accessed through the :py:attr:`Vehicle.location` attribute: - - .. code-block:: python - - print "Global Location: %s" % vehicle.location.global_frame - print "Sea level altitude is: %s" % vehicle.location.global_frame.alt - - Its ``lat`` and ``lon`` attributes are populated shortly after GPS becomes available. - The ``alt`` can take several seconds longer to populate (from the barometer). - Listeners are not notified of changes to this attribute until it has fully populated. - - To watch for changes you can use :py:func:`Vehicle.on_attribute` decorator or - :py:func:`add_attribute_listener` (decorator approach shown below): - - .. code-block:: python - - @vehicle.on_attribute('location.global_frame') - def listener(self, attr_name, value): - print " Global: %s" % value - - #Alternatively, use decorator: ``@vehicle.location.on_attribute('global_frame')``. - """ - return LocationGlobal(self._lat, self._lon, self._alt) - - @property - def global_relative_frame(self): - """ - Location in global frame, with altitude relative to the home location - (a :py:class:`LocationGlobalRelative`). - - The latitude and longitude are relative to the - `WGS84 coordinate system `_. - The altitude is relative to :py:attr:`home location `. - - This is accessed through the :py:attr:`Vehicle.location` attribute: - - .. code-block:: python - - print "Global Location (relative altitude): %s" % vehicle.location.global_relative_frame - print "Altitude relative to home_location: %s" % vehicle.location.global_relative_frame.alt - """ - return LocationGlobalRelative(self._lat, self._lon, self._relative_alt) - - -class Vehicle(HasObservers): - """ - The main vehicle API. - - Vehicle state is exposed through 'attributes' (e.g. :py:attr:`heading`). All attributes can be - read, and some are also settable - (:py:attr:`mode`, :py:attr:`armed` and :py:attr:`home_location`). - - Attributes can also be asynchronously monitored for changes by registering listener callback - functions. - - Vehicle "settings" (parameters) are read/set using the :py:attr:`parameters` attribute. - Parameters can be iterated and are also individually observable. - - Vehicle movement is primarily controlled using the :py:attr:`armed` attribute and - :py:func:`simple_takeoff` and :py:func:`simple_goto` in GUIDED mode. - - It is also possible to work with vehicle "missions" using the :py:attr:`commands` attribute, - and run them in AUTO mode. - - STATUSTEXT log messages from the autopilot are handled through a separate logger. - It is possible to configure the log level, the formatting, etc. by accessing the logger, e.g.: - - .. code-block:: python - - import logging - autopilot_logger = logging.getLogger('autopilot') - autopilot_logger.setLevel(logging.DEBUG) - - The guide contains more detailed information on the different ways you can use - the ``Vehicle`` class: - - - :doc:`guide/vehicle_state_and_parameters` - - :doc:`guide/copter/guided_mode` - - :doc:`guide/auto_mode` - - - .. note:: - - This class currently exposes just the attributes that are most commonly used by all - vehicle types. if you need to add additional attributes then subclass ``Vehicle`` - as demonstrated in :doc:`examples/create_attribute`. - - Please then :doc:`contribute ` your additions back - to the project! - """ - - def __init__(self, handler): - super(Vehicle, self).__init__() - - self._logger = logging.getLogger(__name__) # Logger for DroneKit - self._autopilot_logger = logging.getLogger('autopilot') # Logger for the autopilot messages - # MAVLink-to-logging-module log severity mappings - self._mavlink_statustext_severity = { - 0: logging.CRITICAL, - 1: logging.CRITICAL, - 2: logging.CRITICAL, - 3: logging.ERROR, - 4: logging.WARNING, - 5: logging.INFO, - 6: logging.INFO, - 7: logging.DEBUG - } - - self._handler = handler - self._master = handler.master - - # Cache all updated attributes for wait_ready. - # By default, we presume all "commands" are loaded. - self._ready_attrs = {'commands'} - - # Default parameters when calling wait_ready() or wait_ready(True). - self._default_ready_attrs = ['parameters', 'gps_0', 'armed', 'mode', 'attitude'] - - @self.on_attribute('*') - def listener(_, name, value): - self._ready_attrs.add(name) - - # Attaches message listeners. - self._message_listeners = dict() - - @handler.forward_message - def listener(_, msg): - self.notify_message_listeners(msg.get_type(), msg) - - self._location = Locations(self) - self._vx = None - self._vy = None - self._vz = None - - - self._wind_direction = None - self._wind_speed = None - self._wind_speed_z = None - - @self.on_message('WIND') - def listener(self,name, m): - """ WIND {direction : -180.0, speed : 0.0, speed_z : 0.0} """ - self._wind_direction = m.direction - self._wind_speed = m.speed - self._wind_speed_z = m.speed_z - - - @self.on_message('STATUSTEXT') - def statustext_listener(self, name, m): - # Log the STATUSTEXT on the autopilot logger, with the correct severity - self._autopilot_logger.log( - msg=m.text.strip(), - level=self._mavlink_statustext_severity[m.severity] - ) - - @self.on_message('GLOBAL_POSITION_INT') - def listener(self, name, m): - (self._vx, self._vy, self._vz) = (m.vx / 100.0, m.vy / 100.0, m.vz / 100.0) - self.notify_attribute_listeners('velocity', self.velocity) - - self._pitch = None - self._yaw = None - self._roll = None - self._pitchspeed = None - self._yawspeed = None - self._rollspeed = None - - @self.on_message('ATTITUDE') - def listener(self, name, m): - self._pitch = m.pitch - self._yaw = m.yaw - self._roll = m.roll - self._pitchspeed = m.pitchspeed - self._yawspeed = m.yawspeed - self._rollspeed = m.rollspeed - self.notify_attribute_listeners('attitude', self.attitude) - - self._heading = None - self._airspeed = None - self._groundspeed = None - - @self.on_message('VFR_HUD') - def listener(self, name, m): - self._heading = m.heading - self.notify_attribute_listeners('heading', self.heading) - self._airspeed = m.airspeed - self.notify_attribute_listeners('airspeed', self.airspeed) - self._groundspeed = m.groundspeed - self.notify_attribute_listeners('groundspeed', self.groundspeed) - - self._rngfnd_distance = None - self._rngfnd_voltage = None - - @self.on_message('RANGEFINDER') - def listener(self, name, m): - self._rngfnd_distance = m.distance - self._rngfnd_voltage = m.voltage - self.notify_attribute_listeners('rangefinder', self.rangefinder) - - self._mount_pitch = None - self._mount_yaw = None - self._mount_roll = None - - @self.on_message('MOUNT_STATUS') - def listener(self, name, m): - self._mount_pitch = m.pointing_a / 100.0 - self._mount_roll = m.pointing_b / 100.0 - self._mount_yaw = m.pointing_c / 100.0 - self.notify_attribute_listeners('mount', self.mount_status) - - self._capabilities = None - self._raw_version = None - self._autopilot_version_msg_count = 0 - - @self.on_message('AUTOPILOT_VERSION') - def listener(vehicle, name, m): - self._capabilities = m.capabilities - self._raw_version = m.flight_sw_version - self._autopilot_version_msg_count += 1 - if self._capabilities != 0 or self._autopilot_version_msg_count > 5: - # ArduPilot <3.4 fails to send capabilities correctly - # straight after boot, and even older versions send - # this back as always-0. - vehicle.remove_message_listener('HEARTBEAT', self.send_capabilities_request) - self.notify_attribute_listeners('autopilot_version', self._raw_version) - - # gimbal - self._gimbal = Gimbal(self) - - # All keys are strings. - self._channels = Channels(self, 8) - - @self.on_message(['RC_CHANNELS_RAW', 'RC_CHANNELS']) - def listener(self, name, m): - def set_rc(chnum, v): - '''Private utility for handling rc channel messages''' - # use port to allow ch nums greater than 8 - port = 0 if name == "RC_CHANNELS" else m.port - self._channels._update_channel(str(port * 8 + chnum), v) - - for i in range(1, (18 if name == "RC_CHANNELS" else 8)+1): - set_rc(i, getattr(m, "chan{}_raw".format(i))) - - self.notify_attribute_listeners('channels', self.channels) - - self._voltage = None - self._current = None - self._level = None - - @self.on_message('SYS_STATUS') - def listener(self, name, m): - self._voltage = m.voltage_battery - self._current = m.current_battery - self._level = m.battery_remaining - self.notify_attribute_listeners('battery', self.battery) - - self._eph = None - self._epv = None - self._satellites_visible = None - self._fix_type = None # FIXME support multiple GPSs per vehicle - possibly by using componentId - - @self.on_message('GPS_RAW_INT') - def listener(self, name, m): - self._eph = m.eph - self._epv = m.epv - self._satellites_visible = m.satellites_visible - self._fix_type = m.fix_type - self.notify_attribute_listeners('gps_0', self.gps_0) - - self._current_waypoint = 0 - - @self.on_message(['WAYPOINT_CURRENT', 'MISSION_CURRENT']) - def listener(self, name, m): - self._current_waypoint = m.seq - - self._ekf_poshorizabs = False - self._ekf_constposmode = False - self._ekf_predposhorizabs = False - - @self.on_message('EKF_STATUS_REPORT') - def listener(self, name, m): - # boolean: EKF's horizontal position (absolute) estimate is good - self._ekf_poshorizabs = (m.flags & ardupilotmega.EKF_POS_HORIZ_ABS) > 0 - # boolean: EKF is in constant position mode and does not know it's absolute or relative position - self._ekf_constposmode = (m.flags & ardupilotmega.EKF_CONST_POS_MODE) > 0 - # boolean: EKF's predicted horizontal position (absolute) estimate is good - self._ekf_predposhorizabs = (m.flags & ardupilotmega.EKF_PRED_POS_HORIZ_ABS) > 0 - - self.notify_attribute_listeners('ekf_ok', self.ekf_ok, cache=True) - - self._flightmode = 'AUTO' - self._armed = False - self._system_status = None - self._autopilot_type = None # PX4, ArduPilot, etc. - self._vehicle_type = None # quadcopter, plane, etc. - - @self.on_message('HEARTBEAT') - def listener(self, name, m): - # ignore groundstations - if m.type == mavutil.mavlink.MAV_TYPE_GCS or (not self._handler.master.probably_vehicle_heartbeat(m)): - return - self._armed = (m.base_mode & mavutil.mavlink.MAV_MODE_FLAG_SAFETY_ARMED) != 0 - self.notify_attribute_listeners('armed', self.armed, cache=True) - self._autopilot_type = m.autopilot - self._vehicle_type = m.type - if self._is_mode_available(m.custom_mode, m.base_mode) is False: - raise APIException("mode (%s, %s) not available on mavlink definition" % (m.custom_mode, m.base_mode)) - if self._autopilot_type == mavutil.mavlink.MAV_AUTOPILOT_PX4: - self._flightmode = mavutil.interpret_px4_mode(m.base_mode, m.custom_mode) - else: - self._flightmode = self._mode_mapping_bynumber[m.custom_mode] - self.notify_attribute_listeners('mode', self.mode, cache=True) - self._system_status = m.system_status - self.notify_attribute_listeners('system_status', self.system_status, cache=True) - - # Waypoints. - - self._home_location = None - self._wploader = mavwp.MAVWPLoader() - self._wp_loaded = True - self._wp_uploaded = None - self._wpts_dirty = False - self._commands = CommandSequence(self) - - @self.on_message(['WAYPOINT_COUNT', 'MISSION_COUNT']) - def listener(self, name, msg): - if not self._wp_loaded: - self._wploader.clear() - self._wploader.expected_count = msg.count - self._master.waypoint_request_send(0) - - @self.on_message(['HOME_POSITION']) - def listener(self, name, msg): - self._home_location = LocationGlobal(msg.latitude / 1.0e7, msg.longitude / 1.0e7, msg.altitude / 1000.0) - self.notify_attribute_listeners('home_location', self.home_location, cache=True) - - @self.on_message(['WAYPOINT', 'MISSION_ITEM']) - def listener(self, name, msg): - if not self._wp_loaded: - if msg.seq == 0: - if not (msg.x == 0 and msg.y == 0 and msg.z == 0): - self._home_location = LocationGlobal(msg.x, msg.y, msg.z) - - if msg.seq > self._wploader.count(): - # Unexpected waypoint - pass - elif msg.seq < self._wploader.count(): - # Waypoint duplicate - pass - else: - self._wploader.add(msg) - - if msg.seq + 1 < self._wploader.expected_count: - self._master.waypoint_request_send(msg.seq + 1) - else: - self._wp_loaded = True - self.notify_attribute_listeners('commands', self.commands) - - # Waypoint send to master - @self.on_message(['WAYPOINT_REQUEST', 'MISSION_REQUEST']) - def listener(self, name, msg): - if self._wp_uploaded is not None: - wp = self._wploader.wp(msg.seq) - handler.fix_targets(wp) - self._master.mav.send(wp) - self._wp_uploaded[msg.seq] = True - - # TODO: Waypoint loop listeners - - # Parameters. - - start_duration = 0.2 - repeat_duration = 1 - - self._params_count = -1 - self._params_set = [] - self._params_loaded = False - self._params_start = False - self._params_map = {} - self._params_last = monotonic.monotonic() # Last new param. - self._params_duration = start_duration - self._parameters = Parameters(self) - - @handler.forward_loop - def listener(_): - # Check the time duration for last "new" params exceeds watchdog. - if not self._params_start: - return - - if not self._params_loaded and all(x is not None for x in self._params_set): - self._params_loaded = True - self.notify_attribute_listeners('parameters', self.parameters) - - if not self._params_loaded and monotonic.monotonic() - self._params_last > self._params_duration: - c = 0 - for i, v in enumerate(self._params_set): - if v is None: - self._master.mav.param_request_read_send(0, 0, b'', i) - c += 1 - if c > 50: - break - self._params_duration = repeat_duration - self._params_last = monotonic.monotonic() - - @self.on_message(['PARAM_VALUE']) - def listener(self, name, msg): - # If we discover a new param count, assume we - # are receiving a new param set. - if self._params_count != msg.param_count: - self._params_loaded = False - self._params_start = True - self._params_count = msg.param_count - self._params_set = [None] * msg.param_count - - # Attempt to set the params. We throw an error - # if the index is out of range of the count or - # we lack a param_id. - try: - if msg.param_index < msg.param_count and msg: - if self._params_set[msg.param_index] is None: - self._params_last = monotonic.monotonic() - self._params_duration = start_duration - self._params_set[msg.param_index] = msg - - self._params_map[msg.param_id] = msg.param_value - self._parameters.notify_attribute_listeners(msg.param_id, msg.param_value, - cache=True) - except: - import traceback - traceback.print_exc() - - # Heartbeats. - - self._heartbeat_started = False - self._heartbeat_lastsent = 0 - self._heartbeat_lastreceived = 0 - self._heartbeat_timeout = False - - self._heartbeat_warning = 5 - self._heartbeat_error = 30 - self._heartbeat_system = None - - @handler.forward_loop - def listener(_): - # Send 1 heartbeat per second - if monotonic.monotonic() - self._heartbeat_lastsent > 1: - self._master.mav.heartbeat_send(mavutil.mavlink.MAV_TYPE_GCS, - mavutil.mavlink.MAV_AUTOPILOT_INVALID, 0, 0, 0) - self._heartbeat_lastsent = monotonic.monotonic() - - # Timeouts. - if self._heartbeat_started: - if self._heartbeat_error and monotonic.monotonic() - self._heartbeat_lastreceived > self._heartbeat_error > 0: - raise APIException('No heartbeat in %s seconds, aborting.' % - self._heartbeat_error) - elif monotonic.monotonic() - self._heartbeat_lastreceived > self._heartbeat_warning: - if self._heartbeat_timeout is False: - self._logger.warning('Link timeout, no heartbeat in last %s seconds' % self._heartbeat_warning) - self._heartbeat_timeout = True - - @self.on_message(['HEARTBEAT']) - def listener(self, name, msg): - # ignore groundstations - if msg.type == mavutil.mavlink.MAV_TYPE_GCS or (not self._handler.master.probably_vehicle_heartbeat(msg)): - return - self._heartbeat_system = msg.get_srcSystem() - self._heartbeat_lastreceived = monotonic.monotonic() - if self._heartbeat_timeout: - self._logger.info('...link restored.') - self._heartbeat_timeout = False - - self._last_heartbeat = None - - @handler.forward_loop - def listener(_): - if self._heartbeat_lastreceived: - self._last_heartbeat = monotonic.monotonic() - self._heartbeat_lastreceived - self.notify_attribute_listeners('last_heartbeat', self.last_heartbeat) - - @property - def last_heartbeat(self): - """ - Time since last MAVLink heartbeat was received (in seconds). - - The attribute can be used to monitor link activity and implement script-specific timeout handling. - - For example, to pause the script if no heartbeat is received for more than 1 second you might implement - the following observer, and use ``pause_script`` in a program loop to wait until the link is recovered: - - .. code-block:: python - - pause_script=False - - @vehicle.on_attribute('last_heartbeat') - def listener(self, attr_name, value): - global pause_script - if value > 1 and not pause_script: - print "Pausing script due to bad link" - pause_script=True; - if value < 1 and pause_script: - pause_script=False; - print "Un-pausing script" - - The observer will be called at the period of the messaging loop (about every 0.01 seconds). Testing - on SITL indicates that ``last_heartbeat`` averages about .5 seconds, but will rarely exceed 1.5 seconds - when connected. Whether heartbeat monitoring can be useful will very much depend on the application. - - - .. note:: - - If you just want to change the heartbeat timeout you can modify the ``heartbeat_timeout`` - parameter passed to the :py:func:`connect() ` function. - - """ - return self._last_heartbeat - - def on_message(self, name): - """ - Decorator for message listener callback functions. - - .. tip:: - - This is the most elegant way to define message listener callback functions. - Use :py:func:`add_message_listener` only if you need to be able to - :py:func:`remove the listener ` later. - - A decorated message listener function is called with three arguments every time the - specified message is received: - - * ``self`` - the current vehicle. - * ``name`` - the name of the message that was intercepted. - * ``message`` - the actual message (a `pymavlink `_ - `class `_). - - For example, in the fragment below ``my_method`` will be called for every heartbeat message: - - .. code:: python - - @vehicle.on_message('HEARTBEAT') - def my_method(self, name, msg): - pass - - See :ref:`mavlink_messages` for more information. - - :param String name: The name of the message to be intercepted by the decorated listener function (or '*' to get all messages). - """ - - def decorator(fn): - if isinstance(name, list): - for n in name: - self.add_message_listener(n, fn) - else: - self.add_message_listener(name, fn) - - return decorator - - def add_message_listener(self, name, fn): - """ - Adds a message listener function that will be called every time the specified message is received. - - .. tip:: - - We recommend you use :py:func:`on_message` instead of this method as it has a more elegant syntax. - This method is only preferred if you need to be able to - :py:func:`remove the listener `. - - The callback function must have three arguments: - - * ``self`` - the current vehicle. - * ``name`` - the name of the message that was intercepted. - * ``message`` - the actual message (a `pymavlink `_ - `class `_). - - For example, in the fragment below ``my_method`` will be called for every heartbeat message: - - .. code:: python - - #Callback method for new messages - def my_method(self, name, msg): - pass - - vehicle.add_message_listener('HEARTBEAT',my_method) - - See :ref:`mavlink_messages` for more information. - - :param String name: The name of the message to be intercepted by the listener function (or '*' to get all messages). - :param fn: The listener function that will be called if a message is received. - """ - name = str(name) - if name not in self._message_listeners: - self._message_listeners[name] = [] - if fn not in self._message_listeners[name]: - self._message_listeners[name].append(fn) - - def remove_message_listener(self, name, fn): - """ - Removes a message listener (that was previously added using :py:func:`add_message_listener`). - - See :ref:`mavlink_messages` for more information. - - :param String name: The name of the message for which the listener is to be removed (or '*' to remove an 'all messages' observer). - :param fn: The listener callback function to remove. - - """ - name = str(name) - if name in self._message_listeners: - if fn in self._message_listeners[name]: - self._message_listeners[name].remove(fn) - if len(self._message_listeners[name]) == 0: - del self._message_listeners[name] - - def notify_message_listeners(self, name, msg): - for fn in self._message_listeners.get(name, []): - try: - fn(self, name, msg) - except Exception: - self._logger.exception('Exception in message handler for %s' % msg.get_type(), exc_info=True) - - for fn in self._message_listeners.get('*', []): - try: - fn(self, name, msg) - except Exception: - self._logger.exception('Exception in message handler for %s' % msg.get_type(), exc_info=True) - - def close(self): - return self._handler.close() - - def flush(self): - """ - Call ``flush()`` after :py:func:`adding ` or :py:func:`clearing ` mission commands. - - After the return from ``flush()`` any writes are guaranteed to have completed (or thrown an - exception) and future reads will see their effects. - - .. warning:: - - This method is deprecated. It has been replaced by - :py:func:`Vehicle.commands.upload() `. - """ - return self.commands.upload() - - # - # Private sugar methods - # - - @property - def _mode_mapping(self): - return self._master.mode_mapping() - - @property - def _mode_mapping_bynumber(self): - return mavutil.mode_mapping_bynumber(self._vehicle_type) - - def _is_mode_available(self, custommode_code, basemode_code=0): - try: - if self._autopilot_type == mavutil.mavlink.MAV_AUTOPILOT_PX4: - mode = mavutil.interpret_px4_mode(basemode_code, custommode_code) - return mode in self._mode_mapping - return custommode_code in self._mode_mapping_bynumber - except: - return False - - # - # Operations to support the standard API. - # - - @property - def mode(self): - """ - This attribute is used to get and set the current flight mode. You - can specify the value as a :py:class:`VehicleMode`, like this: - - .. code-block:: python - - vehicle.mode = VehicleMode('LOITER') - - Or as a simple string: - - .. code-block:: python - - vehicle.mode = 'LOITER' - - If you are targeting ArduPilot you can also specify the flight mode - using a numeric value (this will not work with PX4 autopilots): - - .. code-block:: python - - # set mode to LOITER - vehicle.mode = 5 - """ - if not self._flightmode: - return None - return VehicleMode(self._flightmode) - - @mode.setter - def mode(self, v): - if isinstance(v, basestring): - v = VehicleMode(v) - - if self._autopilot_type == mavutil.mavlink.MAV_AUTOPILOT_PX4: - self._master.set_mode(v.name) - elif isinstance(v, int): - self._master.set_mode(v) - else: - self._master.set_mode(self._mode_mapping[v.name]) - - @property - def location(self): - """ - The vehicle location in global, global relative and local frames (:py:class:`Locations`). - - The different frames are accessed through its members: - - * :py:attr:`global_frame ` (:py:class:`LocationGlobal`) - * :py:attr:`global_relative_frame ` (:py:class:`LocationGlobalRelative`) - * :py:attr:`local_frame ` (:py:class:`LocationLocal`) - - For example, to print the location in each frame for a ``vehicle``: - - .. code-block:: python - - # Print location information for `vehicle` in all frames (default printer) - print "Global Location: %s" % vehicle.location.global_frame - print "Global Location (relative altitude): %s" % vehicle.location.global_relative_frame - print "Local Location: %s" % vehicle.location.local_frame #NED - - # Print altitudes in the different frames (see class definitions for other available information) - print "Altitude (global frame): %s" % vehicle.location.global_frame.alt - print "Altitude (global relative frame): %s" % vehicle.location.global_relative_frame.alt - print "Altitude (NED frame): %s" % vehicle.location.local_frame.down - - .. note:: - - All the location "values" (e.g. ``global_frame.lat``) are initially - created with value ``None``. The ``global_frame``, ``global_relative_frame`` - latitude and longitude values are populated shortly after initialisation but - ``global_frame.alt`` may take a few seconds longer to be updated. - The ``local_frame`` does not populate until the vehicle is armed. - - The attribute and its members are observable. To watch for changes in all frames using a listener - created using a decorator (you can also define a listener and explicitly add it). - - .. code-block:: python - - @vehicle.on_attribute('location') - def listener(self, attr_name, value): - # `self`: :py:class:`Vehicle` object that has been updated. - # `attr_name`: name of the observed attribute - 'location' - # `value` is the updated attribute value (a :py:class:`Locations`). This can be queried for the frame information - print " Global: %s" % value.global_frame - print " GlobalRelative: %s" % value.global_relative_frame - print " Local: %s" % value.local_frame - - To watch for changes in just one attribute (in this case ``global_frame``): - - .. code-block:: python - - @vehicle.on_attribute('location.global_frame') - def listener(self, attr_name, value): - # `self`: :py:class:`Locations` object that has been updated. - # `attr_name`: name of the observed attribute - 'global_frame' - # `value` is the updated attribute value. - print " Global: %s" % value - - #Or watch using decorator: ``@vehicle.location.on_attribute('global_frame')``. - """ - return self._location - - @property - def wind(self): - """ - Current wind status (:pu:class: `Wind`) - """ - if self._wind_direction is None or self._wind_speed is None or self._wind_speed_z is None: - return None - return Wind(self._wind_direction, self._wind_speed, self._wind_speed_z) - - @property - def battery(self): - """ - Current system batter status (:py:class:`Battery`). - """ - if self._voltage is None or self._current is None or self._level is None: - return None - return Battery(self._voltage, self._current, self._level) - - @property - def rangefinder(self): - """ - Rangefinder distance and voltage values (:py:class:`Rangefinder`). - """ - return Rangefinder(self._rngfnd_distance, self._rngfnd_voltage) - - @property - def velocity(self): - """ - Current velocity as a three element list ``[ vx, vy, vz ]`` (in meter/sec). - """ - return [self._vx, self._vy, self._vz] - - @property - def version(self): - """ - The autopilot version and type in a :py:class:`Version` object. - - .. versionadded:: 2.0.3 - """ - return Version(self._raw_version, self._autopilot_type, self._vehicle_type) - - @property - def capabilities(self): - """ - The autopilot capabilities in a :py:class:`Capabilities` object. - - .. versionadded:: 2.0.3 - """ - return Capabilities(self._capabilities) - - @property - def attitude(self): - """ - Current vehicle attitude - pitch, yaw, roll (:py:class:`Attitude`). - """ - return Attitude(self._pitch, self._yaw, self._roll) - - @property - def gps_0(self): - """ - GPS position information (:py:class:`GPSInfo`). - """ - return GPSInfo(self._eph, self._epv, self._fix_type, self._satellites_visible) - - @property - def armed(self): - """ - This attribute can be used to get and set the ``armed`` state of the vehicle (``boolean``). - - The code below shows how to read the state, and to arm/disarm the vehicle: - - .. code:: python - - # Print the armed state for the vehicle - print "Armed: %s" % vehicle.armed - - # Disarm the vehicle - vehicle.armed = False - - # Arm the vehicle - vehicle.armed = True - """ - return self._armed - - @armed.setter - def armed(self, value): - if bool(value) != self._armed: - if value: - self._master.arducopter_arm() - else: - self._master.arducopter_disarm() - - @property - def is_armable(self): - """ - Returns ``True`` if the vehicle is ready to arm, false otherwise (``Boolean``). - - This attribute wraps a number of pre-arm checks, ensuring that the vehicle has booted, - has a good GPS fix, and that the EKF pre-arm is complete. - """ - # check that mode is not INITIALSING - # check that we have a GPS fix - # check that EKF pre-arm is complete - return self.mode != 'INITIALISING' and (self.gps_0.fix_type is not None and self.gps_0.fix_type > 1) and self._ekf_predposhorizabs - - @property - def system_status(self): - """ - System status (:py:class:`SystemStatus`). - - The status has a ``state`` property with one of the following values: - - * ``UNINIT``: Uninitialized system, state is unknown. - * ``BOOT``: System is booting up. - * ``CALIBRATING``: System is calibrating and not flight-ready. - * ``STANDBY``: System is grounded and on standby. It can be launched any time. - * ``ACTIVE``: System is active and might be already airborne. Motors are engaged. - * ``CRITICAL``: System is in a non-normal flight mode. It can however still navigate. - * ``EMERGENCY``: System is in a non-normal flight mode. It lost control over parts - or over the whole airframe. It is in mayday and going down. - * ``POWEROFF``: System just initialized its power-down sequence, will shut down now. - """ - return { - 0: SystemStatus('UNINIT'), - 1: SystemStatus('BOOT'), - 2: SystemStatus('CALIBRATING'), - 3: SystemStatus('STANDBY'), - 4: SystemStatus('ACTIVE'), - 5: SystemStatus('CRITICAL'), - 6: SystemStatus('EMERGENCY'), - 7: SystemStatus('POWEROFF'), - }.get(self._system_status, None) - - @property - def heading(self): - """ - Current heading in degrees - 0..360, where North = 0 (``int``). - """ - return self._heading - - @property - def groundspeed(self): - """ - Current groundspeed in metres/second (``double``). - - This attribute is settable. The set value is the default target groundspeed - when moving the vehicle using :py:func:`simple_goto` (or other position-based - movement commands). - """ - return self._groundspeed - - @groundspeed.setter - def groundspeed(self, speed): - speed_type = 1 # ground speed - msg = self.message_factory.command_long_encode( - 0, 0, # target system, target component - mavutil.mavlink.MAV_CMD_DO_CHANGE_SPEED, # command - 0, # confirmation - speed_type, # param 1 - speed, # speed in metres/second - -1, 0, 0, 0, 0 # param 3 - 7 - ) - - # send command to vehicle - self.send_mavlink(msg) - - @property - def airspeed(self): - """ - Current airspeed in metres/second (``double``). - - This attribute is settable. The set value is the default target airspeed - when moving the vehicle using :py:func:`simple_goto` (or other position-based - movement commands). - """ - return self._airspeed - - @airspeed.setter - def airspeed(self, speed): - speed_type = 0 # air speed - msg = self.message_factory.command_long_encode( - 0, 0, # target system, target component - mavutil.mavlink.MAV_CMD_DO_CHANGE_SPEED, # command - 0, # confirmation - speed_type, # param 1 - speed, # speed in metres/second - -1, 0, 0, 0, 0 # param 3 - 7 - ) - - # send command to vehicle - self.send_mavlink(msg) - - @property - def gimbal(self): - """ - Gimbal object for controlling, viewing and observing gimbal status (:py:class:`Gimbal`). - - .. versionadded:: 2.0.1 - """ - return self._gimbal - - @property - def mount_status(self): - """ - .. warning:: This method is deprecated. It has been replaced by :py:attr:`gimbal`. - - Current status of the camera mount (gimbal) as a three element list: ``[ pitch, yaw, roll ]``. - - The values in the list are set to ``None`` if no mount is configured. - """ - return [self._mount_pitch, self._mount_yaw, self._mount_roll] - - @property - def ekf_ok(self): - """ - ``True`` if the EKF status is considered acceptable, ``False`` otherwise (``boolean``). - """ - # legacy check for dronekit-python for solo - # use same check that ArduCopter::system.pde::position_ok() is using - if self.armed: - return self._ekf_poshorizabs and not self._ekf_constposmode - else: - return self._ekf_poshorizabs or self._ekf_predposhorizabs - - @property - def channels(self): - """ - The RC channel values from the RC Transmitter (:py:class:`Channels`). - - The attribute can also be used to set and read RC Override (channel override) values - via :py:attr:`Vehicle.channels.override `. - - For more information and examples see :ref:`example_channel_overrides`. - - To read the channels from the RC transmitter: - - .. code:: python - - # Get all channel values from RC transmitter - print "Channel values from RC Tx:", vehicle.channels - - # Access channels individually - print "Read channels individually:" - print " Ch1: %s" % vehicle.channels['1'] - print " Ch2: %s" % vehicle.channels['2'] - - """ - return self._channels - - @property - def home_location(self): - """ - The current home location (:py:class:`LocationGlobal`). - - To get the attribute you must first download the :py:func:`Vehicle.commands`. - The attribute has a value of ``None`` until :py:func:`Vehicle.commands` has been downloaded - **and** the autopilot has set an initial home location (typically where the vehicle first gets GPS lock). - - .. code-block:: python - - #Connect to a vehicle object (for example, on com14) - vehicle = connect('com14', wait_ready=True) - - # Download the vehicle waypoints (commands). Wait until download is complete. - cmds = vehicle.commands - cmds.download() - cmds.wait_ready() - - # Get the home location - home = vehicle.home_location - - The ``home_location`` is not observable. - - The attribute can be written (in the same way as any other attribute) after it has successfully - been populated from the vehicle. The value sent to the vehicle is cached in the attribute - (and can potentially get out of date if you don't re-download ``Vehicle.commands``): - - .. warning:: - - Setting the value will fail silently if the specified location is more than 50km from the EKF origin. - - - """ - return copy.copy(self._home_location) - - @home_location.setter - def home_location(self, pos): - """ - Sets the home location (``LocationGlobal``). - - The value cannot be set until it has successfully been read from the vehicle. After being - set the value is cached in the home_location attribute and does not have to be re-read. - - .. note:: - - Setting the value will fail silently if the specified location is more than 50km from the EKF origin. - """ - - if not isinstance(pos, LocationGlobal): - raise ValueError('Expecting home_location to be set to a LocationGlobal.') - - # Set cached home location. - self._home_location = copy.copy(pos) - - # Send MAVLink update. - self.send_mavlink(self.message_factory.command_long_encode( - 0, 0, # target system, target component - mavutil.mavlink.MAV_CMD_DO_SET_HOME, # command - 0, # confirmation - 0, # param 1: 1 to use current position, 0 to use the entered values. - 0, 0, 0, # params 2-4 - pos.lat, pos.lon, pos.alt)) - - @property - def commands(self): - """ - Gets the editable waypoints/current mission for this vehicle (:py:class:`CommandSequence`). - - This can be used to get, create, and modify a mission. - - :returns: A :py:class:`CommandSequence` containing the waypoints for this vehicle. - """ - return self._commands - - @property - def parameters(self): - """ - The (editable) parameters for this vehicle (:py:class:`Parameters`). - """ - return self._parameters - - def wait_for(self, condition, timeout=None, interval=0.1, errmsg=None): - '''Wait for a condition to be True. - - Wait for condition, a callable, to return True. If timeout is - nonzero, raise a TimeoutError(errmsg) if the condition is not - True after timeout seconds. Check the condition everal - interval seconds. - ''' - - t0 = time.time() - while not condition(): - t1 = time.time() - if timeout and (t1 - t0) >= timeout: - raise TimeoutError(errmsg) - - time.sleep(interval) - - def wait_for_armable(self, timeout=None): - '''Wait for the vehicle to become armable. - - If timeout is nonzero, raise a TimeoutError if the vehicle - is not armable after timeout seconds. - ''' - - def check_armable(): - return self.is_armable - - self.wait_for(check_armable, timeout=timeout) - - def arm(self, wait=True, timeout=None): - '''Arm the vehicle. - - If wait is True, wait for arm operation to complete before - returning. If timeout is nonzero, raise a TimeouTerror if the - vehicle has not armed after timeout seconds. - ''' - - self.armed = True - - if wait: - self.wait_for(lambda: self.armed, timeout=timeout, - errmsg='failed to arm vehicle') - - def disarm(self, wait=True, timeout=None): - '''Disarm the vehicle. - - If wait is True, wait for disarm operation to complete before - returning. If timeout is nonzero, raise a TimeouTerror if the - vehicle has not disarmed after timeout seconds. - ''' - self.armed = False - - if wait: - self.wait_for(lambda: not self.armed, timeout=timeout, - errmsg='failed to disarm vehicle') - - def wait_for_mode(self, mode, timeout=None): - '''Set the flight mode. - - If wait is True, wait for the mode to change before returning. - If timeout is nonzero, raise a TimeoutError if the flight mode - hasn't changed after timeout seconds. - ''' - - if not isinstance(mode, VehicleMode): - mode = VehicleMode(mode) - - self.mode = mode - - self.wait_for(lambda: self.mode.name == mode.name, - timeout=timeout, - errmsg='failed to set flight mode') - - def wait_for_alt(self, alt, epsilon=0.1, rel=True, timeout=None): - '''Wait for the vehicle to reach the specified altitude. - - Wait for the vehicle to get within epsilon meters of the - given altitude. If rel is True (the default), use the - global_relative_frame. If rel is False, use the global_frame. - If timeout is nonzero, raise a TimeoutError if the specified - altitude has not been reached after timeout seconds. - ''' - - def get_alt(): - if rel: - alt = self.location.global_relative_frame.alt - else: - alt = self.location.global_frame.alt - - return alt - - def check_alt(): - cur = get_alt() - delta = abs(alt - cur) - - return ( - (delta < epsilon) or - (cur > alt > start) or - (cur < alt < start) - ) - - start = get_alt() - - self.wait_for( - check_alt, - timeout=timeout, - errmsg='failed to reach specified altitude') - - def wait_simple_takeoff(self, alt=None, epsilon=0.1, timeout=None): - self.simple_takeoff(alt) - - if alt is not None: - self.wait_for_alt(alt, epsilon=epsilon, timeout=timeout) - - def simple_takeoff(self, alt=None): - """ - Take off and fly the vehicle to the specified altitude (in metres) and then wait for another command. - - .. note:: - - This function should only be used on Copter vehicles. - - - The vehicle must be in GUIDED mode and armed before this is called. - - There is no mechanism for notification when the correct altitude is reached, - and if another command arrives before that point (e.g. :py:func:`simple_goto`) it will be run instead. - - .. warning:: - - Apps should code to ensure that the vehicle will reach a safe altitude before - other commands are executed. A good example is provided in the guide topic :doc:`guide/taking_off`. - - :param alt: Target height, in metres. - """ - if alt is not None: - altitude = float(alt) - if math.isnan(altitude) or math.isinf(altitude): - raise ValueError("Altitude was NaN or Infinity. Please provide a real number") - self._master.mav.command_long_send(0, 0, mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, - 0, 0, 0, 0, 0, 0, 0, altitude) - - def simple_goto(self, location, airspeed=None, groundspeed=None): - ''' - Go to a specified global location (:py:class:`LocationGlobal` or :py:class:`LocationGlobalRelative`). - - There is no mechanism for notification when the target location is reached, and if another command arrives - before that point that will be executed immediately. - - You can optionally set the desired airspeed or groundspeed (this is identical to setting - :py:attr:`airspeed` or :py:attr:`groundspeed`). The vehicle will determine what speed to - use if the values are not set or if they are both set. - - The method will change the :py:class:`VehicleMode` to ``GUIDED`` if necessary. - - .. code:: python - - # Set mode to guided - this is optional as the simple_goto method will change the mode if needed. - vehicle.mode = VehicleMode("GUIDED") - - # Set the LocationGlobal to head towards - a_location = LocationGlobal(-34.364114, 149.166022, 30) - vehicle.simple_goto(a_location) - - :param location: The target location (:py:class:`LocationGlobal` or :py:class:`LocationGlobalRelative`). - :param airspeed: Target airspeed in m/s (optional). - :param groundspeed: Target groundspeed in m/s (optional). - ''' - if isinstance(location, LocationGlobalRelative): - frame = mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT - alt = location.alt - elif isinstance(location, LocationGlobal): - # This should be the proper code: - # frame = mavutil.mavlink.MAV_FRAME_GLOBAL - # However, APM discards information about the relative frame - # and treats any alt value as relative. So we compensate here. - frame = mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT - if not self.home_location: - self.commands.download() - self.commands.wait_ready() - alt = location.alt - self.home_location.alt - else: - raise ValueError('Expecting location to be LocationGlobal or LocationGlobalRelative.') - - self._master.mav.mission_item_send(0, 0, 0, frame, - mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 2, 0, 0, - 0, 0, 0, location.lat, location.lon, - alt) - - if airspeed is not None: - self.airspeed = airspeed - if groundspeed is not None: - self.groundspeed = groundspeed - - def send_mavlink(self, message): - """ - This method is used to send raw MAVLink "custom messages" to the vehicle. - - The function can send arbitrary messages/commands to the connected vehicle at any time and in any vehicle mode. - It is particularly useful for controlling vehicles outside of missions (for example, in GUIDED mode). - - The :py:func:`message_factory ` is used to create messages in the appropriate format. - - For more information see the guide topic: :ref:`guided_mode_how_to_send_commands`. - - :param message: A ``MAVLink_message`` instance, created using :py:func:`message_factory `. - There is need to specify the system id, component id or sequence number of messages as the API will set these appropriately. - """ - self._master.mav.send(message) - - @property - def message_factory(self): - """ - Returns an object that can be used to create 'raw' MAVLink messages that are appropriate for this vehicle. - The message can then be sent using :py:func:`send_mavlink(message) `. - - .. note:: - - Vehicles support a subset of the messages defined in the MAVLink standard. For more information - about the supported sets see wiki topics: - `Copter Commands in Guided Mode `_ - and `Plane Commands in Guided Mode `_. - - All message types are defined in the central MAVLink github repository. For example, a Pixhawk understands - the following messages (from `pixhawk.xml `_): - - .. code:: xml - - - 0 to disable, 1 to enable - - - The name of the factory method will always be the lower case version of the message name with *_encode* appended. - Each field in the XML message definition must be listed as arguments to this factory method. So for this example - message, the call would be: - - .. code:: python - - msg = vehicle.message_factory.image_trigger_control_encode(True) - vehicle.send_mavlink(msg) - - Some message types include "addressing information". If present, there is no need to specify the ``target_system`` - id (just set to zero) as DroneKit will automatically update messages with the correct ID for the connected - vehicle before sending. - The ``target_component`` should be set to 0 (broadcast) unless the message is to specific component. - CRC fields and sequence numbers (if defined in the message type) are automatically set by DroneKit and can also - be ignored/set to zero. - - For more information see the guide topic: :ref:`guided_mode_how_to_send_commands`. - """ - return self._master.mav - - def initialize(self, rate=4, heartbeat_timeout=30): - self._handler.start() - - # Start heartbeat polling. - start = monotonic.monotonic() - self._heartbeat_error = heartbeat_timeout or 0 - self._heartbeat_started = True - self._heartbeat_lastreceived = start - - # Poll for first heartbeat. - # If heartbeat times out, this will interrupt. - while self._handler._alive: - time.sleep(.1) - if self._heartbeat_lastreceived != start: - break - if not self._handler._alive: - raise APIException('Timeout in initializing connection.') - - # Register target_system now. - self._handler.target_system = self._heartbeat_system - - # Wait until board has booted. - while True: - if self._flightmode not in [None, 'INITIALISING', 'MAV']: - break - time.sleep(0.1) - - # Initialize data stream. - if rate is not None: - self._master.mav.request_data_stream_send(0, 0, mavutil.mavlink.MAV_DATA_STREAM_ALL, - rate, 1) - - self.add_message_listener('HEARTBEAT', self.send_capabilities_request) - - # Ensure initial parameter download has started. - while True: - # This fn actually rate limits itself to every 2s. - # Just retry with persistence to get our first param stream. - self._master.param_fetch_all() - time.sleep(0.1) - if self._params_count > -1: - break - - def send_capabilties_request(self, vehicle, name, m): - '''An alias for send_capabilities_request. - - The word "capabilities" was misspelled in previous versions of this code. This is simply - an alias to send_capabilities_request using the legacy name. - ''' - return self.send_capabilities_request(vehicle, name, m) - - def send_capabilities_request(self, vehicle, name, m): - '''Request an AUTOPILOT_VERSION packet''' - capability_msg = vehicle.message_factory.command_long_encode(0, 0, mavutil.mavlink.MAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES, 0, 1, 0, 0, 0, 0, 0, 0) - vehicle.send_mavlink(capability_msg) - - def play_tune(self, tune): - '''Play a tune on the vehicle''' - msg = self.message_factory.play_tune_encode(0, 0, tune) - self.send_mavlink(msg) - - def wait_ready(self, *types, **kwargs): - """ - Waits for specified attributes to be populated from the vehicle (values are initially ``None``). - - This is typically called "behind the scenes" to ensure that :py:func:`connect` does not return until - attributes have populated (via the ``wait_ready`` parameter). You can also use it after connecting to - wait on a specific value(s). - - There are two ways to call the method: - - .. code-block:: python - - #Wait on default attributes to populate - vehicle.wait_ready(True) - - #Wait on specified attributes (or array of attributes) to populate - vehicle.wait_ready('mode','airspeed') - - Using the ``wait_ready(True)`` waits on :py:attr:`parameters`, :py:attr:`gps_0`, - :py:attr:`armed`, :py:attr:`mode`, and :py:attr:`attitude`. In practice this usually - means that all supported attributes will be populated. - - By default, the method will timeout after 30 seconds and raise an exception if the - attributes were not populated. - - :param types: ``True`` to wait on the default set of attributes, or a - comma-separated list of the specific attributes to wait on. - :param int timeout: Timeout in seconds after which the method will raise an exception - (the default) or return ``False``. The default timeout is 30 seconds. - :param Boolean raise_exception: If ``True`` the method will raise an exception on timeout, - otherwise the method will return ``False``. The default is ``True`` (raise exception). - """ - timeout = kwargs.get('timeout', 30) - raise_exception = kwargs.get('raise_exception', True) - - # Vehicle defaults for wait_ready(True) or wait_ready() - if list(types) == [True] or list(types) == []: - types = self._default_ready_attrs - - if not all(isinstance(item, basestring) for item in types): - raise ValueError('wait_ready expects one or more string arguments.') - - # Wait for these attributes to have been set. - await_attributes = set(types) - start = monotonic.monotonic() - still_waiting_last_message_sent = start - still_waiting_callback = kwargs.get('still_waiting_callback') - still_waiting_message_interval = kwargs.get('still_waiting_interval', 1) - - while not await_attributes.issubset(self._ready_attrs): - time.sleep(0.1) - now = monotonic.monotonic() - if now - start > timeout: - if raise_exception: - raise TimeoutError('wait_ready experienced a timeout after %s seconds.' % - timeout) - else: - return False - if (still_waiting_callback and - now - still_waiting_last_message_sent > still_waiting_message_interval): - still_waiting_last_message_sent = now - if still_waiting_callback: - still_waiting_callback(await_attributes - self._ready_attrs) - - return True - - def reboot(self): - """Requests an autopilot reboot by sending a ``MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN`` command.""" - - reboot_msg = self.message_factory.command_long_encode( - 0, 0, # target_system, target_component - mavutil.mavlink.MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN, # command - 0, # confirmation - 1, # param 1, autopilot (reboot) - 0, # param 2, onboard computer (do nothing) - 0, # param 3, camera (do nothing) - 0, # param 4, mount (do nothing) - 0, 0, 0) # param 5 ~ 7 not used - - self.send_mavlink(reboot_msg) - - def send_calibrate_gyro(self): - """Request gyroscope calibration.""" - - calibration_command = self.message_factory.command_long_encode( - self._handler.target_system, 0, # target_system, target_component - mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, # command - 0, # confirmation - 1, # param 1, 1: gyro calibration, 3: gyro temperature calibration - 0, # param 2, 1: magnetometer calibration - 0, # param 3, 1: ground pressure calibration - 0, # param 4, 1: radio RC calibration, 2: RC trim calibration - 0, # param 5, 1: accelerometer calibration, 2: board level calibration, 3: accelerometer temperature calibration, 4: simple accelerometer calibration - 0, # param 6, 2: airspeed calibration - 0, # param 7, 1: ESC calibration, 3: barometer temperature calibration - ) - self.send_mavlink(calibration_command) - - def send_calibrate_magnetometer(self): - """Request magnetometer calibration.""" - - # ArduPilot requires the MAV_CMD_DO_START_MAG_CAL command, only present in the ardupilotmega.xml definition - if self._autopilot_type == mavutil.mavlink.MAV_AUTOPILOT_ARDUPILOTMEGA: - calibration_command = self.message_factory.command_long_encode( - self._handler.target_system, 0, # target_system, target_component - mavutil.mavlink.MAV_CMD_DO_START_MAG_CAL, # command - 0, # confirmation - 0, # param 1, uint8_t bitmask of magnetometers (0 means all). - 1, # param 2, Automatically retry on failure (0=no retry, 1=retry). - 1, # param 3, Save without user input (0=require input, 1=autosave). - 0, # param 4, Delay (seconds). - 0, # param 5, Autoreboot (0=user reboot, 1=autoreboot). - 0, # param 6, Empty. - 0, # param 7, Empty. - ) - else: - calibration_command = self.message_factory.command_long_encode( - self._handler.target_system, 0, # target_system, target_component - mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, # command - 0, # confirmation - 0, # param 1, 1: gyro calibration, 3: gyro temperature calibration - 1, # param 2, 1: magnetometer calibration - 0, # param 3, 1: ground pressure calibration - 0, # param 4, 1: radio RC calibration, 2: RC trim calibration - 0, # param 5, 1: accelerometer calibration, 2: board level calibration, 3: accelerometer temperature calibration, 4: simple accelerometer calibration - 0, # param 6, 2: airspeed calibration - 0, # param 7, 1: ESC calibration, 3: barometer temperature calibration - ) - - self.send_mavlink(calibration_command) - - def send_calibrate_accelerometer(self, simple=False): - """Request accelerometer calibration. - - :param simple: if True, perform simple accelerometer calibration - """ - - calibration_command = self.message_factory.command_long_encode( - self._handler.target_system, 0, # target_system, target_component - mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, # command - 0, # confirmation - 0, # param 1, 1: gyro calibration, 3: gyro temperature calibration - 0, # param 2, 1: magnetometer calibration - 0, # param 3, 1: ground pressure calibration - 0, # param 4, 1: radio RC calibration, 2: RC trim calibration - 4 if simple else 1, # param 5, 1: accelerometer calibration, 2: board level calibration, 3: accelerometer temperature calibration, 4: simple accelerometer calibration - 0, # param 6, 2: airspeed calibration - 0, # param 7, 1: ESC calibration, 3: barometer temperature calibration - ) - self.send_mavlink(calibration_command) - - def send_calibrate_vehicle_level(self): - """Request vehicle level (accelerometer trim) calibration.""" - - calibration_command = self.message_factory.command_long_encode( - self._handler.target_system, 0, # target_system, target_component - mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, # command - 0, # confirmation - 0, # param 1, 1: gyro calibration, 3: gyro temperature calibration - 0, # param 2, 1: magnetometer calibration - 0, # param 3, 1: ground pressure calibration - 0, # param 4, 1: radio RC calibration, 2: RC trim calibration - 2, # param 5, 1: accelerometer calibration, 2: board level calibration, 3: accelerometer temperature calibration, 4: simple accelerometer calibration - 0, # param 6, 2: airspeed calibration - 0, # param 7, 1: ESC calibration, 3: barometer temperature calibration - ) - self.send_mavlink(calibration_command) - - def send_calibrate_barometer(self): - """Request barometer calibration.""" - - calibration_command = self.message_factory.command_long_encode( - self._handler.target_system, 0, # target_system, target_component - mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, # command - 0, # confirmation - 0, # param 1, 1: gyro calibration, 3: gyro temperature calibration - 0, # param 2, 1: magnetometer calibration - 1, # param 3, 1: ground pressure calibration - 0, # param 4, 1: radio RC calibration, 2: RC trim calibration - 0, # param 5, 1: accelerometer calibration, 2: board level calibration, 3: accelerometer temperature calibration, 4: simple accelerometer calibration - 0, # param 6, 2: airspeed calibration - 0, # param 7, 1: ESC calibration, 3: barometer temperature calibration - ) - self.send_mavlink(calibration_command) - - -class Gimbal(object): - """ - Gimbal status and control. - - An object of this type is returned by :py:attr:`Vehicle.gimbal`. The - gimbal orientation can be obtained from its :py:attr:`roll`, :py:attr:`pitch` and - :py:attr:`yaw` attributes. - - The gimbal orientation can be set explicitly using :py:func:`rotate` - or you can set the gimbal (and vehicle) to track a specific "region of interest" using - :py:func:`target_location`. - - .. note:: - - * The orientation attributes are created with values of ``None``. If a gimbal is present, - the attributes are populated shortly after initialisation by messages from the autopilot. - * The attribute values reflect the last gimbal setting-values rather than actual measured values. - This means that the values won't change if you manually move the gimbal, and that the value - will change when you set it, even if the specified orientation is not supported. - * A gimbal may not support all axes of rotation. For example, the Solo gimbal will set pitch - values from 0 to -90 (straight ahead to straight down), it will rotate the vehicle to follow specified - yaw values, and will ignore roll commands (not supported). - """ - - def __init__(self, vehicle): - super(Gimbal, self).__init__() - - self._pitch = None - self._roll = None - self._yaw = None - self._vehicle = vehicle - - @vehicle.on_message('MOUNT_STATUS') - def listener(vehicle, name, m): - self._pitch = m.pointing_a / 100.0 - self._roll = m.pointing_b / 100.0 - self._yaw = m.pointing_c / 100.0 - vehicle.notify_attribute_listeners('gimbal', vehicle.gimbal) - - @vehicle.on_message('MOUNT_ORIENTATION') - def listener(vehicle, name, m): - self._pitch = m.pitch - self._roll = m.roll - self._yaw = m.yaw - vehicle.notify_attribute_listeners('gimbal', vehicle.gimbal) - - @property - def pitch(self): - """ - Gimbal pitch in degrees relative to the vehicle (see diagram for :ref:`attitude `). - A value of 0 represents a camera pointed straight ahead relative to the front of the vehicle, - while -90 points the camera straight down. - - .. note:: - - This is the last pitch value sent to the gimbal (not the actual/measured pitch). - """ - return self._pitch - - @property - def roll(self): - """ - Gimbal roll in degrees relative to the vehicle (see diagram for :ref:`attitude `). - - .. note:: - - This is the last roll value sent to the gimbal (not the actual/measured roll). - """ - return self._roll - - @property - def yaw(self): - """ - Gimbal yaw in degrees relative to *global frame* (0 is North, 90 is West, 180 is South etc). - - .. note:: - - This is the last yaw value sent to the gimbal (not the actual/measured yaw). - """ - return self._yaw - - def rotate(self, pitch, roll, yaw): - """ - Rotate the gimbal to a specific vector. - - .. code-block:: python - - #Point the gimbal straight down - vehicle.gimbal.rotate(-90, 0, 0) - - :param pitch: Gimbal pitch in degrees relative to the vehicle (see diagram for :ref:`attitude `). - A value of 0 represents a camera pointed straight ahead relative to the front of the vehicle, - while -90 points the camera straight down. - :param roll: Gimbal roll in degrees relative to the vehicle (see diagram for :ref:`attitude `). - :param yaw: Gimbal yaw in degrees relative to *global frame* (0 is North, 90 is West, 180 is South etc.) - """ - msg = self._vehicle.message_factory.mount_configure_encode( - 0, 1, # target system, target component - mavutil.mavlink.MAV_MOUNT_MODE_MAVLINK_TARGETING, #mount_mode - 1, # stabilize roll - 1, # stabilize pitch - 1, # stabilize yaw - ) - self._vehicle.send_mavlink(msg) - msg = self._vehicle.message_factory.mount_control_encode( - 0, 1, # target system, target component - pitch * 100, # pitch is in centidegrees - roll * 100, # roll - yaw * 100, # yaw is in centidegrees - 0 # save position - ) - self._vehicle.send_mavlink(msg) - - def target_location(self, roi): - """ - Point the gimbal at a specific region of interest (ROI). - - .. code-block:: python - - #Set the camera to track the current home location. - vehicle.gimbal.target_location(vehicle.home_location) - - The target position must be defined in a :py:class:`LocationGlobalRelative` or :py:class:`LocationGlobal`. - - This function can be called in AUTO or GUIDED mode. - - In order to clear an ROI you can send a location with all zeros (e.g. ``LocationGlobalRelative(0,0,0)``). - - :param roi: Target location in global relative frame. - """ - # set gimbal to targeting mode - msg = self._vehicle.message_factory.mount_configure_encode( - 0, 1, # target system, target component - mavutil.mavlink.MAV_MOUNT_MODE_GPS_POINT, # mount_mode - 1, # stabilize roll - 1, # stabilize pitch - 1, # stabilize yaw - ) - self._vehicle.send_mavlink(msg) - - # Get altitude relative to home irrespective of Location object passed in. - if isinstance(roi, LocationGlobalRelative): - alt = roi.alt - elif isinstance(roi, LocationGlobal): - if not self.home_location: - self.commands.download() - self.commands.wait_ready() - alt = roi.alt - self.home_location.alt - else: - raise ValueError('Expecting location to be LocationGlobal or LocationGlobalRelative.') - - # set the ROI - msg = self._vehicle.message_factory.command_long_encode( - 0, 1, # target system, target component - mavutil.mavlink.MAV_CMD_DO_SET_ROI, # command - 0, # confirmation - 0, 0, 0, 0, # params 1-4 - roi.lat, - roi.lon, - alt - ) - self._vehicle.send_mavlink(msg) - - def release(self): - """ - Release control of the gimbal to the user (RC Control). - - This should be called once you've finished controlling the mount with either :py:func:`rotate` - or :py:func:`target_location`. Control will automatically be released if you change vehicle mode. - """ - msg = self._vehicle.message_factory.mount_configure_encode( - 0, 1, # target system, target component - mavutil.mavlink.MAV_MOUNT_MODE_RC_TARGETING, # mount_mode - 1, # stabilize roll - 1, # stabilize pitch - 1, # stabilize yaw - ) - self._vehicle.send_mavlink(msg) - - def __str__(self): - return "Gimbal: pitch={0}, roll={1}, yaw={2}".format(self.pitch, self.roll, self.yaw) - - -class Parameters(MutableMapping, HasObservers): - """ - This object is used to get and set the values of named parameters for a vehicle. See the following links for information about - the supported parameters for each platform: `Copter Parameters `_, - `Plane Parameters `_, `Rover Parameters `_. - - The code fragment below shows how to get and set the value of a parameter. - - .. code:: python - - # Print the value of the THR_MIN parameter. - print "Param: %s" % vehicle.parameters['THR_MIN'] - - # Change the parameter value to something different. - vehicle.parameters['THR_MIN']=100 - - It is also possible to observe parameters and to iterate the :py:attr:`Vehicle.parameters`. - - For more information see :ref:`the guide `. - """ - - def __init__(self, vehicle): - super(Parameters, self).__init__() - self._logger = logging.getLogger(__name__) - self._vehicle = vehicle - - def __getitem__(self, name): - name = name.upper() - self.wait_ready() - return self._vehicle._params_map[name] - - def __setitem__(self, name, value): - name = name.upper() - self.wait_ready() - self.set(name, value) - - def __delitem__(self, name): - raise APIException('Cannot delete value from parameters list.') - - def __len__(self): - return len(self._vehicle._params_map) - - def __iter__(self): - return self._vehicle._params_map.__iter__() - - def get(self, name, wait_ready=True): - name = name.upper() - if wait_ready: - self.wait_ready() - return self._vehicle._params_map.get(name, None) - - def set(self, name, value, retries=3, wait_ready=False): - if wait_ready: - self.wait_ready() - - # TODO dumbly reimplement this using timeout loops - # because we should actually be awaiting an ACK of PARAM_VALUE - # changed, but we don't have a proper ack structure, we'll - # instead just wait until the value itself was changed - - name = name.upper() - # convert to single precision floating point number (the type used by low level mavlink messages) - value = float(struct.unpack('f', struct.pack('f', value))[0]) - remaining = retries - while True: - self._vehicle._master.param_set_send(name, value) - tstart = monotonic.monotonic() - if remaining == 0: - break - remaining -= 1 - while monotonic.monotonic() - tstart < 1: - if name in self._vehicle._params_map and self._vehicle._params_map[name] == value: - return True - time.sleep(0.1) - - if retries > 0: - self._logger.error("timeout setting parameter %s to %f" % (name, value)) - return False - - def wait_ready(self, **kwargs): - """ - Block the calling thread until parameters have been downloaded - """ - self._vehicle.wait_ready('parameters', **kwargs) - - def add_attribute_listener(self, attr_name, *args, **kwargs): - """ - Add a listener callback on a particular parameter. - - The callback can be removed using :py:func:`remove_attribute_listener`. - - .. note:: - - The :py:func:`on_attribute` decorator performs the same operation as this method, but with - a more elegant syntax. Use ``add_attribute_listener`` only if you will need to remove - the observer. - - The callback function is invoked only when the parameter changes. - - The callback arguments are: - - * ``self`` - the associated :py:class:`Parameters`. - * ``attr_name`` - the parameter name. This can be used to infer which parameter has triggered - if the same callback is used for watching multiple parameters. - * ``msg`` - the new parameter value (so you don't need to re-query the vehicle object). - - The example below shows how to get callbacks for the ``THR_MIN`` parameter: - - .. code:: python - - #Callback function for the THR_MIN parameter - def thr_min_callback(self, attr_name, value): - print " PARAMETER CALLBACK: %s changed to: %s" % (attr_name, value) - - #Add observer for the vehicle's THR_MIN parameter - vehicle.parameters.add_attribute_listener('THR_MIN', thr_min_callback) - - See :ref:`vehicle_state_observing_parameters` for more information. - - :param String attr_name: The name of the parameter to watch (or '*' to watch all parameters). - :param args: The callback to invoke when a change in the parameter is detected. - - """ - attr_name = attr_name.upper() - return super(Parameters, self).add_attribute_listener(attr_name, *args, **kwargs) - - def remove_attribute_listener(self, attr_name, *args, **kwargs): - """ - Remove a paremeter listener that was previously added using :py:func:`add_attribute_listener`. - - For example to remove the ``thr_min_callback()`` callback function: - - .. code:: python - - vehicle.parameters.remove_attribute_listener('thr_min', thr_min_callback) - - See :ref:`vehicle_state_observing_parameters` for more information. - - :param String attr_name: The parameter name that is to have an observer removed (or '*' to remove an 'all attribute' observer). - :param args: The callback function to remove. - - """ - attr_name = attr_name.upper() - return super(Parameters, self).remove_attribute_listener(attr_name, *args, **kwargs) - - def notify_attribute_listeners(self, attr_name, *args, **kwargs): - attr_name = attr_name.upper() - return super(Parameters, self).notify_attribute_listeners(attr_name, *args, **kwargs) - - def on_attribute(self, attr_name, *args, **kwargs): - """ - Decorator for parameter listeners. - - .. note:: - - There is no way to remove a listener added with this decorator. Use - :py:func:`add_attribute_listener` if you need to be able to remove - the :py:func:`listener `. - - The callback function is invoked only when the parameter changes. - - The callback arguments are: - - * ``self`` - the associated :py:class:`Parameters`. - * ``attr_name`` - the parameter name. This can be used to infer which parameter has triggered - if the same callback is used for watching multiple parameters. - * ``msg`` - the new parameter value (so you don't need to re-query the vehicle object). - - The code fragment below shows how to get callbacks for the ``THR_MIN`` parameter: - - .. code:: python - - @vehicle.parameters.on_attribute('THR_MIN') - def decorated_thr_min_callback(self, attr_name, value): - print " PARAMETER CALLBACK: %s changed to: %s" % (attr_name, value) - - See :ref:`vehicle_state_observing_parameters` for more information. - - :param String attr_name: The name of the parameter to watch (or '*' to watch all parameters). - :param args: The callback to invoke when a change in the parameter is detected. - - """ - attr_name = attr_name.upper() - return super(Parameters, self).on_attribute(attr_name, *args, **kwargs) - - -class Command(mavutil.mavlink.MAVLink_mission_item_message): - """ - A waypoint object. - - This object encodes a single mission item command. The set of commands that are supported - by ArduPilot in Copter, Plane and Rover (along with their parameters) are listed in the wiki article - `MAVLink Mission Command Messages (MAV_CMD) `_. - - For example, to create a `NAV_WAYPOINT `_ command: - - .. code:: python - - cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, - mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 0, 0, 0, 0,-34.364114, 149.166022, 30) - - :param target_system: This can be set to any value - (DroneKit changes the value to the MAVLink ID of the connected vehicle before the command is sent). - :param target_component: The component id if the message is intended for a particular component within the target system - (for example, the camera). Set to zero (broadcast) in most cases. - :param seq: The sequence number within the mission (the autopilot will reject messages sent out of sequence). - This should be set to zero as the API will automatically set the correct value when uploading a mission. - :param frame: The frame of reference used for the location parameters (x, y, z). In most cases this will be - ``mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT``, which uses the WGS84 global coordinate system for latitude and longitude, but sets altitude - as relative to the home position in metres (home altitude = 0). For more information `see the wiki here - `_. - :param command: The specific mission command (e.g. ``mavutil.mavlink.MAV_CMD_NAV_WAYPOINT``). The supported commands (and command parameters - are listed `on the wiki `_. - :param current: Set to zero (not supported). - :param autocontinue: Set to zero (not supported). - :param param1: Command specific parameter (depends on specific `Mission Command (MAV_CMD) `_). - :param param2: Command specific parameter. - :param param3: Command specific parameter. - :param param4: Command specific parameter. - :param x: (param5) Command specific parameter used for latitude (if relevant to command). - :param y: (param6) Command specific parameter used for longitude (if relevant to command). - :param z: (param7) Command specific parameter used for altitude (if relevant). The reference frame for altitude depends on the ``frame``. - - """ - pass - - -class CommandSequence(object): - """ - A sequence of vehicle waypoints (a "mission"). - - Operations include 'array style' indexed access to the various contained waypoints. - - The current commands/mission for a vehicle are accessed using the :py:attr:`Vehicle.commands` attribute. - Waypoints are not downloaded from vehicle until :py:func:`download()` is called. The download is asynchronous; - use :py:func:`wait_ready()` to block your thread until the download is complete. - The code to download the commands from a vehicle is shown below: - - .. code-block:: python - :emphasize-lines: 5-10 - - #Connect to a vehicle object (for example, on com14) - vehicle = connect('com14', wait_ready=True) - - # Download the vehicle waypoints (commands). Wait until download is complete. - cmds = vehicle.commands - cmds.download() - cmds.wait_ready() - - The set of commands can be changed and uploaded to the client. The changes are not guaranteed to be complete until - :py:func:`upload() ` is called. - - .. code:: python - - cmds = vehicle.commands - cmds.clear() - lat = -34.364114, - lon = 149.166022 - altitude = 30.0 - cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, - 0, 0, 0, 0, 0, 0, - lat, lon, altitude) - cmds.add(cmd) - cmds.upload() - - """ - - def __init__(self, vehicle): - self._vehicle = vehicle - - def download(self): - ''' - Download all waypoints from the vehicle. - The download is asynchronous. Use :py:func:`wait_ready()` to block your thread until the download is complete. - ''' - self.wait_ready() - self._vehicle._ready_attrs.remove('commands') - self._vehicle._wp_loaded = False - self._vehicle._master.waypoint_request_list_send() - # BIG FIXME - wait for full wpt download before allowing any of the accessors to work - - def wait_ready(self, **kwargs): - """ - Block the calling thread until waypoints have been downloaded. - - This can be called after :py:func:`download()` to block the thread until the asynchronous download is complete. - """ - return self._vehicle.wait_ready('commands', **kwargs) - - def clear(self): - ''' - Clear the command list. - - This command will be sent to the vehicle only after you call :py:func:`upload() `. - ''' - - # Add home point again. - self.wait_ready() - home = None - try: - home = self._vehicle._wploader.wp(0) - except: - pass - self._vehicle._wploader.clear() - if home: - self._vehicle._wploader.add(home, comment='Added by DroneKit') - self._vehicle._wpts_dirty = True - - def add(self, cmd): - ''' - Add a new command (waypoint) at the end of the command list. - - .. note:: - - Commands are sent to the vehicle only after you call ::py:func:`upload() `. - - :param Command cmd: The command to be added. - ''' - self.wait_ready() - self._vehicle._handler.fix_targets(cmd) - self._vehicle._wploader.add(cmd, comment='Added by DroneKit') - self._vehicle._wpts_dirty = True - - def upload(self, timeout=None): - """ - Call ``upload()`` after :py:func:`adding ` or :py:func:`clearing ` mission commands. - - After the return from ``upload()`` any writes are guaranteed to have completed (or thrown an - exception) and future reads will see their effects. - - :param int timeout: The timeout for uploading the mission. No timeout if not provided or set to None. - """ - if self._vehicle._wpts_dirty: - self._vehicle._master.waypoint_clear_all_send() - start_time = time.time() - if self._vehicle._wploader.count() > 0: - self._vehicle._wp_uploaded = [False] * self._vehicle._wploader.count() - self._vehicle._master.waypoint_count_send(self._vehicle._wploader.count()) - while False in self._vehicle._wp_uploaded: - if timeout and time.time() - start_time > timeout: - raise TimeoutError - time.sleep(0.1) - self._vehicle._wp_uploaded = None - self._vehicle._wpts_dirty = False - - @property - def count(self): - ''' - Return number of waypoints. - - :return: The number of waypoints in the sequence. - ''' - return max(self._vehicle._wploader.count() - 1, 0) - - @property - def next(self): - """ - Get the currently active waypoint number. - """ - return self._vehicle._current_waypoint - - @next.setter - def next(self, index): - """ - Set a new ``next`` waypoint for the vehicle. - """ - self._vehicle._master.waypoint_set_current_send(index) - - def __len__(self): - ''' - Return number of waypoints. - - :return: The number of waypoints in the sequence. - ''' - return max(self._vehicle._wploader.count() - 1, 0) - - def __getitem__(self, index): - if isinstance(index, slice): - return [self[ii] for ii in range(*index.indices(len(self)))] - elif isinstance(index, int): - item = self._vehicle._wploader.wp(index + 1) - if not item: - raise IndexError('Index %s out of range.' % index) - return item - else: - raise TypeError('Invalid argument type.') - - def __setitem__(self, index, value): - self._vehicle._wploader.set(value, index + 1) - self._vehicle._wpts_dirty = True - - -def default_still_waiting_callback(atts): - logging.getLogger(__name__).debug("Still waiting for data from vehicle: %s" % ','.join(atts)) - - -def connect(ip, - _initialize=True, - wait_ready=None, - timeout=30, - still_waiting_callback=default_still_waiting_callback, - still_waiting_interval=1, - status_printer=None, - vehicle_class=None, - rate=4, - baud=115200, - heartbeat_timeout=30, - source_system=255, - source_component=0, - use_native=False): - """ - Returns a :py:class:`Vehicle` object connected to the address specified by string parameter ``ip``. - Connection string parameters (``ip``) for different targets are listed in the :ref:`getting started guide `. - - The method is usually called with ``wait_ready=True`` to ensure that vehicle parameters and (most) attributes are - available when ``connect()`` returns. - - .. code:: python - - from dronekit import connect - - # Connect to the Vehicle using "connection string" (in this case an address on network) - vehicle = connect('127.0.0.1:14550', wait_ready=True) - - :param String ip: :ref:`Connection string ` for target address - e.g. 127.0.0.1:14550. - - :param Bool/Array wait_ready: If ``True`` wait until all default attributes have downloaded before - the method returns (default is ``None``). - The default attributes to wait on are: :py:attr:`parameters`, :py:attr:`gps_0`, - :py:attr:`armed`, :py:attr:`mode`, and :py:attr:`attitude`. - - You can also specify a named set of parameters to wait on (e.g. ``wait_ready=['system_status','mode']``). - - For more information see :py:func:`Vehicle.wait_ready `. - - :param status_printer: (deprecated) method of signature ``def status_printer(txt)`` that prints - STATUS_TEXT messages from the Vehicle and other diagnostic information. - By default the status information is handled by the ``autopilot`` logger. - :param Vehicle vehicle_class: The class that will be instantiated by the ``connect()`` method. - This can be any sub-class of ``Vehicle`` (and defaults to ``Vehicle``). - :param int rate: Data stream refresh rate. The default is 4Hz (4 updates per second). - :param int baud: The baud rate for the connection. The default is 115200. - :param int heartbeat_timeout: Connection timeout value in seconds (default is 30s). - If a heartbeat is not detected within this time an exception will be raised. - :param int source_system: The MAVLink ID of the :py:class:`Vehicle` object returned by this method (by default 255). - :param int source_component: The MAVLink Component ID fo the :py:class:`Vehicle` object returned by this method (by default 0). - :param bool use_native: Use precompiled MAVLink parser. - - .. note:: - - The returned :py:class:`Vehicle` object acts as a ground control station from the - perspective of the connected "real" vehicle. It will process/receive messages from the real vehicle - if they are addressed to this ``source_system`` id. Messages sent to the real vehicle are - automatically updated to use the vehicle's ``target_system`` id. - - It is *good practice* to assign a unique id for every system on the MAVLink network. - It is possible to configure the autopilot to only respond to guided-mode commands from a specified GCS ID. - - The ``status_printer`` argument is deprecated. To redirect the logging from the library and from the - autopilot, configure the ``dronekit`` and ``autopilot`` loggers using the Python ``logging`` module. - - - :returns: A connected vehicle of the type defined in ``vehicle_class`` (a superclass of :py:class:`Vehicle`). - """ - - from dronekit.mavlink import MAVConnection - - if not vehicle_class: - vehicle_class = Vehicle - - handler = MAVConnection(ip, baud=baud, source_system=source_system, source_component=source_component, use_native=use_native) - vehicle = vehicle_class(handler) - - if status_printer: - vehicle._autopilot_logger.addHandler(ErrprinterHandler(status_printer)) - - if _initialize: - vehicle.initialize(rate=rate, heartbeat_timeout=heartbeat_timeout) - - if wait_ready: - if wait_ready is True: - vehicle.wait_ready(still_waiting_interval=still_waiting_interval, - still_waiting_callback=still_waiting_callback, - timeout=timeout) - else: - vehicle.wait_ready(*wait_ready) - - return vehicle diff --git a/simulation/extension_docker/dronekit-python/dronekit/lib.py b/simulation/extension_docker/dronekit-python/dronekit/lib.py deleted file mode 100644 index d2419fcd..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/lib.py +++ /dev/null @@ -1,2 +0,0 @@ -# Backwards compatibility -from dronekit import * diff --git a/simulation/extension_docker/dronekit-python/dronekit/mavlink.py b/simulation/extension_docker/dronekit-python/dronekit/mavlink.py deleted file mode 100644 index d87f93ae..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/mavlink.py +++ /dev/null @@ -1,342 +0,0 @@ -from __future__ import print_function - -import logging -import time -import socket -import errno -import sys -import os -import platform -import copy -from dronekit import APIException -from pymavlink import mavutil -from queue import Queue, Empty -from threading import Thread - -if platform.system() == 'Windows': - from errno import WSAECONNRESET as ECONNABORTED -else: - from errno import ECONNABORTED - - -class MAVWriter(object): - """ - Indirection layer to take messages written to MAVlink and send them all - on the same thread. - """ - - def __init__(self, queue): - self._logger = logging.getLogger(__name__) - self.queue = queue - - def write(self, pkt): - self.queue.put(pkt) - - def read(self): - self._logger.critical('writer should not have had a read request') - os._exit(43) - - -class mavudpin_multi(mavutil.mavfile): - '''a UDP mavlink socket''' - def __init__(self, device, baud=None, input=True, broadcast=False, source_system=255, source_component=0, use_native=mavutil.default_native): - self._logger = logging.getLogger(__name__) - a = device.split(':') - if len(a) != 2: - self._logger.critical("UDP ports must be specified as host:port") - sys.exit(1) - self.port = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - self.udp_server = input - self.broadcast = False - self.addresses = set() - if input: - self.port.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self.port.bind((a[0], int(a[1]))) - else: - self.destination_addr = (a[0], int(a[1])) - if broadcast: - self.port.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) - self.broadcast = True - mavutil.set_close_on_exec(self.port.fileno()) - self.port.setblocking(False) - mavutil.mavfile.__init__(self, self.port.fileno(), device, source_system=source_system, source_component=source_component, input=input, use_native=use_native) - - def close(self): - self.port.close() - - def recv(self, n=None): - try: - try: - data, new_addr = self.port.recvfrom(65535) - except socket.error as e: - if e.errno in [errno.EAGAIN, errno.EWOULDBLOCK, errno.ECONNREFUSED]: - return "" - if self.udp_server: - self.addresses.add(new_addr) - elif self.broadcast: - self.addresses = {new_addr} - return data - except Exception: - self._logger.exception("Exception while reading data", exc_info=True) - - def write(self, buf): - try: - try: - if self.udp_server: - for addr in self.addresses: - self.port.sendto(buf, addr) - else: - if len(self.addresses) and self.broadcast: - self.destination_addr = self.addresses[0] - self.broadcast = False - self.port.connect(self.destination_addr) - self.port.sendto(buf, self.destination_addr) - except socket.error: - pass - except Exception: - self._logger.exception("Exception while writing data", exc_info=True) - - def recv_msg(self): - '''message receive routine for UDP link''' - self.pre_message() - s = self.recv() - if len(s) > 0: - if self.first_byte: - self.auto_mavlink_version(s) - - m = self.mav.parse_char(s) - if m is not None: - self.post_message(m) - - return m - - -class MAVConnection(object): - - def stop_threads(self): - if self.mavlink_thread_in is not None: - self.mavlink_thread_in.join() - self.mavlink_thread_in = None - if self.mavlink_thread_out is not None: - self.mavlink_thread_out.join() - self.mavlink_thread_out = None - - def __init__(self, ip, baud=115200, target_system=0, source_system=255, source_component=0, use_native=False): - self._logger = logging.getLogger(__name__) - - if ip.startswith("udpin:"): - self.master = mavudpin_multi(ip[6:], input=True, baud=baud, source_system=source_system, source_component=source_component) - else: - self.master = mavutil.mavlink_connection(ip, baud=baud, source_system=source_system, source_component=source_component) - - # TODO get rid of "master" object as exposed, - # keep it private, expose something smaller for dronekit - self.out_queue = Queue() - self.master.mav = mavutil.mavlink.MAVLink( - MAVWriter(self.out_queue), - srcSystem=self.master.source_system, - srcComponent=self.master.source_component, - use_native=use_native) - - # Monkey-patch MAVLink object for fix_targets. - sendfn = self.master.mav.send - - def newsendfn(mavmsg, *args, **kwargs): - self.fix_targets(mavmsg) - return sendfn(mavmsg, *args, **kwargs) - - self.master.mav.send = newsendfn - - # Targets - self.target_system = target_system - - # Listeners. - self.loop_listeners = [] - self.message_listeners = [] - - # Debug flag. - self._accept_input = True - self._alive = True - self._death_error = None - - import atexit - - def onexit(): - self._alive = False - self.stop_threads() - - atexit.register(onexit) - - def mavlink_thread_out(): - # Huge try catch in case we see http://bugs.python.org/issue1856 - try: - while self._alive: - try: - msg = self.out_queue.get(True, timeout=0.01) - self.master.write(msg) - except Empty: - continue - except socket.error as error: - # If connection reset (closed), stop polling. - if error.errno == ECONNABORTED: - raise APIException('Connection aborting during read') - raise - except Exception as e: - self._logger.exception('mav send error: %s' % str(e)) - break - except APIException as e: - self._logger.exception("Exception in MAVLink write loop", exc_info=True) - self._alive = False - self.master.close() - self._death_error = e - - except Exception as e: - # http://bugs.python.org/issue1856 - if not self._alive: - pass - else: - self._alive = False - self.master.close() - self._death_error = e - - # Explicitly clear out buffer so .close closes. - self.out_queue = Queue() - - def mavlink_thread_in(): - # Huge try catch in case we see http://bugs.python.org/issue1856 - try: - while self._alive: - # Loop listeners. - for fn in self.loop_listeners: - fn(self) - - # Sleep - self.master.select(0.05) - - while self._accept_input: - try: - msg = self.master.recv_msg() - except socket.error as error: - # If connection reset (closed), stop polling. - if error.errno == ECONNABORTED: - raise APIException('Connection aborting during send') - raise - except mavutil.mavlink.MAVError as e: - # Avoid - # invalid MAVLink prefix '73' - # invalid MAVLink prefix '13' - self._logger.debug('mav recv error: %s' % str(e)) - msg = None - except Exception: - # Log any other unexpected exception - self._logger.exception('Exception while receiving message: ', exc_info=True) - msg = None - if not msg: - break - - # Message listeners. - for fn in self.message_listeners: - try: - fn(self, msg) - except Exception: - self._logger.exception( - 'Exception in message handler for %s' % msg.get_type(), - exc_info=True - ) - - except APIException as e: - self._logger.exception('Exception in MAVLink input loop') - self._alive = False - self.master.close() - self._death_error = e - return - - except Exception as e: - # http://bugs.python.org/issue1856 - if not self._alive: - pass - else: - self._alive = False - self.master.close() - self._death_error = e - - t = Thread(target=mavlink_thread_in) - t.daemon = True - self.mavlink_thread_in = t - - t = Thread(target=mavlink_thread_out) - t.daemon = True - self.mavlink_thread_out = t - - def reset(self): - self.out_queue = Queue() - if hasattr(self.master, 'reset'): - self.master.reset() - else: - try: - self.master.close() - except: - pass - self.master = mavutil.mavlink_connection(self.master.address) - - def fix_targets(self, message): - """Set correct target IDs for our vehicle""" - if hasattr(message, 'target_system'): - message.target_system = self.target_system - - def forward_loop(self, fn): - """ - Decorator for event loop. - """ - self.loop_listeners.append(fn) - - def forward_message(self, fn): - """ - Decorator for message inputs. - """ - self.message_listeners.append(fn) - - def start(self): - if not self.mavlink_thread_in.is_alive(): - self.mavlink_thread_in.start() - if not self.mavlink_thread_out.is_alive(): - self.mavlink_thread_out.start() - - def close(self): - # TODO this can block forever if parameters continue to be added - self._alive = False - while not self.out_queue.empty(): - time.sleep(0.1) - self.stop_threads() - self.master.close() - - def pipe(self, target): - target.target_system = self.target_system - - # vehicle -> self -> target - @self.forward_message - def callback(_, msg): - try: - target.out_queue.put(msg.pack(target.master.mav)) - except: - try: - assert len(msg.get_msgbuf()) > 0 - target.out_queue.put(msg.get_msgbuf()) - except: - self._logger.exception('Could not pack this object on receive: %s' % type(msg), exc_info=True) - - # target -> self -> vehicle - @target.forward_message - def callback(_, msg): - msg = copy.copy(msg) - target.fix_targets(msg) - try: - self.out_queue.put(msg.pack(self.master.mav)) - except: - try: - assert len(msg.get_msgbuf()) > 0 - self.out_queue.put(msg.get_msgbuf()) - except: - self._logger.exception('Could not pack this object on forward: %s' % type(msg), exc_info=True) - - return target diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/README.md b/simulation/extension_docker/dronekit-python/dronekit/test/README.md deleted file mode 100644 index 18a71047..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# dronekit-python tests - -Before running, make sure to export your api keys: - -``` -export DRONEAPI_KEY=. -``` - -Run tests using nose (`pip install nose`): - -``` -$ nosetests -.............. ----------------------------------------------------------------------- -Ran _ tests in _.___s - -OK -``` diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/__init__.py b/simulation/extension_docker/dronekit-python/dronekit/test/__init__.py deleted file mode 100644 index 04ad5353..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import print_function -import os -from dronekit_sitl import SITL -from nose.tools import with_setup -import time - -sitl = None -sitl_args = ['-I0', '--model', 'quad', '--home=-35.363261,149.165230,584,353'] - -if 'SITL_SPEEDUP' in os.environ: - sitl_args += ['--speedup', str(os.environ['SITL_SPEEDUP'])] -if 'SITL_RATE' in os.environ: - sitl_args += ['-r', str(os.environ['SITL_RATE'])] - - -def setup_sitl(): - global sitl - sitl = SITL() - sitl.download('copter', '3.3') - sitl.launch(sitl_args, await_ready=True, restart=True) - - -def teardown_sitl(): - sitl.stop() - - -def with_sitl(fn): - @with_setup(setup_sitl, teardown_sitl) - def test(*args, **kargs): - return fn('tcp:127.0.0.1:5760', *args, **kargs) - return test - - -def wait_for(condition, time_max): - time_start = time.time() - while not condition(): - if time.time() - time_start > time_max: - break - time.sleep(0.1) diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/__init__.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/__init__.py deleted file mode 100644 index 51b3be82..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/__init__.py +++ /dev/null @@ -1,47 +0,0 @@ -import time -from contextlib import contextmanager -from nose.tools import assert_equal -from pymavlink import mavutil - - -@contextmanager -def assert_command_ack( - vehicle, - command_type, - ack_result=mavutil.mavlink.MAV_RESULT_ACCEPTED, - timeout=10 -): - """Context manager to assert that: - - 1) exactly one COMMAND_ACK is received from a Vehicle; - 2) for a specific command type; - 3) with the given result; - 4) within a timeout (in seconds). - - For example: - - .. code-block:: python - - with assert_command_ack(vehicle, mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, timeout=30): - vehicle.calibrate_gyro() - - """ - - acks = [] - - def on_ack(self, name, message): - if message.command == command_type: - acks.append(message) - - vehicle.add_message_listener('COMMAND_ACK', on_ack) - - yield - - start_time = time.time() - while not acks and time.time() - start_time < timeout: - time.sleep(0.1) - vehicle.remove_message_listener('COMMAND_ACK', on_ack) - - assert_equal(1, len(acks)) # one and only one ACK - assert_equal(command_type, acks[0].command) # for the correct command - assert_equal(ack_result, acks[0].result) # the result must be successful diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_110.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_110.py deleted file mode 100644 index 43ed9213..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_110.py +++ /dev/null @@ -1,69 +0,0 @@ -import time -from dronekit import connect, VehicleMode -from dronekit.test import with_sitl, wait_for -from nose.tools import assert_equals - - -@with_sitl -def test_110(connpath): - vehicle = connect(connpath, wait_ready=True) - - # NOTE these are *very inappropriate settings* - # to make on a real vehicle. They are leveraged - # exclusively for simulation. Take heed!!! - vehicle.parameters['FS_GCS_ENABLE'] = 0 - vehicle.parameters['FS_EKF_THRESH'] = 100 - - # Await armability. - wait_for(lambda: vehicle.is_armable, 60) - - # Change the vehicle into STABILIZE mode - vehicle.mode = VehicleMode("GUIDED") - - # NOTE wait crudely for ACK on mode update - time.sleep(3) - - # Define example callback for mode - def armed_callback(vehicle, attribute, value): - armed_callback.called += 1 - - armed_callback.called = 0 - - # When the same (event, callback) pair is passed to add_attribute_listener, - # only one instance of the observer callback should be added. - vehicle.add_attribute_listener('armed', armed_callback) - vehicle.add_attribute_listener('armed', armed_callback) - vehicle.add_attribute_listener('armed', armed_callback) - vehicle.add_attribute_listener('armed', armed_callback) - vehicle.add_attribute_listener('armed', armed_callback) - - # arm and see update. - vehicle.armed = True - - # Wait for ACK. - time_max = 10 - wait_for(lambda: armed_callback.called, time_max) - - # Ensure the callback was called. - assert armed_callback.called > 0, "Callback should have been called within %d seconds" % (time_max,) - - # Rmove all listeners. The first call should remove all listeners - # we've added; the second call should be ignored and not throw. - # NOTE: We test if armed_callback were treating adding each additional callback - # and remove_attribute_listener were removing them one at a time; in this - # case, there would be three callbacks still attached. - vehicle.remove_attribute_listener('armed', armed_callback) - vehicle.remove_attribute_listener('armed', armed_callback) - callcount = armed_callback.called - - # Disarm and see update. - vehicle.armed = False - - # Wait for ack - time.sleep(3) - - # Ensure the callback was called zero times. - assert_equals(armed_callback.called, callcount, - "Callback should not have been called once removed.") - - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_115.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_115.py deleted file mode 100644 index ae17d4a1..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_115.py +++ /dev/null @@ -1,45 +0,0 @@ -import time -from dronekit import connect, VehicleMode -from dronekit.test import with_sitl -from nose.tools import assert_equals - - -@with_sitl -def test_115(connpath): - v = connect(connpath, wait_ready=True) - - # Dummy callback - def mavlink_callback(*args): - mavlink_callback.count += 1 - - mavlink_callback.count = 0 - - # Set the callback. - v.add_message_listener('*', mavlink_callback) - - # Change the vehicle into STABILIZE mode - v.mode = VehicleMode("STABILIZE") - # NOTE wait crudely for ACK on mode update - time.sleep(3) - - # Expect the callback to have been called - assert mavlink_callback.count > 0 - - # Unset the callback. - v.remove_message_listener('*', mavlink_callback) - savecount = mavlink_callback.count - - # Disarm. A callback of None should not throw errors - v.armed = False - # NOTE wait crudely for ACK on mode update - time.sleep(3) - - # Expect the callback to have been called - assert_equals(savecount, mavlink_callback.count) - - # Re-arm should not throw errors. - v.armed = True - # NOTE wait crudely for ACK on mode update - time.sleep(3) - - v.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_12.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_12.py deleted file mode 100644 index c30e30b0..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_12.py +++ /dev/null @@ -1,30 +0,0 @@ -import time -from dronekit import connect -from dronekit.test import with_sitl -from nose.tools import assert_equals - - -def current_milli_time(): - return int(round(time.time() * 1000)) - - -@with_sitl -def test_timeout(connpath): - v = connect(connpath, wait_ready=True) - - value = v.parameters['THR_MIN'] - assert_equals(type(value), float) - - start = current_milli_time() - v.parameters['THR_MIN'] = value + 10 - end = current_milli_time() - - newvalue = v.parameters['THR_MIN'] - assert_equals(type(newvalue), float) - assert_equals(newvalue, value + 10) - - # Checks that time to set parameter was <1s - # see https://github.com/dronekit/dronekit-python/issues/12 - assert end - start < 1000, 'time to set parameter was %s, over 1s' % (end - start, ) - - v.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_capability_and_version.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_capability_and_version.py deleted file mode 100644 index cae0a0c4..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_capability_and_version.py +++ /dev/null @@ -1,36 +0,0 @@ -import time - -from dronekit import connect -from dronekit.test import with_sitl -from nose.tools import assert_false, assert_true - - -@with_sitl -def test_115(connpath): - v = connect(connpath, wait_ready=True) - time.sleep(5) - assert_false(v.capabilities.ftp) - - # versions of ArduCopter prior to v3.3 will send out capabilities - # flags before they are initialised. Vehicle attempts to refetch - # until capabilities are non-zero, but we may need to wait: - start_time = time.time() - slept = False - while v.capabilities.mission_float == 0: - if time.time() > start_time + 30: - break - time.sleep(0.1) - slept = True - if v.capabilities.mission_float: - if slept: - assert_true(v.version.major <= 3) - assert_true(v.version_minor <= 3) - else: - # fail it - assert_true(v.capabilities.mission_float) - - assert_true(v.version.major is not None) - assert_true(len(v.version.release_type()) >= 2) - assert_true(v.version.release_version() is not None) - - v.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_channels.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_channels.py deleted file mode 100644 index a23d536a..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_channels.py +++ /dev/null @@ -1,156 +0,0 @@ -import time -from dronekit import connect -from dronekit.test import with_sitl -from nose.tools import assert_equals - - -def assert_readback(vehicle, values): - i = 10 - while i > 0: - time.sleep(.1) - i -= .1 - for k, v in values.items(): - if vehicle.channels[k] != v: - continue - break - if i <= 0: - raise Exception('Did not match in channels readback %s' % values) - - -@with_sitl -def test_timeout(connpath): - vehicle = connect(connpath, wait_ready=True) - - assert_equals(len(vehicle.channels), 8) - assert_equals(len(vehicle.channels.overrides), 8) - - assert_equals(sorted(vehicle.channels.keys()), [str(x) for x in range(1, 9)]) - assert_equals(sorted(vehicle.channels.overrides.keys()), []) - - assert_equals(type(vehicle.channels['1']), int) - assert_equals(type(vehicle.channels['2']), int) - assert_equals(type(vehicle.channels['3']), int) - assert_equals(type(vehicle.channels['4']), int) - assert_equals(type(vehicle.channels['5']), int) - assert_equals(type(vehicle.channels['6']), int) - assert_equals(type(vehicle.channels['7']), int) - assert_equals(type(vehicle.channels['8']), int) - assert_equals(type(vehicle.channels[1]), int) - assert_equals(type(vehicle.channels[2]), int) - assert_equals(type(vehicle.channels[3]), int) - assert_equals(type(vehicle.channels[4]), int) - assert_equals(type(vehicle.channels[5]), int) - assert_equals(type(vehicle.channels[6]), int) - assert_equals(type(vehicle.channels[7]), int) - assert_equals(type(vehicle.channels[8]), int) - - vehicle.channels.overrides = {'1': 1010} - assert_readback(vehicle, {'1': 1010}) - - vehicle.channels.overrides = {'2': 1020} - assert_readback(vehicle, {'1': 1500, '2': 1010}) - - vehicle.channels.overrides['1'] = 1010 - assert_readback(vehicle, {'1': 1010, '2': 1020}) - - del vehicle.channels.overrides['1'] - assert_readback(vehicle, {'1': 1500, '2': 1020}) - - vehicle.channels.overrides = {'1': 1010, '2': None} - assert_readback(vehicle, {'1': 1010, '2': 1500}) - - vehicle.channels.overrides['1'] = None - assert_readback(vehicle, {'1': 1500, '2': 1500}) - - # test - try: - vehicle.channels['9'] - assert False, "Can read over end of channels" - except: - pass - - try: - vehicle.channels['0'] - assert False, "Can read over start of channels" - except: - pass - - try: - vehicle.channels['1'] = 200 - assert False, "can write a channel value" - except: - pass - - # Set Ch1 to 100 using braces syntax - vehicle.channels.overrides = {'1': 1000} - assert_readback(vehicle, {'1': 1000}) - - # Set Ch2 to 200 using bracket - vehicle.channels.overrides['2'] = 200 - assert_readback(vehicle, {'1': 200, '2': 200}) - - # Set Ch2 to 1010 - vehicle.channels.overrides = {'2': 1010} - assert_readback(vehicle, {'1': 1500, '2': 1010}) - - # Set Ch3,4,5,6,7 to 300,400-700 respectively - vehicle.channels.overrides = {'3': 300, '4': 400, '5': 500, '6': 600, '7': 700} - assert_readback(vehicle, {'3': 300, '4': 400, '5': 500, '6': 600, '7': 700}) - - # Set Ch8 to 800 using braces - vehicle.channels.overrides = {'8': 800} - assert_readback(vehicle, {'8': 800}) - - # Set Ch8 to 800 using brackets - vehicle.channels.overrides['8'] = 810 - assert_readback(vehicle, {'8': 810}) - - try: - # Try to write channel 9 override to a value with brackets - vehicle.channels.overrides['9'] = 900 - assert False, "can write channels.overrides 9" - except: - pass - - try: - # Try to write channel 9 override to a value with braces - vehicle.channels.overrides = {'9': 900} - assert False, "can write channels.overrides 9 with braces" - except: - pass - - # Clear channel 3 using brackets - vehicle.channels.overrides['3'] = None - assert '3' not in vehicle.channels.overrides, 'overrides hould not contain None' - - # Clear channel 2 using braces - vehicle.channels.overrides = {'2': None} - assert '2' not in vehicle.channels.overrides, 'overrides hould not contain None' - - # Clear all channels - vehicle.channels.overrides = {} - assert_equals(len(vehicle.channels.overrides.keys()), 0) - - # Set Ch2 to 33, clear channel 6 - vehicle.channels.overrides = {'2': 33, '6': None} - assert_readback(vehicle, {'2': 33, '6': 1500}) - assert_equals(list(vehicle.channels.overrides.keys()), ['2']) - - # Callbacks - result = {'success': False} - vehicle.channels.overrides = {} - - def channels_callback(vehicle, name, channels): - if channels['3'] == 55: - result['success'] = True - - vehicle.add_attribute_listener('channels', channels_callback) - vehicle.channels.overrides = {'3': 55} - - i = 5 - while not result['success'] and i > 0: - time.sleep(.1) - i -= 1 - assert result['success'], 'channels callback should be invoked.' - - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_earlyattrs.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_earlyattrs.py deleted file mode 100644 index 3d48a114..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_earlyattrs.py +++ /dev/null @@ -1,19 +0,0 @@ -from dronekit import connect -from dronekit.test import with_sitl -from nose.tools import assert_equals, assert_not_equals - - -@with_sitl -def test_battery_none(connpath): - vehicle = connect(connpath, _initialize=False) - - # Ensure we can get (possibly unpopulated) battery object without throwing error. - assert_equals(vehicle.battery, None) - - vehicle.initialize() - - # Ensure we can get battery object without throwing error. - vehicle.wait_ready('battery') - assert_not_equals(vehicle.battery, None) - - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_errprinter.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_errprinter.py deleted file mode 100644 index ce14c0af..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_errprinter.py +++ /dev/null @@ -1,34 +0,0 @@ -import logging -import time - -from nose.tools import assert_true - -from dronekit import connect -from dronekit.test import with_sitl - - -@with_sitl -def test_115(connpath): - """Provide a custom status_printer function to the Vehicle and check that - the autopilot messages are correctly logged. - """ - - logging_check = {'ok': False} - - def errprinter_fn(msg): - if isinstance(msg, str) and "APM:Copter" in msg: - logging_check['ok'] = True - - vehicle = connect(connpath, wait_ready=False, status_printer=errprinter_fn) - - i = 5 - while not logging_check['ok'] and i > 0: - time.sleep(1) - i -= 1 - - assert_true(logging_check['ok']) - vehicle.close() - - # Cleanup the logger - autopilotLogger = logging.getLogger('autopilot') - autopilotLogger.removeHandler(autopilotLogger.handlers[0]) diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_goto.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_goto.py deleted file mode 100644 index ebe06d24..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_goto.py +++ /dev/null @@ -1,91 +0,0 @@ -""" -simple_goto.py: GUIDED mode "simple goto" example (Copter Only) - -The example demonstrates how to arm and takeoff in Copter and how to navigate to -points using Vehicle.simple_goto. - -Full documentation is provided at http://python.dronekit.io/examples/simple_goto.html -""" - -import time -from dronekit import connect, VehicleMode, LocationGlobalRelative -from dronekit.test import with_sitl -from nose.tools import assert_equals - - -@with_sitl -def test_goto(connpath): - vehicle = connect(connpath, wait_ready=True) - - # NOTE these are *very inappropriate settings* - # to make on a real vehicle. They are leveraged - # exclusively for simulation. Take heed!!! - vehicle.parameters['FS_GCS_ENABLE'] = 0 - vehicle.parameters['FS_EKF_THRESH'] = 100 - - def arm_and_takeoff(aTargetAltitude): - """ - Arms vehicle and fly to aTargetAltitude. - """ - - # Don't let the user try to fly autopilot is booting - i = 60 - while not vehicle.is_armable and i > 0: - time.sleep(1) - i = i - 1 - assert_equals(vehicle.is_armable, True) - - # Copter should arm in GUIDED mode - vehicle.mode = VehicleMode("GUIDED") - i = 60 - while vehicle.mode.name != 'GUIDED' and i > 0: - # print " Waiting for guided %s seconds..." % (i,) - time.sleep(1) - i = i - 1 - assert_equals(vehicle.mode.name, 'GUIDED') - - # Arm copter. - vehicle.armed = True - i = 60 - while not vehicle.armed and vehicle.mode.name == 'GUIDED' and i > 0: - # print " Waiting for arming %s seconds..." % (i,) - time.sleep(1) - i = i - 1 - assert_equals(vehicle.armed, True) - - # Take off to target altitude - vehicle.simple_takeoff(aTargetAltitude) - - # Wait until the vehicle reaches a safe height before - # processing the goto (otherwise the command after - # Vehicle.simple_takeoff will execute immediately). - while True: - # print " Altitude: ", vehicle.location.global_relative_frame.alt - # Test for altitude just below target, in case of undershoot. - if vehicle.location.global_relative_frame.alt >= aTargetAltitude * 0.95: - # print "Reached target altitude" - break - - assert_equals(vehicle.mode.name, 'GUIDED') - time.sleep(1) - - arm_and_takeoff(10) - - # print "Going to first point..." - point1 = LocationGlobalRelative(-35.361354, 149.165218, 20) - vehicle.simple_goto(point1) - - # sleep so we can see the change in map - time.sleep(3) - - # print "Going to second point..." - point2 = LocationGlobalRelative(-35.363244, 149.168801, 20) - vehicle.simple_goto(point2) - - # sleep so we can see the change in map - time.sleep(3) - - # print "Returning to Launch" - vehicle.mode = VehicleMode("RTL") - - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_locations.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_locations.py deleted file mode 100644 index be48cc7a..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_locations.py +++ /dev/null @@ -1,87 +0,0 @@ -import time -from dronekit import connect, VehicleMode -from dronekit.test import with_sitl, wait_for -from nose.tools import assert_equals, assert_not_equals - - -@with_sitl -def test_timeout(connpath): - vehicle = connect(connpath, wait_ready=True) - - # NOTE these are *very inappropriate settings* - # to make on a real vehicle. They are leveraged - # exclusively for simulation. Take heed!!! - vehicle.parameters['FS_GCS_ENABLE'] = 0 - vehicle.parameters['FS_EKF_THRESH'] = 100 - - def arm_and_takeoff(aTargetAltitude): - """ - Arms vehicle and fly to aTargetAltitude. - """ - - # Don't let the user try to fly autopilot is booting - wait_for(lambda: vehicle.is_armable, 60) - assert_equals(vehicle.is_armable, True) - - # Copter should arm in GUIDED mode - vehicle.mode = VehicleMode("GUIDED") - wait_for(lambda: vehicle.mode.name == 'GUIDED', 60) - assert_equals(vehicle.mode.name, 'GUIDED') - - # Arm copter. - vehicle.armed = True - wait_for(lambda: vehicle.armed, 60) - assert_equals(vehicle.armed, True) - - # Take off to target altitude - vehicle.simple_takeoff(aTargetAltitude) - - # Wait until the vehicle reaches a safe height before - # processing the goto (otherwise the command after - # Vehicle.simple_takeoff will execute immediately). - while True: - # print " Altitude: ", vehicle.location.alt - # Test for altitude just below target, in case of undershoot. - if vehicle.location.global_frame.alt >= aTargetAltitude * 0.95: - # print "Reached target altitude" - break - - assert_equals(vehicle.mode.name, 'GUIDED') - time.sleep(1) - - arm_and_takeoff(10) - vehicle.wait_ready('location.local_frame', timeout=60) - - # .north, .east, and .down are initialized to None. - # Any other value suggests that a LOCAL_POSITION_NED was received and parsed. - assert_not_equals(vehicle.location.local_frame.north, None) - assert_not_equals(vehicle.location.local_frame.east, None) - assert_not_equals(vehicle.location.local_frame.down, None) - - # global_frame - assert_not_equals(vehicle.location.global_frame.lat, None) - assert_not_equals(vehicle.location.global_frame.lon, None) - assert_not_equals(vehicle.location.global_frame.alt, None) - assert_equals(type(vehicle.location.global_frame.lat), float) - assert_equals(type(vehicle.location.global_frame.lon), float) - assert_equals(type(vehicle.location.global_frame.alt), float) - - vehicle.close() - - -@with_sitl -def test_location_notify(connpath): - vehicle = connect(connpath) - - ret = {'success': False} - - @vehicle.location.on_attribute('global_frame') - def callback(*args): - assert_not_equals(args[2].alt, 0) - ret['success'] = True - - wait_for(lambda: ret['success'], 30) - - assert ret['success'], 'Expected location object to emit notifications.' - - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_mavlink.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_mavlink.py deleted file mode 100644 index 00624098..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_mavlink.py +++ /dev/null @@ -1,30 +0,0 @@ -import time -from dronekit import connect -from dronekit.mavlink import MAVConnection -from dronekit.test import with_sitl - - -@with_sitl -def test_mavlink(connpath): - vehicle = connect(connpath, wait_ready=True) - out = MAVConnection('udpin:localhost:15668') - vehicle._handler.pipe(out) - out.start() - - vehicle2 = connect('udpout:localhost:15668', wait_ready=True) - - result = {'success': False} - - @vehicle2.on_attribute('location') - def callback(*args): - result['success'] = True - - i = 20 - while not result['success'] and i > 0: - time.sleep(1) - i -= 1 - - assert result['success'] - - vehicle2.close() - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_mode_settings.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_mode_settings.py deleted file mode 100644 index 7c777f7a..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_mode_settings.py +++ /dev/null @@ -1,15 +0,0 @@ -from dronekit import connect -from dronekit.test import with_sitl -from nose.tools import assert_equals - - -@with_sitl -def test_modes_set(connpath): - vehicle = connect(connpath) - - def listener(self, name, m): - assert_equals('STABILIZE', self._flightmode) - - vehicle.add_message_listener('HEARTBEAT', listener) - - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_modeavailable.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_modeavailable.py deleted file mode 100644 index f95298f6..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_modeavailable.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -Simple test to trigger a bug in Vehicle class: issue #610 fixed in PR #611 -""" - -from dronekit import connect -from dronekit.test import with_sitl - - -@with_sitl -def test_timeout(connpath): - v = connect(connpath) - - # Set the vehicle and autopilot type to 'unsupported' types that MissionPlanner uses as of 17.Apr.2016 - v._vehicle_type = 6 - v._autopilot_type = 8 - - # The above types trigger 'TypeError: argument of type 'NoneType' is not iterable' which is addressed in issue #610 - v._is_mode_available(0) - - v.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_parameters.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_parameters.py deleted file mode 100644 index bdfc5c3b..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_parameters.py +++ /dev/null @@ -1,63 +0,0 @@ -import time -from dronekit import connect -from dronekit.test import with_sitl -from nose.tools import assert_equals, assert_not_equals - - -@with_sitl -def test_parameters(connpath): - vehicle = connect(connpath) - - # When called on startup, parameter (may!) be none. - # assert_equals(vehicle.parameters.get('THR_MIN', wait_ready=False), None) - - # With wait_ready, it should not be none. - assert_not_equals(vehicle.parameters.get('THR_MIN', wait_ready=True), None) - - try: - assert_not_equals(vehicle.parameters['THR_MIN'], None) - except: - assert False - - # Garbage value after all parameters are downloaded should be None. - assert_equals(vehicle.parameters.get('xXx_extreme_garbage_value_xXx', wait_ready=True), None) - - vehicle.close() - - -@with_sitl -def test_iterating(connpath): - vehicle = connect(connpath, wait_ready=True) - - # Iterate over parameters. - for k, v in vehicle.parameters.items(): - break - for key in vehicle.parameters: - break - - vehicle.close() - - -@with_sitl -def test_setting(connpath): - vehicle = connect(connpath, wait_ready=True) - - assert_not_equals(vehicle.parameters['THR_MIN'], None) - - result = {'success': False} - - @vehicle.parameters.on_attribute('THR_MIN') - def listener(self, name, value): - result['success'] = (name == 'THR_MIN' and value == 3.000) - - vehicle.parameters['THR_MIN'] = 3.000 - - # Wait a bit. - i = 5 - while not result['success'] and i > 0: - time.sleep(1) - i = i - 1 - - assert_equals(result['success'], True) - - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_reboot.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_reboot.py deleted file mode 100644 index bf9236c8..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_reboot.py +++ /dev/null @@ -1,29 +0,0 @@ -from nose.tools import assert_equal - -from dronekit import connect -from dronekit.test import with_sitl -import time - - -@with_sitl -def test_reboot(connpath): - """Tries to reboot the vehicle, and checks that the autopilot ACKs the command.""" - - vehicle = connect(connpath, wait_ready=True) - - reboot_acks = [] - - def on_ack(self, name, message): - if message.command == 246: # reboot/shutdown - reboot_acks.append(message) - - vehicle.add_message_listener('COMMAND_ACK', on_ack) - vehicle.reboot() - time.sleep(0.5) - vehicle.remove_message_listener('COMMAND_ACK', on_ack) - - assert_equal(1, len(reboot_acks)) # one and only one ACK - assert_equal(246, reboot_acks[0].command) # for the correct command - assert_equal(0, reboot_acks[0].result) # the result must be successful - - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_sensor_calibration.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_sensor_calibration.py deleted file mode 100644 index d80aa234..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_sensor_calibration.py +++ /dev/null @@ -1,95 +0,0 @@ -from pymavlink import mavutil - -from dronekit import connect -from dronekit.test import with_sitl - -from dronekit.test.sitl import assert_command_ack - - -@with_sitl -def test_gyro_calibration(connpath): - """Request gyroscope calibration, and check for the COMMAND_ACK.""" - - vehicle = connect(connpath, wait_ready=True) - - with assert_command_ack(vehicle, mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, timeout=30): - vehicle.send_calibrate_gyro() - - vehicle.close() - - -@with_sitl -def test_magnetometer_calibration(connpath): - """Request magnetometer calibration, and check for the COMMAND_ACK.""" - - vehicle = connect(connpath, wait_ready=True) - - with assert_command_ack( - vehicle, - mavutil.mavlink.MAV_CMD_DO_START_MAG_CAL, - timeout=30, - ack_result=mavutil.mavlink.MAV_RESULT_UNSUPPORTED, # TODO: change when APM is upgraded - ): - vehicle.send_calibrate_magnetometer() - - vehicle.close() - - -@with_sitl -def test_simple_accelerometer_calibration(connpath): - """Request simple accelerometer calibration, and check for the COMMAND_ACK.""" - - vehicle = connect(connpath, wait_ready=True) - - with assert_command_ack( - vehicle, - mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, - timeout=30, - ack_result=mavutil.mavlink.MAV_RESULT_FAILED, - ): - vehicle.send_calibrate_accelerometer(simple=True) - - vehicle.close() - - -@with_sitl -def test_accelerometer_calibration(connpath): - """Request accelerometer calibration, and check for the COMMAND_ACK.""" - - vehicle = connect(connpath, wait_ready=True) - - # The calibration is expected to fail because in the SITL we don't tilt the Vehicle. - # We just check that the command isn't denied or unsupported. - with assert_command_ack( - vehicle, - mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, - timeout=30, - ack_result=mavutil.mavlink.MAV_RESULT_FAILED, - ): - vehicle.send_calibrate_accelerometer(simple=False) - - vehicle.close() - - -@with_sitl -def test_board_level_calibration(connpath): - """Request board level calibration, and check for the COMMAND_ACK.""" - - vehicle = connect(connpath, wait_ready=True) - - with assert_command_ack(vehicle, mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, timeout=30): - vehicle.send_calibrate_vehicle_level() - - vehicle.close() - - -@with_sitl -def test_barometer_calibration(connpath): - """Request barometer calibration, and check for the COMMAND_ACK.""" - - vehicle = connect(connpath, wait_ready=True) - - with assert_command_ack(vehicle, mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, timeout=30): - vehicle.send_calibrate_barometer() - - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_simpledemo.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_simpledemo.py deleted file mode 100644 index d79dda11..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_simpledemo.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -This test represents a simple demo for testing. -Feel free to copy and modify at your leisure. -""" - -from dronekit import connect, VehicleMode -from dronekit.test import with_sitl -from nose.tools import assert_equals - - -# This test runs first! -@with_sitl -def test_parameter(connpath): - v = connect(connpath, wait_ready=True) - - # Perform a simple parameter check - assert_equals(type(v.parameters['THR_MIN']), float) - - v.close() - - -# This test runs second. Add as many tests as you like -@with_sitl -def test_mode(connpath): - v = connect(connpath, wait_ready=True) - - # Ensure Mode is an instance of VehicleMode - assert isinstance(v.mode, VehicleMode) - - v.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_state.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_state.py deleted file mode 100644 index b5388954..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_state.py +++ /dev/null @@ -1,13 +0,0 @@ -from dronekit import connect, SystemStatus -from dronekit.test import with_sitl -from nose.tools import assert_equals - - -@with_sitl -def test_state(connpath): - vehicle = connect(connpath, wait_ready=['system_status']) - - assert_equals(type(vehicle.system_status), SystemStatus) - assert_equals(type(vehicle.system_status.state), str) - - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_timeout.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_timeout.py deleted file mode 100644 index 11b99baf..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_timeout.py +++ /dev/null @@ -1,41 +0,0 @@ -import time -import socket -from dronekit import connect -from dronekit.test import with_sitl -from nose.tools import assert_equals - - -@with_sitl -def test_timeout(connpath): - # Connect with timeout of 10s. - vehicle = connect(connpath, wait_ready=True, heartbeat_timeout=20) - - # Stall input. - vehicle._handler._accept_input = False - - start = time.time() - while vehicle._handler._alive and time.time() - start < 30: - time.sleep(.1) - - assert_equals(vehicle._handler._alive, False) - - vehicle.close() - - -def test_timeout_empty(): - # Create a dummy server. - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - s.bind(('127.0.0.1', 5760)) - s.listen(1) - - try: - # Connect with timeout of 10s. - vehicle = connect('tcp:127.0.0.1:5760', wait_ready=True, heartbeat_timeout=20) - - vehicle.close() - - # Should not pass - assert False - except: - pass diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_vehicleclass.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_vehicleclass.py deleted file mode 100644 index ddc1054b..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_vehicleclass.py +++ /dev/null @@ -1,25 +0,0 @@ -import time -from dronekit import connect, Vehicle -from dronekit.test import with_sitl - - -class DummyVehicle(Vehicle): - def __init__(self, *args): - super(DummyVehicle, self).__init__(*args) - - self.success = False - - def success_fn(self, name, m): - self.success = True - - self.add_message_listener('HEARTBEAT', success_fn) - - -@with_sitl -def test_timeout(connpath): - v = connect(connpath, vehicle_class=DummyVehicle) - - while not v.success: - time.sleep(0.1) - - v.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_waypoints.py b/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_waypoints.py deleted file mode 100644 index af594ca1..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/sitl/test_waypoints.py +++ /dev/null @@ -1,144 +0,0 @@ -import time -from dronekit import connect, LocationGlobal, Command -from pymavlink import mavutil -from dronekit.test import with_sitl -from nose.tools import assert_not_equals, assert_equals - - -@with_sitl -def test_empty_clear(connpath): - vehicle = connect(connpath) - - # Calling clear() on an empty object should not crash. - vehicle.commands.clear() - vehicle.commands.upload() - - assert_equals(len(vehicle.commands), 0) - - vehicle.close() - - -@with_sitl -def test_set_home(connpath): - vehicle = connect(connpath, wait_ready=True) - - # Wait for home position to be real and not 0, 0, 0 - # once we request it via cmds.download() - time.sleep(10) - vehicle.commands.download() - vehicle.commands.wait_ready() - assert_not_equals(vehicle.home_location, None) - - # Note: If the GPS values differ heavily from EKF values, this command - # will basically fail silently. This GPS coordinate is tailored for that - # the with_sitl initializer uses to not fail. - vehicle.home_location = LocationGlobal(-35, 149, 600) - vehicle.commands.download() - vehicle.commands.wait_ready() - - assert_equals(vehicle.home_location.lat, -35) - assert_equals(vehicle.home_location.lon, 149) - assert_equals(vehicle.home_location.alt, 600) - - vehicle.close() - - -@with_sitl -def test_parameter(connpath): - vehicle = connect(connpath, wait_ready=True) - - # Home should be None at first. - assert_equals(vehicle.home_location, None) - - # Wait for home position to be real and not 0, 0, 0 - # once we request it via cmds.download() - time.sleep(10) - - # Initial - vehicle.commands.download() - vehicle.commands.wait_ready() - assert_equals(len(vehicle.commands), 0) - assert_not_equals(vehicle.home_location, None) - - # Save home for comparison. - home = vehicle.home_location - - # After clearing - vehicle.commands.clear() - vehicle.commands.upload() - vehicle.commands.download() - vehicle.commands.wait_ready() - assert_equals(len(vehicle.commands), 0) - - # Upload - for command in [ - Command(0, 0, 0, 0, 16, 1, 1, 0.0, 0.0, 0.0, 0.0, -35.3605, 149.172363, 747.0), - Command(0, 0, 0, 3, 22, 0, 1, 0.0, 0.0, 0.0, 0.0, -35.359831, 149.166334, 100.0), - Command(0, 0, 0, 3, 16, 0, 1, 0.0, 0.0, 0.0, 0.0, -35.363489, 149.167213, 100.0), - Command(0, 0, 0, 3, 16, 0, 1, 0.0, 0.0, 0.0, 0.0, -35.355491, 149.169595, 100.0), - Command(0, 0, 0, 3, 16, 0, 1, 0.0, 0.0, 0.0, 0.0, -35.355071, 149.175839, 100.0), - Command(0, 0, 0, 3, 113, 0, 1, 0.0, 0.0, 0.0, 0.0, -35.362666, 149.178715, 22222.0), - Command(0, 0, 0, 3, 115, 0, 1, 2.0, 22.0, 1.0, 3.0, 0.0, 0.0, 0.0), - Command(0, 0, 0, 3, 16, 0, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), - ]: - vehicle.commands.add(command) - vehicle.commands.upload() - - # After upload - vehicle.commands.download() - vehicle.commands.wait_ready() - assert_equals(len(vehicle.commands), 8) - - # Test iteration. - count = 0 - for cmd in vehicle.commands: - assert_not_equals(cmd, None) - count += 1 - assert_equals(count, 8) - - # Test slicing - count = 3 - for cmd in vehicle.commands[2:5]: - assert_not_equals(cmd, None) - assert_equals(cmd.seq, count) - count += 1 - assert_equals(count, 6) - - # Test next property - assert_equals(vehicle.commands.next, 0) - vehicle.commands.next = 3 - while vehicle.commands.next != 3: - time.sleep(0.1) - assert_equals(vehicle.commands.next, 3) - - # Home should be preserved - assert_equals(home.lat, vehicle.home_location.lat) - assert_equals(home.lon, vehicle.home_location.lon) - assert_equals(home.alt, vehicle.home_location.alt) - - vehicle.close() - - -@with_sitl -def test_227(connpath): - """ - Tests race condition when downloading items - """ - - vehicle = connect(connpath, wait_ready=True) - - def assert_commands(count): - vehicle.commands.download() - vehicle.commands.wait_ready() - assert_equals(len(vehicle.commands), count) - - assert_commands(0) - - vehicle.commands.add(Command(0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, - mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 0, 0, 0, 0, 10, 10, - 10)) - vehicle.flush() # Send commands - - assert_commands(1) - - vehicle.close() diff --git a/simulation/extension_docker/dronekit-python/dronekit/test/unit/test_api.py b/simulation/extension_docker/dronekit-python/dronekit/test/unit/test_api.py deleted file mode 100644 index 1ce8190d..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/test/unit/test_api.py +++ /dev/null @@ -1,10 +0,0 @@ -from dronekit import VehicleMode -from nose.tools import assert_equals, assert_not_equals - - -def test_vehicle_mode_eq(): - assert_equals(VehicleMode('GUIDED'), VehicleMode('GUIDED')) - - -def test_vehicle_mode_neq(): - assert_not_equals(VehicleMode('AUTO'), VehicleMode('GUIDED')) diff --git a/simulation/extension_docker/dronekit-python/dronekit/util.py b/simulation/extension_docker/dronekit-python/dronekit/util.py deleted file mode 100644 index 4b7bd43a..00000000 --- a/simulation/extension_docker/dronekit-python/dronekit/util.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import print_function - -import logging -import sys - - -def errprinter(*args): - logger(*args) - - -def logger(*args): - print(*args, file=sys.stderr) - sys.stderr.flush() - - -class ErrprinterHandler(logging.Handler): - """Logging handler to support the deprecated `errprinter` argument to connect()""" - - def __init__(self, errprinter): - logging.Handler.__init__(self) - self.errprinter = errprinter - - def emit(self, record): - msg = self.format(record) - self.errprinter(msg) diff --git a/simulation/extension_docker/dronekit-python/examples/README.md b/simulation/extension_docker/dronekit-python/examples/README.md deleted file mode 100644 index d6cde69f..00000000 --- a/simulation/extension_docker/dronekit-python/examples/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# DroneKit Tutorials - -DroneKit-Python provides a number of examples/tutorials showing how to use the API. To find out what these examples do (and how they are run) see the [Examples](http://python.dronekit.io/examples/index.html) section in the official DroneKit-Python guide. - -Developers are welcome to [contribute](http://python.dronekit.io/about/contributing.html) new examples or improve our existing documentation. The source code for the example documentation on Github at [/dronekit-python/docs/examples](https://github.com/dronekit/dronekit-python/blob/master/docs/examples/). diff --git a/simulation/extension_docker/dronekit-python/examples/channel_overrides/channel_overrides.py b/simulation/extension_docker/dronekit-python/examples/channel_overrides/channel_overrides.py deleted file mode 100644 index 358a7ea5..00000000 --- a/simulation/extension_docker/dronekit-python/examples/channel_overrides/channel_overrides.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. - -channel_overrides.py: - -Demonstrates how set and clear channel-override information. - -# NOTE: -Channel overrides (a.k.a "RC overrides") are highly discommended (they are primarily implemented -for simulating user input and when implementing certain types of joystick control). - -They are provided for development purposes. Please raise an issue explaining why you need them -and we will try to find a better alternative: https://github.com/dronekit/dronekit-python/issues - -Full documentation is provided at http://python.dronekit.io/examples/channel_overrides.html -""" -from __future__ import print_function -from dronekit import connect - - -#Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Example showing how to set and clear vehicle channel-override information.') -parser.add_argument('--connect', - help="vehicle connection target string. If not specified, SITL automatically started and used.") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - - -#Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - -# Get all original channel values (before override) -print("Channel values from RC Tx:", vehicle.channels) - -# Access channels individually -print("Read channels individually:") -print(" Ch1: %s" % vehicle.channels['1']) -print(" Ch2: %s" % vehicle.channels['2']) -print(" Ch3: %s" % vehicle.channels['3']) -print(" Ch4: %s" % vehicle.channels['4']) -print(" Ch5: %s" % vehicle.channels['5']) -print(" Ch6: %s" % vehicle.channels['6']) -print(" Ch7: %s" % vehicle.channels['7']) -print(" Ch8: %s" % vehicle.channels['8']) -print("Number of channels: %s" % len(vehicle.channels)) - - -# Override channels -print("\nChannel overrides: %s" % vehicle.channels.overrides) - -print("Set Ch2 override to 200 (indexing syntax)") -vehicle.channels.overrides['2'] = 200 -print(" Channel overrides: %s" % vehicle.channels.overrides) -print(" Ch2 override: %s" % vehicle.channels.overrides['2']) - -print("Set Ch3 override to 300 (dictionary syntax)") -vehicle.channels.overrides = {'3':300} -print(" Channel overrides: %s" % vehicle.channels.overrides) - -print("Set Ch1-Ch8 overrides to 110-810 respectively") -vehicle.channels.overrides = {'1': 110, '2': 210,'3': 310,'4':4100, '5':510,'6':610,'7':710,'8':810} -print(" Channel overrides: %s" % vehicle.channels.overrides) - - -# Clear override by setting channels to None -print("\nCancel Ch2 override (indexing syntax)") -vehicle.channels.overrides['2'] = None -print(" Channel overrides: %s" % vehicle.channels.overrides) - -print("Clear Ch3 override (del syntax)") -del vehicle.channels.overrides['3'] -print(" Channel overrides: %s" % vehicle.channels.overrides) - -print("Clear Ch5, Ch6 override and set channel 3 to 500 (dictionary syntax)") -vehicle.channels.overrides = {'5':None, '6':None,'3':500} -print(" Channel overrides: %s" % vehicle.channels.overrides) - -print("Clear all overrides") -vehicle.channels.overrides = {} -print(" Channel overrides: %s" % vehicle.channels.overrides) - -#Close vehicle object before exiting script -print("\nClose vehicle object") -vehicle.close() - -# Shut down simulator if it was started. -if sitl is not None: - sitl.stop() - -print("Completed") diff --git a/simulation/extension_docker/dronekit-python/examples/create_attribute/create_attribute.py b/simulation/extension_docker/dronekit-python/examples/create_attribute/create_attribute.py deleted file mode 100644 index 5d8a20e1..00000000 --- a/simulation/extension_docker/dronekit-python/examples/create_attribute/create_attribute.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. - -create_attribute.py: - -Demonstrates how to create attributes from MAVLink messages within your DroneKit-Python script -and use them in the same way as the built-in Vehicle attributes. - -The code adds a new attribute to the Vehicle class, populating it with information from RAW_IMU messages -intercepted using the message_listener decorator. - -Full documentation is provided at http://python.dronekit.io/examples/create_attribute.html -""" -from __future__ import print_function - -from dronekit import connect, Vehicle -from my_vehicle import MyVehicle #Our custom vehicle class -import time - - - -#Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Demonstrates how to create attributes from MAVLink messages. ') -parser.add_argument('--connect', - help="Vehicle connection target string. If not specified, SITL automatically started and used.") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - - -#Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True, vehicle_class=MyVehicle) - -# Add observer for the custom attribute - -def raw_imu_callback(self, attr_name, value): - # attr_name == 'raw_imu' - # value == vehicle.raw_imu - print(value) - -vehicle.add_attribute_listener('raw_imu', raw_imu_callback) - -print('Display RAW_IMU messages for 5 seconds and then exit.') -time.sleep(5) - -#The message listener can be unset using ``vehicle.remove_message_listener`` - -#Close vehicle object before exiting script -print("Close vehicle object") -vehicle.close() - -# Shut down simulator if it was started. -if sitl is not None: - sitl.stop() diff --git a/simulation/extension_docker/dronekit-python/examples/create_attribute/my_vehicle.py b/simulation/extension_docker/dronekit-python/examples/create_attribute/my_vehicle.py deleted file mode 100644 index 9b129f93..00000000 --- a/simulation/extension_docker/dronekit-python/examples/create_attribute/my_vehicle.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. - -my_vehicle.py: - -Custom Vehicle subclass to add IMU data. -""" - -from dronekit import Vehicle - - -class RawIMU(object): - """ - The RAW IMU readings for the usual 9DOF sensor setup. - This contains the true raw values without any scaling to allow data capture and system debugging. - - The message definition is here: https://mavlink.io/en/messages/common.html#RAW_IMU - - :param time_boot_us: Timestamp (microseconds since system boot). #Note, not milliseconds as per spec - :param xacc: X acceleration (mg) - :param yacc: Y acceleration (mg) - :param zacc: Z acceleration (mg) - :param xgyro: Angular speed around X axis (millirad /sec) - :param ygyro: Angular speed around Y axis (millirad /sec) - :param zgyro: Angular speed around Z axis (millirad /sec) - :param xmag: X Magnetic field (milli tesla) - :param ymag: Y Magnetic field (milli tesla) - :param zmag: Z Magnetic field (milli tesla) - """ - def __init__(self, time_boot_us=None, xacc=None, yacc=None, zacc=None, xygro=None, ygyro=None, zgyro=None, xmag=None, ymag=None, zmag=None): - """ - RawIMU object constructor. - """ - self.time_boot_us = time_boot_us - self.xacc = xacc - self.yacc = yacc - self.zacc = zacc - self.xgyro = zgyro - self.ygyro = ygyro - self.zgyro = zgyro - self.xmag = xmag - self.ymag = ymag - self.zmag = zmag - - def __str__(self): - """ - String representation used to print the RawIMU object. - """ - return "RAW_IMU: time_boot_us={},xacc={},yacc={},zacc={},xgyro={},ygyro={},zgyro={},xmag={},ymag={},zmag={}".format(self.time_boot_us, self.xacc, self.yacc,self.zacc,self.xgyro,self.ygyro,self.zgyro,self.xmag,self.ymag,self.zmag) - - -class MyVehicle(Vehicle): - def __init__(self, *args): - super(MyVehicle, self).__init__(*args) - - # Create an Vehicle.raw_imu object with initial values set to None. - self._raw_imu = RawIMU() - - # Create a message listener using the decorator. - @self.on_message('RAW_IMU') - def listener(self, name, message): - """ - The listener is called for messages that contain the string specified in the decorator, - passing the vehicle, message name, and the message. - - The listener writes the message to the (newly attached) ``vehicle.raw_imu`` object - and notifies observers. - """ - self._raw_imu.time_boot_us=message.time_usec - self._raw_imu.xacc=message.xacc - self._raw_imu.yacc=message.yacc - self._raw_imu.zacc=message.zacc - self._raw_imu.xgyro=message.xgyro - self._raw_imu.ygyro=message.ygyro - self._raw_imu.zgyro=message.zgyro - self._raw_imu.xmag=message.xmag - self._raw_imu.ymag=message.ymag - self._raw_imu.zmag=message.zmag - - # Notify all observers of new message (with new value) - # Note that argument `cache=False` by default so listeners - # are updated with every new message - self.notify_attribute_listeners('raw_imu', self._raw_imu) - - @property - def raw_imu(self): - return self._raw_imu diff --git a/simulation/extension_docker/dronekit-python/examples/drone_delivery/drone_delivery.py b/simulation/extension_docker/dronekit-python/examples/drone_delivery/drone_delivery.py deleted file mode 100644 index 10848877..00000000 --- a/simulation/extension_docker/dronekit-python/examples/drone_delivery/drone_delivery.py +++ /dev/null @@ -1,240 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. -drone_delivery.py: - -A CherryPy based web application that displays a mapbox map to let you view the current vehicle position and send the vehicle commands to fly to a particular latitude and longitude. - -Full documentation is provided at http://python.dronekit.io/examples/drone_delivery.html -""" - -from __future__ import print_function -import os -import simplejson -import time - -from dronekit import connect, VehicleMode, LocationGlobal, LocationGlobalRelative -import cherrypy -from jinja2 import Environment, FileSystemLoader - -# Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Creates a CherryPy based web application that displays a mapbox map to let you view the current vehicle position and send the vehicle commands to fly to a particular latitude and longitude. Will start and connect to SITL if no connection string specified.') -parser.add_argument('--connect', - help="vehicle connection target string. If not specified, SITL is automatically started and used.") -args = parser.parse_args() - -connection_string = args.connect - -# Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - -local_path = os.path.dirname(os.path.abspath(__file__)) -print("local path: %s" % local_path) - - -cherrypy_conf = { - '/': { - 'tools.sessions.on': True, - 'tools.staticdir.root': local_path - }, - '/static': { - 'tools.staticdir.on': True, - 'tools.staticdir.dir': './html/assets' - } -} - - -class Drone(object): - def __init__(self, server_enabled=True): - self.gps_lock = False - self.altitude = 30.0 - - # Connect to the Vehicle - self._log('Connected to vehicle.') - self.vehicle = vehicle - self.commands = self.vehicle.commands - self.current_coords = [] - self.webserver_enabled = server_enabled - self._log("DroneDelivery Start") - - # Register observers - self.vehicle.add_attribute_listener('location', self.location_callback) - - def launch(self): - self._log("Waiting for location...") - while self.vehicle.location.global_frame.lat == 0: - time.sleep(0.1) - self.home_coords = [self.vehicle.location.global_frame.lat, - self.vehicle.location.global_frame.lon] - - self._log("Waiting for ability to arm...") - while not self.vehicle.is_armable: - time.sleep(.1) - - self._log('Running initial boot sequence') - self.change_mode('GUIDED') - self.arm() - self.takeoff() - - if self.webserver_enabled is True: - self._run_server() - - def takeoff(self): - self._log("Taking off") - self.vehicle.simple_takeoff(30.0) - - def arm(self, value=True): - if value: - self._log('Waiting for arming...') - self.vehicle.armed = True - while not self.vehicle.armed: - time.sleep(.1) - else: - self._log("Disarming!") - self.vehicle.armed = False - - def _run_server(self): - # Start web server if enabled - cherrypy.tree.mount(DroneDelivery(self), '/', config=cherrypy_conf) - - cherrypy.config.update({'server.socket_port': 8080, - 'server.socket_host': '0.0.0.0', - 'log.screen': None}) - - print('''Server is bound on all addresses, port 8080 -You may connect to it using your web broser using a URL looking like this: -http://localhost:8080/ -''') - cherrypy.engine.start() - - def change_mode(self, mode): - self._log("Changing to mode: {0}".format(mode)) - - self.vehicle.mode = VehicleMode(mode) - while self.vehicle.mode.name != mode: - self._log(' ... polled mode: {0}'.format(mode)) - time.sleep(1) - - def goto(self, location, relative=None): - self._log("Goto: {0}, {1}".format(location, self.altitude)) - - if relative: - self.vehicle.simple_goto( - LocationGlobalRelative( - float(location[0]), float(location[1]), - float(self.altitude) - ) - ) - else: - self.vehicle.simple_goto( - LocationGlobal( - float(location[0]), float(location[1]), - float(self.altitude) - ) - ) - self.vehicle.flush() - - def get_location(self): - return [self.current_location.lat, self.current_location.lon] - - def location_callback(self, vehicle, name, location): - if location.global_relative_frame.alt is not None: - self.altitude = location.global_relative_frame.alt - - self.current_location = location.global_relative_frame - - def _log(self, message): - print("[DEBUG]: {0}".format(message)) - - -class Templates: - def __init__(self, home_coords): - self.home_coords = home_coords - self.options = self.get_options() - self.environment = Environment(loader=FileSystemLoader(local_path + '/html')) - - def get_options(self): - return {'width': 670, - 'height': 470, - 'zoom': 13, - 'format': 'png', - 'access_token': 'pk.eyJ1Ijoia2V2aW4zZHIiLCJhIjoiY2lrOGoxN2s2MDJzYnR6a3drbTYwdGxmMiJ9.bv5u7QgmcJd6dZfLDGoykw', - 'mapid': 'kevin3dr.n56ffjoo', - 'home_coords': self.home_coords, - 'menu': [{'name': 'Home', 'location': '/'}, - {'name': 'Track', 'location': '/track'}, - {'name': 'Command', 'location': '/command'}], - 'current_url': '/', - 'json': '' - } - - def index(self): - self.options = self.get_options() - self.options['current_url'] = '/' - return self.get_template('index') - - def track(self, current_coords): - self.options = self.get_options() - self.options['current_url'] = '/track' - self.options['current_coords'] = current_coords - self.options['json'] = simplejson.dumps(self.options) - return self.get_template('track') - - def command(self, current_coords): - self.options = self.get_options() - self.options['current_url'] = '/command' - self.options['current_coords'] = current_coords - return self.get_template('command') - - def get_template(self, file_name): - template = self.environment.get_template(file_name + '.html') - return template.render(options=self.options) - - -class DroneDelivery(object): - def __init__(self, drone): - self.drone = drone - self.templates = Templates(self.drone.home_coords) - - @cherrypy.expose - def index(self): - return self.templates.index() - - @cherrypy.expose - def command(self): - return self.templates.command(self.drone.get_location()) - - @cherrypy.expose - @cherrypy.tools.json_out() - def vehicle(self): - return dict(position=self.drone.get_location()) - - @cherrypy.expose - def track(self, lat=None, lon=None): - # Process POST request from Command - # Sending MAVLink packet with goto instructions - if(lat is not None and lon is not None): - self.drone.goto([lat, lon], True) - - return self.templates.track(self.drone.get_location()) - - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - -print('Launching Drone...') -Drone().launch() - -print('Waiting for cherrypy engine...') -cherrypy.engine.block() - -if not args.connect: - # Shut down simulator if it was started. - sitl.stop() diff --git a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/assets/styles.css b/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/assets/styles.css deleted file mode 100644 index ada80fee..00000000 --- a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/assets/styles.css +++ /dev/null @@ -1,78 +0,0 @@ -body { - padding-top: 20px; - padding-bottom: 20px; -} - -.form-inline { - margin-top: 20px; -} - -#map, #staticMap { - width: 670px; - height: 470px; -} - -.header, -.marketing, -.footer { - padding-right: 15px; - padding-left: 15px; -} - -.header { - border-bottom: 1px solid #e5e5e5; -} - -.header h3 { - padding-bottom: 19px; - margin-top: 0; - margin-bottom: 0; - line-height: 40px; -} - -.footer { - padding-top: 19px; - color: #777; - border-top: 1px solid #e5e5e5; -} - -@media (min-width: 768px) { - .container { - max-width: 730px; - } -} -.container-narrow > hr { - margin: 30px 0; -} - -.jumbotron { - text-align: center; - border-bottom: 1px solid #e5e5e5; -} - -.jumbotron .btn { - padding: 14px 24px; - font-size: 21px; -} - -.marketing { - margin: 40px 0; -} -.marketing p + h4 { - margin-top: 28px; -} - -@media screen and (min-width: 768px) { - .header, - .marketing, - .footer { - padding-right: 0; - padding-left: 0; - } - .header { - margin-bottom: 30px; - } - .jumbotron { - border-bottom: 0; - } -} diff --git a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/bottom-scripts.html b/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/bottom-scripts.html deleted file mode 100644 index 0b7a716c..00000000 --- a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/bottom-scripts.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/command.html b/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/command.html deleted file mode 100644 index 447e9511..00000000 --- a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/command.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - {% include 'head.html' %} - - -
- {% import 'header.html' as header %} -
- -

DroneAPI Demos {{options.current_url}}

-
-
-
-
-
-
-
-
- -
-
- -
- -
-
-
-
-

© 3D Robotics Inc.

-
- - {% include 'bottom-scripts.html' %} - - - diff --git a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/head.html b/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/head.html deleted file mode 100644 index 64eb745c..00000000 --- a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/head.html +++ /dev/null @@ -1,8 +0,0 @@ - - - -Drone Delivery App - - - - diff --git a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/header.html b/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/header.html deleted file mode 100644 index eeb7201d..00000000 --- a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/header.html +++ /dev/null @@ -1,13 +0,0 @@ -{% macro list_item(name, location='#', active=False) -%} -
  • - {{name}} -
  • -{%- endmacro %} - -{% macro navigation(list, current_url, class='') -%} -
      - {%- for item in list %} - {{ list_item(item.name, item.location, (item.location == current_url)) }} - {%- endfor %} -
    -{%- endmacro %} diff --git a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/index.html b/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/index.html deleted file mode 100644 index 70bac691..00000000 --- a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - {% include 'head.html' %} - - -
    - {% import 'header.html' as header %} -
    - -

    DroneAPI Demos {{options.current_url}}

    -
    -
    -

    Drone Delivery App

    -

    - Track and Command a drone to delivery packages from a web app -

    -

    - Track - Command -

    -
    -
    -

    © 3D Robotics Inc.

    -
    - - {% include 'bottom-scripts.html' %} - - diff --git a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/mapbox.html b/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/mapbox.html deleted file mode 100644 index 95b559b0..00000000 --- a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/mapbox.html +++ /dev/null @@ -1,11 +0,0 @@ -{% macro static_map(options, coords) -%} - -{%- endmacro %} - -{% macro static_map_with_marker(options, coords, marker_coords) -%} - -{%- endmacro %} - -{% macro marker_string(coords, label='heliport', color='f86767') -%} - pin-m-{{ label }}+{{ color }}({{ coords[1] }},{{ coords[0] }}) -{%- endmacro %} diff --git a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/track.html b/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/track.html deleted file mode 100644 index bf00b6d6..00000000 --- a/simulation/extension_docker/dronekit-python/examples/drone_delivery/html/track.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - {% include 'head.html' %} - - -
    - {% import 'header.html' as header %} -
    - -

    DroneAPI Demos {{options.current_url}}

    -
    -
    - {% import 'mapbox.html' as mapbox%} -
    - {{ mapbox.static_map_with_marker(options, options.current_coords, options.current_coords) }} -
    -
    -
    -
    -
    -
    - -
    -
    - -
    - -
    -
    -
    -
    -

    © 3D Robotics Inc.

    -
    -
    - {% include 'bottom-scripts.html' %} - - - diff --git a/simulation/extension_docker/dronekit-python/examples/drone_delivery/requirements.pip b/simulation/extension_docker/dronekit-python/examples/drone_delivery/requirements.pip deleted file mode 100644 index a5f17347..00000000 --- a/simulation/extension_docker/dronekit-python/examples/drone_delivery/requirements.pip +++ /dev/null @@ -1,5 +0,0 @@ -simplejson -pid -cherrypy -jinja2 -dronekit diff --git a/simulation/extension_docker/dronekit-python/examples/flight_replay/flight.tlog b/simulation/extension_docker/dronekit-python/examples/flight_replay/flight.tlog deleted file mode 100644 index d2c7563d..00000000 Binary files a/simulation/extension_docker/dronekit-python/examples/flight_replay/flight.tlog and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/examples/flight_replay/flight_replay.py b/simulation/extension_docker/dronekit-python/examples/flight_replay/flight_replay.py deleted file mode 100644 index a7564abd..00000000 --- a/simulation/extension_docker/dronekit-python/examples/flight_replay/flight_replay.py +++ /dev/null @@ -1,230 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. -flight_replay.py: - -This example requests a past flight from Droneshare, and then 'replays' -the flight by sending waypoints to a vehicle. - -Full documentation is provided at http://python.dronekit.io/examples/flight_replay.html -""" -from __future__ import print_function - -from dronekit import connect, Command, VehicleMode, LocationGlobalRelative -from pymavlink import mavutil -import json, urllib, math -import time - -#Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Load a telemetry log and use position data to create mission waypoints for a vehicle. Connects to SITL on local PC by default.') -parser.add_argument('--connect', help="vehicle connection target.") -parser.add_argument('--tlog', default='flight.tlog', - help="Telemetry log containing path to replay") -args = parser.parse_args() - - -def get_distance_metres(aLocation1, aLocation2): - """ - Returns the ground distance in metres between two LocationGlobal objects. - - This method is an approximation, and will not be accurate over large distances and close to the - earth's poles. It comes from the ArduPilot test code: - https://github.com/diydrones/ardupilot/blob/master/Tools/autotest/common.py - """ - dlat = aLocation2.lat - aLocation1.lat - dlong = aLocation2.lon - aLocation1.lon - return math.sqrt((dlat*dlat) + (dlong*dlong)) * 1.113195e5 - - - -def distance_to_current_waypoint(): - """ - Gets distance in metres to the current waypoint. - It returns None for the first waypoint (Home location). - """ - nextwaypoint = vehicle.commands.next - if nextwaypoint==0: - return None - missionitem=vehicle.commands[nextwaypoint-1] #commands are zero indexed - lat = missionitem.x - lon = missionitem.y - alt = missionitem.z - targetWaypointLocation = LocationGlobalRelative(lat,lon,alt) - distancetopoint = get_distance_metres(vehicle.location.global_frame, targetWaypointLocation) - return distancetopoint - -def position_messages_from_tlog(filename): - """ - Given telemetry log, get a series of wpts approximating the previous flight - """ - # Pull out just the global position msgs - messages = [] - mlog = mavutil.mavlink_connection(filename) - while True: - try: - m = mlog.recv_match(type=['GLOBAL_POSITION_INT']) - if m is None: - break - except Exception: - break - # ignore we get where there is no fix: - if m.lat == 0: - continue - messages.append(m) - - # Shrink the number of points for readability and to stay within autopilot memory limits. - # For coding simplicity we: - # - only keep points that are with 3 metres of the previous kept point. - # - only keep the first 100 points that meet the above criteria. - num_points = len(messages) - keep_point_distance=3 #metres - kept_messages = [] - kept_messages.append(messages[0]) #Keep the first message - pt1num=0 - pt2num=1 - while True: - #Keep the last point. Only record 99 points. - if pt2num==num_points-1 or len(kept_messages)==99: - kept_messages.append(messages[pt2num]) - break - pt1 = LocationGlobalRelative(messages[pt1num].lat/1.0e7,messages[pt1num].lon/1.0e7,0) - pt2 = LocationGlobalRelative(messages[pt2num].lat/1.0e7,messages[pt2num].lon/1.0e7,0) - distance_between_points = get_distance_metres(pt1,pt2) - if distance_between_points > keep_point_distance: - kept_messages.append(messages[pt2num]) - pt1num=pt2num - pt2num=pt2num+1 - - return kept_messages - - -def arm_and_takeoff(aTargetAltitude): - """ - Arms vehicle and fly to aTargetAltitude. - """ - - # Don't try to arm until autopilot is ready - while not vehicle.is_armable: - print(" Waiting for vehicle to initialise...") - time.sleep(1) - - # Set mode to GUIDED for arming and takeoff: - while (vehicle.mode.name != "GUIDED"): - vehicle.mode = VehicleMode("GUIDED") - time.sleep(0.1) - - # Confirm vehicle armed before attempting to take off - while not vehicle.armed: - vehicle.armed = True - print(" Waiting for arming...") - time.sleep(1) - - print(" Taking off!") - vehicle.simple_takeoff(aTargetAltitude) # Take off to target altitude - - # Wait until the vehicle reaches a safe height - # before allowing next command to process. - while True: - requiredAlt = aTargetAltitude*0.95 - #Break and return from function just below target altitude. - if vehicle.location.global_relative_frame.alt>=requiredAlt: - print(" Reached target altitude of ~%f" % (aTargetAltitude)) - break - print(" Altitude: %f < %f" % (vehicle.location.global_relative_frame.alt, - requiredAlt)) - time.sleep(1) - - -print("Generating waypoints from tlog...") -messages = position_messages_from_tlog(args.tlog) -print(" Generated %d waypoints from tlog" % len(messages)) -if len(messages) == 0: - print("No position messages found in log") - exit(0) - -#Start SITL if no connection string specified -if args.connect: - connection_string = args.connect - sitl = None -else: - start_lat = messages[0].lat/1.0e7 - start_lon = messages[0].lon/1.0e7 - - import dronekit_sitl - sitl = dronekit_sitl.start_default(lat=start_lat,lon=start_lon) - connection_string = sitl.connection_string() - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - - -# Now download the vehicle waypoints -cmds = vehicle.commands -cmds.wait_ready() - - -cmds = vehicle.commands -cmds.clear() -for pt in messages: - #print "Point: %d %d" % (pt.lat, pt.lon,) - lat = pt.lat - lon = pt.lon - # To prevent accidents we don't trust the altitude in the original flight, instead - # we just put in a conservative cruising altitude. - altitude = 30.0 - cmd = Command( 0, - 0, - 0, - mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, - mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, - 0, 0, 0, 0, 0, 0, - lat/1.0e7, lon/1.0e7, altitude) - cmds.add(cmd) - -#Upload clear message and command messages to vehicle. -print("Uploading %d waypoints to vehicle..." % len(messages)) -cmds.upload() - -print("Arm and Takeoff") -arm_and_takeoff(30) - - -print("Starting mission") - -# Reset mission set to first (0) waypoint -vehicle.commands.next=0 - -# Set mode to AUTO to start mission: -while (vehicle.mode.name != "AUTO"): - vehicle.mode = VehicleMode("AUTO") - time.sleep(0.1) - -# Monitor mission for 60 seconds then RTL and quit: -time_start = time.time() -while time.time() - time_start < 60: - nextwaypoint=vehicle.commands.next - print('Distance to waypoint (%s): %s' % (nextwaypoint, distance_to_current_waypoint())) - - if nextwaypoint==len(messages): - print("Exit 'standard' mission when start heading to final waypoint") - break; - time.sleep(1) - -print('Return to launch') -while (vehicle.mode.name != "RTL"): - vehicle.mode = VehicleMode("RTL") - time.sleep(0.1) - -#Close vehicle object before exiting script -print("Close vehicle object") -vehicle.close() - -# Shut down simulator if it was started. -if sitl is not None: - sitl.stop() - -print("Completed...") diff --git a/simulation/extension_docker/dronekit-python/examples/follow_me/fake-gps-data.log b/simulation/extension_docker/dronekit-python/examples/follow_me/fake-gps-data.log deleted file mode 100644 index 1980215f..00000000 --- a/simulation/extension_docker/dronekit-python/examples/follow_me/fake-gps-data.log +++ /dev/null @@ -1,8 +0,0 @@ -$PMGNST,05.40,2,T,961,08.3,+04583,00*4C -$GPGLL,5036.9881,N,00707.9142,E,125412.480,A*3F -$GPGGA,125412.48,5036.9881,N,00707.9142,E,2,04,20.5,00269,M,,,,*17 -$GPRMC,125412.48,A,5036.9881,N,00707.9142,E,00.0,000.0,230506,00,E*4F -$GPGSA,A,2,27,04,08,24,,,,,,,,,20.5,20.5,*12 -$GPGSV,3,1,10,13,81,052,,04,58,240,39,23,44,064,,24,43,188,36*75 -$GPGSV,3,2,10,02,42,295,,27,34,177,40,20,21,113,,16,12,058,*7F -$GPGSV,3,3,10,08,07,189,38,10,05,293,,131,11,117,,120,28,209,*76 diff --git a/simulation/extension_docker/dronekit-python/examples/follow_me/follow_me.py b/simulation/extension_docker/dronekit-python/examples/follow_me/follow_me.py deleted file mode 100644 index ef1227bc..00000000 --- a/simulation/extension_docker/dronekit-python/examples/follow_me/follow_me.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. -followme - Tracks GPS position of your computer (Linux only). - -This example uses the python gps package to read positions from a GPS attached to your -laptop and sends a new vehicle.simple_goto command every two seconds to move the -vehicle to the current point. - -When you want to stop follow-me, either change vehicle modes or type Ctrl+C to exit the script. - -Example documentation: http://python.dronekit.io/examples/follow_me.html -""" -from __future__ import print_function - -from dronekit import connect, VehicleMode, LocationGlobalRelative -import gps -import socket -import time -import sys - -#Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Tracks GPS position of your computer (Linux only).') -parser.add_argument('--connect', - help="vehicle connection target string. If not specified, SITL automatically started and used.") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - - -#Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True, timeout=300) - - - -def arm_and_takeoff(aTargetAltitude): - """ - Arms vehicle and fly to aTargetAltitude. - """ - - print("Basic pre-arm checks") - # Don't let the user try to arm until autopilot is ready - while not vehicle.is_armable: - print(" Waiting for vehicle to initialise...") - time.sleep(1) - - - print("Arming motors") - # Copter should arm in GUIDED mode - vehicle.mode = VehicleMode("GUIDED") - vehicle.armed = True - - while not vehicle.armed: - print(" Waiting for arming...") - time.sleep(1) - - print("Taking off!") - vehicle.simple_takeoff(aTargetAltitude) # Take off to target altitude - - # Wait until the vehicle reaches a safe height before processing the goto (otherwise the command - # after Vehicle.simple_takeoff will execute immediately). - while True: - print(" Altitude: ", vehicle.location.global_relative_frame.alt) - if vehicle.location.global_relative_frame.alt>=aTargetAltitude*0.95: #Trigger just below target alt. - print("Reached target altitude") - break - time.sleep(1) - - - -try: - # Use the python gps package to access the laptop GPS - gpsd = gps.gps(mode=gps.WATCH_ENABLE) - - #Arm and take off to altitude of 5 meters - arm_and_takeoff(5) - - while True: - - if vehicle.mode.name != "GUIDED": - print("User has changed flight modes - aborting follow-me") - break - - # Read the GPS state from the laptop - next(gpsd) - - # Once we have a valid location (see gpsd documentation) we can start moving our vehicle around - if (gpsd.valid & gps.LATLON_SET) != 0: - altitude = 30 # in meters - dest = LocationGlobalRelative(gpsd.fix.latitude, gpsd.fix.longitude, altitude) - print("Going to: %s" % dest) - - # A better implementation would only send new waypoints if the position had changed significantly - vehicle.simple_goto(dest) - - # Send a new target every two seconds - # For a complete implementation of follow me you'd want adjust this delay - time.sleep(2) - -except socket.error: - print("Error: gpsd service does not seem to be running, plug in USB GPS or run run-fake-gps.sh") - sys.exit(1) - -#Close vehicle object before exiting script -print("Close vehicle object") -vehicle.close() - -# Shut down simulator if it was started. -if sitl is not None: - sitl.stop() - -print("Completed") diff --git a/simulation/extension_docker/dronekit-python/examples/follow_me/run-fake-gps.sh b/simulation/extension_docker/dronekit-python/examples/follow_me/run-fake-gps.sh deleted file mode 100644 index de01b109..00000000 --- a/simulation/extension_docker/dronekit-python/examples/follow_me/run-fake-gps.sh +++ /dev/null @@ -1,2 +0,0 @@ -echo Sending fake GPS data -gpsfake -c 1 fake-gps-data.log diff --git a/simulation/extension_docker/dronekit-python/examples/gcs/microgcs.py b/simulation/extension_docker/dronekit-python/examples/gcs/microgcs.py deleted file mode 100644 index a3d33aac..00000000 --- a/simulation/extension_docker/dronekit-python/examples/gcs/microgcs.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. -""" -from __future__ import print_function -# -# This is a small example of the python drone API - an ultra minimal GCS -# - -from dronekit import connect, VehicleMode -from pymavlink import mavutil -from Tkinter import * - -# The tkinter root object -global root - -#Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Tracks GPS position of your computer (Linux only). Connects to SITL on local PC by default.') -parser.add_argument('--connect', - help="vehicle connection target.") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - -#Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - -def setMode(mode): - # Now change the vehicle into auto mode - vehicle.mode = VehicleMode(mode) - - -def updateGUI(label, value): - label['text'] = value - -def addObserverAndInit(name, cb): - """We go ahead and call our observer once at startup to get an initial value""" - vehicle.add_attribute_listener(name, cb) - -root = Tk() -root.wm_title("microGCS - the worlds crummiest GCS") -frame = Frame(root) -frame.pack() - -locationLabel = Label(frame, text = "No location", width=60) -locationLabel.pack() -attitudeLabel = Label(frame, text = "No Att", width=60) -attitudeLabel.pack() -modeLabel = Label(frame, text = "mode") -modeLabel.pack() - -addObserverAndInit('attitude', lambda vehicle, name, attitude: updateGUI(attitudeLabel, vehicle.attitude)) -addObserverAndInit('location', lambda vehicle, name, location: updateGUI(locationLabel, str(location.global_frame))) -addObserverAndInit('mode', lambda vehicle,name,mode: updateGUI(modeLabel, mode)) - -Button(frame, text = "Auto", command = lambda : setMode("AUTO")).pack() -Button(frame, text = "RTL", command = lambda : setMode("RTL")).pack() - -root.mainloop() - -# Shut down simulator if it was started. -if sitl is not None: - sitl.stop() diff --git a/simulation/extension_docker/dronekit-python/examples/gcs/screenshot.png b/simulation/extension_docker/dronekit-python/examples/gcs/screenshot.png deleted file mode 100644 index 0ebb3ed8..00000000 Binary files a/simulation/extension_docker/dronekit-python/examples/gcs/screenshot.png and /dev/null differ diff --git a/simulation/extension_docker/dronekit-python/examples/guided_set_speed_yaw/guided_set_speed_yaw.py b/simulation/extension_docker/dronekit-python/examples/guided_set_speed_yaw/guided_set_speed_yaw.py deleted file mode 100644 index 3dee7302..00000000 --- a/simulation/extension_docker/dronekit-python/examples/guided_set_speed_yaw/guided_set_speed_yaw.py +++ /dev/null @@ -1,649 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. -guided_set_speed_yaw.py: (Copter Only) - -This example shows how to move/direct Copter and send commands in GUIDED mode using DroneKit Python. - -Example documentation: http://python.dronekit.io/examples/guided-set-speed-yaw-demo.html -""" -from __future__ import print_function - -from dronekit import connect, VehicleMode, LocationGlobal, LocationGlobalRelative -from pymavlink import mavutil # Needed for command message definitions -import time -import math - - -#Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Control Copter and send commands in GUIDED mode ') -parser.add_argument('--connect', - help="Vehicle connection target string. If not specified, SITL automatically started and used.") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - - -#Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - - -def arm_and_takeoff(aTargetAltitude): - """ - Arms vehicle and fly to aTargetAltitude. - """ - - print("Basic pre-arm checks") - # Don't let the user try to arm until autopilot is ready - while not vehicle.is_armable: - print(" Waiting for vehicle to initialise...") - time.sleep(1) - - - print("Arming motors") - # Copter should arm in GUIDED mode - vehicle.mode = VehicleMode("GUIDED") - vehicle.armed = True - - while not vehicle.armed: - print(" Waiting for arming...") - time.sleep(1) - - print("Taking off!") - vehicle.simple_takeoff(aTargetAltitude) # Take off to target altitude - - # Wait until the vehicle reaches a safe height before processing the goto (otherwise the command - # after Vehicle.simple_takeoff will execute immediately). - while True: - print(" Altitude: ", vehicle.location.global_relative_frame.alt) - if vehicle.location.global_relative_frame.alt>=aTargetAltitude*0.95: #Trigger just below target alt. - print("Reached target altitude") - break - time.sleep(1) - - -#Arm and take of to altitude of 5 meters -arm_and_takeoff(5) - - - -""" -Convenience functions for sending immediate/guided mode commands to control the Copter. - -The set of commands demonstrated here include: -* MAV_CMD_CONDITION_YAW - set direction of the front of the Copter (latitude, longitude) -* MAV_CMD_DO_SET_ROI - set direction where the camera gimbal is aimed (latitude, longitude, altitude) -* MAV_CMD_DO_CHANGE_SPEED - set target speed in metres/second. - - -The full set of available commands are listed here: -http://dev.ardupilot.com/wiki/copter-commands-in-guided-mode/ -""" - -def condition_yaw(heading, relative=False): - """ - Send MAV_CMD_CONDITION_YAW message to point vehicle at a specified heading (in degrees). - - This method sets an absolute heading by default, but you can set the `relative` parameter - to `True` to set yaw relative to the current yaw heading. - - By default the yaw of the vehicle will follow the direction of travel. After setting - the yaw using this function there is no way to return to the default yaw "follow direction - of travel" behaviour (https://github.com/diydrones/ardupilot/issues/2427) - - For more information see: - http://copter.ardupilot.com/wiki/common-mavlink-mission-command-messages-mav_cmd/#mav_cmd_condition_yaw - """ - if relative: - is_relative = 1 #yaw relative to direction of travel - else: - is_relative = 0 #yaw is an absolute angle - # create the CONDITION_YAW command using command_long_encode() - msg = vehicle.message_factory.command_long_encode( - 0, 0, # target system, target component - mavutil.mavlink.MAV_CMD_CONDITION_YAW, #command - 0, #confirmation - heading, # param 1, yaw in degrees - 0, # param 2, yaw speed deg/s - 1, # param 3, direction -1 ccw, 1 cw - is_relative, # param 4, relative offset 1, absolute angle 0 - 0, 0, 0) # param 5 ~ 7 not used - # send command to vehicle - vehicle.send_mavlink(msg) - - -def set_roi(location): - """ - Send MAV_CMD_DO_SET_ROI message to point camera gimbal at a - specified region of interest (LocationGlobal). - The vehicle may also turn to face the ROI. - - For more information see: - http://copter.ardupilot.com/common-mavlink-mission-command-messages-mav_cmd/#mav_cmd_do_set_roi - """ - # create the MAV_CMD_DO_SET_ROI command - msg = vehicle.message_factory.command_long_encode( - 0, 0, # target system, target component - mavutil.mavlink.MAV_CMD_DO_SET_ROI, #command - 0, #confirmation - 0, 0, 0, 0, #params 1-4 - location.lat, - location.lon, - location.alt - ) - # send command to vehicle - vehicle.send_mavlink(msg) - - - -""" -Functions to make it easy to convert between the different frames-of-reference. In particular these -make it easy to navigate in terms of "metres from the current position" when using commands that take -absolute positions in decimal degrees. - -The methods are approximations only, and may be less accurate over longer distances, and when close -to the Earth's poles. - -Specifically, it provides: -* get_location_metres - Get LocationGlobal (decimal degrees) at distance (m) North & East of a given LocationGlobal. -* get_distance_metres - Get the distance between two LocationGlobal objects in metres -* get_bearing - Get the bearing in degrees to a LocationGlobal -""" - -def get_location_metres(original_location, dNorth, dEast): - """ - Returns a LocationGlobal object containing the latitude/longitude `dNorth` and `dEast` metres from the - specified `original_location`. The returned LocationGlobal has the same `alt` value - as `original_location`. - - The function is useful when you want to move the vehicle around specifying locations relative to - the current vehicle position. - - The algorithm is relatively accurate over small distances (10m within 1km) except close to the poles. - - For more information see: - http://gis.stackexchange.com/questions/2951/algorithm-for-offsetting-a-latitude-longitude-by-some-amount-of-meters - """ - earth_radius = 6378137.0 #Radius of "spherical" earth - #Coordinate offsets in radians - dLat = dNorth/earth_radius - dLon = dEast/(earth_radius*math.cos(math.pi*original_location.lat/180)) - - #New position in decimal degrees - newlat = original_location.lat + (dLat * 180/math.pi) - newlon = original_location.lon + (dLon * 180/math.pi) - if type(original_location) is LocationGlobal: - targetlocation=LocationGlobal(newlat, newlon,original_location.alt) - elif type(original_location) is LocationGlobalRelative: - targetlocation=LocationGlobalRelative(newlat, newlon,original_location.alt) - else: - raise Exception("Invalid Location object passed") - - return targetlocation; - - -def get_distance_metres(aLocation1, aLocation2): - """ - Returns the ground distance in metres between two LocationGlobal objects. - - This method is an approximation, and will not be accurate over large distances and close to the - earth's poles. It comes from the ArduPilot test code: - https://github.com/diydrones/ardupilot/blob/master/Tools/autotest/common.py - """ - dlat = aLocation2.lat - aLocation1.lat - dlong = aLocation2.lon - aLocation1.lon - return math.sqrt((dlat*dlat) + (dlong*dlong)) * 1.113195e5 - - -def get_bearing(aLocation1, aLocation2): - """ - Returns the bearing between the two LocationGlobal objects passed as parameters. - - This method is an approximation, and may not be accurate over large distances and close to the - earth's poles. It comes from the ArduPilot test code: - https://github.com/diydrones/ardupilot/blob/master/Tools/autotest/common.py - """ - off_x = aLocation2.lon - aLocation1.lon - off_y = aLocation2.lat - aLocation1.lat - bearing = 90.00 + math.atan2(-off_y, off_x) * 57.2957795 - if bearing < 0: - bearing += 360.00 - return bearing; - - - -""" -Functions to move the vehicle to a specified position (as opposed to controlling movement by setting velocity components). - -The methods include: -* goto_position_target_global_int - Sets position using SET_POSITION_TARGET_GLOBAL_INT command in - MAV_FRAME_GLOBAL_RELATIVE_ALT_INT frame -* goto_position_target_local_ned - Sets position using SET_POSITION_TARGET_LOCAL_NED command in - MAV_FRAME_BODY_NED frame -* goto - A convenience function that can use Vehicle.simple_goto (default) or - goto_position_target_global_int to travel to a specific position in metres - North and East from the current location. - This method reports distance to the destination. -""" - -def goto_position_target_global_int(aLocation): - """ - Send SET_POSITION_TARGET_GLOBAL_INT command to request the vehicle fly to a specified LocationGlobal. - - For more information see: https://pixhawk.ethz.ch/mavlink/#SET_POSITION_TARGET_GLOBAL_INT - - See the above link for information on the type_mask (0=enable, 1=ignore). - At time of writing, acceleration and yaw bits are ignored. - """ - msg = vehicle.message_factory.set_position_target_global_int_encode( - 0, # time_boot_ms (not used) - 0, 0, # target system, target component - mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT_INT, # frame - 0b0000111111111000, # type_mask (only speeds enabled) - aLocation.lat*1e7, # lat_int - X Position in WGS84 frame in 1e7 * meters - aLocation.lon*1e7, # lon_int - Y Position in WGS84 frame in 1e7 * meters - aLocation.alt, # alt - Altitude in meters in AMSL altitude, not WGS84 if absolute or relative, above terrain if GLOBAL_TERRAIN_ALT_INT - 0, # X velocity in NED frame in m/s - 0, # Y velocity in NED frame in m/s - 0, # Z velocity in NED frame in m/s - 0, 0, 0, # afx, afy, afz acceleration (not supported yet, ignored in GCS_Mavlink) - 0, 0) # yaw, yaw_rate (not supported yet, ignored in GCS_Mavlink) - # send command to vehicle - vehicle.send_mavlink(msg) - - - -def goto_position_target_local_ned(north, east, down): - """ - Send SET_POSITION_TARGET_LOCAL_NED command to request the vehicle fly to a specified - location in the North, East, Down frame. - - It is important to remember that in this frame, positive altitudes are entered as negative - "Down" values. So if down is "10", this will be 10 metres below the home altitude. - - Starting from AC3.3 the method respects the frame setting. Prior to that the frame was - ignored. For more information see: - http://dev.ardupilot.com/wiki/copter-commands-in-guided-mode/#set_position_target_local_ned - - See the above link for information on the type_mask (0=enable, 1=ignore). - At time of writing, acceleration and yaw bits are ignored. - - """ - msg = vehicle.message_factory.set_position_target_local_ned_encode( - 0, # time_boot_ms (not used) - 0, 0, # target system, target component - mavutil.mavlink.MAV_FRAME_LOCAL_NED, # frame - 0b0000111111111000, # type_mask (only positions enabled) - north, east, down, # x, y, z positions (or North, East, Down in the MAV_FRAME_BODY_NED frame - 0, 0, 0, # x, y, z velocity in m/s (not used) - 0, 0, 0, # x, y, z acceleration (not supported yet, ignored in GCS_Mavlink) - 0, 0) # yaw, yaw_rate (not supported yet, ignored in GCS_Mavlink) - # send command to vehicle - vehicle.send_mavlink(msg) - - - -def goto(dNorth, dEast, gotoFunction=vehicle.simple_goto): - """ - Moves the vehicle to a position dNorth metres North and dEast metres East of the current position. - - The method takes a function pointer argument with a single `dronekit.lib.LocationGlobal` parameter for - the target position. This allows it to be called with different position-setting commands. - By default it uses the standard method: dronekit.lib.Vehicle.simple_goto(). - - The method reports the distance to target every two seconds. - """ - - currentLocation = vehicle.location.global_relative_frame - targetLocation = get_location_metres(currentLocation, dNorth, dEast) - targetDistance = get_distance_metres(currentLocation, targetLocation) - gotoFunction(targetLocation) - - #print "DEBUG: targetLocation: %s" % targetLocation - #print "DEBUG: targetLocation: %s" % targetDistance - - while vehicle.mode.name=="GUIDED": #Stop action if we are no longer in guided mode. - #print "DEBUG: mode: %s" % vehicle.mode.name - remainingDistance=get_distance_metres(vehicle.location.global_relative_frame, targetLocation) - print("Distance to target: ", remainingDistance) - if remainingDistance<=targetDistance*0.01: #Just below target, in case of undershoot. - print("Reached target") - break; - time.sleep(2) - - - -""" -Functions that move the vehicle by specifying the velocity components in each direction. -The two functions use different MAVLink commands. The main difference is -that depending on the frame used, the NED velocity can be relative to the vehicle -orientation. - -The methods include: -* send_ned_velocity - Sets velocity components using SET_POSITION_TARGET_LOCAL_NED command -* send_global_velocity - Sets velocity components using SET_POSITION_TARGET_GLOBAL_INT command -""" - -def send_ned_velocity(velocity_x, velocity_y, velocity_z, duration): - """ - Move vehicle in direction based on specified velocity vectors and - for the specified duration. - - This uses the SET_POSITION_TARGET_LOCAL_NED command with a type mask enabling only - velocity components - (http://dev.ardupilot.com/wiki/copter-commands-in-guided-mode/#set_position_target_local_ned). - - Note that from AC3.3 the message should be re-sent every second (after about 3 seconds - with no message the velocity will drop back to zero). In AC3.2.1 and earlier the specified - velocity persists until it is canceled. The code below should work on either version - (sending the message multiple times does not cause problems). - - See the above link for information on the type_mask (0=enable, 1=ignore). - At time of writing, acceleration and yaw bits are ignored. - """ - msg = vehicle.message_factory.set_position_target_local_ned_encode( - 0, # time_boot_ms (not used) - 0, 0, # target system, target component - mavutil.mavlink.MAV_FRAME_LOCAL_NED, # frame - 0b0000111111000111, # type_mask (only speeds enabled) - 0, 0, 0, # x, y, z positions (not used) - velocity_x, velocity_y, velocity_z, # x, y, z velocity in m/s - 0, 0, 0, # x, y, z acceleration (not supported yet, ignored in GCS_Mavlink) - 0, 0) # yaw, yaw_rate (not supported yet, ignored in GCS_Mavlink) - - # send command to vehicle on 1 Hz cycle - for x in range(0,duration): - vehicle.send_mavlink(msg) - time.sleep(1) - - - - -def send_global_velocity(velocity_x, velocity_y, velocity_z, duration): - """ - Move vehicle in direction based on specified velocity vectors. - - This uses the SET_POSITION_TARGET_GLOBAL_INT command with type mask enabling only - velocity components - (http://dev.ardupilot.com/wiki/copter-commands-in-guided-mode/#set_position_target_global_int). - - Note that from AC3.3 the message should be re-sent every second (after about 3 seconds - with no message the velocity will drop back to zero). In AC3.2.1 and earlier the specified - velocity persists until it is canceled. The code below should work on either version - (sending the message multiple times does not cause problems). - - See the above link for information on the type_mask (0=enable, 1=ignore). - At time of writing, acceleration and yaw bits are ignored. - """ - msg = vehicle.message_factory.set_position_target_global_int_encode( - 0, # time_boot_ms (not used) - 0, 0, # target system, target component - mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT_INT, # frame - 0b0000111111000111, # type_mask (only speeds enabled) - 0, # lat_int - X Position in WGS84 frame in 1e7 * meters - 0, # lon_int - Y Position in WGS84 frame in 1e7 * meters - 0, # alt - Altitude in meters in AMSL altitude(not WGS84 if absolute or relative) - # altitude above terrain if GLOBAL_TERRAIN_ALT_INT - velocity_x, # X velocity in NED frame in m/s - velocity_y, # Y velocity in NED frame in m/s - velocity_z, # Z velocity in NED frame in m/s - 0, 0, 0, # afx, afy, afz acceleration (not supported yet, ignored in GCS_Mavlink) - 0, 0) # yaw, yaw_rate (not supported yet, ignored in GCS_Mavlink) - - # send command to vehicle on 1 Hz cycle - for x in range(0,duration): - vehicle.send_mavlink(msg) - time.sleep(1) - - -""" -Fly a triangular path using the standard Vehicle.simple_goto() method. - -The method is called indirectly via a custom "goto" that allows the target position to be -specified as a distance in metres (North/East) from the current position, and which reports -the distance-to-target. -""" -print("TRIANGLE path using standard Vehicle.simple_goto()") - -print("Set groundspeed to 5m/s.") -vehicle.groundspeed=5 - -print("Position North 80 West 50") -goto(80, -50) - -print("Position North 0 East 100") -goto(0, 100) - -print("Position North -80 West 50") -goto(-80, -50) - - - - -""" -Fly a triangular path using the SET_POSITION_TARGET_GLOBAL_INT command and specifying -a target position (rather than controlling movement using velocity vectors). The command is -called from goto_position_target_global_int() (via `goto`). - -The goto_position_target_global_int method is called indirectly from a custom "goto" that allows -the target position to be specified as a distance in metres (North/East) from the current position, -and which reports the distance-to-target. - -The code also sets the speed (MAV_CMD_DO_CHANGE_SPEED). In AC3.2.1 Copter will accelerate to this speed -near the centre of its journey and then decelerate as it reaches the target. -In AC3.3 the speed changes immediately. -""" -print("TRIANGLE path using standard SET_POSITION_TARGET_GLOBAL_INT message and with varying speed.") -print("Position South 100 West 130") - -print("Set groundspeed to 5m/s.") -vehicle.groundspeed = 5 -goto(-100, -130, goto_position_target_global_int) - -print("Set groundspeed to 15m/s (max).") -vehicle.groundspeed = 15 -print("Position South 0 East 200") -goto(0, 260, goto_position_target_global_int) - -print("Set airspeed to 10m/s (max).") -vehicle.airspeed = 10 - -print("Position North 100 West 130") -goto(100, -130, goto_position_target_global_int) - - - -""" -Fly the vehicle in a 50m square path, using the SET_POSITION_TARGET_LOCAL_NED command -and specifying a target position (rather than controlling movement using velocity vectors). -The command is called from goto_position_target_local_ned() (via `goto`). - -The position is specified in terms of the NED (North East Down) relative to the Home location. - -WARNING: The "D" in NED means "Down". Using a positive D value will drive the vehicle into the ground! - -The code sleeps for a time (DURATION) to give the vehicle time to reach each position (rather than -sending commands based on proximity). - -The code also sets the region of interest (MAV_CMD_DO_SET_ROI) via the `set_roi()` method. This points the -camera gimbal at the the selected location (in this case it aligns the whole vehicle to point at the ROI). -""" - -print("SQUARE path using SET_POSITION_TARGET_LOCAL_NED and position parameters") -DURATION = 20 #Set duration for each segment. - -print("North 50m, East 0m, 10m altitude for %s seconds" % DURATION) -goto_position_target_local_ned(50,0,-10) -print("Point ROI at current location (home position)") -# NOTE that this has to be called after the goto command as first "move" command of a particular type -# "resets" ROI/YAW commands -set_roi(vehicle.location.global_relative_frame) -time.sleep(DURATION) - -print("North 50m, East 50m, 10m altitude") -goto_position_target_local_ned(50,50,-10) -time.sleep(DURATION) - -print("Point ROI at current location") -set_roi(vehicle.location.global_relative_frame) - -print("North 0m, East 50m, 10m altitude") -goto_position_target_local_ned(0,50,-10) -time.sleep(DURATION) - -print("North 0m, East 0m, 10m altitude") -goto_position_target_local_ned(0,0,-10) -time.sleep(DURATION) - - - -""" -Fly the vehicle in a SQUARE path using velocity vectors (the underlying code calls the -SET_POSITION_TARGET_LOCAL_NED command with the velocity parameters enabled). - -The thread sleeps for a time (DURATION) which defines the distance that will be travelled. - -The code also sets the yaw (MAV_CMD_CONDITION_YAW) using the `set_yaw()` method in each segment -so that the front of the vehicle points in the direction of travel -""" - - -#Set up velocity vector to map to each direction. -# vx > 0 => fly North -# vx < 0 => fly South -NORTH = 2 -SOUTH = -2 - -# Note for vy: -# vy > 0 => fly East -# vy < 0 => fly West -EAST = 2 -WEST = -2 - -# Note for vz: -# vz < 0 => ascend -# vz > 0 => descend -UP = -0.5 -DOWN = 0.5 - - -# Square path using velocity -print("SQUARE path using SET_POSITION_TARGET_LOCAL_NED and velocity parameters") - -print("Yaw 180 absolute (South)") -condition_yaw(180) - -print("Velocity South & up") -send_ned_velocity(SOUTH,0,UP,DURATION) -send_ned_velocity(0,0,0,1) - - -print("Yaw 270 absolute (West)") -condition_yaw(270) - -print("Velocity West & down") -send_ned_velocity(0,WEST,DOWN,DURATION) -send_ned_velocity(0,0,0,1) - - -print("Yaw 0 absolute (North)") -condition_yaw(0) - -print("Velocity North") -send_ned_velocity(NORTH,0,0,DURATION) -send_ned_velocity(0,0,0,1) - - -print("Yaw 90 absolute (East)") -condition_yaw(90) - -print("Velocity East") -send_ned_velocity(0,EAST,0,DURATION) -send_ned_velocity(0,0,0,1) - - -""" -Fly the vehicle in a DIAMOND path using velocity vectors (the underlying code calls the -SET_POSITION_TARGET_GLOBAL_INT command with the velocity parameters enabled). - -The thread sleeps for a time (DURATION) which defines the distance that will be travelled. - -The code sets the yaw (MAV_CMD_CONDITION_YAW) using the `set_yaw()` method using relative headings -so that the front of the vehicle points in the direction of travel. - -At the end of the second segment the code sets a new home location to the current point. -""" - -print("DIAMOND path using SET_POSITION_TARGET_GLOBAL_INT and velocity parameters") -# vx, vy are parallel to North and East (independent of the vehicle orientation) - -print("Yaw 225 absolute") -condition_yaw(225) - -print("Velocity South, West and Up") -send_global_velocity(SOUTH,WEST,UP,DURATION) -send_global_velocity(0,0,0,1) - - -print("Yaw 90 relative (to previous yaw heading)") -condition_yaw(90,relative=True) - -print("Velocity North, West and Down") -send_global_velocity(NORTH,WEST,DOWN,DURATION) -send_global_velocity(0,0,0,1) - -print("Set new home location to current location") -vehicle.home_location=vehicle.location.global_frame -print("Get new home location") -#This reloads the home location in DroneKit and GCSs -cmds = vehicle.commands -cmds.download() -cmds.wait_ready() -print(" Home Location: %s" % vehicle.home_location) - - -print("Yaw 90 relative (to previous yaw heading)") -condition_yaw(90,relative=True) - -print("Velocity North and East") -send_global_velocity(NORTH,EAST,0,DURATION) -send_global_velocity(0,0,0,1) - - -print("Yaw 90 relative (to previous yaw heading)") -condition_yaw(90,relative=True) - -print("Velocity South and East") -send_global_velocity(SOUTH,EAST,0,DURATION) -send_global_velocity(0,0,0,1) - - -""" -The example is completing. LAND at current location. -""" - -print("Setting LAND mode...") -vehicle.mode = VehicleMode("LAND") - - -#Close vehicle object before exiting script -print("Close vehicle object") -vehicle.close() - -# Shut down simulator if it was started. -if sitl is not None: - sitl.stop() - -print("Completed") diff --git a/simulation/extension_docker/dronekit-python/examples/mission_basic/mission_basic.py b/simulation/extension_docker/dronekit-python/examples/mission_basic/mission_basic.py deleted file mode 100644 index 226d327d..00000000 --- a/simulation/extension_docker/dronekit-python/examples/mission_basic/mission_basic.py +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. -mission_basic.py: Example demonstrating basic mission operations including creating, clearing and monitoring missions. - -Full documentation is provided at https://dronekit-python.readthedocs.io/en/latest/examples/mission_basic.html -""" -from __future__ import print_function - -from dronekit import connect, VehicleMode, LocationGlobalRelative, LocationGlobal, Command -import time -import math -from pymavlink import mavutil - - -#Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Demonstrates basic mission operations.') -parser.add_argument('--connect', - help="vehicle connection target string. If not specified, SITL automatically started and used.") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - - -#Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - - -def get_location_metres(original_location, dNorth, dEast): - """ - Returns a LocationGlobal object containing the latitude/longitude `dNorth` and `dEast` metres from the - specified `original_location`. The returned Location has the same `alt` value - as `original_location`. - - The function is useful when you want to move the vehicle around specifying locations relative to - the current vehicle position. - The algorithm is relatively accurate over small distances (10m within 1km) except close to the poles. - For more information see: - http://gis.stackexchange.com/questions/2951/algorithm-for-offsetting-a-latitude-longitude-by-some-amount-of-meters - """ - earth_radius=6378137.0 #Radius of "spherical" earth - #Coordinate offsets in radians - dLat = dNorth/earth_radius - dLon = dEast/(earth_radius*math.cos(math.pi*original_location.lat/180)) - - #New position in decimal degrees - newlat = original_location.lat + (dLat * 180/math.pi) - newlon = original_location.lon + (dLon * 180/math.pi) - return LocationGlobal(newlat, newlon,original_location.alt) - - -def get_distance_metres(aLocation1, aLocation2): - """ - Returns the ground distance in metres between two LocationGlobal objects. - - This method is an approximation, and will not be accurate over large distances and close to the - earth's poles. It comes from the ArduPilot test code: - https://github.com/diydrones/ardupilot/blob/master/Tools/autotest/common.py - """ - dlat = aLocation2.lat - aLocation1.lat - dlong = aLocation2.lon - aLocation1.lon - return math.sqrt((dlat*dlat) + (dlong*dlong)) * 1.113195e5 - - - -def distance_to_current_waypoint(): - """ - Gets distance in metres to the current waypoint. - It returns None for the first waypoint (Home location). - """ - nextwaypoint = vehicle.commands.next - if nextwaypoint==0: - return None - missionitem=vehicle.commands[nextwaypoint-1] #commands are zero indexed - lat = missionitem.x - lon = missionitem.y - alt = missionitem.z - targetWaypointLocation = LocationGlobalRelative(lat,lon,alt) - distancetopoint = get_distance_metres(vehicle.location.global_frame, targetWaypointLocation) - return distancetopoint - - -def download_mission(): - """ - Download the current mission from the vehicle. - """ - cmds = vehicle.commands - cmds.download() - cmds.wait_ready() # wait until download is complete. - - - -def adds_square_mission(aLocation, aSize): - """ - Adds a takeoff command and four waypoint commands to the current mission. - The waypoints are positioned to form a square of side length 2*aSize around the specified LocationGlobal (aLocation). - - The function assumes vehicle.commands matches the vehicle mission state - (you must have called download at least once in the session and after clearing the mission) - """ - - cmds = vehicle.commands - - print(" Clear any existing commands") - cmds.clear() - - print(" Define/add new commands.") - # Add new commands. The meaning/order of the parameters is documented in the Command class. - - #Add MAV_CMD_NAV_TAKEOFF command. This is ignored if the vehicle is already in the air. - cmds.add(Command( 0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 0, 0, 0, 0, 0, 0, 10)) - - #Define the four MAV_CMD_NAV_WAYPOINT locations and add the commands - point1 = get_location_metres(aLocation, aSize, -aSize) - point2 = get_location_metres(aLocation, aSize, aSize) - point3 = get_location_metres(aLocation, -aSize, aSize) - point4 = get_location_metres(aLocation, -aSize, -aSize) - cmds.add(Command( 0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 0, 0, 0, 0, point1.lat, point1.lon, 11)) - cmds.add(Command( 0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 0, 0, 0, 0, point2.lat, point2.lon, 12)) - cmds.add(Command( 0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 0, 0, 0, 0, point3.lat, point3.lon, 13)) - cmds.add(Command( 0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 0, 0, 0, 0, point4.lat, point4.lon, 14)) - #add dummy waypoint "5" at point 4 (lets us know when have reached destination) - cmds.add(Command( 0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 0, 0, 0, 0, point4.lat, point4.lon, 14)) - - print(" Upload new commands to vehicle") - cmds.upload() - - -def arm_and_takeoff(aTargetAltitude): - """ - Arms vehicle and fly to aTargetAltitude. - """ - - print("Basic pre-arm checks") - # Don't let the user try to arm until autopilot is ready - while not vehicle.is_armable: - print(" Waiting for vehicle to initialise...") - time.sleep(1) - - - print("Arming motors") - # Copter should arm in GUIDED mode - vehicle.mode = VehicleMode("GUIDED") - vehicle.armed = True - - while not vehicle.armed: - print(" Waiting for arming...") - time.sleep(1) - - print("Taking off!") - vehicle.simple_takeoff(aTargetAltitude) # Take off to target altitude - - # Wait until the vehicle reaches a safe height before processing the goto (otherwise the command - # after Vehicle.simple_takeoff will execute immediately). - while True: - print(" Altitude: ", vehicle.location.global_relative_frame.alt) - if vehicle.location.global_relative_frame.alt>=aTargetAltitude*0.95: #Trigger just below target alt. - print("Reached target altitude") - break - time.sleep(1) - - -print('Create a new mission (for current location)') -adds_square_mission(vehicle.location.global_frame,50) - - -# From Copter 3.3 you will be able to take off using a mission item. Plane must take off using a mission item (currently). -arm_and_takeoff(10) - -print("Starting mission") -# Reset mission set to first (0) waypoint -vehicle.commands.next=0 - -# Set mode to AUTO to start mission -vehicle.mode = VehicleMode("AUTO") - - -# Monitor mission. -# Demonstrates getting and setting the command number -# Uses distance_to_current_waypoint(), a convenience function for finding the -# distance to the next waypoint. - -while True: - nextwaypoint=vehicle.commands.next - print('Distance to waypoint (%s): %s' % (nextwaypoint, distance_to_current_waypoint())) - - if nextwaypoint==3: #Skip to next waypoint - print('Skipping to Waypoint 5 when reach waypoint 3') - vehicle.commands.next = 5 - if nextwaypoint==5: #Dummy waypoint - as soon as we reach waypoint 4 this is true and we exit. - print("Exit 'standard' mission when start heading to final waypoint (5)") - break; - time.sleep(1) - -print('Return to launch') -vehicle.mode = VehicleMode("RTL") - - -#Close vehicle object before exiting script -print("Close vehicle object") -vehicle.close() - -# Shut down simulator if it was started. -if sitl is not None: - sitl.stop() diff --git a/simulation/extension_docker/dronekit-python/examples/mission_import_export/mission_import_export.py b/simulation/extension_docker/dronekit-python/examples/mission_import_export/mission_import_export.py deleted file mode 100644 index fc36e7f9..00000000 --- a/simulation/extension_docker/dronekit-python/examples/mission_import_export/mission_import_export.py +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. -mission_import_export.py: - -This example demonstrates how to import and export files in the Waypoint file format -(http://qgroundcontrol.org/mavlink/waypoint_protocol#waypoint_file_format). The commands are imported -into a list, and can be modified before saving and/or uploading. - -Documentation is provided at http://python.dronekit.io/examples/mission_import_export.html -""" -from __future__ import print_function - - -from dronekit import connect, Command -import time - - -#Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Demonstrates mission import/export from a file.') -parser.add_argument('--connect', - help="Vehicle connection target string. If not specified, SITL automatically started and used.") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - - -#Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - -# Check that vehicle is armable. -# This ensures home_location is set (needed when saving WP file) - -while not vehicle.is_armable: - print(" Waiting for vehicle to initialise...") - time.sleep(1) - - -def readmission(aFileName): - """ - Load a mission from a file into a list. The mission definition is in the Waypoint file - format (http://qgroundcontrol.org/mavlink/waypoint_protocol#waypoint_file_format). - - This function is used by upload_mission(). - """ - print("\nReading mission from file: %s" % aFileName) - cmds = vehicle.commands - missionlist=[] - with open(aFileName) as f: - for i, line in enumerate(f): - if i==0: - if not line.startswith('QGC WPL 110'): - raise Exception('File is not supported WP version') - else: - linearray=line.split('\t') - ln_index=int(linearray[0]) - ln_currentwp=int(linearray[1]) - ln_frame=int(linearray[2]) - ln_command=int(linearray[3]) - ln_param1=float(linearray[4]) - ln_param2=float(linearray[5]) - ln_param3=float(linearray[6]) - ln_param4=float(linearray[7]) - ln_param5=float(linearray[8]) - ln_param6=float(linearray[9]) - ln_param7=float(linearray[10]) - ln_autocontinue=int(linearray[11].strip()) - cmd = Command( 0, 0, 0, ln_frame, ln_command, ln_currentwp, ln_autocontinue, ln_param1, ln_param2, ln_param3, ln_param4, ln_param5, ln_param6, ln_param7) - missionlist.append(cmd) - return missionlist - - -def upload_mission(aFileName): - """ - Upload a mission from a file. - """ - #Read mission from file - missionlist = readmission(aFileName) - - print("\nUpload mission from a file: %s" % aFileName) - #Clear existing mission from vehicle - print(' Clear mission') - cmds = vehicle.commands - cmds.clear() - #Add new mission to vehicle - for command in missionlist: - cmds.add(command) - print(' Upload mission') - vehicle.commands.upload() - - -def download_mission(): - """ - Downloads the current mission and returns it in a list. - It is used in save_mission() to get the file information to save. - """ - print(" Download mission from vehicle") - missionlist=[] - cmds = vehicle.commands - cmds.download() - cmds.wait_ready() - for cmd in cmds: - missionlist.append(cmd) - return missionlist - -def save_mission(aFileName): - """ - Save a mission in the Waypoint file format - (http://qgroundcontrol.org/mavlink/waypoint_protocol#waypoint_file_format). - """ - print("\nSave mission from Vehicle to file: %s" % aFileName) - #Download mission from vehicle - missionlist = download_mission() - #Add file-format information - output='QGC WPL 110\n' - #Add home location as 0th waypoint - home = vehicle.home_location - output+="%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (0,1,0,16,0,0,0,0,home.lat,home.lon,home.alt,1) - #Add commands - for cmd in missionlist: - commandline="%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (cmd.seq,cmd.current,cmd.frame,cmd.command,cmd.param1,cmd.param2,cmd.param3,cmd.param4,cmd.x,cmd.y,cmd.z,cmd.autocontinue) - output+=commandline - with open(aFileName, 'w') as file_: - print(" Write mission to file") - file_.write(output) - - -def printfile(aFileName): - """ - Print a mission file to demonstrate "round trip" - """ - print("\nMission file: %s" % aFileName) - with open(aFileName) as f: - for line in f: - print(' %s' % line.strip()) - - -import_mission_filename = 'mpmission.txt' -export_mission_filename = 'exportedmission.txt' - - -#Upload mission from file -upload_mission(import_mission_filename) - -#Download mission we just uploaded and save to a file -save_mission(export_mission_filename) - -#Close vehicle object before exiting script -print("Close vehicle object") -vehicle.close() - -# Shut down simulator if it was started. -if sitl is not None: - sitl.stop() - - -print("\nShow original and uploaded/downloaded files:") -#Print original file (for demo purposes only) -printfile(import_mission_filename) -#Print exported file (for demo purposes only) -printfile(export_mission_filename) diff --git a/simulation/extension_docker/dronekit-python/examples/mission_import_export/mpmission.txt b/simulation/extension_docker/dronekit-python/examples/mission_import_export/mpmission.txt deleted file mode 100644 index 2ca281d0..00000000 --- a/simulation/extension_docker/dronekit-python/examples/mission_import_export/mpmission.txt +++ /dev/null @@ -1,8 +0,0 @@ -QGC WPL 110 -0 1 0 16 0 0 0 0 -35.363262 149.165237 584.000000 1 -1 0 0 22 0.000000 0.000000 0.000000 0.000000 -35.361988 149.163753 100.000000 1 -2 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.361992 149.163593 100.000000 1 -3 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.363812 149.163609 100.000000 1 -4 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.363768 149.166055 100.000000 1 -5 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.361835 149.166012 100.000000 1 -6 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.362150 149.165046 100.000000 1 diff --git a/simulation/extension_docker/dronekit-python/examples/performance_test/performance_test.py b/simulation/extension_docker/dronekit-python/examples/performance_test/performance_test.py deleted file mode 100644 index 2be53b46..00000000 --- a/simulation/extension_docker/dronekit-python/examples/performance_test/performance_test.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. -performance_test.py: - -This performance test logs the interval between messages being -sent by Dronekit-Python and an acknowledgment being received -from the autopilot. It provides a running report of the maximum, -minimum, and most recent interval for 30 seconds. - -Full documentation is provided at http://python.dronekit.io/examples/performance_test.html -""" -from __future__ import print_function -from dronekit import connect -from pymavlink import mavutil -import time -import sys -from datetime import datetime - - -#Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Generates max, min and current interval between message sent and ack recieved. Will start and connect to SITL if no connection string specified.') -parser.add_argument('--connect', - help="vehicle connection target string. If not specified, SITL automatically started and used.") -args = parser.parse_args() - -connection_string=args.connect - -#Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - -#global vehicle - - -def cur_usec(): - """Return current time in usecs""" - # t = time.time() - dt = datetime.now() - t = dt.minute * 60 + dt.second + dt.microsecond / (1e6) - return t - -class MeasureTime(object): - def __init__(self): - self.prevtime = cur_usec() - self.previnterval = 0 - self.numcount = 0 - self.reset() - - def reset(self): - self.maxinterval = 0 - self.mininterval = 10000 - - def log(self): - #print "Interval", self.previnterval - #print "MaxInterval", self.maxinterval - #print "MinInterval", self.mininterval - sys.stdout.write('MaxInterval: %s\tMinInterval: %s\tInterval: %s\r' % (self.maxinterval,self.mininterval, self.previnterval) ) - sys.stdout.flush() - - - def update(self): - now = cur_usec() - self.numcount = self.numcount + 1 - self.previnterval = now - self.prevtime - self.prevtime = now - if self.numcount>1: #ignore first value where self.prevtime not reliable. - self.maxinterval = max(self.previnterval, self.maxinterval) - self.mininterval = min(self.mininterval, self.previnterval) - self.log() - - -acktime = MeasureTime() - - -#Create COMMAND_ACK message listener. -@vehicle.on_message('COMMAND_ACK') -def listener(self, name, message): - acktime.update() - send_testpackets() - - -def send_testpackets(): - #Send message using `command_long_encode` (returns an ACK) - msg = vehicle.message_factory.command_long_encode( - 1, 1, # target system, target component - #mavutil.mavlink.MAV_CMD_DO_SET_RELAY, #command - mavutil.mavlink.MAV_CMD_DO_SET_ROI, #command - 0, #confirmation - 0, 0, 0, 0, #params 1-4 - 0, - 0, - 0 - ) - - vehicle.send_mavlink(msg) - -#Start logging by sending a test packet -send_testpackets() - -print("Logging for 30 seconds") -for x in range(1,30): - time.sleep(1) - -# Close vehicle object before exiting script -vehicle.close() - -if not args.connect: - # Shut down simulator if it was started. - sitl.stop() diff --git a/simulation/extension_docker/dronekit-python/examples/play_tune/play_tune.py b/simulation/extension_docker/dronekit-python/examples/play_tune/play_tune.py deleted file mode 100644 index df099522..00000000 --- a/simulation/extension_docker/dronekit-python/examples/play_tune/play_tune.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2017, Peter Barker -play_tune.py: GUIDED mode "simple goto" example (Copter Only) - -Demonstrates how to play a custom tune on a vehicle using the vehicle's buzzer - -Full documentation is provided at http://python.dronekit.io/examples/play_tune.html -""" - -from __future__ import print_function -import time -from dronekit import connect - - -# Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Play tune on vehicle buzzer.') -parser.add_argument('--connect', - help="Vehicle connection target string. If not specified, SITL automatically started and used.") -parser.add_argument('--tune', type=str, help="tune to play", default="AAAA") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - - -# Start SITL if no connection string specified -if not connection_string: - print("SITL doesn't do tunes?!") - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - -vehicle.play_tune(args.tune) diff --git a/simulation/extension_docker/dronekit-python/examples/reboot/reboot.py b/simulation/extension_docker/dronekit-python/examples/reboot/reboot.py deleted file mode 100755 index 698d1014..00000000 --- a/simulation/extension_docker/dronekit-python/examples/reboot/reboot.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from __future__ import print_function - -from dronekit import connect -import time - -# Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Reboots vehicle') -parser.add_argument('--connect', - help="Vehicle connection target string. If not specified, SITL automatically started and used.") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - - -# Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - -vehicle.reboot() -time.sleep(1) - -# Shut down simulator if it was started. -if sitl: - sitl.stop() diff --git a/simulation/extension_docker/dronekit-python/examples/set_attitude_target/set_attitude_target.py b/simulation/extension_docker/dronekit-python/examples/set_attitude_target/set_attitude_target.py deleted file mode 100755 index d182637b..00000000 --- a/simulation/extension_docker/dronekit-python/examples/set_attitude_target/set_attitude_target.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python - -""" - -set_attitude_target.py: (Copter Only) - -This example shows how to move/direct Copter and send commands - in GUIDED_NOGPS mode using DroneKit Python. - -Caution: A lot of unexpected behaviors may occur in GUIDED_NOGPS mode. - Always watch the drone movement, and make sure that you are in dangerless environment. - Land the drone as soon as possible when it shows any unexpected behavior. - -Tested in Python 2.7.10 - -""" - -from dronekit import connect, VehicleMode, LocationGlobal, LocationGlobalRelative -from pymavlink import mavutil # Needed for command message definitions -import time -import math - -# Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Control Copter and send commands in GUIDED mode ') -parser.add_argument('--connect', - help="Vehicle connection target string. If not specified, SITL automatically started and used.") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - -# Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - -def arm_and_takeoff_nogps(aTargetAltitude): - """ - Arms vehicle and fly to aTargetAltitude without GPS data. - """ - - ##### CONSTANTS ##### - DEFAULT_TAKEOFF_THRUST = 0.7 - SMOOTH_TAKEOFF_THRUST = 0.6 - - print("Basic pre-arm checks") - # Don't let the user try to arm until autopilot is ready - # If you need to disable the arming check, - # just comment it with your own responsibility. - while not vehicle.is_armable: - print(" Waiting for vehicle to initialise...") - time.sleep(1) - - - print("Arming motors") - # Copter should arm in GUIDED_NOGPS mode - vehicle.mode = VehicleMode("GUIDED_NOGPS") - vehicle.armed = True - - while not vehicle.armed: - print(" Waiting for arming...") - vehicle.armed = True - time.sleep(1) - - print("Taking off!") - - thrust = DEFAULT_TAKEOFF_THRUST - while True: - current_altitude = vehicle.location.global_relative_frame.alt - print(" Altitude: %f Desired: %f" % - (current_altitude, aTargetAltitude)) - if current_altitude >= aTargetAltitude*0.95: # Trigger just below target alt. - print("Reached target altitude") - break - elif current_altitude >= aTargetAltitude*0.6: - thrust = SMOOTH_TAKEOFF_THRUST - set_attitude(thrust = thrust) - time.sleep(0.2) - -def send_attitude_target(roll_angle = 0.0, pitch_angle = 0.0, - yaw_angle = None, yaw_rate = 0.0, use_yaw_rate = False, - thrust = 0.5): - """ - use_yaw_rate: the yaw can be controlled using yaw_angle OR yaw_rate. - When one is used, the other is ignored by Ardupilot. - thrust: 0 <= thrust <= 1, as a fraction of maximum vertical thrust. - Note that as of Copter 3.5, thrust = 0.5 triggers a special case in - the code for maintaining current altitude. - """ - if yaw_angle is None: - # this value may be unused by the vehicle, depending on use_yaw_rate - yaw_angle = vehicle.attitude.yaw - # Thrust > 0.5: Ascend - # Thrust == 0.5: Hold the altitude - # Thrust < 0.5: Descend - msg = vehicle.message_factory.set_attitude_target_encode( - 0, # time_boot_ms - 1, # Target system - 1, # Target component - 0b00000000 if use_yaw_rate else 0b00000100, - to_quaternion(roll_angle, pitch_angle, yaw_angle), # Quaternion - 0, # Body roll rate in radian - 0, # Body pitch rate in radian - math.radians(yaw_rate), # Body yaw rate in radian/second - thrust # Thrust - ) - vehicle.send_mavlink(msg) - -def set_attitude(roll_angle = 0.0, pitch_angle = 0.0, - yaw_angle = None, yaw_rate = 0.0, use_yaw_rate = False, - thrust = 0.5, duration = 0): - """ - Note that from AC3.3 the message should be re-sent more often than every - second, as an ATTITUDE_TARGET order has a timeout of 1s. - In AC3.2.1 and earlier the specified attitude persists until it is canceled. - The code below should work on either version. - Sending the message multiple times is the recommended way. - """ - send_attitude_target(roll_angle, pitch_angle, - yaw_angle, yaw_rate, False, - thrust) - start = time.time() - while time.time() - start < duration: - send_attitude_target(roll_angle, pitch_angle, - yaw_angle, yaw_rate, False, - thrust) - time.sleep(0.1) - # Reset attitude, or it will persist for 1s more due to the timeout - send_attitude_target(0, 0, - 0, 0, True, - thrust) - -def to_quaternion(roll = 0.0, pitch = 0.0, yaw = 0.0): - """ - Convert degrees to quaternions - """ - t0 = math.cos(math.radians(yaw * 0.5)) - t1 = math.sin(math.radians(yaw * 0.5)) - t2 = math.cos(math.radians(roll * 0.5)) - t3 = math.sin(math.radians(roll * 0.5)) - t4 = math.cos(math.radians(pitch * 0.5)) - t5 = math.sin(math.radians(pitch * 0.5)) - - w = t0 * t2 * t4 + t1 * t3 * t5 - x = t0 * t3 * t4 - t1 * t2 * t5 - y = t0 * t2 * t5 + t1 * t3 * t4 - z = t1 * t2 * t4 - t0 * t3 * t5 - - return [w, x, y, z] - -# Take off 2.5m in GUIDED_NOGPS mode. -arm_and_takeoff_nogps(2.5) - -# Hold the position for 3 seconds. -print("Hold position for 3 seconds") -set_attitude(duration = 3) - -# Uncomment the lines below for testing roll angle and yaw rate. -# Make sure that there is enough space for testing this. - -# set_attitude(roll_angle = 1, thrust = 0.5, duration = 3) -# set_attitude(yaw_rate = 30, thrust = 0.5, duration = 3) - -# Move the drone forward and backward. -# Note that it will be in front of original position due to inertia. -print("Move forward") -set_attitude(pitch_angle = -5, thrust = 0.5, duration = 3.21) - -print("Move backward") -set_attitude(pitch_angle = 5, thrust = 0.5, duration = 3) - - -print("Setting LAND mode...") -vehicle.mode = VehicleMode("LAND") -time.sleep(1) - -# Close vehicle object before exiting script -print("Close vehicle object") -vehicle.close() - -# Shut down simulator if it was started. -if sitl is not None: - sitl.stop() - -print("Completed") diff --git a/simulation/extension_docker/dronekit-python/examples/simple_goto/simple_goto.py b/simulation/extension_docker/dronekit-python/examples/simple_goto/simple_goto.py deleted file mode 100644 index 9fe54ee2..00000000 --- a/simulation/extension_docker/dronekit-python/examples/simple_goto/simple_goto.py +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. -simple_goto.py: GUIDED mode "simple goto" example (Copter Only) - -Demonstrates how to arm and takeoff in Copter and how to navigate to points using Vehicle.simple_goto. - -Full documentation is provided at http://python.dronekit.io/examples/simple_goto.html -""" - -from __future__ import print_function -import time -from dronekit import connect, VehicleMode, LocationGlobalRelative - - -# Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Commands vehicle using vehicle.simple_goto.') -parser.add_argument('--connect', - help="Vehicle connection target string. If not specified, SITL automatically started and used.") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - - -# Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - -# Connect to the Vehicle -print('Connecting to vehicle on: %s' % connection_string) -vehicle = connect(connection_string, wait_ready=True) - - -def arm_and_takeoff(aTargetAltitude): - """ - Arms vehicle and fly to aTargetAltitude. - """ - - print("Basic pre-arm checks") - # Don't try to arm until autopilot is ready - while not vehicle.is_armable: - print(" Waiting for vehicle to initialise...") - time.sleep(1) - - print("Arming motors") - # Copter should arm in GUIDED mode - vehicle.mode = VehicleMode("GUIDED") - vehicle.armed = True - - # Confirm vehicle armed before attempting to take off - while not vehicle.armed: - print(" Waiting for arming...") - time.sleep(1) - - print("Taking off!") - vehicle.simple_takeoff(aTargetAltitude) # Take off to target altitude - - # Wait until the vehicle reaches a safe height before processing the goto - # (otherwise the command after Vehicle.simple_takeoff will execute - # immediately). - while True: - print(" Altitude: ", vehicle.location.global_relative_frame.alt) - # Break and return from function just below target altitude. - if vehicle.location.global_relative_frame.alt >= aTargetAltitude * 0.95: - print("Reached target altitude") - break - time.sleep(1) - - -arm_and_takeoff(10) - -print("Set default/target airspeed to 3") -vehicle.airspeed = 3 - -print("Going towards first point for 30 seconds ...") -point1 = LocationGlobalRelative(-35.361354, 149.165218, 20) -vehicle.simple_goto(point1) - -# sleep so we can see the change in map -time.sleep(30) - -print("Going towards second point for 30 seconds (groundspeed set to 10 m/s) ...") -point2 = LocationGlobalRelative(-35.363244, 149.168801, 20) -vehicle.simple_goto(point2, groundspeed=10) - -# sleep so we can see the change in map -time.sleep(30) - -print("Returning to Launch") -vehicle.mode = VehicleMode("RTL") - -# Close vehicle object before exiting script -print("Close vehicle object") -vehicle.close() - -# Shut down simulator if it was started. -if sitl: - sitl.stop() diff --git a/simulation/extension_docker/dronekit-python/examples/vehicle_state/vehicle_state.py b/simulation/extension_docker/dronekit-python/examples/vehicle_state/vehicle_state.py deleted file mode 100644 index 3fd3717d..00000000 --- a/simulation/extension_docker/dronekit-python/examples/vehicle_state/vehicle_state.py +++ /dev/null @@ -1,271 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -© Copyright 2015-2016, 3D Robotics. -vehicle_state.py: - -Demonstrates how to get and set vehicle state and parameter information, -and how to observe vehicle attribute (state) changes. - -Full documentation is provided at http://python.dronekit.io/examples/vehicle_state.html -""" -from __future__ import print_function -from dronekit import connect, VehicleMode -import time - -#Set up option parsing to get connection string -import argparse -parser = argparse.ArgumentParser(description='Print out vehicle state information. Connects to SITL on local PC by default.') -parser.add_argument('--connect', - help="vehicle connection target string. If not specified, SITL automatically started and used.") -args = parser.parse_args() - -connection_string = args.connect -sitl = None - - -#Start SITL if no connection string specified -if not connection_string: - import dronekit_sitl - sitl = dronekit_sitl.start_default() - connection_string = sitl.connection_string() - - -# Connect to the Vehicle. -# Set `wait_ready=True` to ensure default attributes are populated before `connect()` returns. -print("\nConnecting to vehicle on: %s" % connection_string) -vehicle = connect(connection_string, wait_ready=True) - -vehicle.wait_ready('autopilot_version') - -# Get all vehicle attributes (state) -print("\nGet all vehicle attribute values:") -print(" Autopilot Firmware version: %s" % vehicle.version) -print(" Major version number: %s" % vehicle.version.major) -print(" Minor version number: %s" % vehicle.version.minor) -print(" Patch version number: %s" % vehicle.version.patch) -print(" Release type: %s" % vehicle.version.release_type()) -print(" Release version: %s" % vehicle.version.release_version()) -print(" Stable release?: %s" % vehicle.version.is_stable()) -print(" Autopilot capabilities") -print(" Supports MISSION_FLOAT message type: %s" % vehicle.capabilities.mission_float) -print(" Supports PARAM_FLOAT message type: %s" % vehicle.capabilities.param_float) -print(" Supports MISSION_INT message type: %s" % vehicle.capabilities.mission_int) -print(" Supports COMMAND_INT message type: %s" % vehicle.capabilities.command_int) -print(" Supports PARAM_UNION message type: %s" % vehicle.capabilities.param_union) -print(" Supports ftp for file transfers: %s" % vehicle.capabilities.ftp) -print(" Supports commanding attitude offboard: %s" % vehicle.capabilities.set_attitude_target) -print(" Supports commanding position and velocity targets in local NED frame: %s" % vehicle.capabilities.set_attitude_target_local_ned) -print(" Supports set position + velocity targets in global scaled integers: %s" % vehicle.capabilities.set_altitude_target_global_int) -print(" Supports terrain protocol / data handling: %s" % vehicle.capabilities.terrain) -print(" Supports direct actuator control: %s" % vehicle.capabilities.set_actuator_target) -print(" Supports the flight termination command: %s" % vehicle.capabilities.flight_termination) -print(" Supports mission_float message type: %s" % vehicle.capabilities.mission_float) -print(" Supports onboard compass calibration: %s" % vehicle.capabilities.compass_calibration) -print(" Global Location: %s" % vehicle.location.global_frame) -print(" Global Location (relative altitude): %s" % vehicle.location.global_relative_frame) -print(" Local Location: %s" % vehicle.location.local_frame) -print(" Attitude: %s" % vehicle.attitude) -print(" Velocity: %s" % vehicle.velocity) -print(" GPS: %s" % vehicle.gps_0) -print(" Gimbal status: %s" % vehicle.gimbal) -print(" Battery: %s" % vehicle.battery) -print(" EKF OK?: %s" % vehicle.ekf_ok) -print(" Last Heartbeat: %s" % vehicle.last_heartbeat) -print(" Rangefinder: %s" % vehicle.rangefinder) -print(" Rangefinder distance: %s" % vehicle.rangefinder.distance) -print(" Rangefinder voltage: %s" % vehicle.rangefinder.voltage) -print(" Heading: %s" % vehicle.heading) -print(" Is Armable?: %s" % vehicle.is_armable) -print(" System status: %s" % vehicle.system_status.state) -print(" Groundspeed: %s" % vehicle.groundspeed) # settable -print(" Airspeed: %s" % vehicle.airspeed) # settable -print(" Mode: %s" % vehicle.mode.name) # settable -print(" Armed: %s" % vehicle.armed) # settable - - - -# Get Vehicle Home location - will be `None` until first set by autopilot -while not vehicle.home_location: - cmds = vehicle.commands - cmds.download() - cmds.wait_ready() - if not vehicle.home_location: - print(" Waiting for home location ...") -# We have a home location, so print it! -print("\n Home location: %s" % vehicle.home_location) - - -# Set vehicle home_location, mode, and armed attributes (the only settable attributes) - -print("\nSet new home location") -# Home location must be within 50km of EKF home location (or setting will fail silently) -# In this case, just set value to current location with an easily recognisable altitude (222) -my_location_alt = vehicle.location.global_frame -my_location_alt.alt = 222.0 -vehicle.home_location = my_location_alt -print(" New Home Location (from attribute - altitude should be 222): %s" % vehicle.home_location) - -#Confirm current value on vehicle by re-downloading commands -cmds = vehicle.commands -cmds.download() -cmds.wait_ready() -print(" New Home Location (from vehicle - altitude should be 222): %s" % vehicle.home_location) - - -print("\nSet Vehicle.mode = GUIDED (currently: %s)" % vehicle.mode.name) -vehicle.mode = VehicleMode("GUIDED") -while not vehicle.mode.name=='GUIDED': #Wait until mode has changed - print(" Waiting for mode change ...") - time.sleep(1) - - -# Check that vehicle is armable -while not vehicle.is_armable: - print(" Waiting for vehicle to initialise...") - time.sleep(1) - # If required, you can provide additional information about initialisation - # using `vehicle.gps_0.fix_type` and `vehicle.mode.name`. - -#print "\nSet Vehicle.armed=True (currently: %s)" % vehicle.armed -#vehicle.armed = True -#while not vehicle.armed: -# print " Waiting for arming..." -# time.sleep(1) -#print " Vehicle is armed: %s" % vehicle.armed - - -# Add and remove and attribute callbacks - -#Define callback for `vehicle.attitude` observer -last_attitude_cache = None -def attitude_callback(self, attr_name, value): - # `attr_name` - the observed attribute (used if callback is used for multiple attributes) - # `self` - the associated vehicle object (used if a callback is different for multiple vehicles) - # `value` is the updated attribute value. - global last_attitude_cache - # Only publish when value changes - if value!=last_attitude_cache: - print(" CALLBACK: Attitude changed to", value) - last_attitude_cache=value - -print("\nAdd `attitude` attribute callback/observer on `vehicle`") -vehicle.add_attribute_listener('attitude', attitude_callback) - -print(" Wait 2s so callback invoked before observer removed") -time.sleep(2) - -print(" Remove Vehicle.attitude observer") -# Remove observer added with `add_attribute_listener()` specifying the attribute and callback function -vehicle.remove_attribute_listener('attitude', attitude_callback) - - - -# Add mode attribute callback using decorator (callbacks added this way cannot be removed). -print("\nAdd `mode` attribute callback/observer using decorator") -@vehicle.on_attribute('mode') -def decorated_mode_callback(self, attr_name, value): - # `attr_name` is the observed attribute (used if callback is used for multiple attributes) - # `attr_name` - the observed attribute (used if callback is used for multiple attributes) - # `value` is the updated attribute value. - print(" CALLBACK: Mode changed to", value) - -print(" Set mode=STABILIZE (currently: %s) and wait for callback" % vehicle.mode.name) -vehicle.mode = VehicleMode("STABILIZE") - -print(" Wait 2s so callback invoked before moving to next example") -time.sleep(2) - -print("\n Attempt to remove observer added with `on_attribute` decorator (should fail)") -try: - vehicle.remove_attribute_listener('mode', decorated_mode_callback) -except: - print(" Exception: Cannot remove observer added using decorator") - - - - -# Demonstrate getting callback on any attribute change -def wildcard_callback(self, attr_name, value): - print(" CALLBACK: (%s): %s" % (attr_name,value)) - -print("\nAdd attribute callback detecting ANY attribute change") -vehicle.add_attribute_listener('*', wildcard_callback) - - -print(" Wait 1s so callback invoked before observer removed") -time.sleep(1) - -print(" Remove Vehicle attribute observer") -# Remove observer added with `add_attribute_listener()` -vehicle.remove_attribute_listener('*', wildcard_callback) - - - -# Get/Set Vehicle Parameters -print("\nRead and write parameters") -print(" Read vehicle param 'THR_MIN': %s" % vehicle.parameters['THR_MIN']) - -print(" Write vehicle param 'THR_MIN' : 10") -vehicle.parameters['THR_MIN']=10 -print(" Read new value of param 'THR_MIN': %s" % vehicle.parameters['THR_MIN']) - - -print("\nPrint all parameters (iterate `vehicle.parameters`):") -for key, value in vehicle.parameters.iteritems(): - print(" Key:%s Value:%s" % (key,value)) - - -print("\nCreate parameter observer using decorator") -# Parameter string is case-insensitive -# Value is cached (listeners are only updated on change) -# Observer added using decorator can't be removed. - -@vehicle.parameters.on_attribute('THR_MIN') -def decorated_thr_min_callback(self, attr_name, value): - print(" PARAMETER CALLBACK: %s changed to: %s" % (attr_name, value)) - - -print("Write vehicle param 'THR_MIN' : 20 (and wait for callback)") -vehicle.parameters['THR_MIN']=20 -for x in range(1,5): - #Callbacks may not be updated for a few seconds - if vehicle.parameters['THR_MIN']==20: - break - time.sleep(1) - - -#Callback function for "any" parameter -print("\nCreate (removable) observer for any parameter using wildcard string") -def any_parameter_callback(self, attr_name, value): - print(" ANY PARAMETER CALLBACK: %s changed to: %s" % (attr_name, value)) - -#Add observer for the vehicle's any/all parameters parameter (defined using wildcard string ``'*'``) -vehicle.parameters.add_attribute_listener('*', any_parameter_callback) -print(" Change THR_MID and THR_MIN parameters (and wait for callback)") -vehicle.parameters['THR_MID']=400 -vehicle.parameters['THR_MIN']=30 - - -## Reset variables to sensible values. -print("\nReset vehicle attributes/parameters and exit") -vehicle.mode = VehicleMode("STABILIZE") -#vehicle.armed = False -vehicle.parameters['THR_MIN']=130 -vehicle.parameters['THR_MID']=500 - - -#Close vehicle object before exiting script -print("\nClose vehicle object") -vehicle.close() - -# Shut down simulator if it was started. -if sitl is not None: - sitl.stop() - -print("Completed") - - - - diff --git a/simulation/extension_docker/dronekit-python/requirements.txt b/simulation/extension_docker/dronekit-python/requirements.txt deleted file mode 100644 index 9e70c79b..00000000 --- a/simulation/extension_docker/dronekit-python/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -pymavlink>=2.2.20 -monotonic>=1.3 -nose>=1.3.7 -mock>=2.0.0 -dronekit-sitl==3.2.0 -sphinx-3dr-theme>=0.4.3 diff --git a/simulation/extension_docker/dronekit-python/scripts/publish-docs.sh b/simulation/extension_docker/dronekit-python/scripts/publish-docs.sh deleted file mode 100755 index 50459ada..00000000 --- a/simulation/extension_docker/dronekit-python/scripts/publish-docs.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -ssh dronekit.io "./update_python.sh" diff --git a/simulation/extension_docker/dronekit-python/scripts/publish-pypi.sh b/simulation/extension_docker/dronekit-python/scripts/publish-pypi.sh deleted file mode 100755 index 5ce086c0..00000000 --- a/simulation/extension_docker/dronekit-python/scripts/publish-pypi.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -cd $(dirname $0) -cd .. - -sudo python setup.py sdist bdist_egg bdist_wheel upload diff --git a/simulation/extension_docker/dronekit-python/scripts/update-docs.sh b/simulation/extension_docker/dronekit-python/scripts/update-docs.sh deleted file mode 100755 index 50459ada..00000000 --- a/simulation/extension_docker/dronekit-python/scripts/update-docs.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -ssh dronekit.io "./update_python.sh" diff --git a/simulation/extension_docker/dronekit-python/scripts/update-releasenotes.sh b/simulation/extension_docker/dronekit-python/scripts/update-releasenotes.sh deleted file mode 100755 index 789aa9fc..00000000 --- a/simulation/extension_docker/dronekit-python/scripts/update-releasenotes.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python - -""" -This script gets the release notes, converts it from markdown to -reStructured Text format, and writes it to a text file. - -The text file can be auto-imported by Sphinx into the official release notes. -""" - -import os -from pypandoc import convert -from optparse import OptionParser -import re - -curpath = os.path.realpath(os.path.dirname(__file__)) - -#parser options -parser = OptionParser(version="%prog 1.0.0", usage="Usage: %prog [options] version") -parser.add_option("-i" , "--input", dest="input", default=os.path.join(curpath, "../CHANGELOG.md"), help="Input file") -parser.add_option("-f" , "--file", dest="file", default=os.path.join(curpath, "../docs/about/github_latest_release.txt"), help="Output file") - -(options, args) = parser.parse_args() - -rst_content = convert(options.input, 'rst') - -# Hyperlink Github issues -rst_content = re.sub(r'#\d+', lambda m: '`' + m.group() + ' `_', rst_content) - -# Prefix with some documentation -rst_content = ".. This document was auto-generated by the get_release_notes.py script using latest-release information from github \n\n" + rst_content - -release_notes_file = open(options.file,'w') -release_notes_file.write(rst_content) -release_notes_file.close() - -print 'complete.' - diff --git a/simulation/extension_docker/dronekit-python/setup.py b/simulation/extension_docker/dronekit-python/setup.py deleted file mode 100644 index 49d7477e..00000000 --- a/simulation/extension_docker/dronekit-python/setup.py +++ /dev/null @@ -1,35 +0,0 @@ -import setuptools -import os - -version = '2.9.2' - -with open(os.path.join(os.path.dirname(__file__), 'README.md')) as f: - LongDescription = f.read() - -setuptools.setup( - name='dronekit', - zip_safe=True, - version=version, - description='Developer Tools for Drones.', - long_description_content_type="text/markdown", - long_description=LongDescription, - url='https://github.com/dronekit/dronekit-python', - author='3D Robotics', - install_requires=[ - 'pymavlink>=2.2.20', - 'monotonic>=1.3', - ], - author_email='tim@3drobotics.com, kevinh@geeksville.com', - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Console', - 'Intended Audience :: Science/Research', - 'License :: OSI Approved :: Apache Software License', - 'Operating System :: OS Independent', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Topic :: Scientific/Engineering', - ], - license='apache', - packages=setuptools.find_packages() -) diff --git a/simulation/extension_docker/dronekit-python/windows/dronekitWinBuild.bat b/simulation/extension_docker/dronekit-python/windows/dronekitWinBuild.bat deleted file mode 100644 index 95c8a79b..00000000 --- a/simulation/extension_docker/dronekit-python/windows/dronekitWinBuild.bat +++ /dev/null @@ -1,14 +0,0 @@ -rem build the standalone Dronekit.exe for Windows. -rem This assumes Python2 is installed in C:\Python27 -rem This assumes Inno Setup 5 is installed in C:\Program Files (x86)\Inno Setup 5 -SETLOCAL enableextensions - -rem get the version -for /f "tokens=*" %%a in ( - 'python returnVersion.py' - ) do ( - set VERSION=%%a - ) - -rem -----Build the Installer----- -"C:\Program Files (x86)\Inno Setup 5\ISCC.exe" /dMyAppVersion=%VERSION% dronekit_installer.iss diff --git a/simulation/extension_docker/dronekit-python/windows/dronekit_installer.iss b/simulation/extension_docker/dronekit-python/windows/dronekit_installer.iss deleted file mode 100644 index 707baa6e..00000000 --- a/simulation/extension_docker/dronekit-python/windows/dronekit_installer.iss +++ /dev/null @@ -1,105 +0,0 @@ -; Script generated by the Inno Setup Script Wizard. -; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! - -#define MyAppName "DroneKit" -; #define MyAppVersion "1" -#define MyAppPublisher "3D Robotics, Inc" -#define MyAppURL "https://github.com/dronekit/dronekit-python" -#define MyAppExeName "" - -[Setup] -; NOTE: The value of AppId uniquely identifies this application. -; Do not use the same AppId value in installers for other applications. -; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppId={{35EE5962-C212-4874-90EC-50863DD1537D} -AppName={#MyAppName} -AppVersion={#MyAppVersion} -;AppVerName={#MyAppName} {#MyAppVersion} -AppPublisher={#MyAppPublisher} -AppPublisherURL={#MyAppURL} -AppSupportURL={#MyAppURL} -AppUpdatesURL={#MyAppURL} -CreateAppDir=no -OutputBaseFilename=DroneKitsetup-{#MyAppVersion} -Compression=lzma -SolidCompression=yes -LicenseFile=..\LICENSE -DisableDirPage=yes - -[Languages] -Name: "english"; MessagesFile: "compiler:Default.isl" - -[Files] -Source: "..\dronekit\*"; DestDir: "{code:GetMAVProxyPath}\dronekit"; Flags: ignoreversion recursesubdirs createallsubdirs -Source: "..\examples\*"; DestDir: "{code:GetMAVProxyPath}\examples"; Flags: ignoreversion recursesubdirs createallsubdirs - -; NOTE: Don't use "Flags: ignoreversion" on any shared system files - -; Check if MAVProxy is installed (if so, get the install path) -[Code] -function IsMAVProxyInstalled: boolean; -begin - result := RegKeyExists(HKEY_LOCAL_MACHINE, - 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{D81B9EDA-1357-462E-96E4-B47372709F7C}_is1'); -end; - -function GetMAVProxyPath(Dummy: string): string; -var - sInstallPath: string; - MAVProxyPath: string; -begin - MAVProxyPath := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{D81B9EDA-1357-462E-96E4-B47372709F7C}_is1' - sInstallPath := ''; - RegQueryStringValue(HKLM, MAVProxyPath, 'InstallLocation', sInstallPath); - Result := sInstallPath; -end; - -function InitializeSetup: boolean; -begin - result := IsMAVProxyInstalled; - if not result then - MsgBox('You need to install MAVProxy before you install DroneKit. Install MAVProxy and then run this installer again.', mbError, MB_OK); -end; - -function MAVDir_CreatePage(PreviousPageId: Integer): Integer; -var - Page: TWizardPage; - Label1: TLabel; - MAVDir: TEdit; -begin - Page := CreateCustomPage( - PreviousPageId, - 'Installation Directory', - '' - ); - - Label1 := TLabel.Create(Page); - with Label1 do - begin - Parent := Page.Surface; - Caption := 'DroneKit will be installed in the MAVProxy directory:' - Left := ScaleX(16); - Top := ScaleY(0); - Width := ScaleX(300); - Height := ScaleY(17); - end; - - MAVDir := TEdit.Create(Page); - with MAVDir do - begin - Parent := Page.Surface; - Left := ScaleX(16); - Top := ScaleY(24); - Width := ScaleX(300); - Height := ScaleY(25); - TabOrder := 0; - Text := GetMAVProxyPath(''); - Enabled := False; - end - -end; - -procedure InitializeWizard(); -begin - MAVDir_CreatePage(wpLicense); -end; \ No newline at end of file diff --git a/simulation/extension_docker/dronekit-python/windows/returnVersion.py b/simulation/extension_docker/dronekit-python/windows/returnVersion.py deleted file mode 100644 index ec9ebbad..00000000 --- a/simulation/extension_docker/dronekit-python/windows/returnVersion.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import print_function -# This script reads the setup.py and returns the current version number -# Used as part of building the WIndows setup file (DronekitWinBuild.bat) -# It assumes there is a line like this: -# version = "12344" - -# glob supports Unix style pathname extensions -with open("../setup.py") as f: - searchlines = f.readlines() - for i, line in enumerate(searchlines): - if "version = " in line: - print(line[11:len(line)-2]) - break \ No newline at end of file diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/.gitignore b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/.gitignore deleted file mode 100644 index fecc32a8..00000000 --- a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -AscentQLinux/ -logs/*.BIN -logs/*.TXT \ No newline at end of file diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/Makefile b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/Makefile deleted file mode 100644 index bcb26a80..00000000 --- a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -all: - g++ inject.cpp -fPIC -shared -o inject.so diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/README b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/README deleted file mode 100644 index d40407d2..00000000 --- a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/README +++ /dev/null @@ -1,5 +0,0 @@ -install mavproxy -Unzip package -In terminal window, run sudo chmod +x spirit_sitl -run ./spirit_sitl -S --model coaxial -I0 & mavproxy.py --master tcp:127.0.0.1:5760 --out udp:127.0.0.1:14552 -Open AscentQLinux folder and launch the AscentQ file diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/ascent_sitl.yaml b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/ascent_sitl.yaml deleted file mode 100644 index 149520f0..00000000 --- a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/ascent_sitl.yaml +++ /dev/null @@ -1,17 +0,0 @@ -session_name: Ascent Spirit -windows: - - window_name: SITL - layout: tiled - panes: - - shell_command: - - echo hi#python3 server_test.py - - shell_command: - - gdb ./spirit_sitl --command=test.gdb -ex "r -S --model coaxial -I0 --base-port $BASE_PORT" - - shell_command: - - echo $ASCENT_SITL_PORT - - echo $ISAAC_SIM_PORT - - echo $AUTONOMY_STACK_PORT - - mavproxy.py --streamrate=100 --master tcp:127.0.0.1:$BASE_PORT --out udp:127.0.0.1:$ASCENT_SITL_PORT --out udp:127.0.0.1:$ISAAC_SIM_PORT --out udp:127.0.0.1:$AUTONOMY_STACK_PORT - - shell_command: - - sleep 5 - - ros2 launch mavros apm.launch fcu_url:="udp://127.0.0.1:$AUTONOMY_STACK_PORT@$MAVROS_LAUNCH_PORT" diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/inject.cpp b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/inject.cpp deleted file mode 100644 index 532885df..00000000 --- a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/inject.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -int sockfd = -1; -struct sockaddr_in servaddr; - -static __attribute__((constructor)) void init(void){ - /* - // Create socket - std::cout << "1" << std::endl; - if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - std::cerr << "Socket creation failed" << std::endl; - exit(1); - } - - std::cout << "2" << std::endl; - memset(&servaddr, 0, sizeof(servaddr)); - - // Server information - std::cout << "3" << std::endl; - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons(65432); - if (inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr) <= 0) { - std::cerr << "Invalid address/ Address not supported" << std::endl; - exit(1); - } - - // Connect to server - std::cout << "4" << std::endl; - if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { - std::cerr << "Connection Failed" << std::endl; - exit(1); - } - //*/ -} - -void injected_function(unsigned long i){ - static auto start = std::chrono::high_resolution_clock::now(); - auto elapsed = std::chrono::high_resolution_clock::now() - start; - long long microseconds = std::chrono::duration_cast(elapsed).count(); - static long long prev_microseconds = microseconds; - static long long prev_i = i; - std::cout << "injected function " << microseconds << " " << (microseconds - prev_microseconds) << " " << i << " " << (i - prev_i) << " " << (i - microseconds) << std::endl; - std::cout << "size: " << sizeof(unsigned long) << std::endl; - prev_i = i; - prev_microseconds = microseconds; - - - if (sockfd == -1){ - // Create socket - std::cout << "1" << std::endl; - if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - std::cerr << "Socket creation failed" << std::endl; - exit(1); - } - - std::cout << "2" << std::endl; - memset(&servaddr, 0, sizeof(servaddr)); - - // Server information - std::cout << "3" << std::endl; - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons(65432); - if (inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr) <= 0) { - std::cerr << "Invalid address/ Address not supported" << std::endl; - exit(1); - } - - // Connect to server - std::cout << "4" << std::endl; - if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { - std::cerr << "Connection Failed" << std::endl; - exit(1); - } - } - - // Send message - //* - char message_type = 't'; - uint8_t message[16];//sizeof(message_type) + sizeof(i)]; - std::memcpy(&message[0], &message_type, sizeof(message_type)); - std::memcpy(&message[sizeof(i)], &i, sizeof(i)); - send(sockfd, message, sizeof(message), 0); - //send(sockfd, &i, sizeof(i), 0); - - // Receive response - char buffer[1024] = {0}; - int time_to_sleep; - //int valread = read(sockfd, buffer, 1024); - int valread = read(sockfd, &time_to_sleep, sizeof(time_to_sleep)); - //std::cout << "Server: " << buffer << std::endl; - std::cout << "Server: " << time_to_sleep << std::endl; - if(time_to_sleep > 0) - usleep(time_to_sleep); - //*/ -} - - -static __attribute__((destructor)) void end(void){ - close(sockfd); -} diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/inject.so b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/inject.so deleted file mode 100755 index 89008f3a..00000000 Binary files a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/inject.so and /dev/null differ diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav.parm b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav.parm deleted file mode 100644 index c5418a81..00000000 --- a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav.parm +++ /dev/null @@ -1,1392 +0,0 @@ -AA_ANG_KP_HI 5.250000 -AA_ANG_KP_IN 7.000000 -AA_ANG_KP_LO 4.000000 -AA_ANG_KP_SL -0.230000 -AA_AUTO_CONF 1.000000 -AA_BATT_CAP 6000.000000 -AA_BATT_NUM 1.000000 -AA_BATT_P 2.000000 -AA_BATT_R_HI 0.021000 -AA_BATT_S 12.000000 -AA_BLD_HUNG 3.000000 -AA_CAM_TYPE 0.000000 -AA_FTC_EN 1.000000 -AA_FTC_ON_RBT 1.000000 -AA_GCS_TYPE 4.000000 -AA_KS_MS 200.000000 -AA_NTRL_ANGL 20.000000 -AA_PAYLD_WT 0.000000 -AA_RAT_KD_HI 0.018000 -AA_RAT_KD_IN 0.004217 -AA_RAT_KD_LO 0.005000 -AA_RAT_KD_SL 0.000273 -AA_RAT_KI_HI 0.290000 -AA_RAT_KI_IN -0.038900 -AA_RAT_KI_LO 0.120000 -AA_RAT_KI_SL 0.022500 -AA_RAT_KP_HI 0.350000 -AA_RAT_KP_IN 0.021100 -AA_RAT_KP_LO 0.180000 -AA_RAT_KP_SL 0.022500 -AA_RPMH_SL 156.000000 -AA_RPMH_SL_HI 4000.000000 -AA_RPMH_SL_IN 1553.000000 -AA_RPMH_SL_LO 2700.000000 -AA_RPM_HOVER 2837.238770 -AA_STW_LND 1.000000 -AA_STW_LND_H 200.000000 -AA_TOP_MNT 0.000000 -AA_TOTAL_WT 8.232301 -AA_TPLE_EN 1.000000 -AA_VEHICLE 1.000000 -AA_VIS_SRC 0.000000 -ACRO_BAL_PITCH 1.000000 -ACRO_BAL_ROLL 1.000000 -ACRO_OPTIONS 0.000000 -ACRO_RP_EXPO 0.300000 -ACRO_RP_RATE 360.000000 -ACRO_RP_RATE_TC 0.000000 -ACRO_THR_MID 0.000000 -ACRO_TRAINER 2.000000 -ACRO_Y_EXPO 0.000000 -ACRO_Y_RATE 202.500000 -ACRO_Y_RATE_TC 0.000000 -ADSB_TYPE 0.000000 -AHRS_COMP_BETA 0.100000 -AHRS_EKF_TYPE 3.000000 -AHRS_GPS_GAIN 1.000000 -AHRS_GPS_MINSATS 6.000000 -AHRS_GPS_USE 1.000000 -AHRS_ORIENTATION 0.000000 -AHRS_RP_P 0.250000 -AHRS_TRIM_X 0.000107 -AHRS_TRIM_Y -0.000116 -AHRS_TRIM_Z 0.000000 -AHRS_WIND_MAX 0.000000 -AHRS_YAW_P 0.200000 -ANGLE_MAX 3000.000000 -ARMING_ACCTHRESH 0.750000 -ARMING_CHECK 1.000000 -ARMING_MIS_ITEMS 0.000000 -ARMING_OPTIONS 0.000000 -ARMING_RUDDER 2.000000 -ARSPD_TYPE 0.000000 -ATC_ACCEL_P_MAX 105909.296875 -ATC_ACCEL_R_MAX 105909.296875 -ATC_ACCEL_Y_MAX 36000.000000 -ATC_ANGLE_BOOST 1.000000 -ATC_ANG_LIM_TC 5.000000 -ATC_ANG_PIT_P 5.106571 -ATC_ANG_RLL_P 5.106571 -ATC_ANG_YAW_P 3.000000 -ATC_INPUT_TC 0.400000 -ATC_PIRO_COMP 1.000000 -ATC_RATE_FF_ENAB 1.000000 -ATC_RATE_P_MAX 120.000000 -ATC_RATE_R_MAX 120.000000 -ATC_RATE_Y_MAX 90.000000 -ATC_RAT_PIT_D 0.006466 -ATC_RAT_PIT_FF 0.000000 -ATC_RAT_PIT_FLTD 15.000000 -ATC_RAT_PIT_FLTE 15.000000 -ATC_RAT_PIT_FLTT 15.000000 -ATC_RAT_PIT_I 0.146327 -ATC_RAT_PIT_IMAX 0.600000 -ATC_RAT_PIT_P 0.206327 -ATC_RAT_PIT_SMAX 0.000000 -ATC_RAT_RLL_D 0.006466 -ATC_RAT_RLL_FF 0.000000 -ATC_RAT_RLL_FLTD 15.000000 -ATC_RAT_RLL_FLTE 15.000000 -ATC_RAT_RLL_FLTT 15.000000 -ATC_RAT_RLL_I 0.146327 -ATC_RAT_RLL_IMAX 0.600000 -ATC_RAT_RLL_P 0.206327 -ATC_RAT_RLL_SMAX 0.000000 -ATC_RAT_YAW_D 0.000000 -ATC_RAT_YAW_FF 0.000000 -ATC_RAT_YAW_FLTD 20.000000 -ATC_RAT_YAW_FLTE 2.500000 -ATC_RAT_YAW_FLTT 5.000000 -ATC_RAT_YAW_I 0.018000 -ATC_RAT_YAW_IMAX 0.300000 -ATC_RAT_YAW_P 0.180000 -ATC_RAT_YAW_SMAX 0.000000 -ATC_SLEW_YAW 6000.000000 -ATC_THR_MIX_MAN 0.500000 -ATC_THR_MIX_MAX 0.500000 -ATC_THR_MIX_MIN 0.100000 -AUTOTUNE_AGGR 0.075000 -AUTOTUNE_AXES 2.000000 -AUTOTUNE_MIN_D 0.002000 -AUTO_OPTIONS 0.000000 -AVD_ENABLE 0.000000 -AVOID_ACCEL_MAX 3.000000 -AVOID_ALT_MIN 0.000000 -AVOID_ANGLE_MAX 1500.000000 -AVOID_BACKUP_DZ 0.100000 -AVOID_BACKUP_SPD 0.750000 -AVOID_BEHAVE 0.000000 -AVOID_DIST_MAX 5.000000 -AVOID_ENABLE 1.000000 -AVOID_MARGIN 2.000000 -BARO1_DEVID 65540.000000 -BARO1_GND_PRESS 94503.125000 -BARO1_WCF_ENABLE 0.000000 -BARO2_DEVID 65796.000000 -BARO2_GND_PRESS 94502.125000 -BARO2_WCF_ENABLE 0.000000 -BARO3_DEVID 0.000000 -BARO3_GND_PRESS 0.000000 -BARO3_WCF_ENABLE 0.000000 -BARO_ALTERR_MAX 2000.000000 -BARO_ALT_OFFSET 0.000000 -BARO_EXT_BUS -1.000000 -BARO_FIELD_ELV 0.000000 -BARO_FLTR_RNG 30.000000 -BARO_GND_TEMP 0.000000 -BARO_OPTIONS 0.000000 -BARO_PRIMARY 0.000000 -BARO_PROBE_EXT 0.000000 -BATT2_MONITOR 0.000000 -BATT3_MONITOR 0.000000 -BATT4_MONITOR 0.000000 -BATT5_MONITOR 0.000000 -BATT6_MONITOR 0.000000 -BATT7_MONITOR 0.000000 -BATT8_MONITOR 0.000000 -BATT9_MONITOR 0.000000 -BATT_AMP_OFFSET 0.000000 -BATT_AMP_PERVLT 17.000000 -BATT_ARM_MAH 0.000000 -BATT_ARM_VOLT 0.000000 -BATT_CAPACITY 6000.000000 -BATT_CRT_MAH 0.000000 -BATT_CRT_VOLT 36.000000 -BATT_CURR_PIN 12.000000 -BATT_FS_CRT_ACT 0.000000 -BATT_FS_LOW_ACT 0.000000 -BATT_FS_VOLTSRC 0.000000 -BATT_LOW_MAH 0.000000 -BATT_LOW_TIMER 10.000000 -BATT_LOW_VOLT 38.000000 -BATT_MONITOR 4.000000 -BATT_OPTIONS 0.000000 -BATT_SERIAL_NUM -1.000000 -BATT_VLT_OFFSET 0.000000 -BATT_VOLT_MULT 10.100000 -BATT_VOLT_PIN 13.000000 -BCN_TYPE 0.000000 -BRD_BOOT_DELAY 0.000000 -BRD_OPTIONS 1.000000 -BRD_RTC_TYPES 1.000000 -BRD_RTC_TZ_MIN 0.000000 -BRD_SAFETYENABLE 0.000000 -BRD_SAFETYOPTION 0.000000 -BRD_SAFETY_MASK 0.000000 -BRD_SERIAL_NUM 0.000000 -BRD_VBUS_MIN 4.300000 -BRD_VSERVO_MIN 4.000000 -BTN_ENABLE 0.000000 -CAM_AUTO_ONLY 0.000000 -CAM_DURATION 10.000000 -CAM_FEEDBACK_PIN -1.000000 -CAM_FEEDBACK_POL 1.000000 -CAM_MAX_ROLL 0.000000 -CAM_MIN_INTERVAL 0.000000 -CAM_RC_TYPE 0.000000 -CAM_RELAY_ON 1.000000 -CAM_SERVO_OFF 1100.000000 -CAM_SERVO_ON 1300.000000 -CAM_TRIGG_DIST 0.000000 -CAM_TRIGG_TYPE 0.000000 -CAM_TYPE 0.000000 -CAN_D1_PROTOCOL 0.000000 -CAN_D2_PROTOCOL 0.000000 -CAN_LOGLEVEL 0.000000 -CAN_P1_DRIVER 0.000000 -CAN_P2_DRIVER 0.000000 -CAN_SLCAN_CPORT 0.000000 -CAN_SLCAN_SDELAY 1.000000 -CAN_SLCAN_SERNUM -1.000000 -CAN_SLCAN_TIMOUT 0.000000 -CC_TYPE 0.000000 -CHUTE_ENABLED 0.000000 -CIRCLE_OPTIONS 5.000000 -CIRCLE_RADIUS 6000.000000 -CIRCLE_RATE 8.000000 -COMPASS_AUTODEC 1.000000 -COMPASS_AUTO_ROT 2.000000 -COMPASS_CAL_FIT 32.000000 -COMPASS_DEC 0.220826 -COMPASS_DEV_ID 97539.000000 -COMPASS_DEV_ID2 131874.000000 -COMPASS_DEV_ID3 263178.000000 -COMPASS_DEV_ID4 97283.000000 -COMPASS_DEV_ID5 97795.000000 -COMPASS_DEV_ID6 98051.000000 -COMPASS_DEV_ID7 0.000000 -COMPASS_DEV_ID8 0.000000 -COMPASS_DIA2_X 1.000000 -COMPASS_DIA2_Y 1.000000 -COMPASS_DIA2_Z 1.000000 -COMPASS_DIA3_X 1.000000 -COMPASS_DIA3_Y 1.000000 -COMPASS_DIA3_Z 1.000000 -COMPASS_DIA_X 1.000000 -COMPASS_DIA_Y 1.000000 -COMPASS_DIA_Z 1.000000 -COMPASS_ENABLE 1.000000 -COMPASS_EXTERN2 0.000000 -COMPASS_EXTERN3 0.000000 -COMPASS_EXTERNAL 1.000000 -COMPASS_FLTR_RNG 30.000000 -COMPASS_LEARN 0.000000 -COMPASS_MOT2_X 0.000000 -COMPASS_MOT2_Y 0.000000 -COMPASS_MOT2_Z 0.000000 -COMPASS_MOT3_X 0.000000 -COMPASS_MOT3_Y 0.000000 -COMPASS_MOT3_Z 0.000000 -COMPASS_MOTCT 0.000000 -COMPASS_MOT_X 0.000000 -COMPASS_MOT_Y 0.000000 -COMPASS_MOT_Z 0.000000 -COMPASS_ODI2_X 0.000000 -COMPASS_ODI2_Y 0.000000 -COMPASS_ODI2_Z 0.000000 -COMPASS_ODI3_X 0.000000 -COMPASS_ODI3_Y 0.000000 -COMPASS_ODI3_Z 0.000000 -COMPASS_ODI_X 0.000000 -COMPASS_ODI_Y 0.000000 -COMPASS_ODI_Z 0.000000 -COMPASS_OFFS_MAX 1800.000000 -COMPASS_OFS2_X 5.000000 -COMPASS_OFS2_Y 13.000000 -COMPASS_OFS2_Z -18.000000 -COMPASS_OFS3_X 5.000000 -COMPASS_OFS3_Y 13.000000 -COMPASS_OFS3_Z -18.000000 -COMPASS_OFS_X 5.000000 -COMPASS_OFS_Y 13.000000 -COMPASS_OFS_Z -18.000000 -COMPASS_OPTIONS 0.000000 -COMPASS_ORIENT 0.000000 -COMPASS_ORIENT2 0.000000 -COMPASS_ORIENT3 0.000000 -COMPASS_PMOT_EN 0.000000 -COMPASS_PRIO1_ID 97539.000000 -COMPASS_PRIO2_ID 131874.000000 -COMPASS_PRIO3_ID 263178.000000 -COMPASS_SCALE 1.000000 -COMPASS_SCALE2 1.000000 -COMPASS_SCALE3 1.000000 -COMPASS_TYPEMASK 0.000000 -COMPASS_USE 1.000000 -COMPASS_USE2 1.000000 -COMPASS_USE3 0.000000 -CUST_ROT_ENABLE 0.000000 -DEV_OPTIONS 0.000000 -DID_ENABLE 0.000000 -DISARM_DELAY 8.000000 -EAHRS_TYPE 0.000000 -EFI_TYPE 0.000000 -EK2_ENABLE 0.000000 -EK3_ABIAS_P_NSE 0.003000 -EK3_ACC_BIAS_LIM 1.000000 -EK3_ACC_P_NSE 0.350000 -EK3_AFFINITY 0.000000 -EK3_ALT_M_NSE 2.000000 -EK3_BCN_DELAY 50.000000 -EK3_BCN_I_GTE 500.000000 -EK3_BCN_M_NSE 1.000000 -EK3_BETA_MASK 0.000000 -EK3_CHECK_SCALE 100.000000 -EK3_DRAG_BCOEF_X 0.000000 -EK3_DRAG_BCOEF_Y 0.000000 -EK3_DRAG_MCOEF 0.000000 -EK3_DRAG_M_NSE 0.500000 -EK3_EAS_I_GATE 400.000000 -EK3_EAS_M_NSE 1.400000 -EK3_ENABLE 1.000000 -EK3_ERR_THRESH 0.200000 -EK3_FLOW_DELAY 10.000000 -EK3_FLOW_I_GATE 300.000000 -EK3_FLOW_M_NSE 0.250000 -EK3_FLOW_USE 1.000000 -EK3_GBIAS_P_NSE 0.001000 -EK3_GLITCH_RAD 25.000000 -EK3_GND_EFF_DZ 4.000000 -EK3_GPS_CHECK 31.000000 -EK3_GPS_VACC_MAX 0.000000 -EK3_GSF_RST_MAX 2.000000 -EK3_GSF_RUN_MASK 7.000000 -EK3_GSF_USE_MASK 7.000000 -EK3_GYRO_P_NSE 0.015000 -EK3_HGT_DELAY 60.000000 -EK3_HGT_I_GATE 500.000000 -EK3_HRT_FILT 2.000000 -EK3_IMU_MASK 7.000000 -EK3_LOG_LEVEL 0.000000 -EK3_MAGB_P_NSE 0.000100 -EK3_MAGE_P_NSE 0.001000 -EK3_MAG_CAL 3.000000 -EK3_MAG_EF_LIM 50.000000 -EK3_MAG_I_GATE 300.000000 -EK3_MAG_MASK 0.000000 -EK3_MAG_M_NSE 0.050000 -EK3_MAX_FLOW 2.500000 -EK3_NOAID_M_NSE 10.000000 -EK3_OGNM_TEST_SF 2.000000 -EK3_OGN_HGT_MASK 0.000000 -EK3_POSNE_M_NSE 0.500000 -EK3_POS_I_GATE 500.000000 -EK3_PRIMARY 1.000000 -EK3_RNG_I_GATE 500.000000 -EK3_RNG_M_NSE 0.500000 -EK3_RNG_USE_HGT -1.000000 -EK3_RNG_USE_SPD 2.000000 -EK3_SRC1_POSXY 3.000000 -EK3_SRC1_POSZ 1.000000 -EK3_SRC1_VELXY 3.000000 -EK3_SRC1_VELZ 3.000000 -EK3_SRC1_YAW 1.000000 -EK3_SRC2_POSXY 0.000000 -EK3_SRC2_POSZ 1.000000 -EK3_SRC2_VELXY 0.000000 -EK3_SRC2_VELZ 0.000000 -EK3_SRC2_YAW 0.000000 -EK3_SRC3_POSXY 0.000000 -EK3_SRC3_POSZ 1.000000 -EK3_SRC3_VELXY 0.000000 -EK3_SRC3_VELZ 0.000000 -EK3_SRC3_YAW 0.000000 -EK3_SRC_OPTIONS 1.000000 -EK3_TAU_OUTPUT 25.000000 -EK3_TERR_GRAD 0.100000 -EK3_VELD_M_NSE 0.500000 -EK3_VELNE_M_NSE 0.300000 -EK3_VEL_I_GATE 500.000000 -EK3_VIS_VERR_MAX 0.900000 -EK3_VIS_VERR_MIN 0.100000 -EK3_WENC_VERR 0.100000 -EK3_WIND_PSCALE 1.000000 -EK3_WIND_P_NSE 0.200000 -EK3_YAW_I_GATE 300.000000 -EK3_YAW_M_NSE 0.500000 -ESC_CALIBRATION 0.000000 -ESC_TLM_MAV_OFS 0.000000 -FENCE_ACTION 0.000000 -FENCE_ALT_MAX 100.000000 -FENCE_ALT_MIN -30.000000 -FENCE_ENABLE 0.000000 -FENCE_MARGIN 2.000000 -FENCE_RADIUS 152.399994 -FENCE_TOTAL 0.000000 -FENCE_TYPE 0.000000 -FFT_ENABLE 0.000000 -FHLD_BRAKE_RATE 8.000000 -FHLD_FILT_HZ 5.000000 -FHLD_FLOW_MAX 0.600000 -FHLD_QUAL_MIN 10.000000 -FHLD_XY_FILT_HZ 5.000000 -FHLD_XY_I 0.300000 -FHLD_XY_IMAX 3000.000000 -FHLD_XY_P 0.200000 -FLIGHT_OPTIONS 0.000000 -FLOW_TYPE 0.000000 -FLTMODE1 2.000000 -FLTMODE2 2.000000 -FLTMODE3 5.000000 -FLTMODE4 6.000000 -FLTMODE5 6.000000 -FLTMODE6 6.000000 -FLTMODE_CH 0.000000 -FOLL_ENABLE 0.000000 -FORMAT_VERSION 120.000000 -FRAME_CLASS 9.000000 -FRAME_TYPE 1.000000 -FRSKY_DNLINK1_ID 20.000000 -FRSKY_DNLINK2_ID 7.000000 -FRSKY_DNLINK_ID 27.000000 -FRSKY_OPTIONS 0.000000 -FRSKY_UPLINK_ID 13.000000 -FS_CRASH_CHECK 1.000000 -FS_DR_ENABLE 0.000000 -FS_DR_TIMEOUT 30.000000 -FS_EKF_ACTION 2.000000 -FS_EKF_THRESH 0.800000 -FS_GCS_ENABLE 1.000000 -FS_GCS_TIMEOUT 5.000000 -FS_OPTIONS 8.000000 -FS_THR_ENABLE 1.000000 -FS_THR_VALUE 950.000000 -FS_VIBE_ENABLE 1.000000 -GCS_PID_MASK 0.000000 -GEN_TYPE 0.000000 -GND_EFFECT_COMP 1.000000 -GPS1_CAN_OVRIDE 0.000000 -GPS2_CAN_OVRIDE 0.000000 -GPS_AUTO_CONFIG 1.000000 -GPS_AUTO_SWITCH 1.000000 -GPS_BLEND_MASK 5.000000 -GPS_BLEND_TC 10.000000 -GPS_CAN_NODEID1 0.000000 -GPS_CAN_NODEID2 0.000000 -GPS_COM_PORT 1.000000 -GPS_COM_PORT2 1.000000 -GPS_DELAY_MS 0.000000 -GPS_DELAY_MS2 0.000000 -GPS_DRV_OPTIONS 0.000000 -GPS_GNSS_MODE 0.000000 -GPS_GNSS_MODE2 0.000000 -GPS_HDOP_GOOD 140.000000 -GPS_INJECT_TO 127.000000 -GPS_MB1_TYPE 0.000000 -GPS_MB2_TYPE 0.000000 -GPS_MIN_DGPS 100.000000 -GPS_MIN_ELEV -100.000000 -GPS_NAVFILTER 8.000000 -GPS_POS1_X 0.000000 -GPS_POS1_Y 0.000000 -GPS_POS1_Z -0.200000 -GPS_POS2_X 0.000000 -GPS_POS2_Y 0.000000 -GPS_POS2_Z 0.000000 -GPS_PRIMARY 0.000000 -GPS_RATE_MS 200.000000 -GPS_RATE_MS2 200.000000 -GPS_RAW_DATA 0.000000 -GPS_SAVE_CFG 2.000000 -GPS_SBAS_MODE 2.000000 -GPS_SBP_LOGMASK -256.000000 -GPS_TYPE 1.000000 -GPS_TYPE2 0.000000 -GRIP_ENABLE 0.000000 -GUID_OPTIONS 0.000000 -GUID_TIMEOUT 3.000000 -INITIAL_MODE 2.000000 -INS_ACC1_CALTEMP 25.018280 -INS_ACC2OFFS_X 0.001000 -INS_ACC2OFFS_Y 0.001000 -INS_ACC2OFFS_Z 0.001000 -INS_ACC2SCAL_X 1.000000 -INS_ACC2SCAL_Y 1.000000 -INS_ACC2SCAL_Z 1.000000 -INS_ACC2_CALTEMP 25.018280 -INS_ACC2_ID 2753036.000000 -INS_ACC3OFFS_X 0.001000 -INS_ACC3OFFS_Y 0.001000 -INS_ACC3OFFS_Z 0.001000 -INS_ACC3SCAL_X 1.000000 -INS_ACC3SCAL_Y 1.000000 -INS_ACC3SCAL_Z 1.000000 -INS_ACC3_CALTEMP -300.000000 -INS_ACC3_ID 2753044.000000 -INS_ACCEL_FILTER 20.000000 -INS_ACCOFFS_X 0.001000 -INS_ACCOFFS_Y 0.001000 -INS_ACCOFFS_Z 0.001000 -INS_ACCSCAL_X 1.000000 -INS_ACCSCAL_Y 1.000000 -INS_ACCSCAL_Z 1.000000 -INS_ACC_BODYFIX 1.000000 -INS_ACC_ID 2753028.000000 -INS_ENABLE_MASK 127.000000 -INS_FAST_SAMPLE 7.000000 -INS_GYR1_CALTEMP 26.901920 -INS_GYR2OFFS_X 0.000474 -INS_GYR2OFFS_Y 0.000467 -INS_GYR2OFFS_Z 0.000444 -INS_GYR2_CALTEMP 26.901920 -INS_GYR2_ID 2752780.000000 -INS_GYR3OFFS_X 0.000471 -INS_GYR3OFFS_Y 0.000466 -INS_GYR3OFFS_Z 0.000460 -INS_GYR3_CALTEMP 26.901920 -INS_GYR3_ID 2752788.000000 -INS_GYROFFS_X 0.000471 -INS_GYROFFS_Y 0.000449 -INS_GYROFFS_Z 0.000465 -INS_GYRO_FILTER 20.000000 -INS_GYRO_RATE 2.000000 -INS_GYR_CAL 0.000000 -INS_GYR_ID 2752772.000000 -INS_HNTC2_ATT 40.000000 -INS_HNTC2_BW 40.000000 -INS_HNTC2_ENABLE 1.000000 -INS_HNTC2_FM_RAT 1.000000 -INS_HNTC2_FREQ 80.000000 -INS_HNTC2_HMNCS 3.000000 -INS_HNTC2_MODE 1.000000 -INS_HNTC2_OPTS 0.000000 -INS_HNTC2_REF 0.000000 -INS_HNTCH_ATT 40.000000 -INS_HNTCH_BW 40.000000 -INS_HNTCH_ENABLE 1.000000 -INS_HNTCH_FM_RAT 1.000000 -INS_HNTCH_FREQ 80.000000 -INS_HNTCH_HMNCS 3.000000 -INS_HNTCH_MODE 1.000000 -INS_HNTCH_OPTS 0.000000 -INS_HNTCH_REF 0.000000 -INS_LOG_BAT_CNT 1024.000000 -INS_LOG_BAT_LGCT 32.000000 -INS_LOG_BAT_LGIN 20.000000 -INS_LOG_BAT_MASK 0.000000 -INS_LOG_BAT_OPT 0.000000 -INS_POS1_X 0.000000 -INS_POS1_Y 0.000000 -INS_POS1_Z 0.150000 -INS_POS2_X 0.000000 -INS_POS2_Y 0.000000 -INS_POS2_Z 0.150000 -INS_POS3_X 0.000000 -INS_POS3_Y 0.000000 -INS_POS3_Z 0.150000 -INS_STILL_THRESH 2.500000 -INS_TCAL1_ENABLE 0.000000 -INS_TCAL2_ENABLE 0.000000 -INS_TCAL3_ENABLE 0.000000 -INS_TCAL_OPTIONS 0.000000 -INS_TRIM_OPTION 1.000000 -INS_USE 1.000000 -INS_USE2 1.000000 -INS_USE3 1.000000 -LAND_ALT_LOW 1200.000000 -LAND_REPOSITION 1.000000 -LAND_SPEED 75.000000 -LAND_SPEED_HIGH 200.000000 -LGR_ENABLE 0.000000 -LOG_BACKEND_TYPE 1.000000 -LOG_BITMASK 161790.000000 -LOG_BLK_RATEMAX 0.000000 -LOG_DISARMED 0.000000 -LOG_FILE_BUFSIZE 32.000000 -LOG_FILE_DSRMROT 0.000000 -LOG_FILE_MB_FREE 500.000000 -LOG_FILE_RATEMAX 0.000000 -LOG_FILE_TIMEOUT 5.000000 -LOG_FORCE_NOLOG 0.000000 -LOG_MAV_BUFSIZE 8.000000 -LOG_MAV_RATEMAX 0.000000 -LOG_REPLAY 0.000000 -LOIT_ACC_MAX 300.000000 -LOIT_ANG_MAX 0.000000 -LOIT_BRK_ACCEL 200.000000 -LOIT_BRK_DELAY 0.500000 -LOIT_BRK_JERK 750.000000 -LOIT_SPEED 1500.000000 -MIS_OPTIONS 0.000000 -MIS_RESTART 0.000000 -MIS_TOTAL 0.000000 -MNT1_TYPE 0.000000 -MNT2_TYPE 0.000000 -MOT_BAT_CURR_MAX 0.000000 -MOT_BAT_CURR_TC 1.000000 -MOT_BAT_IDX 0.000000 -MOT_BAT_VOLT_MAX 0.000000 -MOT_BAT_VOLT_MIN 0.000000 -MOT_BOOST_SCALE 0.000000 -MOT_EN_RPM_COMP 1.000000 -MOT_HOVER_LEARN 1.000000 -MOT_PWM_MAX 1900.000000 -MOT_PWM_MIN 1090.000000 -MOT_PWM_TYPE 0.000000 -MOT_RPM_DEADBAND 400.000000 -MOT_RPM_SCALE 0.400000 -MOT_RP_LAG 0.000000 -MOT_SAFE_DISARM 0.000000 -MOT_SAFE_TIME 1.000000 -MOT_SLEW_DN_TIME 0.250000 -MOT_SLEW_UP_TIME 0.500000 -MOT_SPIN_ARM 0.200000 -MOT_SPIN_MAX 0.990000 -MOT_SPIN_MIN 0.200000 -MOT_SPOOL_TIME 1.000000 -MOT_THST_EXPO 0.500000 -MOT_THST_HOVER 0.400000 -MOT_YAW_HEADROOM 50.000000 -MSP_OPTIONS 0.000000 -MSP_OSD_NCELLS 0.000000 -NTF_BUZZ_ON_LVL 1.000000 -NTF_BUZZ_PIN -1.000000 -NTF_BUZZ_TYPES 0.000000 -NTF_BUZZ_VOLUME 100.000000 -NTF_DISPLAY_TYPE 0.000000 -NTF_LED_BRIGHT 3.000000 -NTF_LED_LEN 1.000000 -NTF_LED_OVERRIDE 0.000000 -NTF_LED_TYPES 8.000000 -OA_TYPE 0.000000 -OSD_TYPE 0.000000 -PHLD_BRAKE_ANGLE 3000.000000 -PHLD_BRAKE_RATE 12.000000 -PILOT_ACCEL_Z 250.000000 -PILOT_SPEED_DN 250.000000 -PILOT_SPEED_UP 400.000000 -PILOT_THR_BHV 3.000000 -PILOT_THR_FILT 3.000000 -PILOT_TKOFF_ALT 500.000000 -PILOT_Y_EXPO 0.000000 -PILOT_Y_RATE 202.500000 -PILOT_Y_RATE_TC 0.000000 -PLND_ENABLED 0.000000 -PRX1_TYPE 0.000000 -PRX2_TYPE 0.000000 -PRX3_TYPE 0.000000 -PRX_FILT 0.250000 -PRX_IGN_GND 0.000000 -PRX_LOG_RAW 0.000000 -PSC_ACCZ_D 0.000000 -PSC_ACCZ_FF 0.000000 -PSC_ACCZ_FLTD 15.000000 -PSC_ACCZ_FLTE 15.000000 -PSC_ACCZ_FLTT 10.000000 -PSC_ACCZ_I 1.000000 -PSC_ACCZ_IMAX 500.000000 -PSC_ACCZ_P 0.500000 -PSC_ACCZ_SMAX 0.000000 -PSC_ANGLE_MAX 0.000000 -PSC_JERK_XY 5.000000 -PSC_JERK_Z 5.000000 -PSC_POSXY_P 0.500000 -PSC_POSZ_P 1.000000 -PSC_VELXY_D 0.300000 -PSC_VELXY_FF 0.000000 -PSC_VELXY_FLTD 10.000000 -PSC_VELXY_FLTE 10.000000 -PSC_VELXY_I 0.400000 -PSC_VELXY_IMAX 500.000000 -PSC_VELXY_P 1.000000 -PSC_VELZ_D 0.000000 -PSC_VELZ_FF 0.000000 -PSC_VELZ_FLTD 5.000000 -PSC_VELZ_FLTE 5.000000 -PSC_VELZ_I 0.000000 -PSC_VELZ_IMAX 1000.000000 -PSC_VELZ_P 2.500000 -RALLY_INCL_HOME 1.000000 -RALLY_LIMIT_KM 0.300000 -RALLY_TOTAL 0.000000 -RC10_DZ 0.000000 -RC10_MAX 1995.000000 -RC10_MIN 1105.000000 -RC10_OPTION 0.000000 -RC10_REVERSED 0.000000 -RC10_TRIM 1105.000000 -RC11_DZ 0.000000 -RC11_MAX 1995.000000 -RC11_MIN 1105.000000 -RC11_OPTION 0.000000 -RC11_REVERSED 0.000000 -RC11_TRIM 1105.000000 -RC12_DZ 0.000000 -RC12_MAX 1900.000000 -RC12_MIN 1100.000000 -RC12_OPTION 0.000000 -RC12_REVERSED 0.000000 -RC12_TRIM 1500.000000 -RC13_DZ 0.000000 -RC13_MAX 1900.000000 -RC13_MIN 1100.000000 -RC13_OPTION 0.000000 -RC13_REVERSED 0.000000 -RC13_TRIM 1500.000000 -RC14_DZ 0.000000 -RC14_MAX 1900.000000 -RC14_MIN 1100.000000 -RC14_OPTION 0.000000 -RC14_REVERSED 0.000000 -RC14_TRIM 1500.000000 -RC15_DZ 0.000000 -RC15_MAX 1900.000000 -RC15_MIN 1100.000000 -RC15_OPTION 0.000000 -RC15_REVERSED 0.000000 -RC15_TRIM 1500.000000 -RC16_DZ 0.000000 -RC16_MAX 1900.000000 -RC16_MIN 1100.000000 -RC16_OPTION 0.000000 -RC16_REVERSED 0.000000 -RC16_TRIM 1500.000000 -RC1_DZ 30.000000 -RC1_MAX 1927.000000 -RC1_MIN 1102.000000 -RC1_OPTION 0.000000 -RC1_REVERSED 0.000000 -RC1_TRIM 1515.000000 -RC2_DZ 30.000000 -RC2_MAX 1927.000000 -RC2_MIN 1102.000000 -RC2_OPTION 0.000000 -RC2_REVERSED 0.000000 -RC2_TRIM 1515.000000 -RC3_DZ 30.000000 -RC3_MAX 1927.000000 -RC3_MIN 1102.000000 -RC3_OPTION 0.000000 -RC3_REVERSED 0.000000 -RC3_TRIM 1515.000000 -RC4_DZ 30.000000 -RC4_MAX 1927.000000 -RC4_MIN 1102.000000 -RC4_OPTION 0.000000 -RC4_REVERSED 0.000000 -RC4_TRIM 1515.000000 -RC5_DZ 0.000000 -RC5_MAX 1900.000000 -RC5_MIN 1100.000000 -RC5_OPTION 0.000000 -RC5_REVERSED 0.000000 -RC5_TRIM 1500.000000 -RC6_DZ 30.000000 -RC6_MAX 1927.000000 -RC6_MIN 1102.000000 -RC6_OPTION 0.000000 -RC6_REVERSED 0.000000 -RC6_TRIM 1515.000000 -RC7_DZ 0.000000 -RC7_MAX 1995.000000 -RC7_MIN 1105.000000 -RC7_OPTION 0.000000 -RC7_REVERSED 0.000000 -RC7_TRIM 1105.000000 -RC8_DZ 0.000000 -RC8_MAX 1995.000000 -RC8_MIN 1105.000000 -RC8_OPTION 0.000000 -RC8_REVERSED 0.000000 -RC8_TRIM 1105.000000 -RC9_DZ 10.000000 -RC9_MAX 1995.000000 -RC9_MIN 1105.000000 -RC9_OPTION 0.000000 -RC9_REVERSED 0.000000 -RC9_TRIM 1105.000000 -RCMAP_PITCH 2.000000 -RCMAP_ROLL 1.000000 -RCMAP_THROTTLE 3.000000 -RCMAP_YAW 4.000000 -RC_OPTIONS 0.000000 -RC_OVERRIDE_TIME 3.000000 -RC_PROTOCOLS 1.000000 -RC_SPEED 490.000000 -RELAY_DEFAULT 0.000000 -RELAY_PIN -1.000000 -RELAY_PIN2 -1.000000 -RELAY_PIN3 -1.000000 -RELAY_PIN4 -1.000000 -RELAY_PIN5 -1.000000 -RELAY_PIN6 -1.000000 -RNGFND1_TYPE 0.000000 -RNGFND2_TYPE 0.000000 -RNGFND3_TYPE 0.000000 -RNGFND4_TYPE 0.000000 -RNGFND5_TYPE 0.000000 -RNGFND6_TYPE 0.000000 -RNGFND7_TYPE 0.000000 -RNGFND8_TYPE 0.000000 -RNGFND9_TYPE 0.000000 -RNGFNDA_TYPE 0.000000 -RNGFND_FILT 0.500000 -RPM1_ESC_MASK 0.000000 -RPM1_MAX 100000.000000 -RPM1_MIN 10.000000 -RPM1_MIN_QUAL 0.500000 -RPM1_PIN -1.000000 -RPM1_SCALING 1.000000 -RPM1_TYPE 10.000000 -RPM2_ESC_MASK 0.000000 -RPM2_MAX 100000.000000 -RPM2_MIN 10.000000 -RPM2_MIN_QUAL 0.500000 -RPM2_PIN -1.000000 -RPM2_SCALING 1.000000 -RPM2_TYPE 10.000000 -RSSI_TYPE 0.000000 -RTL_ALT 1500.000000 -RTL_ALT_FINAL 0.000000 -RTL_ALT_TYPE 0.000000 -RTL_CLIMB_MIN 0.000000 -RTL_CONE_SLOPE 3.000000 -RTL_LOIT_TIME 2000.000000 -RTL_OPTIONS 0.000000 -RTL_SPEED 1500.000000 -SCHED_DEBUG 0.000000 -SCHED_LOOP_RATE 400.000000 -SCHED_OPTIONS 0.000000 -SCR_ENABLE 0.000000 -SERIAL0_BAUD 115.000000 -SERIAL0_PROTOCOL 2.000000 -SERIAL1_BAUD 57.000000 -SERIAL1_OPTIONS 0.000000 -SERIAL1_PROTOCOL 2.000000 -SERIAL2_BAUD 0.000000 -SERIAL2_OPTIONS 0.000000 -SERIAL2_PROTOCOL 0.000000 -SERIAL3_BAUD 38.000000 -SERIAL3_OPTIONS 0.000000 -SERIAL3_PROTOCOL 5.000000 -SERIAL4_BAUD 38.000000 -SERIAL4_OPTIONS 0.000000 -SERIAL4_PROTOCOL 5.000000 -SERIAL5_BAUD 57.000000 -SERIAL5_OPTIONS 0.000000 -SERIAL5_PROTOCOL -1.000000 -SERIAL6_BAUD 57.000000 -SERIAL6_OPTIONS 0.000000 -SERIAL6_PROTOCOL -1.000000 -SERIAL7_BAUD 57.000000 -SERIAL7_OPTIONS 0.000000 -SERIAL7_PROTOCOL -1.000000 -SERIAL_PASS1 0.000000 -SERIAL_PASS2 -1.000000 -SERIAL_PASSTIMO 15.000000 -SERVO10_FUNCTION 0.000000 -SERVO10_MAX 1900.000000 -SERVO10_MIN 1100.000000 -SERVO10_REVERSED 0.000000 -SERVO10_TRIM 1500.000000 -SERVO11_FUNCTION 0.000000 -SERVO11_MAX 1900.000000 -SERVO11_MIN 1100.000000 -SERVO11_REVERSED 0.000000 -SERVO11_TRIM 1100.000000 -SERVO12_FUNCTION 0.000000 -SERVO12_MAX 1900.000000 -SERVO12_MIN 1100.000000 -SERVO12_REVERSED 0.000000 -SERVO12_TRIM 1500.000000 -SERVO13_FUNCTION 0.000000 -SERVO13_MAX 1900.000000 -SERVO13_MIN 1100.000000 -SERVO13_REVERSED 0.000000 -SERVO13_TRIM 0.000000 -SERVO14_FUNCTION 0.000000 -SERVO14_MAX 1900.000000 -SERVO14_MIN 1100.000000 -SERVO14_REVERSED 0.000000 -SERVO14_TRIM 1500.000000 -SERVO15_FUNCTION 0.000000 -SERVO15_MAX 1900.000000 -SERVO15_MIN 1100.000000 -SERVO15_REVERSED 0.000000 -SERVO15_TRIM 1500.000000 -SERVO16_FUNCTION 0.000000 -SERVO16_MAX 1900.000000 -SERVO16_MIN 1100.000000 -SERVO16_REVERSED 0.000000 -SERVO16_TRIM 1500.000000 -SERVO1_FUNCTION 34.000000 -SERVO1_MAX 2100.000000 -SERVO1_MIN 900.000000 -SERVO1_REVERSED 1.000000 -SERVO1_TRIM 1500.000000 -SERVO2_FUNCTION 33.000000 -SERVO2_MAX 2100.000000 -SERVO2_MIN 900.000000 -SERVO2_REVERSED 0.000000 -SERVO2_TRIM 1500.000000 -SERVO3_FUNCTION 35.000000 -SERVO3_MAX 2000.000000 -SERVO3_MIN 1000.000000 -SERVO3_REVERSED 0.000000 -SERVO3_TRIM 1000.000000 -SERVO4_FUNCTION 36.000000 -SERVO4_MAX 2000.000000 -SERVO4_MIN 1000.000000 -SERVO4_REVERSED 0.000000 -SERVO4_TRIM 1000.000000 -SERVO5_FUNCTION 0.000000 -SERVO5_MAX 1801.000000 -SERVO5_MIN 1200.000000 -SERVO5_REVERSED 0.000000 -SERVO5_TRIM 1501.000000 -SERVO6_FUNCTION 0.000000 -SERVO6_MAX 2001.000000 -SERVO6_MIN 1000.000000 -SERVO6_REVERSED 0.000000 -SERVO6_TRIM 1500.000000 -SERVO7_FUNCTION 0.000000 -SERVO7_MAX 1994.000000 -SERVO7_MIN 1003.000000 -SERVO7_REVERSED 0.000000 -SERVO7_TRIM 1504.000000 -SERVO8_FUNCTION 0.000000 -SERVO8_MAX 2001.000000 -SERVO8_MIN 1005.000000 -SERVO8_REVERSED 1.000000 -SERVO8_TRIM 1500.000000 -SERVO9_FUNCTION 0.000000 -SERVO9_MAX 1900.000000 -SERVO9_MIN 1100.000000 -SERVO9_REVERSED 0.000000 -SERVO9_TRIM 1500.000000 -SERVO_32_ENABLE 0.000000 -SERVO_DSHOT_ESC 0.000000 -SERVO_DSHOT_RATE 0.000000 -SERVO_FTW_MASK 0.000000 -SERVO_FTW_POLES 14.000000 -SERVO_FTW_RVMASK 0.000000 -SERVO_GPIO_MASK 32512.000000 -SERVO_RATE 200.000000 -SERVO_ROB_POSMAX 4095.000000 -SERVO_ROB_POSMIN 0.000000 -SERVO_SBUS_RATE 200.000000 -SERVO_VOLZ_MASK 0.000000 -SID_AXIS 0.000000 -SIMPLE 0.000000 -SIM_ACC1_BIAS_X 0.000000 -SIM_ACC1_BIAS_Y 0.000000 -SIM_ACC1_BIAS_Z 0.000000 -SIM_ACC1_RND 0.000000 -SIM_ACC1_SCAL_X 0.000000 -SIM_ACC1_SCAL_Y 0.000000 -SIM_ACC1_SCAL_Z 0.000000 -SIM_ACC2_BIAS_X 0.000000 -SIM_ACC2_BIAS_Y 0.000000 -SIM_ACC2_BIAS_Z 0.000000 -SIM_ACC2_RND 0.000000 -SIM_ACC2_SCAL_X 0.000000 -SIM_ACC2_SCAL_Y 0.000000 -SIM_ACC2_SCAL_Z 0.000000 -SIM_ACC3_BIAS_X 0.000000 -SIM_ACC3_BIAS_Y 0.000000 -SIM_ACC3_BIAS_Z 0.000000 -SIM_ACC3_RND 0.000000 -SIM_ACC3_SCAL_X 0.000000 -SIM_ACC3_SCAL_Y 0.000000 -SIM_ACC3_SCAL_Z 0.000000 -SIM_ACCEL1_FAIL 0.000000 -SIM_ACCEL2_FAIL 0.000000 -SIM_ACCEL3_FAIL 0.000000 -SIM_ACC_FAIL_MSK 0.000000 -SIM_ACC_TRIM_X 0.000000 -SIM_ACC_TRIM_Y 0.000000 -SIM_ACC_TRIM_Z 0.000000 -SIM_ADSB_ALT 1000.000000 -SIM_ADSB_COUNT -1.000000 -SIM_ADSB_RADIUS 10000.000000 -SIM_ADSB_TX 0.000000 -SIM_ARSPD2_FAIL 0.000000 -SIM_ARSPD2_FAILP 0.000000 -SIM_ARSPD2_OFS 2013.000000 -SIM_ARSPD2_PITOT 0.000000 -SIM_ARSPD2_RATIO 1.990000 -SIM_ARSPD2_RND 2.000000 -SIM_ARSPD2_SIGN 0.000000 -SIM_ARSPD_FAIL 0.000000 -SIM_ARSPD_FAILP 0.000000 -SIM_ARSPD_OFS 2013.000000 -SIM_ARSPD_PITOT 0.000000 -SIM_ARSPD_RATIO 1.990000 -SIM_ARSPD_RND 2.000000 -SIM_ARSPD_SIGN 0.000000 -SIM_BAR2_DELAY 0.000000 -SIM_BAR2_DISABLE 0.000000 -SIM_BAR2_DRIFT 0.000000 -SIM_BAR2_FREEZE 0.000000 -SIM_BAR2_GLITCH 0.000000 -SIM_BAR2_RND 0.200000 -SIM_BAR2_WCF_BAK 0.000000 -SIM_BAR2_WCF_FWD 0.000000 -SIM_BAR2_WCF_LFT 0.000000 -SIM_BAR2_WCF_RGT 0.000000 -SIM_BAR3_DELAY 0.000000 -SIM_BAR3_DISABLE 0.000000 -SIM_BAR3_DRIFT 0.000000 -SIM_BAR3_FREEZE 0.000000 -SIM_BAR3_GLITCH 0.000000 -SIM_BAR3_RND 0.200000 -SIM_BAR3_WCF_BAK 0.000000 -SIM_BAR3_WCF_FWD 0.000000 -SIM_BAR3_WCF_LFT 0.000000 -SIM_BAR3_WCF_RGT 0.000000 -SIM_BARO_COUNT 2.000000 -SIM_BARO_DELAY 0.000000 -SIM_BARO_DISABLE 0.000000 -SIM_BARO_DRIFT 0.000000 -SIM_BARO_FREEZE 0.000000 -SIM_BARO_GLITCH 0.000000 -SIM_BARO_RND 0.200000 -SIM_BARO_WCF_BAK 0.000000 -SIM_BARO_WCF_FWD 0.000000 -SIM_BARO_WCF_LFT 0.000000 -SIM_BARO_WCF_RGT 0.000000 -SIM_BATT_CAP_AH 17.000000 -SIM_BATT_NUM 1.000000 -SIM_BATT_RES_OHM 0.070000 -SIM_BATT_VOLTAGE 500.000000 -SIM_BAUDLIMIT_EN 0.000000 -SIM_CORE_KG 2.330000 -SIM_DRIFT_SPEED 0.050000 -SIM_DRIFT_TIME 5.000000 -SIM_EFI_TYPE 0.000000 -SIM_ENGINE_FAIL 0.000000 -SIM_ENGINE_MUL 1.000000 -SIM_ESC_ARM_RPM 0.000000 -SIM_ESC_TELEM 1.000000 -SIM_FLOAT_EXCEPT 1.000000 -SIM_FLOW_DELAY 0.000000 -SIM_FLOW_ENABLE 0.000000 -SIM_FLOW_POS_X 0.000000 -SIM_FLOW_POS_Y 0.000000 -SIM_FLOW_POS_Z 0.000000 -SIM_FLOW_RATE 10.000000 -SIM_FLOW_RND 0.050000 -SIM_FTOWESC_ENA 0.000000 -SIM_FTOWESC_POW 4095.000000 -SIM_GND_BEHAV -1.000000 -SIM_GPS2_ACC 0.300000 -SIM_GPS2_ALT_OFS 0.000000 -SIM_GPS2_BYTELOS 0.000000 -SIM_GPS2_DISABLE 0.000000 -SIM_GPS2_DRFTALT 0.000000 -SIM_GPS2_GLTCH_X 0.000000 -SIM_GPS2_GLTCH_Y 0.000000 -SIM_GPS2_GLTCH_Z 0.000000 -SIM_GPS2_HDG 0.000000 -SIM_GPS2_HZ 5.000000 -SIM_GPS2_LAG_MS 100.000000 -SIM_GPS2_LCKTIME 0.000000 -SIM_GPS2_NOISE 0.000000 -SIM_GPS2_NUMSATS 10.000000 -SIM_GPS2_POS_X 0.000000 -SIM_GPS2_POS_Y 0.000000 -SIM_GPS2_POS_Z 0.000000 -SIM_GPS2_TYPE 1.000000 -SIM_GPS2_VERR_X 0.000000 -SIM_GPS2_VERR_Y 0.000000 -SIM_GPS2_VERR_Z 0.000000 -SIM_GPS_ACC 0.300000 -SIM_GPS_ALT_OFS 0.000000 -SIM_GPS_BYTELOSS 0.000000 -SIM_GPS_DISABLE 0.000000 -SIM_GPS_DRIFTALT 0.000000 -SIM_GPS_GLITCH_X 0.000000 -SIM_GPS_GLITCH_Y 0.000000 -SIM_GPS_GLITCH_Z 0.000000 -SIM_GPS_HDG 0.000000 -SIM_GPS_HZ 5.000000 -SIM_GPS_LAG_MS 100.000000 -SIM_GPS_LOCKTIME 0.000000 -SIM_GPS_NOISE 0.000000 -SIM_GPS_NUMSATS 10.000000 -SIM_GPS_POS_X 0.000000 -SIM_GPS_POS_Y 0.000000 -SIM_GPS_POS_Z 0.000000 -SIM_GPS_TYPE 1.000000 -SIM_GPS_VERR_X 0.000000 -SIM_GPS_VERR_Y 0.000000 -SIM_GPS_VERR_Z 0.000000 -SIM_GRPE_ENABLE 0.000000 -SIM_GRPE_PIN -1.000000 -SIM_GRPS_ENABLE 0.000000 -SIM_GRPS_GRAB 2000.000000 -SIM_GRPS_PIN -1.000000 -SIM_GRPS_RELEASE 1000.000000 -SIM_GRPS_REVERSE 0.000000 -SIM_GYR1_RND 0.000000 -SIM_GYR1_SCALE_X 0.000000 -SIM_GYR1_SCALE_Y 0.000000 -SIM_GYR1_SCALE_Z 0.000000 -SIM_GYR2_RND 0.000000 -SIM_GYR2_SCALE_X 0.000000 -SIM_GYR2_SCALE_Y 0.000000 -SIM_GYR2_SCALE_Z 0.000000 -SIM_GYR3_RND 0.000000 -SIM_GYR3_SCALE_X 0.000000 -SIM_GYR3_SCALE_Y 0.000000 -SIM_GYR3_SCALE_Z 0.000000 -SIM_GYR_FAIL_MSK 0.000000 -SIM_IE24_ENABLE 0.000000 -SIM_IE24_ERROR 0.000000 -SIM_IE24_STATE -1.000000 -SIM_IMUT1_ENABLE 0.000000 -SIM_IMUT2_ENABLE 0.000000 -SIM_IMUT3_ENABLE 0.000000 -SIM_IMUT_END 45.000000 -SIM_IMUT_FIXED 0.000000 -SIM_IMUT_START 25.000000 -SIM_IMUT_TCONST 300.000000 -SIM_IMU_COUNT 3.000000 -SIM_IMU_POS_X 0.000000 -SIM_IMU_POS_Y 0.000000 -SIM_IMU_POS_Z 0.000000 -SIM_INIT_ALT_OFS 0.000000 -SIM_INIT_LAT_OFS 0.000000 -SIM_INIT_LON_OFS 0.000000 -SIM_INS_THR_MIN 0.100000 -SIM_JSON_MASTER 0.000000 -SIM_LED_LAYOUT 0.000000 -SIM_LOOP_DELAY 0.000000 -SIM_MAG1_DEVID 97539.000000 -SIM_MAG1_FAIL 0.000000 -SIM_MAG1_SCALING 1.000000 -SIM_MAG2_DEVID 131874.000000 -SIM_MAG2_DIA_X 0.000000 -SIM_MAG2_DIA_Y 0.000000 -SIM_MAG2_DIA_Z 0.000000 -SIM_MAG2_FAIL 0.000000 -SIM_MAG2_ODI_X 0.000000 -SIM_MAG2_ODI_Y 0.000000 -SIM_MAG2_ODI_Z 0.000000 -SIM_MAG2_OFS_X 5.000000 -SIM_MAG2_OFS_Y 13.000000 -SIM_MAG2_OFS_Z -18.000000 -SIM_MAG2_ORIENT 0.000000 -SIM_MAG2_SCALING 1.000000 -SIM_MAG3_DEVID 263178.000000 -SIM_MAG3_DIA_X 0.000000 -SIM_MAG3_DIA_Y 0.000000 -SIM_MAG3_DIA_Z 0.000000 -SIM_MAG3_FAIL 0.000000 -SIM_MAG3_ODI_X 0.000000 -SIM_MAG3_ODI_Y 0.000000 -SIM_MAG3_ODI_Z 0.000000 -SIM_MAG3_OFS_X 5.000000 -SIM_MAG3_OFS_Y 13.000000 -SIM_MAG3_OFS_Z -18.000000 -SIM_MAG3_ORIENT 0.000000 -SIM_MAG3_SCALING 1.000000 -SIM_MAG4_DEVID 97283.000000 -SIM_MAG5_DEVID 97795.000000 -SIM_MAG6_DEVID 98051.000000 -SIM_MAG7_DEVID 0.000000 -SIM_MAG8_DEVID 0.000000 -SIM_MAG_ALY_HGT 1.000000 -SIM_MAG_ALY_X 0.000000 -SIM_MAG_ALY_Y 0.000000 -SIM_MAG_ALY_Z 0.000000 -SIM_MAG_DELAY 0.000000 -SIM_MAG_DIA_X 0.000000 -SIM_MAG_DIA_Y 0.000000 -SIM_MAG_DIA_Z 0.000000 -SIM_MAG_MOT_X 0.000000 -SIM_MAG_MOT_Y 0.000000 -SIM_MAG_MOT_Z 0.000000 -SIM_MAG_ODI_X 0.000000 -SIM_MAG_ODI_Y 0.000000 -SIM_MAG_ODI_Z 0.000000 -SIM_MAG_OFS_X 5.000000 -SIM_MAG_OFS_Y 13.000000 -SIM_MAG_OFS_Z -18.000000 -SIM_MAG_ORIENT 0.000000 -SIM_MAG_RND 0.000000 -SIM_ODOM_ENABLE 0.000000 -SIM_OH_MASK 0.000000 -SIM_OPOS_ALT 584.000000 -SIM_OPOS_HDG 353.000000 -SIM_OPOS_LAT -35.363258 -SIM_OPOS_LNG 149.165207 -SIM_PARA_ENABLE 0.000000 -SIM_PARA_PIN -1.000000 -SIM_PAYLOAD_KG 0.000000 -SIM_PIN_MASK 0.000000 -SIM_PLD_ALT_LMT 15.000000 -SIM_PLD_DIST_LMT 10.000000 -SIM_PLD_ENABLE 0.000000 -SIM_PLD_HEIGHT 0.000000 -SIM_PLD_LAT 0.000000 -SIM_PLD_LON 0.000000 -SIM_PLD_OPTIONS 0.000000 -SIM_PLD_ORIENT 24.000000 -SIM_PLD_RATE 100.000000 -SIM_PLD_TYPE 0.000000 -SIM_PLD_YAW 0.000000 -SIM_RATE_HZ 1200.000000 -SIM_RC_CHANCOUNT 16.000000 -SIM_RC_FAIL 0.000000 -SIM_RICH_CTRL -1.000000 -SIM_RICH_ENABLE 0.000000 -SIM_SAFETY_STATE 2.000000 -SIM_SAIL_TYPE 0.000000 -SIM_SERVO_SPEED 0.140000 -SIM_SHIP_DSIZE 10.000000 -SIM_SHIP_ENABLE 0.000000 -SIM_SHIP_OFS_X 0.000000 -SIM_SHIP_OFS_Y 0.000000 -SIM_SHIP_OFS_Z 0.000000 -SIM_SHIP_PSIZE 1000.000000 -SIM_SHIP_SPEED 3.000000 -SIM_SHIP_SYSID 17.000000 -SIM_SHOVE_TIME 0.000000 -SIM_SHOVE_X 0.000000 -SIM_SHOVE_Y 0.000000 -SIM_SHOVE_Z 0.000000 -SIM_SONAR_GLITCH 0.000000 -SIM_SONAR_POS_X 0.000000 -SIM_SONAR_POS_Y 0.000000 -SIM_SONAR_POS_Z 0.000000 -SIM_SONAR_RND 0.000000 -SIM_SONAR_ROT 25.000000 -SIM_SONAR_SCALE 12.121200 -SIM_SPEEDUP -1.000000 -SIM_SPR_ENABLE 0.000000 -SIM_SPR_PUMP -1.000000 -SIM_SPR_SPIN -1.000000 -SIM_TA_ENABLE 1.000000 -SIM_TEMP_BFACTOR 0.000000 -SIM_TEMP_BRD_OFF 20.000000 -SIM_TEMP_START 25.000000 -SIM_TEMP_TCONST 30.000000 -SIM_TERRAIN 1.000000 -SIM_THML_SCENARI 0.000000 -SIM_TIDE_DIR 0.000000 -SIM_TIDE_SPEED 0.000000 -SIM_TWIST_TIME 0.000000 -SIM_TWIST_X 0.000000 -SIM_TWIST_Y 0.000000 -SIM_TWIST_Z 0.000000 -SIM_VIB_FREQ_X 0.000000 -SIM_VIB_FREQ_Y 0.000000 -SIM_VIB_FREQ_Z 0.000000 -SIM_VIB_MOT_HMNC 1.000000 -SIM_VIB_MOT_MASK 0.000000 -SIM_VIB_MOT_MAX 0.000000 -SIM_VIB_MOT_MULT 1.000000 -SIM_VICON_FAIL 0.000000 -SIM_VICON_GLIT_X 0.000000 -SIM_VICON_GLIT_Y 0.000000 -SIM_VICON_GLIT_Z 0.000000 -SIM_VICON_POS_X 0.000000 -SIM_VICON_POS_Y 0.000000 -SIM_VICON_POS_Z 0.000000 -SIM_VICON_TMASK 3.000000 -SIM_VICON_VGLI_X 0.000000 -SIM_VICON_VGLI_Y 0.000000 -SIM_VICON_VGLI_Z 0.000000 -SIM_VICON_YAW 0.000000 -SIM_VICON_YAWERR 0.000000 -SIM_WAVE_AMP 0.500000 -SIM_WAVE_DIR 0.000000 -SIM_WAVE_ENABLE 0.000000 -SIM_WAVE_LENGTH 10.000000 -SIM_WAVE_SPEED 0.500000 -SIM_WIND_DIR 180.000000 -SIM_WIND_DIR_Z 0.000000 -SIM_WIND_SPD 0.000000 -SIM_WIND_T 0.000000 -SIM_WIND_TURB 0.000000 -SIM_WIND_T_ALT 60.000000 -SIM_WIND_T_COEF 0.010000 -SIM_WOW_PIN -1.000000 -SPRAY_ENABLE 0.000000 -SR0_ADSB 120.000000 -SR0_EXTRA1 120.000000 -SR0_EXTRA2 120.000000 -SR0_EXTRA3 120.000000 -SR0_EXT_STAT 120.000000 -SR0_PARAMS 0.000000 -SR0_POSITION 120.000000 -SR0_RAW_CTRL 120.000000 -SR0_RAW_SENS 120.000000 -SR0_RC_CHAN 120.000000 -SR1_ADSB 0.000000 -SR1_EXTRA1 0.000000 -SR1_EXTRA2 0.000000 -SR1_EXTRA3 0.000000 -SR1_EXT_STAT 0.000000 -SR1_PARAMS 0.000000 -SR1_POSITION 0.000000 -SR1_RAW_CTRL 0.000000 -SR1_RAW_SENS 0.000000 -SR1_RC_CHAN 0.000000 -SR2_ADSB 0.000000 -SR2_EXTRA1 0.000000 -SR2_EXTRA2 0.000000 -SR2_EXTRA3 0.000000 -SR2_EXT_STAT 0.000000 -SR2_PARAMS 0.000000 -SR2_POSITION 0.000000 -SR2_RAW_CTRL 0.000000 -SR2_RAW_SENS 0.000000 -SR2_RC_CHAN 0.000000 -SR3_ADSB 0.000000 -SR3_EXTRA1 0.000000 -SR3_EXTRA2 0.000000 -SR3_EXTRA3 0.000000 -SR3_EXT_STAT 0.000000 -SR3_PARAMS 0.000000 -SR3_POSITION 0.000000 -SR3_RAW_CTRL 0.000000 -SR3_RAW_SENS 0.000000 -SR3_RC_CHAN 0.000000 -SR4_ADSB 0.000000 -SR4_EXTRA1 0.000000 -SR4_EXTRA2 0.000000 -SR4_EXTRA3 0.000000 -SR4_EXT_STAT 0.000000 -SR4_PARAMS 0.000000 -SR4_POSITION 0.000000 -SR4_RAW_CTRL 0.000000 -SR4_RAW_SENS 0.000000 -SR4_RC_CHAN 0.000000 -SR5_ADSB 0.000000 -SR5_EXTRA1 0.000000 -SR5_EXTRA2 0.000000 -SR5_EXTRA3 0.000000 -SR5_EXT_STAT 0.000000 -SR5_PARAMS 0.000000 -SR5_POSITION 0.000000 -SR5_RAW_CTRL 0.000000 -SR5_RAW_SENS 0.000000 -SR5_RC_CHAN 0.000000 -SR6_ADSB 0.000000 -SR6_EXTRA1 0.000000 -SR6_EXTRA2 0.000000 -SR6_EXTRA3 0.000000 -SR6_EXT_STAT 0.000000 -SR6_PARAMS 0.000000 -SR6_POSITION 0.000000 -SR6_RAW_CTRL 0.000000 -SR6_RAW_SENS 0.000000 -SR6_RC_CHAN 0.000000 -SRTL_ACCURACY 2.000000 -SRTL_OPTIONS 0.000000 -SRTL_POINTS 0.000000 -STAT_BOOTCNT 194.000000 -STAT_FLTTIME 10581.000000 -STAT_RESET 255623488.000000 -STAT_RMFLTTIME1 80881.000000 -STAT_RMFLTTIME2 890881.000000 -STAT_RUNTIME 431602.000000 -SUPER_SIMPLE 0.000000 -SURFTRAK_MODE 1.000000 -SYSID_ENFORCE 0.000000 -SYSID_MYGCS 255.000000 -SYSID_THISMAV 1.000000 -TCAL_ENABLED 0.000000 -TELEM_DELAY 0.000000 -TERRAIN_ENABLE 1.000000 -TERRAIN_MARGIN 0.050000 -TERRAIN_OFS_MAX 15.000000 -TERRAIN_OPTIONS 0.000000 -TERRAIN_SPACING 100.000000 -THROW_MOT_START 0.000000 -THROW_NEXTMODE 18.000000 -THROW_TYPE 0.000000 -THR_DZ 10.000000 -TKOFF_RPM_MIN 0.000000 -TKOFF_SLEW_TIME 1.000000 -TUNE 0.000000 -TUNE_MAX 0.000000 -TUNE_MIN 0.000000 -VISO_TYPE 0.000000 -VTX_ENABLE 0.000000 -WINCH_TYPE 0.000000 -WPNAV_ACCEL 250.000000 -WPNAV_ACCEL_Z 200.000000 -WPNAV_JERK 1.000000 -WPNAV_RADIUS 300.000000 -WPNAV_RFND_USE 0.000000 -WPNAV_SPEED 1500.000000 -WPNAV_SPEED_DN 300.000000 -WPNAV_SPEED_UP 500.000000 -WPNAV_TER_MARGIN 10.000000 -WP_NAVALT_MIN 0.000000 -WP_YAW_BEHAVIOR 2.000000 -ZIGZ_AUTO_ENABLE 0.000000 diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav.tlog b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav.tlog deleted file mode 100644 index 7d7512d9..00000000 Binary files a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav.tlog and /dev/null differ diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav.tlog.raw b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav.tlog.raw deleted file mode 100644 index 201a7d0d..00000000 Binary files a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav.tlog.raw and /dev/null differ diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav_0_1.parm b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav_0_1.parm deleted file mode 100644 index 0b482820..00000000 --- a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/mav_0_1.parm +++ /dev/null @@ -1,1392 +0,0 @@ -AA_ANG_KP_HI 5.250000 -AA_ANG_KP_IN 7.000000 -AA_ANG_KP_LO 4.000000 -AA_ANG_KP_SL -0.230000 -AA_AUTO_CONF 1 -AA_BATT_CAP 6000 -AA_BATT_NUM 1 -AA_BATT_P 2 -AA_BATT_R_HI 0.021000 -AA_BATT_S 12 -AA_BLD_HUNG 3.000000 -AA_CAM_TYPE 0 -AA_FTC_EN 1 -AA_FTC_ON_RBT 1 -AA_GCS_TYPE 4 -AA_KS_MS 200 -AA_NTRL_ANGL 20.000000 -AA_PAYLD_WT 0.000000 -AA_RAT_KD_HI 0.018000 -AA_RAT_KD_IN 0.004217 -AA_RAT_KD_LO 0.005000 -AA_RAT_KD_SL 0.000273 -AA_RAT_KI_HI 0.290000 -AA_RAT_KI_IN -0.038900 -AA_RAT_KI_LO 0.120000 -AA_RAT_KI_SL 0.022500 -AA_RAT_KP_HI 0.350000 -AA_RAT_KP_IN 0.021100 -AA_RAT_KP_LO 0.180000 -AA_RAT_KP_SL 0.022500 -AA_RPMH_SL 156.000000 -AA_RPMH_SL_HI 4000.000000 -AA_RPMH_SL_IN 1553.000000 -AA_RPMH_SL_LO 2700.000000 -AA_RPM_HOVER 2837.238770 -AA_STW_LND 1 -AA_STW_LND_H 200 -AA_TOP_MNT 0 -AA_TOTAL_WT 8.232301 -AA_TPLE_EN 1 -AA_VEHICLE 1 -AA_VIS_SRC 0 -ACRO_BAL_PITCH 1.000000 -ACRO_BAL_ROLL 1.000000 -ACRO_OPTIONS 0 -ACRO_RP_EXPO 0.300000 -ACRO_RP_RATE 360.000000 -ACRO_RP_RATE_TC 0.000000 -ACRO_THR_MID 0.000000 -ACRO_TRAINER 2 -ACRO_Y_EXPO 0.000000 -ACRO_Y_RATE 202.500000 -ACRO_Y_RATE_TC 0.000000 -ADSB_TYPE 0 -AHRS_COMP_BETA 0.100000 -AHRS_EKF_TYPE 3 -AHRS_GPS_GAIN 1.000000 -AHRS_GPS_MINSATS 6 -AHRS_GPS_USE 1 -AHRS_ORIENTATION 0 -AHRS_RP_P 0.250000 -AHRS_TRIM_X 0.000107 -AHRS_TRIM_Y -0.000116 -AHRS_TRIM_Z 0.000000 -AHRS_WIND_MAX 0 -AHRS_YAW_P 0.200000 -ANGLE_MAX 3000 -ARMING_ACCTHRESH 0.750000 -ARMING_CHECK 1 -ARMING_MIS_ITEMS 0 -ARMING_OPTIONS 0 -ARMING_RUDDER 2 -ARSPD_TYPE 0 -ATC_ACCEL_P_MAX 105909.296875 -ATC_ACCEL_R_MAX 105909.296875 -ATC_ACCEL_Y_MAX 36000.000000 -ATC_ANGLE_BOOST 1 -ATC_ANG_LIM_TC 5.000000 -ATC_ANG_PIT_P 5.106571 -ATC_ANG_RLL_P 5.106571 -ATC_ANG_YAW_P 3.000000 -ATC_INPUT_TC 0.400000 -ATC_PIRO_COMP 1 -ATC_RATE_FF_ENAB 1 -ATC_RATE_P_MAX 120.000000 -ATC_RATE_R_MAX 120.000000 -ATC_RATE_Y_MAX 90.000000 -ATC_RAT_PIT_D 0.006466 -ATC_RAT_PIT_FF 0.000000 -ATC_RAT_PIT_FLTD 15.000000 -ATC_RAT_PIT_FLTE 15.000000 -ATC_RAT_PIT_FLTT 15.000000 -ATC_RAT_PIT_I 0.146327 -ATC_RAT_PIT_IMAX 0.600000 -ATC_RAT_PIT_P 0.206327 -ATC_RAT_PIT_SMAX 0.000000 -ATC_RAT_RLL_D 0.006466 -ATC_RAT_RLL_FF 0.000000 -ATC_RAT_RLL_FLTD 15.000000 -ATC_RAT_RLL_FLTE 15.000000 -ATC_RAT_RLL_FLTT 15.000000 -ATC_RAT_RLL_I 0.146327 -ATC_RAT_RLL_IMAX 0.600000 -ATC_RAT_RLL_P 0.206327 -ATC_RAT_RLL_SMAX 0.000000 -ATC_RAT_YAW_D 0.000000 -ATC_RAT_YAW_FF 0.000000 -ATC_RAT_YAW_FLTD 20.000000 -ATC_RAT_YAW_FLTE 2.500000 -ATC_RAT_YAW_FLTT 5.000000 -ATC_RAT_YAW_I 0.018000 -ATC_RAT_YAW_IMAX 0.300000 -ATC_RAT_YAW_P 0.180000 -ATC_RAT_YAW_SMAX 0.000000 -ATC_SLEW_YAW 6000.000000 -ATC_THR_MIX_MAN 0.500000 -ATC_THR_MIX_MAX 0.500000 -ATC_THR_MIX_MIN 0.100000 -AUTOTUNE_AGGR 0.075000 -AUTOTUNE_AXES 2 -AUTOTUNE_MIN_D 0.002000 -AUTO_OPTIONS 0 -AVD_ENABLE 0 -AVOID_ACCEL_MAX 3.000000 -AVOID_ALT_MIN 0.000000 -AVOID_ANGLE_MAX 1500 -AVOID_BACKUP_DZ 0.100000 -AVOID_BACKUP_SPD 0.750000 -AVOID_BEHAVE 0 -AVOID_DIST_MAX 5.000000 -AVOID_ENABLE 1 -AVOID_MARGIN 2.000000 -BARO1_DEVID 65540 -BARO1_GND_PRESS 94503.125000 -BARO1_WCF_ENABLE 0 -BARO2_DEVID 65796 -BARO2_GND_PRESS 94502.125000 -BARO2_WCF_ENABLE 0 -BARO3_DEVID 0 -BARO3_GND_PRESS 0.000000 -BARO3_WCF_ENABLE 0 -BARO_ALTERR_MAX 2000.000000 -BARO_ALT_OFFSET 0.000000 -BARO_EXT_BUS -1 -BARO_FIELD_ELV 0.000000 -BARO_FLTR_RNG 30 -BARO_GND_TEMP 0.000000 -BARO_OPTIONS 0 -BARO_PRIMARY 0 -BARO_PROBE_EXT 0 -BATT2_MONITOR 0 -BATT3_MONITOR 0 -BATT4_MONITOR 0 -BATT5_MONITOR 0 -BATT6_MONITOR 0 -BATT7_MONITOR 0 -BATT8_MONITOR 0 -BATT9_MONITOR 0 -BATT_AMP_OFFSET 0.000000 -BATT_AMP_PERVLT 17.000000 -BATT_ARM_MAH 0 -BATT_ARM_VOLT 0.000000 -BATT_CAPACITY 6000 -BATT_CRT_MAH 0.000000 -BATT_CRT_VOLT 36.000000 -BATT_CURR_PIN 12 -BATT_FS_CRT_ACT 0 -BATT_FS_LOW_ACT 0 -BATT_FS_VOLTSRC 0 -BATT_LOW_MAH 0.000000 -BATT_LOW_TIMER 10 -BATT_LOW_VOLT 38.000000 -BATT_MONITOR 4 -BATT_OPTIONS 0 -BATT_SERIAL_NUM -1 -BATT_VLT_OFFSET 0.000000 -BATT_VOLT_MULT 10.100000 -BATT_VOLT_PIN 13 -BCN_TYPE 0 -BRD_BOOT_DELAY 0 -BRD_OPTIONS 1 -BRD_RTC_TYPES 1 -BRD_RTC_TZ_MIN 0 -BRD_SAFETYENABLE 0 -BRD_SAFETYOPTION 0 -BRD_SAFETY_MASK 0 -BRD_SERIAL_NUM 0 -BRD_VBUS_MIN 4.300000 -BRD_VSERVO_MIN 4.000000 -BTN_ENABLE 0 -CAM_AUTO_ONLY 0 -CAM_DURATION 10 -CAM_FEEDBACK_PIN -1 -CAM_FEEDBACK_POL 1 -CAM_MAX_ROLL 0 -CAM_MIN_INTERVAL 0 -CAM_RC_TYPE 0 -CAM_RELAY_ON 1 -CAM_SERVO_OFF 1100 -CAM_SERVO_ON 1300 -CAM_TRIGG_DIST 0.000000 -CAM_TRIGG_TYPE 0 -CAM_TYPE 0 -CAN_D1_PROTOCOL 0 -CAN_D2_PROTOCOL 0 -CAN_LOGLEVEL 0 -CAN_P1_DRIVER 0 -CAN_P2_DRIVER 0 -CAN_SLCAN_CPORT 0 -CAN_SLCAN_SDELAY 1 -CAN_SLCAN_SERNUM -1 -CAN_SLCAN_TIMOUT 0 -CC_TYPE 0 -CHUTE_ENABLED 0 -CIRCLE_OPTIONS 5 -CIRCLE_RADIUS 6000.000000 -CIRCLE_RATE 8.000000 -COMPASS_AUTODEC 1 -COMPASS_AUTO_ROT 2 -COMPASS_CAL_FIT 32.000000 -COMPASS_DEC 0.220826 -COMPASS_DEV_ID 97539 -COMPASS_DEV_ID2 131874 -COMPASS_DEV_ID3 263178 -COMPASS_DEV_ID4 97283 -COMPASS_DEV_ID5 97795 -COMPASS_DEV_ID6 98051 -COMPASS_DEV_ID7 0 -COMPASS_DEV_ID8 0 -COMPASS_DIA2_X 1.000000 -COMPASS_DIA2_Y 1.000000 -COMPASS_DIA2_Z 1.000000 -COMPASS_DIA3_X 1.000000 -COMPASS_DIA3_Y 1.000000 -COMPASS_DIA3_Z 1.000000 -COMPASS_DIA_X 1.000000 -COMPASS_DIA_Y 1.000000 -COMPASS_DIA_Z 1.000000 -COMPASS_ENABLE 1 -COMPASS_EXTERN2 0 -COMPASS_EXTERN3 0 -COMPASS_EXTERNAL 1 -COMPASS_FLTR_RNG 30 -COMPASS_LEARN 0 -COMPASS_MOT2_X 0.000000 -COMPASS_MOT2_Y 0.000000 -COMPASS_MOT2_Z 0.000000 -COMPASS_MOT3_X 0.000000 -COMPASS_MOT3_Y 0.000000 -COMPASS_MOT3_Z 0.000000 -COMPASS_MOTCT 0 -COMPASS_MOT_X 0.000000 -COMPASS_MOT_Y 0.000000 -COMPASS_MOT_Z 0.000000 -COMPASS_ODI2_X 0.000000 -COMPASS_ODI2_Y 0.000000 -COMPASS_ODI2_Z 0.000000 -COMPASS_ODI3_X 0.000000 -COMPASS_ODI3_Y 0.000000 -COMPASS_ODI3_Z 0.000000 -COMPASS_ODI_X 0.000000 -COMPASS_ODI_Y 0.000000 -COMPASS_ODI_Z 0.000000 -COMPASS_OFFS_MAX 1800 -COMPASS_OFS2_X 5.000000 -COMPASS_OFS2_Y 13.000000 -COMPASS_OFS2_Z -18.000000 -COMPASS_OFS3_X 5.000000 -COMPASS_OFS3_Y 13.000000 -COMPASS_OFS3_Z -18.000000 -COMPASS_OFS_X 5.000000 -COMPASS_OFS_Y 13.000000 -COMPASS_OFS_Z -18.000000 -COMPASS_OPTIONS 0 -COMPASS_ORIENT 0 -COMPASS_ORIENT2 0 -COMPASS_ORIENT3 0 -COMPASS_PMOT_EN 0 -COMPASS_PRIO1_ID 97539 -COMPASS_PRIO2_ID 131874 -COMPASS_PRIO3_ID 263178 -COMPASS_SCALE 1.000000 -COMPASS_SCALE2 1.000000 -COMPASS_SCALE3 1.000000 -COMPASS_TYPEMASK 0 -COMPASS_USE 1 -COMPASS_USE2 1 -COMPASS_USE3 0 -CUST_ROT_ENABLE 0 -DEV_OPTIONS 0 -DID_ENABLE 0 -DISARM_DELAY 8 -EAHRS_TYPE 0 -EFI_TYPE 0 -EK2_ENABLE 0 -EK3_ABIAS_P_NSE 0.003000 -EK3_ACC_BIAS_LIM 1.000000 -EK3_ACC_P_NSE 0.350000 -EK3_AFFINITY 0 -EK3_ALT_M_NSE 2.000000 -EK3_BCN_DELAY 50 -EK3_BCN_I_GTE 500 -EK3_BCN_M_NSE 1.000000 -EK3_BETA_MASK 0 -EK3_CHECK_SCALE 100 -EK3_DRAG_BCOEF_X 0.000000 -EK3_DRAG_BCOEF_Y 0.000000 -EK3_DRAG_MCOEF 0.000000 -EK3_DRAG_M_NSE 0.500000 -EK3_EAS_I_GATE 400 -EK3_EAS_M_NSE 1.400000 -EK3_ENABLE 1 -EK3_ERR_THRESH 0.200000 -EK3_FLOW_DELAY 10 -EK3_FLOW_I_GATE 300 -EK3_FLOW_M_NSE 0.250000 -EK3_FLOW_USE 1 -EK3_GBIAS_P_NSE 0.001000 -EK3_GLITCH_RAD 25 -EK3_GND_EFF_DZ 4.000000 -EK3_GPS_CHECK 31 -EK3_GPS_VACC_MAX 0.000000 -EK3_GSF_RST_MAX 2 -EK3_GSF_RUN_MASK 7 -EK3_GSF_USE_MASK 7 -EK3_GYRO_P_NSE 0.015000 -EK3_HGT_DELAY 60 -EK3_HGT_I_GATE 500 -EK3_HRT_FILT 2.000000 -EK3_IMU_MASK 7 -EK3_LOG_LEVEL 0 -EK3_MAGB_P_NSE 0.000100 -EK3_MAGE_P_NSE 0.001000 -EK3_MAG_CAL 3 -EK3_MAG_EF_LIM 50 -EK3_MAG_I_GATE 300 -EK3_MAG_MASK 0 -EK3_MAG_M_NSE 0.050000 -EK3_MAX_FLOW 2.500000 -EK3_NOAID_M_NSE 10.000000 -EK3_OGNM_TEST_SF 2.000000 -EK3_OGN_HGT_MASK 0 -EK3_POSNE_M_NSE 0.500000 -EK3_POS_I_GATE 500 -EK3_PRIMARY 1 -EK3_RNG_I_GATE 500 -EK3_RNG_M_NSE 0.500000 -EK3_RNG_USE_HGT -1 -EK3_RNG_USE_SPD 2.000000 -EK3_SRC1_POSXY 3 -EK3_SRC1_POSZ 1 -EK3_SRC1_VELXY 3 -EK3_SRC1_VELZ 3 -EK3_SRC1_YAW 1 -EK3_SRC2_POSXY 0 -EK3_SRC2_POSZ 1 -EK3_SRC2_VELXY 0 -EK3_SRC2_VELZ 0 -EK3_SRC2_YAW 0 -EK3_SRC3_POSXY 0 -EK3_SRC3_POSZ 1 -EK3_SRC3_VELXY 0 -EK3_SRC3_VELZ 0 -EK3_SRC3_YAW 0 -EK3_SRC_OPTIONS 1 -EK3_TAU_OUTPUT 25 -EK3_TERR_GRAD 0.100000 -EK3_VELD_M_NSE 0.500000 -EK3_VELNE_M_NSE 0.300000 -EK3_VEL_I_GATE 500 -EK3_VIS_VERR_MAX 0.900000 -EK3_VIS_VERR_MIN 0.100000 -EK3_WENC_VERR 0.100000 -EK3_WIND_PSCALE 1.000000 -EK3_WIND_P_NSE 0.200000 -EK3_YAW_I_GATE 300 -EK3_YAW_M_NSE 0.500000 -ESC_CALIBRATION 0 -ESC_TLM_MAV_OFS 0 -FENCE_ACTION 0 -FENCE_ALT_MAX 100.000000 -FENCE_ALT_MIN -30.000000 -FENCE_ENABLE 0 -FENCE_MARGIN 2.000000 -FENCE_RADIUS 152.399994 -FENCE_TOTAL 0 -FENCE_TYPE 0 -FFT_ENABLE 0 -FHLD_BRAKE_RATE 8 -FHLD_FILT_HZ 5.000000 -FHLD_FLOW_MAX 0.600000 -FHLD_QUAL_MIN 10 -FHLD_XY_FILT_HZ 5.000000 -FHLD_XY_I 0.300000 -FHLD_XY_IMAX 3000.000000 -FHLD_XY_P 0.200000 -FLIGHT_OPTIONS 0 -FLOW_TYPE 0 -FLTMODE1 2 -FLTMODE2 2 -FLTMODE3 5 -FLTMODE4 6 -FLTMODE5 6 -FLTMODE6 6 -FLTMODE_CH 0 -FOLL_ENABLE 0 -FORMAT_VERSION 120 -FRAME_CLASS 9 -FRAME_TYPE 1 -FRSKY_DNLINK1_ID 20 -FRSKY_DNLINK2_ID 7 -FRSKY_DNLINK_ID 27 -FRSKY_OPTIONS 0 -FRSKY_UPLINK_ID 13 -FS_CRASH_CHECK 1 -FS_DR_ENABLE 0 -FS_DR_TIMEOUT 30 -FS_EKF_ACTION 2 -FS_EKF_THRESH 0.800000 -FS_GCS_ENABLE 1 -FS_GCS_TIMEOUT 5.000000 -FS_OPTIONS 8 -FS_THR_ENABLE 1 -FS_THR_VALUE 950 -FS_VIBE_ENABLE 1 -GCS_PID_MASK 0 -GEN_TYPE 0 -GND_EFFECT_COMP 1 -GPS1_CAN_OVRIDE 0 -GPS2_CAN_OVRIDE 0 -GPS_AUTO_CONFIG 1 -GPS_AUTO_SWITCH 1 -GPS_BLEND_MASK 5 -GPS_BLEND_TC 10.000000 -GPS_CAN_NODEID1 0 -GPS_CAN_NODEID2 0 -GPS_COM_PORT 1 -GPS_COM_PORT2 1 -GPS_DELAY_MS 0 -GPS_DELAY_MS2 0 -GPS_DRV_OPTIONS 0 -GPS_GNSS_MODE 0 -GPS_GNSS_MODE2 0 -GPS_HDOP_GOOD 140 -GPS_INJECT_TO 127 -GPS_MB1_TYPE 0 -GPS_MB2_TYPE 0 -GPS_MIN_DGPS 100 -GPS_MIN_ELEV -100 -GPS_NAVFILTER 8 -GPS_POS1_X 0.000000 -GPS_POS1_Y 0.000000 -GPS_POS1_Z -0.200000 -GPS_POS2_X 0.000000 -GPS_POS2_Y 0.000000 -GPS_POS2_Z 0.000000 -GPS_PRIMARY 0 -GPS_RATE_MS 200 -GPS_RATE_MS2 200 -GPS_RAW_DATA 0 -GPS_SAVE_CFG 2 -GPS_SBAS_MODE 2 -GPS_SBP_LOGMASK -256 -GPS_TYPE 1 -GPS_TYPE2 0 -GRIP_ENABLE 0 -GUID_OPTIONS 0 -GUID_TIMEOUT 3.000000 -INITIAL_MODE 2 -INS_ACC1_CALTEMP 25.018280 -INS_ACC2OFFS_X 0.001000 -INS_ACC2OFFS_Y 0.001000 -INS_ACC2OFFS_Z 0.001000 -INS_ACC2SCAL_X 1.000000 -INS_ACC2SCAL_Y 1.000000 -INS_ACC2SCAL_Z 1.000000 -INS_ACC2_CALTEMP 25.018280 -INS_ACC2_ID 2753036 -INS_ACC3OFFS_X 0.001000 -INS_ACC3OFFS_Y 0.001000 -INS_ACC3OFFS_Z 0.001000 -INS_ACC3SCAL_X 1.000000 -INS_ACC3SCAL_Y 1.000000 -INS_ACC3SCAL_Z 1.000000 -INS_ACC3_CALTEMP -300.000000 -INS_ACC3_ID 2753044 -INS_ACCEL_FILTER 20 -INS_ACCOFFS_X 0.001000 -INS_ACCOFFS_Y 0.001000 -INS_ACCOFFS_Z 0.001000 -INS_ACCSCAL_X 1.000000 -INS_ACCSCAL_Y 1.000000 -INS_ACCSCAL_Z 1.000000 -INS_ACC_BODYFIX 1 -INS_ACC_ID 2753028 -INS_ENABLE_MASK 127 -INS_FAST_SAMPLE 7 -INS_GYR1_CALTEMP 26.901920 -INS_GYR2OFFS_X 0.000474 -INS_GYR2OFFS_Y 0.000467 -INS_GYR2OFFS_Z 0.000444 -INS_GYR2_CALTEMP 26.901920 -INS_GYR2_ID 2752780 -INS_GYR3OFFS_X 0.000471 -INS_GYR3OFFS_Y 0.000466 -INS_GYR3OFFS_Z 0.000460 -INS_GYR3_CALTEMP 26.901920 -INS_GYR3_ID 2752788 -INS_GYROFFS_X 0.000471 -INS_GYROFFS_Y 0.000449 -INS_GYROFFS_Z 0.000465 -INS_GYRO_FILTER 20 -INS_GYRO_RATE 2 -INS_GYR_CAL 0 -INS_GYR_ID 2752772 -INS_HNTC2_ATT 40.000000 -INS_HNTC2_BW 40.000000 -INS_HNTC2_ENABLE 1 -INS_HNTC2_FM_RAT 1.000000 -INS_HNTC2_FREQ 80.000000 -INS_HNTC2_HMNCS 3 -INS_HNTC2_MODE 1 -INS_HNTC2_OPTS 0 -INS_HNTC2_REF 0.000000 -INS_HNTCH_ATT 40.000000 -INS_HNTCH_BW 40.000000 -INS_HNTCH_ENABLE 1 -INS_HNTCH_FM_RAT 1.000000 -INS_HNTCH_FREQ 80.000000 -INS_HNTCH_HMNCS 3 -INS_HNTCH_MODE 1 -INS_HNTCH_OPTS 0 -INS_HNTCH_REF 0.000000 -INS_LOG_BAT_CNT 1024 -INS_LOG_BAT_LGCT 32 -INS_LOG_BAT_LGIN 20 -INS_LOG_BAT_MASK 0 -INS_LOG_BAT_OPT 0 -INS_POS1_X 0.000000 -INS_POS1_Y 0.000000 -INS_POS1_Z 0.150000 -INS_POS2_X 0.000000 -INS_POS2_Y 0.000000 -INS_POS2_Z 0.150000 -INS_POS3_X 0.000000 -INS_POS3_Y 0.000000 -INS_POS3_Z 0.150000 -INS_STILL_THRESH 2.500000 -INS_TCAL1_ENABLE 0 -INS_TCAL2_ENABLE 0 -INS_TCAL3_ENABLE 0 -INS_TCAL_OPTIONS 0 -INS_TRIM_OPTION 1 -INS_USE 1 -INS_USE2 1 -INS_USE3 1 -LAND_ALT_LOW 1200 -LAND_REPOSITION 1 -LAND_SPEED 75 -LAND_SPEED_HIGH 200 -LGR_ENABLE 0 -LOG_BACKEND_TYPE 1 -LOG_BITMASK 161790 -LOG_BLK_RATEMAX 0.000000 -LOG_DISARMED 0 -LOG_FILE_BUFSIZE 32 -LOG_FILE_DSRMROT 0 -LOG_FILE_MB_FREE 500 -LOG_FILE_RATEMAX 0.000000 -LOG_FILE_TIMEOUT 5 -LOG_FORCE_NOLOG 0 -LOG_MAV_BUFSIZE 8 -LOG_MAV_RATEMAX 0.000000 -LOG_REPLAY 0 -LOIT_ACC_MAX 300.000000 -LOIT_ANG_MAX 0.000000 -LOIT_BRK_ACCEL 200.000000 -LOIT_BRK_DELAY 0.500000 -LOIT_BRK_JERK 750.000000 -LOIT_SPEED 1500.000000 -MIS_OPTIONS 0 -MIS_RESTART 0 -MIS_TOTAL 0 -MNT1_TYPE 0 -MNT2_TYPE 0 -MOT_BAT_CURR_MAX 0.000000 -MOT_BAT_CURR_TC 1.000000 -MOT_BAT_IDX 0 -MOT_BAT_VOLT_MAX 0.000000 -MOT_BAT_VOLT_MIN 0.000000 -MOT_BOOST_SCALE 0.000000 -MOT_EN_RPM_COMP 1 -MOT_HOVER_LEARN 1 -MOT_PWM_MAX 1900 -MOT_PWM_MIN 1090 -MOT_PWM_TYPE 0 -MOT_RPM_DEADBAND 400.000000 -MOT_RPM_SCALE 0.400000 -MOT_RP_LAG 0.000000 -MOT_SAFE_DISARM 0 -MOT_SAFE_TIME 1.000000 -MOT_SLEW_DN_TIME 0.250000 -MOT_SLEW_UP_TIME 0.500000 -MOT_SPIN_ARM 0.200000 -MOT_SPIN_MAX 0.990000 -MOT_SPIN_MIN 0.200000 -MOT_SPOOL_TIME 1.000000 -MOT_THST_EXPO 0.500000 -MOT_THST_HOVER 0.400000 -MOT_YAW_HEADROOM 50 -MSP_OPTIONS 0 -MSP_OSD_NCELLS 0 -NTF_BUZZ_ON_LVL 1 -NTF_BUZZ_PIN -1 -NTF_BUZZ_TYPES 0 -NTF_BUZZ_VOLUME 100 -NTF_DISPLAY_TYPE 0 -NTF_LED_BRIGHT 3 -NTF_LED_LEN 1 -NTF_LED_OVERRIDE 0 -NTF_LED_TYPES 8 -OA_TYPE 0 -OSD_TYPE 0 -PHLD_BRAKE_ANGLE 3000 -PHLD_BRAKE_RATE 12 -PILOT_ACCEL_Z 250 -PILOT_SPEED_DN 250 -PILOT_SPEED_UP 400 -PILOT_THR_BHV 3 -PILOT_THR_FILT 3.000000 -PILOT_TKOFF_ALT 500.000000 -PILOT_Y_EXPO 0.000000 -PILOT_Y_RATE 202.500000 -PILOT_Y_RATE_TC 0.000000 -PLND_ENABLED 0 -PRX1_TYPE 0 -PRX2_TYPE 0 -PRX3_TYPE 0 -PRX_FILT 0.250000 -PRX_IGN_GND 0 -PRX_LOG_RAW 0 -PSC_ACCZ_D 0.000000 -PSC_ACCZ_FF 0.000000 -PSC_ACCZ_FLTD 15.000000 -PSC_ACCZ_FLTE 15.000000 -PSC_ACCZ_FLTT 10.000000 -PSC_ACCZ_I 1.000000 -PSC_ACCZ_IMAX 500.000000 -PSC_ACCZ_P 0.500000 -PSC_ACCZ_SMAX 0.000000 -PSC_ANGLE_MAX 0.000000 -PSC_JERK_XY 5.000000 -PSC_JERK_Z 5.000000 -PSC_POSXY_P 0.500000 -PSC_POSZ_P 1.000000 -PSC_VELXY_D 0.300000 -PSC_VELXY_FF 0.000000 -PSC_VELXY_FLTD 10.000000 -PSC_VELXY_FLTE 10.000000 -PSC_VELXY_I 0.400000 -PSC_VELXY_IMAX 500.000000 -PSC_VELXY_P 1.000000 -PSC_VELZ_D 0.000000 -PSC_VELZ_FF 0.000000 -PSC_VELZ_FLTD 5.000000 -PSC_VELZ_FLTE 5.000000 -PSC_VELZ_I 0.000000 -PSC_VELZ_IMAX 1000.000000 -PSC_VELZ_P 2.500000 -RALLY_INCL_HOME 1 -RALLY_LIMIT_KM 0.300000 -RALLY_TOTAL 0 -RC10_DZ 0 -RC10_MAX 1995 -RC10_MIN 1105 -RC10_OPTION 0 -RC10_REVERSED 0 -RC10_TRIM 1105 -RC11_DZ 0 -RC11_MAX 1995 -RC11_MIN 1105 -RC11_OPTION 0 -RC11_REVERSED 0 -RC11_TRIM 1105 -RC12_DZ 0 -RC12_MAX 1900 -RC12_MIN 1100 -RC12_OPTION 0 -RC12_REVERSED 0 -RC12_TRIM 1500 -RC13_DZ 0 -RC13_MAX 1900 -RC13_MIN 1100 -RC13_OPTION 0 -RC13_REVERSED 0 -RC13_TRIM 1500 -RC14_DZ 0 -RC14_MAX 1900 -RC14_MIN 1100 -RC14_OPTION 0 -RC14_REVERSED 0 -RC14_TRIM 1500 -RC15_DZ 0 -RC15_MAX 1900 -RC15_MIN 1100 -RC15_OPTION 0 -RC15_REVERSED 0 -RC15_TRIM 1500 -RC16_DZ 0 -RC16_MAX 1900 -RC16_MIN 1100 -RC16_OPTION 0 -RC16_REVERSED 0 -RC16_TRIM 1500 -RC1_DZ 30 -RC1_MAX 1927 -RC1_MIN 1102 -RC1_OPTION 0 -RC1_REVERSED 0 -RC1_TRIM 1515 -RC2_DZ 30 -RC2_MAX 1927 -RC2_MIN 1102 -RC2_OPTION 0 -RC2_REVERSED 0 -RC2_TRIM 1515 -RC3_DZ 30 -RC3_MAX 1927 -RC3_MIN 1102 -RC3_OPTION 0 -RC3_REVERSED 0 -RC3_TRIM 1515 -RC4_DZ 30 -RC4_MAX 1927 -RC4_MIN 1102 -RC4_OPTION 0 -RC4_REVERSED 0 -RC4_TRIM 1515 -RC5_DZ 0 -RC5_MAX 1900 -RC5_MIN 1100 -RC5_OPTION 0 -RC5_REVERSED 0 -RC5_TRIM 1500 -RC6_DZ 30 -RC6_MAX 1927 -RC6_MIN 1102 -RC6_OPTION 0 -RC6_REVERSED 0 -RC6_TRIM 1515 -RC7_DZ 0 -RC7_MAX 1995 -RC7_MIN 1105 -RC7_OPTION 0 -RC7_REVERSED 0 -RC7_TRIM 1105 -RC8_DZ 0 -RC8_MAX 1995 -RC8_MIN 1105 -RC8_OPTION 0 -RC8_REVERSED 0 -RC8_TRIM 1105 -RC9_DZ 10 -RC9_MAX 1995 -RC9_MIN 1105 -RC9_OPTION 0 -RC9_REVERSED 0 -RC9_TRIM 1105 -RCMAP_PITCH 2 -RCMAP_ROLL 1 -RCMAP_THROTTLE 3 -RCMAP_YAW 4 -RC_OPTIONS 0 -RC_OVERRIDE_TIME 3.000000 -RC_PROTOCOLS 1 -RC_SPEED 490 -RELAY_DEFAULT 0 -RELAY_PIN -1 -RELAY_PIN2 -1 -RELAY_PIN3 -1 -RELAY_PIN4 -1 -RELAY_PIN5 -1 -RELAY_PIN6 -1 -RNGFND1_TYPE 0 -RNGFND2_TYPE 0 -RNGFND3_TYPE 0 -RNGFND4_TYPE 0 -RNGFND5_TYPE 0 -RNGFND6_TYPE 0 -RNGFND7_TYPE 0 -RNGFND8_TYPE 0 -RNGFND9_TYPE 0 -RNGFNDA_TYPE 0 -RNGFND_FILT 0.500000 -RPM1_ESC_MASK 0 -RPM1_MAX 100000.000000 -RPM1_MIN 10.000000 -RPM1_MIN_QUAL 0.500000 -RPM1_PIN -1 -RPM1_SCALING 1.000000 -RPM1_TYPE 10 -RPM2_ESC_MASK 0 -RPM2_MAX 100000.000000 -RPM2_MIN 10.000000 -RPM2_MIN_QUAL 0.500000 -RPM2_PIN -1 -RPM2_SCALING 1.000000 -RPM2_TYPE 10 -RSSI_TYPE 0 -RTL_ALT 1500 -RTL_ALT_FINAL 0 -RTL_ALT_TYPE 0 -RTL_CLIMB_MIN 0 -RTL_CONE_SLOPE 3.000000 -RTL_LOIT_TIME 2000 -RTL_OPTIONS 0 -RTL_SPEED 1500 -SCHED_DEBUG 0 -SCHED_LOOP_RATE 400 -SCHED_OPTIONS 0 -SCR_ENABLE 0 -SERIAL0_BAUD 115 -SERIAL0_PROTOCOL 2 -SERIAL1_BAUD 57 -SERIAL1_OPTIONS 0 -SERIAL1_PROTOCOL 2 -SERIAL2_BAUD 0 -SERIAL2_OPTIONS 0 -SERIAL2_PROTOCOL 0 -SERIAL3_BAUD 38 -SERIAL3_OPTIONS 0 -SERIAL3_PROTOCOL 5 -SERIAL4_BAUD 38 -SERIAL4_OPTIONS 0 -SERIAL4_PROTOCOL 5 -SERIAL5_BAUD 57 -SERIAL5_OPTIONS 0 -SERIAL5_PROTOCOL -1 -SERIAL6_BAUD 57 -SERIAL6_OPTIONS 0 -SERIAL6_PROTOCOL -1 -SERIAL7_BAUD 57 -SERIAL7_OPTIONS 0 -SERIAL7_PROTOCOL -1 -SERIAL_PASS1 0 -SERIAL_PASS2 -1 -SERIAL_PASSTIMO 15 -SERVO10_FUNCTION 0 -SERVO10_MAX 1900 -SERVO10_MIN 1100 -SERVO10_REVERSED 0 -SERVO10_TRIM 1500 -SERVO11_FUNCTION 0 -SERVO11_MAX 1900 -SERVO11_MIN 1100 -SERVO11_REVERSED 0 -SERVO11_TRIM 1100 -SERVO12_FUNCTION 0 -SERVO12_MAX 1900 -SERVO12_MIN 1100 -SERVO12_REVERSED 0 -SERVO12_TRIM 1500 -SERVO13_FUNCTION 0 -SERVO13_MAX 1900 -SERVO13_MIN 1100 -SERVO13_REVERSED 0 -SERVO13_TRIM 0 -SERVO14_FUNCTION 0 -SERVO14_MAX 1900 -SERVO14_MIN 1100 -SERVO14_REVERSED 0 -SERVO14_TRIM 1500 -SERVO15_FUNCTION 0 -SERVO15_MAX 1900 -SERVO15_MIN 1100 -SERVO15_REVERSED 0 -SERVO15_TRIM 1500 -SERVO16_FUNCTION 0 -SERVO16_MAX 1900 -SERVO16_MIN 1100 -SERVO16_REVERSED 0 -SERVO16_TRIM 1500 -SERVO1_FUNCTION 34 -SERVO1_MAX 2100 -SERVO1_MIN 900 -SERVO1_REVERSED 1 -SERVO1_TRIM 1500 -SERVO2_FUNCTION 33 -SERVO2_MAX 2100 -SERVO2_MIN 900 -SERVO2_REVERSED 0 -SERVO2_TRIM 1500 -SERVO3_FUNCTION 35 -SERVO3_MAX 2000 -SERVO3_MIN 1000 -SERVO3_REVERSED 0 -SERVO3_TRIM 1000 -SERVO4_FUNCTION 36 -SERVO4_MAX 2000 -SERVO4_MIN 1000 -SERVO4_REVERSED 0 -SERVO4_TRIM 1000 -SERVO5_FUNCTION 0 -SERVO5_MAX 1801 -SERVO5_MIN 1200 -SERVO5_REVERSED 0 -SERVO5_TRIM 1501 -SERVO6_FUNCTION 0 -SERVO6_MAX 2001 -SERVO6_MIN 1000 -SERVO6_REVERSED 0 -SERVO6_TRIM 1500 -SERVO7_FUNCTION 0 -SERVO7_MAX 1994 -SERVO7_MIN 1003 -SERVO7_REVERSED 0 -SERVO7_TRIM 1504 -SERVO8_FUNCTION 0 -SERVO8_MAX 2001 -SERVO8_MIN 1005 -SERVO8_REVERSED 1 -SERVO8_TRIM 1500 -SERVO9_FUNCTION 0 -SERVO9_MAX 1900 -SERVO9_MIN 1100 -SERVO9_REVERSED 0 -SERVO9_TRIM 1500 -SERVO_32_ENABLE 0 -SERVO_DSHOT_ESC 0 -SERVO_DSHOT_RATE 0 -SERVO_FTW_MASK 0 -SERVO_FTW_POLES 14 -SERVO_FTW_RVMASK 0 -SERVO_GPIO_MASK 32512 -SERVO_RATE 200 -SERVO_ROB_POSMAX 4095 -SERVO_ROB_POSMIN 0 -SERVO_SBUS_RATE 200 -SERVO_VOLZ_MASK 0 -SID_AXIS 0 -SIMPLE 0 -SIM_ACC1_BIAS_X 0.000000 -SIM_ACC1_BIAS_Y 0.000000 -SIM_ACC1_BIAS_Z 0.000000 -SIM_ACC1_RND 0.000000 -SIM_ACC1_SCAL_X 0.000000 -SIM_ACC1_SCAL_Y 0.000000 -SIM_ACC1_SCAL_Z 0.000000 -SIM_ACC2_BIAS_X 0.000000 -SIM_ACC2_BIAS_Y 0.000000 -SIM_ACC2_BIAS_Z 0.000000 -SIM_ACC2_RND 0.000000 -SIM_ACC2_SCAL_X 0.000000 -SIM_ACC2_SCAL_Y 0.000000 -SIM_ACC2_SCAL_Z 0.000000 -SIM_ACC3_BIAS_X 0.000000 -SIM_ACC3_BIAS_Y 0.000000 -SIM_ACC3_BIAS_Z 0.000000 -SIM_ACC3_RND 0.000000 -SIM_ACC3_SCAL_X 0.000000 -SIM_ACC3_SCAL_Y 0.000000 -SIM_ACC3_SCAL_Z 0.000000 -SIM_ACCEL1_FAIL 0.000000 -SIM_ACCEL2_FAIL 0.000000 -SIM_ACCEL3_FAIL 0.000000 -SIM_ACC_FAIL_MSK 0 -SIM_ACC_TRIM_X 0.000000 -SIM_ACC_TRIM_Y 0.000000 -SIM_ACC_TRIM_Z 0.000000 -SIM_ADSB_ALT 1000.000000 -SIM_ADSB_COUNT -1 -SIM_ADSB_RADIUS 10000.000000 -SIM_ADSB_TX 0 -SIM_ARSPD2_FAIL 0.000000 -SIM_ARSPD2_FAILP 0.000000 -SIM_ARSPD2_OFS 2013.000000 -SIM_ARSPD2_PITOT 0.000000 -SIM_ARSPD2_RATIO 1.990000 -SIM_ARSPD2_RND 2.000000 -SIM_ARSPD2_SIGN 0 -SIM_ARSPD_FAIL 0.000000 -SIM_ARSPD_FAILP 0.000000 -SIM_ARSPD_OFS 2013.000000 -SIM_ARSPD_PITOT 0.000000 -SIM_ARSPD_RATIO 1.990000 -SIM_ARSPD_RND 2.000000 -SIM_ARSPD_SIGN 0 -SIM_BAR2_DELAY 0 -SIM_BAR2_DISABLE 0 -SIM_BAR2_DRIFT 0.000000 -SIM_BAR2_FREEZE 0 -SIM_BAR2_GLITCH 0.000000 -SIM_BAR2_RND 0.200000 -SIM_BAR2_WCF_BAK 0.000000 -SIM_BAR2_WCF_FWD 0.000000 -SIM_BAR2_WCF_LFT 0.000000 -SIM_BAR2_WCF_RGT 0.000000 -SIM_BAR3_DELAY 0 -SIM_BAR3_DISABLE 0 -SIM_BAR3_DRIFT 0.000000 -SIM_BAR3_FREEZE 0 -SIM_BAR3_GLITCH 0.000000 -SIM_BAR3_RND 0.200000 -SIM_BAR3_WCF_BAK 0.000000 -SIM_BAR3_WCF_FWD 0.000000 -SIM_BAR3_WCF_LFT 0.000000 -SIM_BAR3_WCF_RGT 0.000000 -SIM_BARO_COUNT 2 -SIM_BARO_DELAY 0 -SIM_BARO_DISABLE 0 -SIM_BARO_DRIFT 0.000000 -SIM_BARO_FREEZE 0 -SIM_BARO_GLITCH 0.000000 -SIM_BARO_RND 0.200000 -SIM_BARO_WCF_BAK 0.000000 -SIM_BARO_WCF_FWD 0.000000 -SIM_BARO_WCF_LFT 0.000000 -SIM_BARO_WCF_RGT 0.000000 -SIM_BATT_CAP_AH 17.000000 -SIM_BATT_NUM 1.000000 -SIM_BATT_RES_OHM 0.070000 -SIM_BATT_VOLTAGE 500.000000 -SIM_BAUDLIMIT_EN 0 -SIM_CORE_KG 2.330000 -SIM_DRIFT_SPEED 0.050000 -SIM_DRIFT_TIME 5.000000 -SIM_EFI_TYPE 0 -SIM_ENGINE_FAIL 0 -SIM_ENGINE_MUL 1.000000 -SIM_ESC_ARM_RPM 0.000000 -SIM_ESC_TELEM 1 -SIM_FLOAT_EXCEPT 1 -SIM_FLOW_DELAY 0 -SIM_FLOW_ENABLE 0 -SIM_FLOW_POS_X 0.000000 -SIM_FLOW_POS_Y 0.000000 -SIM_FLOW_POS_Z 0.000000 -SIM_FLOW_RATE 10 -SIM_FLOW_RND 0.050000 -SIM_FTOWESC_ENA 0 -SIM_FTOWESC_POW 4095 -SIM_GND_BEHAV -1 -SIM_GPS2_ACC 0.300000 -SIM_GPS2_ALT_OFS 0 -SIM_GPS2_BYTELOS 0.000000 -SIM_GPS2_DISABLE 0 -SIM_GPS2_DRFTALT 0.000000 -SIM_GPS2_GLTCH_X 0.000000 -SIM_GPS2_GLTCH_Y 0.000000 -SIM_GPS2_GLTCH_Z 0.000000 -SIM_GPS2_HDG 0 -SIM_GPS2_HZ 5 -SIM_GPS2_LAG_MS 100 -SIM_GPS2_LCKTIME 0 -SIM_GPS2_NOISE 0.000000 -SIM_GPS2_NUMSATS 10 -SIM_GPS2_POS_X 0.000000 -SIM_GPS2_POS_Y 0.000000 -SIM_GPS2_POS_Z 0.000000 -SIM_GPS2_TYPE 1 -SIM_GPS2_VERR_X 0.000000 -SIM_GPS2_VERR_Y 0.000000 -SIM_GPS2_VERR_Z 0.000000 -SIM_GPS_ACC 0.300000 -SIM_GPS_ALT_OFS 0 -SIM_GPS_BYTELOSS 0.000000 -SIM_GPS_DISABLE 0 -SIM_GPS_DRIFTALT 0.000000 -SIM_GPS_GLITCH_X 0.000000 -SIM_GPS_GLITCH_Y 0.000000 -SIM_GPS_GLITCH_Z 0.000000 -SIM_GPS_HDG 0 -SIM_GPS_HZ 5 -SIM_GPS_LAG_MS 100 -SIM_GPS_LOCKTIME 0 -SIM_GPS_NOISE 0.000000 -SIM_GPS_NUMSATS 10 -SIM_GPS_POS_X 0.000000 -SIM_GPS_POS_Y 0.000000 -SIM_GPS_POS_Z 0.000000 -SIM_GPS_TYPE 1 -SIM_GPS_VERR_X 0.000000 -SIM_GPS_VERR_Y 0.000000 -SIM_GPS_VERR_Z 0.000000 -SIM_GRPE_ENABLE 0 -SIM_GRPE_PIN -1 -SIM_GRPS_ENABLE 0 -SIM_GRPS_GRAB 2000 -SIM_GRPS_PIN -1 -SIM_GRPS_RELEASE 1000 -SIM_GRPS_REVERSE 0 -SIM_GYR1_RND 0.000000 -SIM_GYR1_SCALE_X 0.000000 -SIM_GYR1_SCALE_Y 0.000000 -SIM_GYR1_SCALE_Z 0.000000 -SIM_GYR2_RND 0.000000 -SIM_GYR2_SCALE_X 0.000000 -SIM_GYR2_SCALE_Y 0.000000 -SIM_GYR2_SCALE_Z 0.000000 -SIM_GYR3_RND 0.000000 -SIM_GYR3_SCALE_X 0.000000 -SIM_GYR3_SCALE_Y 0.000000 -SIM_GYR3_SCALE_Z 0.000000 -SIM_GYR_FAIL_MSK 0 -SIM_IE24_ENABLE 0 -SIM_IE24_ERROR 0 -SIM_IE24_STATE -1 -SIM_IMUT1_ENABLE 0 -SIM_IMUT2_ENABLE 0 -SIM_IMUT3_ENABLE 0 -SIM_IMUT_END 45.000000 -SIM_IMUT_FIXED 0.000000 -SIM_IMUT_START 25.000000 -SIM_IMUT_TCONST 300.000000 -SIM_IMU_COUNT 3 -SIM_IMU_POS_X 0.000000 -SIM_IMU_POS_Y 0.000000 -SIM_IMU_POS_Z 0.000000 -SIM_INIT_ALT_OFS 0.000000 -SIM_INIT_LAT_OFS 0.000000 -SIM_INIT_LON_OFS 0.000000 -SIM_INS_THR_MIN 0.100000 -SIM_JSON_MASTER 0 -SIM_LED_LAYOUT 0 -SIM_LOOP_DELAY 0 -SIM_MAG1_DEVID 97539 -SIM_MAG1_FAIL 0 -SIM_MAG1_SCALING 1.000000 -SIM_MAG2_DEVID 131874 -SIM_MAG2_DIA_X 0.000000 -SIM_MAG2_DIA_Y 0.000000 -SIM_MAG2_DIA_Z 0.000000 -SIM_MAG2_FAIL 0 -SIM_MAG2_ODI_X 0.000000 -SIM_MAG2_ODI_Y 0.000000 -SIM_MAG2_ODI_Z 0.000000 -SIM_MAG2_OFS_X 5.000000 -SIM_MAG2_OFS_Y 13.000000 -SIM_MAG2_OFS_Z -18.000000 -SIM_MAG2_ORIENT 0 -SIM_MAG2_SCALING 1.000000 -SIM_MAG3_DEVID 263178 -SIM_MAG3_DIA_X 0.000000 -SIM_MAG3_DIA_Y 0.000000 -SIM_MAG3_DIA_Z 0.000000 -SIM_MAG3_FAIL 0 -SIM_MAG3_ODI_X 0.000000 -SIM_MAG3_ODI_Y 0.000000 -SIM_MAG3_ODI_Z 0.000000 -SIM_MAG3_OFS_X 5.000000 -SIM_MAG3_OFS_Y 13.000000 -SIM_MAG3_OFS_Z -18.000000 -SIM_MAG3_ORIENT 0 -SIM_MAG3_SCALING 1.000000 -SIM_MAG4_DEVID 97283 -SIM_MAG5_DEVID 97795 -SIM_MAG6_DEVID 98051 -SIM_MAG7_DEVID 0 -SIM_MAG8_DEVID 0 -SIM_MAG_ALY_HGT 1.000000 -SIM_MAG_ALY_X 0.000000 -SIM_MAG_ALY_Y 0.000000 -SIM_MAG_ALY_Z 0.000000 -SIM_MAG_DELAY 0 -SIM_MAG_DIA_X 0.000000 -SIM_MAG_DIA_Y 0.000000 -SIM_MAG_DIA_Z 0.000000 -SIM_MAG_MOT_X 0.000000 -SIM_MAG_MOT_Y 0.000000 -SIM_MAG_MOT_Z 0.000000 -SIM_MAG_ODI_X 0.000000 -SIM_MAG_ODI_Y 0.000000 -SIM_MAG_ODI_Z 0.000000 -SIM_MAG_OFS_X 5.000000 -SIM_MAG_OFS_Y 13.000000 -SIM_MAG_OFS_Z -18.000000 -SIM_MAG_ORIENT 0 -SIM_MAG_RND 0.000000 -SIM_ODOM_ENABLE 0 -SIM_OH_MASK 0 -SIM_OPOS_ALT 584.000000 -SIM_OPOS_HDG 353.000000 -SIM_OPOS_LAT -35.363258 -SIM_OPOS_LNG 149.165207 -SIM_PARA_ENABLE 0 -SIM_PARA_PIN -1 -SIM_PAYLOAD_KG 0.000000 -SIM_PIN_MASK 0 -SIM_PLD_ALT_LMT 15.000000 -SIM_PLD_DIST_LMT 10.000000 -SIM_PLD_ENABLE 0 -SIM_PLD_HEIGHT 0.000000 -SIM_PLD_LAT 0.000000 -SIM_PLD_LON 0.000000 -SIM_PLD_OPTIONS 0 -SIM_PLD_ORIENT 24 -SIM_PLD_RATE 100 -SIM_PLD_TYPE 0 -SIM_PLD_YAW 0 -SIM_RATE_HZ 1200 -SIM_RC_CHANCOUNT 16 -SIM_RC_FAIL 0 -SIM_RICH_CTRL -1 -SIM_RICH_ENABLE 0 -SIM_SAFETY_STATE 0 -SIM_SAIL_TYPE 0 -SIM_SERVO_SPEED 0.140000 -SIM_SHIP_DSIZE 10.000000 -SIM_SHIP_ENABLE 0 -SIM_SHIP_OFS_X 0.000000 -SIM_SHIP_OFS_Y 0.000000 -SIM_SHIP_OFS_Z 0.000000 -SIM_SHIP_PSIZE 1000.000000 -SIM_SHIP_SPEED 3.000000 -SIM_SHIP_SYSID 17 -SIM_SHOVE_TIME 0 -SIM_SHOVE_X 0.000000 -SIM_SHOVE_Y 0.000000 -SIM_SHOVE_Z 0.000000 -SIM_SONAR_GLITCH 0.000000 -SIM_SONAR_POS_X 0.000000 -SIM_SONAR_POS_Y 0.000000 -SIM_SONAR_POS_Z 0.000000 -SIM_SONAR_RND 0.000000 -SIM_SONAR_ROT 25 -SIM_SONAR_SCALE 12.121200 -SIM_SPEEDUP -1.000000 -SIM_SPR_ENABLE 0 -SIM_SPR_PUMP -1 -SIM_SPR_SPIN -1 -SIM_TA_ENABLE 1 -SIM_TEMP_BFACTOR 0.000000 -SIM_TEMP_BRD_OFF 20.000000 -SIM_TEMP_START 25.000000 -SIM_TEMP_TCONST 30.000000 -SIM_TERRAIN 1 -SIM_THML_SCENARI 0 -SIM_TIDE_DIR 0.000000 -SIM_TIDE_SPEED 0.000000 -SIM_TWIST_TIME 0 -SIM_TWIST_X 0.000000 -SIM_TWIST_Y 0.000000 -SIM_TWIST_Z 0.000000 -SIM_VIB_FREQ_X 0.000000 -SIM_VIB_FREQ_Y 0.000000 -SIM_VIB_FREQ_Z 0.000000 -SIM_VIB_MOT_HMNC 1 -SIM_VIB_MOT_MASK 0 -SIM_VIB_MOT_MAX 0.000000 -SIM_VIB_MOT_MULT 1.000000 -SIM_VICON_FAIL 0 -SIM_VICON_GLIT_X 0.000000 -SIM_VICON_GLIT_Y 0.000000 -SIM_VICON_GLIT_Z 0.000000 -SIM_VICON_POS_X 0.000000 -SIM_VICON_POS_Y 0.000000 -SIM_VICON_POS_Z 0.000000 -SIM_VICON_TMASK 3 -SIM_VICON_VGLI_X 0.000000 -SIM_VICON_VGLI_Y 0.000000 -SIM_VICON_VGLI_Z 0.000000 -SIM_VICON_YAW 0 -SIM_VICON_YAWERR 0 -SIM_WAVE_AMP 0.500000 -SIM_WAVE_DIR 0.000000 -SIM_WAVE_ENABLE 0 -SIM_WAVE_LENGTH 10.000000 -SIM_WAVE_SPEED 0.500000 -SIM_WIND_DIR 180.000000 -SIM_WIND_DIR_Z 0.000000 -SIM_WIND_SPD 0.000000 -SIM_WIND_T 0 -SIM_WIND_TURB 0.000000 -SIM_WIND_T_ALT 60.000000 -SIM_WIND_T_COEF 0.010000 -SIM_WOW_PIN -1 -SPRAY_ENABLE 0 -SR0_ADSB 120 -SR0_EXTRA1 120 -SR0_EXTRA2 120 -SR0_EXTRA3 120 -SR0_EXT_STAT 120 -SR0_PARAMS 0 -SR0_POSITION 120 -SR0_RAW_CTRL 120 -SR0_RAW_SENS 120 -SR0_RC_CHAN 120 -SR1_ADSB 0 -SR1_EXTRA1 0 -SR1_EXTRA2 0 -SR1_EXTRA3 0 -SR1_EXT_STAT 0 -SR1_PARAMS 0 -SR1_POSITION 0 -SR1_RAW_CTRL 0 -SR1_RAW_SENS 0 -SR1_RC_CHAN 0 -SR2_ADSB 0 -SR2_EXTRA1 0 -SR2_EXTRA2 0 -SR2_EXTRA3 0 -SR2_EXT_STAT 0 -SR2_PARAMS 0 -SR2_POSITION 0 -SR2_RAW_CTRL 0 -SR2_RAW_SENS 0 -SR2_RC_CHAN 0 -SR3_ADSB 0 -SR3_EXTRA1 0 -SR3_EXTRA2 0 -SR3_EXTRA3 0 -SR3_EXT_STAT 0 -SR3_PARAMS 0 -SR3_POSITION 0 -SR3_RAW_CTRL 0 -SR3_RAW_SENS 0 -SR3_RC_CHAN 0 -SR4_ADSB 0 -SR4_EXTRA1 0 -SR4_EXTRA2 0 -SR4_EXTRA3 0 -SR4_EXT_STAT 0 -SR4_PARAMS 0 -SR4_POSITION 0 -SR4_RAW_CTRL 0 -SR4_RAW_SENS 0 -SR4_RC_CHAN 0 -SR5_ADSB 0 -SR5_EXTRA1 0 -SR5_EXTRA2 0 -SR5_EXTRA3 0 -SR5_EXT_STAT 0 -SR5_PARAMS 0 -SR5_POSITION 0 -SR5_RAW_CTRL 0 -SR5_RAW_SENS 0 -SR5_RC_CHAN 0 -SR6_ADSB 0 -SR6_EXTRA1 0 -SR6_EXTRA2 0 -SR6_EXTRA3 0 -SR6_EXT_STAT 0 -SR6_PARAMS 0 -SR6_POSITION 0 -SR6_RAW_CTRL 0 -SR6_RAW_SENS 0 -SR6_RC_CHAN 0 -SRTL_ACCURACY 2.000000 -SRTL_OPTIONS 0 -SRTL_POINTS 0 -STAT_BOOTCNT 188 -STAT_FLTTIME 10548 -STAT_RESET 255623488 -STAT_RMFLTTIME1 80914 -STAT_RMFLTTIME2 890914 -STAT_RUNTIME 427173 -SUPER_SIMPLE 0 -SURFTRAK_MODE 1 -SYSID_ENFORCE 0 -SYSID_MYGCS 255 -SYSID_THISMAV 1 -TCAL_ENABLED 0 -TELEM_DELAY 0 -TERRAIN_ENABLE 1 -TERRAIN_MARGIN 0.050000 -TERRAIN_OFS_MAX 15.000000 -TERRAIN_OPTIONS 0 -TERRAIN_SPACING 100 -THROW_MOT_START 0 -THROW_NEXTMODE 18 -THROW_TYPE 0 -THR_DZ 10 -TKOFF_RPM_MIN 0 -TKOFF_SLEW_TIME 1.000000 -TUNE 0 -TUNE_MAX 0.000000 -TUNE_MIN 0.000000 -VISO_TYPE 0 -VTX_ENABLE 0 -WINCH_TYPE 0 -WPNAV_ACCEL 250.000000 -WPNAV_ACCEL_Z 200.000000 -WPNAV_JERK 1.000000 -WPNAV_RADIUS 300.000000 -WPNAV_RFND_USE 0 -WPNAV_SPEED 1500.000000 -WPNAV_SPEED_DN 300.000000 -WPNAV_SPEED_UP 500.000000 -WPNAV_TER_MARGIN 10.000000 -WP_NAVALT_MIN 0.000000 -WP_YAW_BEHAVIOR 2 -ZIGZ_AUTO_ENABLE 0 diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/persistent.dat b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/persistent.dat deleted file mode 100644 index 53d61c5c..00000000 Binary files a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/persistent.dat and /dev/null differ diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/server_test.py b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/server_test.py deleted file mode 100644 index 6460795d..00000000 --- a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/server_test.py +++ /dev/null @@ -1,55 +0,0 @@ -import socket -import threading -import time -import struct - -sim_start_time = time.time() - - -def get_sim_time(): - return (time.time() - sim_start_time)/2. - -def handle_client(conn, addr): - print(f'Connected by {addr}') - - initial_sitl_time = -1. - initial_sim_time = -1. - - with conn: - while True: - data = conn.recv(8) - print('data', data) - if not data: - break - - t = struct.unpack('Q', data)[0] - s = get_sim_time() - - if initial_sitl_time < 0: - print('initial') - initial_sitl_time = t - initial_sim_time = s - - sitl_time = t - initial_sitl_time - sim_time = (s - initial_sim_time)*1000000 - time_to_sleep = int(sitl_time - sim_time) - print('time to sleep', time_to_sleep, sitl_time, sim_time) - - #print(f'Received {data.decode()} from {addr}') - #time.sleep(0.01) - #conn.sendall(b'Hello from server') - conn.sendall(struct.pack('i', time_to_sleep)) - -def start_server(host='127.0.0.1', port=65432): - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.bind((host, port)) - s.listen() - print(f'Server listening on {host}:{port}') - while True: - conn, addr = s.accept() - client_thread = threading.Thread(target=handle_client, args=(conn, addr)) - client_thread.start() - print(f'Active connections: {threading.active_count() - 1}') - -if __name__ == "__main__": - start_server() diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/spirit_sitl b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/spirit_sitl deleted file mode 100755 index 51070537..00000000 Binary files a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/spirit_sitl and /dev/null differ diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/terrain/N00E000.DAT b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/terrain/N00E000.DAT deleted file mode 100644 index 634a3edc..00000000 Binary files a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/terrain/N00E000.DAT and /dev/null differ diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/terrain/N42W072.DAT b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/terrain/N42W072.DAT deleted file mode 100644 index 25fbbf3d..00000000 Binary files a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/terrain/N42W072.DAT and /dev/null differ diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/terrain/S36E149.DAT b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/terrain/S36E149.DAT deleted file mode 100644 index 48eef0cd..00000000 Binary files a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/terrain/S36E149.DAT and /dev/null differ diff --git a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/test.gdb b/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/test.gdb deleted file mode 100644 index 03291d09..00000000 --- a/simulation/extension_docker/extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/test.gdb +++ /dev/null @@ -1,12 +0,0 @@ -set environment LD_PRELOAD /extras/kit-app-template/source/extensions/omni.example.spawn_prims/omni/example/spawn_prims/AscentAeroSystems/AscentAeroSystemsSITLPackage/inject.so - -b _ZN7HALSITL9Scheduler10stop_clockEm -catch signal SIGSEGV - -commands 1 - #info registers rsi - call (void)injected_function($rsi) - continue - -commands 2 - bt \ No newline at end of file diff --git a/simulation/extension_docker/run.sh b/simulation/extension_docker/run.sh deleted file mode 100755 index 9a0202f8..00000000 --- a/simulation/extension_docker/run.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -XAUTH=/tmp/.docker.xauth -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) - -echo "Preparing Xauthority data..." -xauth_list=$(xauth nlist :0 | tail -n 1 | sed -e 's/^..../ffff/') -if [ ! -f $XAUTH ]; then - if [ ! -z "$xauth_list" ]; then - echo $xauth_list | xauth -f $XAUTH nmerge - - else - touch $XAUTH - fi - chmod a+r $XAUTH -fi - -docker run --name isaac-sim --entrypoint bash -it --runtime=nvidia --gpus all -e "ACCEPT_EULA=Y" --rm --network=host \ - -e "PRIVACY_CONSENT=Y" \ - -v ~/docker/isaac-sim/cache/kit:/isaac-sim/kit/cache:rw \ - -v ~/docker/isaac-sim/cache/ov:/root/.cache/ov:rw \ - -v ~/docker/isaac-sim/cache/pip:/root/.cache/pip:rw \ - -v ~/docker/isaac-sim/cache/glcache:/root/.cache/nvidia/GLCache:rw \ - -v ~/docker/isaac-sim/cache/computecache:/root/.nv/ComputeCache:rw \ - -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \ - -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \ - -v ~/docker/isaac-sim/documents:/root/Documents:rw \ - -v $SCRIPT_DIR/extras/kit-app-template/source/extensions/:/root/Documents/Kit/shared/exts/ \ - -v $SCRIPT_DIR/extras:/extras:rw \ - -v $SCRIPT_DIR/extras/.bashrc:/root/.bashrc \ - -v $SCRIPT_DIR/extras/.bash_history:/root/.bash_history \ - -v $SCRIPT_DIR/extras/inputrc:/etc/inputrc \ - -v $SCRIPT_DIR/../../ros_ws:/extras/ros_ws \ - --env "ACCEPT_EULA=Y" \ - --env "PRIVACY_CONSENT=Y" \ - --env="DISPLAY=$DISPLAY" \ - --env="QT_X11_NO_MITSHM=1" \ - --env="XAUTHORITY=$XAUTH" \ - -v /tmp/.X11-unix:/tmp/.X11-unix:rw \ - -v $XAUTH:$XAUTH \ - --cap-add=SYS_PTRACE \ - core_isaac_sim_4:latest - #nvcr.io/nvidia/isaac-sim:4.0.0 diff --git a/simulation/gaz_sim.py b/simulation/gaz_sim.py deleted file mode 100644 index d5ae8a09..00000000 --- a/simulation/gaz_sim.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import time -import dronekit -import os -import math -import gz.math7 - -from gz.msgs10.boolean_pb2 import Boolean -from gz.msgs10.header_pb2 import Header -from gz.msgs10.pose_pb2 import Pose -from gz.msgs10.quaternion_pb2 import Quaternion -from gz.msgs10.vector3d_pb2 import Vector3d -from gz.transport13 import Node - -from AscentAeroSystems.ascent_sitl_launch_tool import AscentSitlLaunchTool - -script_dir = os.path.dirname(os.path.realpath(__file__)) + "/AscentAeroSystems" -sitl_tool = AscentSitlLaunchTool(script_dir) -sitl_tool.launch() - -world_name = "dron" -model_name = "drone" -#world_name = "empty" -#model_name = "box" -connection = "udp:127.0.0.1:14552" -timeout_ms = 9999 -update_rate_hz = 30.0 -pose_offset_x = 0.0 -pose_offset_y = 0.0 -pose_offset_z = 0.17 -def transform_ardupilot_to_gazebo(pose): - wldAToWldG = gz.math7.Pose3d(0, 0, 0, -math.pi, 0, 0) - bdyAToBdyG = gz.math7.Pose3d(0, 0, 0, -math.pi, 0, 0) - wldGToBdyG = wldAToWldG.inverse() * pose * bdyAToBdyG - return wldGToBdyG -def main(): - connection_string = "udp:127.0.0.1:14552" - print("Connecting to vehicle on: {}".format(connection_string)) - vehicle = dronekit.connect(connection_string, wait_ready=True, baud=57600) - print("Vehicle connected: {}".format(vehicle)) - try: - # create a transport node - node = Node() - # set service details - service = "/world/{}/set_pose".format(world_name) - reqtype = "gz.msgs10.Pose" - reptype = "gz.msgs10.Boolean" - timeout = 30 - # configure update loop - now_s = time.time() - start_time_s = now_s - # update_rate_hz = 1.0 - update_period_s = 1.0 / update_rate_hz - last_update_time_s = now_s - sim_time_s = now_s - start_time_s - while True: - now_s = time.time() - time_s = now_s - start_time_s - if now_s - last_update_time_s >= update_period_s: - last_update_time_s = now_s - # check we have valid data - if ((vehicle.location.local_frame.north is not None) - and (vehicle.attitude.roll is not None)): - # ardupilot pose - wldAToBdyA = gz.math7.Pose3d( - vehicle.location.local_frame.north, - vehicle.location.local_frame.east, - vehicle.location.local_frame.down, - vehicle.attitude.roll, - vehicle.attitude.pitch, - vehicle.attitude.yaw) - # ignition pose - wldGToBdyG = transform_ardupilot_to_gazebo(wldAToBdyA) - print("[{}] ned_xyz: {:.3f} {:.3f} {:.3f}, ned_rpy {:.3f} {:.3f} {:.3f}".format( - sim_time_s, wldAToBdyA.x(), wldAToBdyA.y(), wldAToBdyA.z(), - wldAToBdyA.roll(), wldAToBdyA.pitch(), wldAToBdyA.yaw())) - # create request message - vector3d_msg = Vector3d() - vector3d_msg.x = wldGToBdyG.x() + pose_offset_x - vector3d_msg.y = wldGToBdyG.y() + pose_offset_y - vector3d_msg.z = wldGToBdyG.z() + pose_offset_z - quat_msg = Quaternion() - quat_msg.x = wldGToBdyG.rot().x() - quat_msg.y = wldGToBdyG.rot().y() - quat_msg.z = wldGToBdyG.rot().z() - quat_msg.w = wldGToBdyG.rot().w() - pose_msg = Pose() - pose_msg.name = model_name - pose_msg.position.CopyFrom(vector3d_msg) - pose_msg.orientation.CopyFrom(quat_msg) - # submit request (blocking) - result = node.request(service, pose_msg, Pose, Boolean, timeout_ms) - if not result: - print("[{:.1f}] update failed".format(time_s)) - except KeyboardInterrupt: - pass - vehicle.close() -if __name__ == "__main__": - main() diff --git a/simulation/gz_dep/dron.sdf b/simulation/gz_dep/dron.sdf deleted file mode 100644 index f5712e48..00000000 --- a/simulation/gz_dep/dron.sdf +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - 1.0 1.0 1.0 - 0.8 0.8 0.8 - - - - true - 0 0 10 0 0 0 - 0.8 0.8 0.8 1 - 0.2 0.2 0.2 1 - - 1000 - 0.9 - 0.01 - 0.001 - - -0.5 0.1 -0.9 - - - - true - - - - - 0 0 1 - 100 100 - - - - - - - 0 0 1 - 100 100 - - - - 0.8 0.8 0.8 1 - 0.8 0.8 0.8 1 - 0.8 0.8 0.8 1 - - - - - - - - 0 0 0.5 1.5707963267948966 0 0 - - - 0 0 0 0 0 0 - - 1.32741228718348 - - 86.28907821859966 - 0 - 0 - 86.28907821859966 - 0 - 5.026548245743671 - - - - - - - - 0.2 - 1.5 - - - - - - - 0.2 - 1 - - - - - - - 0 0 0.65 3.14159 0 0 - - 1.820000000000004 - - 0.45999415237916674 -0 - 0 - 0.45999415237916674 - 0 - 0.9091666666666668 - - - - - - - - 0.5 0.2 0.05455 - - - - - - - 0.5 0.2 0.05455 - - - - - - - 0.3 0 0 -0.7853981633974483 0 0.0 - - - 0.5 0.2 0.05455 - - - - - 0.3 0 0 -0.7853981633974483 0 0.0 - - - 0.5 0.2 0.05455 - - - - - - - 0 -0.3 0 0.7853981633974483 0 1.5707963267948966 - - - 0.5 0.2 0.05455 - - - - - 0 -0.3 0 0.7853981633974483 0 1.5707963267948966 - - - 0.5 0.2 0.05455 - - - - - - -0.3 0 0 0.7853981633974483 0 0.0 - - - 0.5 0.2 0.05455 - - - - - - -0.3 0 0 0.7853981633974483 0 0.0 - - - 0.5 0.2 0.05455 - - - - - - 0 -0.3 0 0.7853981633974483 0 1.5707963267948966 - - - 0.5 0.2 0.05455 - - - - - 0 -0.3 0 0.7853981633974483 0 1.5707963267948966 - - - 0.5 0.2 0.05455 - - - - - - - body - propeller - - 0 0 1 - 1 - - -1e+12 - 1e+12 - -1 - -1 - - - - - - - - - - diff --git a/simulation/gz_sim/gaz_sim.py b/simulation/gz_sim/gaz_sim.py deleted file mode 100644 index d5ae8a09..00000000 --- a/simulation/gz_sim/gaz_sim.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import time -import dronekit -import os -import math -import gz.math7 - -from gz.msgs10.boolean_pb2 import Boolean -from gz.msgs10.header_pb2 import Header -from gz.msgs10.pose_pb2 import Pose -from gz.msgs10.quaternion_pb2 import Quaternion -from gz.msgs10.vector3d_pb2 import Vector3d -from gz.transport13 import Node - -from AscentAeroSystems.ascent_sitl_launch_tool import AscentSitlLaunchTool - -script_dir = os.path.dirname(os.path.realpath(__file__)) + "/AscentAeroSystems" -sitl_tool = AscentSitlLaunchTool(script_dir) -sitl_tool.launch() - -world_name = "dron" -model_name = "drone" -#world_name = "empty" -#model_name = "box" -connection = "udp:127.0.0.1:14552" -timeout_ms = 9999 -update_rate_hz = 30.0 -pose_offset_x = 0.0 -pose_offset_y = 0.0 -pose_offset_z = 0.17 -def transform_ardupilot_to_gazebo(pose): - wldAToWldG = gz.math7.Pose3d(0, 0, 0, -math.pi, 0, 0) - bdyAToBdyG = gz.math7.Pose3d(0, 0, 0, -math.pi, 0, 0) - wldGToBdyG = wldAToWldG.inverse() * pose * bdyAToBdyG - return wldGToBdyG -def main(): - connection_string = "udp:127.0.0.1:14552" - print("Connecting to vehicle on: {}".format(connection_string)) - vehicle = dronekit.connect(connection_string, wait_ready=True, baud=57600) - print("Vehicle connected: {}".format(vehicle)) - try: - # create a transport node - node = Node() - # set service details - service = "/world/{}/set_pose".format(world_name) - reqtype = "gz.msgs10.Pose" - reptype = "gz.msgs10.Boolean" - timeout = 30 - # configure update loop - now_s = time.time() - start_time_s = now_s - # update_rate_hz = 1.0 - update_period_s = 1.0 / update_rate_hz - last_update_time_s = now_s - sim_time_s = now_s - start_time_s - while True: - now_s = time.time() - time_s = now_s - start_time_s - if now_s - last_update_time_s >= update_period_s: - last_update_time_s = now_s - # check we have valid data - if ((vehicle.location.local_frame.north is not None) - and (vehicle.attitude.roll is not None)): - # ardupilot pose - wldAToBdyA = gz.math7.Pose3d( - vehicle.location.local_frame.north, - vehicle.location.local_frame.east, - vehicle.location.local_frame.down, - vehicle.attitude.roll, - vehicle.attitude.pitch, - vehicle.attitude.yaw) - # ignition pose - wldGToBdyG = transform_ardupilot_to_gazebo(wldAToBdyA) - print("[{}] ned_xyz: {:.3f} {:.3f} {:.3f}, ned_rpy {:.3f} {:.3f} {:.3f}".format( - sim_time_s, wldAToBdyA.x(), wldAToBdyA.y(), wldAToBdyA.z(), - wldAToBdyA.roll(), wldAToBdyA.pitch(), wldAToBdyA.yaw())) - # create request message - vector3d_msg = Vector3d() - vector3d_msg.x = wldGToBdyG.x() + pose_offset_x - vector3d_msg.y = wldGToBdyG.y() + pose_offset_y - vector3d_msg.z = wldGToBdyG.z() + pose_offset_z - quat_msg = Quaternion() - quat_msg.x = wldGToBdyG.rot().x() - quat_msg.y = wldGToBdyG.rot().y() - quat_msg.z = wldGToBdyG.rot().z() - quat_msg.w = wldGToBdyG.rot().w() - pose_msg = Pose() - pose_msg.name = model_name - pose_msg.position.CopyFrom(vector3d_msg) - pose_msg.orientation.CopyFrom(quat_msg) - # submit request (blocking) - result = node.request(service, pose_msg, Pose, Boolean, timeout_ms) - if not result: - print("[{:.1f}] update failed".format(time_s)) - except KeyboardInterrupt: - pass - vehicle.close() -if __name__ == "__main__": - main() diff --git a/simulation/launch_sim.py b/simulation/launch_sim.py deleted file mode 100644 index 82834226..00000000 --- a/simulation/launch_sim.py +++ /dev/null @@ -1,294 +0,0 @@ -""" -Description: This file launches Isaac Sim and creates a drone in the simulation environment. -The drone is connected to the Ascent Spirit SITL through dronekit and MAVLink. -This script adds an RGB camera and LiDAR sensor to the drone prim in Isaac Sim -and publishes the data to ROS2 topics. -The script has some inspiration from Pegasus scripts. - -Authors: Andrew Jong, Ian Higgins - -""" -import sys - -import dronekit -import os - -# Auxiliary scipy and numpy modules -import numpy as np -from scipy.spatial.transform import Rotation - -print("Launching") - -# Omniverse Isaac Sim imports -# Imports to start Isaac Sim from this script -from isaacsim import SimulationApp - -# Start Isaac Sim's simulation environment -# Note: this simulation app must be instantiated right after the SimulationApp import, otherwise the simulator will crash -# as this is the object that will load all the extensions and load the actual simulator. -CONFIG = {"renderer": "RayTracedLighting", "headless": False} -simulation_app = SimulationApp(CONFIG) -import carb -import omni -import omni.graph.core as og -import omni.replicator.core as rep -import omni.timeline -import usdrt.Sdf -from omni.isaac.core.prims import GeometryPrim, RigidPrim -from omni.isaac.core.utils import extensions, stage -from omni.isaac.core.world import World -from pxr import Gf, Usd, UsdGeom -from AscentAeroSystems.ascent_sitl_launch_tool import AscentSitlLaunchTool - -# ----------------------------------- -# The actual script should start here -# ----------------------------------- - -script_dir = os.path.dirname(os.path.realpath(__file__)) + "/AscentAeroSystems" -sitl_tool = AscentSitlLaunchTool(script_dir) -sitl_tool.launch() - -# enable ROS bridge extension -extensions.enable_extension("omni.isaac.ros2_bridge") - -simulation_app.update() - - -class Drone: - def __init__(self, vehicle_id, init_pos, world: World, usd_path): - self._usd_path = usd_path - self._init_pos = init_pos - self._world = world - self._drone_prim = None - self.scale = 1.0 - - self._dronekit_connection = dronekit.connect( - "127.0.0.1:14553", wait_ready=True, timeout=999999, rate=120 - ) - - self._create_prim(vehicle_id, usd_path, init_pos) - self.set_world_position(init_pos) - - world.add_physics_callback("update_drone_state", self.update_state_from_mavlink) - - def _create_prim( - self, vehicle_id, usd_path, position=[0.0, 0.0, 0.0], orientation=None - ): - self.stage_path = f"/World/drone{vehicle_id}" - stage.add_reference_to_stage(usd_path=usd_path, prim_path=self.stage_path) - - self._drone_prim = self._world.scene.add( - GeometryPrim( - prim_path=self.stage_path, - name=f"drone_{vehicle_id}", - position=position, - orientation=orientation, - scale=[self.scale, self.scale, self.scale], - collision=True, - ) - ) - - def update_state_from_mavlink(self, args): - args # is required function definition for the physics callback - print("Sim time is ", self._world.current_time) - - # MAVLink is in NED frame, but Isaac is in FLU frame - rot_ned = Rotation.from_euler("xyz", [self._dronekit_connection._roll, self._dronekit_connection._pitch, self._dronekit_connection._yaw], degrees=False) - q_ned = rot_ned.as_quat() - qw, qx, qy, qz = q_ned - # q_in_enu = qw, qy, qx, -qz - - n, e, d = ( - self._dronekit_connection.location.local_frame.north, - self._dronekit_connection.location.local_frame.east, - self._dronekit_connection.location.local_frame.down, - ) - if d is not None: - p = (n, -e, -d) # FLU - self.set_world_pose(p, q_ned) - else: - print("Drone location from dronekit is None") - - def get_world_pose(self): - return self._drone_prim.get_world_pose() - - def set_world_pose(self, position, orientation): - self._drone_prim.set_world_pose(position, orientation) - - def set_world_position(self, position): - _, orientation = self._drone_prim.get_world_pose() - self._drone_prim.set_world_pose(position, orientation) - - def set_orientation_z_angle(self, angle): - position, _ = self._drone_prim.get_world_pose() - o = Rotation.from_euler("XYZ", [0.0, 0.0, angle]).as_quat() - orienatation = [o[3], o[0], o[1], o[2]] - self._drone_prim.set_world_pose(position, orienatation) - - -# Locate Isaac Sim assets folder to load sample -STAGE_PATH = "omniverse://nucleusserver.andrew.cmu.edu/Library/Stages/Tokyo/Tokyo.stage.usd" -# STAGE_PATH = "omniverse://nucleusserver.andrew.cmu.edu/Library/Stages/ConstructionSite/ConstructionSite.stage.usd" -# STAGE_PATH = "omniverse://nucleusserver.andrew.cmu.edu/Library/Stages/Ruins/Ruins.stage.usd" -# make sure the file exists before we try to open it -try: - result = omni.isaac.nucleus.is_file(STAGE_PATH) -except: - result = False - -if result: - omni.usd.get_context().open_stage(STAGE_PATH) - # stage.add_reference_to_stage(STAGE_PATH, "/World") -else: - carb.log_error( - f"the usd path {STAGE_PATH} could not be opened, please make sure that {STAGE_PATH} is a valid usd file" - ) - simulation_app.close() - sys.exit() -# Wait two frames so that stage starts loading -simulation_app.update() -simulation_app.update() - -print("Loading stage...") -from omni.isaac.core.utils.stage import is_stage_loading - -while is_stage_loading(): - simulation_app.update() -print("Loading Complete") - -UsdGeom.SetStageMetersPerUnit(omni.usd.get_context().get_stage(), UsdGeom.LinearUnits.meters) - -world = World(stage_units_in_meters=1.0) - -drone_usd = "omniverse://nucleusserver.andrew.cmu.edu/Library/Assets/Ascent_Aerosystems/Spirit_UAV/spirit_uav_red_yellow.prop.usd" -drone = Drone("spirit_0", [0.0, 0.0, 0.7], world, usd_path=drone_usd) - -# Creating a Camera prim -CAMERA_STAGE_PATH = drone.stage_path + "/Camera" -camera_prim = UsdGeom.Camera( - omni.usd.get_context().get_stage().DefinePrim(CAMERA_STAGE_PATH, "Camera") -) -xform_api = UsdGeom.XformCommonAPI(camera_prim) -xform_api.SetTranslate(Gf.Vec3d(0, 0, 0.1)) -# xform_api.SetRotate((0, 0, 0), UsdGeom.XformCommonAPI.RotationOrderXYZ) # face forward -xform_api.SetRotate((90, 0, 0), UsdGeom.XformCommonAPI.RotationOrderXYZ) # face forward -camera_prim.GetHorizontalApertureAttr().Set(21) -camera_prim.GetVerticalApertureAttr().Set(16) -camera_prim.GetProjectionAttr().Set("perspective") -camera_prim.GetFocalLengthAttr().Set(24) -camera_prim.GetFocusDistanceAttr().Set(400) - -simulation_app.update() - -ROS_CAMERA_GRAPH_PATH = "/ROS_Camera" -# Creating an on-demand push graph with cameraHelper nodes to generate ROS image publishers - -keys = og.Controller.Keys -(ros_camera_graph, _, _, _) = og.Controller.edit( - { - "graph_path": ROS_CAMERA_GRAPH_PATH, - "evaluator_name": "push", - "pipeline_stage": og.GraphPipelineStage.GRAPH_PIPELINE_STAGE_ONDEMAND, - }, - { - keys.CREATE_NODES: [ - ("OnTick", "omni.graph.action.OnTick"), - ("createViewport", "omni.isaac.core_nodes.IsaacCreateViewport"), - ("getRenderProduct", "omni.isaac.core_nodes.IsaacGetViewportRenderProduct"), - ("setCamera", "omni.isaac.core_nodes.IsaacSetCameraOnRenderProduct"), - ("cameraHelperRgb", "omni.isaac.ros2_bridge.ROS2CameraHelper"), - ("cameraHelperInfo", "omni.isaac.ros2_bridge.ROS2CameraHelper"), - ("cameraHelperDepth", "omni.isaac.ros2_bridge.ROS2CameraHelper"), - ], - keys.CONNECT: [ - ("OnTick.outputs:tick", "createViewport.inputs:execIn"), - ("createViewport.outputs:execOut", "getRenderProduct.inputs:execIn"), - ("createViewport.outputs:viewport", "getRenderProduct.inputs:viewport"), - ("getRenderProduct.outputs:execOut", "setCamera.inputs:execIn"), - ( - "getRenderProduct.outputs:renderProductPath", - "setCamera.inputs:renderProductPath", - ), - ("setCamera.outputs:execOut", "cameraHelperRgb.inputs:execIn"), - ("setCamera.outputs:execOut", "cameraHelperInfo.inputs:execIn"), - ("setCamera.outputs:execOut", "cameraHelperDepth.inputs:execIn"), - ( - "getRenderProduct.outputs:renderProductPath", - "cameraHelperRgb.inputs:renderProductPath", - ), - ( - "getRenderProduct.outputs:renderProductPath", - "cameraHelperInfo.inputs:renderProductPath", - ), - ( - "getRenderProduct.outputs:renderProductPath", - "cameraHelperDepth.inputs:renderProductPath", - ), - ], - keys.SET_VALUES: [ - ("createViewport.inputs:viewportId", 1), - ("cameraHelperRgb.inputs:frameId", "sim_camera"), - ("cameraHelperRgb.inputs:topicName", "rgb"), - ("cameraHelperRgb.inputs:type", "rgb"), - ("cameraHelperInfo.inputs:frameId", "sim_camera"), - ("cameraHelperInfo.inputs:topicName", "camera_info"), - ("cameraHelperInfo.inputs:type", "camera_info"), - ("cameraHelperDepth.inputs:frameId", "sim_camera"), - ("cameraHelperDepth.inputs:topicName", "depth"), - ("cameraHelperDepth.inputs:type", "depth"), - ("setCamera.inputs:cameraPrim", [usdrt.Sdf.Path(CAMERA_STAGE_PATH)]), - ], - }, -) - -# Run the ROS Camera graph once to generate ROS image publishers in SDGPipeline -og.Controller.evaluate_sync(ros_camera_graph) - -simulation_app.update() - - -# Create the lidar sensor that generates data into "RtxSensorCpu" -# Sensor needs to be rotated 90 degrees about X so that its Z up - -# Possible options are Example_Rotary and Example_Solid_State -# drive sim applies 0.5,-0.5,-0.5,w(-0.5), we have to apply the reverse -_, sensor = omni.kit.commands.execute( - "IsaacSensorCreateRtxLidar", - path=drone.stage_path + "/lidar", - parent=None, - config="Example_Rotary", - translation=(0, 0, 0.0), - orientation=Gf.Quatd(1.0, 0.0, 0.0, 0.0), # Gf.Quatd is w,i,j,k -) - -# RTX sensors are cameras and must be assigned to their own render product -hydra_texture = rep.create.render_product(sensor.GetPath(), [1, 1], name="Isaac") - -# Create Point cloud publisher pipeline in the post process graph -writer = rep.writers.get("RtxLidar" + "ROS2PublishPointCloud") -writer.initialize(topicName="point_cloud", frameId="base_link") # TODO: publish the transform from base_link to the LiDAR. for now we keep them the same. -writer.attach([hydra_texture]) - -# Create the debug draw pipeline in the post process graph -writer = rep.writers.get("RtxLidar" + "DebugDrawPointCloud") -writer.attach([hydra_texture]) - - -# Create LaserScan publisher pipeline in the post process graph -writer = rep.writers.get("RtxLidar" + "ROS2PublishLaserScan") -writer.initialize(topicName="laser_scan", frameId="base_link") -writer.attach([hydra_texture]) - -simulation_app.update() - - -omni.timeline.get_timeline_interface().play() -# Run in test mode, exit after a fixed number of steps -while simulation_app.is_running(): - - # Update the UI of the app and perform the physics step - # world.step(render=True) - simulation_app.update() - -omni.timeline.get_timeline_interface().stop() -simulation_app.close() diff --git a/simulation/scratch/check_mavlink_rate.py b/simulation/scratch/check_mavlink_rate.py deleted file mode 100644 index 3729cbe6..00000000 --- a/simulation/scratch/check_mavlink_rate.py +++ /dev/null @@ -1,35 +0,0 @@ -import time -from pymavlink import mavutil -import argparse - -parser = argparse.ArgumentParser() -parser.add_argument("message", default="HEARTBEAT") - -args = parser.parse_args() - -# Connect to the MAVLink network -mavlink_connection = mavutil.mavlink_connection('udpin:localhost:14553') # Adjust as necessary - -message_type = args.message # Replace with the specific message type you are interested in -message_interval = [] # To store time intervals between messages - -last_timestamp = None - -# Receive messages and log timestamps -while True: - message = mavlink_connection.recv_match(type=message_type, blocking=True) - if message: - current_timestamp = time.time() - if last_timestamp is not None: - interval = current_timestamp - last_timestamp - message_interval.append(interval) - print(f"Interval: {interval} seconds") - last_timestamp = current_timestamp - - # Calculate and print average rate every 10 messages - if len(message_interval) >= 10: - average_interval = sum(message_interval) / len(message_interval) - message_rate = 1 / average_interval - print(f"Average Rate: {message_rate} messages per second") - message_interval = [] # Reset for next batch - diff --git a/simulation/scratch/dsta.py b/simulation/scratch/dsta.py deleted file mode 100644 index 305c063f..00000000 --- a/simulation/scratch/dsta.py +++ /dev/null @@ -1,240 +0,0 @@ -#!/usr/bin/env python -""" -| File: 1_px4_single_vehicle.py -| Author: Marcelo Jacinto (marcelo.jacinto@tecnico.ulisboa.pt) -| License: BSD-3-Clause. Copyright (c) 2023, Marcelo Jacinto. All rights reserved. -| Description: This files serves as an example on how to build an app that makes use of the Pegasus API to run a simulation with a single vehicle, controlled using the MAVLink control backend. -""" - -# Imports to start Isaac Sim from this script -import carb -from omni.isaac.kit import SimulationApp - -# Start Isaac Sim's simulation environment -# Note: this simulation app must be instantiated right after the SimulationApp import, otherwise the simulator will crash -# as this is the object that will load all the extensions and load the actual simulator. -simulation_app = SimulationApp({"headless": False}) - -# ----------------------------------- -# The actual script should start here -# ----------------------------------- -import omni.timeline -from omni.isaac.core.world import World - -from omni.isaac.core.prims import RigidPrim -from omni.isaac.core.utils import stage - -# Import the Pegasus API for simulating drones -from pegasus.simulator.params import ROBOTS, SIMULATION_ENVIRONMENTS -from pegasus.simulator.logic.state import State -from pegasus.simulator.logic.backends.mavlink_backend import MavlinkBackend, MavlinkBackendConfig -from pegasus.simulator.logic.vehicles.multirotor import Multirotor, MultirotorConfig -from pegasus.simulator.logic.interface.pegasus_interface import PegasusInterface -# Auxiliary scipy and numpy modules -import os.path -from scipy.spatial.transform import Rotation - -import math - -import dronekit - -vehicle = dronekit.connect('127.0.0.1:14552', timeout=999999) - -class PegasusApp: - """ - A Template class that serves as an example on how to build a simple Isaac Sim standalone App. - """ - - def __init__(self): - """ - Method that initializes the PegasusApp and is used to setup the simulation environment. - """ - - # Acquire the timeline that will be used to start/stop the simulation - self.timeline = omni.timeline.get_timeline_interface() - - # Start the Pegasus Interface - self.pg = PegasusInterface() - - # Acquire the World, .i.e, the singleton that controls that is a one stop shop for setting up physics, - # spawning asset primitives, etc. - self.pg._world = World(**self.pg._world_settings) - self.world = self.pg.world - - # Launch one of the worlds provided by NVIDIA - # self.pg.load_environment(SIMULATION_ENVIRONMENTS["Curved Gridroom"]) - # self.pg.load_environment("omniverse://nucleusserver.andrew.cmu.edu/Projects/MultiDrone/Environments/ModUrbanCity/Content/Demo.usd") - # self.pg.load_environment("omniverse://nucleusserver.andrew.cmu.edu/Library/Stages/AbandonedFactory/AbandonedFactory.usd") - # self.pg.load_environment("omniverse://localhost/Library/Stages/AbandonedFactory/AbandonedFactory.usd") - self.pg.load_environment("omniverse://nucleusserver.andrew.cmu.edu/Projects/DSTA/Scenes/Tokyo_Spirit_Drone/Tokyo_Spirit_Drone_Sim.usd") - - # Create the vehicle - # Try to spawn the selected robot in the world to the specified namespace - config_multirotor = MultirotorConfig() - # Create the multirotor configuration - # mavlink_config = MavlinkBackendConfig({ - # "vehicle_id": 0, - # "px4_autolaunch": False, - # "px4_dir": self.pg.px4_path, - # "px4_vehicle_model": self.pg.px4_default_airframe # CHANGE this line to 'iris' if using PX4 version bellow v1.14 - # }) - # config_multirotor.backends = [MavlinkBackend(mavlink_config)] - - # Multirotor( - # "/World/quadrotor", - # ROBOTS['Iris'], - # 0, - # [0.0, 0.0, 0.07], - # Rotation.from_euler("XYZ", [0.0, 0.0, 0.0], degrees=True).as_quat(), - # config=config_multirotor, - # ) - drone_usd = "omniverse://nucleusserver.andrew.cmu.edu/Library/Assets/Ascent_Aerosystems/Spirit_UAV/spirit_uav_red_yellow.usd" - - self.drone = Drone(0, [0.,0.,0.], self.world, usd_path=drone_usd) - - # Reset the simulation environment so that all articulations (aka robots) are initialized - self.world.reset() - - # Auxiliar variable for the timeline callback example - self.stop_sim = False - - def run(self): - """ - Method that implements the application main loop, where the physics steps are executed. - """ - - # Start the simulation - self.timeline.play() - - # The "infinite" loop - while simulation_app.is_running() and not self.stop_sim: - - # vehicle.simple_goto(dronekit.LocationGlobal(0,0,100)) - - r = vehicle._roll - p = vehicle._pitch - y = vehicle._yaw - - # xyzw - rot = Rotation.from_euler('xyz', [r, p, y], degrees=False) - - q = rot.as_quat() - - o = [ - q[3], q[0], q[1], q[2] - ] - p = [ - vehicle.location.local_frame.east, - vehicle.location.local_frame.north, - -vehicle.location.local_frame.down - ] - - self.drone.zero_velocity() - #wxyz - self.drone.set_world_pose(p, o) - - # Update the UI of the app and perform the physics step - self.world.step(render=True) - - # Cleanup and stop - carb.log_warn("PegasusApp Simulation App is closing.") - self.timeline.stop() - simulation_app.close() - - -class Drone: - def __init__(self, vehicle_id, init_pos, world, waypoints = None, speed = 10., usd_path = ROBOTS['Iris']): - self._usd_path = usd_path - # self._init_pos = init_pos - self._world = world - self._rigid_body = None - self.speed = speed - self.z_level = 1.06 - self.scale = 1. - - - self._create(vehicle_id, usd_path, init_pos) - self.set_world_position(init_pos) - - def _create(self, vehicle_id, usd_path, position = [0.,0.,0.], orientation = [0.,0.,0.,1.]): - model_prim_path = f'/World/drone{vehicle_id}' - stage.add_reference_to_stage(usd_path=usd_path, prim_path=model_prim_path) - self._rigid_body = self._world.scene.add(RigidPrim( - prim_path=model_prim_path, - name=f'drone{vehicle_id}', - position=position, - orientation=orientation, - scale=[self.scale, self.scale, self.scale], - mass=0.0, - linear_velocity = [0.,0.,0.], - )) - - def get_world_pose(self): - return self._rigid_body.get_world_pose() - - def set_world_pose(self, position, orientation): - self._rigid_body.set_world_pose(position, orientation) - - def set_world_position(self, position): - _, orientation = self._rigid_body.get_world_pose() - self._rigid_body.set_world_pose(position, orientation) - - def zero_velocity(self): - self._rigid_body.set_linear_velocity([0.,0.,0.]) - - def set_orientation_z_angle(self, angle): - position, _ = self._rigid_body.get_world_pose() - o = Rotation.from_euler("XYZ", [0.0, 0.0, angle]).as_quat() - orienatation = [o[3], o[0], o[1], o[2]] - self._rigid_body.set_world_pose(position, orienatation) - - def set_orientation_next_waypoint(self): - position, orientation = self._rigid_body.get_world_pose() - dx = self.waypoints[self.current_waypoint][0] - position[0] - dy = self.waypoints[self.current_waypoint][1] - position[1] - angle = math.atan2(dy, dx) + math.pi/2 - self.set_orientation_z_angle(angle) - - def set_next_waypoint(self): - self.current_waypoint = (self.current_waypoint + 1) % len(self.waypoints) - self.set_orientation_next_waypoint() - - def move(self, dt = 0.025): - self.zero_velocity() - position, orientation = self._rigid_body.get_world_pose() - dx = self.waypoints[self.current_waypoint][0] - position[0] - dy = self.waypoints[self.current_waypoint][1] - position[1] - dz = 0. #self.waypoints[self.current_waypoint][2] - position[2] - d = (dx**2 + dy**2 + dz**2)**0.5 - if d < 0.26: - self.set_next_waypoint() - else: - dx = dx/d - dy = dy/d - dz = dz/d - position[0] += self.speed * dx * dt - position[1] += self.speed * dy * dt - position[2] = self.z_level - self.set_world_position(position) - return position, orientation - - - - - - - - - - - -def main(): - - # Instantiate the template app - pg_app = PegasusApp() - - # Run the application loop - pg_app.run() - -if __name__ == "__main__": - main() diff --git a/simulation/scratch/fetch_drone_state.py b/simulation/scratch/fetch_drone_state.py deleted file mode 100644 index 4cbd3b01..00000000 --- a/simulation/scratch/fetch_drone_state.py +++ /dev/null @@ -1,67 +0,0 @@ -import asyncio -from mavsdk import System -import time - -async def get_drone_pose(): - # Create a drone object - drone = System() - - # Connect to the drone - await drone.connect(system_address="udp://:14553") - - print("Waiting for drone to connect...") - async for state in drone.core.connection_state(): - if state.is_connected: - print(f"Drone discovered") - break - - # # Wait for the drone to have a global position estimate - # print("Waiting for drone to have a global position estimate...") - # async for health in drone.telemetry.health(): - # if health.is_global_position_ok and health.is_home_position_ok: - # print("Global position estimate ok") - # break - - # Set the telemetry update rates - await drone.telemetry.set_rate_position(60.0) # Set position update rate to 60 Hz - await drone.telemetry.set_rate_attitude_euler(60.0) # Set attitude update rate to 60 Hz - - # Initialize variables to calculate message rate - last_position_time = time.time() - last_attitude_time = time.time() - position_count = 0 - attitude_count = 0 - - print("Fetching drone pose at 60Hz...") - - while True: - # Get the drone's position - async for position in drone.telemetry.position(): - position_count += 1 - current_time = time.time() - elapsed_time = current_time - last_position_time - if elapsed_time >= 1.0: - rate = position_count / elapsed_time - print(f"Position update rate: {rate:.2f} Hz") - position_count = 0 - last_position_time = current_time - print(f"Latitude: {position.latitude_deg}, Longitude: {position.longitude_deg}, Absolute Altitude: {position.absolute_altitude_m}") - break - - # Get the drone's attitude - async for attitude in drone.telemetry.attitude_euler(): - attitude_count += 1 - current_time = time.time() - elapsed_time = current_time - last_attitude_time - if elapsed_time >= 1.0: - rate = attitude_count / elapsed_time - print(f"Attitude update rate: {rate:.2f} Hz") - attitude_count = 0 - last_attitude_time = current_time - print(f"Roll: {attitude.roll_deg}, Pitch: {attitude.pitch_deg}, Yaw: {attitude.yaw_deg}") - break - # await drone.telemetry.set_rate_position(60.0) # Set position update rate to 60 Hz - # await drone.telemetry.set_rate_attitude_euler(60.0) # Set attitude update rate to 60 Hz - -if __name__ == "__main__": - asyncio.run(get_drone_pose()) diff --git a/simulation/scratch/request_different_mavlink_rate.py b/simulation/scratch/request_different_mavlink_rate.py deleted file mode 100644 index 21ce7832..00000000 --- a/simulation/scratch/request_different_mavlink_rate.py +++ /dev/null @@ -1,32 +0,0 @@ -from pymavlink import mavutil - -# Connect to the MAVLink network -master = mavutil.mavlink_connection('udpin:localhost:14553') # Adjust as necessary - -# Wait for the first heartbeat -# (to find the system and component IDs) -master.wait_heartbeat() - -# Define message type and desired interval -message_id = mavutil.mavlink.MAVLINK_MSG_ID_LOCAL_POSITION_NED # Replace with the desired message ID -interval_us = 1/60 * 1e6 # Interval in microseconds (1 second in this case) - -# Send command to set message interval -master.mav.command_long_send( - master.target_system, - master.target_component, - mavutil.mavlink.MAV_CMD_SET_MESSAGE_INTERVAL, - 0, # Confirmation - message_id, # The MAVLink message ID - interval_us, # Interval in microseconds - 0, 0, 0, 0, 0 # Unused parameters -) - -print(f"Requested message interval for message ID {message_id} set to {interval_us / 1e6} seconds.") - -# Continue receiving messages to see the effect -while True: - message = master.recv_match(blocking=True) - if message: - print(message) -